From c98b826a7fa6d47eb152aa866c0410e14c1b2fcb Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 22 Nov 2023 12:23:04 +0100 Subject: [PATCH 01/48] rewriting feedback module to hide private variables (#256) * rewriting feedback module to hide private variables * updated feedback.js * updating countly.js --------- Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> --- Countly.js | 3 +- Feedback.js | 287 ++++++++++++++++++++++++++-------------------------- 2 files changed, 145 insertions(+), 145 deletions(-) diff --git a/Countly.js b/Countly.js index e745ec13..f5cec47d 100644 --- a/Countly.js +++ b/Countly.js @@ -22,8 +22,7 @@ let _state = CountlyState; CountlyState.CountlyReactNative = CountlyReactNative; CountlyState.eventEmitter = eventEmitter; -Countly.feedback = Feedback; -Countly.feedback.state = CountlyState; +Countly.feedback = new Feedback(CountlyState); let _isCrashReportingEnabled = false; diff --git a/Feedback.js b/Feedback.js index 60c9ca3e..59f449fd 100644 --- a/Feedback.js +++ b/Feedback.js @@ -1,159 +1,160 @@ import * as L from './Logger.js'; -const Feedback = {}; - -/** - * Get a list of available feedback widgets as an array of objects. - * @param {callback} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. - * @return {Object} Object {error: String or Null, data: Array or null } - */ -async function getAvailableFeedbackWidgets(onFinished) { - if (!Feedback.state.isInitialized) { - const message = "'init' must be called before 'getAvailableFeedbackWidgets'"; - L.e(`getAvailableFeedbackWidgets, ${message}`); - return { error: message, data: null }; - } - L.d('getAvailableFeedbackWidgets, getAvailableFeedbackWidgets'); - let result = null; - let error = null; - try { - result = await Feedback.state.CountlyReactNative.getFeedbackWidgets(); - } catch (e) { - error = e.message; - } - if (onFinished) { - onFinished(result, error); +class Feedback { + #state; + constructor(state) { + this.#state = state; } - return { error: error, data: result }; -} -/** - * Present a chosen feedback widget - * - * @param {Object} feedbackWidget - feedback Widget with id, type and name - * @param {String} closeButtonText - text for cancel/close button - * @param {callback} [widgetShownCallback] - Callback to be executed when feedback widget is displayed. This parameter is optional. - * @param {callback} [widgetClosedCallback] - Callback to be executed when feedback widget is closed. This parameter is optional. - * - * @return {Object} Object {error: String or null} - */ -function presentFeedbackWidget(feedbackWidget, closeButtonText, widgetShownCallback, widgetClosedCallback) { - if (!Feedback.state.isInitialized) { - const message = "'init' must be called before 'presentFeedbackWidget'"; - L.e(`presentFeedbackWidget, ${message}`); - return { error: message }; - } - let message = null; - if (!feedbackWidget) { - message = 'feedbackWidget should not be null or undefined'; - L.e(`presentFeedbackWidget, ${message}`); - return { error: message }; - } - if (!feedbackWidget.id) { - message = 'FeedbackWidget id should not be null or empty'; - L.e(`presentFeedbackWidget, ${message}`); - return { error: message }; - } - if (!feedbackWidget.type) { - message = 'FeedbackWidget type should not be null or empty'; - L.e(`presentFeedbackWidget, ${message}`); - return { error: message }; - } - if (typeof closeButtonText !== 'string') { - closeButtonText = ''; - L.w(`presentFeedbackWidget, unsupported data type of closeButtonText : [${typeof args}]`); - } - L.d(`presentFeedbackWidget, presentFeedbackWidget with widget:[${JSON.stringify(feedbackWidget)}]`); - if (widgetShownCallback) { - Feedback.state.widgetShownCallback = Feedback.state.eventEmitter.addListener(Feedback.state.widgetShownCallbackName, () => { - widgetShownCallback(); - Feedback.state.widgetShownCallback.remove(); - }); - } - if (widgetClosedCallback) { - Feedback.state.widgetClosedCallback = Feedback.state.eventEmitter.addListener(Feedback.state.widgetClosedCallbackName, () => { - widgetClosedCallback(); - Feedback.state.widgetClosedCallback.remove(); - }); + /** + * Get a list of available feedback widgets as an array of objects. + * @param {callback} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. + * @return {Object} Object {error: String or Null, data: Array or null } + */ + async getAvailableFeedbackWidgets(onFinished) { + if (!this.#state.isInitialized) { + const message = "'init' must be called before 'getAvailableFeedbackWidgets'"; + L.e(`getAvailableFeedbackWidgets, ${message}`); + return { error: message, data: null }; + } + + L.d('getAvailableFeedbackWidgets, getAvailableFeedbackWidgets'); + let result = null; + let error = null; + try { + result = await this.#state.CountlyReactNative.getFeedbackWidgets(); + } catch (e) { + error = e.message; + } + if (onFinished) { + onFinished(result, error); + } + return { error: error, data: result }; } - feedbackWidget.name = feedbackWidget.name || ''; - closeButtonText = closeButtonText || ''; - Feedback.state.CountlyReactNative.presentFeedbackWidget([feedbackWidget.id, feedbackWidget.type, feedbackWidget.name, closeButtonText]); - return { error: null }; -} + /** + * Present a chosen feedback widget + * + * @param {Object} feedbackWidget - feedback Widget with id, type and name + * @param {String} closeButtonText - text for cancel/close button + * @param {callback} [widgetShownCallback] - Callback to be executed when feedback widget is displayed. This parameter is optional. + * @param {callback} [widgetClosedCallback] - Callback to be executed when feedback widget is closed. This parameter is optional. + * + * @return {Object} Object {error: String or null} + */ + presentFeedbackWidget(feedbackWidget, closeButtonText, widgetShownCallback, widgetClosedCallback) { + if (!this.#state.isInitialized) { + const message = "'init' must be called before 'presentFeedbackWidget'"; + L.e(`presentFeedbackWidget, ${message}`); + return { error: message }; + } + let message = null; + if (!feedbackWidget) { + message = 'feedbackWidget should not be null or undefined'; + L.e(`presentFeedbackWidget, ${message}`); + return { error: message }; + } + if (!feedbackWidget.id) { + message = 'FeedbackWidget id should not be null or empty'; + L.e(`presentFeedbackWidget, ${message}`); + return { error: message }; + } + if (!feedbackWidget.type) { + message = 'FeedbackWidget type should not be null or empty'; + L.e(`presentFeedbackWidget, ${message}`); + return { error: message }; + } + if (typeof closeButtonText !== 'string') { + closeButtonText = ''; + L.w(`presentFeedbackWidget, unsupported data type of closeButtonText : [${typeof args}]`); + } -/** - * Get a feedback widget's data as an Object. - * @param {Object} widgetInfo - widget to get data for. You should get this from 'getAvailableFeedbackWidgets' method. - * @param {callback} [onFinished] - returns (Object retrievedWidgetData, error). This parameter is optional. - * @return {Object} Object {error: String, data: Object or null} - */ -async function getFeedbackWidgetData(widgetInfo, onFinished) { - if (!Feedback.state.isInitialized) { - const message = "'initWithConfig' must be called before 'getFeedbackWidgetData'"; - L.e(`getFeedbackWidgetData, ${message}`); - onFinished(null, message); - return { error: message, data: null }; - } - const widgetId = widgetInfo.id; - const widgetType = widgetInfo.type; - L.d(`getFeedbackWidgetData, Calling "getFeedbackWidgetData" with Type:[${widgetType}]`); - const args = []; - args.push(widgetId); - args.push(widgetType); - args.push(widgetInfo.name); - let result = null; - let error = null; - try { - result = await Feedback.state.CountlyReactNative.getFeedbackWidgetData(args); - } catch (e) { - error = e.message; - } - if (onFinished) { - onFinished(result, error); + L.d(`presentFeedbackWidget, presentFeedbackWidget with widget:[${JSON.stringify(feedbackWidget)}]`); + if (widgetShownCallback) { + this.#state.widgetShownCallback = this.#state.eventEmitter.addListener(this.#state.widgetShownCallbackName, () => { + widgetShownCallback(); + this.#state.widgetShownCallback.remove(); + }); + } + if (widgetClosedCallback) { + this.#state.widgetClosedCallback = this.#state.eventEmitter.addListener(this.#state.widgetClosedCallbackName, () => { + widgetClosedCallback(); + this.#state.widgetClosedCallback.remove(); + }); + } + + feedbackWidget.name = feedbackWidget.name || ''; + closeButtonText = closeButtonText || ''; + this.#state.CountlyReactNative.presentFeedbackWidget([feedbackWidget.id, feedbackWidget.type, feedbackWidget.name, closeButtonText]); + return { error: null }; } - return { error: error, data: result }; -} -/** - * Report manually for a feedback widget. - * @param {Object} widgetInfo - the widget you are targeting. You should get this from 'getAvailableFeedbackWidgets' method. - * @param {Object} widgetData - data of that widget. You should get this from 'getFeedbackWidgetData' method. - * @param {Object} widgetResult - Information you want to report. - * @return {Object} Object {error: String} - */ -async function reportFeedbackWidgetManually(widgetInfo, widgetData, widgetResult) { - if (!Feedback.state.isInitialized) { - const message = "'initWithConfig' must be called before 'reportFeedbackWidgetManually'"; - L.e(`reportFeedbackWidgetManually, ${message}`); - return { error: message }; + /** + * Get a feedback widget's data as an Object. + * @param {Object} widgetInfo - widget to get data for. You should get this from 'getAvailableFeedbackWidgets' method. + * @param {callback} [onFinished] - returns (Object retrievedWidgetData, error). This parameter is optional. + * @return {Object} Object {error: String, data: Object or null} + */ + async getFeedbackWidgetData(widgetInfo, onFinished) { + if (!this.#state.isInitialized) { + const message = "'initWithConfig' must be called before 'getFeedbackWidgetData'"; + L.e(`getFeedbackWidgetData, ${message}`); + return { error: message, data: null }; + } + const widgetId = widgetInfo.id; + const widgetType = widgetInfo.type; + L.d(`getFeedbackWidgetData, Calling "getFeedbackWidgetData" with Type:[${widgetType}]`); + const args = []; + args.push(widgetId); + args.push(widgetType); + args.push(widgetInfo.name); + let result = null; + let error = null; + try { + result = await this.#state.CountlyReactNative.getFeedbackWidgetData(args); + } catch (e) { + error = e.message; + } + if (onFinished) { + onFinished(result, error); + } + return { error: error, data: result }; } - const widgetId = widgetInfo.id; - const widgetType = widgetInfo.type; - L.d(`reportFeedbackWidgetManually, Calling "reportFeedbackWidgetManually" with Type:[${widgetType}]`); - const widgetInfoList = []; - widgetInfoList.push(widgetId); - widgetInfoList.push(widgetType); - widgetInfoList.push(widgetInfo.name); - const args = []; - args.push(widgetInfoList); - args.push(widgetData); - args.push(widgetResult); + /** + * Report manually for a feedback widget. + * @param {Object} widgetInfo - the widget you are targeting. You should get this from 'getAvailableFeedbackWidgets' method. + * @param {Object} widgetData - data of that widget. You should get this from 'getFeedbackWidgetData' method. + * @param {Object} widgetResult - Information you want to report. + * @return {Object} Object {error: String} + */ + async reportFeedbackWidgetManually(widgetInfo, widgetData, widgetResult) { + if (!this.#state.isInitialized) { + const message = "'initWithConfig' must be called before 'reportFeedbackWidgetManually'"; + L.e(`reportFeedbackWidgetManually, ${message}`); + return { error: message }; + } + const widgetId = widgetInfo.id; + const widgetType = widgetInfo.type; + L.d(`reportFeedbackWidgetManually, Calling "reportFeedbackWidgetManually" with Type:[${widgetType}]`); + const widgetInfoList = []; + widgetInfoList.push(widgetId); + widgetInfoList.push(widgetType); + widgetInfoList.push(widgetInfo.name); - let error = null; - try { - await Feedback.state.CountlyReactNative.reportFeedbackWidgetManually(args); - } catch (e) { - error = e.message; + const args = []; + args.push(widgetInfoList); + args.push(widgetData); + args.push(widgetResult); + + let error = null; + try { + await this.#state.CountlyReactNative.reportFeedbackWidgetManually(args); + } catch (e) { + error = e.message; + } + return { error: error }; } - return { error: error }; } -Feedback.getAvailableFeedbackWidgets = getAvailableFeedbackWidgets; -Feedback.presentFeedbackWidget = presentFeedbackWidget; -Feedback.getFeedbackWidgetData = getFeedbackWidgetData; -Feedback.reportFeedbackWidgetManually = reportFeedbackWidgetManually; - export default Feedback; From 8e546cdf21bc078e8bfc3b7aef4ec3b19a6a6e6e Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:25:37 +0900 Subject: [PATCH 02/48] comments (#261) --- example/create_app.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/example/create_app.py b/example/create_app.py index 3aab0ad3..b1fc114a 100644 --- a/example/create_app.py +++ b/example/create_app.py @@ -2,6 +2,13 @@ import os import platform +# This script sets up a React Native app with the Countly SDK +# It is meant to be run from the example folder +# It will remove any existing AwesomeProject folder, and create a new one +# It will then copy the contents of CountlyRNExample to AwesomeProject +# It will then add countly-sdk-react-native-bridge to dependencies in package.json +# If on iOS, it will run pod install + def setup_react_native_app(): print("Removing existing AwesomeProject folder...") From 0bdb3780f4243b8f8e3424545a7f7dfa1260b187 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:01:34 +0900 Subject: [PATCH 03/48] Validator module (#262) * validators * radix * typo and deepscan warning --- Countly.js | 226 ++++++++----------------------- Validators.js | 115 ++++++++++++++++ example/CountlyRNExample/App.tsx | 4 +- 3 files changed, 176 insertions(+), 169 deletions(-) create mode 100644 Validators.js diff --git a/Countly.js b/Countly.js index f5cec47d..0c41131a 100644 --- a/Countly.js +++ b/Countly.js @@ -11,6 +11,7 @@ import CountlyState from './CountlyState.js'; import Feedback from './Feedback.js'; import * as L from './Logger.js'; import * as Utils from './Utils.js'; +import * as Validate from './Validators.js'; const { CountlyReactNative } = NativeModules; const eventEmitter = new NativeEventEmitter(CountlyReactNative); @@ -198,13 +199,13 @@ Countly.sendEvent = function (options) { * Supported data type for segments values are String, int, double and bool * @return {String || void} error message or void */ -Countly.recordView = async function (recordView, segments) { +Countly.recordView = function (recordView, segments) { if (!_state.isInitialized) { const msg = "'init' must be called before 'recordView'"; L.e(`recordView, ${msg}`); return msg; } - const message = await Countly.validateString(recordView, 'view name', 'recordView'); + const message = Validate.String(recordView, 'view name', 'recordView'); if (message) { return message; } @@ -247,8 +248,8 @@ Countly.disablePushNotifications = function () { * * @return {String || void} error message or void */ -Countly.pushTokenType = async function (tokenType, channelName, channelDescription) { - const message = await Countly.validateString(tokenType, 'tokenType', 'pushTokenType'); +Countly.pushTokenType = function (tokenType, channelName, channelDescription) { + const message = Validate.String(tokenType, 'tokenType', 'pushTokenType'); if (message) { return message; } @@ -318,7 +319,7 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] } if (_isPushInitialized) { - var message = "'configureIntentRedirectionCheck' must be called before 'askForNotificationPermission'"; + let message = "'configureIntentRedirectionCheck' must be called before 'askForNotificationPermission'"; L.e(`configureIntentRedirectionCheck, ${message}`); return message; } @@ -339,7 +340,7 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] const _allowedIntentClassNames = []; for (const className of allowedIntentClassNames) { - var message = Countly.validateString(className, 'class name', 'configureIntentRedirectionCheck'); + let message = Validate.String(className, 'class name', 'configureIntentRedirectionCheck'); if (message == null) { _allowedIntentClassNames.push(className); } @@ -347,7 +348,7 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] const _allowedIntentPackageNames = []; for (const packageName of allowedIntentPackageNames) { - var message = Countly.validateString(packageName, 'package name', 'configureIntentRedirectionCheck'); + let message = Validate.String(packageName, 'package name', 'configureIntentRedirectionCheck'); if (message == null) { _allowedIntentPackageNames.push(packageName); } @@ -520,13 +521,13 @@ Countly.getDeviceIDType = async function () { * @param {Boolean} onServer merge device id * @return {String || void} error message or void * */ -Countly.changeDeviceId = async function (newDeviceID, onServer) { +Countly.changeDeviceId = function (newDeviceID, onServer) { if (!_state.isInitialized) { const msg = "'init' must be called before 'changeDeviceId'"; L.e(`changeDeviceId, ${msg}`); return msg; } - const message = await Countly.validateString(newDeviceID, 'newDeviceID', 'changeDeviceId'); + const message = Validate.String(newDeviceID, 'newDeviceID', 'changeDeviceId'); if (message) { return message; } @@ -708,8 +709,8 @@ Countly.endSession = function () { * @param {String} salt salt * @return {String || void} error message or void */ -Countly.enableParameterTamperingProtection = async function (salt) { - const message = await Countly.validateString(salt, 'salt', 'enableParameterTamperingProtection'); +Countly.enableParameterTamperingProtection = function (salt) { + const message = Validate.String(salt, 'salt', 'enableParameterTamperingProtection'); if (message) { return message; } @@ -724,8 +725,8 @@ Countly.enableParameterTamperingProtection = async function (salt) { * * @return {String || void} error message or void */ -Countly.pinnedCertificates = async function (certificateName) { - const message = await Countly.validateString(certificateName, 'certificateName', 'pinnedCertificates'); +Countly.pinnedCertificates = function (certificateName) { + const message = Validate.String(certificateName, 'certificateName', 'pinnedCertificates'); if (message) { return message; } @@ -740,13 +741,13 @@ Countly.pinnedCertificates = async function (certificateName) { * @param {String} eventName name of event * @return {String || void} error message or void */ -Countly.startEvent = async function (eventName) { +Countly.startEvent = function (eventName) { if (!_state.isInitialized) { const msg = "'init' must be called before 'startEvent'"; L.e(`startEvent, ${msg}`); return msg; } - const message = await Countly.validateString(eventName, 'eventName', 'startEvent'); + const message = Validate.String(eventName, 'eventName', 'startEvent'); if (message) { return message; } @@ -761,13 +762,13 @@ Countly.startEvent = async function (eventName) { * @param {String} eventName name of event * @return {String || void} error message or void */ -Countly.cancelEvent = async function (eventName) { +Countly.cancelEvent = function (eventName) { if (!_state.isInitialized) { const msg = "'init' must be called before 'cancelEvent'"; L.e(`cancelEvent, ${msg}`); return msg; } - const message = await Countly.validateString(eventName, 'eventName', 'cancelEvent'); + const message = Validate.String(eventName, 'eventName', 'cancelEvent'); if (message) { return message; } @@ -878,7 +879,7 @@ Countly.setUserData = async function (userData) { } if (userData.byear) { - Countly.validateParseInt(userData.byear, 'key byear', 'setUserData'); + Validate.ParseInt(userData.byear, 'key byear', 'setUserData'); userData.byear = userData.byear.toString(); } args.push(userData); @@ -893,12 +894,12 @@ Countly.userData.setProperty = async function (keyName, keyValue) { return msg; } L.d(`setProperty, Setting user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'setProperty'); + let message = Validate.String(keyName, 'key', 'setProperty'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'setProperty'); + message = Validate.ValidUserData(keyValue, 'value', 'setProperty'); if (message) { return message; } @@ -915,7 +916,7 @@ Countly.userData.increment = async function (keyName) { return msg; } L.d(`increment, Incrementing user property: [${keyName}]`); - const message = await Countly.validateString(keyName, 'key', 'setProperty'); + const message = Validate.String(keyName, 'key', 'setProperty'); if (message) { return message; } @@ -931,11 +932,11 @@ Countly.userData.incrementBy = async function (keyName, keyValue) { return msg; } L.d(`incrementBy, Incrementing user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'incrementBy'); + let message = Validate.String(keyName, 'key', 'incrementBy'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'incrementBy'); + message = Validate.UserDataValue(keyValue, 'value', 'incrementBy'); if (message) { return message; } @@ -949,11 +950,11 @@ Countly.userData.multiply = async function (keyName, keyValue) { return msg; } L.d(`multiply, Multiplying user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'multiply'); + let message = Validate.String(keyName, 'key', 'multiply'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'multiply'); + message = Validate.UserDataValue(keyValue, 'value', 'multiply'); if (message) { return message; } @@ -967,11 +968,11 @@ Countly.userData.saveMax = async function (keyName, keyValue) { return msg; } L.d(`saveMax, Saving max user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'saveMax'); + let message = Validate.String(keyName, 'key', 'saveMax'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'saveMax'); + message = Validate.UserDataValue(keyValue, 'value', 'saveMax'); if (message) { return message; } @@ -985,11 +986,11 @@ Countly.userData.saveMin = async function (keyName, keyValue) { return msg; } L.d(`saveMin, Saving min user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'saveMin'); + let message = Validate.String(keyName, 'key', 'saveMin'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'saveMin'); + message = Validate.UserDataValue(keyValue, 'value', 'saveMin'); if (message) { return message; } @@ -1003,11 +1004,11 @@ Countly.userData.setOnce = async function (keyName, keyValue) { return msg; } L.d(`setOnce, Setting once user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'setOnce'); + let message = Validate.String(keyName, 'key', 'setOnce'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'setOnce'); + message = Validate.ValidUserData(keyValue, 'value', 'setOnce'); if (message) { return message; } @@ -1023,11 +1024,11 @@ Countly.userData.pushUniqueValue = async function (keyName, keyValue) { return msg; } L.d(`pushUniqueValue, Pushing unique value to user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'pushUniqueValue'); + let message = Validate.String(keyName, 'key', 'pushUniqueValue'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'pushUniqueValue'); + message = Validate.ValidUserData(keyValue, 'value', 'pushUniqueValue'); if (message) { return message; } @@ -1043,11 +1044,11 @@ Countly.userData.pushValue = async function (keyName, keyValue) { return msg; } L.d(`pushValue, Pushing value to user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'pushValue'); + let message = Validate.String(keyName, 'key', 'pushValue'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'pushValue'); + message = Validate.ValidUserData(keyValue, 'value', 'pushValue'); if (message) { return message; } @@ -1063,11 +1064,11 @@ Countly.userData.pullValue = async function (keyName, keyValue) { return msg; } L.d(`pullValue, Pulling value from user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'pullValue'); + let message = Validate.String(keyName, 'key', 'pullValue'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'pullValue'); + message = Validate.ValidUserData(keyValue, 'value', 'pullValue'); if (message) { return message; } @@ -1109,7 +1110,7 @@ Countly.userDataBulk.setUserProperties = async function (customAndPredefined) { } if (customAndPredefined.byear) { - Countly.validateParseInt(customAndPredefined.byear, 'key byear', 'setUserProperties'); + Validate.ParseInt(customAndPredefined.byear, 'key byear', 'setUserProperties'); customAndPredefined.byear = customAndPredefined.byear.toString(); } @@ -1133,12 +1134,12 @@ Countly.userDataBulk.setProperty = async function (keyName, keyValue) { return msg; } L.d(`setProperty, Setting user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'setProperty'); + let message = Validate.String(keyName, 'key', 'setProperty'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'setProperty'); + message = Validate.ValidUserData(keyValue, 'value', 'setProperty'); if (message) { return message; } @@ -1155,7 +1156,7 @@ Countly.userDataBulk.increment = async function (keyName) { return msg; } L.d(`increment, Incrementing user property: [${keyName}]`); - const message = await Countly.validateString(keyName, 'key', 'setProperty'); + const message = Validate.String(keyName, 'key', 'setProperty'); if (message) { return message; } @@ -1171,11 +1172,11 @@ Countly.userDataBulk.incrementBy = async function (keyName, keyValue) { return msg; } L.d(`incrementBy, Incrementing user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'incrementBy'); + let message = Validate.String(keyName, 'key', 'incrementBy'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'incrementBy'); + message = Validate.UserDataValue(keyValue, 'value', 'incrementBy'); if (message) { return message; } @@ -1189,11 +1190,11 @@ Countly.userDataBulk.multiply = async function (keyName, keyValue) { return msg; } L.d(`multiply, Multiplying user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'multiply'); + let message = Validate.String(keyName, 'key', 'multiply'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'multiply'); + message = Validate.UserDataValue(keyValue, 'value', 'multiply'); if (message) { return message; } @@ -1207,11 +1208,11 @@ Countly.userDataBulk.saveMax = async function (keyName, keyValue) { return msg; } L.d(`saveMax, Saving max user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'saveMax'); + let message = Validate.String(keyName, 'key', 'saveMax'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'saveMax'); + message = Validate.UserDataValue(keyValue, 'value', 'saveMax'); if (message) { return message; } @@ -1225,11 +1226,11 @@ Countly.userDataBulk.saveMin = async function (keyName, keyValue) { return msg; } L.d(`saveMin, Saving min user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'saveMin'); + let message = Validate.String(keyName, 'key', 'saveMin'); if (message) { return message; } - message = await Countly.validateUserDataValue(keyValue, 'value', 'saveMin'); + message = Validate.UserDataValue(keyValue, 'value', 'saveMin'); if (message) { return message; } @@ -1243,11 +1244,11 @@ Countly.userDataBulk.setOnce = async function (keyName, keyValue) { return msg; } L.d(`setOnce, Setting once user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'setOnce'); + let message = Validate.String(keyName, 'key', 'setOnce'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'setOnce'); + message = Validate.ValidUserData(keyValue, 'value', 'setOnce'); if (message) { return message; } @@ -1263,11 +1264,11 @@ Countly.userDataBulk.pushUniqueValue = async function (keyName, keyValue) { return msg; } L.d(`pushUniqueValue, Pushing unique value to user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'pushUniqueValue'); + let message = Validate.String(keyName, 'key', 'pushUniqueValue'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'pushUniqueValue'); + message = Validate.ValidUserData(keyValue, 'value', 'pushUniqueValue'); if (message) { return message; } @@ -1283,11 +1284,11 @@ Countly.userDataBulk.pushValue = async function (keyName, keyValue) { return msg; } L.d(`pushValue, Pushing value to user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'pushValue'); + let message = Validate.String(keyName, 'key', 'pushValue'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'pushValue'); + message = Validate.ValidUserData(keyValue, 'value', 'pushValue'); if (message) { return message; } @@ -1303,11 +1304,11 @@ Countly.userDataBulk.pullValue = async function (keyName, keyValue) { return msg; } L.d(`pullValue, Pulling value from user property: [${keyName}, ${keyValue}]`); - let message = await Countly.validateString(keyName, 'key', 'pullValue'); + let message = Validate.String(keyName, 'key', 'pullValue'); if (message) { return message; } - message = await Countly.validateValidUserData(keyValue, 'value', 'pullValue'); + message = Validate.ValidUserData(keyValue, 'value', 'pullValue'); if (message) { return message; } @@ -1923,116 +1924,5 @@ Countly.setCustomMetrics = async function (customMetric) { CountlyReactNative.setCustomMetrics(args); } }; -/** - * Validate user data value, it should be 'number' or 'string' that is parseable to 'number' - * and it should not be null or undefined - * It will return message if any issue found related to data validation else return null. - * @param {String} stringValue : value of data to validate - * @param {String} stringName : name of that value string - * @param {String} functionName : name of function from where value is validating. - * @returns - */ -Countly.validateUserDataValue = async (stringValue, stringName, functionName) => { - L.d(`validateUserDataValue, Validating user data value: [${stringValue}], name: [${stringName}], function: [${functionName}]`); - // validating that value should not be null or undefined - let message = await Countly.validateValidUserData(stringValue, stringName, functionName); - if (message) { - return message; - } - - // validating that value should be 'number' or 'string' - message = await Countly.validateUserDataType(stringValue, stringName, functionName); - if (message) { - return message; - } - - // validating that value should be parceable to int. - return await Countly.validateParseInt(stringValue, stringName, functionName); -}; - -/** - * Validate user data value, it should be 'number' or 'string' that is parseable to 'number' - * It will return message if any issue found related to data validation else return null. - * @param {String} stringValue : value of data to validate - * @param {String} stringName : name of that value string - * @param {String} functionName : name of function from where value is validating. - * @returns - */ -Countly.validateUserDataType = async (stringValue, stringName, functionName) => { - L.d(`validateUserDataType, Validating user data type: [${stringValue}], name: [${stringName}], function: [${functionName}]`); - let message = null; - if (typeof stringValue === 'number') { - return null; - } - if (typeof stringValue === 'string') { - L.w(`${functionName} unsupported data type '${typeof stringValue}', its data type should be 'number'`); - return null; - } - - message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'number'`; - L.e(`${functionName}, ${message}`); - return message; -}; - -/** - * Validate user data value, it should not be null or undefined - * It will return message if any issue found related to data validation else return null. - * @param {String} stringValue : value of data to validate - * @param {String} stringName : name of that value string - * @param {String} functionName : name of function from where value is validating. - * @returns - */ -Countly.validateValidUserData = async (stringValue, stringName, functionName) => { - L.d(`validateValidUserData, Validating valid user data: [${stringValue}], name: [${stringName}], function: [${functionName}]`); - if (stringValue || stringValue == '') { - return null; - } - - const message = `${stringName} should not be null or undefined`; - L.e(`${functionName}, ${message}`); - return message; -}; - -/** - * Validate user data value, it should be parseable to 'number' - * It will return message if any issue found related to data validation else return null. - * @param {String} stringValue : value of data to validate - * @param {String} stringName : name of that value string - * @param {String} functionName : name of function from where value is validating. - * @returns - */ -Countly.validateParseInt = async (stringValue, stringName, functionName) => { - L.d(`validateParseInt, Validating parse int: [${stringValue}], name: [${stringName}], function: [${functionName}]`); - const intValue = parseInt(stringValue); - if (!isNaN(intValue)) { - return null; - } - - const message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'number' or parseable to 'integer'`; - L.e(`${functionName}, ${message}`); - return message; -}; - -/** - * Validate string, it should not be empty, null or undefined - * It will return message if any issue found related to string validation else return null. - * @param {String} stringValue : value of string to validate - * @param {String} stringName : name of that value string - * @param {String} functionName : name of function from where value is validating. - * @returns - */ -Countly.validateString = async (stringValue, stringName, functionName) => { - L.d(`validateString, Validating string: [${stringValue}], name: [${stringName}], function: [${functionName}]`); - let message = null; - if (!stringValue) { - message = `${stringName} should not be null, undefined or empty`; - } else if (typeof stringValue !== 'string') { - message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'string'`; - } - if (message) { - L.e(`${functionName}, ${message}`); - } - return message; -}; export default Countly; diff --git a/Validators.js b/Validators.js new file mode 100644 index 00000000..b4b97058 --- /dev/null +++ b/Validators.js @@ -0,0 +1,115 @@ +import * as L from './Logger.js'; + +/** + * Validate user data value, it should be 'number' or 'string' that is parseable to 'number' + * It will return message if any issue found related to data validation else return null. + * @param {String} stringValue : value of data to validate + * @param {String} stringName : name of that value string + * @param {String} functionName : name of function from where value is validating. + * @returns + */ +function validateUserDataType(stringValue, stringName, functionName) { + L.d(`validateUserDataType, Validating user data type: [${stringValue}], name: [${stringName}], function: [${functionName}]`); + let message = null; + if (typeof stringValue === 'number') { + return null; + } + if (typeof stringValue === 'string') { + L.w(`${functionName} unsupported data type '${typeof stringValue}', its data type should be 'number'`); + return null; + } + + message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'number'`; + L.e(`${functionName}, ${message}`); + return message; +} + +/** + * Validate user data value, it should not be null or undefined + * It will return message if any issue found related to data validation else return null. + * @param {String} stringValue : value of data to validate + * @param {String} stringName : name of that value string + * @param {String} functionName : name of function from where value is validating. + * @returns + */ +function validateValidUserData(stringValue, stringName, functionName) { + L.d(`validateValidUserData, Validating valid user data: [${stringValue}], name: [${stringName}], function: [${functionName}]`); + if (stringValue || stringValue == '') { + return null; + } + + const message = `${stringName} should not be null or undefined`; + L.e(`${functionName}, ${message}`); + return message; +} + +/** + * Validate user data value, it should be parseable to 'number' + * It will return message if any issue found related to data validation else return null. + * @param {String} stringValue : value of data to validate + * @param {String} stringName : name of that value string + * @param {String} functionName : name of function from where value is validating. + * @returns + */ +function validateParseInt(stringValue, stringName, functionName) { + L.d(`validateParseInt, Validating parse int: [${stringValue}], name: [${stringName}], function: [${functionName}]`); + const intValue = parseInt(stringValue, 10); // explicitly converting to base 10, Codacy issue + if (!isNaN(intValue)) { + return null; + } + + const message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'number' or parseable to 'integer'`; + L.e(`${functionName}, ${message}`); + return message; +} + +/** + * Validate string, it should not be empty, null or undefined + * It will return message if any issue found related to string validation else return null. + * @param {String} stringValue : value of string to validate + * @param {String} stringName : name of that value string + * @param {String} functionName : name of function from where value is validating. + * @returns + */ +function validateString(stringValue, stringName, functionName) { + L.d(`validateString, Validating string: [${stringValue}], name: [${stringName}], function: [${functionName}]`); + let message = null; + if (!stringValue) { + message = `${stringName} should not be null, undefined or empty`; + } else if (typeof stringValue !== 'string') { + message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'string'`; + } + if (message) { + L.e(`${functionName}, ${message}`); + } + return message; +} + +/** + * Validate user data value, it should be 'number' or 'string' that is parseable to 'number' + * and it should not be null or undefined + * It will return message if any issue found related to data validation else return null. + * @param {String} stringValue : value of data to validate + * @param {String} stringName : name of that value string + * @param {String} functionName : name of function from where value is validating. + * @returns + */ +function validateUserDataValue(stringValue, stringName, functionName) { + L.d(`validateUserDataValue, Validating user data value: [${stringValue}], name: [${stringName}], function: [${functionName}]`); + // validating that value should not be null or undefined + let message = validateValidUserData(stringValue, stringName, functionName); + if (message) { + return message; + } + + // validating that value should be 'number' or 'string' + message = validateUserDataType(stringValue, stringName, functionName); + if (message) { + return message; + } + + // validating that value should be parceable to int. + return validateParseInt(stringValue, stringName, functionName); +} + +export { validateUserDataValue as UserDataValue, validateString as String, validateParseInt as ParseInt, validateValidUserData as ValidUserData, validateUserDataType as UserDataType }; diff --git a/example/CountlyRNExample/App.tsx b/example/CountlyRNExample/App.tsx index ada2d2f3..abbdeff8 100644 --- a/example/CountlyRNExample/App.tsx +++ b/example/CountlyRNExample/App.tsx @@ -610,7 +610,9 @@ class Example extends Component { const responseCode = successCodes[this.random(successCodes.length)]; const requestPayloadSize = this.random(700) + 200; const responsePayloadSize = this.random(700) + 200; - Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize); + const startTime = new Date().getTime(); + const endTime = startTime + 500; + Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime); }; recordNetworkTraceFailure = () => { const networkTraceKey = 'api/endpoint.1'; From 1c95af67c8a8bfaa1d19fe7dcfdec4db275f58dc Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Tue, 5 Dec 2023 20:41:01 +0900 Subject: [PATCH 04/48] App revamp (#263) * new app with pages * image at header * deepscan issues --- example/CountlyRNExample/APM.tsx | 57 ++ example/CountlyRNExample/App.tsx | 1041 +------------------- example/CountlyRNExample/Configuration.tsx | 21 + example/CountlyRNExample/Consent.tsx | 185 ++++ example/CountlyRNExample/Constants.js | 18 + example/CountlyRNExample/CountlyButton.tsx | 22 +- example/CountlyRNExample/Crashes.tsx | 46 + example/CountlyRNExample/DeviceID.tsx | 27 + example/CountlyRNExample/Events.tsx | 143 +++ example/CountlyRNExample/Feedback.tsx | 289 ++++++ example/CountlyRNExample/Home.tsx | 51 + example/CountlyRNExample/Others.tsx | 67 ++ example/CountlyRNExample/RemoteConfig.tsx | 73 ++ example/CountlyRNExample/UserProfiles.tsx | 161 +++ example/CountlyRNExample/Views.tsx | 40 + example/create_app.py | 2 +- 16 files changed, 1242 insertions(+), 1001 deletions(-) create mode 100644 example/CountlyRNExample/APM.tsx create mode 100644 example/CountlyRNExample/Configuration.tsx create mode 100644 example/CountlyRNExample/Consent.tsx create mode 100644 example/CountlyRNExample/Constants.js create mode 100644 example/CountlyRNExample/Crashes.tsx create mode 100644 example/CountlyRNExample/DeviceID.tsx create mode 100644 example/CountlyRNExample/Events.tsx create mode 100644 example/CountlyRNExample/Feedback.tsx create mode 100644 example/CountlyRNExample/Home.tsx create mode 100644 example/CountlyRNExample/Others.tsx create mode 100644 example/CountlyRNExample/RemoteConfig.tsx create mode 100644 example/CountlyRNExample/UserProfiles.tsx create mode 100644 example/CountlyRNExample/Views.tsx diff --git a/example/CountlyRNExample/APM.tsx b/example/CountlyRNExample/APM.tsx new file mode 100644 index 00000000..f8069e49 --- /dev/null +++ b/example/CountlyRNExample/APM.tsx @@ -0,0 +1,57 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +const successCodes = [100, 101, 200, 201, 202, 205, 300, 301, 303, 305]; +const failureCodes = [400, 402, 405, 408, 500, 501, 502, 505]; + +const startTrace = () => { + const traceKey = 'Trace Key'; + Countly.startTrace(traceKey); +}; +const endTrace = () => { + const traceKey = 'Trace Key'; + const customMetric = { + ABC: 1233, + C44C: 1337, + }; + Countly.endTrace(traceKey, customMetric); +}; +const random = (number: number) => { + return Math.floor(Math.random() * number); +}; +const recordNetworkTraceSuccess = () => { + const networkTraceKey = 'api/endpoint.1'; + const responseCode = successCodes[random(successCodes.length)]; + const requestPayloadSize = random(700) + 200; + const responsePayloadSize = random(700) + 200; + const startTime = new Date().getTime(); + const endTime = startTime + 500; + Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime); +}; +const recordNetworkTraceFailure = () => { + const networkTraceKey = 'api/endpoint.1'; + const responseCode = failureCodes[random(failureCodes.length)]; + const requestPayloadSize = random(700) + 250; + const responsePayloadSize = random(700) + 250; + const startTime = new Date().getTime(); + const endTime = startTime + 500; + Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime); +}; + +function APMScreen({ navigation }) { + return ( + + + + + + + + + ); +} + +export default APMScreen; diff --git a/example/CountlyRNExample/App.tsx b/example/CountlyRNExample/App.tsx index abbdeff8..3c13e2e5 100644 --- a/example/CountlyRNExample/App.tsx +++ b/example/CountlyRNExample/App.tsx @@ -1,1000 +1,55 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - */ - -import React, { Component } from 'react'; -import { Text, ScrollView, Image, View, TextInput, StyleSheet, SafeAreaView, Platform, Alert } from 'react-native'; -import CountlyButton from './CountlyButton'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig'; - -const successCodes = [100, 101, 200, 201, 202, 205, 300, 301, 303, 305]; -const failureCodes = [400, 402, 405, 408, 500, 501, 502, 505]; -const COUNTLY_APP_KEY = 'YOUR_APP_KEY'; -const COUNTLY_SERVER_KEY = 'https://try.count.ly'; - -class AttributionKey { - static IDFA = 'idfa'; - static AdvertisingID = 'adid'; -} -const campaignData = '{"cid":"[PROVIDED_CAMPAIGN_ID]", "cuid":"[PROVIDED_CAMPAIGN_USER_ID]"}'; - -//Base Countly Interfaces -interface UserDataPredefined { - name?: string; - username?: string; - email?: string; - organization?: string; - phone?: string; - picture?: string; - picturePath?: string; - gender?: string; - byear?: number; -} - -interface Segmentation {} - -interface EventProps { - eventName: string; - segments?: Segmentation; - eventCount?: number; - eventSum?: string; -} - -//Example App custom interfaces -interface SegmentationCustom_1 extends Segmentation { - Country: string; - Age: string; -} - -interface EventPropsCustom_1 extends EventProps { - segments?: SegmentationCustom_1; -} - -interface UserDataBulkCustom_1 extends UserDataPredefined { - customeValueA?: string; - customeValueB?: string; -} - -class Example extends Component { - constructor(props) { - super(props); - this.state = { ratingId: '61eac4627b8ad224e37bb3f5' }; - this.config = {}; - - this.onInit = this.onInit.bind(this); - this.onStart = this.onStart.bind(this); - this.basicEvent = this.basicEvent.bind(this); - this.eventWithSum = this.eventWithSum.bind(this); - this.eventWithSegment = this.eventWithSegment.bind(this); - this.eventWithSumAndSegment = this.eventWithSumAndSegment.bind(this); - this.startEvent = this.startEvent.bind(this); - this.test = this.test.bind(this); - this.onSendUserData = this.onSendUserData.bind(this); - this.onSendUserDataBulk = this.onSendUserDataBulk.bind(this); - this.onSetUserProperties = this.onSetUserProperties.bind(this); - this.onUpdateUserData = this.onUpdateUserData.bind(this); - this.userData_setProperty = this.userData_setProperty.bind(this); - this.userData_increment = this.userData_increment.bind(this); - this.userData_multiply = this.userData_multiply.bind(this); - this.userData_saveMax = this.userData_saveMax.bind(this); - this.userData_saveMin = this.userData_saveMin.bind(this); - this.userData_setOnce = this.userData_setOnce.bind(this); - this.changeDeviceId = this.changeDeviceId.bind(this); - this.askForNotificationPermission = this.askForNotificationPermission.bind(this); - - this.startTrace = this.startTrace.bind(this); - this.endTrace = this.endTrace.bind(this); - this.recordNetworkTraceSuccess = this.recordNetworkTraceSuccess.bind(this); - this.recordNetworkTraceFailure = this.recordNetworkTraceFailure.bind(this); - this.random = this.random.bind(this); - this.setCustomCrashSegments = this.setCustomCrashSegments.bind(this); - this.presentRatingWidgetUsingEditBox = this.presentRatingWidgetUsingEditBox.bind(this); - } - - componentDidMount = () => { - console.log('component did mount'); - // this.onInit(); - }; - - componentDidUpdate(prevProps, prevState) { - console.log('componentDidUpdate'); - } - - componentWillUnmount() { - console.log('componentWillUnmount'); - } - - onInit = async () => { - const attributionValues = {}; - if (/ios/.exec(Platform.OS)) { - attributionValues[AttributionKey.IDFA] = 'IDFA'; - } else { - attributionValues[AttributionKey.AdvertisingID] = 'AdvertisingID'; - } - - if (await Countly.isInitialized()) { - return; - } - const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY) - // .setDeviceID(Countly.TemporaryDeviceIDString) // Enable temporary id mode - .setLoggingEnabled(true) // Enable countly internal debugging logs - .enableCrashReporting() // Enable crash reporting to report unhandled crashes to Countly - .setRequiresConsent(true) // Set that consent should be required for features to work. - .giveConsent(['location', 'sessions', 'attribution', 'push', 'events', 'views', 'crashes', 'users', 'push', 'star-rating', 'apm', 'feedback', 'remote-config']) // give consent for specific features before init. - .setLocation('TR', 'Istanbul', '41.0082,28.9784', '10.2.33.12') // Set user initial location. - /** Optional settings for Countly initialisation */ - .enableParameterTamperingProtection('salt') // Set the optional salt to be used for calculating the checksum of requested data which will be sent with each request - // .pinnedCertificates("count.ly.cer") // It will ensure that connection is made with one of the public keys specified - // .setHttpPostForced(false) // Set to "true" if you want HTTP POST to be used for all requests - .enableApm() // Enable APM features, which includes the recording of app start time. - .pushTokenType(Countly.messagingMode.DEVELOPMENT, 'ChannelName', 'ChannelDescription') // Set messaging mode for push notifications - .configureIntentRedirectionCheck(['MainActivity'], ['com.countly.demo']) - .setStarRatingDialogTexts('Title', 'Message', 'Dismiss') - .recordDirectAttribution('countly', campaignData) - .recordIndirectAttribution(attributionValues); - - await Countly.initWithConfig(countlyConfig); // Initialize the countly SDK. - Countly.appLoadingFinished(); - /** - * Push notifications settings - * Should be call after init - */ - Countly.registerForNotification((theNotification: string) => { - const jsonString = JSON.stringify(JSON.parse(theNotification)); - console.log(`Just received this notification data: ${jsonString}`); - Alert.alert(`theNotification: ${jsonString}`); - }); // Set callback to receive push notifications - Countly.askForNotificationPermission('android.resource://com.countly.demo/raw/notif_sample'); // This method will ask for permission, enables push notification and send push token to countly server. - }; - - onStart = () => { - Countly.start(); - }; - onStop = () => { - Countly.stop(); - }; - onSendUserData = () => { - // example for setUserData - const options: UserDataPredefined = { - name: 'Name of User', - username: 'Username', - email: 'User Email', - organization: 'User Organization', - phone: 'User Contact number', - picture: 'https://count.ly/images/logos/countly-logo.png', - picturePath: '', - gender: 'Male', - byear: 1989, - }; - Countly.setUserData(options); - }; - - onSetUserProperties = () => { - // example for setUserData - // Predefined user properties - const options: UserDataBulkCustom_1 = { - name: 'Name of User', - username: 'Username', - email: 'User Email', - organization: 'User Organization', - phone: 'User Contact number', - picture: 'https://count.ly/images/logos/countly-logo.png', - picturePath: '', - gender: 'Male', - byear: 1989, - // Custom User Properties - customeValueA: 'Custom value A', - customeValueB: 'Custom value B', - }; - Countly.userDataBulk.setUserProperties(options); - Countly.userDataBulk.save(); - }; - - onSendUserDataBulk = () => { - // Promise.allSettled([Countly.userDataBulk.setProperty("key", "value"), - // Countly.userDataBulk.setProperty("increment", 5), - // Countly.userDataBulk.increment("increment"), - // Countly.userDataBulk.setProperty("incrementBy", 5), - // Countly.userDataBulk.incrementBy("incrementBy", 10), - // Countly.userDataBulk.setProperty("multiply", 5), - // Countly.userDataBulk.multiply("multiply", 20), - // Countly.userDataBulk.setProperty("saveMax", 5), - // Countly.userDataBulk.saveMax("saveMax", 100), - // Countly.userDataBulk.setProperty("saveMin", 5), - // Countly.userDataBulk.saveMin("saveMin", 50), - // Countly.userDataBulk.setOnce("setOnce", 200), - // Countly.userDataBulk.pushUniqueValue("type", "morning"), - // Countly.userDataBulk.pushValue("type", "morning"), - // Countly.userDataBulk.pullValue("type", "morning")]) - // .then(values => { - // // We need to call the "save" in then block else it will cause a race condition and "save" may call before all the user profiles calls are completed - // Countly.userDataBulk.save(); - // }) - }; - - onUpdateUserData = () => { - // example for setUserData - const options: UserDataPredefined = { - organization: 'Updated User Organization', - phone: 'Updated User Contact number', - gender: 'Female', - byear: 1995, - }; - Countly.setUserData(options); - }; - basicEvent = () => { - // example for basic event - const event = { eventName: 'Basic Event', eventCount: 1 }; - Countly.sendEvent(event); - }; - eventWithSum = () => { - // example for event with sum - const event = { eventName: 'Event With Sum', eventCount: 1, eventSum: '0.99' }; - Countly.sendEvent(event); - }; - eventWithSegment = () => { - // example for event with segment - let event: EventPropsCustom_1 = { - eventName: 'Event With Segment', - eventCount: 1, - segments: { Country: 'Turkey', Age: '28' }, - }; - event.segments = { Country: 'Turkey', Age: '28' }; - Countly.sendEvent(event); - event = { - eventName: 'Event With Segment', - eventCount: 1, - segments: { Country: 'France', Age: '38' }, - }; - Countly.sendEvent(event); - }; - eventWithSumAndSegment = () => { - // example for event with segment and sum - let event: EventPropsCustom_1 = { - eventName: 'Event With Sum And Segment', - eventCount: 1, - eventSum: '0.99', - segments: { Country: 'Turkey', Age: '28' }, - }; - Countly.sendEvent(event); - event = { - eventName: 'Event With Sum And Segment', - eventCount: 3, - eventSum: '1.99', - segments: { Country: 'France', Age: '38' }, - }; - Countly.sendEvent(event); - }; - - // TIMED EVENTS - startEvent = () => { - Countly.startEvent('timedEvent'); - setTimeout(() => { - Countly.endEvent('timedEvent'); - }, 1000); - }; - - /* - setTimeout may not work correctly if you are attached to Chrome Debugger. - for workaround see: https://github.com/facebook/react-native/issues/9436 -*/ - timedEventWithSum = () => { - // Event with sum - Countly.startEvent('timedEventWithSum'); - - const event: EventProps = { - eventName: 'timedEventWithSum', - eventSum: '0.99', - }; - - setTimeout(() => { - Countly.endEvent(event); - }, 1000); - }; - - timedEventWithSegment = () => { - // Event with segment - Countly.startEvent('timedEventWithSegment'); - - const event: EventPropsCustom_1 = { - eventName: 'timedEventWithSegment', - segments: { Country: 'Germany', Age: '32' }, - }; - setTimeout(() => { - Countly.endEvent(event); - }, 1000); - }; - - timedEventWithSumAndSegment = () => { - // Event with Segment, sum and count - Countly.startEvent('timedEventWithSumAndSegment'); - - const event: EventPropsCustom_1 = { - eventName: 'timedEventWithSumAndSegment', - eventCount: 1, - eventSum: '0.99', - segments: { Country: 'India', Age: '21' }, - }; - setTimeout(() => { - Countly.endEvent(event); - }, 1000); - }; - // TIMED EVENTS - - userData_setProperty = () => { - Countly.userData.setProperty('setProperty', 'keyValue'); - }; - - userData_increment = () => { - Countly.userData.setProperty('increment', 5); - Countly.userData.increment('increment'); - }; - - userData_incrementBy = () => { - Countly.userData.setProperty('incrementBy', 5); - Countly.userData.incrementBy('incrementBy', 10); - }; - - userData_multiply = () => { - Countly.userData.setProperty('multiply', 5); - Countly.userData.multiply('multiply', 20); - }; - - userData_saveMax = () => { - Countly.userData.setProperty('saveMax', 5); - Countly.userData.saveMax('saveMax', 100); - }; - - userData_saveMin = () => { - Countly.userData.setProperty('saveMin', 5); - Countly.userData.saveMin('saveMin', 50); - }; - - userData_setOnce = () => { - Countly.userData.setOnce('setOnce', 200); - }; - - userData_pushUniqueValue = () => { - Countly.userData.pushUniqueValue('type', 'morning'); - }; - - userData_pushValue = () => { - Countly.userData.pushValue('type', 'morning'); - }; - - userData_pullValue = () => { - Countly.userData.pullValue('type', 'morning'); - }; - - temporaryDeviceIdMode = () => { - Countly.changeDeviceId(Countly.TemporaryDeviceIDString); - }; - - changeDeviceId = () => { - Countly.changeDeviceId('02d56d66-6a39-482d-aff0-d14e4d5e5fda'); - }; - - giveConsent = (name: string) => { - Countly.giveConsent([name]); - }; - - removeConsent = (name: string) => { - Countly.removeConsent([name]); - }; - - giveMultipleConsent = () => { - Countly.giveConsent(['events', 'views', 'star-rating', 'crashes', 'invalidFeatureName']); - }; - - removeMultipleConsent = () => { - Countly.removeConsent(['events', 'views']); - }; - - giveAllConsent = () => { - Countly.giveAllConsent(); - }; - - removeAllConsent = () => { - Countly.removeAllConsent(); - }; - - remoteConfigUpdate = () => { - Countly.remoteConfigUpdate((data) => { - console.log(data); - }); - }; - - updateRemoteConfigForKeysOnly = () => { - Countly.updateRemoteConfigForKeysOnly(['test1'], (data) => { - console.log(data); - }); - }; - - updateRemoteConfigExceptKeys = () => { - Countly.updateRemoteConfigExceptKeys(['test1'], (data) => { - console.log(data); - }); - }; - - getAndPresentRating = () => { - Countly.feedback.getAvailableFeedbackWidgets((retrivedWidgets, error) => { - if (error != null) { - console.log(`reportRatingManually Error : ${error}`); - } else { - console.log(`reportRatingManually Success : ${retrivedWidgets.length}`); - const widget = retrivedWidgets.find((x) => x.type === 'rating'); - if (widget) { - this.presentWidget(widget); - } - } - }); - }; - - presentWidget = (widget) => { - Countly.feedback.presentFeedbackWidget( - widget, - 'Close', - function () { - console.log('presentWidget : ' + 'Widgetshown'); - }, - function () { - console.log('presentWidget : ' + 'Widgetclosed'); - } - ); - }; - - getRemoteConfigValueForKeyBoolean = () => { - Countly.getRemoteConfigValueForKey('booleanValue', (data) => { - console.log(data); - }); - }; - getRemoteConfigValueForKeyFloat = () => { - Countly.getRemoteConfigValueForKey('floatValue', (data) => { - console.log(data); - }); - }; - getRemoteConfigValueForKeyInteger = () => { - Countly.getRemoteConfigValueForKey('integerValue', (data) => { - console.log(data); - }); - }; - getRemoteConfigValueForKeyString = () => { - Countly.getRemoteConfigValueForKey('stringValue', (data) => { - console.log(data); - }); - }; - getRemoteConfigValueForKeyJSON = () => { - Countly.getRemoteConfigValueForKey('jsonValue', (data) => { - console.log(data); - }); - }; - - remoteConfigClearValues = () => { - Countly.remoteConfigClearValues(); - }; - - setLocation = () => { - const countryCode = 'us'; - const city = 'Houston'; - const latitude = '29.634933'; - const longitude = '-95.220255'; - const ipAddress = '103.238.105.167'; - Countly.setLocation(countryCode, city, `${latitude},${longitude}`, ipAddress); - }; - disableLocation = () => { - Countly.disableLocation(); - }; - - askForNotificationPermission = () => { - Countly.askForNotificationPermission(); - }; - - setStarRatingDialogTexts = () => { - Countly.setStarRatingDialogTexts(); - }; - - showStarRating = () => { - Countly.showStarRating(); - }; - - showFeedbackPopup = () => { - Countly.showFeedbackPopup('5f8c837a5294f7aae370067c', 'Submit'); - }; - - presentRatingWidget = () => { - Countly.presentRatingWidgetWithID('625f9032028614795fe5a85b', 'Submit', (error) => { - if (error != null) { - console.log(error); - } - }); - }; - - presentRatingWidgetUsingEditBox = function () { - Countly.presentRatingWidgetWithID(this.state.ratingId, 'Submit', (error) => { - if (error != null) { - console.log(`presentRatingWidgetUsingEditBox : ${error}`); - } - }); - }; - - showSurvey = () => { - Countly.getFeedbackWidgets((retrivedWidgets, error) => { - if (error != null) { - console.log(`showSurvey Error : ${error}`); - } else { - console.log(`showSurvey Success : ${retrivedWidgets.length}`); - const surveyWidget = retrivedWidgets.find((x) => x.type === 'survey'); - if (surveyWidget) { - Countly.presentFeedbackWidgetObject( - surveyWidget, - 'Close', - function () { - console.log('showSurvey presentFeedbackWidgetObject : ' + 'Widgetshown'); - }, - function () { - console.log('showSurvey presentFeedbackWidgetObject : ' + 'Widgetclosed'); - } - ); - } - } - }); - }; - - showNPS = () => { - Countly.getFeedbackWidgets((retrivedWidgets, error) => { - if (error != null) { - console.log(`showNPS Error : ${error}`); - } else { - console.log(`showNPS Success : ${retrivedWidgets.length}`); - const npsWidget = retrivedWidgets.find((x) => x.type === 'nps'); - if (npsWidget) { - Countly.presentFeedbackWidgetObject( - npsWidget, - 'Close', - function () { - console.log('showNPS presentFeedbackWidgetObject : ' + 'Widgetshown'); - }, - function () { - console.log('showNPS presentFeedbackWidgetObject : ' + 'Widgetclosed'); - } - ); - } - } - }); - }; - - addCrashLog = () => { - const timestamp = Math.floor(new Date().getTime() / 1000); - Countly.addCrashLog(`My crash log in string. Time: ${timestamp.toString()}`); - }; - - recordException = () => { - Countly.addCrashLog('User Performed Step A'); - setTimeout(() => { - Countly.addCrashLog('User Performed Step B'); - }, 1000); - setTimeout(() => { - Countly.addCrashLog('User Performed Step C'); - try { - const a = {}; - const x = a.b.c; // this will create error. - } catch (error) { - const stack = error.stack.toString(); - Countly.logException(stack, true, { _library_a_version: '0.0.1' }); - } - }, 1010); - }; - - // APM Examples - startTrace = () => { - const traceKey = 'Trace Key'; - Countly.startTrace(traceKey); - }; - endTrace = () => { - const traceKey = 'Trace Key'; - const customMetric = { - ABC: 1233, - C44C: 1337, - }; - Countly.endTrace(traceKey, customMetric); - }; - random = (number: number) => { - return Math.floor(Math.random() * number); - }; - recordNetworkTraceSuccess = () => { - const networkTraceKey = 'api/endpoint.1'; - const responseCode = successCodes[this.random(successCodes.length)]; - const requestPayloadSize = this.random(700) + 200; - const responsePayloadSize = this.random(700) + 200; - const startTime = new Date().getTime(); - const endTime = startTime + 500; - Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime); - }; - recordNetworkTraceFailure = () => { - const networkTraceKey = 'api/endpoint.1'; - const responseCode = failureCodes[this.random(failureCodes.length)]; - const requestPayloadSize = this.random(700) + 250; - const responsePayloadSize = this.random(700) + 250; - const startTime = new Date().getTime(); - const endTime = startTime + 500; - Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime); - }; - - setCustomCrashSegments = () => { - const segment = { Key: 'Value' }; - Countly.setCustomCrashSegments(segment); - }; - - /* - testCrash = () => { - Countly.testCrash(); - } - */ - - setCustomMetrics = () => { - const customMetric = { - _carrier: 'Custom Carrier', - }; - Countly.setCustomMetrics(customMetric); - }; - - recordDirectAttribution = () => { - Countly.recordDirectAttribution('countly', campaignData); - }; - - recordIndirectAttribution = () => { - const attributionValues = {}; - if (/ios/.exec(Platform.OS)) { - attributionValues[AttributionKey.IDFA] = 'IDFA'; - } else { - attributionValues[AttributionKey.AdvertisingID] = 'AdvertisingID'; - } - - Countly.recordIndirectAttribution(attributionValues); - }; - - test = () => { - this.onInit(); - this.onStart(); - this.basicEvent(); - this.eventWithSum(); - this.eventWithSegment(); - this.eventWithSumAndSegment(); - this.startEvent(); - this.onSendUserData(); - this.onSendUserDataBulk(); - this.onSetUserProperties(); - this.onUpdateUserData(); - this.userData_setProperty(); - this.userData_increment(); - this.userData_incrementBy(); - this.userData_multiply(); - this.userData_saveMax(); - this.userData_saveMin(); - this.userData_setOnce(); - // Note: Crash test for setLocation method. - // Countly.setLocation(null, city, latitude + "," + longitude, ipAddress); - // Countly.setLocation(null, null, latitude + "," + longitude, ipAddress); - // Countly.setLocation(null, null, null, ipAddress); - // Countly.setLocation(null, null, null, null); - // Countly.setLocation(countryCode, null, null, null); - // Countly.setLocation(countryCode, city, null, null); - // Countly.setLocation(countryCode, city, latitude + "," + longitude, null); - // Countly.setLocation(countryCode, city, ",", ipAddress); - // Countly.setLocation(countryCode, city, "0,0", ipAddress); - // Countly.setLocation(countryCode, city, "a,b", ipAddress); - // Countly.setLocation(countryCode, city, "abcd", ipAddress); - }; - +import * as React from 'react'; +import { NavigationContainer } from '@react-navigation/native'; +import { createNativeStackNavigator } from '@react-navigation/native-stack'; + +import { navigationName } from './Constants'; +import HomeScreen from './Home'; +import FeedbackScreen from './Feedback'; +import EventScreen from './Events'; +import UserProfilesScreen from './UserProfiles'; +import ViewsScreen from './Views'; +import APMScreen from './APM'; +import DeviceIDScreen from './DeviceID'; +import ConsentScreen from './Consent'; +import RemoteConfigScreen from './RemoteConfig'; +import OthersScreen from './Others'; +import CrashesScreen from './Crashes'; + +const Stack = createNativeStackNavigator(); +class Example extends React.Component { render() { return ( - - - - { - console.log(e.nativeEvent.error); - }} - /> - React Native Demo App - - - - - - - - . - Events Start - - - - - - - - - Events End - . - 2017 - User Methods Start - - - - - - - - - - - - - - - User Methods End - . - Other Methods Start - - - - - - - - { - this.setState({ ratingId }); - }} - onSubmitEditing={(ratingId) => { - this.setState({ ratingId }); - }} - value={this.state.ratingId} - /> - - - - - - - - Other Methods End - . - Push Notification Start - - - - Push Notification End - . - Consent Start - - - {/* Give Consent */} - { - this.giveConsent('sessions'); - }} - title="Give sessions" - color="#00b5ad" - /> - { - this.giveConsent('events'); - }} - title="Give events" - color="#00b5ad" - /> - { - this.giveConsent('views'); - }} - title="Give views" - color="#00b5ad" - /> - { - this.giveConsent('location'); - }} - title="Give location" - color="#00b5ad" - /> - { - this.giveConsent('crashes'); - }} - title="Give crashes" - color="#00b5ad" - /> - { - this.giveConsent('attribution'); - }} - title="Give attribution" - color="#00b5ad" - /> - { - this.giveConsent('users'); - }} - title="Give users" - color="#00b5ad" - /> - { - this.giveConsent('push'); - }} - title="Give push" - color="#00b5ad" - /> - { - this.giveConsent('star-rating'); - }} - title="Give star-rating" - color="#00b5ad" - /> - { - this.giveConsent('apm'); - }} - title="Give APM" - color="#00b5ad" - /> - - {/* Remove Consent */} - { - this.removeConsent('sessions'); - }} - title="Remove sessions" - color="#00b5ad" - /> - { - this.removeConsent('events'); - }} - title="Remove events" - color="#00b5ad" - /> - { - this.removeConsent('views'); - }} - title="Remove views" - color="#00b5ad" - /> - { - this.removeConsent('location'); - }} - title="Remove location" - color="#00b5ad" - /> - { - this.removeConsent('crashes'); - }} - title="Remove crashes" - color="#00b5ad" - /> - { - this.removeConsent('attribution'); - }} - title="Remove attribution" - color="#00b5ad" - /> - { - this.removeConsent('users'); - }} - title="Remove users" - color="#00b5ad" - /> - { - this.removeConsent('push'); - }} - title="Remove push" - color="#00b5ad" - /> - { - this.removeConsent('star-rating'); - }} - title="Remove star-rating" - color="#00b5ad" - /> - { - this.removeConsent('apm'); - }} - title="Remove APM" - color="#00b5ad" - /> - - - Consent End - . - Remote Config Start - - - - - - - - - - Remote Config End - . - Crash Event start - - Crash Event End - . - APM Example Start - - - - - - - APM Example Start - . - {/* - - */} - - + + + ( + { + console.log(e.nativeEvent.error); + }} + /> + ), + }} + /> + + + + + + + + + + + + ); } } -const styles = StyleSheet.create({ - inputRoundedBorder: { - margin: 5, - backgroundColor: 'white', - borderWidth: 1, - borderRadius: 10, - borderColor: 'grey', - padding: 10, - fontSize: 20, - }, -}); - export default Example; diff --git a/example/CountlyRNExample/Configuration.tsx b/example/CountlyRNExample/Configuration.tsx new file mode 100644 index 00000000..9cffc956 --- /dev/null +++ b/example/CountlyRNExample/Configuration.tsx @@ -0,0 +1,21 @@ +import CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig'; + +const COUNTLY_SERVER_KEY = 'https://master.count.ly'; +const COUNTLY_APP_KEY = 'support'; + +const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY).setLoggingEnabled(true); // Enable countly internal debugging logs +// .setDeviceID(Countly.TemporaryDeviceIDString) // Enable temporary id mode +// .enableCrashReporting() // Enable crash reporting to report unhandled crashes to Countly +// .setRequiresConsent(true) // Set that consent should be required for features to work. +// .giveConsent(['location', 'sessions', 'attribution', 'push', 'events', 'views', 'crashes', 'users', 'push', 'star-rating', 'apm', 'feedback', 'remote-config']) // give consent for specific features before init. +// .setLocation('TR', 'Istanbul', '41.0082,28.9784', '10.2.33.12') // Set user initial location. +// .enableParameterTamperingProtection('salt') // Set the optional salt to be used for calculating the checksum of requested data which will be sent with each request +// .pinnedCertificates("count.ly.cer") // It will ensure that connection is made with one of the public keys specified +// .setHttpPostForced(false) // Set to "true" if you want HTTP POST to be used for all requests +// .enableApm() // Enable APM features, which includes the recording of app start time. +// .pushTokenType(Countly.messagingMode.DEVELOPMENT, 'ChannelName', 'ChannelDescription') // Set messaging mode for push notifications +// .configureIntentRedirectionCheck(['MainActivity'], ['com.countly.demo']) +// .setStarRatingDialogTexts('Title', 'Message', 'Dismiss') +// .recordDirectAttribution('countly', campaignData) +// .recordIndirectAttribution(attributionValues) +export default countlyConfig; diff --git a/example/CountlyRNExample/Consent.tsx b/example/CountlyRNExample/Consent.tsx new file mode 100644 index 00000000..b6d131e7 --- /dev/null +++ b/example/CountlyRNExample/Consent.tsx @@ -0,0 +1,185 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +const giveConsent = (name: string) => { + Countly.giveConsent([name]); +}; + +const removeConsent = (name: string) => { + Countly.removeConsent([name]); +}; + +const giveMultipleConsent = () => { + Countly.giveConsent(['events', 'views', 'star-rating', 'crashes', 'invalidFeatureName']); +}; + +const removeMultipleConsent = () => { + Countly.removeConsent(['events', 'views']); +}; + +const giveAllConsent = () => { + Countly.giveAllConsent(); +}; + +const removeAllConsent = () => { + Countly.removeAllConsent(); +}; + +function ConsentScreen({ navigation }) { + return ( + + + + + { + giveConsent('sessions'); + }} + title="Give sessions" + color="#00b5ad" + /> + { + giveConsent('events'); + }} + title="Give events" + color="#00b5ad" + /> + { + giveConsent('views'); + }} + title="Give views" + color="#00b5ad" + /> + { + giveConsent('location'); + }} + title="Give location" + color="#00b5ad" + /> + { + giveConsent('crashes'); + }} + title="Give crashes" + color="#00b5ad" + /> + { + giveConsent('attribution'); + }} + title="Give attribution" + color="#00b5ad" + /> + { + giveConsent('users'); + }} + title="Give users" + color="#00b5ad" + /> + { + giveConsent('push'); + }} + title="Give push" + color="#00b5ad" + /> + { + giveConsent('star-rating'); + }} + title="Give star-rating" + color="#00b5ad" + /> + { + giveConsent('apm'); + }} + title="Give APM" + color="#00b5ad" + /> + + { + removeConsent('sessions'); + }} + title="Remove sessions" + color="#00b5ad" + /> + { + removeConsent('events'); + }} + title="Remove events" + color="#00b5ad" + /> + { + removeConsent('views'); + }} + title="Remove views" + color="#00b5ad" + /> + { + removeConsent('location'); + }} + title="Remove location" + color="#00b5ad" + /> + { + removeConsent('crashes'); + }} + title="Remove crashes" + color="#00b5ad" + /> + { + removeConsent('attribution'); + }} + title="Remove attribution" + color="#00b5ad" + /> + { + removeConsent('users'); + }} + title="Remove users" + color="#00b5ad" + /> + { + removeConsent('push'); + }} + title="Remove push" + color="#00b5ad" + /> + { + removeConsent('star-rating'); + }} + title="Remove star-rating" + color="#00b5ad" + /> + { + removeConsent('apm'); + }} + title="Remove APM" + color="#00b5ad" + /> + + + + + ); +} + +export default ConsentScreen; diff --git a/example/CountlyRNExample/Constants.js b/example/CountlyRNExample/Constants.js new file mode 100644 index 00000000..429a8a51 --- /dev/null +++ b/example/CountlyRNExample/Constants.js @@ -0,0 +1,18 @@ +const lightOrange = '#FFA737'; +const lightGreen = '#2DA657'; // countly green + +const navigationName = { + Home: 'Countly RN Example', + Feedback: 'Feedback', + Events: 'Events', + UserProfiles: 'User Profiles', + Views: 'Views', + Crashes: 'Crashes', + APM: 'APM', + Consent: 'Consent', + Others: 'Others', + DeviceID: 'Device ID', + RemoteConfig: 'Remote Config', +}; + +export { lightOrange, navigationName, lightGreen }; diff --git a/example/CountlyRNExample/CountlyButton.tsx b/example/CountlyRNExample/CountlyButton.tsx index a86790d0..67a25bb2 100644 --- a/example/CountlyRNExample/CountlyButton.tsx +++ b/example/CountlyRNExample/CountlyButton.tsx @@ -1,15 +1,16 @@ +/* eslint-disable react-native/no-inline-styles */ import React from 'react'; import { Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from 'react-native'; const customStyleOverrides = StyleSheet.create({ button: { - height: 40, - borderRadius: 6, + borderRadius: 10, justifyContent: 'center', alignItems: 'center', - marginLeft: 20, - marginTop: 10, - marginRight: 20, + marginVertical: 5, + marginHorizontal: 20, + paddingHorizontal: 10, + paddingVertical: 5, }, text: { fontSize: 14, @@ -24,10 +25,17 @@ interface CountlyButtonProps { title: string; } -const CountlyButton = (props: CountlyButtonProps) : JSX.Element => { +const CountlyButton = (props: CountlyButtonProps): JSX.Element => { return ( - + {props.title} diff --git a/example/CountlyRNExample/Crashes.tsx b/example/CountlyRNExample/Crashes.tsx new file mode 100644 index 00000000..74a98249 --- /dev/null +++ b/example/CountlyRNExample/Crashes.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +const addCrashLog = () => { + const timestamp = Math.floor(new Date().getTime() / 1000); + Countly.addCrashLog(`My crash log in string. Time: ${timestamp.toString()}`); +}; + +const recordException = () => { + Countly.addCrashLog('User Performed Step A'); + setTimeout(() => { + Countly.addCrashLog('User Performed Step B'); + }, 1000); + setTimeout(() => { + Countly.addCrashLog('User Performed Step C'); + try { + const a = {}; + const x = a.b.c; // this will create error. + } catch (error) { + const stack = error.stack.toString(); + Countly.logException(stack, true, { _library_a_version: '0.0.1' }); + } + }, 1010); +}; + +const setCustomCrashSegments = () => { + const segment = { Key: 'Value' }; + Countly.setCustomCrashSegments(segment); +}; + +function CrashesScreen({ navigation }) { + return ( + + + + + + + + ); +} + +export default CrashesScreen; diff --git a/example/CountlyRNExample/DeviceID.tsx b/example/CountlyRNExample/DeviceID.tsx new file mode 100644 index 00000000..a4378266 --- /dev/null +++ b/example/CountlyRNExample/DeviceID.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; +import { lightOrange } from './Constants'; + +const temporaryDeviceIdMode = () => { + Countly.changeDeviceId(Countly.TemporaryDeviceIDString); +}; + +const changeDeviceId = () => { + Countly.changeDeviceId('02d56d66-6a39-482d-aff0-d14e4d5e5fda'); +}; + +function DeviceIDScreen({ navigation }) { + return ( + + + + + + + ); +} + +export default DeviceIDScreen; diff --git a/example/CountlyRNExample/Events.tsx b/example/CountlyRNExample/Events.tsx new file mode 100644 index 00000000..779455cd --- /dev/null +++ b/example/CountlyRNExample/Events.tsx @@ -0,0 +1,143 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +interface Segmentation {} +interface SegmentationCustom_1 extends Segmentation { + Country: string; + Age: string; +} +interface EventProps { + eventName: string; + segments?: Segmentation; + eventCount?: number; + eventSum?: string; +} +interface EventPropsCustom_1 extends EventProps { + segments?: SegmentationCustom_1; +} + +const basicEvent = () => { + // example for basic event + const event = { eventName: 'Basic Event', eventCount: 1 }; + Countly.sendEvent(event); +}; +const eventWithSum = () => { + // example for event with sum + const event = { eventName: 'Event With Sum', eventCount: 1, eventSum: '0.99' }; + Countly.sendEvent(event); +}; +const eventWithSegment = () => { + // example for event with segment + let event: EventPropsCustom_1 = { + eventName: 'Event With Segment', + eventCount: 1, + segments: { Country: 'Turkey', Age: '28' }, + }; + event.segments = { Country: 'Turkey', Age: '28' }; + Countly.sendEvent(event); + event = { + eventName: 'Event With Segment', + eventCount: 1, + segments: { Country: 'France', Age: '38' }, + }; + Countly.sendEvent(event); +}; +const eventWithSumAndSegment = () => { + // example for event with segment and sum + let event: EventPropsCustom_1 = { + eventName: 'Event With Sum And Segment', + eventCount: 1, + eventSum: '0.99', + segments: { Country: 'Turkey', Age: '28' }, + }; + Countly.sendEvent(event); + event = { + eventName: 'Event With Sum And Segment', + eventCount: 3, + eventSum: '1.99', + segments: { Country: 'France', Age: '38' }, + }; + Countly.sendEvent(event); +}; + +// TIMED EVENTS +const startEvent = () => { + Countly.startEvent('timedEvent'); + setTimeout(() => { + Countly.endEvent('timedEvent'); + }, 1000); +}; + +/* + setTimeout may not work correctly if you are attached to Chrome Debugger. + for workaround see: https://github.com/facebook/react-native/issues/9436 +*/ +const timedEventWithSum = () => { + // Event with sum + Countly.startEvent('timedEventWithSum'); + + const event: EventProps = { + eventName: 'timedEventWithSum', + eventSum: '0.99', + }; + + setTimeout(() => { + Countly.endEvent(event); + }, 1000); +}; + +const timedEventWithSegment = () => { + // Event with segment + Countly.startEvent('timedEventWithSegment'); + + const event: EventPropsCustom_1 = { + eventName: 'timedEventWithSegment', + segments: { Country: 'Germany', Age: '32' }, + }; + setTimeout(() => { + Countly.endEvent(event); + }, 1000); +}; + +const timedEventWithSumAndSegment = () => { + // Event with Segment, sum and count + Countly.startEvent('timedEventWithSumAndSegment'); + + const event: EventPropsCustom_1 = { + eventName: 'timedEventWithSumAndSegment', + eventCount: 1, + eventSum: '0.99', + segments: { Country: 'India', Age: '21' }, + }; + setTimeout(() => { + Countly.endEvent(event); + }, 1000); +}; +// TIMED EVENTS + +const eventSendThreshold = () => { + Countly.setEventSendThreshold(10); +}; + +function EventScreen({ navigation }) { + return ( + + + + + + + + + + + + + + ); +} + +export default EventScreen; diff --git a/example/CountlyRNExample/Feedback.tsx b/example/CountlyRNExample/Feedback.tsx new file mode 100644 index 00000000..386fcb6f --- /dev/null +++ b/example/CountlyRNExample/Feedback.tsx @@ -0,0 +1,289 @@ +/* eslint-disable react-native/no-inline-styles */ +import React from 'react'; +import { ScrollView, StyleSheet, Text, TextInput } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; +import { lightOrange } from './Constants'; + +// This function fetches the widget list and presents the widget with the given type. (with callback) +function getAndPresentWidgetWithCallback(widgetType: string) { + Countly.feedback.getAvailableFeedbackWidgets((retrivedWidgets: any[], error: any) => { + if (error != null) { + console.error(`reportRatingManually, Error [${error}]`); + return; + } + + console.log(`reportRatingManually, result [${JSON.stringify(retrivedWidgets)}]`); + const widget = retrivedWidgets.find((x: { type: string }) => x.type === widgetType); + if (!widget) { + console.error(`reportRatingManually, widget not found [${widgetType}]`); + return; + } + + presentWidget(widget); + }); +} + +// This function fetches the widget list and presents the widget with the given type. (async) +async function getAndPresentWidgetAsync(widgetType: string) { + const resultObject = await Countly.feedback.getAvailableFeedbackWidgets(); + console.log(`reportRatingManually, result [${JSON.stringify(resultObject)}]`); + if (resultObject.error != null) { + console.error(`reportRatingManually, Error [${resultObject.error}]`); + return; + } + const widget = resultObject.data.find((x: { type: string }) => x.type === widgetType); + if (!widget) { + console.error(`reportRatingManually, widget not found [${widgetType}]`); + return; + } + + presentWidget(widget); +} + +// This function presents the given widget. +function presentWidget(widget: any) { + Countly.feedback.presentFeedbackWidget( + widget, + 'Close', + function () { + console.log('presentWidget, Widgetshown'); + }, + function () { + console.log('presentWidget, Widgetclosed'); + } + ); +} + +// This function fetches the widget list then widget data and then reports the widget manually. +async function reportWidgetManually(widgetType: string) { + // Get widget list + const resultObject = await Countly.feedback.getAvailableFeedbackWidgets(); + console.log(`reportWidgetManually, retrieved widget list result [${JSON.stringify(resultObject)}]`); + if (resultObject.error != null) { + console.error(`reportWidgetManually, Error [${resultObject.error}]`); + return; + } + + // Find widget by type + const widget = resultObject.data.find((x: { type: string }) => x.type === widgetType); + if (!widget) { + console.error(`reportWidgetManually, widget not found [${widgetType}]`); + return; + } + + // Get widget data + const widgetData = await Countly.feedback.getFeedbackWidgetData(widget); + if (widgetData.error != null) { + console.error('reportWidgetManually, Error while fetching widget data'); + return; + } + + // Report widget manually. Third parameter is some random data for the sake of example. + Countly.feedback.reportFeedbackWidgetManually(widget, widgetData.data, { rating: 5, comment: 'This is random' }); +} + +//============================================================ +// Old methods from the example project +//============================================================ +const setStarRatingDialogTexts = () => { + Countly.setStarRatingDialogTexts(); +}; + +const showStarRating = () => { + Countly.showStarRating(); +}; + +const showFeedbackPopup = () => { + Countly.showFeedbackPopup('5f8c837a5294f7aae370067c', 'Submit'); +}; + +presentRatingWidget = () => { + Countly.presentRatingWidgetWithID('625f9032028614795fe5a85b', 'Submit', (error) => { + if (error != null) { + console.log(error); + } + }); +}; + +const presentRatingWidgetUsingEditBox = function () { + Countly.presentRatingWidgetWithID(state.ratingId, 'Submit', (error) => { + if (error != null) { + console.log(`presentRatingWidgetUsingEditBox : ${error}`); + } + }); +}; + +const showSurvey = () => { + Countly.getFeedbackWidgets((retrivedWidgets, error) => { + if (error != null) { + console.log(`showSurvey Error : ${error}`); + } else { + console.log(`showSurvey Success : ${retrivedWidgets.length}`); + const surveyWidget = retrivedWidgets.find((x) => x.type === 'survey'); + if (surveyWidget) { + Countly.presentFeedbackWidgetObject( + surveyWidget, + 'Close', + function () { + console.log('showSurvey presentFeedbackWidgetObject : ' + 'Widgetshown'); + }, + function () { + console.log('showSurvey presentFeedbackWidgetObject : ' + 'Widgetclosed'); + } + ); + } + } + }); +}; + +const showNPS = () => { + Countly.getFeedbackWidgets((retrivedWidgets, error) => { + if (error != null) { + console.log(`showNPS Error : ${error}`); + } else { + console.log(`showNPS Success : ${retrivedWidgets.length}`); + const npsWidget = retrivedWidgets.find((x) => x.type === 'nps'); + if (npsWidget) { + Countly.presentFeedbackWidgetObject( + npsWidget, + 'Close', + function () { + console.log('showNPS presentFeedbackWidgetObject : ' + 'Widgetshown'); + }, + function () { + console.log('showNPS presentFeedbackWidgetObject : ' + 'Widgetclosed'); + } + ); + } + } + }); +}; + +const styles = StyleSheet.create({ + inputRoundedBorder: { + margin: 5, + backgroundColor: 'white', + borderWidth: 1, + borderRadius: 10, + borderColor: 'grey', + padding: 10, + fontSize: 20, + }, +}); + +const state = { ratingId: '61eac4627b8ad224e37bb3f5' }; + +function FeedbackScreen({ navigation }) { + return ( + + + With Callback + { + getAndPresentWidgetWithCallback('rating'); + }} + color={lightOrange} + lightText={true} + /> + { + getAndPresentWidgetWithCallback('survey'); + }} + color={lightOrange} + lightText={true} + /> + { + getAndPresentWidgetWithCallback('nps'); + }} + color={lightOrange} + lightText={true} + /> + Async Method + + getAndPresentWidgetAsync('rating').catch((e) => { + console.log(e); + }) + } + color={lightOrange} + lightText={true} + /> + + getAndPresentWidgetAsync('survey').catch((e) => { + console.log(e); + }) + } + color={lightOrange} + lightText={true} + /> + + getAndPresentWidgetAsync('nps').catch((e) => { + console.log(e); + }) + } + color={lightOrange} + lightText={true} + /> + Report Widget Manually + + reportWidgetManually('rating').catch((e) => { + console.log(e); + }) + } + color={lightOrange} + lightText={true} + /> + + reportWidgetManually('survey').catch((e) => { + console.log(e); + }) + } + color={lightOrange} + lightText={true} + /> + + reportWidgetManually('nps').catch((e) => { + console.log(e); + }) + } + color={lightOrange} + lightText={true} + /> + Legacy Methods + + { + state.ratingId = ratingId; + }} + value={state.ratingId} + /> + + + + + + + + ); +} + +export default FeedbackScreen; diff --git a/example/CountlyRNExample/Home.tsx b/example/CountlyRNExample/Home.tsx new file mode 100644 index 00000000..2acf347a --- /dev/null +++ b/example/CountlyRNExample/Home.tsx @@ -0,0 +1,51 @@ +/* eslint-disable react-native/no-inline-styles */ +import React from 'react'; +import { View, Image, Text, SafeAreaView, ScrollView, Alert } from 'react-native'; +import CountlyButton from './CountlyButton'; +import Countly from 'countly-sdk-react-native-bridge'; +import countlyConfig from './Configuration'; +import { lightGreen, navigationName } from './Constants'; + +async function initialize() { + if (await Countly.isInitialized()) { + console.warn('Countly is already initialized'); + return; + } + + await Countly.initWithConfig(countlyConfig); // Initialize the countly SDK. + Countly.appLoadingFinished(); + + /** + * Push notifications settings + * Should be call after init + */ + Countly.registerForNotification((theNotification: string) => { + const jsonString = JSON.stringify(JSON.parse(theNotification)); + console.log(`Just received this notification data: ${jsonString}`); + Alert.alert(`theNotification: ${jsonString}`); + }); // Set callback to receive push notifications + Countly.askForNotificationPermission('android.resource://com.countly.demo/raw/notif_sample'); // This method will ask for permission, enables push notification and send push token to countly server. +} + +function HomeScreen({ navigation }) { + initialize(); // Initialize the countly SDK. + return ( + + + Features List + navigation.navigate(navigationName.Feedback)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.Events)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.UserProfiles)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.Views)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.APM)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.DeviceID)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.Consent)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.RemoteConfig)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.Crashes)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.Others)} color={lightGreen} lightText={true} /> + + + ); +} + +export default HomeScreen; diff --git a/example/CountlyRNExample/Others.tsx b/example/CountlyRNExample/Others.tsx new file mode 100644 index 00000000..1afb49c5 --- /dev/null +++ b/example/CountlyRNExample/Others.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { Platform, ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +class AttributionKey { + static IDFA = 'idfa'; + static AdvertisingID = 'adid'; +} + +const campaignData = '{"cid":"[PROVIDED_CAMPAIGN_ID]", "cuid":"[PROVIDED_CAMPAIGN_USER_ID]"}'; + +const setLocation = () => { + const countryCode = 'us'; + const city = 'Houston'; + const latitude = '29.634933'; + const longitude = '-95.220255'; + const ipAddress = '103.238.105.167'; + Countly.setLocation(countryCode, city, `${latitude},${longitude}`, ipAddress); +}; +const disableLocation = () => { + Countly.disableLocation(); +}; + +const askForNotificationPermission = () => { + Countly.askForNotificationPermission(); +}; + +const setCustomMetrics = () => { + const customMetric = { + _carrier: 'Custom Carrier', + }; + Countly.setCustomMetrics(customMetric); +}; + +const recordDirectAttribution = () => { + Countly.recordDirectAttribution('countly', campaignData); +}; + +const recordIndirectAttribution = () => { + const attributionValues = {}; + if (/ios/.exec(Platform.OS)) { + attributionValues[AttributionKey.IDFA] = 'IDFA'; + } else { + attributionValues[AttributionKey.AdvertisingID] = 'AdvertisingID'; + } + + Countly.recordIndirectAttribution(attributionValues); +}; + +function OthersScreen({ navigation }) { + return ( + + + + + + + + + + + ); +} + +export default OthersScreen; diff --git a/example/CountlyRNExample/RemoteConfig.tsx b/example/CountlyRNExample/RemoteConfig.tsx new file mode 100644 index 00000000..997a08a3 --- /dev/null +++ b/example/CountlyRNExample/RemoteConfig.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +const remoteConfigUpdate = () => { + Countly.remoteConfigUpdate((data) => { + console.log(data); + }); +}; + +const updateRemoteConfigForKeysOnly = () => { + Countly.updateRemoteConfigForKeysOnly(['test1'], (data) => { + console.log(data); + }); +}; + +const updateRemoteConfigExceptKeys = () => { + Countly.updateRemoteConfigExceptKeys(['test1'], (data) => { + console.log(data); + }); +}; + +const getRemoteConfigValueForKeyBoolean = () => { + Countly.getRemoteConfigValueForKey('booleanValue', (data) => { + console.log(data); + }); +}; +const getRemoteConfigValueForKeyFloat = () => { + Countly.getRemoteConfigValueForKey('floatValue', (data) => { + console.log(data); + }); +}; +const getRemoteConfigValueForKeyInteger = () => { + Countly.getRemoteConfigValueForKey('integerValue', (data) => { + console.log(data); + }); +}; +const getRemoteConfigValueForKeyString = () => { + Countly.getRemoteConfigValueForKey('stringValue', (data) => { + console.log(data); + }); +}; +const getRemoteConfigValueForKeyJSON = () => { + Countly.getRemoteConfigValueForKey('jsonValue', (data) => { + console.log(data); + }); +}; + +const remoteConfigClearValues = () => { + Countly.remoteConfigClearValues(); +}; + +function RemoteConfigScreen({ navigation }) { + return ( + + + + + + + + + + + + + + ); +} + +export default RemoteConfigScreen; diff --git a/example/CountlyRNExample/UserProfiles.tsx b/example/CountlyRNExample/UserProfiles.tsx new file mode 100644 index 00000000..5d1af150 --- /dev/null +++ b/example/CountlyRNExample/UserProfiles.tsx @@ -0,0 +1,161 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +interface UserDataPredefined { + name?: string; + username?: string; + email?: string; + organization?: string; + phone?: string; + picture?: string; + picturePath?: string; + gender?: string; + byear?: number; +} + +interface UserDataBulkCustom_1 extends UserDataPredefined { + customeValueA?: string; + customeValueB?: string; +} +const onSendUserData = () => { + // example for setUserData + const options: UserDataPredefined = { + name: 'Name of User', + username: 'Username', + email: 'User Email', + organization: 'User Organization', + phone: 'User Contact number', + picture: 'https://count.ly/images/logos/countly-logo.png', + picturePath: '', + gender: 'Male', + byear: 1989, + }; + Countly.setUserData(options); +}; + +const onSetUserProperties = () => { + // example for setUserData + // Predefined user properties + const options: UserDataBulkCustom_1 = { + name: 'Name of User', + username: 'Username', + email: 'User Email', + organization: 'User Organization', + phone: 'User Contact number', + picture: 'https://count.ly/images/logos/countly-logo.png', + picturePath: '', + gender: 'Male', + byear: 1989, + // Custom User Properties + customeValueA: 'Custom value A', + customeValueB: 'Custom value B', + }; + Countly.userDataBulk.setUserProperties(options); + Countly.userDataBulk.save(); +}; + +const onSendUserDataBulk = () => { + // Promise.allSettled([Countly.userDataBulk.setProperty("key", "value"), + // Countly.userDataBulk.setProperty("increment", 5), + // Countly.userDataBulk.increment("increment"), + // Countly.userDataBulk.setProperty("incrementBy", 5), + // Countly.userDataBulk.incrementBy("incrementBy", 10), + // Countly.userDataBulk.setProperty("multiply", 5), + // Countly.userDataBulk.multiply("multiply", 20), + // Countly.userDataBulk.setProperty("saveMax", 5), + // Countly.userDataBulk.saveMax("saveMax", 100), + // Countly.userDataBulk.setProperty("saveMin", 5), + // Countly.userDataBulk.saveMin("saveMin", 50), + // Countly.userDataBulk.setOnce("setOnce", 200), + // Countly.userDataBulk.pushUniqueValue("type", "morning"), + // Countly.userDataBulk.pushValue("type", "morning"), + // Countly.userDataBulk.pullValue("type", "morning")]) + // .then(values => { + // // We need to call the "save" in then block else it will cause a race condition and "save" may call before all the user profiles calls are completed + // Countly.userDataBulk.save(); + // }) +}; + +const onUpdateUserData = () => { + // example for setUserData + const options: UserDataPredefined = { + organization: 'Updated User Organization', + phone: 'Updated User Contact number', + gender: 'Female', + byear: 1995, + }; + Countly.setUserData(options); +}; + +const userData_setProperty = () => { + Countly.userData.setProperty('setProperty', 'keyValue'); +}; + +const userData_increment = () => { + Countly.userData.setProperty('increment', 5); + Countly.userData.increment('increment'); +}; + +const userData_incrementBy = () => { + Countly.userData.setProperty('incrementBy', 5); + Countly.userData.incrementBy('incrementBy', 10); +}; + +const userData_multiply = () => { + Countly.userData.setProperty('multiply', 5); + Countly.userData.multiply('multiply', 20); +}; + +const userData_saveMax = () => { + Countly.userData.setProperty('saveMax', 5); + Countly.userData.saveMax('saveMax', 100); +}; + +const userData_saveMin = () => { + Countly.userData.setProperty('saveMin', 5); + Countly.userData.saveMin('saveMin', 50); +}; + +const userData_setOnce = () => { + Countly.userData.setOnce('setOnce', 200); +}; + +const userData_pushUniqueValue = () => { + Countly.userData.pushUniqueValue('type', 'morning'); +}; + +const userData_pushValue = () => { + Countly.userData.pushValue('type', 'morning'); +}; + +const userData_pullValue = () => { + Countly.userData.pullValue('type', 'morning'); +}; + +function UserProfilesScreen({ navigation }) { + return ( + + + + + + + + + + + + + + + + + + + ); +} + +export default UserProfilesScreen; diff --git a/example/CountlyRNExample/Views.tsx b/example/CountlyRNExample/Views.tsx new file mode 100644 index 00000000..6f7aa33c --- /dev/null +++ b/example/CountlyRNExample/Views.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import Countly from 'countly-sdk-react-native-bridge'; +import CountlyButton from './CountlyButton'; + +function ViewsScreen({ navigation }) { + return ( + + + + + + + + ); +} + +export default ViewsScreen; diff --git a/example/create_app.py b/example/create_app.py index b1fc114a..87bee1bb 100644 --- a/example/create_app.py +++ b/example/create_app.py @@ -30,7 +30,7 @@ def setup_react_native_app(): # Add countly-sdk-react-native-bridge to dependencies in package.json os.chdir("AwesomeProject") - os.system("npm install --save countly-sdk-react-native-bridge@latest") + os.system("npm install --save countly-sdk-react-native-bridge@latest @react-navigation/native react-native-screens react-native-safe-area-context @react-navigation/native-stack") # If on iOS, run pod install if platform.system() == "Darwin": From cc77f57c91e868b68f8fc37f3b51fe81bcc7bbce Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 13 Dec 2023 12:59:33 +0100 Subject: [PATCH 05/48] Type info for SDK (#275) * updating Countly.js * updating Countly.js * default value --- Countly.js | 154 ++++++++++++++++++++++++++-------------------------- Feedback.js | 24 ++++---- 2 files changed, 89 insertions(+), 89 deletions(-) diff --git a/Countly.js b/Countly.js index 0c41131a..74b215dd 100644 --- a/Countly.js +++ b/Countly.js @@ -51,21 +51,21 @@ Countly.TemporaryDeviceIDString = 'TemporaryDeviceID'; * @deprecated in 23.02.0 : use 'initWithConfig' instead of 'init'. * * @function Countly.init should be used to initialize countly - * @param {String} serverURL server url - * @param {String} appKey application key - * @param {String} deviceId device ID + * @param {string} serverURL server url + * @param {string} appKey application key + * @param {string} deviceId device ID */ Countly.init = async function (serverUrl, appKey, deviceId) { L.w('Countly.init is deprecated, use Countly.initWithConfig instead'); const countlyConfig = new CountlyConfig(serverUrl, appKey).setDeviceID(deviceId); - Countly.initWithConfig(countlyConfig); + await Countly.initWithConfig(countlyConfig); }; /** * Initialize Countly * * @function Countly.initWithConfig should be used to initialize countly with config - * @param {Object} countlyConfig countly config object + * @param {CountlyConfig} countlyConfig countly config object */ Countly.initWithConfig = async function (countlyConfig) { if (_state.isInitialized) { @@ -97,7 +97,7 @@ Countly.initWithConfig = async function (countlyConfig) { * * Checks if the sdk is initialized; * - * @return {bool} if true, countly sdk has been initialized + * @return {boolean} if true, countly sdk has been initialized */ Countly.isInitialized = async function () { _state.isInitialized = await CountlyReactNative.isInitialized(); @@ -111,7 +111,7 @@ Countly.isInitialized = async function () { * * @deprecated in 23.6.0. This will be removed. * - * @return {bool || String} bool or error message + * @return {boolean | string} boolean or error message */ Countly.hasBeenCalledOnStart = function () { if (!_state.isInitialized) { @@ -127,8 +127,8 @@ Countly.hasBeenCalledOnStart = function () { * * Used to send various types of event; * - * @param {Object} options event - * @return {String || void} error message or void + * @param {object} options event + * @return {string | void} error message or void */ Countly.sendEvent = function (options) { if (!_state.isInitialized) { @@ -195,9 +195,9 @@ Countly.sendEvent = function (options) { * Record custom view to Countly. * * @param {string} recordView - name of the view - * @param {Map} segments - allows to add optional segmentation, - * Supported data type for segments values are String, int, double and bool - * @return {String || void} error message or void + * @param {object} segments - allows to add optional segmentation, + * Supported data type for segments values are string, int, double and boolean + * @return {string | void} error message or void */ Countly.recordView = function (recordView, segments) { if (!_state.isInitialized) { @@ -228,7 +228,7 @@ Countly.recordView = function (recordView, segments) { * Currently implemented for iOS only * Should be called before Countly init * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.disablePushNotifications = function () { if (!/ios/.exec(Platform.OS)) { @@ -246,7 +246,7 @@ Countly.disablePushNotifications = function () { * Set messaging mode for push notifications * Should be called before Countly init * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.pushTokenType = function (tokenType, channelName, channelDescription) { const message = Validate.String(tokenType, 'tokenType', 'pushTokenType'); @@ -306,10 +306,10 @@ Countly.registerForNotification = function (theListener) { * Configure intent redirection checks for push notification * Should be called before Countly "askForNotificationPermission" * - * @param {array of allowed class names } allowedIntentClassNames set allowed intent class names - * @param {array of allowed package names } allowedIntentPackageNames set allowed intent package names - * @param {bool to check additional intent checks} useAdditionalIntentRedirectionChecks by default its true - * @return {String || void} error message or void + * @param {string[]} allowedIntentClassNames allowed intent class names + * @param {string[]} allowedIntentPackageNames allowed intent package names + * @param {boolean} useAdditionalIntentRedirectionChecks to check additional intent checks. The default value is "true" + * @return {string | void} error message or void */ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [], allowedIntentPackageNames = [], useAdditionalIntentRedirectionChecks = true) { if (/ios/.exec(Platform.OS)) { @@ -362,7 +362,7 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] * * Countly start for android * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.start = function () { L.w('start, Automatic sessions are handled by underlying SDK, this function will do nothing.'); @@ -373,7 +373,7 @@ Countly.start = function () { * * Countly stop for android * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.stop = function () { L.w('stop, Automatic sessions are handled by underlying SDK, this function will do nothing.'); @@ -409,7 +409,7 @@ Countly.disableLogging = function () { * Set to true if you want to enable countly internal debugging logs * Should be called before Countly init * - * @param {[bool = true]} enabled server url + * @param {[boolean = true]} enabled server url */ Countly.setLoggingEnabled = function (enabled = true) { // TODO: init check @@ -422,11 +422,11 @@ Countly.setLoggingEnabled = function (enabled = true) { * * Set user initial location * Should be called before init - * @param {ISO Country code for the user's country} countryCode - * @param {Name of the user's city} city - * @param {comma separate lat and lng values. For example, "56.42345,123.45325"} location - * @param {IP address of user's} ipAddress - * */ + * @param {string | null} countryCode ISO Country code for the user's country + * @param {string | null} city Name of the user's city + * @param {string | null} location comma separate lat and lng values. For example, "56.42345,123.45325" + * @param {string | null} ipAddress IP address of user's + */ Countly.setLocationInit = function (countryCode, city, location, ipAddress) { L.w('setLocationInit, setLocationInit is deprecated, use countlyConfig.setLocation instead'); const args = []; @@ -440,10 +440,10 @@ Countly.setLocationInit = function (countryCode, city, location, ipAddress) { /** * * Set user location - * @param {ISO Country code for the user's country} countryCode - * @param {Name of the user's city} city - * @param {comma separate lat and lng values. For example, "56.42345,123.45325"} location - * @param {IP address of user's} ipAddress + * @param {string | null} countryCode ISO Country code for the user's country + * @param {string | null} city Name of the user's city + * @param {string | null} location comma separate lat and lng values. For example, "56.42345,123.45325" + * @param {string | null} ipAddress IP address of user's * */ Countly.setLocation = function (countryCode, city, location, ipAddress) { if (!_state.isInitialized) { @@ -464,7 +464,7 @@ Countly.setLocation = function (countryCode, city, location, ipAddress) { * * Disable user location * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.disableLocation = function () { if (!_state.isInitialized) { @@ -481,7 +481,7 @@ Countly.disableLocation = function () { * Get currently used device Id. * Should be called after Countly init * - * @return {String} device id or error message + * @return {string} device id or error message */ Countly.getCurrentDeviceId = async function () { if (!_state.isInitialized) { @@ -498,7 +498,7 @@ Countly.getCurrentDeviceId = async function () { * Get currently used device Id type. * Should be called after Countly init * - * @return {DeviceIdType || null} deviceIdType or null + * @return {DeviceIdType | null} deviceIdType or null * */ Countly.getDeviceIDType = async function () { if (!_state.isInitialized) { @@ -517,9 +517,9 @@ Countly.getDeviceIDType = async function () { /** * Change the current device id * - * @param {String} newDeviceID id new device id - * @param {Boolean} onServer merge device id - * @return {String || void} error message or void + * @param {string} newDeviceID id new device id + * @param {boolean} onServer merge device id + * @return {string | void} error message or void * */ Countly.changeDeviceId = function (newDeviceID, onServer) { if (!_state.isInitialized) { @@ -546,7 +546,7 @@ Countly.changeDeviceId = function (newDeviceID, onServer) { * * Set to "true" if you want HTTP POST to be used for all requests * Should be called before Countly init - * @param {bool} forceHttp force http post for all requests. + * @param {boolean} forceHttp force http post for all requests. */ Countly.setHttpPostForced = function (boolean = true) { L.d(`setHttpPostForced, Setting http post forced to: [${boolean}]`); @@ -608,8 +608,8 @@ Countly.enableCrashReporting = async function () { * * Add crash log for Countly * - * @param {String} crashLog crash log - * @return {String || void} error message or void + * @param {string} crashLog crash log + * @return {string | void} error message or void */ Countly.addCrashLog = function (crashLog) { if (!_state.isInitialized) { @@ -625,10 +625,10 @@ Countly.addCrashLog = function (crashLog) { * * Log exception for Countly * - * @param {String} exception exception - * @param {bool} nonfatal nonfatal - * @param {Map} segments segments - * @return {String || void} error message or void + * @param {string} exception exception + * @param {boolean} nonfatal nonfatal + * @param {object} segments segments + * @return {string | void} error message or void */ Countly.logException = function (exception, nonfatal, segments) { if (!_state.isInitialized) { @@ -656,7 +656,7 @@ Countly.logException = function (exception, nonfatal, segments) { * * Set custom crash segment for Countly * - * @param {Map} segments segments + * @param {object} segments segments */ Countly.setCustomCrashSegments = function (segments) { L.d(`setCustomCrashSegments, Setting custom crash segments: [${JSON.stringify(segments)}]`); @@ -672,7 +672,7 @@ Countly.setCustomCrashSegments = function (segments) { * * Start session tracking * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.startSession = function () { if (!_state.isInitialized) { @@ -688,7 +688,7 @@ Countly.startSession = function () { * * End session tracking * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.endSession = function () { if (!_state.isInitialized) { @@ -706,8 +706,8 @@ Countly.endSession = function () { * Set the optional salt to be used for calculating the checksum of requested data which will be sent with each request, using the &checksum field * Should be called before Countly init * - * @param {String} salt salt - * @return {String || void} error message or void + * @param {string} salt salt + * @return {string | void} error message or void */ Countly.enableParameterTamperingProtection = function (salt) { const message = Validate.String(salt, 'salt', 'enableParameterTamperingProtection'); @@ -723,7 +723,7 @@ Countly.enableParameterTamperingProtection = function (salt) { * It will ensure that connection is made with one of the public keys specified * Should be called before Countly init * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.pinnedCertificates = function (certificateName) { const message = Validate.String(certificateName, 'certificateName', 'pinnedCertificates'); @@ -738,8 +738,8 @@ Countly.pinnedCertificates = function (certificateName) { * * Start Event * - * @param {String} eventName name of event - * @return {String || void} error message or void + * @param {string} eventName name of event + * @return {string | void} error message or void */ Countly.startEvent = function (eventName) { if (!_state.isInitialized) { @@ -759,8 +759,8 @@ Countly.startEvent = function (eventName) { * * Cancel Event * - * @param {String} eventName name of event - * @return {String || void} error message or void + * @param {string} eventName name of event + * @return {string | void} error message or void */ Countly.cancelEvent = function (eventName) { if (!_state.isInitialized) { @@ -780,8 +780,8 @@ Countly.cancelEvent = function (eventName) { * * End Event * - * @param {String || Object} options event options - * @return {String || void} error message or void + * @param {string | object} options event options + * @return {string | void} error message or void */ Countly.endEvent = function (options) { if (!_state.isInitialized) { @@ -845,8 +845,8 @@ Countly.endEvent = function (options) { * * Used to send user data * - * @param {Object} userData user data - * @return {String || void} error message or void + * @param {object} userData user data + * @return {string | void} error message or void */ Countly.setUserData = async function (userData) { if (!_state.isInitialized) { @@ -916,7 +916,7 @@ Countly.userData.increment = async function (keyName) { return msg; } L.d(`increment, Incrementing user property: [${keyName}]`); - const message = Validate.String(keyName, 'key', 'setProperty'); + const message = Validate.String(keyName, 'key', 'increment'); if (message) { return message; } @@ -1324,7 +1324,7 @@ Countly.userDataBulk.pullValue = async function (keyName, keyValue) { * Set that consent should be required for features to work. * Should be called before Countly init * - * @param {bool} flag if true, consent is required for features to work. + * @param {boolean} flag if true, consent is required for features to work. */ Countly.setRequiresConsent = function (flag) { L.w(`setRequiresConsent, setRequiresConsent is deprecated, use countlyConfig.setRequiresConsent instead. Flag : [${flag}]`); @@ -1336,8 +1336,8 @@ Countly.setRequiresConsent = function (flag) { * Give consent for some features * Should be called after Countly init * - * @param {String[]} args list of consents - * @return {String || void} error message or void + * @param {string[] | string} args list of consents + * @return {string | void} error message or void */ Countly.giveConsent = function (args) { if (!_state.isInitialized) { @@ -1361,7 +1361,7 @@ Countly.giveConsent = function (args) { * Give consent for specific features before init. * Should be called after Countly init * - * @param {String[]} args list of consents + * @param {string[] | string} args list of consents */ Countly.giveConsentInit = async function (args) { L.w('giveConsentInit, giveConsentInit is deprecated, use countlyConfig.giveConsent instead.'); @@ -1381,8 +1381,8 @@ Countly.giveConsentInit = async function (args) { * Remove consent for some features * Should be called after Countly init * - * @param {String[]} args list of consents - * @return {String || void} error message or void + * @param {string[] | string} args list of consents + * @return {string | void} error message or void */ Countly.removeConsent = function (args) { if (!_state.isInitialized) { @@ -1405,7 +1405,7 @@ Countly.removeConsent = function (args) { * Give consent for all features * Should be called after Countly init * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.giveAllConsent = function () { if (!_state.isInitialized) { @@ -1422,7 +1422,7 @@ Countly.giveAllConsent = function () { * Remove consent for all features * Should be called after Countly init * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.removeAllConsent = function () { if (!_state.isInitialized) { @@ -1550,10 +1550,10 @@ Countly.remoteConfigClearValues = async function () { * * Set's the text's for the different fields in the star rating dialog. Set value null if for some field you want to keep the old value * - * @param {String} starRatingTextTitle - dialog's title text (Only for Android) - * @param {String} starRatingTextMessage - dialog's message text - * @param {String} starRatingTextDismiss - dialog's dismiss buttons text (Only for Android) - * @return {String || void} error message or void + * @param {string} starRatingTextTitle - dialog's title text (Only for Android) + * @param {string} starRatingTextMessage - dialog's message text + * @param {string} starRatingTextDismiss - dialog's dismiss buttons text (Only for Android) + * @return {string | void} error message or void */ Countly.setStarRatingDialogTexts = function (starRatingTextTitle, starRatingTextMessage, starRatingTextDismiss) { L.w(`setStarRatingDialogTexts, setStarRatingDialogTexts is deprecated, use countlyConfig.setStarRatingDialogTexts instead. starRatingTextTitle : [${starRatingTextTitle}], starRatingTextMessage : [${starRatingTextMessage}], starRatingTextDismiss : [${starRatingTextDismiss}]`); @@ -1580,8 +1580,8 @@ Countly.showStarRating = function (callback) { /** * Present a Rating Popup using rating widget Id * - * @param {String} widgetId - id of rating widget to present - * @param {String} closeButtonText - text for cancel/close button + * @param {string} widgetId - id of rating widget to present + * @param {string} closeButtonText - text for cancel/close button * @param {callback listener} [ratingWidgetCallback] This parameter is optional. */ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingWidgetCallback) { @@ -1613,7 +1613,7 @@ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingW * Get a list of available feedback widgets as array of object to handle multiple widgets of same type. * @deprecated in 23.8.0 : use 'Countly.feedback.getAvailableFeedbackWidgets' instead of 'getFeedbackWidgets'. * @param {callback listener} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. - * @return {String || []} error message or [] + * @return {string | []} error message or [] */ Countly.getFeedbackWidgets = async function (onFinished) { if (!_state.isInitialized) { @@ -1638,12 +1638,12 @@ Countly.getFeedbackWidgets = async function (onFinished) { * Present a chosen feedback widget * * @deprecated in 23.8.0 : use 'Countly.feedback.presentFeedbackWidget' instead of 'presentFeedbackWidgetObject'. - * @param {Object} feedbackWidget - feeback Widget with id, type and name - * @param {String} closeButtonText - text for cancel/close button + * @param {object} feedbackWidget - feeback Widget with id, type and name + * @param {string} closeButtonText - text for cancel/close button * @param {callback listener} [widgetShownCallback] - Callback to be executed when feedback widget is displayed. This parameter is optional. * @param {callback listener} [widgetClosedCallback] - Callback to be executed when feedback widget is closed. This parameter is optional. * - * @return {String || void} error message or void + * @return {string | void} error message or void */ Countly.presentFeedbackWidgetObject = async function (feedbackWidget, closeButtonText, widgetShownCallback, widgetClosedCallback) { if (!_state.isInitialized) { @@ -1895,7 +1895,7 @@ Countly.appLoadingFinished = async function () { /** * Set the metrics you want to override * Should be called before Countly init - * @param {Object} customMetric - metric with key/value pair + * @param {object} customMetric - metric with key/value pair * Supported data type for customMetric values is String */ Countly.setCustomMetrics = async function (customMetric) { diff --git a/Feedback.js b/Feedback.js index 59f449fd..7653d6ea 100644 --- a/Feedback.js +++ b/Feedback.js @@ -9,7 +9,7 @@ class Feedback { /** * Get a list of available feedback widgets as an array of objects. * @param {callback} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. - * @return {Object} Object {error: String or Null, data: Array or null } + * @return {object} object {error: String or null, data: Array or null } */ async getAvailableFeedbackWidgets(onFinished) { if (!this.#state.isInitialized) { @@ -35,12 +35,12 @@ class Feedback { /** * Present a chosen feedback widget * - * @param {Object} feedbackWidget - feedback Widget with id, type and name - * @param {String} closeButtonText - text for cancel/close button + * @param {object} feedbackWidget - feedback Widget with id, type and name + * @param {string} closeButtonText - text for cancel/close button * @param {callback} [widgetShownCallback] - Callback to be executed when feedback widget is displayed. This parameter is optional. * @param {callback} [widgetClosedCallback] - Callback to be executed when feedback widget is closed. This parameter is optional. * - * @return {Object} Object {error: String or null} + * @return {object} object {error: string or null} */ presentFeedbackWidget(feedbackWidget, closeButtonText, widgetShownCallback, widgetClosedCallback) { if (!this.#state.isInitialized) { @@ -90,10 +90,10 @@ class Feedback { } /** - * Get a feedback widget's data as an Object. - * @param {Object} widgetInfo - widget to get data for. You should get this from 'getAvailableFeedbackWidgets' method. - * @param {callback} [onFinished] - returns (Object retrievedWidgetData, error). This parameter is optional. - * @return {Object} Object {error: String, data: Object or null} + * Get a feedback widget's data as an object. + * @param {object} widgetInfo - widget to get data for. You should get this from 'getAvailableFeedbackWidgets' method. + * @param {callback} [onFinished] - returns (object retrievedWidgetData, error). This parameter is optional. + * @return {object} object {error: string, data: object or null} */ async getFeedbackWidgetData(widgetInfo, onFinished) { if (!this.#state.isInitialized) { @@ -123,10 +123,10 @@ class Feedback { /** * Report manually for a feedback widget. - * @param {Object} widgetInfo - the widget you are targeting. You should get this from 'getAvailableFeedbackWidgets' method. - * @param {Object} widgetData - data of that widget. You should get this from 'getFeedbackWidgetData' method. - * @param {Object} widgetResult - Information you want to report. - * @return {Object} Object {error: String} + * @param {object} widgetInfo - the widget you are targeting. You should get this from 'getAvailableFeedbackWidgets' method. + * @param {object} widgetData - data of that widget. You should get this from 'getFeedbackWidgetData' method. + * @param {object} widgetResult - Information you want to report. + * @return {object} object {error: string} */ async reportFeedbackWidgetManually(widgetInfo, widgetData, widgetResult) { if (!this.#state.isInitialized) { From 12f9a60526c94f849a7111e11ca45bc04ce06c22 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:03:58 +0100 Subject: [PATCH 06/48] Add the type information and comments to functions (#274) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add the type information and comments to functions * linter * adding types to package.json * updated countly.d.ts file * removed interfaces and types for easy access * endEvent updated * default value --------- Co-authored-by: Artūrs Kadiķis --- Countly.d.ts | 877 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 878 insertions(+) create mode 100644 Countly.d.ts diff --git a/Countly.d.ts b/Countly.d.ts new file mode 100644 index 00000000..01cc0f0e --- /dev/null +++ b/Countly.d.ts @@ -0,0 +1,877 @@ +interface Segmentation { + [key: string]: string; +} + +interface CountlyEventOptions { + eventName: string; + eventCount?: number; + eventSum?: number | string; + segments?: Segmentation; +} + +interface FeedbackWidget { + id: string; + type: string; + name?: string; +} + +interface FeedbackWidgetResultObject { + error: string, + data: FeedbackWidget[], +} + +interface CountlyUserData { + name?: string; + username?: string; + email?: string; + organization?: string; + phone?: string; + picture?: string; + gender?: string; + byear?: number | string; + custom?: Record; +} +type CountlyCallback = (message: string) => void; +type CountlyErrorCallback = (error: string | null) => void; + +type WidgetCallback = () => void; +type FeedbackWidgetCallback = (retrievedWidgets: FeedbackWidget[], error: string | null) => void; +type WidgetInfoCallback = (widgetInfo: FeedbackWidget[], error: string | null) => void; + +interface RatingWidgetResult { + rating: number, + comment: string, +} + +interface CustomMetric { + [key: string]: string; +} + +interface TraceCustomMetric { + [key: string]: number | string; +} + +type ValidationFunction = ( + stringValue: string, + stringName: string, + functionName: string +) => Promise; + +interface ResultObject { + error: string, + data: object, +} +interface ErrorObject { error: string | null } + +declare module 'countly-sdk-react-native-bridge' { + import type CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig' + + namespace Countly { + serverUrl: string; + appKey: string; + eventEmitter: any; + CountlyReactNative: any; + _isCrashReportingEnabled: boolean; + _isInitialized: boolean; + _isPushInitialized: boolean; + widgetShownCallbackName: string; + widgetClosedCallbackName: string; + ratingWidgetCallbackName: string; + pushNotificationCallbackName: string; + export const TemporaryDeviceIDString: string; + export interface messagingMode { + DEVELOPMENT: string; + PRODUCTION: string; + ADHOC: string; + } + + /** + * Countly Feedback Module + */ + namespace feedback { + /** + * Get a list of available feedback widgets as an array of objects. + * @param {FeedbackWidgetCallback} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. + * @return {FeedbackWidgetResultObject} object {error: string or null, data: FeedbackWidget[] or null } + */ + export function getAvailableFeedbackWidgets(onFinished?: FeedbackWidgetCallback): Promise; + + /** + * Present a chosen feedback widget + * + * @param {object} feedbackWidget - feedback Widget with id, type and name + * @param {string} closeButtonText - text for cancel/close button + * @param {callback} [widgetShownCallback] - Callback to be executed when feedback widget is displayed. This parameter is optional. + * @param {callback} [widgetClosedCallback] - Callback to be executed when feedback widget is closed. This parameter is optional. + * + * @return {ErrorObject} object {error: string or null} + */ + export function presentFeedbackWidget(feedbackWidget: FeedbackWidget, closeButtonText: string, widgetShownCallback: callback, widgetClosedCallback: callback): ErrorObject; + + /** + * Get a feedback widget's data as an object. + * @param {FeedbackWidget} widgetInfo - widget to get data for. You should get this from 'getAvailableFeedbackWidgets' method. + * @param {WidgetInfoCallback} [onFinished] - returns (object retrievedWidgetData, error). This parameter is optional. + * @return {ResultObject} object {error: string, data: object or null} + */ + export function getFeedbackWidgetData(widgetInfo: FeedbackWidget, onFinished?: WidgetInfoCallback): Promise; + + /** + * Report manually for a feedback widget. + * @param {FeedbackWidget} widgetInfo - the widget you are targeting. You should get this from 'getAvailableFeedbackWidgets' method. + * @param {object} widgetData - data of that widget. You should get this from 'getFeedbackWidgetData' method. + * @param {RatingWidgetResult | object} widgetResult - Information you want to report. + * @return {ErrorObject} object {error: string} + */ + export function reportFeedbackWidgetManually(widgetInfo: FeedbackWidget, widgetData: object, widgetResult: RatingWidgetResult | object): Promise; + } + + /** + * Initialize Countly + * + * @deprecated in 23.02.0 : use 'initWithConfig' instead of 'init'. + * + * @function Countly.init should be used to initialize countly + * @param {string} serverURL server url + * @param {string} appKey application key + * @param {string | null} deviceId device ID + */ + export function init(serverUrl: string, appKey: string, deviceId: string | null): Promise; + + /** + * Initialize Countly + * + * @function Countly.initWithConfig should be used to initialize countly with config + * @param {CountlyConfig} countlyConfig countly config object + */ + export function initWithConfig(countlyConfig: CountlyConfig): Promise; + + /** + * + * Checks if the sdk is initialized; + * + * @return {Promise} if true, countly sdk has been initialized + */ + export function isInitialized(): Promise; + + /** + * + * Checks if the Countly SDK onStart function has been called + * + * @deprecated in 23.6.0. This will be removed. + * + * @return {Promise | string} boolean or error message + */ + export function hasBeenCalledOnStart(): Promise | string; + + /** + * + * Used to send various types of event; + * + * @param {CountlyEventOptions} options event + * @return {string | void} error message or void + */ + export function sendEvent(options: CountlyEventOptions): string | void; + + /** + * Record custom view to Countly. + * + * @param {string} recordView - name of the view + * @param {Segmentation} segments - allows to add optional segmentation, + * Supported data type for segments values are string, int, double and boolean + * @return {string | null} error message or void + */ + export function recordView(recordView: string, segments?: Segmentation): string | null; + + /** + * Disable push notifications feature, by default it is enabled. + * Currently implemented for iOS only + * Should be called before Countly init + * + * @return {string | void} error message or void + */ + export function disablePushNotifications(): string | void; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.pushTokenType' instead of 'pushTokenType'. + * + * @param {string} tokenType - Token type + * @param {string} channelName - Channel name + * @param {string} channelDescription - Description for the channel + * Set messaging mode for push notifications + * Should be called before Countly init + * + * @return {string | void} error message or void + */ + export function pushTokenType(tokenType: string, channelName: string, channelDescription: string): Promise | string; + export function sendPushToken(options: { readonly token?: string }): void; + + /** + * This method will ask for permission, enables push notification and send push token to countly server. + * + * @param {string} customSoundPath - name of custom sound for push notifications (Only for Android) + * Custom sound should be place at 'your_project_root/android/app/src/main/res/raw' + * Should be called after Countly init + * + */ + export function askForNotificationPermission(customSoundPath?: string): string | void; + + /** + * + * Set callback to receive push notifications + * @param {callback listener } theListener + * @return {NativeEventEmitter} event + */ + export function registerForNotification(theListener: (theNotification: string) => void): any; // The return type should be adjusted to the actual event subscription type + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.configureIntentRedirectionCheck' instead of 'configureIntentRedirectionCheck'. + * + * Configure intent redirection checks for push notification + * Should be called before Countly "askForNotificationPermission" + * + * @param {string[]} allowedIntentClassNames allowed intent class names + * @param {string[]} allowedIntentPackageNames allowed intent package names + * @param {boolean} useAdditionalIntentRedirectionChecks to check additional intent checks. It is by default its true + * @return {string | void} error message or void + */ + export function configureIntentRedirectionCheck( + allowedIntentClassNames?: string[], + allowedIntentPackageNames?: string[], + useAdditionalIntentRedirectionChecks?: boolean + ): string | void; + + /** + * @deprecated at 23.6.0 - Automatic sessions are handled by underlying SDK, this function will do nothing. + * + * Countly start for android + * + * @return {string | void} error message or void + */ + export function start(): void; + + /** + * @deprecated at 23.6.0 - Automatic sessions are handled by underlying SDK, this function will do nothing. + * + * Countly stop for android + * + * @return {string | void} error message or void + */ + export function stop(): void; + + /** + * Enable countly internal debugging logs + * Should be called before Countly init + * + * @deprecated in 20.04.6 + * + * @function Countly.setLoggingEnabled should be used to enable/disable countly internal debugging logs + */ + export function enableLogging(): void; + + /** + * Disable countly internal debugging logs + * + * @deprecated in 20.04.6 + * + * @function Countly.setLoggingEnabled should be used to enable/disable countly internal debugging logs + */ + export function disableLogging(): void; + + /** + * Set to true if you want to enable countly internal debugging logs + * Should be called before Countly init + * + * @param {[boolean = true]} enabled server url + */ + export function setLoggingEnabled(enabled?: boolean): void; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.setLocation' instead of 'setLocationInit'. + * + * Set user initial location + * Should be called before init + * @param {string | null} countryCode ISO Country code for the user's country + * @param {string | null} city Name of the user's city + * @param {string | null} location comma separate lat and lng values. For example, "56.42345,123.45325" + * @param {string | null} ipAddress IP address of user's + */ + export function setLocationInit( + countryCode: string | null, + city: string | null, + location: string | null, + ipAddress: string | null, + ): void; + + /** + * + * Set user location + * @param {string | null} countryCode ISO Country code for the user's country + * @param {string | null} city Name of the user's city + * @param {string | null} location comma separate lat and lng values. For example, "56.42345,123.45325" + * @param {string | null} ipAddress IP address of user's + * */ + export function setLocation( + countryCode: string | null, + city: string | null, + location: string | null, + ipAddress: string | null + ): string | void; + + /** + * + * Disable user location + * + * @return {string | void} error message or void + */ + export function disableLocation(): string | void; + + /** + * + * Get currently used device Id. + * Should be called after Countly init + * + * @return {string} device id or error message + */ + export function getCurrentDeviceId(): Promise | string; + + /** + * Get currently used device Id type. + * Should be called after Countly init + * + * @return {DeviceIdType | null} deviceIdType or null + * */ + export function getDeviceIDType(): Promise | null; + + + /** + * Change the current device id + * + * @param {string} newDeviceID id new device id + * @param {boolean} onServer merge device id + * @return {string | void} error message or void + * */ + export function changeDeviceId(newDeviceID: string, onServer: boolean): string | void; + + /** + * + * Set to "true" if you want HTTP POST to be used for all requests + * Should be called before Countly init + * @param {boolean} forceHttp force http post for all requests. Default value is true + */ + export function setHttpPostForced(boolean?: boolean): void; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.enableCrashReporting' instead of 'enableCrashReporting'. + * + * Enable crash reporting to report unhandled crashes to Countly + * Should be called before Countly init + */ + export function enableCrashReporting(): void; + + /** + * + * Add crash log for Countly + * + * @param {string} crashLog crash log + * @return {string | void} error message or void + */ + export function addCrashLog(crashLog: string): string | void; + + /** + * + * Log exception for Countly + * + * @param {string} exception exception + * @param {boolean} nonfatal nonfatal + * @param {object} segments segments + * @return {string | void} error message or void + */ + export function logException(exception: string, nonfatal: boolean, segments: Record): string | void; + + /** + * + * Set custom crash segment for Countly + * + * @param {Map} segments segments + */ + export function setCustomCrashSegments(segments: Record): void; + + /** + * + * Start session tracking + * + * @return {string | void} error message or void + */ + export function startSession(): string | void; + + /** + * + * End session tracking + * + * @return {string | void} error message or void + */ + export function endSession(): string | void; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.enableParameterTamperingProtection' instead of 'enableParameterTamperingProtection'. + * + * Set the optional salt to be used for calculating the checksum of requested data which will be sent with each request, using the &checksum field + * Should be called before Countly init + * + * @param {string} salt salt + * @return {string | void} error message or void + */ + export function enableParameterTamperingProtection(salt: string): string | void; + + /** + * + * It will ensure that connection is made with one of the public keys specified + * Should be called before Countly init + * + * @return {string | void} error message or void + */ + export function pinnedCertificates(certificateName: string): string | void; + + /** + * + * Start Event + * + * @param {string} eventName name of event + * @return {string | void} error message or void + */ + export function startEvent(eventName: string): string | void; + + /** + * + * Cancel Event + * + * @param {string} eventName name of event + * @return {string | void} error message or void + */ + export function cancelEvent(eventName: string): string | void; + + /** + * + * End Event + * + * @param {string | object} options event options + * @return {string | void} error message or void + */ + export function endEvent(options: string | CountlyEventOptions): string | void; + + /** + * + * Used to send user data + * + * @param {object} userData user data + * @return {string | void} error message or void + */ + export function setUserData(userData: CountlyUserData): string | Promise; + + namespace userData { + export function setProperty(keyName: string, keyValue: any): Promise | string; + export function increment(keyName: string): Promise | string; + export function incrementBy(keyName: string, keyValue: any): Promise | string; + export function multiply(keyName: string, keyValue: any): Promise | string; + export function saveMax(keyName: string, keyValue: any): Promise | string; + export function saveMin(keyName: string, keyValue: any): Promise | string; + export function setOnce(keyName: string, keyValue: any): Promise | string; + export function pushUniqueValue(keyName: string, keyValue: any): Promise | string; + export function pushValue(keyName: string, keyValue: any): Promise | string; + export function pullValue(keyName: string, keyValue: any): Promise | string; + } + + namespace userDataBulk { + export function setUserProperties(properties: object): Promise | string; + export function save(): Promise; + export function setProperty(keyName: string, keyValue: any): Promise | string; + export function increment(keyName: string): Promise | string; + export function incrementBy(keyName: string, keyValue: any): Promise | string; + export function multiply(keyName: string, keyValue: any): Promise | string; + export function saveMax(keyName: string, keyValue: any): Promise | string; + export function saveMin(keyName: string, keyValue: any): Promise | string; + export function setOnce(keyName: string, keyValue: any): Promise | string; + export function pushUniqueValue(keyName: string, keyValue: any): Promise | string; + export function pushValue(keyName: string, keyValue: any): Promise | string; + export function pullValue(keyName: string, keyValue: any): Promise | string; + } + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.setRequiresConsent' instead of 'setRequiresConsent'. + * + * Set that consent should be required for features to work. + * Should be called before Countly init + * + * @param {boolean} flag if true, consent is required for features to work. + */ + export function setRequiresConsent(flag: boolean): void; + + /** + * + * Give consent for some features + * Should be called after Countly init + * + * @param {string[] | string} args list of consents + * @return {string | void} error message or void + */ + export function giveConsent(args: string[] | string): string | void; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.giveConsent' instead of 'giveConsentInit'. + * + * Give consent for specific features before init. + * Should be called after Countly init + * + * @param {string[] | string} args list of consents + */ + export function giveConsentInit(args: string[] | string): Promise; + + /** + * + * Remove consent for some features + * Should be called after Countly init + * + * @param {string[] | string} args list of consents + * @return {string | void} error message or void + */ + export function removeConsent(args: string[] | string): string | void; + + /** + * + * Give consent for all features + * Should be called after Countly init + * + * @return {string | void} error message or void + */ + export function giveAllConsent(): string | void; + + /** + * + * Remove consent for all features + * Should be called after Countly init + * + * @return {string | void} error message or void + */ + export function removeAllConsent(): string | void; + export function remoteConfigUpdate(callback: CountlyCallback): string | void; + export function updateRemoteConfigForKeysOnly(keyNames: readonly string[], callback: CountlyCallback): string | void; + export function updateRemoteConfigExceptKeys(keyNames: readonly string[], callback: CountlyCallback): string | void; + export function getRemoteConfigValueForKey(keyName: string, callback: (value: any) => void): string | void; + export function getRemoteConfigValueForKeyP(keyName: string): string | Promise; + export function remoteConfigClearValues(): string | Promise; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.setStarRatingDialogTexts' instead of 'setStarRatingDialogTexts'. + * + * Set's the text's for the different fields in the star rating dialog. Set value null if for some field you want to keep the old value + * + * @param {string} starRatingTextTitle - dialog's title text (Only for Android) + * @param {string} starRatingTextMessage - dialog's message text + * @param {string} starRatingTextDismiss - dialog's dismiss buttons text (Only for Android) + * @return {string | void} error message or void + */ + export function setStarRatingDialogTexts( + starRatingTextTitle: string, + starRatingTextMessage: string, + starRatingTextDismiss: string, + ): void; + export function showStarRating(callback?: CountlyCallback): string | void; + + /** + * Present a Rating Popup using rating widget Id + * + * @param {string} widgetId - id of rating widget to present + * @param {string} closeButtonText - text for cancel/close button + * @param {callback listener} [ratingWidgetCallback] This parameter is optional. + */ + export function presentRatingWidgetWithID(widgetId: string, closeButtonText: string, ratingWidgetCallback?: CountlyErrorCallback): string | void; + + /** + * Get a list of available feedback widgets as array of object to handle multiple widgets of same type. + * @deprecated in 23.8.0 : use 'Countly.feedback.getAvailableFeedbackWidgets' instead of 'getFeedbackWidgets'. + * @param {callback listener} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. + * @return {string | []} error message or [] + */ + export function getFeedbackWidgets(onFinished?: FeedbackWidgetCallback): Promise | string; + + /** + * Present a chosen feedback widget + * + * @deprecated in 23.8.0 : use 'Countly.feedback.presentFeedbackWidget' instead of 'presentFeedbackWidgetObject'. + * @param {FeedbackWidget} feedbackWidget - feeback Widget with id, type and name + * @param {string} closeButtonText - text for cancel/close button + * @param {callback listener} [widgetShownCallback] - Callback to be executed when feedback widget is displayed. This parameter is optional. + * @param {callback listener} [widgetClosedCallback] - Callback to be executed when feedback widget is closed. This parameter is optional. + * + * @return {string | void} error message or void + */ + export function presentFeedbackWidgetObject( + feedbackWidget: FeedbackWidget, + closeButtonText: string, + widgetShownCallback: WidgetCallback, + widgetClosedCallback: WidgetCallback + ): string | void; + + /** + * + * Events get grouped together and are sent either every minute or after the unsent event count reaches a threshold. By default it is 10 + * Should be called before Countly init + * + * @param {number} size - event count + * + */ + export function setEventSendThreshold(size: number): void; + + export function startTrace(traceKey: string): string | void; + export function cancelTrace(traceKey: string): string | void; + export function clearAllTraces(): string | void; + export function endTrace(traceKey: string, customMetric?: TraceCustomMetric): string | void; + export function recordNetworkTrace( + networkTraceKey: string, + responseCode: number, + requestPayloadSize: number, + responsePayloadSize: number, + startTime: number, + endTime: number, + ): string | void; + + /** + * @deprecated in 23.02.0 : use 'countlyConfig.enableApm' instead of 'enableApm'. + * + * Enable APM features, which includes the recording of app start time. + * Should be called before Countly init + */ + export function enableApm(): void; + + /** + * @deprecated in 23.02.0 : use 'Countly.recordIndirectAttribution' instead of 'Countly'. + * + * Enable campaign attribution reporting to Countly. + * For iOS use "recordAttributionID" instead of "enableAttribution" + * Should be called before Countly init + */ + export function enableAttribution(attributionID?: string): string; + + /** + * + * @deprecated in 23.02.0 : use 'Countly.recordIndirectAttribution' instead of 'recordAttributionID'. + * + * set attribution Id for campaign attribution reporting. + * Currently implemented for iOS only + */ + export function recordAttributionID(attributionID: string): string | void; + + /** + * Replaces all requests with a different app key with the current app key. + * In request queue, if there are any request whose app key is different + * than the current app key, + * these requests' app key will be replaced with the current app key. + */ + export function replaceAllAppKeysInQueueWithCurrentAppKey(): string | void; + + /** + * set direct attribution Id for campaign attribution reporting. + */ + export function recordDirectAttribution(campaignType, campaignData): void; + + /** + * set indirect attribution Id for campaign attribution reporting. + */ + export function recordIndirectAttribution(attributionValues): void; + + /** + * Removes all requests with a different app key in request queue. + * In request queue, if there are any request whose app key is different than the current app key, + * these requests will be removed from request queue. + */ + export function removeDifferentAppKeysFromQueue(): string | void; + + /** + * Call this function when app is loaded, so that the app launch duration can be recorded. + * Should be called after init. + */ + export function appLoadingFinished(): string | void; + + /** + * Set the metrics you want to override + * Should be called before Countly init + * @param {object} customMetric - metric with key/value pair + * Supported data type for customMetric values is string + */ + export function setCustomMetrics(customMetric: CustomMetric): string | void; + validateUserDataValue: ValidationFunction; + validateUserDataType: ValidationFunction; + validateValidUserData: ValidationFunction; + validateParseInt: ValidationFunction; + logWarning: (functionName: string, warning: string) => Promise; + } + + export default Countly; +} + +declare module 'countly-sdk-react-native-bridge/CountlyConfig' { + /** + * + * Config object for Countly Init + * Should be called before Countly "askForNotificationPermission" + * + */ + declare class CountlyConfig { + /** + * @param {string} serverURL server url + * @param {string} appKey application key + */ + constructor(serverURL: string, appKey: string); + + /** + * Method to set the server url + * + * @param {string} serverURL server url + */ + setServerURL(serverURL: string): CountlyConfig; + + /** + * Method to set the app key + * + * @param {string} appKey application key + */ + setAppKey(appKey: string): CountlyConfig; + + /** + * Method to set the device id + * + * @param {string} deviceID device id + */ + setDeviceID(deviceID: string): CountlyConfig; + + /** + * Method to enable countly internal debugging logs + * + * @param {boolean} loggingEnabled enable + * if true, countly sdk would log to console. + */ + setLoggingEnabled(loggingEnabled: boolean): CountlyConfig; + + /** + * Method to enable crash reporting to report unhandled crashes to Countly + */ + enableCrashReporting(): CountlyConfig; + + /** + * Method to set if the consent feature is enabled. + * + * If set to true, no feature will work without consent being given. + * + * @param {boolean} shouldRequireConsent required. True: It is enabled. False: + * It is disabled. + */ + setRequiresConsent(shouldRequireConsent: boolean): CountlyConfig; + + /** + * Method to give consent for specific features before init + * + * @param {string[]} consents consents e.g ['location', 'sessions', + * 'attribution', 'push', 'events', 'views', 'crashes', 'users', 'push', + * 'star-rating', 'apm', 'feedback', 'remote-config'] + */ + giveConsent(consents: readonly string[]): CountlyConfig; + + /** + * Method to set the user initial location + * + * @param {string} locationCountryCode country code e.g 'TR' + * @param {string} locationCity city e.g 'Istanbul' + * @param {string} locationGpsCoordinates gps coordinates e.g '41.0082,28.9784' + * @param {string} locationIpAddress ip address e.g '10.2.33.12' + */ + setLocation(locationCountryCode: string, locationCity: string, locationGpsCoordinates: string, locationIpAddress: string): CountlyConfig; + + /** + * Method to enable tamper protection. This sets the optional salt to be + * used for calculating the checksum of requested data which will be sent + * with each request + * + * @param {string} tamperingProtectionSalt salt + */ + enableParameterTamperingProtection(tamperingProtectionSalt: string): CountlyConfig; + + /** + * Method to enable application performance monitoring which includes the recording of app start time. + */ + enableApm(): CountlyConfig; + + /** + * Method to set the push token type + * @deprecated + * Use setPushTokenType() instead to set pushToken + * Use setPushNotificationChannelInformation() instead to set channel information + * + * @param {TokenType} tokenType token type + * @param {string} channelName channel name + * @param {string} channelDescription channel description + */ + pushTokenType(tokenType: TokenType, channelName: string, channelDescription: string): CountlyConfig; + + /** + * Method to set the push token type + * NB: ONLY FOR iOS + * + * @param {Countly.messagingMode} tokenType token type + * Possible values include 'DEVELOPMENT', 'PRODUCTION', 'ADHOC'. + */ + setPushTokenType(tokenType: messagingMode): CountlyConfig; + + /** + * Method to set the push channel name and description + * NB: ONLY FOR ANDROID + * + * @param {string} name channel name + * @param {string} description channel description + */ + setPushNotificationChannelInformation(name: string, description: string): CountlyConfig; + + /** + * Method to set the push notification accent color + * NB: ONLY FOR ANDROID + * + * @param {string} accentColor notification accent color + * example '#000000' + */ + setPushNotificationAccentColor(accentColor: string): CountlyConfig; + + /** + * Method to configure intent redirection check + * + * @param {string[]} allowedIntentClassNames allowed intent class names + * @param {string[]} allowedIntentPackageNames allowed intent package name + */ + configureIntentRedirectionCheck(allowedIntentClassNames: readonly string[], allowedIntentPackageNames: readonly string[]): CountlyConfig; + + /** + * Method to set star rating dialog text + * + * @param {string} starRatingTextTitle title + * @param {string} starRatingTextMessage message + * @param {string} starRatingTextDismiss dismiss + */ + setStarRatingDialogTexts(starRatingTextTitle: string, starRatingTextMessage: string, starRatingTextDismiss: string): CountlyConfig; + + /** + * Report direct user attribution + * + * @param {string} campaignType campaign type + * @param {object} campaignData campaign data + */ + recordDirectAttribution(campaignType: string, campaignData: object): CountlyConfig; + + /** + * Report indirect user attribution + * + * @param {object} attributionValues attribution values + */ + recordIndirectAttribution(attributionValues: object): CountlyConfig; + } + + export default CountlyConfig; +} diff --git a/package.json b/package.json index 7b241f38..8ceb7237 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ ], "license": "MIT", "main": "Countly.js", + "types": "Countly.d.ts", "repository": { "type": "git", "url": "git+https://github.com/Countly/countly-sdk-react-native-bridge.git" From 845c9afa633186a50bba453a08c7a23d6fa48b65 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Thu, 14 Dec 2023 21:44:09 +0900 Subject: [PATCH 07/48] minor fixes (#276) --- example/CountlyRNExample/App.tsx | 1 + example/CountlyRNExample/Configuration.tsx | 4 ++-- example/CountlyRNExample/DeviceID.tsx | 4 ++-- example/CountlyRNExample/Feedback.tsx | 13 ------------- example/CountlyRNExample/Home.tsx | 2 +- 5 files changed, 6 insertions(+), 18 deletions(-) diff --git a/example/CountlyRNExample/App.tsx b/example/CountlyRNExample/App.tsx index 3c13e2e5..7a206aec 100644 --- a/example/CountlyRNExample/App.tsx +++ b/example/CountlyRNExample/App.tsx @@ -14,6 +14,7 @@ import ConsentScreen from './Consent'; import RemoteConfigScreen from './RemoteConfig'; import OthersScreen from './Others'; import CrashesScreen from './Crashes'; +import { Image } from 'react-native'; const Stack = createNativeStackNavigator(); class Example extends React.Component { diff --git a/example/CountlyRNExample/Configuration.tsx b/example/CountlyRNExample/Configuration.tsx index 9cffc956..cd4b90bc 100644 --- a/example/CountlyRNExample/Configuration.tsx +++ b/example/CountlyRNExample/Configuration.tsx @@ -1,7 +1,7 @@ import CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig'; -const COUNTLY_SERVER_KEY = 'https://master.count.ly'; -const COUNTLY_APP_KEY = 'support'; +const COUNTLY_SERVER_KEY = 'https://yourdomain.countly'; +const COUNTLY_APP_KEY = 'COUNTLY_APP_KEY'; const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY).setLoggingEnabled(true); // Enable countly internal debugging logs // .setDeviceID(Countly.TemporaryDeviceIDString) // Enable temporary id mode diff --git a/example/CountlyRNExample/DeviceID.tsx b/example/CountlyRNExample/DeviceID.tsx index a4378266..3002884e 100644 --- a/example/CountlyRNExample/DeviceID.tsx +++ b/example/CountlyRNExample/DeviceID.tsx @@ -6,11 +6,11 @@ import CountlyButton from './CountlyButton'; import { lightOrange } from './Constants'; const temporaryDeviceIdMode = () => { - Countly.changeDeviceId(Countly.TemporaryDeviceIDString); + Countly.changeDeviceId(Countly.TemporaryDeviceIDString, true); }; const changeDeviceId = () => { - Countly.changeDeviceId('02d56d66-6a39-482d-aff0-d14e4d5e5fda'); + Countly.changeDeviceId('02d56d66-6a39-482d-aff0-d14e4d5e5fda', true); }; function DeviceIDScreen({ navigation }) { diff --git a/example/CountlyRNExample/Feedback.tsx b/example/CountlyRNExample/Feedback.tsx index 386fcb6f..24794ab9 100644 --- a/example/CountlyRNExample/Feedback.tsx +++ b/example/CountlyRNExample/Feedback.tsx @@ -95,18 +95,6 @@ const showStarRating = () => { Countly.showStarRating(); }; -const showFeedbackPopup = () => { - Countly.showFeedbackPopup('5f8c837a5294f7aae370067c', 'Submit'); -}; - -presentRatingWidget = () => { - Countly.presentRatingWidgetWithID('625f9032028614795fe5a85b', 'Submit', (error) => { - if (error != null) { - console.log(error); - } - }); -}; - const presentRatingWidgetUsingEditBox = function () { Countly.presentRatingWidgetWithID(state.ratingId, 'Submit', (error) => { if (error != null) { @@ -279,7 +267,6 @@ function FeedbackScreen({ navigation }) { - diff --git a/example/CountlyRNExample/Home.tsx b/example/CountlyRNExample/Home.tsx index 2acf347a..ef83b484 100644 --- a/example/CountlyRNExample/Home.tsx +++ b/example/CountlyRNExample/Home.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ import React from 'react'; -import { View, Image, Text, SafeAreaView, ScrollView, Alert } from 'react-native'; +import { Text, SafeAreaView, ScrollView, Alert } from 'react-native'; import CountlyButton from './CountlyButton'; import Countly from 'countly-sdk-react-native-bridge'; import countlyConfig from './Configuration'; From 9fe54af368b9832e2248cfed95c38efb43dbac77 Mon Sep 17 00:00:00 2001 From: ijunaid Date: Thu, 14 Dec 2023 19:29:29 +0500 Subject: [PATCH 08/48] Updated iOS SDK to 23.12.0 (#277) * Updated iOS SDK to 23.12.0 * Updated changelog for iOS SDK --- ios/src/CHANGELOG.md | 1112 +++++++++-------- ios/src/Countly-PL.podspec | 4 +- ios/src/Countly.m | 30 +- ios/src/Countly.podspec | 4 +- ios/src/Countly.xcodeproj/project.pbxproj | 22 +- .../UserInterfaceState.xcuserstate | Bin 138550 -> 14499 bytes ios/src/CountlyCommon.m | 4 +- ios/src/CountlyConfig.h | 15 + ios/src/CountlyConnectionManager.h | 5 + ios/src/CountlyConnectionManager.m | 100 +- ios/src/CountlyCrashReporter.m | 2 +- ios/src/CountlyDeviceInfo.m | 14 +- ios/src/CountlyExperimentInformation.h | 23 + ios/src/CountlyExperimentInformation.m | 44 + ios/src/CountlyFeedbackWidget.m | 6 + ios/src/CountlyFeedbacks.m | 9 + ios/src/CountlyLocationManager.h | 1 + ios/src/CountlyLocationManager.m | 10 +- ios/src/CountlyPersistency.h | 4 + ios/src/CountlyPersistency.m | 57 +- ios/src/CountlyRCData.m | 2 +- ios/src/CountlyRemoteConfig.h | 8 + ios/src/CountlyRemoteConfig.m | 25 + ios/src/CountlyRemoteConfigInternal.h | 10 +- ios/src/CountlyRemoteConfigInternal.m | 232 ++-- ios/src/CountlyServerConfig.m | 11 +- ios/src/CountlyViewData.h | 7 + ios/src/CountlyViewTracking.h | 3 + ios/src/CountlyViewTracking.m | 11 + ios/src/CountlyViewTrackingInternal.h | 3 + ios/src/CountlyViewTrackingInternal.m | 136 +- ios/src/README.md | 14 +- ios/src/countly_dsym_uploader.sh | 18 +- .../include/CountlyExperimentInformation.h | 1 + 34 files changed, 1230 insertions(+), 717 deletions(-) create mode 100644 ios/src/CountlyExperimentInformation.h create mode 100644 ios/src/CountlyExperimentInformation.m create mode 120000 ios/src/include/CountlyExperimentInformation.h diff --git a/ios/src/CHANGELOG.md b/ios/src/CHANGELOG.md index f59793e4..9ff45c57 100644 --- a/ios/src/CHANGELOG.md +++ b/ios/src/CHANGELOG.md @@ -1,641 +1,659 @@ +## 23.12.0 +* Added `disableLocation` initial config property to disable location tracking +* Added `addSegmentationToViewWithID:` in view interface for adding segmentation to an ongoing view +* Added `addSegmentationToViewWithName:` in view interface for adding segmentation to an ongoing view + +* Fixed bug with "pauseViewWithID" call where it could go into a recursive loop + +## 23.8.3 +* Added `requestDropAgeHours` initial config property to set a time limit after which the requests would be removed if not sent to the server +* Added a call to enroll users to A/B tests when getting a remote config value: 'getValueAndEnroll' +* Added a call to enroll users to A/B tests when getting all remote config values: 'getAllValuesAndEnroll' +* Added app version in all API requests. + +* Fixed sending '--' as carrier name due to platform changes from iOS version 16.4. This version and above will now not send any carrier information due to platform limitations. +* Mitigated an issue where users could not enroll to an A/B tests if enrollment request has failed + ## 23.8.2 -- Fixed rating feedback widget event key for widget closed event +* Fixed rating feedback widget event key for widget closed event +* Added `testingDownloadExperimentInformation:` in remote config interface +* Added `testingGetAllExperimentInfo:` in remote config interface ## 23.8.1 -- Expanded feedback widget functionality. Added ability to use rating widgets. -- Added functionality to access tags for feedback widgets. -- Fixed SPM public header issues of `CountlyViewTracking.h` +* Expanded feedback widget functionality. Added ability to use rating widgets. +* Added functionality to access tags for feedback widgets. +* Fixed SPM public header issues of `CountlyViewTracking.h` ## 23.8.0 -- Added `CountlyViewTracking:` interface with new view methods: - - `setGlobalViewSegmentation:` - - `updateGlobalViewSegmentation:` - - `startView:` - - `startView:segmentation` - - `startAutoStoppedView:` - - `startAutoStoppedView:segmentation` - - `stopViewWithName:` - - `stopViewWithName:segmentation` - - `stopViewWithID:` - - `stopViewWithID:segmentation` - - `pauseViewWithID:` - - `pauseViewWithID:` - - `stopAllViews:` -- Added `enableAllConsents` initial config property to give all consents at init time -- Added `giveAllConsents` method to give all consents -- Added `enableAutomaticViewTracking` config for automatic track views -- Added `automaticViewTrackingExclusionList` config for automatic view tracking exclusion list -- Added `globalViewSegmentation` config to add set global view segmentation. -- Added `enrollABOnRCDownload` config method to auto enroll users to AB tests when downloading RC values. -- Added `enableManualSessionControlHybridMode` config. With this mode 'updateSession' calls will automatically be handled by SDK for manual session handling. -- Deprecated `giveConsentForAllFeatures` method -- Deprecated `CLYAutoViewTracking` in config -- Deprecated existing view tracking methods and variables: - - `recordView:` - - `recordView:segmentation` - - `addExceptionForAutoViewTracking:` - - `removeExceptionForAutoViewTracking:` - - `isAutoViewTrackingActive` +* Added `CountlyViewTracking:` interface with new view methods: + * `setGlobalViewSegmentation:` + * `updateGlobalViewSegmentation:` + * `startView:` + * `startView:segmentation` + * `startAutoStoppedView:` + * `startAutoStoppedView:segmentation` + * `stopViewWithName:` + * `stopViewWithName:segmentation` + * `stopViewWithID:` + * `stopViewWithID:segmentation` + * `pauseViewWithID:` + * `pauseViewWithID:` + * `stopAllViews:` +* Added `enableAllConsents` initial config property to give all consents at init time +* Added `giveAllConsents` method to give all consents +* Added `enableAutomaticViewTracking` config for automatic track views +* Added `automaticViewTrackingExclusionList` config for automatic view tracking exclusion list +* Added `globalViewSegmentation` config to add set global view segmentation. +* Added `enrollABOnRCDownload` config method to auto enroll users to AB tests when downloading RC values. +* Added `enableManualSessionControlHybridMode` config. With this mode 'updateSession' calls will automatically be handled by SDK for manual session handling. +* Deprecated `giveConsentForAllFeatures` method +* Deprecated `CLYAutoViewTracking` in config +* Deprecated existing view tracking methods and variables: + * `recordView:` + * `recordView:segmentation` + * `addExceptionForAutoViewTracking:` + * `removeExceptionForAutoViewTracking:` + * `isAutoViewTrackingActive` ## 23.6.2 -- Fixed bug where init time provided global Remote config download callbacks were ignored -- Remote config values are now not erased anymore when removing remote config consent -- Added remaining request count 'rr' parameter when sending queued request. +* Fixed bug where init time provided global Remote config download callbacks were ignored +* Remote config values are now not erased anymore when removing remote config consent +* Added remaining request count 'rr' parameter when sending queued request. ## 23.6.1 -- Fixed SPM public header issues of `CountlyRCData.h` and `CountlyRemoteConfig.h` +* Fixed SPM public header issues of `CountlyRCData.h` and `CountlyRemoteConfig.h` ## 23.6.0 -- !! Major breaking change !! Automatically downloaded remote config values will no longer be automatically enrolled in their AB tests. -- Added `CountlyRemoteConfig:` interface with new remote config methods: - - `getValue:` - - `getAllValues:` - - `registerDownloadCallback:` - - `removeDownloadCallback:` - - `downloadKeys:` - - `downloadSpecificKeys:completionHandler` - - `downloadOmittingKeys:completionHandler` - - `enrollIntoABTestsForKeys:` - - `exitABTestsForKeys:` - - `testingGetAllVariants:` - - `testingGetVariantsForKey:` - - `testingDownloadVariantInformation:variantName:completionHandler` - - `testingEnrollIntoVariant:` - - `clearAll:` -- Added `enableRemoteConfigAutomaticTriggers` config for automatic remote config download -- Added `enableRemoteConfigValueCaching` config for caching of remote config -- Added `remoteConfigRegisterGlobalCallback` config to register remote config global callbacks during init. -- Added `getRemoteConfigGlobalCallbacks` config to get a list of remote config global callbacks. -- Deprecated `enableRemoteConfig` initial config flag -- Deprecated `remoteConfigCompletionHandler` in config -- Deprecated existing remote config methods: - - `remoteConfigValueForKey:` - - `updateRemoteConfigWithCompletionHandler:` - - `updateRemoteConfigOnlyForKeys:completionHandler` - - `updateRemoteConfigExceptForKeys:completionHandler` +* !! Major breaking change !! Automatically downloaded remote config values will no longer be automatically enrolled in their AB tests. +* Added `CountlyRemoteConfig:` interface with new remote config methods: + * `getValue:` + * `getAllValues:` + * `registerDownloadCallback:` + * `removeDownloadCallback:` + * `downloadKeys:` + * `downloadSpecificKeys:completionHandler` + * `downloadOmittingKeys:completionHandler` + * `enrollIntoABTestsForKeys:` + * `exitABTestsForKeys:` + * `testingGetAllVariants:` + * `testingGetVariantsForKey:` + * `testingDownloadVariantInformation:variantName:completionHandler` + * `testingEnrollIntoVariant:` + * `clearAll:` +* Added `enableRemoteConfigAutomaticTriggers` config for automatic remote config download +* Added `enableRemoteConfigValueCaching` config for caching of remote config +* Added `remoteConfigRegisterGlobalCallback` config to register remote config global callbacks during init. +* Added `getRemoteConfigGlobalCallbacks` config to get a list of remote config global callbacks. +* Deprecated `enableRemoteConfig` initial config flag +* Deprecated `remoteConfigCompletionHandler` in config +* Deprecated existing remote config methods: + * `remoteConfigValueForKey:` + * `updateRemoteConfigWithCompletionHandler:` + * `updateRemoteConfigOnlyForKeys:completionHandler` + * `updateRemoteConfigExceptForKeys:completionHandler` ## 23.02.3 -- Added back battery level reporting to crash reporting. Battery level is only reported if battery was enabled before. -- Added new methods for changing the device id: `changeDeviceIDWithMerge:`, `changeDeviceIDWithoutMerge:`. -- Fixed a bug where the app would crash if `city`, `countryCode` or `IP` in location was null. -- Deprecated existing method to change the device id: `setNewDeviceID:` -- Deprecated `attributionID` initial config flag -- Deprecated `recordAttributionID` method +* Added back battery level reporting to crash reporting. Battery level is only reported if battery was enabled before. +* Added new methods for changing the device id: `changeDeviceIDWithMerge:`, `changeDeviceIDWithoutMerge:`. +* Fixed a bug where the app would crash if `city`, `countryCode` or `IP` in location was null. +* Deprecated existing method to change the device id: `setNewDeviceID:` +* Deprecated `attributionID` initial config flag +* Deprecated `recordAttributionID` method ## 23.02.2 -- Added server configuration functionality. This is an experimental feature. -- Not reporting battery level in the crash handler to prevent hanging +* Added server configuration functionality. This is an experimental feature. +* Not reporting battery level in the crash handler to prevent hanging ## 23.02.1 -- Added previous event ID and sending it with custom events. -- Updated default `maxSegmentationValues` from 30 to 100 +* Added previous event ID and sending it with custom events. +* Updated default `maxSegmentationValues` from 30 to 100 ## 23.02.0 -- Added event IDs -- Added current and previous view IDs to events -- Added sending pending events before sending user details on `save` call. +* Added event IDs +* Added current and previous view IDs to events +* Added sending pending events before sending user details on `save` call. ## 22.09.0 -- Deleted previously deprecated `userLoggedIn:` and `userLoggedOut` methods -- Added new exception recording methods: `recordException:`, `recordException:isFatal:`, `recordException:isFatal:stackTrace:segmentation:` -- Deprecated existing exception recording methods: `recordHandledException:`, `recordHandledException:withStackTrace:`, `recordUnhandledException:withStackTrace:` -- Added `recordError:stackTrace:`, `recordError:isFatal:stackTrace:segmentation:` methods for Swift errors +* Deleted previously deprecated `userLoggedIn:` and `userLoggedOut` methods +* Added new exception recording methods: `recordException:`, `recordException:isFatal:`, `recordException:isFatal:stackTrace:segmentation:` +* Deprecated existing exception recording methods: `recordHandledException:`, `recordHandledException:withStackTrace:`, `recordUnhandledException:withStackTrace:` +* Added `recordError:stackTrace:`, `recordError:isFatal:stackTrace:segmentation:` methods for Swift errors -- Other various improvements - - Added device info to SDK initialization logs +* Other various improvements + * Added device info to SDK initialization logs ## 22.06.2 -- Added direct requests support -- Fixed missing remote config consent in consents request +* Added direct requests support +* Fixed missing remote config consent in consents request -- Other various improvements - - Updated some pragma marks +* Other various improvements + * Updated some pragma marks ## 22.06.1 -- Fixed user details consent issue on SDK start -- Updated feedback widget internal webview design and layout +* Fixed user details consent issue on SDK start +* Updated feedback widget internal webview design and layout -- Other various improvements - - Updated HeaderDocs, internal logs, inline notes and pragma marks +* Other various improvements + * Updated HeaderDocs, internal logs, inline notes and pragma marks ## 22.06.0 -- Added `CountlyAutoViewTrackingName` protocol for supporting custom view titles with AutoViewTracking -- Added `setNewURLSessionConfiguration:` method to be able change URL session configuraion on the go (thanks @angelix) -- Added ability to save user details on SDK initialization -- Added device ID type to every request being sent -- Fixed missing remote config consent -- Fixed auto view tracking for iOS 13+ PageSheet modal presentations -- Deleted previously deprecated and inoperative methods and config flags - -- Other various improvements - - Updated HeaderDocs, internal logs, inline notes and pragma marks - - Updated Countly project settings for Xcode 13.4.1 (13F100) +* Added `CountlyAutoViewTrackingName` protocol for supporting custom view titles with AutoViewTracking +* Added `setNewURLSessionConfiguration:` method to be able change URL session configuraion on the go (thanks @angelix) +* Added ability to save user details on SDK initialization +* Added device ID type to every request being sent +* Fixed missing remote config consent +* Fixed auto view tracking for iOS 13+ PageSheet modal presentations +* Deleted previously deprecated and inoperative methods and config flags + +* Other various improvements + * Updated HeaderDocs, internal logs, inline notes and pragma marks + * Updated Countly project settings for Xcode 13.4.1 (13F100) ## 21.11.2 -- Added direct and indirect attribution -- Added platform info to default segmentation of push action events -- Added `recordRatingWidgetWithID:rating:email:comment:userCanBeContacted:` method to be able to manually record rating widgets -- Added macOS version info to `Countly.xcodeproj` (thanks @ntadej) -- Updated sending consent changes to inlude all current consents state -- Excluded Countly-PL.podspec from SPM manifest (thanks @harrisg) -- Fixed possible SecTrustCopyExceptions leak -- Deprecated `presentFeedbackWidgetWithID:completionHandler:` method +* Added direct and indirect attribution +* Added platform info to default segmentation of push action events +* Added `recordRatingWidgetWithID:rating:email:comment:userCanBeContacted:` method to be able to manually record rating widgets +* Added macOS version info to `Countly.xcodeproj` (thanks @ntadej) +* Updated sending consent changes to inlude all current consents state +* Excluded Countly-PL.podspec from SPM manifest (thanks @harrisg) +* Fixed possible SecTrustCopyExceptions leak +* Deprecated `presentFeedbackWidgetWithID:completionHandler:` method ## 21.11.1 -- Fixed a crash when some default user detail properties are set to `NSNull` (thanks @lhunath) -- Updated README.md for minimum supported deployment targets +* Fixed a crash when some default user detail properties are set to `NSNull` (thanks @lhunath) +* Updated README.md for minimum supported deployment targets ## 21.11.0 -- Updated minimum supported OS versions as `iOS 10.0`, `tvOS 10.0`, `watchOS 4.0` and `macOS 10.14` -- Updated some deprecated API usage to get rid of warnings -- Added configurable internal limits `maxKeyLength`, `maxValueLength` and `maxSegmentationValues` -- Added `enableOrientationTracking` config for disabling automatic user interface orientation tracking -- Added `setNewHost:` method to be able change the host on the go -- Added `shouldIgnoreTrustCheck` config for self-signed certificates (thanks @centrinvest) -- Created additional `Countly-PL.podspec` for avoiding static framework issue on original `Countly.podspec` (thanks @multinerd) -- Implemented cancelling all consents when device ID is changed without a merge -- Implemented by-passing events consent for reserved internal events -- Discarded consent requirement for changing device ID -- Discarded auto metrics for Apple Watch -- Discarded `customHeaderFieldName` and `customHeaderFieldValue` config properties -- Discarded `setCustomHeaderFieldValue:` method -- Fixed missing nullability specifier on `CountlyCommon.h` -- Fixed missing info level logs on `CountlyFeedbackWidget` class -- Fixed missing info level logs on `CountlyUserDetails` class -- Deprecated `userLoggedIn:` and `userLoggedOut` methods -- Deprecated going back to default system device ID - -- Other various improvements - - Updated HeaderDocs, internal logs, inline notes and pragma marks - - Updated Countly project settings for Xcode 13.1 - - Deleted previously deprecated methods and properties - - Refactored `connectionType` method +* Updated minimum supported OS versions as `iOS 10.0`, `tvOS 10.0`, `watchOS 4.0` and `macOS 10.14` +* Updated some deprecated API usage to get rid of warnings +* Added configurable internal limits `maxKeyLength`, `maxValueLength` and `maxSegmentationValues` +* Added `enableOrientationTracking` config for disabling automatic user interface orientation tracking +* Added `setNewHost:` method to be able change the host on the go +* Added `shouldIgnoreTrustCheck` config for self-signed certificates (thanks @centrinvest) +* Created additional `Countly-PL.podspec` for avoiding static framework issue on original `Countly.podspec` (thanks @multinerd) +* Implemented cancelling all consents when device ID is changed without a merge +* Implemented by-passing events consent for reserved internal events +* Discarded consent requirement for changing device ID +* Discarded auto metrics for Apple Watch +* Discarded `customHeaderFieldName` and `customHeaderFieldValue` config properties +* Discarded `setCustomHeaderFieldValue:` method +* Fixed missing nullability specifier on `CountlyCommon.h` +* Fixed missing info level logs on `CountlyFeedbackWidget` class +* Fixed missing info level logs on `CountlyUserDetails` class +* Deprecated `userLoggedIn:` and `userLoggedOut` methods +* Deprecated going back to default system device ID + +* Other various improvements + * Updated HeaderDocs, internal logs, inline notes and pragma marks + * Updated Countly project settings for Xcode 13.1 + * Deleted previously deprecated methods and properties + * Refactored `connectionType` method ## 20.11.3 -- Added optional appear and dismiss callbacks for feedback widget presenting -- Added manually displayed and recorded feedback widgets support -- Fixed HTTP method check for feedback widget requests -- Implemented immediately sending of queued events when a widget event is recorded +* Added optional appear and dismiss callbacks for feedback widget presenting +* Added manually displayed and recorded feedback widgets support +* Fixed HTTP method check for feedback widget requests +* Implemented immediately sending of queued events when a widget event is recorded ## 20.11.2 -- Added configurable internal log levels -- Added internal logs for approximate received and sent data size for requests -- Added numbers and boolean value types for custom user details methods -- Added `clearCrashLogs` method for clearing custom crash logs (breadcrumbs) -- Added `navigationItem`'s title as a view title fallback for view tracking -- Added Mac Catalyst support -- Added selector precaution for `CountlyLoggerDelegate` method call -- Added precautions for nil values in custom user details methods -- Updated request successful check to consider response object -- Updated default `eventSendThreshold` as 100 -- Fixed `UIApplicationState` usage for crashes occured on non-main thread -- Fixed clearing custom crash logs -- Fixed missing frameworks for `ns` subspec in `podspec` file -- Fixed CountlyLoggerDelegate methods optionality -- Fixed view tracking exception view checking -- Fixed adding and removing view tracking exceptions on tvOS -- Fixed cast warnings for an APM method internal log - -- Other various improvements - - Updated HeaderDocs, internal logs, inline notes and pragma marks - - Updated Countly project settings for Xcode 12.4 +* Added configurable internal log levels +* Added internal logs for approximate received and sent data size for requests +* Added numbers and boolean value types for custom user details methods +* Added `clearCrashLogs` method for clearing custom crash logs (breadcrumbs) +* Added `navigationItem`'s title as a view title fallback for view tracking +* Added Mac Catalyst support +* Added selector precaution for `CountlyLoggerDelegate` method call +* Added precautions for nil values in custom user details methods +* Updated request successful check to consider response object +* Updated default `eventSendThreshold` as 100 +* Fixed `UIApplicationState` usage for crashes occured on non-main thread +* Fixed clearing custom crash logs +* Fixed missing frameworks for `ns` subspec in `podspec` file +* Fixed CountlyLoggerDelegate methods optionality +* Fixed view tracking exception view checking +* Fixed adding and removing view tracking exceptions on tvOS +* Fixed cast warnings for an APM method internal log + +* Other various improvements + * Updated HeaderDocs, internal logs, inline notes and pragma marks + * Updated Countly project settings for Xcode 12.4 ## 20.11.1 -- Added `loggerDelegate` initial config property for receiving internal logs on production builds -- Fixed manual view tracking state clean up when view tracking consent is cancelled -- Updated `CountlyFeedbackWidget.h` as public header file in Xcode project file for Carthage -- Added nullability specifiers for block parameters +* Added `loggerDelegate` initial config property for receiving internal logs on production builds +* Fixed manual view tracking state clean up when view tracking consent is cancelled +* Updated `CountlyFeedbackWidget.h` as public header file in Xcode project file for Carthage +* Added nullability specifiers for block parameters ## 20.11.0 -- Added Surveys and NPS feedback widgets -- Added Swift Package Manager support -- Added `replaceAllAppKeysInQueueWithCurrentAppKey` method to replace all app keys in queue with the current app key -- Added `removeDifferentAppKeysFromQueue` method to remove all different app keys from the queue -- Added `deviceIDType` method to be able to check device ID type -- Added precaution and warning for `nil` crash report case -- Added `consents` initial config property -- Added device type metric -- Updated dismiss button design -- Fixed web view autoresizing mask for legacy feedback widgets -- Fixed a missing `CoreLocation` framework import -- Fixed unnecessary recreation of `NSURLSession` instances -- Fixed dismiss button layout -- Changed interface orientation change event consent from `Events` to `UserDetails` -- Changed remote config consent from `Any` to `RemoteConfig` -- Marked `pushTestMode` initial config property as `_Nullable` - -- Other various improvements - - Refactored picture upload data extraction - - Suppressed an internal log for interface orientation change - - Updated some constant key declarations for common use - - Updated HeaderDocs, internal logs, inline notes and pragma marks +* Added Surveys and NPS feedback widgets +* Added Swift Package Manager support +* Added `replaceAllAppKeysInQueueWithCurrentAppKey` method to replace all app keys in queue with the current app key +* Added `removeDifferentAppKeysFromQueue` method to remove all different app keys from the queue +* Added `deviceIDType` method to be able to check device ID type +* Added precaution and warning for `nil` crash report case +* Added `consents` initial config property +* Added device type metric +* Updated dismiss button design +* Fixed web view autoresizing mask for legacy feedback widgets +* Fixed a missing `CoreLocation` framework import +* Fixed unnecessary recreation of `NSURLSession` instances +* Fixed dismiss button layout +* Changed interface orientation change event consent from `Events` to `UserDetails` +* Changed remote config consent from `Any` to `RemoteConfig` +* Marked `pushTestMode` initial config property as `_Nullable` + +* Other various improvements + * Refactored picture upload data extraction + * Suppressed an internal log for interface orientation change + * Updated some constant key declarations for common use + * Updated HeaderDocs, internal logs, inline notes and pragma marks ## 20.04.3 -- Deprecated `recordLocation:`, `recordCity:andISOCountryCode:`, `recordIP:` methods -- Added new combined `recordLocation:city:ISOCountryCode:IP:` method for recording location related info -- Deprecated `enableAttribution` initial config flag -- Added `attributionID` initial config property -- Added `recordAttributionID:` method -- Discarded IDFA usage on optional attribution feature -- Discarded `COUNTLY_EXCLUDE_IDFA` preprocessor flag -- Updated `PLCrashReporter` subspec dependency version specifier as `~> 1` - -- Other various improvements - - Updated HeaderDocs, internal logs, inline notes and pragma marks - - Updated some initial config property modifiers as `copy` - - Treated empty string `city`, `ISOCountryCode` and `IP` values as `nil` - - Added warnings for the cases where `city` and `ISOCountryCode` code are not set as a pair +* Deprecated `recordLocation:`, `recordCity:andISOCountryCode:`, `recordIP:` methods +* Added new combined `recordLocation:city:ISOCountryCode:IP:` method for recording location related info +* Deprecated `enableAttribution` initial config flag +* Added `attributionID` initial config property +* Added `recordAttributionID:` method +* Discarded IDFA usage on optional attribution feature +* Discarded `COUNTLY_EXCLUDE_IDFA` preprocessor flag +* Updated `PLCrashReporter` subspec dependency version specifier as `~> 1` + +* Other various improvements + * Updated HeaderDocs, internal logs, inline notes and pragma marks + * Updated some initial config property modifiers as `copy` + * Treated empty string `city`, `ISOCountryCode` and `IP` values as `nil` + * Added warnings for the cases where `city` and `ISOCountryCode` code are not set as a pair ## 20.04.2 -- Implemented overriding default metrics and adding custom ones -- Fixed advertising tracking enabled check +* Implemented overriding default metrics and adding custom ones +* Fixed advertising tracking enabled check -- Other various improvements - - Improved internal logs for pinned certificate check - - Refactored extra slash check using `hasSuffix:` method - - Renamed some app life cycle observing methods for clarity +* Other various improvements + * Improved internal logs for pinned certificate check + * Refactored extra slash check using `hasSuffix:` method + * Renamed some app life cycle observing methods for clarity ## 20.04.1 -- Added Application Performance Monitoring (Phase 1) - - Manual network traces - - Manual custom traces - - Semi-automatic app start time trace - - Automatic app foreground time trace - - Automatic app background time trace - - Consent handling for Application Performance Monitoring -- Added `COUNTLY_EXCLUDE_PUSHNOTIFICATIONS` flag to disable push notifications altogether in order to avoid App Store Connect warnings (thanks @grundleborg) -- Fixed an incorrect internal logging on SDK start -- Fixed location consent order to avoid some legacy Countly Server issue with location info being unavailable even after giving consent -- Improved `UIApplicationWillTerminateNotification` behaviour -- Prevented recording empty string as `city`, `ISOCountryCode` and `IP` for location info -- Applied `alwaysUsePOST` flag to feedback widget check requests -- Applied `alwaysUsePOST` flag to remote config requests - -- Other various improvements - - Deleted some unnecessary imports - - Updated HeaderDocs, internal logs, inline notes and pragma marks - - Added missing frameworks to CocoaPods podspec - - Added ability to override SDK name and version for bridge SDKs +* Added Application Performance Monitoring (Phase 1) + * Manual network traces + * Manual custom traces + * Semi-automatic app start time trace + * Automatic app foreground time trace + * Automatic app background time trace + * Consent handling for Application Performance Monitoring +* Added `COUNTLY_EXCLUDE_PUSHNOTIFICATIONS` flag to disable push notifications altogether in order to avoid App Store Connect warnings (thanks @grundleborg) +* Fixed an incorrect internal logging on SDK start +* Fixed location consent order to avoid some legacy Countly Server issue with location info being unavailable even after giving consent +* Improved `UIApplicationWillTerminateNotification` behaviour +* Prevented recording empty string as `city`, `ISOCountryCode` and `IP` for location info +* Applied `alwaysUsePOST` flag to feedback widget check requests +* Applied `alwaysUsePOST` flag to remote config requests + +* Other various improvements + * Deleted some unnecessary imports + * Updated HeaderDocs, internal logs, inline notes and pragma marks + * Added missing frameworks to CocoaPods podspec + * Added ability to override SDK name and version for bridge SDKs ## 20.04 -- Added crash reporting feature for tvOS -- Added crash reporting feature for macOS -- Added crash reporting feature for watchOS -- Added optional crash reporting dependency PLCrashReporter for iOS -- Added UI orientation tracking -- Added crash filtering with regex -- Updated dSYM uploader script for accepting custom dSYM paths -- Updated enableAppleWatch flag default value for independent watchOS apps -- Fixed push notification consent method for macOS targets -- Fixed not appearing rich push notification buttons for some cases -- Discarded OpenGL ES version info in crash reports - -- Other various improvements - - Deleted an unnecessary UIKit import - - Added precaution for possible nil lines in backtrace - - Added precaution for possible nil OS name value - - Replaced scheduledTimerWithTimeInterval call with timerWithTimeInterval (thanks @mt-rpranata) - - Updated architerture method for crash reports - - Updated CocoaPods podspec for core subspec approach - - Updated feature, consent and push test mode specifiers as NSString typedefs - - Updated HeaderDocs, internal logs, inline notes and pragma marks +* Added crash reporting feature for tvOS +* Added crash reporting feature for macOS +* Added crash reporting feature for watchOS +* Added optional crash reporting dependency PLCrashReporter for iOS +* Added UI orientation tracking +* Added crash filtering with regex +* Updated dSYM uploader script for accepting custom dSYM paths +* Updated enableAppleWatch flag default value for independent watchOS apps +* Fixed push notification consent method for macOS targets +* Fixed not appearing rich push notification buttons for some cases +* Discarded OpenGL ES version info in crash reports + +* Other various improvements + * Deleted an unnecessary UIKit import + * Added precaution for possible nil lines in backtrace + * Added precaution for possible nil OS name value + * Replaced scheduledTimerWithTimeInterval call with timerWithTimeInterval (thanks @mt-rpranata) + * Updated architerture method for crash reports + * Updated CocoaPods podspec for core subspec approach + * Updated feature, consent and push test mode specifiers as NSString typedefs + * Updated HeaderDocs, internal logs, inline notes and pragma marks ## 19.08 -- Added temporary device ID mode -- Added support for Carthage -- Added custom URL session configuration support -- Added custom segmentation support on view tracking -- Added ability to change app key on the run -- Added ability to flush queues -- Added `pushTestMode` property and discarded `isTestDevice` property -- Fixed `WCSessionDelegate` interception -- Fixed title and message check in push notification payloads -- Fixed binary image name extraction for crash reports -- Fixed missing delegate forwarding for `userNotificationCenter:openSettingsForNotification:` method -- Fixed in-app alerts on iOS10+ devices when a silent notification with alert key arrives -- Discarded device ID persistency on Keychain -- Discarded OpenUDID device ID option -- Discarded IDFA device ID option -- Discarded zero IDFA fix -- Updated default device ID on tvOS as `identifierForVendor` - -- Other various improvements - - Renamed `forceDeviceIDInitialization` flag as `resetStoredDeviceID` - - Added lightweight generics for segmentation parameters - - Added dSYM upload script to preserved paths in Podspec - - Updated dSYM upload script to support paths with spaces - - Changed request cache policy to `NSURLRequestReloadIgnoringLocalCacheData` - - Added battery level for watchOS 4.0+ - - Added JSON validity check before converting objects - - Deleted unused `kCountlyCRKeyLoadAddress` constant - - Improved internal logging in binary images processing for crash reports - - Added persistency for generated `NSUUID` - - Added precaution to prevent invalid requests from being added to queue - - Discarded null check on request queue - - Discarded all APM related files - - Added length check for view tracking view name - - Added length check for view tracking exceptions - - Updated HeaderDocs, internal logs, inline notes and pragma marks +* Added temporary device ID mode +* Added support for Carthage +* Added custom URL session configuration support +* Added custom segmentation support on view tracking +* Added ability to change app key on the run +* Added ability to flush queues +* Added `pushTestMode` property and discarded `isTestDevice` property +* Fixed `WCSessionDelegate` interception +* Fixed title and message check in push notification payloads +* Fixed binary image name extraction for crash reports +* Fixed missing delegate forwarding for `userNotificationCenter:openSettingsForNotification:` method +* Fixed in-app alerts on iOS10+ devices when a silent notification with alert key arrives +* Discarded device ID persistency on Keychain +* Discarded OpenUDID device ID option +* Discarded IDFA device ID option +* Discarded zero IDFA fix +* Updated default device ID on tvOS as `identifierForVendor` + +* Other various improvements + * Renamed `forceDeviceIDInitialization` flag as `resetStoredDeviceID` + * Added lightweight generics for segmentation parameters + * Added dSYM upload script to preserved paths in Podspec + * Updated dSYM upload script to support paths with spaces + * Changed request cache policy to `NSURLRequestReloadIgnoringLocalCacheData` + * Added battery level for watchOS 4.0+ + * Added JSON validity check before converting objects + * Deleted unused `kCountlyCRKeyLoadAddress` constant + * Improved internal logging in binary images processing for crash reports + * Added persistency for generated `NSUUID` + * Added precaution to prevent invalid requests from being added to queue + * Discarded null check on request queue + * Discarded all APM related files + * Added length check for view tracking view name + * Added length check for view tracking exceptions + * Updated HeaderDocs, internal logs, inline notes and pragma marks ## 19.02 -- Added push notification support for macOS -- Added provisional push notification permission support for iOS12 -- Added remote config feature -- Added `recordPushNotificationToken` method to be used after device ID changes -- Added `clearPushNotificationToken` method to be used after device ID changes -- Discarded `Push Open` event and replaced it with `Push Action` event -- Fixed push notification token not being sent on some iOS12 devices -- Fixed device ID change request delaying issue by discarding delay altogether -- Fixed internal view controller presenting failure when root view controller is not ready yet -- Fixed `openURL` freeze caused by iOS -- Fixed wrong `kCountlyQSKeyLocationIP` key in location info requests -- Fixed missing app key in feedback widget requests -- Fixed feedback widget dismiss button position - -- Other various improvements - - Discarded separate UIWindow usage for presenting feedback widgets - - Added checksum to feedback widget requests - - Improved internal logging for request queue +* Added push notification support for macOS +* Added provisional push notification permission support for iOS12 +* Added remote config feature +* Added `recordPushNotificationToken` method to be used after device ID changes +* Added `clearPushNotificationToken` method to be used after device ID changes +* Discarded `Push Open` event and replaced it with `Push Action` event +* Fixed push notification token not being sent on some iOS12 devices +* Fixed device ID change request delaying issue by discarding delay altogether +* Fixed internal view controller presenting failure when root view controller is not ready yet +* Fixed `openURL` freeze caused by iOS +* Fixed wrong `kCountlyQSKeyLocationIP` key in location info requests +* Fixed missing app key in feedback widget requests +* Fixed feedback widget dismiss button position + +* Other various improvements + * Discarded separate UIWindow usage for presenting feedback widgets + * Added checksum to feedback widget requests + * Improved internal logging for request queue ## 18.08 -- Added feedback widgets support -- Added limit for number of custom crash logs (100 logs) -- Added limit for each custom crash log length (1000 chars) -- Added support for cancelling timed events -- Added support for recording fatal exceptions manually -- Added `userInfo` to crash report custom property -- Added delay before sending change device ID request (server requirement) -- Renamed `isAutoViewTrackingEnabled` as `isAutoViewTrackingActive` -- Fixed Xcode warnings for `askForNotificationPermission` method -- Fixed `UIAlertController` leak in push notification manager -- Fixed `crashSegmentation` availability for manually recorded crashes -- Fixed `openURL:` call thread as main thread -- Updated minimum supported `macOS` version as `10.10` - -- Other various improvements - - Discarded separate `UIWindow` for presenting `UIAlertControllers` - - Refactored `buildUUID` and `executableName` as properties - - Refactored custom crash log array and date formatter - - Updated HeaderDocs, inline notes, pragma marks +* Added feedback widgets support +* Added limit for number of custom crash logs (100 logs) +* Added limit for each custom crash log length (1000 chars) +* Added support for cancelling timed events +* Added support for recording fatal exceptions manually +* Added `userInfo` to crash report custom property +* Added delay before sending change device ID request (server requirement) +* Renamed `isAutoViewTrackingEnabled` as `isAutoViewTrackingActive` +* Fixed Xcode warnings for `askForNotificationPermission` method +* Fixed `UIAlertController` leak in push notification manager +* Fixed `crashSegmentation` availability for manually recorded crashes +* Fixed `openURL:` call thread as main thread +* Updated minimum supported `macOS` version as `10.10` + +* Other various improvements + * Discarded separate `UIWindow` for presenting `UIAlertControllers` + * Refactored `buildUUID` and `executableName` as properties + * Refactored custom crash log array and date formatter + * Updated HeaderDocs, inline notes, pragma marks ## 18.04 -- Added consent management for GDPR compliance -- Exposed device ID to be used for data export and/or removal requests -- Added precautions for SDK start state to prevent re-starting and early method calls -- Added mutability protection for core functions, configuration properties, events and user details -- Added `COUNTLY_EXCLUDE_IDFA` pre-processor flag to exclude IDFA references -- Added API availability checks and warnings for Apple Watch and Push Notifications -- Renamed `reportView:` method as `recordView:` -- Fixed early ending of `UIBackgroundTask` -- Fixed getting file path form local storage URL (thanks @dsmo) -- Fixed not respecting `doNotShowAlertForNotifications` flag on iOS10+ devices -- Fixed not starting requests queue when `manualSessionHandling` is enabled -- Fixed `block implicitly retains self` warning in Star Rating -- Fixed local variable shadowing warnings -- Fixed Japanese language code for Star Rating dialog - -- Other various improvements - - Refactored all location info into Location Manager - - Refactored `checkForAutoAsk` in Star Rating - - Refactored event recording for consents compatibility - - Refactored Apple Watch matching - - Refactored auto view tracking - - Added top view controller finding method - - Replaced asserts with exceptions - - Deleted unneccessary method declarations in Push Notifications - - Deleted unnecessary reference for `WCSession.defaultSession.delegate` - - Deleted unnecessary `TARGET_OS_OSX` definition - - Standardized `nil` checks - - Renamed and reordered some query string constants - - Updated HeaderDocs, inline notes, pragma marks - - Performed whitespace cleaning +* Added consent management for GDPR compliance +* Exposed device ID to be used for data export and/or removal requests +* Added precautions for SDK start state to prevent re-starting and early method calls +* Added mutability protection for core functions, configuration properties, events and user details +* Added `COUNTLY_EXCLUDE_IDFA` pre-processor flag to exclude IDFA references +* Added API availability checks and warnings for Apple Watch and Push Notifications +* Renamed `reportView:` method as `recordView:` +* Fixed early ending of `UIBackgroundTask` +* Fixed getting file path form local storage URL (thanks @dsmo) +* Fixed not respecting `doNotShowAlertForNotifications` flag on iOS10+ devices +* Fixed not starting requests queue when `manualSessionHandling` is enabled +* Fixed `block implicitly retains self` warning in Star Rating +* Fixed local variable shadowing warnings +* Fixed Japanese language code for Star Rating dialog + +* Other various improvements + * Refactored all location info into Location Manager + * Refactored `checkForAutoAsk` in Star Rating + * Refactored event recording for consents compatibility + * Refactored Apple Watch matching + * Refactored auto view tracking + * Added top view controller finding method + * Replaced asserts with exceptions + * Deleted unneccessary method declarations in Push Notifications + * Deleted unnecessary reference for `WCSession.defaultSession.delegate` + * Deleted unnecessary `TARGET_OS_OSX` definition + * Standardized `nil` checks + * Renamed and reordered some query string constants + * Updated HeaderDocs, inline notes, pragma marks + * Performed whitespace cleaning ## 18.01 -- Added `attribution` config -- Added recording city and country for GeoLocation -- Added recording explicit IP address for GeoLocation -- Added disabling GeoLocation -- Updated `recordLocation` method to override inital `location` config -- Fixed reserved key for IP address query string -- Fixed a `CoreTelephony` related crash due to an iOS bug -- Replaced `NSUserDefaults` with `NSCachesDirectory` on tvOS for persistency -- Improved auto dSYM uploader script -- Improved performance on stored request limit execution - -- Other various improvements - - Fixed a placeholder type specifier for `NSNumber` - - Deleted unnecessary `CLYMessaging` definition - - Deleted unnecessary strong ownership qualifiers - - Added Hindu translation for star rating dialog - - Added change log file - - Updated user details and star rating reserved keys as constants - - Updated `OpenGLESVersion` method return type as `NSString` - - Updated time related types as `NSTimeInterval` - - Updated HeaderDocs +* Added `attribution` config +* Added recording city and country for GeoLocation +* Added recording explicit IP address for GeoLocation +* Added disabling GeoLocation +* Updated `recordLocation` method to override inital `location` config +* Fixed reserved key for IP address query string +* Fixed a `CoreTelephony` related crash due to an iOS bug +* Replaced `NSUserDefaults` with `NSCachesDirectory` on tvOS for persistency +* Improved auto dSYM uploader script +* Improved performance on stored request limit execution + +* Other various improvements + * Fixed a placeholder type specifier for `NSNumber` + * Deleted unnecessary `CLYMessaging` definition + * Deleted unnecessary strong ownership qualifiers + * Added Hindu translation for star rating dialog + * Added change log file + * Updated user details and star rating reserved keys as constants + * Updated `OpenGLESVersion` method return type as `NSString` + * Updated time related types as `NSTimeInterval` + * Updated HeaderDocs ## 17.09 -- Updated for Xcode 9 and iOS 11 -- Added symbolication support for crash reports -- Added Automatic dSYM Uploading script -- Added extension subspec for integrating Rich Push Notifications with CocoaPods -- Added nullability specifiers for better Swift compatibility -- Added 28 new system UIViewController subclass exception for Auto View Tracking -- Added convenience method for recording action event for manually handled notifications -- Added convenience method for recording handled exception with stack trace -- Added precaution for invalid event keys -- Added precaution for corrupt request strings -- Made Zero-IDFA fix optional -- Fixed a view tracking duration problem where duration being reported as timestamp -- Replaced `crashLog` method with `recordCrashLog` and added deprecated warning -- Changed dispatch queue type for opening external URLs - -- Other various improvements - - Added Bengali translation for star rating dialog - - Updated metric, event, view tracking and crash report reserved keys as constants - - Deleted unnecessary gitattributes file - - Deleted duplicate Zero-IDFA const - - Rearranged file imports - - Updated HeaderDocs - - Cleaned whitespace +* Updated for Xcode 9 and iOS 11 +* Added symbolication support for crash reports +* Added Automatic dSYM Uploading script +* Added extension subspec for integrating Rich Push Notifications with CocoaPods +* Added nullability specifiers for better Swift compatibility +* Added 28 new system UIViewController subclass exception for Auto View Tracking +* Added convenience method for recording action event for manually handled notifications +* Added convenience method for recording handled exception with stack trace +* Added precaution for invalid event keys +* Added precaution for corrupt request strings +* Made Zero-IDFA fix optional +* Fixed a view tracking duration problem where duration being reported as timestamp +* Replaced `crashLog` method with `recordCrashLog` and added deprecated warning +* Changed dispatch queue type for opening external URLs + +* Other various improvements + * Added Bengali translation for star rating dialog + * Updated metric, event, view tracking and crash report reserved keys as constants + * Deleted unnecessary gitattributes file + * Deleted duplicate Zero-IDFA const + * Rearranged file imports + * Updated HeaderDocs + * Cleaned whitespace ## 17.05 -- Added Rich Push Notifications support (attachments and custom action buttons) -- Added manual session handling -- Added URL escaping for custom device ID and other user defined properties -- Added support for accidental extra slash in host -- Added architecture, executable name and load address for crash reporting -- Added IP optional parameter -- Added SDK metadata to all request -- Switched to SHA256 for parameter tampering protection -- Discarded `recordUserDetails` method and combined it with `save` method -- Improved `AutoViewTracking` active duration calculation -- Improved Countly payload check in notification dictionary -- Fixed inner event timestamp for 32 bit devices -- Fixed token cleaning when user's permission changes -- Fixed checksum calculation for `zero-IDFA` fix case -- Fixed OS version metric for `tvOS` -- Fixed double `suspend` method call when user kills the app using App Switcher -- Fixed a compiler warning for `macOS` targets -- Fixed `AutoViewTracking` for `macOS` targets -- Fixed showing of multiple alerts in succession - -- Other various improvements - - Refactored picture upload data preparation from request string using `NSURLComponents` - - Refactored `zero-IDFA` check - - Refactored additional info to be sent with begin session request - - Refactored checksum appending - - Refactored URLSession generation - - Refactored opening external URLs on main thread - - Refactored device model identifier method - - Refactored sending crash report into connection manager - - Replaced `__OPTIMIZED__` flag with `DEBUG` flag for push notification test mode detection - - Replaced boundary method with constant string - - Replaced text based dismiss button with cross dismiss button for star-rating - - Redefined request query string keys as constants - - Redefined push notification reserved keys as constants - - Redefined GET request max length as a constant - - Redefined server input endpoint as a constant - - Redefined push notification test mode values as enum - - Standardized some integer types - - Standardized target checking preprocessor macro usage - - Deleted unnecessary `init` override in push manager - - Deleted unnecessary `updateSessionPeriod` property in connection manager - - Deleted unnecessary `starRatingDismissButtonTitle` config property - - Deleted internal crash test methods - - Added Czech and Latvian localization for star-rating dialog - - Changed example host URL for rebranding compatibility - - Updated handling of notification on `iOS9` and older - - Updated alert key handling in push notification payload - - Updated HeaderDocs - - Cleaned whitespace +* Added Rich Push Notifications support (attachments and custom action buttons) +* Added manual session handling +* Added URL escaping for custom device ID and other user defined properties +* Added support for accidental extra slash in host +* Added architecture, executable name and load address for crash reporting +* Added IP optional parameter +* Added SDK metadata to all request +* Switched to SHA256 for parameter tampering protection +* Discarded `recordUserDetails` method and combined it with `save` method +* Improved `AutoViewTracking` active duration calculation +* Improved Countly payload check in notification dictionary +* Fixed inner event timestamp for 32 bit devices +* Fixed token cleaning when user's permission changes +* Fixed checksum calculation for `zero-IDFA` fix case +* Fixed OS version metric for `tvOS` +* Fixed double `suspend` method call when user kills the app using App Switcher +* Fixed a compiler warning for `macOS` targets +* Fixed `AutoViewTracking` for `macOS` targets +* Fixed showing of multiple alerts in succession + +* Other various improvements + * Refactored picture upload data preparation from request string using `NSURLComponents` + * Refactored `zero-IDFA` check + * Refactored additional info to be sent with begin session request + * Refactored checksum appending + * Refactored URLSession generation + * Refactored opening external URLs on main thread + * Refactored device model identifier method + * Refactored sending crash report into connection manager + * Replaced `__OPTIMIZED__` flag with `DEBUG` flag for push notification test mode detection + * Replaced boundary method with constant string + * Replaced text based dismiss button with cross dismiss button for star-rating + * Redefined request query string keys as constants + * Redefined push notification reserved keys as constants + * Redefined GET request max length as a constant + * Redefined server input endpoint as a constant + * Redefined push notification test mode values as enum + * Standardized some integer types + * Standardized target checking preprocessor macro usage + * Deleted unnecessary `init` override in push manager + * Deleted unnecessary `updateSessionPeriod` property in connection manager + * Deleted unnecessary `starRatingDismissButtonTitle` config property + * Deleted internal crash test methods + * Added Czech and Latvian localization for star-rating dialog + * Changed example host URL for rebranding compatibility + * Updated handling of notification on `iOS9` and older + * Updated alert key handling in push notification payload + * Updated HeaderDocs + * Cleaned whitespace ## 16.12 -- Refactored push notifications - - Made integration more easy - - Added iOS10 push notifications handling - - Added convenience method for asking push notifications permission covers all iOS versions - - Renamed feature name from `CLYMessaging` to `CLYPushNotifications` - - Added configuration option `doNotShowAlertForNotifications` to disable push triggered alerts - - Discarded complicated `UIUserNotificationCategory` actions - - Added configuration option `sendPushTokenAlways` to record push token always (for sending silent notification to users without notification permission) - - Discarded App Store URL fetching with `NSURLConnection` -- Discarded iOS7 support and deprecated method calls -- Switched to runtime controlled internal logging instead of preprocessor flag -- Added AutoViewTracking support for tvOS -- Added view controller title and custom titleView support for AutoViewTracking -- Improved AutoViewTracking performance and Swift compatibility -- Refactored suspending for crash reporting -- Switched to async file save for suspending -- Added user login and logout convenience methods -- Added configuration option to enable Apple Watch related features -- Moved archiving of queued request into sync block to prevent a very rare occurring crash -- Refactored unsent session duration -- Added completion callback for automatically displayed star-rating dialog -- Partially fixed but temporarily disabled APM feature until server completely supports it -- Fixed too long exception name in crash reports on iOS10 -- Other various improvements - - Refactored starting method - - Switched to separate window based alert controller displaying for push notifications and star-rating dialogs - - Renamed constant kCountlyStarRatingButtonSize to prevent compile time conflicts - - Renamed server input endpoint variable for white label SDK renamer script compatibility - - Updated star-rating reserved event key - - Added internal log for successful initialization with SDK name and version - - Fixed unused `UIAlertViewAssociatedObjectKey` warning for macOS - - Removed old deviceID zero-IDFA fixer redundant request - - Added internal logging for connection type retrieval exception - - Added exception type info to crash reports - - Fixed duplicate exception adding for AutoViewTracking - - Prevented Countly internal view controllers from being tracked by AutoViewTracking - - Prefixed all category methods to prevent possible conflicts - - Changed timer's runloop mode - - Updated timestamp type specifier (thanks to @scottlaw) - - Changed SDK metadata sending to begin_session only - - Replaced empty string checks with length checks - - Cleared nullability specifiers - - Updated HeaderDocs - - Cleaned whitespace +* Refactored push notifications + * Made integration more easy + * Added iOS10 push notifications handling + * Added convenience method for asking push notifications permission covers all iOS versions + * Renamed feature name from `CLYMessaging` to `CLYPushNotifications` + * Added configuration option `doNotShowAlertForNotifications` to disable push triggered alerts + * Discarded complicated `UIUserNotificationCategory` actions + * Added configuration option `sendPushTokenAlways` to record push token always (for sending silent notification to users without notification permission) + * Discarded App Store URL fetching with `NSURLConnection` +* Discarded iOS7 support and deprecated method calls +* Switched to runtime controlled internal logging instead of preprocessor flag +* Added AutoViewTracking support for tvOS +* Added view controller title and custom titleView support for AutoViewTracking +* Improved AutoViewTracking performance and Swift compatibility +* Refactored suspending for crash reporting +* Switched to async file save for suspending +* Added user login and logout convenience methods +* Added configuration option to enable Apple Watch related features +* Moved archiving of queued request into sync block to prevent a very rare occurring crash +* Refactored unsent session duration +* Added completion callback for automatically displayed star-rating dialog +* Partially fixed but temporarily disabled APM feature until server completely supports it +* Fixed too long exception name in crash reports on iOS10 +* Other various improvements + * Refactored starting method + * Switched to separate window based alert controller displaying for push notifications and star-rating dialogs + * Renamed constant kCountlyStarRatingButtonSize to prevent compile time conflicts + * Renamed server input endpoint variable for white label SDK renamer script compatibility + * Updated star-rating reserved event key + * Added internal log for successful initialization with SDK name and version + * Fixed unused `UIAlertViewAssociatedObjectKey` warning for macOS + * Removed old deviceID zero-IDFA fixer redundant request + * Added internal logging for connection type retrieval exception + * Added exception type info to crash reports + * Fixed duplicate exception adding for AutoViewTracking + * Prevented Countly internal view controllers from being tracked by AutoViewTracking + * Prefixed all category methods to prevent possible conflicts + * Changed timer's runloop mode + * Updated timestamp type specifier (thanks to @scottlaw) + * Changed SDK metadata sending to begin_session only + * Replaced empty string checks with length checks + * Cleared nullability specifiers + * Updated HeaderDocs + * Cleaned whitespace ## 16.06.4 -- Fixed iOS10 zero-IDFA problem -- Fixed TARGET_OS_OSX warning for iOS10 SDK on Xcode 8. -- Fixed ending of background tasks. -- Added parameter tampering protection. -- Added density metric. -- Added alwaysUsePOST config property for using POST method for all requests regardless of the data size. -- Added timezone. -- Switched to millisecond timestamp. -- Disabled server response dictionary check. -- Other minor improvements like better internal logging, standardization, whitespacing, code cleaning, commenting, pragma marking and HeaderDocing +* Fixed iOS10 zero-IDFA problem +* Fixed TARGET_OS_OSX warning for iOS10 SDK on Xcode 8. +* Fixed ending of background tasks. +* Added parameter tampering protection. +* Added density metric. +* Added alwaysUsePOST config property for using POST method for all requests regardless of the data size. +* Added timezone. +* Switched to millisecond timestamp. +* Disabled server response dictionary check. +* Other minor improvements like better internal logging, standardization, whitespacing, code cleaning, commenting, pragma marking and HeaderDocing ## 16.06.3 -- Fixed a persistency related crash -- Improved thread safety of request queue and events -- Added Star-Rating, the simplest form of feedback from users, both automatically and manually. -- Improved event recording performance and safety for APM and Auto View Tracking. -- Added custom HTTP header field support for requests, both on initial configuration and later. -- Standardized internal logging grammar and formatting for easier debugging -- Improved headerdocs grammar and formatting for easier integration and usage -- Fixed some static analyzer warnings +* Fixed a persistency related crash +* Improved thread safety of request queue and events +* Added Star-Rating, the simplest form of feedback from users, both automatically and manually. +* Improved event recording performance and safety for APM and Auto View Tracking. +* Added custom HTTP header field support for requests, both on initial configuration and later. +* Standardized internal logging grammar and formatting for easier debugging +* Improved headerdocs grammar and formatting for easier integration and usage +* Fixed some static analyzer warnings ## 16.06.2 -- Added Star-Rating, the simplest form of feedback from users, both automatically and manually. -- Improved event recording performance and safety for APM and Auto View Tracking. -- Added custom HTTP header field support for requests, both on initial configuration and later. -- Standardized internal logging grammar and formatting for easier debugging -- Improved headerdocs grammar and formatting for easier integration and usage -- Fixed some static analyzer warnings +* Added Star-Rating, the simplest form of feedback from users, both automatically and manually. +* Improved event recording performance and safety for APM and Auto View Tracking. +* Added custom HTTP header field support for requests, both on initial configuration and later. +* Standardized internal logging grammar and formatting for easier debugging +* Improved headerdocs grammar and formatting for easier integration and usage +* Fixed some static analyzer warnings ## 16.06.1 -- Added support for certificate pinning. -- Added deleting of user details properties on server by setting them as NSNull. -- Implemented switching between GET and POST depending on data size on requests. -- Fixed a URL encoding issue which causes problems for Asian languages and some JSON payloads. -- Fixed custom crash log formatter. +* Added support for certificate pinning. +* Added deleting of user details properties on server by setting them as NSNull. +* Implemented switching between GET and POST depending on data size on requests. +* Fixed a URL encoding issue which causes problems for Asian languages and some JSON payloads. +* Fixed custom crash log formatter. ## 16.06 -- Fixed a problem with changing device ID (for system generated device IDs) -- Added isTestDevice flag to mark test devices for Push Notifications -- Improved Auto View Tracking by ignoring non-visible foundation UIViewController subclasses -- Implemented manually adding exception UIViewController subclasses for Auto View Tracking -- Changed default device ID type for tvOS from IDFA to NSUUID -- Added stored requests limit -- Added optional parameters ISOCountryCode, city and location for advanced segmentation -- Discarded timed events persistency -- Added buildUUID and build number to Crash Reports -- Added SDK name (language-origin-platform) to all requests -- Changed default alert title for push messages -- Other minor improvements like better internal logging, standardization, whitespacing, code cleaning, commenting, pragma marking and HeaderDocing +* Fixed a problem with changing device ID (for system generated device IDs) +* Added isTestDevice flag to mark test devices for Push Notifications +* Improved Auto View Tracking by ignoring non-visible foundation UIViewController subclasses +* Implemented manually adding exception UIViewController subclasses for Auto View Tracking +* Changed default device ID type for tvOS from IDFA to NSUUID +* Added stored requests limit +* Added optional parameters ISOCountryCode, city and location for advanced segmentation +* Discarded timed events persistency +* Added buildUUID and build number to Crash Reports +* Added SDK name (language-origin-platform) to all requests +* Changed default alert title for push messages +* Other minor improvements like better internal logging, standardization, whitespacing, code cleaning, commenting, pragma marking and HeaderDocing # 16.02.01 -- Swithed to POST method for all requests by default -- Fixed some issues with Crash Reporting persistency -- Fixed some issues with CocoaPods v1.0.0 -- Other minor fixes and improvements +* Swithed to POST method for all requests by default +* Fixed some issues with Crash Reporting persistency +* Fixed some issues with CocoaPods v1.0.0 +* Other minor fixes and improvements ## 16.02 Completely re-written iOS SDK with watchOS, tvOS & OSX support -- APM -- Manual/Auto ViewTracking -- UserDetails modifiers -- watchOS 2 support -- tvOS support -- Configurable starting -- Custom or system provided (IDFA, IDFV, OpenUDID) device ID -- Changing/merging device ID on runtime -- Persistency without CoreData -- Various performance improvements and minor bugfixes +* APM +* Manual/Auto ViewTracking +* UserDetails modifiers +* watchOS 2 support +* tvOS support +* Configurable starting +* Custom or system provided (IDFA, IDFV, OpenUDID) device ID +* Changing/merging device ID on runtime +* Persistency without CoreData +* Various performance improvements and minor bugfixes ## 15.06.01 @@ -643,8 +661,8 @@ Updated CocoaPods spec ## 15.06 -- Added WatchKit support -- Added CrashReporting support -- Fixed minor problems with Messaging -- Added manually ending sessions on background fetch -- Switched to Ubuntu version numbering +* Added WatchKit support +* Added CrashReporting support +* Fixed minor problems with Messaging +* Added manually ending sessions on background fetch +* Switched to Ubuntu version numbering diff --git a/ios/src/Countly-PL.podspec b/ios/src/Countly-PL.podspec index 847bd0ae..8a44ca2f 100644 --- a/ios/src/Countly-PL.podspec +++ b/ios/src/Countly-PL.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Countly-PL' - s.version = '23.8.2' + s.version = '23.12.0' s.license = { :type => 'MIT', :file => 'LICENSE' } s.summary = 'Countly is an innovative, real-time, open source mobile analytics platform.' s.homepage = 'https://github.com/Countly/countly-sdk-ios' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = '*.{h,m}' - core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h' + core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h' core.preserve_path = 'countly_dsym_uploader.sh' core.ios.frameworks = ['Foundation', 'UIKit', 'UserNotifications', 'CoreLocation', 'WebKit', 'CoreTelephony', 'WatchConnectivity'] end diff --git a/ios/src/Countly.m b/ios/src/Countly.m index 4467d5a3..bb68fe63 100644 --- a/ios/src/Countly.m +++ b/ios/src/Countly.m @@ -86,7 +86,7 @@ - (void)startWithConfig:(CountlyConfig *)config if (!config.host.length || [config.host isEqualToString:@"https://YOUR_COUNTLY_SERVER"]) [NSException raise:@"CountlyHostNotSetException" format:@"host property on CountlyConfig object is not set"]; - if([CountlyCommon.sharedInstance.SDKName isEqualToString:kCountlySDKName] && [CountlyCommon.sharedInstance.SDKVersion isEqualToString:kCountlySDKVersion]) + if ([CountlyCommon.sharedInstance.SDKName isEqualToString:kCountlySDKName] && [CountlyCommon.sharedInstance.SDKVersion isEqualToString:kCountlySDKVersion]) { CLY_LOG_I(@"Initializing with %@ SDK v%@ on %@ with %@ %@", CountlyCommon.sharedInstance.SDKName, @@ -121,6 +121,7 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyConnectionManager.sharedInstance.URLSessionConfiguration = config.URLSessionConfiguration; CountlyPersistency.sharedInstance.eventSendThreshold = config.eventSendThreshold; + CountlyPersistency.sharedInstance.requestDropAgeHours = config.requestDropAgeHours; CountlyPersistency.sharedInstance.storedRequestsLimit = MAX(1, config.storedRequestsLimit); CountlyCommon.sharedInstance.manualSessionHandling = config.manualSessionHandling; @@ -135,7 +136,7 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyCommon.sharedInstance.enableServerConfiguration = config.enableServerConfiguration; // Fetch server configs if 'enableServerConfiguration' is true. - if(config.enableServerConfiguration) + if (config.enableServerConfiguration) { [CountlyServerConfig.sharedInstance fetchServerConfig]; } @@ -147,7 +148,14 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyFeedbacks.sharedInstance.ratingCompletionForAutoAsk = config.starRatingCompletion; [CountlyFeedbacks.sharedInstance checkForStarRatingAutoAsk]; - [CountlyLocationManager.sharedInstance updateLocation:config.location city:config.city ISOCountryCode:config.ISOCountryCode IP:config.IP]; + if(config.disableLocation) + { + [CountlyLocationManager.sharedInstance disableLocation]; + } + else + { + [CountlyLocationManager.sharedInstance updateLocation:config.location city:config.city ISOCountryCode:config.ISOCountryCode IP:config.IP]; + } #endif if (!CountlyCommon.sharedInstance.manualSessionHandling) @@ -194,11 +202,11 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyViewTrackingInternal.sharedInstance.isEnabledOnInitialConfig = YES; [CountlyViewTrackingInternal.sharedInstance startAutoViewTracking]; } - if(config.automaticViewTrackingExclusionList) { + if (config.automaticViewTrackingExclusionList) { [CountlyViewTrackingInternal.sharedInstance addAutoViewTrackingExclutionList:config.automaticViewTrackingExclusionList]; } #endif - if(config.globalViewSegmentation) { + if (config.globalViewSegmentation) { [CountlyViewTrackingInternal.sharedInstance setGlobalViewSegmentation:config.globalViewSegmentation]; } timer = [NSTimer timerWithTimeInterval:config.updateSessionPeriod target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; @@ -207,10 +215,10 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyRemoteConfigInternal.sharedInstance.isRCAutomaticTriggersEnabled = config.enableRemoteConfigAutomaticTriggers || config.enableRemoteConfig; CountlyRemoteConfigInternal.sharedInstance.isRCValueCachingEnabled = config.enableRemoteConfigValueCaching; CountlyRemoteConfigInternal.sharedInstance.remoteConfigCompletionHandler = config.remoteConfigCompletionHandler; - if(config.getRemoteConfigGlobalCallbacks) { + if (config.getRemoteConfigGlobalCallbacks) { CountlyRemoteConfigInternal.sharedInstance.remoteConfigGlobalCallbacks = config.getRemoteConfigGlobalCallbacks; } - if(config.enrollABOnRCDownload) { + if (config.enrollABOnRCDownload) { CountlyRemoteConfigInternal.sharedInstance.enrollABOnRCDownload = config.enrollABOnRCDownload; } [CountlyRemoteConfigInternal.sharedInstance downloadRemoteConfigAutomatically]; @@ -224,7 +232,7 @@ - (void)startWithConfig:(CountlyConfig *)config [CountlyConnectionManager.sharedInstance proceedOnQueue]; //TODO: Should move at the top after checking the the edge cases of current implementation - if(config.enableAllConsents) + if (config.enableAllConsents) [self giveAllConsents]; else if (config.consents) [self giveConsentForFeatures:config.consents]; @@ -248,7 +256,7 @@ - (void)onTimer:(NSTimer *)timer [CountlyConnectionManager.sharedInstance updateSession]; } // this condtion is called only when both manual session handling and hybrid mode is enabled. - else if(CountlyCommon.sharedInstance.enableManualSessionControlHybridMode) + else if (CountlyCommon.sharedInstance.enableManualSessionControlHybridMode) { [CountlyConnectionManager.sharedInstance updateSession]; } @@ -555,7 +563,7 @@ - (void)setNewDeviceID:(NSString *)deviceID onServer:(BOOL)onServer [CountlyRemoteConfigInternal.sharedInstance clearCachedRemoteConfig]; - if(![deviceID isEqualToString:CLYTemporaryDeviceID] ) + if (![deviceID isEqualToString:CLYTemporaryDeviceID] ) { [CountlyRemoteConfigInternal.sharedInstance downloadRemoteConfigAutomatically]; } @@ -738,7 +746,7 @@ - (void)recordEvent:(NSString *)key segmentation:(NSDictionary *)segmentation co BOOL isReservedEvent = [self isReservedEvent:key]; // If the event is not reserved, assign the previous event ID to the current event's PEID property, or an empty string if previousEventID is nil. Then, update previousEventID to the current event's ID. - if(!isReservedEvent) + if (!isReservedEvent) { event.PEID = previousEventID ?: @""; previousEventID = event.ID; diff --git a/ios/src/Countly.podspec b/ios/src/Countly.podspec index e08156bf..2ea342ea 100644 --- a/ios/src/Countly.podspec +++ b/ios/src/Countly.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Countly' - s.version = '23.8.2' + s.version = '23.12.0' s.license = { :type => 'MIT', :file => 'LICENSE' } s.summary = 'Countly is an innovative, real-time, open source mobile analytics platform.' s.homepage = 'https://github.com/Countly/countly-sdk-ios' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = '*.{h,m}' - core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h' + core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h' core.preserve_path = 'countly_dsym_uploader.sh' core.ios.frameworks = ['Foundation', 'UIKit', 'UserNotifications', 'CoreLocation', 'WebKit', 'CoreTelephony', 'WatchConnectivity'] end diff --git a/ios/src/Countly.xcodeproj/project.pbxproj b/ios/src/Countly.xcodeproj/project.pbxproj index e50b6f3b..581a8f39 100644 --- a/ios/src/Countly.xcodeproj/project.pbxproj +++ b/ios/src/Countly.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ 1A3A576529ED47BD0041B7BE /* CountlyServerConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A3A576429ED47B50041B7BE /* CountlyServerConfig.h */; }; 1A423E9E2A271E46008C4757 /* CountlyRCData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A423E9D2A271E46008C4757 /* CountlyRCData.m */; }; 1A423EA02A271FE0008C4757 /* CountlyRCData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A423E9F2A271E52008C4757 /* CountlyRCData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A478D032AB314750056A5E7 /* CountlyExperimentInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A9027FE2AB197B50044EBCF /* CountlyExperimentInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */; }; 1ACA5DC12A309E7F001F770B /* CountlyRemoteConfigInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ACA5DBF2A309E7F001F770B /* CountlyRemoteConfigInternal.h */; }; 1ACA5DC22A309E7F001F770B /* CountlyRemoteConfigInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACA5DC02A309E7F001F770B /* CountlyRemoteConfigInternal.m */; }; 3B20A9872245225A00E3D7AE /* Countly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B20A9852245225A00E3D7AE /* Countly.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -64,6 +66,8 @@ 1A3A576429ED47B50041B7BE /* CountlyServerConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyServerConfig.h; sourceTree = ""; }; 1A423E9D2A271E46008C4757 /* CountlyRCData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyRCData.m; sourceTree = ""; }; 1A423E9F2A271E52008C4757 /* CountlyRCData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyRCData.h; sourceTree = ""; }; + 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyExperimentInformation.m; sourceTree = ""; }; + 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyExperimentInformation.h; sourceTree = ""; }; 1ACA5DBF2A309E7F001F770B /* CountlyRemoteConfigInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRemoteConfigInternal.h; sourceTree = ""; }; 1ACA5DC02A309E7F001F770B /* CountlyRemoteConfigInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRemoteConfigInternal.m; sourceTree = ""; }; 3B20A9822245225A00E3D7AE /* Countly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Countly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -120,6 +124,8 @@ 3B20A9782245225A00E3D7AE = { isa = PBXGroup; children = ( + 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */, + 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */, 1A31106E2A7141AF001CB507 /* CountlyViewTracking.h */, 1A31106F2A7141AF001CB507 /* CountlyViewTracking.m */, 1A3110642A7128DC001CB507 /* CountlyViewData.h */, @@ -186,6 +192,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 1A478D032AB314750056A5E7 /* CountlyExperimentInformation.h in Headers */, 3B20A9D32245228700E3D7AE /* CountlyPushNotifications.h in Headers */, 3B20A9C42245228700E3D7AE /* CountlyUserDetails.h in Headers */, 3B20A9CA2245228700E3D7AE /* CountlyConfig.h in Headers */, @@ -301,6 +308,7 @@ 3B20A9B42245228700E3D7AE /* CountlyPushNotifications.m in Sources */, 3B20A9C92245228700E3D7AE /* CountlyUserDetails.m in Sources */, 3B20A9D12245228700E3D7AE /* CountlyConfig.m in Sources */, + 1A9027FE2AB197B50044EBCF /* CountlyExperimentInformation.m in Sources */, 3B20A9C82245228700E3D7AE /* CountlyViewTrackingInternal.m in Sources */, 3B20A9D22245228700E3D7AE /* CountlyLocationManager.m in Sources */, ); @@ -312,6 +320,7 @@ 3B20A9882245225A00E3D7AE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -367,7 +376,9 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; + SDKROOT = ""; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -376,6 +387,7 @@ 3B20A9892245225A00E3D7AE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -424,7 +436,9 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - SDKROOT = iphoneos; + SDKROOT = ""; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -450,7 +464,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 23.8.2; + MARKETING_VERSION = 23.12.0; PRODUCT_BUNDLE_IDENTIFIER = ly.count.CountlyiOSSDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -479,7 +493,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 23.8.2; + MARKETING_VERSION = 23.12.0; PRODUCT_BUNDLE_IDENTIFIER = ly.count.CountlyiOSSDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/src/Countly.xcodeproj/project.xcworkspace/xcuserdata/muhammadjunaidakram.xcuserdatad/UserInterfaceState.xcuserstate b/ios/src/Countly.xcodeproj/project.xcworkspace/xcuserdata/muhammadjunaidakram.xcuserdatad/UserInterfaceState.xcuserstate index 40d78fb2a15ea0cb7346d79d34aaf765834394c3..7038fd5e61549cc528af476b94468603bbe4918b 100644 GIT binary patch delta 8770 zcma)h2Y3@#v-T+~*^*@yTUM8`EyAVAtZk}w~+U;h8O*5lpP+1+!_%)B%6&S>93|E6(^ zhPz-k2mk^g2MVAB77z`rzy|Cf2E>9mkOi_q4(JTJfLzcObOYVN05A{?0)xR2Fbb4{ z(O?WH17pE>Fab;fQ^7RwI+z9K0ykI!mVyS*2%11MSPwRUjbIbl1KtDggAc%I@DVrz z&Vx_D72vuGu7S_N4e$-P1%3p#A%+a(KrZxy{*VXxFaQc*AQZx2a1hF&0xF>jhC&;( z!x$I~<6t~YfbC%i*b!#HK5!T;ge7n^90SYXSXcvV;RHAZPKDFp3^)_cg$v`krXLV42nf@C>|xCM3jV*Q3^^$ZBa**jk=-ks4wb=hN5Ap2od^cGryR-#p?5lT=K+KjfK9q0f$hz_Cm&|!26oknNT zIn;u#qHobnbPL@>_t7ut0eXy{VG$N%2@b-+Sc*fi49l?sM_?V+V*|F}XdHv%aVl<$ zJK#*5g*)S(xEC(KgYaNH5|47>Qal=u!DVL^D>##z^c;3=_-5G4V_?(}786vfOurJ6OnWl~rS^$2y9geH}%al@&Erm1Skls>0NixP+Y4*c@wSYIeLeAt^h- znh}$bYR$+oY4Kjy&vn)4fm?;*M1X z`_BL~L2c`RLsjSJd1f}4qKTE*h`kxC0;|Cqu$IJ-SQ1C#>C>+8N%GBL3)l*_f$h|2Z-X7+ z9k3JZ0=wPfh(vWNN$@9tq>#23>D|3xAJ`AxrS}hlL+;@b#@@*Uhyh8wKyMxfN5Ij6 zdHJ^LnyS)@ktC^?PkYC}@j|gEFTY1^jiac{neV;Z1df3dUUmAu`yM?BK6GD?P%_{Y zsC7S$NcPJAF*xfUq6_CVf^&3qh|a79pMn;T^q+wXqyy>L=s|`T6%^`*H`OwCsD{g< z^VSyE)K)nuD3o-BAE8Sdn+808txCKOz64PX;0u!80KOs_R2_L%vkQC+ZmuJlz8!rB zz905->*-Zhj)_g+JMaUj?Vp$L{i;hF=biKAq(6ZtAZjbP1MY&K!98#v`~n_;hu~N6 z2s|b^q%-M4a!FUxjdUkHNFM1)dTj;2fv4aZcn*FCe}M2m!C&BS2p}ZANj~XI`jGuNBYOcF6$W1SVb71a5w#qPzU<T14blZl z$!O{VnU%E_HDwbsE6d9(D{SRrkx$v>u)=-R5{@e=x{q4gB(=^q4m^dWq>Rcry8nw; zeVF_Kj&Jlpum#r9MJK{Za5C8GcE!taB^m2pG@$5(6wb+0UT z)Rb0MG(y%BX8!FKb!7NDoDSa@G?p6P=bNOORJnU647Ji|1ZTn7gXxqxrDaYZH0Drf zyfWaEX&#*KUL0-33#d$sqb-3ga1ot&G1v*+aFYA$1i5@Xsq{U%4A%F{%kS5xdm~&% zpAJmy?v82eHwdnT8$i?+xC*X@Yv5YA4mQ9>*aVy5dNPSjCa;kxWGZnHLRd15yuJl) z1P0FsZiU;ZHyPj#U?S5gmOP)?WD!;4EV7s;7Nc8oPr7?u=k^pLhdrPCNysJmL8#GssNuf4NvAw)wYW@nd+7hJ1LI%xQq<$y^%pzj>;6!3*#bkTt>ZP2z5ZSKwtj;{p=aZ$xETN%bo;5A;m!Q|BFcw@@slK_R=Ow5GDEOKCMdPRy-w zmN&wmJy!qMd%k_#_c-t`WEl;9@KN#>KcUomz4xO^z3Bh@5|!)X+O<50EvXooE-@P0o;y$=N0} z6`0U|DuR@pqb7agw7GO?lViLN-MYpRbo{?wbJ5pMQn{t%6B4FNn{?wJZ+wK#fGEmB zjpCPxK94?qxzW!^3o-f}=%Qz%m(XQ$kzDa@)I}3Ax`w{|uO+{tOWq)t=#rO7*ua+< z(WR9R|HtCrq1*rU?oZS=?vkri)z>^_iO5SmDCeM@!b3ZBX+z%k&QU0qcbGgmF)2DM zF?LFH*yPxRn3(9Wl+^esQ!b!~bYs7wN0dL=N*pzgo)S)V5hWzmH8C+4A;JuY>u0H7 z@Fq-geJu|1=kWssfkKg35)>>Ak;xTGm0F_>Z4(+Eq0<{8jV7}(YG_{mE5!+&w{K}p znTPKbw%+LD^aMd?)gXG0)+<%CR-upOR(EqwETE|;H#dvY`rPUsj?#)ku{bY3r?jfN zrVrOyJ+`u<#C^3?qoCv`v&>Olokzv~GeV zfU<2a36U^4JH)bRtIZx0n->?K(5`((*IvE*^cymCn4_ehzM{6Q%u_ZdC+1|O$7NV^ zVl%R6?U<5iO^Hp)vSug5CFdk$Wv8dc#1@J*iAmH>VICuSY~*If)Tt7al2cOK7U+vT zLJyeWt^IPdX!4-MvozR6_~Pk=S3sq1n~-#&L&r{OgM5!xQ2h+>T{^1^#i4omy_{9m z)VP#=^vlhzD5g$V(#JW%S>>!Kb~biOe_2npWM(C1ch2>|VvKWQHPw)<(pzX%H{=jO zLl;^zN?W>hPwbJ`v(UX~Obo|cNxFxX#fQ-i2$cLct~D; zR%x+^Nja(}HWsB1i>XVBiHV6#aHN(L7sUX7AOR|%2WHwjN~SHNv0$nT%m6EB2WUI( z{v4+D3#}3$f)?7Y8AKa2lPTkJ)0RxVw z7?ZEa*W?EIhI~tIl3V0E^8IGa!CdTz{eg)}5`YCbko-U%v(U=I7$Rk18Vl1|n90H{ z8n4SLE8Kx&9T8ZGwKQ&F6;@*n`H|cvKQ-Y{s)R6dhukL*X>?vTcD4&gViOId*hua+ zU^Drd7++FsYy~2!DZ2-WHKpZFUHZwT%j-TosU-KjqT*N_=ab6Wh+|(?CC`cR6;6)_(g-!4JaaGXP#o{GG#-K- zG+*PP6mf-kIQgCYLH;CvHB;~vQ}{W_-z)?yq;{0kg(SOW?x(wsyKp&WQ@DbKkd$A< z<7jb1OB`HRE>1j6pAAT(AeZo-P5+{B@#S!C7$Wo&@2}6 zDfM|F*<4JS$Ob$Q&&Lb!Lc9nsW?=ve1uP6?p^$|l7K%4uH(o;P5c)xHuu#InAWA|! zpOaMF^LwsoaKno>gJ+fI|Fj(NM!d=W)7~(@CcGJMp=9l+y&dFu8-ClP{p~CaX}~*J zDDz+-!aaPi(&eKwG?(>_i?^k;ZgLOa>mv`X1MlL4bOzXq)HdKlEL2hhzL4h#{)p0K zd=$TrkKyC^1pWY@#2?~Q_%sVuEL5{l!$K_!Ls{5{g<&iVXJG^jbzATm%DzmLHRJO> z#*8lj6ASfTzD#u%>7&dnw0L=0Yu%NJZ+MjY4NKbrzQPON`u~w;dxS&wHX6DH&f= z;(gUxM$7*)YjI`y*jmbe+j_r_s;sW*=Z!UkeDB4^+dQqK;*845F}z`a2M{Y7OMx{Dst)Zj<+mlC@|aTx968?l*o@vXQoZPM4_nRqtM zVDqW>EvAmP6gShB{3g7`<0kkW+L+&iA2SSXtPfx&G0T{p%n{}s^9l1A)52V0t}xe_ z>&#EgUFIJ13-ge9#5`f1GS4}IoG?xTr!!|Tr-JhuX9{Ny$IV&FsdsVS;;iH}b2e}` zakg-_ao*;9#<|bM+z@UA*TS`O?c7*yJhwf!BR7qk!Oi04aEEfoap!Q?b9ZrfbN6uf zagTD(a9g-HxZiQ_`SJW@eo8;JU#MT0UxZ%=zZ}0}Kd0YF{~&+0f0lnY{~G^m{@?mP z_5YhE;7NGFybzvC#nbRYd11Wvyso_dyy3heUI}jmZxnAFubNlOo4}jMo6K9n+s!-5 zyU4rDyT|*LFW}4gVf-k5B0r6v!O!An^E>l%`Q7+K_%-|~{Av8@{2BaN{5gC#e>HzC ze;t1_{}BH;|6~3|{$2iq0A4_NKxBYDpjSY@fbjtnTmjPqW(Uj-m>=+Fz>c0oA7Pn zA>m=+QQ4YMd_kUQMRb7sJkdn)Jx}MVS;=|Hr;-bj&m}h{ zKS~}4!JvSkz#vhOBxqdFq@YDXOM|us?Fl*>bS&sZaA>eGI6gQfI4ihEa9yx#O7N!O zy}^frKMMXh_+0QO!B>O73ceZqx703eFYPVOm-dtPmkyK;mJXE`N*&T-sZ%;h`kHjA zlt`yZr%Pu@XG!Ns=Sdex7fH8E&q{v@2?|LH84^N5)`lDjxgK&W7 zq`Xur9Z58bm9TjPc3`LeAN6|&m zRnc8hs+gtNrZ}&7s8lH1D+enlDeIN%lugR@%8kl*ln0cDl!ui^mB*APl%FbFl$VrO zm7goWP(E|1xT*kEph~2Ys$?pKN~JQZl2q+f9aNoES*jdW7gbl)Kvj`ylFFs3S8Y}u zSAC%RP<2{$Ms-$oUUfzFh3YHS4b``*`>F@3UsaFQNX@9ZYJas@tyQ;ChpTn!7(%Sjjp}Cg2K6TOPW5i}UiE(U0resE zHT4sXQWK}?q{+}^X*z3iHQh9YnleqLW}K!*GhS1tnWtH*S)o~_S)*B}*{<26*{69| zb5L_kb3$`cb4v4(=8EQ)<~J?S25O~RnO31yX~VTTtwC$lnzeD-PTDkWx=Wj>&DQqO z_S5#)4$=H52YRGu^nQB2UZ8i0^g;R%y+W_j+w|S^1N4>p8T#e=z4}x7Z}s=}PxMdq&-H&8 zuz_RnGw=)nhG;{HVZLF7VYOkcq0!K6*kE|uu-|ahaN2Oj&|>)9@U`Kt;lAO4;gR8q z;b|m@X^d&6 zX_3ioT4q{q+HBfw+GjdoI%GOxI%T?Ox^DW)^o{A3>5l21>4E8y>51u2Gh;TJv&}us z1?GX~A!gSw^B8lTd9rz`nKe&0&os|5*PBQU^&9Ig>-W|lt-skAo1e|a zw*}h7wjf)W&16fob+L7`<=J}M`r7*22HA$%hTDp5<85`e$+jsrVtd^-!#3MC&$hs} z$hOk9%l5JDE8Al`-!8RB+q3Q6?S1SM>{INs?Dh6__9pv!`$qd7`+oZY`+N4I_G9)l o_H*`6?4Q{`w_mq^Y5(4S$NsbZeweS~MaXw%a((C4qy54E00{7TsQ>@~ literal 138550 zcmeEv2YeJo`~S}DmEF6|^?sMT3tb=~Jplwsh0rDR7DI9*fi!XnMMQV3SOKwv3IS13 zQ9%X!Yj3ECqJq8m-YfrSc5m-)LqL81FRy;y&ksI?-0a-!JY~MmGtbOCGq1I=A=;jq z`2vF&%&?4x(K0$l&lslnS{!MMHncR)=vCcTQ{MoeCiiM@X`SAyW!{2FO?%YFpffjA zSfbaoAEGSW&ksgNoO*cK};r-#bh%% zOa(KV8N-Za#xdiW3Cu+1cxDn)$<#6ROarrkS;#apO-wV>!YpS_VpcFGGp8`8F=sR9 zFsqq0%*D(l%sS>O=4$3<<`(8wW;?TkxsAD|*X@9$_A39%CM7o?xD2_At*e z`83 zU4kw}*Pt!vT67({9&JT8qg&9e=yr4`dIUX+o<`3jEqVdHj9x{rq1Vyd=za77`WStJ zzCd52Z_u~sJM;_s6&=J3)?qz1V+*$80eB!z#~FAK&cs^_zJuccj9aD4fsZU6TTI1$Gh;I_+I<~eh@#3 zcjIUA9{e2Mi(kZV;P>$-_zV0c{tADGf5JcG-|<0~VR_cVI$1C4WBqK1?aB6H`?1Hc z{n-I*E<2PR!IrXRY&koc9m7swC$f{-DQpwl%(k$t>>{>}jk4`*2fLVE!Y*e|Wlv*I zXU}2JW!JJ7u@|$Kv6r(~u$}BCb~AeudmFopy@$P*y^np6eTaRGeVl!QeUg2iJ;1)f zzQexDzQ=yVe#U;ze$9Tve#`!*(P(&0ipHcdYwQ}g#-j;nQZ+$MUrmN4M^m6F)C|@P z(-dinHRYO-no*kLHPbb7G}W4Uni@@=W}&80)2dmdIZ;D2XKK#ToU1ucvs!bJ=3>p| znkzKxG@CUyXl~Kmrny~nhvqKLeVY3<4{2V}ysCLk^Sb5@&6}FHG;eF((Y&j9PxF!H zOU+lBuQlIje$xD`#adRY(Q36RT9ekS^=L!dUfO=zW3>IX8QN@ZjGVPVxjoMD_7VTE;4ceQv zw`gzG-lcs&`>6Iw?Ni!kwa;r`(7vqQuYFtlk@j=#*V=Ei-)eu<{;K^=hjdtH)Y)`y zonIHwrRvgjy>)$b{dEI$19f@2V|7KkGF`cDv~G-Uf^MR2vTllQt}dcmpljB(=vsB{ zx(?kk-HE!Bb*Jc7>Q?D4(p{#zTz7@;D&5t(O}fpx>vXs3cIocbJ)nC~_mJ)}-Q&95 zx~Fx|=|0kZtouawsqQn~=ejR+U+TWneXaXO_k-?ty+*Iqr|3<3v)--u=+pH5^y&I6 zeYQSFU!WhVKUP0NU!*VAkI_%kPt(uR&(_b;SL^5L=j-eA3-yiq4*f}bqCZ1_rv4oL zx%yT5)%uI{7wfOmU!&iu-=^QLzeB%Mf4BY~{k{4J^pEJD(eKkA(7&#KTmO#!1N}jc z;Sh&8meX)rPRHpvj^nu$&cXROKi8A%#SP@rxhyW58_W&oin(%bBsYdTo}0u?e-_1YGKgaLoU*uonU*TWn-{jxo z-{arsKjuH-zu>>*zvaK;|{NV+a^h4QYlRhCYVA zh5?3whD<}2AaAWN0%iHY_nLH=JY;4a9JU;Y`ChhI0+8466+n87?+lZn(m5mEmf`Cc|dKb%yH= zHyO4Wwi|XBb{cjW?lIhJc);+W;Zeh5hNld>4SNjF8TJ`oG#oIzVtB*wrr}+~dxnn; z9~(Y5d|~*;@U7uT!%v3a48I$(QD-z5O-7s1W%Ls zR@fuFEbJFP5U6P=^WF!rd6iZri)A$n=Ut9VYyUl)cz#KNG znR}c2nERUtm`lv1<}!1+d8B!ixxzf!JjOiMJkET)dAfP7xyoE;t~WQB7n$44=a|nm zpJzVbe1UnDd9`_s`9kwr^F`*%%vYN?n75d(HQ#K$#eA!IyLpHCZu33n7tH(2FPdL6 zzii%bK45;u{Hpmi^Xulf%^#URHh*IN%KWwYXY()S-^~XtdJAU>Thc5&EIlo~EWIs# zEPXBgEXP>-TQV$pmV8TrrO-0ma-3zPWt64DGTJi6QfZlNX|yz1nk_AsR?8wwnr$%K^*VmUk?_SbnwqX8GN6(8^em6*7?>tYrVDAy2yIA^&IQD*7L0ATQ9J# zvaYtSv0i9hYrWKZmGx@t2J056{)PQZ`;YdY>_0oOgLU{F0Y|DM=m#6gx&c#yDymwT_5mzN5}j?`Uu=a4d8*I+`4d97`R`9H%%$$4bZ9j&mI6I?i)k z-MC;hgE5=d5woIvbr$&NG~6I?r;hbe`=z$9b;vJm>k&3!JN*Yn@j( z*E!caJDr=HH#l!}-sIfoyu-QE`K)t~^Eu~U=kv}Noco+FI$v_W?A-5s&H1kLJ?AIR zPo3X7zjJ<{5^?_EJm_Lv9+%hUbNO8XSE?)M3c13rG*=H-A6L37$Cc|k)-}vE+*R%x z>8f&_;Hq}bbJe(NT@lxOSDmZg)!=G!wYyGqEq9&fI^A`K>rB@Lu2rsUUDvs;cWrgu z;JVRulWUvnX4fsQTV1!i?s47gddT&#Yq#rZ*E6mcT`#%5aDD0e%JsGD8`rn4?_A%z zesKNh`pNa1TjSQcjc&p1a68>Dx7!_Zhuwwl!R{gMq3&bd!`#E&$GJzii`>QTa`!m* zc=u%Y6!#qWTz8eb&Ry>o-Nb#W`!x6I?latHy3ca2bf4`$$9;kOV)r`tdiQ4cHSR6$ zZSI@hkGUUrKjD7T{givR`)T(x?q}V5+|Rl9xnFg^=6=WhuKQE>XYSA4-@AYCm^~Jc z)noJ6Jr0l4gna_?djtg=t=kFdGb94oJ)XPf7C z&mEqfo_js_c^>sV=6T$+$Mc-$BhSa4PduM`KJ$F;`NH$1=PS?Go^L!qcz*XB^lH62 zugPonTD(@T*X#3UdvmKI9qb+A9qK*SJHk8CJI*`aJJmbQJKa0OTkW0a zJ<+?|dy;pB_hj!WUeQaur+QEGp6*@gUFBWvy~KN|_iFD3??!K@cdPdX??c{)y^nYw z^*-i(-1~(0N$*qM-QK6Y&v{?=?)Sdoebf7)_apDe-cP*Wc)#@tz7(IyXZBfqR-esh z_c?q{pUda-rTO~$`uQ?_S-xyvj&G>%Sl?vd6yH?eG~aaJ4Bt%OEZ=P39N%2uJYR!v zfv?rK$hXXQqHnqHB;V=2GkjP2uJT>&+u+;i>-25%ZT4N`+v2;{cY|-cZ-?(r-(9{3 zeGmB__C4Zz+V_m_ecuPZ4}Bl`KK6a$`_%WD?{nW5zAt^>`hM{vKlU5^M!(>9_?`ZA ze};dMKhvM(&-Ul|bNzY#e1Cy|sK3}>;;-*t0<-gj0t^Ydzzx)sQAM`)uf7t(s|55*A z{>S}K_@DGYJ6=n?1{ z7!Vj3NDt%%@&n@o69N+h#|I__Dg%=PQvy>1(*n~2vja7OhQNYATOb-}51bTO5x6*T zN#N4JWr52BR|M7t)(5T(Tot%Fuqm)La6{n6!1ln7z}Y~)P)M#pZYDeng)Fr9QQ%_A@ znR<5Wn$!zZ*QQ>Sx<2*F)Z0_N~0Lrv94xTk7wr2ZKxy1#yrKYJ%FJE@%i^gSMbO=neXUJ%T-hy@I`ieS#Um zLBWy1QNfDf=-`;(*xtDcBKQ9K0a7D!4khCU{|R zZSbPt#lcI0mj*8jt`BYsULV{V+#cK!ye)Wp@ZR8k!54!s1z!&C4;~1<5_~oITJZJY z8^Je&?*=~!ej5Bb_)YMa;IF~og1?7!A$=$m3Ww4{JwiQ0y+XZ1eL{Uh{X)lt(nGnS zA)%q6l2B==EHo}OJ~Tg67pf06gcgJrh8janq2^Fas5R6cS{^znv?6p`==9Keq4Pr* zgjR(v4P6$xC3I_OduT`Kw$SaNJ3>1{yFzz{?h4%(dL;BzXm{v^(7w=%q1QuignkJ9 z82TynbLf}Quc6;UzlRQnnJ@}#!$LSEY!5rafpBU#7!HN|hWmv_gp0z(;gWD^xGY>A z9vL1Lt_Y6~j}K1?PYurw&k0Au^TT!F`fzJ_QTXieIpK4|=Y`J?Ul3juUL9T&zA(Ht zd};Wq@aFI};hVzS!Z(L^hIfVcgr5uV4L=`#A-pgAV)&)-%i;au1L4=h?}gtFe;WQQ z{9X9_@DJgGX-t|fO`pc4h11f~dZhJC>y_3!txsCtw0>#Fr1ei5kTx(aJuM?`P+DeM zR@$(%;c3UEjYum>D^4p(D@_}nHaTrd+SIgZY17l@rPZX(Pg|U}ByDNhva}P^R-~Pr zc52$nwDZzdrL9lfFr`;>M`PpjObTOS%#4MxGp=dlD>D{GmPKd6|FO8<)Lu1>)zN4t zV`Xe27THe5!8kJ=~=nC<>|SlIa%q&gELFh^MHW-tlXl){PL12OP_d) z@a^L2wrSPTsSVMFd5w{24ej-n4b63p5qMH%>6iQ_xerz2D2WPHWq3}1C8P4>-p2=hKnF6Me8O#h}hBC)8!$gy47A>Mxw25}nAv#6Z^}yW` zOc7JelrW`C8GITE4EBguiC2rA;wJGL_;j6^QDw0}XDaJkmW;1n+)!5yq{>C{k40?} zAlM4ErnEOSHncZHqSG2`+w0|O70uCB2pPAuC91{0DOH<2wIQ;kG%~NFt_~z-v5$*1 zwX`i8*;d_JpD0!O5P!oQcwJd-L#$n1A%8M6hv|PEGliMTOk<`qGnkpoEM~Uo6@8*# z42Y>>Pz;IT>zKJr6>|bp&CFwJm|7+xrip{ZOmV1KCe9FR#if+&{?lt(Y9kqx_?C{g znn+Borc`9a`=3!#U)@|6i30VNkw&00QX78;(eaUOEgh}$1Bj(Vt)B5F$G5aM)I_3V z8rn1DUz5J)kJpkOD_qYg2c@sFgb(vHu4Yx1!!RJipt@9=VN3?UV|2J4$~O%kCnMgVZzi)ug_qLEs_j>z0-4MnesEm0UsEzNVHG0m!g??gA`6g^_T>Z^e_ z37wpwljnOfu|J(gq34K2@`s)y&e|aTwt=(yGlq>BJ7xN;+Pc7K5|G^Nb|C}iE z_EP3DfW)$;t&K9MP3UNEY-o7c=5Jvr z)NEyL05rKtEC84(6bA#6458zqNB84Q0)>o)QjF9VAwzqZEw0E?@h)X+CJ!!-r7E$E3jtDw(6&Y6k9Jc)l^g1Fw9bRg*7mC#G zV(zEtbvJVlb1!qBc&s=~94;P5(dz-`K?%J^h(-Se^g057C|!Mud76UGZn1bH^Nd*X zhoG|;K<9-&0-e$cR<^eqb%q{W{O_aAHeHI<;qeE1_2@FnH|)4!8>nb|Lv ziz7RkSD07DQQ~xp}KWz=0oNq=3{Z3I9{9}PNYq{V$K2pdu2^aYow&Ur6o$8-~e?B%BrKw zCbv{HgBt*D!SS>gC3JQ+OX?7vT(mU9Fq1x2f{zW>uSRk^EDUH6crL}&?KSljz$ZtR zwoBiiJRd&2$b8Fu$9&KH!2Aea%umeE%rDHZ%x}!^Gpd_w>RZ~NH#4M0Cr8?vW;D@8 zN~)ugnbg&)mHIhTdMtHDoGKpAiHtZ!oc01^Mhrp-BbNCUb~fms7ci_F8)_QbOBj){{+n2(B+z@nRKTo7ga62S)l9IWo7C3J;|>4&)@!p)us8q- zd1Duwwb7v16);RGCbRKR8K&uzzHX?!1KP9NI}J9K(X$Mo2I@~YQ&-9YrcR$a>6zl6 zJAJ90{y-d4dyY6>hN{kBC>dN|mP$9K!RveU>NNDMvbbZwULJ|m&a19j2y^PXNIMvd zR22eG1V?oyVDNlEVLG{6$y~~80Dty6*fg~hu=rWn9`yliiuwkC;UJ7dBW#CCMIqD+ zHbWK3U5TS;Z~3$G6O|~cd@L%3;0_vwhNI&E!;4TcDiI^%e6dcf7aPO{;=*fD8Pgk} zeH5yI5KnKh5h6OxV!OBm{*T3WVxgBwFrAjeD3uEvT3aIkV&GQD^F+XqvS#Yl!+h9G zC+M*$(&V-X_`Ed!1apLHa7}8ZNt0aM7mDL^xk_n{HDUhzXr#S3GQXuQ5^ot0pEg-j zA8ASy#$QKAb$N9Iy!tTxaY*r*Od6iaE`aDvL1FHS6`aDMX=nx=Fw@1BjcBIWN(T%j zK=MqYMN!&QrRrRC0@HsZsuCA%MAc%On4wZNrB(#h(OUDx=teMEV6eKa)rgwouWb=K z#JJ3Va z0VM|>Nwby7ZPZJIsh;E}f|uzoEgl({DmBgUOb#~CxjPM8O=xahHmRez8I-2Dv885V zbS`DM9N&|bEH$ZS1+)O~Zim{j)+|_|?J{%~)BhTDIl2O^L+jC%A`wp&PZLiU&$tF% z4e_&ns1t1x&jgCx;yL1aN)t6SQpZ&a3G+9lyr>bPXSK^{N1MxA+QvtgOswvJNPt9N zl_d-6jjCQ8k-dP%#$`%7B@?Ge?bgwb);BcPwnb#uSvEYs|zJ?rwAsyz5?cAGi(w zf`1R9htR`-#Y*gWY>VvI%uP)4!RM+6?#6>&lUiEZVFX9ya`kvYZ+xrBQ+h=<0@-j+|bt2Ok>*eTV#qJL%TPl$I%n$ zN%WL>fq0>Kv3QAi+4JZb^eoV}2fWw4GZXKeBK1aG1?s=1%95TLu4!zE!h}8CGb`NC z98TtP1|ZawRvL&dYinz1>vxRIM=yOUPjmZD0`tm!zL|@H~ ztESYGP3TM7ml@gfYV)!q1(}&(Ke|Kko+H{eNCr;di5ux)PlJKm zHnEM4qP9qF2{`R_5XmlE3YbK(tfDk3>&kCv*9LK2+^ol1#1I{X7BLn#Z)Exbgg}da ziVIPSU@^d=Q8+oE8CAZtiF;3nR5M{()7UJ}Ler zhH~X?Elu&!q%>{AL8ku=*p408iCx%@J=lwV*pCA^RlHu@D&8R8DBdJ)6K@u85pNZ@ zi#u+>A#^TG#(LnMxEJmXld`_JA3jFB4K(Erai_RTyp!PB1kWS5ncxqueI@J5iR+^fI>b8bxOS1&>Q-I+y&d6Vtq2Da41RbuG?aLY?Gm{^NOC$5E zI~v<3(k<>$YA@891xCf$r5}p1>Dk)W&;$`<<*~FizE=Hp07)5`BW)55RAO_-RWEI5 zYB(_t>vmAvSU04~^4dr^)=lVKLo2K%Q5H;;-#E5!c-@q%z5PT9A0Vr2P0;JZx6d(@s2`S(#igb3$vRxuO}CsiGD}QGsGy!t{s0 zdxoUCxEz2Rj}-3`*C`c7cN5+Y@26b5aE6snK@O8H(0PL{;Mm(|;45hih=H_>lOp_{b(aAJ^e} z@lk?@5mZN&(nc9k6pg(+W;!j3rouys_u#*kE`ynILyb}*GpZTwzS-i#Ew~jg!fiN; z+aVmW7%#y~@iKfOUXD+~EAYwq6f9zbPsOL<)A1SjOnersv_2-jDt;(_N06VOz69kE zbR0or2%1XJJc7<3Xf;7s5VV<~n+dv;poaVm z@cH-xP?}YEHC}@+#A}&f@x}NOd?~&RgTeFG##U%mFgjjZSxtigM})3t(#d*kPTp19 z%~5*XBN1K)&}x>JtYZE~*ZNk~Q~I7+N)M(?8Vlc6J|%E79@-aoi!Xzzeq4M-JRrU( z?pHYvcpYAkuS5^xtI@gQ9`Q->d9dkEh^wnCgSxlrviZ)4qaN5#IczRVa1+|yi8teG z#HYk(;+7ovcRkp`-Qv^KaNA>sx-_yFR`V*F=eNMT%N?_kc$;J+pQScZnP)zacYq{r z!?)u*m|v6Wp3&aW1gcuy)G9tF?iC?`Q%!k4WYC~N6yu_UnmX#Mo0_U?7j!gNH`G=y zglN6qxC8aWo59<5!N-p~?N9wzrxMuofZ-9QMe#we{R-c~2R zhg#U~9zm!E--qwV|C-qfewgfci2Fo{OHcpLb~j@wU4w0HYgr(7_96W6Ea2=~q z0K$?Ap2v?t*B%EAe-htL_czRgz!hLzMq8v2LSu^~pgk{%&&iEFjh_LZ6qK$LKTRq1 zwsy>eU{!1{1XND1NsmfPzu=<9Rfw*)$PlD3EMsD%t~%NgRaS85N~Z$?&M{t>(!nD^ zvHaTSG4M&6qe{!yN%+!<_tAcI`|Qw>{E{@155P!%6~BgG7vGe|#%nM(J`mp%-&c=~ zH}PBXvGI=hx-vFoP5*#u`iJ-<@eT3qgr>iQKLbsFQ+$hRx+|t!C2iHwdKl6zZ7@v& zWw&;t?23|qPnBGJS61iRqoU4Tx|1ya?#n^DFNw0_b z1dVF{)j{N!B>}I38ATHWrz7K9AQ~=3s1KFNK)jaCUjEkQbh^aODP@dOzNGHzw((b);po1M?rK@_MryMXCOkRZkWnh3HGj0%g-PWmq z8NRgp3uXd`wgRgd;EBhb6R6Yk&{m}AVkLEqGFqesa2>SPMZQh^imbk0r2)YAm!Y&pX+rX!k~T89^!HWfJhSCqd8xf5x5+|3vXE zf=u*>S-i|*u?$dzeFl3Lgbvv=39@cvR}y5SF-u=*q_MqPmWezyi8Dm`-g)dQ#?{H5 z&t5=~oghaiyP91?kdq*n*moACSMr}D(YcDlCr@GIo?U`=ZxAoDrtR%{|Ce%{S!s72 zdlhYWJ$ofVUV?n8cBjk-W^`@wP^h?u-2(7^odgv(us0IahoD}t#Rvr`SP;~cpx$b< z*v8&0qXoNzpfrL~WxOCLEcf?z%Gx^!3MSCvPCEPvtmq{9fANq<%to^JQy?Iyhl~VO zM+FHIPE;}m+)pt8-V8`q)6$et-3l{Kxn>6Sx1{KMf$a52KXWF^rIj76)cSYzfmC%A zclS`vKSiAu_8H*(9`-pF*fW57Ed=!wVg8a$P$ofHYRc6 zNr22oLDYO)9_Ca5ef3Qb6pM@3OWP^q|PM$ESaSKfF8<`0*dKT>A?w4*W> zGMbVZK3rz_$iL2TTY7bLAuOeUVQrfPlfLF|9C%Fyb>KB)f!pIX6DYSQh~U8!G?sFE z3PF<(;r1j=WrEw22pXs6_6*AHnVMMyjVI{%1h*?RRg~Kk2%4D0?Rtyh2;8ohxm|fw zxm};k?RuHpl@Rs%Gu&&FbhQJxw?wm410KapSy!h~?o|_1MbHUqU0tp@DZ#xt1QtMJ z(HY5nYEGrxJ56&sK{E)No#0-ZW+mm`OoC=n*hr0OD~+kbN?;A$5h*R$HCH!+2B#l^ zr)y-M&Xsw(@Th2T_uWe7^BS4YbN{+lr@~yQrIo&cPE0FGheRWFG^#0W_&F5WHS1Zd zxk__2h-jmx6JJhX9rtU38VRbQG6F^~>=HiHT%*~N5K#j`wQ3RFNJVs$W*b2fg6b0@ zT950gi00F%X_APN;Vv$sdW+@=BDz}^(SoBXqVBtuETX$*5iN-Mo0^9;&%$I!^N8kA z&10I!HBV@s)I6oxt$AAW3_&ncX(p(JpjLtw5!6Odl%RHkItW_4RkKH)>}X!l?4y$% z&C7JMBX4woFP=mYktaK+{@-LriiBlEVgB}?n(S!a2aj9>5%Hz5$&Th@nCxgi(R>R3 zJ|_r3>qP12a+vN27QZD^5%{;7?_t8Df%yB1jhY__I{D8{cr?Fgeus&P=2!N7f=+=s zPp9S}yP6;o<~(BGE|VOqZbN*lPwc%~otBp-Hd;=a*qjCv8x4dlV8SFG@_h)%HAKsr z={bR-;t9=@N=jk-Kx0dF?IC`J)l4wl$@EWQModmP2ri)6O0ff*$D5tnyC zS8cJjB*D~63A#|t)C$Vf(OOvLSxZo2MUMFd@ZSiia6((eeYoi4NXGMTkU zXBv}?su{_Sg?75k;6oRpwAIvy(AI)p&ezsa23{rm5bLO3ZX&3&D+d>77bZBkfuQwj z4lbe`Y|{b&LtxaM&aU?iVIpzeUE<6%iS zbUv*;AhG#1VDlT=Hz~f{E3^47%I1d%dax_LyrX?L!R3Dubhnzz;68L}Khb_l&^-j* zpWyNV?U$6x_Y!m;)qG`H0EnXc5$CbRegrQ6By;%znaf9KJ)moclFi^xGK(LO%wVLs zHfdRHNCRx1sHF!G8kZfa%sQ3=j82Cy(Q!In2SNVFWq^5va`{<;o+juS6~O2OT}pz@ zPZ9K}ip@GZuvzEOf!FgGK~KintYdXv%I3!jdg2IduD6&D&t_c@na#WZi)>CdhPoay zn|J?p$T^%=9fJ6}bgK5cOb|%6E{Dw_=mlBrpQ8dfK+yiK3t_r^T|q)1FA=m?Es$YU zAj5UX5%fGk`w{|4*L+F^@&fqLR3OS}FJ;*&8iy5~v<^nli^+lT82am^g)o9%mPK;H zQNfqwE+ue9CoO`(tHD(r5UsC<9eZ$8y`8Qy9?I3JlA6x|uFlfUrd)kPR`XXWSKlY- zy+gQKr8^6`W?uRkvesu_Q z&(@ujVD1+LeWYgYYRcR-x(f;Vn4r%R%oTN)Q09I@(5J~5qV6HgR00Zz*U23IygLqW zkU1P%WIsBX-L+>)n629&v-!(ImGyeOR(FH$M&Rf5x|=CKzo#qVzY+8eW$5<=!6Z<< z7_Qr{+mT@C&jfv|X6T)ip?B%-CJ1K5KPDJ@z3zU>P-yZ8%1~v>7jw6oEGY^jAC?*U zQ+JGfLT2PIG6Wo*xu4RbWClJVGw_$#{9CtI_ZkFxbkFNv(CyQ`sC!BGvTncbfbJFD zs|5W{&_RM3f)T;6Uymgia-wJn))B1Vs(W1y^yuD}13kL;A<%=l*s3-LqbLV@u=)Q2 zJ^%SYkM3It^yt1Ln2!Z|bU#9%M|X*4CH)6O9b(7wPtaRA{f+LR9zlpl5Arl_)Pp>Q zKNsTB>-024qt`=-2dB^wkKO~(sJ9~*CHkN~qz@D9l;9EDU^L?Z!9IfhDi=%NL*Fw#nz4sqyJ|G+kAcyw z@2?*~u!CTCd^GF5`av+7F?7pCN3*hUrCOt`w{VAdu=It}P{v+)C?B0zgStCO16p4w z4QTBB>+Y2TT(J;Q)1g8rp>CDF9E31RUjdkk(JV4Fk6_m#(>rWwgAi)_49ydvI37j6AODNKZ84_KFR)Q7! zvt$kr>W;(b$sEr5FK{^7xze8}b2zKY^8Xoy*eNmla$xp4{dyXO*d;SNk23pMf`@jE zLg=s7Z%8nEFv0n1W^bX)zE*!7!36{t#+j|%$(~Go1PE-H;>U-&i390($Q&IabM(Iz zX;3kDhs<0!S>cSSZ&5p(L!T#|`+_Ami&I*y)ZYh(AoTYWe4My$ul_;Ctba%k$JIPF z@{u}uS5(rrUV=vuJo6BJ*MXm=e_a2B+E2qH2`&N|bnB<-pVjY4$e^6yVzmrjq%wF( z|1!ZP1eeBT0DfSSpQZrF8?t(rb)(+8WS>m2Vjt?i0slzf1&?U z|CJuj9E>8kg5c2vk0E$0!Q%)XPw)hSClY-8R{giKf299W_K))X_Pg3(`G* zc-oO1otRp2y}5ppbHsrO1?OnSk-j5spyx6;*cC+&)~ZGtZ1<>H*vVzm9rWElgb9jr zTBu6?s>*HRa=6^Y;HoBgj%sjmLtt=mLpi|4xdc}od2n$h^58n*PYy0_EH@s`{&6sH zYBq8(aBArZBrBY3h@T;o4j@VR!&RbPo!n#&e1{0Z3*$$zxar(%#yZ zI)dvradVh{Tou6$qMP6aV&6H?YT_j7Z2BpYc+dhLX+V2ibsg-q?x>B-i1WGUh*LK( z^p7IBI&NWiuWMv_b8xl~PWBVrL=}e~a957R(SvSqlyaifQ2dk`*Ul}292i^&x0qYP zEhV^>;6((t5ggsjoyaZcPU2P&+)nT^f|nC~l9(}lY-D~r?dXh24R!U>Z!_hMsPYLw zssVA<#gEu2JwKg0o4)Q0?o941ZY9AT1TQ9d3BgM@Lw165+0}6VvPp#H5~qwv{;6>0 zkmefzMn#rLM<*v$FOd)JLs(k~Ignn9zvEse4K1e9c@_B!rLT6;agD>iah5q$EI6seOc z(k5;*!QdmEnoy)`xf{BZ?2VvE+Xxn^A`!7~Tn3;S@+MuS6Faz_-F<%-eE%+jPov*I zUF@3>UC$BidnAp3IHD}YDk|T}Es}8ea{pq?+ymT$^gvH-b$j&$tIna$52Dj&{=0V; zy>cXc@0ielf$158;2@E7oOB#)Fq<>J zQk8_%GQP6Bp^YX0jJCGGQFA!%;D?jO(h^Ipl&G{KN>6gZsZZGYTnicVlm_HFbT3c* zOhtQQe8Mq!NHHqEN@h(IPB6=#$9FW%qc5_?Yrxw^$Fm>$@be;wJ@T2X3+yrfuUcoB)5e~8-1x?LzYFkK8 zo0B)VtT3;vC_TTRWN>9En~uA2NUj6Mr$;|-xjEq!8C#D0_McoBlCQs zY>SkWVlZlB%Y@Gl8G7un5hYZkA;VF3DR_q;2kCHAI*W=SYpX+aKVMdU?8s3S;AVmn z)7bm^7iT2uZ$r<>zLX7UvAkP0z|K$xqMChWx#QOUv`q zON$2=l;su|Waj3U&R(81I2)47W@Q#;uGl+n{Dg_!CD{b^OYT7DgyZ8$Hfbj-Cs#Z;X@556m!LF3dMPUtn2E3V96CZ|h4?E`_FLgiCcTSz?f+V|6K=$r)^@36) zQVhti0OgaKUD&A3VY=}6xtUAzGcz-@=H*xC7DQtDn|m1jl~VrrAbs*NaKl;w+_2Wp zh|C3$zVd!ZKK2VTK!&M8NX#<|?ksD93@zuO%h1(m2f7bEfp)_Z{T}oj+)1_%y#&eC zUXku3dlPOYdl$V2_mX`C_mX{zKF3D5gRBrwh1-1N1cy^7rcH+?<9?qgrqFq$;D zo9j5ZovQ?HxQ5D47T*o`$GJ{;d4eg1dT_ z>>)nPJp%ZwWc~z;v59+_dz4uT;6yhgDQ4<%NXyfIEB6HVB=;1zn|qpjhI^LV!#&4A z0Oo9h&ms6+g3luuqJ0+-yoz9m^{pZJ!mZp3+&=C_?j^8i`?&+$E8MHxYXq+)_-ewh zA^b&P;P@?szmM?u6aE3hKPVYtNJ2vaAhHyUL=C__n0`1%BjqBH-BIZ%P!ysha3(c6 zTh1OW=OKc%6!{~x0loulJCFbxii^RaTG-ms0L@7?V4)U_OXgU}9|u8ix(gvvo3JZ# zYsGLVwpOa$(7sGQ%n4qa0#fogp`DX|qiHfA$+491gr@nR$DEif|T!$H;Sgc2;_6Zc%o6Zb?aQdQov^Ryx2_aRHdF-15AFs)p8j$V3-yXzGB|%#eq>x~(Zc zS9wDUZ-zJUCW5cr$Xf`$iYndzN4pZOyn{O!qw$q@fkx$JZXPm&Y~ek;m-q30KEOlD zfei$2B)F5{O$38WdCe9+#E1Dbz6alv??vzy!Zs0h31KfLaO8^JPrElzK41i5>E>89 zJ*zhfb~q}!RAuRVr0NrC{$*MFsx1HR$tB>}5#J%7^d8^RTn<|lE0;m~kfy|`yFch4 zY|~1R^4HG7Dr`^ZTbcehTZ;J%eh{C@XYtv54xh{C@%elKU&s&UhwwxBWBFnHaQ--c z1Yg7#^Cf&KU&fd7Bl%H$1wWb}!;j_1@#Fak{6zkEeiC2FPv)oaQ~7E9bbbaulb^-U z=I8Kp`6~VdzM7xM*YLG`grCpX@%4NIzkpxJH}XwKS%KM1n(pGC4%=83~@&Q z(KiTwi{N(%evjY}2>yuRPY4FM_<~>niEjx0j^G~%{)ymU2>y-WgM>wdWeKY#te&tu zVU2`MA*`9OR>Il|>m;n3uwKIY37bmT5Mk2@+mo=p3EP*j$53W2;@kKr-_CdNi}@w| zQhphKBEOtJiC@8=%%8%GJmF8}PvcML&*0DG&*E3|XY=Rq=kn+A=kpivtN7LY8va6l zEq@VzF@FhvDSsJ%Ie!Jej$hAT$zR1^&2Qj0@}2x9elvd!zlFb+zmC72-^$;>-^ky@ zZ{u&~Z{cs{w-a^%VFwa6ov;~%9Yokn!e$XRn?M|#%_VFeVe<)FK-faU4kqjn!VV?u zv4kB)*x`gdj<6#LTSVAm!j=%Wl(1!lEhp?q!j2+r1z|@Mb_`+15_TM6#}jq}VJ8yy zc*0I1Y$ahQ6Ltz=rxJD=VW$&z24QCsb{1i06Lt<^=MuJxuqP0RKeOzLL1;0}cr(RcOd2ng^QhHQ1o&KQv#(fsKGKJhmd0T@g?(U)lTu7~J3(PSRFDqsO68fc4|0CMVd+^JnaPCR zBNMi@%5vvXCMHk%67rG+m8;NIsG=)NO;@3su196MwpCf~I?8mZ7bTPBltfQ)erK(`BM$5M)}O{3j?K^jk5s$x0{DNQIQI z5|Z+vd!@6=biqN6zik4To#gE$@Eb~F*pQ>bhCk3bmrTzy{{%TDqj}PVDFNmREq@Gp z2ER<#o_~N3ku|tmfzjfa#IjWGdDbCbta{RJkn-#iy!RhK8+C-@gDatoN&XSFWQnN< z+#nkJs9<0h+Iq`!gFKl>+Xg3tdba_IKN@G*iZ}5m)Um%z79?(e_$Whrx2{D~GS1V< zpn``9k!3-#qK>M-L{?lo6_Kf}mVA&N!(pnwpR{CqoJ3l}9#fenv@t7F8F<~3mMcr` zz|nWsla)~&6@&58jj*J+AGKXMDx<6jE=Ep)T2g~$a$fxh;0D#U?&wNVLYSo_Nh(gK zA}O`+Zjh5k;n$D8??eZfoYx|GP$k92l6{PLa4c6PCj}E@#B_0NOJq5{S!KEHD1(LK z2PWeK4dW>qCr=7xpEgd4I?ksAU}B`GeMP&h>9KC|On)OFK!X=l#Eto-DASihPpbTKZLrz#hrMcAardlj-^J zZwf^u`9Z2sL_APLg_i)dBZndkvt?pFKKgEXxBkLk8blE9OCqd`)^&llYMHK2kG|6V z`{6H@oVt+HRq5u-^nCtLFsa$y$Mv8%1`l1FpSWj!7?ZkCrtQmr0&R3o+YM4c@xMn~ zt4!P1{{-4-XuKQRpje?zv9Xes%K9U@b;z`R`%j?l4|Ot2Wr6>Ywi9LAzOS-8ew1CK zZgDZ$Ps+(lc9b#`(LeeiCbqs{;l($rJwZA4eXz-$0T~L=t(qD(U?p zd8fqH7JCCp{`kyV+^J|r5=TX+iZdX5&;+o(|De}q6j0ZNe6?Kz{DO3!b zg7;mN?*f^c-~T3RlA?b((t3c@>8!+BPM*^LKSj-2i5eEJ)A`%O61h3uT4q|TAiOGM zn+ww}*`rb(zP8Dufl>w*z->O7XKvOIc}5ieQw z;^En3`Oz`PChN5^$;|PkowN6LIzJJMLvQ=5OA7y}0*`vI?q&T@e)i)ufLKs;SQ}7~YX-3LkwddieNj zw?hXOnH6iJkkFmFb(uMQD3b#>S^e#Mm2>iwbT4r%gBB|WNVNo*liS79&g!yS`}Y$W$#VyloA8GVf@&wB3)Xc} zz8_?I`u&XpQsG@f>5}kH6#-H{DB#d#|KYDPLH&s3WQ`hif!@fe3yelVU0^m^)CG27-<}(E*N7Rt1g&eoTx6S zG)`6*Ofybb7tAuwRu@zmPf!=s7;Du9b;f#i!9ruBx}e1fXJP5h^onew#&&hV65~>J z!E)nC>Vi{@qPpNT=gUGRzVQ+2@?#xKf2&|w{7w82ZPTdO}VVgG!2Ew+g&cF(08BHN!!u0=a zZgc6f`Br-5J*NJGO>i;&HwkvZA;6jEMTBi5Y;+U5TJQ*7nrxPBC+uQ+=$@umsG2yo zqH=OoS!u=O36rWS%f^h!k$Rj<%B(Hvyda?3V8w?l3qdBlL=fk%U+boFrZvs zDyIifvJy?MZi58na+#FCNJ&VbuC8RdP!8{pZK;v6Z$OF+`4qppdXSEDtB_K+`TGGkHdB>i7kKB`)RcIaMJuN$f74(YGIZz4-!fUvxParT%k%h zL4ecdD+zlxVb3A#xr9BBu;*_PYJ^%ytOtL&lL%Za%&vlTXz&-Z!ckfG1aGvlx)pMO zgeC5WfzPdxw)SP=5=e_u*V5Jy0hxIfd8#W(&w3q}I!IjG+E~3z&Mwz8shaW*X&$Po zm6}vbtq5`}$*fdbp((VI8j*#)NE$Zs@9nYQPiM{$mIzDX#t!){F_r47qnm_f!ih8` z;*qOCf-gw?*Y(SaY)%qRrWgkU>%xt~DTG~1nVsBwHFc00qdn3Fc~qum=VTOSWGT&@ zE}Wsp&XvMBv|W(#B^w2hF(g<^KE1WNy*@hZ2ssDFHq2|QZd*18?#zueQk@wjaTPwd zH9+=a8k!pvdt-W}tq$%qS`=;RsBMnc)I^%GBn#-6+aROchnRU{;B;{KA-z4#WnYNfA=!izzVmR`@WDQh^ zStlp%jMS#nsmA{>T(-8gEPyNQRCXaI=f(4*)HZ^r_P-=%Y9D}TiotQBmsK}4_My&C z2VCMeOmbH;5~;|>#vWu;Qh%Y3>@}#oq*z(Pf~P@~33dP7T;R!EPhSBzEtheL`q(~u?v0D2h`Dzvw>G}hEZV&>?unwBOy zN*W^>we1=4@(c+sV!20^>DgN0D#(T^TqIm9Tq0a5TqayDTp_Fz)(ck>_Hx2rLD+SK zT~Ao}cokuFxE?4|4V<~@&-^T8`u z1qjaxFG!a>2ylm_m#{Y+>C4Is4+wA3h|nv-tHNu->%tqtn}ofIus0L-R>JNe?Cpfz zxkY$ect?0wcu#m=_<*o?682w&eUz}f3HuyjUsT5vK9%DM+o~+tN;sjhrEbWeLAkjl z*(IfggVQtfAWd~{c`@W(&CG-Z**V#n`FZ6<ctA;^E$wV|A%lFYoU()7W3xn4edIlp|Y}~oSgDfnt8mqFg-W79H=VF$%ho-McD;|^NVtFOLAf= zkiw-HAV8GD6ZWo+DMrHHO#@Hy_+8gV5vdK9IAwYmg0!i4$Q6D(t95A+V7{E!+IUCzJXXBi6#sTN-f7i@3 zh9lr=-DjQuy|r}j+H=ma)m>HJx4XK#y1Kf00Td9I2jvHE-d{&1*C%t2uq4?-&a6(ITE|p`HDL()v4nGgWIbM&)C^HIVO`QE_EnRgoGeb7stL=XKKV~g#;Te; zWz}SYs!8iTYBJe5^&d$XRDMP+t=z=sa?Vtxv4-ih`zq~sCkvUTO1o9Eo=cbJEOjo- z?Cs8ytmm!r%FKrbWj5FLC~%o`#Xkj>OV$pnzzS7hrDVOhj{==GCyy#p1=3l+^iT7S zQq6nWD(+a-yykn9w$^#vKcyWnS+829ouo=*?DVyLm1cL+&8AAbQ>mO9Wp|$K+@aPF z?(aOud9G3E+~7RlxiPD=^FrrE#&GAw&P$w^Ixll3^c$R8oLiljJFjqF>AcE$wX?=~ zjXukHo%4F<4bB^#H|brRw>WQg-sZgBd57~(=UvXbo%cBJb>8Q^-?`2Cfb&7;L(c8a zhnlB`eE zhxD>OldLZ!Yo}y=Em_~Hua#zfCs{v8)=!f4i)8&KS^Sf~M6-#OslL3cX`<<(nW8lk zt+D#TvDQR1w`g9`{GtU!3yKyNEh<{BXnCSF6|I@@$uq5$Xl+DmCt3&5I*Qg=w63Cc z7pqWHr&6*qi80j3#CiN0UZP4rc8qv3j{-WrgiT<}3J~3L0(O-;7Vk{A(T8#6=xJHZz z#dukaonmH+nJs1;G5ZPMAu`K^5A>L4i+P2Z_Y3Rio1cpLr#L*~XeEw5;+P%bfI67$5^xcyj_bf2A9#GcX#qQ&+0{{1Sm18IF>vnRFJ3RhC z-PWnQmh=c|Vfnlz^9#pJ96L{qU+|^De^yIwl3LFv>)m4af8o2C%l9lfwc1YB`^D~A zR#eoNYAOqtuU=fTe0j-&C97AIlr1P(%II{Vb<(XYRG&Jro=_Afn?1jL^@^%xYueLl zbvI@G%jCBo`5gEjjZLkDll5V-ds)2{$rlgQ0D$_K_vmsyWW}Su73#~5dsHE{Volb^ z#qK%vQiXjAm|9CF>(gR)y?*C-uZE@;e98K}*!};#Jh-z5nMeIN(^+9-YTOf2aD8 z{kLZ*$J~PCbcB60YRtqThtDrvslMg3cau^pvSfY34B-Fgnxwu*vS#n*q*i6g+ErhD z=iXCE_v}Sd>!)OWU+k{=KM!PG&nW+U8!9TwEA|duYQdDOAM2|}vKFe|Gia%GO|pLe z@AXJ~oqSTuk7WH??7s2;ft+!zFo;josE^I;ow?MiBU!%}yBAu`_*YNc)*Wl=`*i=I zO=?+?tUv4X(rvG#rPk`m`n%Y@v|d`f=i3+mylJ|pwW$>~w2b<`VA!kKsiiKotYY`P zdTI9VPeaZBk1qAtNUqb53JNm2AZqby`)}B z9aCOawlMwVP`z_dHvd0*($vxe8Xp9#pDW~Xt1B1pSqUD^@7ey;N&%XWS7NO8?{O_! z`7b`}{9jyO{x7bVQ_BNreE+b1?qv7us`rj$>fL=U=fBZg?sd?n-m}*jTfY7Oz7+ls zw+Kw$+&hY?m+ZAjeMM1Sr3@~uDk)p`9|uC}b$BgS?4D{x@n5~7*}Ivkm(;a*eQCPq z>1FTHkJMY`T7I#6LA|tdP(?}Q;?#E?ODpy+I`tN~#`B5$tfK$#>1+N6Q3sdJS9h|^ z)7?9fsW-v3=KsC!d#__Z_2Rb1Q`G2US)DXXE3DP0_B?f^-j3GV z)>qs2Jcf2(qV3i8)Vs`D`~TAA(q5TQy?Cq@@|yeqeFxM2PuxtDs&xsJde2zv^xx?7 z_ljZaePFFiv3t1{!+*8UPfjMcMxs*_>64S;_Ov+l4zJd&*j-XDbw~v~`Nq~>?xtR~ z)q2$1`EJihyE0ODbiL~R;(o7E^;D?`|2Hr0_o@JIcrv3w>s#zT-Ae9%`;52e6QI(= zOXrvI1?9a?VJ>&7lKtze2jA9De8W#v-j)jC!5@cMlUxHvr%!PU;ygV~0z_O1@D zLRUvuCs$`z7gtwTHy6*}M~XH|w9%rC5pAq!<3t-T+62)iiZ-dn)iX8Q(A6hvk(zDj zDq^;wHaR`pP@5_lImy|E+N_4zhX4L-L)RE)ow!KKl=N&v*92x8W*w8cSRolrBx6zP zclV4#*L2rRW*oX^h&CEaE?8dsHTwd+vVVXnhnYg|XTj&vR6I$E@1(dLR) zBHBFB=8LvKv{KO)ind6!#Wk*D(>AVi9p^e88&6a=mRU9~6K$1f6-<8BDjRgH2OZB- zI&KhciKXKO=;*pIW4%JOrMw%geyTUR`&qe8xV9)AH;cAB;o2(NiaP3emFpV3a$TKu znrP)1x!HAX7JFZbk+pSn>IFqXTk`+hJ*|>&b={FN^Y)~fRm#k3lR~eowFhgP`&_KI zP~*DawaxW_>p|B;uI;XeU5~gPbv-89p`slo+To(D5$y=kjuh=E(J=NH(T=TgJ&`u^ znRGw-f-%FeGuJ3it1Mzj;^Xy^B?pHiLWkIByR#LcdsUB8HSl4vK_aw|DK()CBi z)0a{B@>|kHyKU~Qq@Hf3)zNXTKhQ3$Z5(btdb%6A4{|qlJKas(F1Oq5aeLi#*c>OP zi*|-+93^LocD88eh<2`M=ZUtV#+{wg(;ae$-4R=JcTDMdzNP0T(GsF!i*|9s%>>Cy z>L#eW$UP`2sC!^i&`at3+(VL`-(|G~_4sZqC~BAPK8IN)k8+Pq`8g)(=hg%5!P;iB zd#>_xihHVintQr?hI^)amV35)j+?Xk6{1}!+Et=mEn1Ce*NAqlXxE8$y=XVoxJ%N0 zmZrK-cbW3@M$6Azc6Xn5Ht1OodLE|q6POHT?)b$eC-UdY$`t zCFXIW-I{QpAlhwp6!R4KX=vqMug>e7n0=ewr>pb&9s4}5yI!`6JJ)@F%Ek>z8}Cv! zo}Tpij#@rj+g$8s5vLmWCGJbzm$?(}&F(Gkt?tX+SGe);9?|X{9?!NzUMMl$lKW#e{i-0v$^ z?kC+(D-)j*?eT>B8PT4oqlquL)mu{T9m>QflP12bOnhpeCTcFrsyE&5q)dD}Y2q`= z#FvvMKDA#HKXQMgO#ImWiThLcXYSA4U%0M0;Me7ew13+KZySB-+cO zy&@W;Xs^|{zfGI?L%Lu5MVa`zW#XH=`^9$~O#Jsv^yrxAF+_VKZK9_UCT4!c&G%PX z)z$BF>#crVyKlZd9*++fJzmk?N_hODyTTeSrdrt>Xp{Jv#lc%$%i>Iq-ABgs$ zXdj8jOCFzy#%1$oqJ1vf7ovSx zUs)oKLqx4u>!uZZCP~IP$r!ADwXZovhtfTjXPRe*l5x6d-zGdWMcY+J8H+vhlvt;E zN|M)(-_gT)79@MP?`w(W$@tAGuFSJ6<>S(%k3Sx0Gi#d)&(X@qN>7z%wdYXJVV=W1 zYdlAIj`VPA{j+G?QvE90Z=(G!+8?6*DcWD6{VjG|jpvxOk83^aJjdCZdrrVddq&zv zyIt&!#C{MrH1@^~Le_(j=PDt2+bPo$aw9@|E-(r`7kD;_JxekJ>esFz1GX9n48|CNMVvi?0--7uI-vsV>u-;|+R4w&vc5lCq;EWf!sc z6nifvW$y+l|9vUFt&!48Ryw7n^tMl)!!xheioKmUdsjcBPT}^>IN8ohb~kSieDrn~ zd)I`Q^mMD6kKR7s{>lE*+b`K)cBi-V4oLQwJ!*;NG0!R}%1if`Ev%9c@s3QXIU=d% z!3Wxdwas|%ET!fI??mq;?_}>3?^N$J?{x1B?@Y1x6?;Fi_ZNGS*awJxpx6hAeX!Vv zh<#{{cXnFM67M|keAFyeY7Vp194U4JGhV4Vp+U`hP_t60Sta&EEHxPr+Uh+#W4-qX zp6l3$^IXS1LOs{bb-Fa!Sval6o#wZoQh+b5U(Q+YfUOw+ejQ`(8@Qcau^sInajIHlKKRDJehoe&+q$ z`-S&Q?@sSm-mksic)9vmCU%@!A@*{yuM|6yRfxS(>>R19YrNm3rTi&%NACSiNqMLx z4zVAWcGA~aIr(trBJaaKw-PdwGagzVj+60pvVDGE03&_e zDIAgTai_pqPIXxg$`|qFB9?er* zM6sVF_LIeaN{z2~%12+nl#jlF%E$GVj||qQ2F>l~H27E#J~AMb@QoMysg{qE@X>vg zQRqI(H;tz^>V}+O`)T;-w~{@}H%Ix%N$!k>l0Gg{KAyc# zA2n-6hHtrVWy(h;ba1|V%_VEtzWaUKd=K~@^gZO; z?t9qxi0@IcUoG|;v0o$hYsG$@*smA+4Pw7h>^F)1<{IDQX%(O5`Y~i{?t5OTc#Eat z?aAxMzzmfkSe`CMX-$d;9i=7MR2gLrM*dG%6cCmAz{D|05^|2bi zJLRL_pL(k34=NuYw|wLYXlhcg{rLtR|9u_(Ezr@=I34TqCFh3u+n}RX>~m|~{2h{G zK!>a6Irb;<(fZt$zq7w9KKdD@W8-dOf2M9e`g{5NBz^QBob>To#PTyJ#5wo5+CFAf zT5b*U4^8^$XVMU->K6{QnYGO*KT8AF_(%K4_{aLk`N#Vw_$T@&`6v6ivwl(RFNytS zvA-hrSH=FC*k2d>8)AP`>~Gchr=@+I<)7`JV{7i8t9*Rh@{xhukH!9py1)LkLCAU# za)lC-d(3w%Az4~+tG_aHk-w6si}rVu_cHG$pDubbtsc^Ug#RdI>t$8 zNbw(sTK=`_bp4?^UHgw$7mpw9^Wt&!Cj~`q(xX3_yAOub{AZ@@JR@o6XUfjwlTv?F zOKQu`4gQ3(^L+nC{{{XF{TKN+`7icg;=j~?nb^M&J01N_vD49iE%tB3{;k+|iTyjV ze_!L@oVN1{*Kz);2o* z;N(y0?EQ0UaPn$TMvay4NBoZ|Jvrh1n(#j^_TTEL=hOb@l%CHhJ%3N?`MlEekA3QS z=v+_67OTWp{cohKd_8I9-^$A8lUDw*Un}49f2pi|-~WOCL;pwqkNuzcKlOj+|J?tD z=ozACik>C9Cc0g8U35cqQ*?*ujcWWm(^h_)y1nuLfR#E=yw(4U?zC=ibZ>){|Gt#j znMj#UY8t1d%x0?4{^zJ=JF{KLnB7G5CW&mf=&riSnC;KbL8Yjbd znAIz7Vs>tJe$vG3JY}NJbfPn}gUUqRvp*BFTW0gMznbh;*{!qNWVg+3m)$H#dy>WFDFN-F>5-Jt=#NvT?HLO%vHuMK7qMjWe?uF4~+u zOWD{gX=AanvH3o2G>@=sEX`h=vXQYK>}jcNEKb_ke7`oX$X=stEYDt%7 zni!<_QC(!;1|91`$1|0VXNlg`(vg`$TeHv0-jIDBH#d4W(Yvc(b#vp%SmADCNpf-a zrOL@mMDLl%zD)F9b#!uT_LWMm)3UEXNYQ&MxtLr-k9BY@xjbc;c`~ebVzY0^zB#4k zO-U{L9cW9dmUm`vS6beceRuXf+4pAOmwkWsw(JM8AIyG8^div*h(1vCL81>9eTe8o zMIR>mA)*hj$$mJk<>T2;WIu_PPb)1)SXz!2eS+u{m6nqlw5$g$-%wh@ka>0X2h6;{$7e(z#U1y-R<1wE{!AJ9spw-8*(~PGv+24#tjYc=``eU}Op3+G zamuUjl17fNZKUBVDC(5Dzp={wCHwc3m%k;woP40|)7u0x0*&!9kQvAdXaRdb4;TS6 z;0QDd93(m&{4~+0i#|j2nWE1UeYWUxL@yS7ZcV_M@-pB_4Fv_Vm6s)!m-DTmAboLz zmjAw%fdaG)G!uPZTFXF7wDdmg*`!E5Kh#pcyHDPM4uOtn8Q_$+AQ9k{SI4K?fo_4G zXcg$5b(-i4)yX^1OP##c^Ot>Sd8lPp|G>bcjRB?)aq=$1#z3#6&9xtfTiYBGn5b+V z9vBfA85k899T*cB8yFWDAE1w0D*7_f>E~96UM~7d(N~FHA$q0gRW*T0X&a{nrmJ2u zFiY9E+OqL5(T_^^l1De_SPwcbQ96>LLoFQ{8QN<9R_kW})|f6C_a~>B-!GX>|Iu-E z;4r1*p`st22yk(>rf$7t;Hbc{$zC#WOtP0ef(I}GQ4e7B+8;Rb*ryc~r8-IL8%Kc? z1Ial=n*z)s!pmb0w7uo!nSqOxmuCge4xAG>H*j8HL*V?t#=r%E3q`LMT|{3i`a02% z6a9G6PZ0e?(W%hMHGxfOFE8Wu*-m)5Re5=eg;`XgO~N-<;}{=TSQ-P zd3ift2JSEl6{4T2Zg7&noWHG`;K2QX2b7t7Xyf!m;6c&PsH2&W1RhVB`B>7-GgXhr z`(a#Bo>jY}Z2qYw*K>g#sgCl6q>$$vXftb@*8(3ZAzu%?5qLB3R^aWxJArot?*-lu zd?5OHqHhrWe9$YBt#j?cGq zoH=gH%4wp`+?T5}caBG$xw+xl$C-Q9?e1Hx0)si~t+K35IpL&|SEFQ(8aiUzS|(fD zza_<$7$+cqQaG(eFy+aBapD>bl(FfaBK2>l5$xbAHSDJ?D>{ zKXd-d`8#L}W&|@uXT*wUh+m4nQ}nMy|625KME_RwU7~+i6Vy^Z22IbpU?W@eU}NRu z_m+=8C$As>P}h%tHVFCe3mFU}WH2K74{0HTxd<7Idp-`vgH1*MQN5tZul|!7C4bC4 zJ)Q7i%V2Aq43eu~5IYCY}6^yX7G34xJ?W@3oyA7WHI2XqDJ2 zn4CYfDaiaGy2-x|w57Gpz~E@K3=Rqo4h{(p4Gs$)5*!{J5gZvDC5BCm3^6jr$Pz;n z!!Cv{h9QP2hNC7pCavWJZ&3RZEvKNR(I~B@(OA8rn6U;e4NrrX^`PYfrDdrY2U%J! zM$7%Kyb>%Au2MFx6vLSaR*1pW*}7am1`iFc!N%ZWoUsj;I%5Zq;EZkXfO{Wj>@4eb zvtV^_U9yJ^u2m`;UV6yj5vpS~+_faOR6IF&u2S)o;QHXH!PA1L2hRwe89Xa^cJLfA z{9>?eK#UwQf?}}Cuow|BqGH5qg6E}GydZVP4qmKO%(YZ(YMrr-mJKG>gNfHD6R#B` zZkc!kCT1NIya`whtce&*ZQwVbGj_n;%u4s2!Ml}_cZpGu2;L(`vpO2NEy!ouHwPb3 zM)EitBeyFfTkPA&zpdh)2(t7LH`qa@%%V>#W#smxkuCOX1f!!Eoy6!YMwgo4J82_72!0r3{3rN{GP0{> zWDhY87DGMRHX5F652*(we^5&PC`LC+$zRkt`&VyBAx3vzo=^R%bN07sMMAbvCPs!h z=k-j4IOp}Mn~@;KpHx#l z-QMpzw$?V0Pz%%yMMJSrZYUng3+0EJh6+N>Le0e}5@UcE1H~95#$Yjqh%r=*VPYI2 z#_*a@%aod-wxM>Ji*3zAg-T89>9)aXe>^J{D>WP5->wHWLw!**)K3iS>2_#$v<7McSjP(jJN*I(>KdQsrWhMKp&^b!Xv&ER72%Rg&f;x)1 zF?3N%%nOrZmMXC>PKvp(wwMDPo{TrF61Rk|NGZwSIvu%s#J%4wt!=Ii-Jz7cE_8k9 zhR}_nn?g5-ZVBBQx-E3O7)!-iCI)V<5Tjg-m13+CgUjPeF{)}pcczuR*Rw8kKT1BJ zl(Zgk8;7eqZ{ujyRW`i0T^~w5tCW0B4C@hhh_Ruqp%+mS#5hbT$q$#6lts@nui@qNb9|A<1{hOX609WYa8YhfFUCeOE)e5FF)k8glNc9^afuk0)`W+rr5v68M0hMxj#pAzFK-)L z)O1PXDrM!>4Y%L_{=H7PSXnt&4D0Rf@O-QcFVI8b1v#&Zu~{;nP`~%j?!rhAYCWlO1KaD%nw9q0~Aosn(UXJIZUHBIqZPoR;@Egj^=ff|AcZ6RI zzZ8Bs{7U%M@N41M#dt`J?P5GE#v@`pD#l}CJT3+Y;ge!KRTF+QZRWe4b?%Os`JpoN zY0J!K)kURtfim;O1~coy%w5XN@5Fe&U@ zbBQolXwTQp%1Bm3Pxh1%d$OlguVqKfq*Xg=S>+jNjZ;RP5jBG-Yg2^LcJ6RqI?!fm z86$y6J~BpfBEd)~5{^V7(MT+k8;M8q#CSyv&H}HAftYWI!Id$Cms}aYBgVTmk)|mb zBP}8=Bdu)BBW;w7?^!Z_D8^@Ee6D2tqCv)gU&csJWQ_C@1z}!#P}dN z7^HsbCRbY79vtC)|3qYn7#}4fT%CPfM#-xNCofPsDW!AW)ke}8TvTeMes9CC; zbeCBrPmQojwQ`dQ#<=i@;~E$Qap{8!V~;ATCzxmLN! zjp#3ynmKO4^)MLiTeF$kf(?Xi`*Qu9h zO<#kL_2A=E%Ezb0Y-0KN96oAaYCD0!mo>t7!_+TJ16iqlCGwi`@l`S1iOB0>dg|!o z+YzP{ZH~N?b()x7l-#WS%>`vfHA>d<(JJec$mb~)KTE3UM@5#u$Kj0X{ciJ3qx3I$NKqPTVH1-nfml zAJJGej*C&!*DMju6SH~UT#Po0w#2JwbLAq>xP69iquuM4O@= zlRCCW$7n01quFwQI!1d$2cl!NXS7$ecl6+BpJ?A`zi9txQFMTqZN+RSW_vL^h*>CR zM=?8z*;&jkVs@>G4oc}59hT}Dqa&4$-7Fn@?Cu%+H0W3lI!;$Q&JeS^rQ>XLILrT%A`~W*OJPk z&$C=y9X&kRHAWdIqBrY%pv|mpj)|VETs$^f9hKn@pR9+=$W?W(X*9{!z~v_tNUwng1T&+*dSv)$atBO zF(Kv%OUA9p7`n1=c_)%)8&xcgiAzAk!$Qu2B+$0VXRiaEB9O5Pg1 zLv@e0sqT@R8M?2RXi$%hooJ zM_*J@J`sH~`c(Ak=rhr0qt8X3kG>GyA?6e@r;0gE%;{osEY1{jmYB1}oFis&P4uO- zl&^W`c|JzUx0IA~Eh$-hcpTG6m6VGbq^t)izfe+sDQ1Z!<=03Vy5D`2f@iq&kE!2( z`p6%nKPw@B5_5hc`iq!#e6}6^Bl@=z@=qmXsS+|~Q$jA>r;y?8X|-Z{%#qYF#t;#G zzE*-Serfd8|O`SY_#WD9;ha9#c9V*`VXUuVbteI>xwoTAkK0)(su^ zJ9jtMC)N)YV|~RuED_`6cX-|U#@L`314W#!V?&as>ov-$Ly}G%QLBsdw6$AWjgE~= zsmKI2Ogid7n_1gTiIpf7r^cqmrpIQ)X2xd4X2<5lieq!dJVwl8#jF-n#9S-pIx&wE z^LQ~&5c9;E*u1og3uBAa_d8=tl!_-=DxMV>T9wwa=1PbBZsHf(Z*9^>T9ww^)*@Zv}DJqz9ws)zR!;F zpf&{$q(&dDRRm(^#gc(Sq2*ahOSLh(sAaRI#@ocaTg-b@CwXs!jsL!lxdt}onquCZwlVi0Y|L$(>r{xzxbdy2Uv6p6 zaCb|0KDqu}^#ze!I;h(dxs2uAQ8y)XBe}WCtht z6Y~KvIUXMpbGw)ii}{F{kBa%2n2*=w_DR{9TNKvS2NZJ$D?6XC?0iaHOmd`RXTuWZ z^)M?fcY?BWqL{4GmmG}Dor0aLnE!@Ct(bpq@@IEfnL9hTSb52fDI0Qq_DmhUT#&m6 zt8zH6 z<@-v@55)Z5>LWi^T7F^_=6=FUH|7t?$2C7BU%GMkwzBpV`xuo%@L@sIkxsGQ3 zkju!CI)C#m5ucd9@EUe5pT<5(%wKDpdC(;VMXmQX^Y1vXq0wQ+Gm>WhaiHzfb&Z>G zA7;iK@ka53;*I0Zc$2s*?v8unUNQd?^KWt3#E~J6OmSq1LlcKx9J)A+nz%n@W;~d> z(TPVf(_yB~bTqPVbR4b*G5>ur<9tpe5pOFFM_SBy2gLMj%3Q4AlibM}BPm50%hgTew?iU9I2gH#hj-WW$aabIY zn)uALjm7b~Sp#j&_$$#E%t6ej+a7Xj(@jkB^^(TJaOIP7?=H7JQrI zCv!pRXtvJ_$|kJ7>))%RjGr0j^)uB`a)W_EYO(S-OH3kGvsy-5b-f_IRjGMl{G#}# z_{H%{;+MuRiznin<6FehS{!Y}!O_@G9PP!?K^%qR=qQd(;^^+l2R`|%IrAI3k5e;ofL{%QQP_~-F2#L-tA{lw8< z97W<7AdZ3J7$lCt;us>1p*8XJ7e(UVde+6iL&hJJjMhiE9V663ZpT<9AH z&QqTh$>T!G`UrQP`lLvnk+EJO4)qak^+PxLW;)k-P4bx6oyc>EV`L)FBaTsZ(=jhQ zFPPLZFDI$vXuQe`Cv_ZCTgT4J+)r8s=H(S6d&j({Ng>A{XhUn8)_GkKGOtZu+q`yp z?ejY173Ou!>y+0yuZuV)ier*ECW~W=IHrnYnm9O{&k)Bz3*r^LlxMc?a8? z=k--W&bCh6bJc1byhq4$C_{Z%y72c}M0QC5|$2ED^_2aV!%D zYON4Qxj0seW0g26YVwXrE4emxXOnk=QnJ!ga`o;zn>>|WT3wUW zYE3PzJoX!`;%>~lC1vByNgLHW-}~Ln+UBmjhn0BRq$GItP{s^;y7L$C)DIUlD6@Qw2jXw8&9-sJY~0yXEfMY4>rE3 zYXx&I4<0h6WO?bts*17|i>3}LU%jGg*&1sDN50<{sL5}Xe^7qod}n@> zd{@3Z-;?jn=TeuWb%Qw07sp0%Tp*4M#c`21Hi_e6aa>YkYn30c@rqb}C_kJZ$&cp8 z@^h=Xd%qN4>3cb76XM{Y-6D>y;<&uJ<&3h*AJEe!KL*UNDm%2SYR!bwmE{#xlgg@8j)JxR#gx*D%495S|EsYpRg_6c$68wrDqp^G zS*iNh6IU-^UQ)3pW#YurMe4?>a`M2{Wy=;!>C|;#*B$>ue^~w@ z;Wi#Kj?5oxYqKSPRQ~AvG2*yU95;#M<}HEg`Q!6@3ZEHq+(H{w(^}N3 z%U(r~t0*h4pw-3hwg>*hfhF^oPApwnQjyAa>jVFFs*EWm%T||;&$H@0J%9E->fCs1 zesTU>wUm+LHgViu-C@2huX&~|Z-@DS&6U5vd}ypE(>`zIva-smjvZgh$js90y3uG_ zvqMvfnBJ^J+06f%)U2v}<+Nty^Oj(CrPr2m!eux)X5z@wHKhxZ%JWArn2t#m<>gh? z88rtr_W7f+<}KP4PHwhh^|ECzI-9uM9`Cd<6VtVCHh)=3W#z0f69-h$Z_Ha=Ra#k{ zS?#FKnm%#${Q0G&3rZKfm>p=66N*e7GqJf@b{hiDgHWQqIDm%Sski^1oHzR8Z6+HI(Bq-PL-vft4Kwti+m$YbvWs zmrow9b~3Ph*@7J{TeWU8BUQN-Y&b3TUrW`F)Zc7w-IjfiO@@KLZQp?w3@*d&@)d}; zxqVyyVaHA!?RzwAL8{4{JGb5EKew4Sk1cF#W@~NhZ0lhgZX0DAZ<}bFV_RTbYOAsx zX*9&owOKn%$ZnoWOyWMuD?QYw>w(Yj3nXdGf?L*s6+c&mdw(m0LsmdHOr z91m1?Nd4u>8F!}s@}kuLJ}u+U%c|4=oiE_k=r?3tlhs*2LGPl^GAfPX_A~M?lnlNh zTTspWTe~EK0iBN}v$JIK&JF$Oc8bh=%;w5`-1bN2llhlc+p1p`$HT?$SqsaSmG&+y zESy});aa$S_2Lq`zXeNHuP7;7P_ne5WO?D>^ypD#;nebqrG@Epb0KH5%EI}n6LtH_ z1xwqPl~-E-a>$`{njMxShI)V*0=0TUJ5b*u>ka*3JWPREFvn)|?S${(Z=20;fEU=- zp9^`wKKw1AHLx##2bc`YU=5rEr@*OjI-Ch-!?~~lE{7}OYPbfjha2H$xD{@PM{Kri z9SUIv90eQU7I+$7hn?^>d<)b!`v>?5eu3ZM5BSSw3wXc>*^mRYB@lra#33IFpgFL> zVqhc`Lj{}w=KysL+zU^_Q}7ym4qw7o@D1#O@8L)I8Gg0davDKnXaX#>lj8+OqH_We z1Xgp(iNbK04drki(9WD!fHnoGdyu%ZB(yEq7TN=GVX0?ZkQ}mbvn|*UieMlNhMB;= zg5)B&1&D9(CLqQ^VjR2=9)}m;9rzH4XNY`?_h2@Gmj|#=tn30Fz(} zOoJIP3k2?h_ieVQ9oQc)irJ#8;9MYHQQ8uvEzwVb+(gMul-xwgP4pM|4gP??Y_^yU zGJ(3sh$oYsZOlTp#g2lL;Z!&s&VqA*oWzJ>j5@@~OYAjx!)D_O+LliY^0R@M<+Hzh z;+0Rl@;OfOc?~|l2xwnEImurD3t=(PkLNFg)o>WBfg|B)I2Ja-9k3lJFJG1S9sJB; zOqor?!2X+dfL=gun$nJ@hXA=~N_?7*hOsag4hI38Zh8`Mj5ej6O=)M-^C1CSfMc^M zZEgAxJOMl4P52&uvDpeJyMXu?5VwNvFcrvA0rf682G#>PDcAtCq2NN;1eXK*F1Q-5 zf$QJ~cob+`0sC*(1R@XxlGKdjvsrH#1|wh;(4J=FVIr)6!+`RdQC>63YeCyvOac6C zu?WgwDJ+L_z?l}6uojL3;?aV5v>+ZWh(`jsO{Ajffj)xQBWLOWU0c~i76Rq9?>eN~X%4|)Uttq25p0^$dc-VR<90DU? zGT=yS%5OarW zL(JO{^ESl1&BbsdY=c+f3!AMi^=xZGBWMgwfY`Mqc5SI=+p#bW*mv7mFb6nZ+RlS= zI07i6EoHQ&jJ7Ah?LZlA-+>P~rDlQ)Jm7#(j!cO?nW^1njxo^+D+Y_7i-GKeH9|9a7?TK~!Q7{JBUwfQv ze-v;`wkMbEIY!!_4;R2DxCAbP`{5~g9(KS>@H)H+Z^OGlzB`1V1@wjfFaQPt<#(X` z4#Qz2jE1p5zB){VC9n)uz)GNQ9mrjWLxKEvppG4AcL(Cz0q;6c*A6v6{yKaPKiF)A zIY0~xCj;>+fiA&p#B}Hf5&40M>?*DOW`)y4$r|iunVY9 zCp#G6fP=sbexQAwsADJU*r^lXMyDx2*_}23{aU9BVG~>e95bD^!j(X*I$Z}h!Yyz+ z+y(c-Hh2ggfydz~cotrOm*7=+1ITly_uvDYtury}9EU+bygOF{Iq7^35bw^E(V6yj zz5^(y^F44MP*!Jr?aclez;Eye;6isBP)2t==+|H;0x$+1+VJcbw=>8@f+~$v}L% z6QAzHr#tcKPJFskhwj9^J8|#+0TA~d?6XHJ7!D(Wc=RA1J=j+d_SJ)Z^yJ55?~)aiCItb((`>#fBy-524BEV_{L`IMQ(aEg2vDU zh+!{c*o*e|ia}Fo1}%X0_v!{cpcmj;FWTLUcK2EU#IV<5Acnn&L9b&$U>zI}Uje!6 z^#}Zwx^?Q^k^jWk-V=a*^`B6KG4Hc|hI!Q1?F6y$>r#4$(^4Ayl`;xo9Zty`iP|v<$ppJd1Q(yAcw-5A#A{Yq7 zq3;;L;l7h#3d{%c*q1!^rQUt1bKfI@c=uforvY*6y9>x6yR-Gn1UtlGI*_-1YvFjn z_kJe>dFn@=`jMx8$s%z!L#0kND$Iac zPzKAO999AG7<4q80;d9A4WdqisMDa!U^7ssL9}f!$HrjlGno1e_CiZI1jygu(Li~F zCjey*rp&>VIe0dZyTNPVC^!bHVJ#d7r@`64u{(GpTnJY}4O|B|z;o~dyaVsS2k;T> zf*;@~_{C-$vJh}($Z9wYjsW&Ex&iSXO1y{mg%LozhmHfg0=UR#8|DD=I4lTZ zh(R0Z4+DW?V;FHAMqG!Df$>00hY{0Z#B>-j9Y$HhXy-86IgHp2Bag#~?J&w7M%lwC zd)P^E3Xs=fSHt6guZJ{&&M*zg$syF~kh|ekAijru2%o@bK#ULh4gRz-cnn#fg9(kG zF|fbk5y%DNHoO@Sv*E3Qzz&}Xlr?-N%z^o^5XxXF905ne32+W<1nM;W64(M)0QDb! z4N%YFF9LZV{xkdvzr$ZP8|ko(pnfBCa6nTaeXQU97VaK7QjMS48(mDUW}qGqs{`#8AUmxi2W$a8FdL<26w@|uniuB?eGXZ z2G7IG@ETC=D9Rm0xuYm|6y=Vh+|eG$g*+f1qj6(&C+G^@p(l{v(YL^Da0ig%(d>J) z+MYa*CcdM8f#2azn~jj##t`o@KOJrhCGkKxiPJwEwl&rKjvWQ2jqFoARrfG z$n%&fFb$RfIT*7Bjs)^B<`g&$h|QR@fO?Gi%Vrx(xnnbdJdf=L#B(fp8haA3%~;|& zmTkte%~;$Rdp=wUv~BF|KrF}J1NQ;(97{aMJ_*mk4j`6eUxkn0Q}`UdwAsd)kPSHy zf(Wz%+BuGPjw=Mp8FwXI4c7pEjC%@p!Z$!0#(fXOavZT7_dC$0@w90?`y3wyVmUq^ z3V?WyC!XUw0&N{np2i;xePINQ24XoLug5Qg6>uaFzwyU{!0A9N#-9V{!JjtUghtR9 znt%s70sELR8K%N?;MkZj2TFh#Pgn%iuntZD;yr@=mrB}2pj^$by6`9&q?J#Jtk3) zNyK&1Nw6MHgEN3KC;e@+P0oNU;8>U(gkI1GaDH+T3OeF_XTR>}Q3&ekFHz4j)iObYsFdS}z`{4l~*Ha$>_B-`+ z_!7Q`UGP0{3{CwN@MT&y5cg>jAkWjt^E8g3X$8;@Izd_Vk%R z4yIG?bjqEM@6#6nK1|2E=__CrR04ULPPx->f|ucEn{5W|oG}1O;W*d=#B9bBK#pcS z2QR=I@F5Vx8N_hLPWT3P!CyApOxiG00|OdCV`vTC;b7+mM*;DgIUA_^ zOx&GGyk=6znTNyCPz~$gcsLhsgFE4FxEHp;gMe2v@oFYs&7_VqspCxQIFmfj{0gY& zOzJuFHz3}#GQkeib(SCSYE~GcK&)p`=UIbb2n+-2J8KF|2jV@8I?vh;xI1eHyacb> zY_r+lZ2X+v8_3h_{y>{&4+h#joBhnD-LuESVps~~XZA{*6j@1cQLO6%T_e;a0dE$Z_#K@P*Ab_aJBjZty}ju+O>VYiHEFVVmQKA`-PAasPz zfZHXwT|&7flv_f6OBMlTlu$;=>2MaD0~|Wh+A#k&n{5I0UqJmAIG{1OzyrCE542%HOK1b_U^q;HnJ@<^X90CyPzK9j z1so03b-@`xJ{M5O1sB4_a2afdo8WHP0j~meD$Rf}#2^odVJYR8wt!a93AzK$mEv4! zKOm;1#I$rgOoX{W97{`K5tPGGfM=xw>)=cvcBME`iW8-q;1VE?rT4%CupJ(S$Khqb zfl?eO{Qy1&;#jKcybExl6c-k1-~sBqumkjf!9X1sQpbhVaUpqMNbD98yM@$sA$46y zT^Ak()vy+b+ro`-5m2v%3D^qs4GV9CTi|xM3#jkHhv8Yk)rHh&;a@h}A_MSokrUkD zgDB)e9uz=xAh(N#z&tn}C~wgcbjdo z26(i%F}Q$OET+80l(U%pEp7|MWpOv?3B92&^aqZQ#l&av94LjwuoPCnYB(H@0Nh$k zE*GB+xV897ASR2c--_qqMWB8wz5rse;uo8(+zxnEj#uThy_~j}<5YQTXa|MR8K_q| z^(r3?<6t68f$2cb%Bfp<2`qp`umqL?c`LsdYT!Y5&1PG95K!Jq+PHEQ@b@dL;7B+I zaB<~vupUl_v*29V0CxaxtqKCMTSe?vwSo4~5vc2`gJBS`?^R=A8WaO{TeS)(Yt^B! z295&CTy-K4w^ew(ia4!$1<2r+f_PNS z0?MnP{T1a<0pzLTaG;G9lvhDqDsBMEsPqB*s3eD##Ho@tR`r7cFc^lx2%xMg{;rC$ zswk_9vZ^Snin6M3vaH9%0s&J!IUpk;Eg>+{-7qxL(lK;*#}GqCW%+`@XZ*bP=SRu12ll z12*sxo6+m2t$e~~e92C}WjFgcz#)$E6UVWOQT9E`zDId~N1f*%E_0O|+~yt+c@hMp z15y%38q$%GEMzBw7kH8U6vPdUE>1~ap&aF@L{(}~n|d@Pnr5`5HQli9(Y=TXf-xoV z&yJ}=HEQxW2*%1YHk|Zi!Y;<1MgL>XHr8z8)}yO&+p*Jeb~=6((}~5MjE@U~39?LR z#cQ;sLl8_f=fpgiZDKxNLRS;*aH4)D$}sU+5KPkdB+s67oRj<-1e5J@@_Ve|edL%j zi1AEhGSh-!YE>GcgQ-nv5d?mgA()l}-A>C*Bxm>+w=~V3rri#L>7TI&&!4`ZgF!IE zEHhTHl2yDL1hH+V&A{`BzC!E8Rl8yJzV1ZmwXrmO9wKJ2~1*Y5WJzwHyUA=Z#2bx z%OWU*=PxtgvJ%`5g5@E+SIbl3*~^b|8t>-vv*>%pX58zFFZmjMzd4VU==x1vzqvXH zR`zEM@~o6+<>VlEt1=Cc=Ph~O()TLQS(Tlf@9&D!b2GK;t%cwe{gcjR?E|NZVk@PY6D;3W#7>ko>f#}BS@ zotxYVf^}wFXSQ`_TW7X)W?OHz^=4adw)JLPZ?+AdvB5Joc*X|L*x(r(<=^Q0H~RjK zcDd248?W$yM?47vrxAQ;Umt$Y0S6N6w= zMe5N2yW7+x2sZ0)v-viA{$~Ac*5Bq+=xy^qT;wwMk!ABk9tT0Ze=a^P;iShu8~*}% zc#)SeLwrd}Qx!Xlua3RN>mc6U#5c#TGsl}b-o3=%!_4t!j@N%e zYRsHq=7e}o#|d{abAp)@>^Sjx%$#WEL_1E5z|4tePPF61VwgG6%!ziKSQ#@XnmN&q z6QeP6qL~xzIPrDNoM`4mJ5C&gnG?;NXvc|@F>|7s6YV&05oS&_bD|w5uEETSW=^!@ z#4VUP(aec^P|?W==A5k{u^i!puo#PO{^q#+W(D%t>~f)Cn^unK{XhlLlhuBr_-3 zandBroMh%CJ5E}NnUl<%WXDOXF>{iclk7Mt2{R{|ImwQbzQxQ*W=^u>q#rSJl9`k2 zIO$K!oMh%CJ5IWdnUl<%WXD@lVdgDn-eSjFa$x2yX5M1QTZ&-jEoR3Us6=zGrJce9zXA zjA9JB+WI!{p`Wem*vLoh;D6|5t6sK#PcnMhdICAN%CS|Bt>=PZTV`rvC)?iQ6LzBC zZM%_wn}2TGS@gM0m)m6DCi}L#L9jg~X-Q8evXYxf@=}0;=x}>k+A)HO*!}kD#IgkQ zY&XyLb(m-S$HZgz+rQ=;c44mV``FJx4r9Ncc>X69=*%SEXA_%A;8Q;13w+Nfe`1y$ z^6$t;NnW8G<+1M_?t4c!Vz7f9cCceKW0}bu=3ys0%&_AP*5KJY%(259yTized)lps z-K8i)6!Pw_Of_m!hx&Mbc6Y(EclV$dGVJb;cWL)vhA{$}b}wZMKXWe#_PjtXdZXVx zAMg!2+oQ8RNB9BvutyJj&U1l_T*iL)Jmg6bIDueqO3bl0HHEOty|V9>eXs0$Yg3Pg zG^PV`?;V2P_KsmZcD{EyGnvf_WZP@Ud$+NJ&-n^>y!Sg~-TNbE+k28<`5ia8SN6Tv zxrrOtYxaF5u)BSBw@8BvH+dim z84lE?0d{$yDY6_GfE)+x@_=0)@D3kXf=mZi@FuHx7a0%4qn87p@g@2`pzi~RaeD`j zaROZ(ILCSZLH+~Jf*?5s&yfmummH4Xl5-P@-ja)=yX4YTr3SUBhg(dRKe;t+>3}Yi zhcW^;kvy7lm?hawB+q9dW=S?nvRRVNl5CdbB(|{wGbMk^ZuYSsH<_&eWH*`o7Z)%~ z^1UE9I2QXmIGJh0GMl-0=D|fQWjQN(oA+4DIyNH5K{*b}aZrwfavc1eulOI|v4`)` z^Fciy)bl|-AJp@~Q=H}uG9LV!i(KIvZsp(|?(>MJL2xL$b(%R zDnKFZkDBSI znT`%-0+X1+baZmm&VJCt4=G56EI*836k`~VJNV%OcK?Guf4CY1KX$-pf9y+t1_i-S zy85Xo`uV8@rSaLH>|L?Q*di*h-b7Cw1!`+r;{B#eJM|AE(~Hcbu*`eMh`H%Y7aN!MQK_9=CArAV-4W&&o8Q5iF zGKV-C1b>ys{{E_m&;Qk!&oJL#`|$a{eCPQnYT>izefE4qziv2DdQdKkeyF4E-30uK)R)f4IcIL2z+0^H_kL zU0jNOE~VmmJpYocm%NXcreg<}W+CGx|NNzg$a%?oeAx~z``0ep&t?0$>}D^o3W6*C z_gBn%MgA*UaF18aam5^0R`3?@uo`!JWj!CVi3GeCSGKdCgB->VuKdW)oa7Y0@ds!5 zGYG^B{>_W-|JB96GXI;%Pq>?_nJI;L|Ej%Ttws&(=xR$|qa7XTOjq=HbqK@J$yIy1 zIv%rL^}b#Gh|PG;Rhh4T$`^cv`?)In)n7S-j92aB>SeBCe^>4AS_(4aeZ5wM;*{hS z%Hj5|RiY~LUaO6q*W|qRI$h{SPx{c00Ssm+vR_+70y?~QI|!~v;61$F1ADo?hOgPn ze)N7__Uk8*{krVe&*PS^yQS+_FvE54)pfUU!_IF!ha0+)hQi2xqas!CtQ+=nqdtv@ zM*bUmz9I9CzUcRcZf{ItDl?hGJlyMzcld~%e9Lb3aeza(ksEe><2Y{r#&78OhIwyz zM{eBbAy0z9IRrQLepBX~GT)T>W;jJ@fc|cJ=FKhW;HEim<;EUvwZ(1R(%mh0b}I%w z-x|k6rZ64(Z_Q>d^LYz1+*-~1tY;(Uxb*{a-;(>5+_&8Ht-rXyMP$FNlch@8H-R*qNSNxCN z?8E)sJ;<;8gZsGWKJKL?j5MUfJ9;k**@@r6m- zkMYcV*Ms1G4$OJK1NLxV_xImpE&9H{fkZyzOTOkCzQYXn_u}sFyPx~N@Ed>NhVDNN zf(Lf*4$tvDu4Id!$ z12^(uC*QJ*J?Q&^z8@Uo2=4yDF=T&mk~=~0FdG%|%!iZF!Nc#l5Co6Hkoi#wN+bKD zD5_B(JwKBFQ4^Zcg3ffKCw(x-qXEo8*NB>N-TAGwuBAF_#f+{z=j^2n|p$@)mv zM<>wnBOO0F$6wqEg2w^bi9pAXb^KVzj|)=cjJsshfBz>(kSmLElf!{?sizmHp}EAb6&SXZn4n%V(bX zYzd$8D-VNEkc;xvpf>erKnptXI$h~OZ(``jXvQ&-DNHApwIr~O9emDCzGXLi`I(cP z=Mw*Nojcs;5l@0pC>`>JN>PR=Do~kf)T9peX+#sc(~Cazr9Xoh$_Pd=mhs3QdW+Ba zji*5K}K92Ge$B{k7S!7QkdkWc8+~O|sr_gJP$3ZA%8qAO~BYt%%Wp;96 zj+C{KJEhzy*JwuvWKTJOk?1<*4CWwH%7wha3gl1uHgcx?l!F}MNA#Rh)|9{U zJ2I#Iiwnq}@>vjiE(OmKMry*zKxVR%g9vh?`{&xCyXW5F8~zSLsnSvmy`^#^sRlC) z*;C1$%6+7gJ(cXKWKXq(WyqguC9Cj#sXk&eiEQN)%#`XFvZwm*Sr@s&4Q_Lf2SF%I z_AuGQWDScXA1_gqmnp?7)Ii^1-Ek*j?m4VKZY0c&gpEMvuyIU8_Apt)-bB}7x(<7n zHGIGZK4cT|$R1_~VV8r@^Y;FH8QL&`)p!@4KaCqnof5sLPJ`^JvmtwG*;Bj2)P;~g zb#Y2iiK>_(b#3a=0CS|)cWSv)%bi;8)YFJ%HgV`Vwd|?aA#>_&e8!i^lzJC?*-tX3 za3`rB^DGFZaVKd~q31NRrg0-_G9z=EoaCl7Wr?CZ6{$jXYEg&!G^8=QPcw^;(ODYr zQQ90-rUPSH&U>sy_O!C6)p1(c)5@OqYusVl@7T>g4sZf9q}6rWGyKW^Ak-t?tEIuAETxPHTB4VN`s*6@v(E!8BM4=^a;qFUhedAr*|vqzeU&S z_ab}xlgOT4*7R4n#!c?=kSDmI3~naF3wRGRlta%MD&eLx)Ii@EWX|9|GDIVL23a%o zLDv~{onatD7|uv!&men-2~1)Ya%MPRBzo74om$}Lf zZXISl!JL^)Gv4XddJ?p!Cfj+Y8Bb#SttAqKo*-^I5BqMV+ zHS}9xe(cN%AWHbRwI8-_mOi0 z?l0#K%#iad{>QhNBj;u0&M9|JxpO|^X%LDCkrFo&A$x?Z5pqVjZNC*4iqLPwtH|Z| z;zALPXv+Zf8=>C_StG_U9+@L#j*vNG7G{ii4|g2#0lJRZh^`~zNn{J#kv-xwe&%)% z$`yfU=IVlXB$plK+Q;8PD7VbH-FNPc$eueJ`p#V#9p`o*x!p%@`Ey56o;uXW47r=o zoR*j)_XOn5Eq89YbI(KHxtH(;dd@9-?yY>v7ktfk?BRP3@C*Ot({FD5zM$V1p5uAa zlAcVsl^1eg=P#6^4CT=E3l%W8-?$6CP?Or!qXDwN(1)3PL^9WcP#(L>Q;GK2MV@86 z%Nq2aNA^4k$eu^`JhJEchF!>?NB%r|&vO#DpXYbZ@@Ei=43Ilg&yk)JX)lqHS8guIdRM#>v0Z{!*N%X^*+LFh%jzbM~}dV8@S3)sd9?gpW}X36V5@>ZcbwU9lp z+sG?>UfKQUNrm!urYqg)MGPY`L*DUBVk*-yN8ZiIomcL>a_99f=JhV-bt`#yBYWQC zxRtzaCGTafa)bYJJ>W6!C!gN)<;E@NlQrL~R7B={GUt;yUtP?YuQ5&OL2u;DXYPCh z7|bw6Fp9Cro^K*{knb~o!!z?2pdka9hj%sqK8_-Le%bS%#C_zy#1-Vv@9&G>7!2jV z9fS&m(0_sFarXtxQ6M8FsD$hVWG^7Q-x~}SXhL&Z(hav#U?{Q{khQ=BrZR(B%;8Pe z@i{s!pyL8MF0hC1N#-y=a147dAZvkZ=(@ly?r@(+JmFaodMO36zZ8c1d8sz;_9f4J zX)`}!PX)6Rh0F!rNkMl~Q1*g7(0Rd;xRHW-F6c%I%3p9gi&)BXR`NFQ@&$S>c#tD_ zPC=Oqp5iorpyz_J7qq8BDUq>I8ZwZXY~-L2WodxBDC8~*c_$0CrY#+Kovz4R$h{Pj zvyhyHrZ5d%7t(d1IOemECA@*`g|_koIxL(MH(9tlGqIP#yEwx|^j=u+g=H`NFbEZq zy@>2ZWG|AAjL2U^{vz@hd5OXlqXeZXLo+&|=OR7ngRYAVW*8&TaS<7c*jEubi>yMw zMb@yM57|UK?xx6oe&;NIaRGN-5Bp-4Y zEksd@BYV+C^kqH?*lSTYS1b=YE7lQrQfw+S(0MW0i!DL+V(+k;wdl3j2Fy_G6F%ch zcJeK|ID_oPZelmZ{(IJwAmsln7%HBURLEc4&Wg)iyd-X=_^VW;8a1gyJzm3Ji;rd; z6LBNO^;~==vKF6*`zS7R@nw9(X3Xn16+^|{N^yCM%Uk>lzT$t#TwLbjG8caqgkF9L z&wRNbi`a&~UcM28N@PIh68bKo?-F?_N*SW4KxO1FQG+Hlrxk5zPe*iJB9=Jpq=e^` zkh#R0tU})<+(!x7OX#-5H^^9GFUcI{2Y%ul*MgAWR}7W(x2~kWbtTi2iLAJhlDWu( zyd?`DXGu9rR>j}JlDaOb>yq_xD?Mb=5FM60hJBWLk=ocxsj0k+yC|ji zQhF~Xd#O*6y_D>wWG}U!gUDa%SKNH5v$*+EZobsTAXGXGxl2dz0-jUaPD&T17%wAx zX&slYPiypAx)WXKNgw(#fbq;mr=?f(KI?J6r8gmG=`CzW-qK%i1UoNn*3!p0iM*xd zEiG^9Klz(~@SeV+_gCb5r7;6p%nnZBoh@UQGH$y}b!t%;*~>IX_A;`Uk-dyA%k)D2 zGJP4vSSB!;Y0O{^@z_ThH(lm4zDCz&cCiQ9%bY;BW%OF+3ht!LZSL`q$3duUIP#VC z4wij|a+IeM?xUvAcd(nG2y_fqL*~^_l_Hwe9lfB$c?jV0Ty+(zRhIC{k3)%2KM(H}L z4tkDiL^E3Q8f}q1O2<+Cku_=}Q<#o>iIOX70gHGKw-Tk_DE&ss8nvH;$n19*Ls2qE zoy3e$zjKSb+(*|@x{i7lgkDX-bIAUx?62zIZ#0HpEsmV84#G2E-NrBIt9%}+&>lBZ z-i?&kd-;A0N5|#eNBODDU>0*QL-{vZ#k;KG1J?5$vX?)GuFJdC@_%rS^ISmw@_Mcy zYXvzgWFRv+$c0=LUc~KGs7!NO(FR#7bfOC~SCF}a%oX%q!HgC3Twx}G*v73qqkh$V@bYD^SiuZ$1r4VV+aivUTMgB?=6rw0E zQwn!esT?inOb>eFIhACtG?WpHA{N;zE#oa@thAbSY~*7$^CjPN8uwi3PyXg2SGdMa z?(kpUM?t8voR#IQoSmHLy0We-=f%5I`6UV?d*$LZpbvBL%*sbGf0f)+qCGNKaU)fx zA$yfsxU(uNd7JlGi~LnK@FAb@8D^-mlW*CDIja1N+*RbRB6k&cS~Vagsqh~9&BjpG zf)t|!rHP^f?xku~qLI(Q<`G!JSlf$5lUIJ-V*?5$3L% z$X2%VDW4;|-)sz3y%&V4y+Ad(V|UfuO|=8qMfET;k_Ek2m%VyEWUnrJb=j+z}Cev0fhzhgJ@*Zdyc);z%}+<(n8{K@$sR4WA;$wp3c zBX=#iYZamh<*9_cwPdX&Yps^Fr30_i1-DacJd0S$a#r#-@39tlUCXW1`j~iRt+j`J z>_^|V4x{f{`mXge?xvRPwSMD45UL%4E^B*c?djNG?SotnLVkZSR7d7IuTT!z>r|u` zjcJOW>$FDxI_>F*8T`&-sLnw2UuQU@7=v4>BYPcv*U@(!eb?E-c646nbM#zC_ByiG z(QzFe*U@pEfA}xgRj%_a2-QtTe!P=@k1vp0u z-RMal`Z56h*Ok5Qd^T}}8$qaEcB;^o$+(?*U$6@|Qcv&oWUqG&+3U$(Pxg9$a}oLd z4r8d^Bc2AK`XStZ{pU$TVdSo_=lY&gzdCiOPa~qyaeaB~_hAHMnSea?XE2L6=CO*6 ze8vB8BlX=#eI3`Av%dSN?>_3wTmJ;7xW-LxbC>(bTVLJ=@-|3G7^!h14fNhXz6Sl# zSA!&u^DqcC%!OGRwxJ8%>4oeK_1jSPhO#%5z2P)sk-y;^tl%x)VKr;niQEm3@)MrZ z@K=84EPo<*UdbuSr}3igo9m>xXEq;z4w`?$G3=v- zdufpiH_}4)E%H+wJ-5(v3;A2f-=Z33Xwih`=)Xl9+S8FS$lgNVE%e<&-z}E$CaZV{ z`TfpfsD;ce^xI-Tx@~a;d0L#{6u)tq`$4E>dSq;wl^n?Gw--Y#Wo@bFmS$^Nl$WVV z9dz8%ye%6cZ%cVw%G>fa+R=ed=)R?VEx+V+;6Iv+B1F?4v$S$2trF39E4{Unz126! z-b(gXvbXw?pOL?n{H-o<33uP>I(lw(CkVC9g50eO;yJDL+`2Snd6f#(NAA{gx0bVY z7rN7nehg#?ZojqrZtX@|zt4Kyb88*9)^TgM+zk-N2=txqCnYdyFAowNLf z+^sKig{#Q^n*LuaK?{cC4qy9v zZM}nS-A7x0Q`_2e+h(-HZM1DiNA%m)tZhd!8h6rG-nR0#mACB-W-*7kY(&1cmx55c zbi6`a#`6|tX{YygzoYARx^5?XyKBhaPWE8T_6g)>}vXK)rw2#E?v^PilM#$Y> z?)GxGcPH&%rz`qyKa>%;kM=W>({Ce&{4Qds{TtX}`<2MuemiX3@m=($lh@xvUildqwF0QvIO}%F2~JxT+fGWB7r0haf&}U$9e3fqj$06b#4ZsPO^8> zaVNLkDIl{!VphL2vpZYbRMd$=YcoX6t0vep4~jN#~v1M<@MudYgAy z&05x>^G+YLnMAg*jiX!(La%4#RqXWjDSW_poW*^2)?4Sa$lh7@&JoDoS@zEQ>|BhO zDTx_6SEUBEsYgQ^6NBuX$DwP#i5T*mh@sB2nah0S@BAKXh-WLG@EP{l`5Shzhhxat z`7RH5%(EcWB?YNSO*k3IOg3cgqU$cDcm;iTF?*MaR7UnLvUjP49dzl2oPJL+)WtKq zTns{8b=Weogt42*^?55vt(KN%&bnD7MrlH?%`t7FQZVOn9d+z3a^gD>5Ztoy( zH#xh>+3j<_MAmM)?xyQ*=I*wS1IXU(FqeZ+_q6D-yJvPEiTS(l(vyy=`|0Td%2Nby6+`>uh038WOUr?C_mvw z{FY&;*I!)V6900Yn?b0zJLxTZ@B9>`2qh>@S)!1?xBR_ZqvPIk_SSLlp6IuCKL#Lo z@7cV=YTjo(vi9CY0y6iOxwp){_1#;~z4hGt7{@uuul&wg{^W1|LH0h+Qy4w=(M2D7 z?Xv?r>hmB7#YEtpjH!+riE$$_vd8E_>@l*&=r~5lF}JwSBc28!|L^Caz8TSZ-!ka8Zv`q- zjhg7YugrbjbzisASN6WL_KiW;euFU7cMwAv!Dz-Z0onUb!4CRF;`+%2e%wQH{uLDkDKLaDFN(Xw-8}~6#_JJdiec)uKBLBcxX7L6qc#C&f z&02Pn%u#;gIC2k^d*E5z_dxIAz&k-`ki3Ir9VF|Z^kgAB5#**A<5D zbfYKkdXQTgB2nDM@LXpywf7=#J+Mk$K2KhA<3050QPyd~`eH zJ=U_0kJwBiTW~W&4snk2{KI9gasxSs+~Xng4h_)nQ2h=y>(D&Bh`dAP9a@;8xR;?a z50!bS%tHsT2+th)Gv1A1dC}D{I~X<|nTO3Hj(IHOUDohE>-mt6`IImC8Z!*r#U9Kt z>>6?plY5xl!`$_7cQQN`Ze@55av|$*Ifs{`4DMujCEW6Gx%^&cXn044Fq~10Wdf6# zMl9}QxceBs06B-tIo#fd>w5Sm5-|7h?d;%lzC`xnr+5&AMnqDBo|u0`JO{ZPghr+& zGug>~>x`$*YG%04oR3dldQ3e{+g8AkfMGO{&oX^%NZPDk#Ma*veTZ)%1{E@vgH zkbR^(8Tkpi9=V(S$Tac@$2fufBY)$+ocDv!sPtqaD|#L!>nJxe%C1MrJgN}xW0dTp zYEp-KG@ub~WmI!o@fz*uKqquR>P>Vv>U0nq9ij-)^ha-_H;~9yWFIa2X!kK%_R+GB zKFkmJyE6J`&T*c9FvIApTn|EH%rPc6a*vUFjND_2Q<7IGOD*cs65WoGbIj{>rx!8w zL+&v%(d(FZanEBuK-MuIq31C&kCAzd%ws;|5J&kDU5`1=FX(#AADrbc{zmq(sVGQ8 zbTM`z+d0X-AT-V{#+9Qg?rdCbWFOZQ*~iH~PRHZAApbabIBqB-7|l2);_k=2&4gcX@#P6P^U2iD^ksCbE))2wp|U6W#U1#x$iBZD>zNWS=;YQA}qx zb6LPrma`IfGtr$)+(9yKc%mDg=q@In;1s7h!=Jc`i5JoDB(qLRiTjxJJn~MGcaqL0 zWhNUkPm+0(%#&VYES@>ZE+?6Pa%zfT2b0~!WSJ-HZSrtNqT|W4h+{sBkbm+r*0PR` zd`vuv97M;Hf9EX!JxAurSGdNFAT-5oOp$$xZl`2N#wjn5kC!M+QQXUvx^&=my3&K* z^u>Kl8O$)`oiYYFr^q>F32&h5DY~BWHt({U_mO?d26k~S2u%&cGp9De{8Lx(3CECm z>O<4d!JsM5|rW<ba|&& zp*l6Gjqaz*H~oEf^G^_(k%6+b#4I!1_ly<1h4*rX>@(cQ4B2PMK0}`~KI03%Vm}8t zf*EG~%n8g98$#|_xnt#y&5XWd^&OiFyNZ38ic~|+*g7;Mnr5^>?%09oH8z&nco$=3 zja|$e$Q&zktjw{i+0LhYj;>?B<{NY!yO-}t<`A;SUI{`o!zqm}W{%=*{>Sgw#Vj{6 z>m}U9tYXMMD+<|X$v#WRv+B`+Mwnq%dpgmD?)0J$Gmw3j`)RCFZ{+IoaH()&UP2GvlGD!yhwiB^KADr+r7*#$t%b@Ti3H2(*%9b zHv8n1p_3>v8tEAT%e860~3l3)zJ3=g2-s_Bpc8*@NtJWS=AZoD-Zv z{yDmxbD68$;5PSo5QO4#pzpY%=sKa=M828lbJ>=vx&o<%=1pp z`;0H~oOv?O+sl5E(epgn=Uw6&GS0ihL!Jbo`2i`&%!}xEzJBNHcYalB;I8MpmHBRE zel+sVZ;71q<(xl&LFjtEuIGDq=8s_<6On!XRNmz)&IF+ap1Ghf=3g+BMI<2ef@7RO z_65Ijo~yWz1-H3}{0koQGzcvWCj(|!n2ns|!W;|hAooJK7s|b`HEroYC;B7%!tqRD zIy0He0^G~OrL0B1gZ-q~Ap;2_p^Za3hPd;C)yE^{_Y}Wf_4TEY|Jf z6_{bM85YaFSoXzV^9^oh@j;GYj>SLY?iZipRuEd^JD140j&#fnnALb>4o{+EA${r~;1{A>T;|NQ^|J+xx!{{doGIvW50 diff --git a/ios/src/CountlyCommon.m b/ios/src/CountlyCommon.m index 265b3e10..79fe2111 100644 --- a/ios/src/CountlyCommon.m +++ b/ios/src/CountlyCommon.m @@ -26,7 +26,7 @@ @interface CountlyCommon () #endif @end -NSString* const kCountlySDKVersion = @"23.8.2"; +NSString* const kCountlySDKVersion = @"23.12.0"; NSString* const kCountlySDKName = @"objc-native-ios"; NSString* const kCountlyErrorDomain = @"ly.count.ErrorDomain"; @@ -353,7 +353,7 @@ - (void)touchUpInside:(id)sender + (CLYButton *)dismissAlertButton:(NSString * _Nullable)closeButtonText { - if(!closeButtonText) { + if (!closeButtonText) { closeButtonText = @"x"; } CLYButton* dismissButton = [CLYButton buttonWithType:UIButtonTypeCustom]; diff --git a/ios/src/CountlyConfig.h b/ios/src/CountlyConfig.h index 5170f403..d0bd6714 100644 --- a/ios/src/CountlyConfig.h +++ b/ios/src/CountlyConfig.h @@ -94,6 +94,8 @@ extern CLYMetricKey const CLYMetricKeyLocale; extern CLYMetricKey const CLYMetricKeyHasWatch; extern CLYMetricKey const CLYMetricKeyInstalledWatchApp; +extern NSString* const kCountlyAppVersionKey; + //NOTE: Attribution keys typedef NSString* CLYAttributionKey NS_EXTENSIBLE_STRING_ENUM; extern CLYAttributionKey const CLYAttributionKeyIDFA; @@ -312,6 +314,13 @@ typedef enum : NSUInteger */ @property (nonatomic, copy) NSString* IP; +/** + * For disabling location tracking by clearing all existing location info.. + * @discussion If set, Location tracking is disabled + * Once disabled, geo-location based push notifications can be enabled again by calling @c recordLocation: method. +*/ +@property (nonatomic) BOOL disableLocation; + #pragma mark - /** @@ -352,6 +361,12 @@ typedef enum : NSUInteger */ @property (nonatomic) NSUInteger storedRequestsLimit; +/** + * Age of a request is the difference between the current time and the creation time of the request. Requests will be removed from the queue if their age exceeds the request drop age set here. + * @discussion If not set, it will not effect the requests. + */ +@property (nonatomic) NSUInteger requestDropAgeHours; + /** * Limit for the length of all string keys. * @discussion It affects: diff --git a/ios/src/CountlyConnectionManager.h b/ios/src/CountlyConnectionManager.h index 981cdcba..d6ee7274 100644 --- a/ios/src/CountlyConnectionManager.h +++ b/ios/src/CountlyConnectionManager.h @@ -20,6 +20,8 @@ extern NSString* const kCountlyEndpointSDK; extern NSString* const kCountlyEndpointFeedback; extern NSString* const kCountlyEndpointWidget; extern NSString* const kCountlyEndpointSurveys; +extern NSString* const kCountlyRCKeyKeys; +extern NSString* const kCountlyQSKeyTimestamp; extern const NSInteger kCountlyGETRequestMaxLength; @@ -54,6 +56,9 @@ extern const NSInteger kCountlyGETRequestMaxLength; - (void)sendConsents:(NSString *)consents; - (void)sendPerformanceMonitoringTrace:(NSString *)trace; +- (void)sendEnrollABRequestForKeys:(NSArray*)keys; +- (void)sendExitABRequestForKeys:(NSArray*)keys; + - (void)addDirectRequest:(NSDictionary *)requestParameters; - (void)proceedOnQueue; diff --git a/ios/src/CountlyConnectionManager.m b/ios/src/CountlyConnectionManager.m index b1cf38cf..d54e60a0 100644 --- a/ios/src/CountlyConnectionManager.m +++ b/ios/src/CountlyConnectionManager.m @@ -60,6 +60,11 @@ @interface CountlyConnectionManager () NSString* const kCountlyQSKeyMethod = @"method"; +NSString* const kCountlyRCKeyABOptIn = @"ab"; +NSString* const kCountlyRCKeyABOptOut = @"ab_opt_out"; +NSString* const kCountlyEndPointOverrideTag = @"&new_end_point="; +NSString* const kCountlyNewEndPoint = @"new_end_point"; + CLYAttributionKey const CLYAttributionKeyIDFA = kCountlyQSKeyIDFA; CLYAttributionKey const CLYAttributionKeyADID = kCountlyQSKeyADID; @@ -161,6 +166,18 @@ - (void)proceedOnQueue CLY_LOG_D(@"Queue is empty. All requests are processed."); return; } + BOOL isOldRequest = [CountlyPersistency.sharedInstance isOldRequest:firstItemInQueue]; + if(isOldRequest) + { + [CountlyPersistency.sharedInstance removeFromQueue:firstItemInQueue]; + + [CountlyPersistency.sharedInstance saveToFile]; + + [self proceedOnQueue]; + + return; + } + NSString* temporaryDeviceIDQueryString = [NSString stringWithFormat:@"&%@=%@", kCountlyQSKeyDeviceID, CLYTemporaryDeviceID]; if ([firstItemInQueue containsString:temporaryDeviceIDQueryString]) @@ -169,14 +186,20 @@ - (void)proceedOnQueue return; } - [CountlyCommon.sharedInstance startBackgroundTask]; - NSString* queryString = firstItemInQueue; + NSString* endPoint = kCountlyEndpointI; + + NSString* overrideEndPoint = [self extractAndRemoveOverrideEndPoint:&queryString]; + if(overrideEndPoint) { + endPoint = overrideEndPoint; + } + + [CountlyCommon.sharedInstance startBackgroundTask]; queryString = [self appendRemainingRequest:queryString]; queryString = [self appendChecksum:queryString]; - NSString* serverInputEndpoint = [self.host stringByAppendingString:kCountlyEndpointI]; + NSString* serverInputEndpoint = [self.host stringByAppendingString:endPoint]; NSString* fullRequestURL = [serverInputEndpoint stringByAppendingFormat:@"?%@", queryString]; NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:fullRequestURL]]; @@ -201,7 +224,14 @@ - (void)proceedOnQueue { self.connection = nil; + CLY_LOG_V(@"Approximate received data size for request <%p> is %ld bytes.", (id)request, (long)data.length); + + if(response) { + NSInteger code = ((NSHTTPURLResponse*)response).statusCode; + CLY_LOG_V(@"Response received from server with status code: %ld\nFor Request: %@", (long)code, ((NSHTTPURLResponse*)response).URL); + } + if (!error) { @@ -234,6 +264,19 @@ - (void)proceedOnQueue [self logRequest:request]; } +- (NSString*)extractAndRemoveOverrideEndPoint:(NSString **)queryString +{ + if([*queryString containsString:kCountlyNewEndPoint]) { + NSString* overrideEndPoint = [*queryString cly_valueForQueryStringKey:kCountlyNewEndPoint]; + if(overrideEndPoint) { + NSString* stringToRemove = [kCountlyEndPointOverrideTag stringByAppendingString:overrideEndPoint]; + *queryString = [*queryString stringByReplacingOccurrencesOfString:stringToRemove withString:@""]; + return overrideEndPoint; + } + } + return nil; +} + - (void)logRequest:(NSURLRequest *)request { NSString* bodyAsString = @""; @@ -415,6 +458,9 @@ - (void)sendCrashReport:(NSString *)report immediately:(BOOL)immediately; [CountlyPersistency.sharedInstance saveToFileSync]; + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; + NSString* serverInputEndpoint = [self.host stringByAppendingString:kCountlyEndpointI]; NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverInputEndpoint]]; request.HTTPMethod = @"POST"; @@ -524,6 +570,38 @@ - (void)sendPerformanceMonitoringTrace:(NSString *)trace #pragma mark --- +- (void)sendEnrollABRequestForKeys:(NSArray*)keys +{ + NSString* queryString = [[self queryEssentials] stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyABOptIn]; + + if (keys) + { + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyKeys, [keys cly_JSONify]]; + } + + queryString = [queryString stringByAppendingFormat:@"%@%@%@", kCountlyEndPointOverrideTag, kCountlyEndpointO, kCountlyEndpointSDK]; + + [CountlyPersistency.sharedInstance addToQueue:queryString]; + + [self proceedOnQueue]; +} + +- (void)sendExitABRequestForKeys:(NSArray*)keys +{ + NSString* queryString = [[self queryEssentials] stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyABOptOut]; + + if (keys) + { + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyKeys, [keys cly_JSONify]]; + } + + [CountlyPersistency.sharedInstance addToQueue:queryString]; + + [self proceedOnQueue]; +} + +#pragma mark --- + - (void)addDirectRequest:(NSDictionary *)requestParameters { if (!CountlyConsentManager.sharedInstance.hasAnyConsent) @@ -734,17 +812,17 @@ - (BOOL)isRequestSuccessful:(NSURLResponse *)response data:(NSData *)data return NO; } + CLY_LOG_V(@"Response recieved from server:\n%@\nFor Request: %@", serverReply, ((NSHTTPURLResponse*)response).URL); + NSString* result = serverReply[@"result"]; - if ([result isEqualToString:@"Success"]) - { - CLY_LOG_V(@"Value for `result` key in server reply is `Success`."); - return YES; - } - else + + if(result) { - CLY_LOG_V(@"Value for `result` key in server reply is not `Success`."); - return NO; + return YES; } + + return NO; + } else { diff --git a/ios/src/CountlyCrashReporter.m b/ios/src/CountlyCrashReporter.m index 08c247fb..4f5d9c17 100644 --- a/ios/src/CountlyCrashReporter.m +++ b/ios/src/CountlyCrashReporter.m @@ -275,7 +275,7 @@ void CountlyExceptionHandler(NSException *exception, bool isFatal, bool isAutoDe crashReport[kCountlyCRKeyDiskTotal] = @(CountlyDeviceInfo.totalDisk / kCLYMebibit); NSInteger batteryLevel = CountlyDeviceInfo.batteryLevel; // We will add battery level only if there is a valid value. - if(batteryLevel >= 0) + if (batteryLevel >= 0) { crashReport[kCountlyCRKeyBattery] = @(batteryLevel); } diff --git a/ios/src/CountlyDeviceInfo.m b/ios/src/CountlyDeviceInfo.m index e8f92713..396ddc76 100644 --- a/ios/src/CountlyDeviceInfo.m +++ b/ios/src/CountlyDeviceInfo.m @@ -33,6 +33,8 @@ CLYMetricKey const CLYMetricKeyHasWatch = @"_has_watch"; CLYMetricKey const CLYMetricKeyInstalledWatchApp = @"_installed_watch_app"; +NSString* const kCountlyAppVersionKey = @"av"; + @interface CountlyDeviceInfo () @property (nonatomic) BOOL isInBackground; #if (TARGET_OS_IOS) @@ -240,7 +242,15 @@ + (NSString *)carrier #if (!TARGET_OS_MACCATALYST) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - return CountlyDeviceInfo.sharedInstance.networkInfo.subscriberCellularProvider.carrierName; + //Note: "carrierName" is deprecated and returns '--' value for apps that are built with the iOS 16.4 SDK or later. + if (@available(iOS 16.4, *)) + { + return nil; + } + else + { + return CountlyDeviceInfo.sharedInstance.networkInfo.subscriberCellularProvider.carrierName; + } #pragma GCC diagnostic pop #endif #endif @@ -402,7 +412,7 @@ + (NSInteger)batteryLevel #if (TARGET_OS_IOS) // If battey state is "unknown" that means that battery monitoring is not enabled. // In that case we will not able to retrieve a battery level. - if(UIDevice.currentDevice.batteryState == UIDeviceBatteryStateUnknown) + if (UIDevice.currentDevice.batteryState == UIDeviceBatteryStateUnknown) { return -1; } diff --git a/ios/src/CountlyExperimentInformation.h b/ios/src/CountlyExperimentInformation.h new file mode 100644 index 00000000..3f286f3d --- /dev/null +++ b/ios/src/CountlyExperimentInformation.h @@ -0,0 +1,23 @@ +// CountlyExperimentInfo.h +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. + +#import + +@interface CountlyExperimentInformation : NSObject + +@property (nonatomic, readonly) NSString* experimentID; +@property (nonatomic, readonly) NSString* experimentName; +@property (nonatomic, readonly) NSString* experimentDescription; +@property (nonatomic, readonly) NSString* currentVariant; +@property (nonatomic, readonly) NSDictionary* variants; + + +- (instancetype)initWithID:(NSString*)experimentID experimentName:(NSString*)experimentName experimentDescription:(NSString*)experimentDescription currentVariant:(NSString*)currentVariant variants:(NSDictionary*)variants; + +@end + + + diff --git a/ios/src/CountlyExperimentInformation.m b/ios/src/CountlyExperimentInformation.m new file mode 100644 index 00000000..bbaa6c61 --- /dev/null +++ b/ios/src/CountlyExperimentInformation.m @@ -0,0 +1,44 @@ +// CountlyExperimentInfo.m +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. + +#import "CountlyExperimentInformation.h" + +@interface CountlyExperimentInformation () +@property (nonatomic) NSString* experimentID; +@property (nonatomic) NSString* experimentName; +@property (nonatomic) NSString* experimentDescription; +@property (nonatomic) NSString* currentVariant; +@property (nonatomic) NSDictionary* variants; +@end + + +@implementation CountlyExperimentInformation + +- (instancetype)init +{ + if (self = [super init]) + { + } + + return self; +} + +- (instancetype)initWithID:(NSString*)experimentID experimentName:(NSString*)experimentName experimentDescription:(NSString*)experimentDescription currentVariant:(NSString*)currentVariant variants:(NSDictionary*)variants +{ + if (self = [super init]) + { + self.experimentID = experimentID; + self.experimentName = experimentName; + self.experimentDescription = experimentDescription; + self.currentVariant = currentVariant; + self.variants = variants; + } + + return self; +} + + +@end diff --git a/ios/src/CountlyFeedbackWidget.m b/ios/src/CountlyFeedbackWidget.m index e71e1d35..bb609a22 100644 --- a/ios/src/CountlyFeedbackWidget.m +++ b/ios/src/CountlyFeedbackWidget.m @@ -150,6 +150,9 @@ - (NSURLRequest *)dataRequest kCountlyFBKeyPlatform, CountlyDeviceInfo.osName, kCountlyFBKeyShown, @"1", kCountlyFBKeyWidgetID, self.ID]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; @@ -185,6 +188,9 @@ - (NSURLRequest *)displayRequest kCountlyFBKeyAppVersion, CountlyDeviceInfo.appVersion, kCountlyFBKeyPlatform, CountlyDeviceInfo.osName, kCountlyFBKeyWidgetID, self.ID]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; diff --git a/ios/src/CountlyFeedbacks.m b/ios/src/CountlyFeedbacks.m index a507a72b..290024b3 100644 --- a/ios/src/CountlyFeedbacks.m +++ b/ios/src/CountlyFeedbacks.m @@ -331,6 +331,9 @@ - (NSURLRequest *)widgetCheckURLRequest:(NSString *)widgetID NSString* queryString = [CountlyConnectionManager.sharedInstance queryEssentials]; queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyFBKeyWidgetID, widgetID]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; @@ -361,6 +364,9 @@ - (NSURL *)widgetDisplayURL:(NSString *)widgetID queryString = [queryString stringByAppendingFormat:@"&%@=%@&%@=%@", kCountlyFBKeyWidgetID, widgetID, kCountlyFBKeyAppVersion, CountlyDeviceInfo.appVersion]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; @@ -476,6 +482,9 @@ - (NSURLRequest *)feedbacksRequest kCountlyQSKeyDeviceID, CountlyDeviceInfo.sharedInstance.deviceID.cly_URLEscaped, kCountlyQSKeySDKName, CountlyCommon.sharedInstance.SDKName, kCountlyQSKeySDKVersion, CountlyCommon.sharedInstance.SDKVersion]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; diff --git a/ios/src/CountlyLocationManager.h b/ios/src/CountlyLocationManager.h index f9d450b3..ecf89078 100644 --- a/ios/src/CountlyLocationManager.h +++ b/ios/src/CountlyLocationManager.h @@ -18,5 +18,6 @@ - (void)updateLocation:(CLLocationCoordinate2D)location city:(NSString *)city ISOCountryCode:(NSString *)ISOCountryCode IP:(NSString *)IP; - (void)recordLocation:(CLLocationCoordinate2D)location city:(NSString *)city ISOCountryCode:(NSString *)ISOCountryCode IP:(NSString *)IP; - (void)disableLocationInfo; +- (void)disableLocation; @end diff --git a/ios/src/CountlyLocationManager.m b/ios/src/CountlyLocationManager.m index 7b18c976..42229464 100644 --- a/ios/src/CountlyLocationManager.m +++ b/ios/src/CountlyLocationManager.m @@ -79,14 +79,18 @@ - (void)disableLocationInfo if (!CountlyConsentManager.sharedInstance.consentForLocation) return; - self.isLocationInfoDisabled = YES; + [self disableLocation]; + + [CountlyConnectionManager.sharedInstance sendLocationInfo]; +} +- (void)disableLocation +{ + self.isLocationInfoDisabled = YES; self.location = nil; self.city = nil; self.ISOCountryCode = nil; self.IP = nil; - - [CountlyConnectionManager.sharedInstance sendLocationInfo]; } @end diff --git a/ios/src/CountlyPersistency.h b/ios/src/CountlyPersistency.h index 3bd403ef..a43a5c61 100644 --- a/ios/src/CountlyPersistency.h +++ b/ios/src/CountlyPersistency.h @@ -20,6 +20,7 @@ - (void)replaceAllTemporaryDeviceIDsInQueueWithDeviceID:(NSString *)deviceID; - (void)replaceAllAppKeysInQueueWithCurrentAppKey; - (void)removeDifferentAppKeysFromQueue; +- (void)removeOldAgeRequestsFromQueue; - (void)recordEvent:(CountlyEvent *)event; - (NSString *)serializedRecordedEvents; @@ -60,7 +61,10 @@ - (NSDictionary *)retrieveServerConfig; - (void)storeServerConfig:(NSDictionary *)serverConfig; +-(BOOL)isOldRequest:(NSString*) queryString; + @property (nonatomic) NSUInteger eventSendThreshold; @property (nonatomic) NSUInteger storedRequestsLimit; +@property (nonatomic) NSUInteger requestDropAgeHours; @property (nonatomic, readonly) BOOL isQueueBeingModified; @end diff --git a/ios/src/CountlyPersistency.m b/ios/src/CountlyPersistency.m index 4cd06c8d..85b6cbb9 100644 --- a/ios/src/CountlyPersistency.m +++ b/ios/src/CountlyPersistency.m @@ -71,7 +71,7 @@ - (instancetype)init - (void)addToQueue:(NSString *)queryString { - if(!CountlyServerConfig.sharedInstance.trackingEnabled) + if (!CountlyServerConfig.sharedInstance.trackingEnabled) { CLY_LOG_D(@"'addToQueue' is aborted: SDK Tracking is disabled from server config!"); return; @@ -79,13 +79,21 @@ - (void)addToQueue:(NSString *)queryString if (!queryString.length || [queryString isEqual:NSNull.null]) return; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; @synchronized (self) { [self.queuedRequests addObject:queryString]; - if (self.queuedRequests.count > self.storedRequestsLimit && !CountlyConnectionManager.sharedInstance.connection) - [self.queuedRequests removeObjectAtIndex:0]; + { + [self removeOldAgeRequestsFromQueue]; + if (self.queuedRequests.count > self.storedRequestsLimit && !CountlyConnectionManager.sharedInstance.connection) + { + [self.queuedRequests removeObjectAtIndex:0]; + } + } } } @@ -199,6 +207,49 @@ - (void)removeDifferentAppKeysFromQueue } } +- (void)removeOldAgeRequestsFromQueue +{ + @synchronized (self) + { + if(self.requestDropAgeHours && self.requestDropAgeHours > 0) { + self.isQueueBeingModified = YES; + + NSPredicate* predicate = [NSPredicate predicateWithBlock:^BOOL(NSString* queryString, NSDictionary * bindings) + { + BOOL isOldAgeRequest = [self isOldRequestInternal:queryString]; + return !isOldAgeRequest; + }]; + + [self.queuedRequests filterUsingPredicate:predicate]; + + self.isQueueBeingModified = NO; + } + } +} + +-(BOOL)isOldRequest:(NSString*) queryString +{ + if(self.requestDropAgeHours && self.requestDropAgeHours > 0) { + return [self isOldRequestInternal:queryString]; + } + return false; + +} + +-(BOOL)isOldRequestInternal:(NSString *)queryString +{ + double requestTimeStamp = [[queryString cly_valueForQueryStringKey:kCountlyQSKeyTimestamp] longLongValue]/1000.0; + double durationInSecods = NSDate.date.timeIntervalSince1970 - requestTimeStamp; + double durationInHours = (durationInSecods/3600.0); + BOOL isOldAgeRequest = durationInHours >= self.requestDropAgeHours; + if (isOldAgeRequest) + { + CLY_LOG_D(@"Detected a request with an old age (age in hours: %f) in queue and removed it.", durationInHours); + } + + return isOldAgeRequest; +} + #pragma mark --- - (void)recordEvent:(CountlyEvent *)event diff --git a/ios/src/CountlyRCData.m b/ios/src/CountlyRCData.m index 70a1ce4f..2ca75dcc 100644 --- a/ios/src/CountlyRCData.m +++ b/ios/src/CountlyRCData.m @@ -16,7 +16,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder { } - (id)initWithCoder:(NSCoder *)decoder { - if((self = [super init])) { + if ((self = [super init])) { self.value = [decoder decodeObjectForKey:NSStringFromSelector(@selector(value))]; self.isCurrentUsersData = [decoder decodeBoolForKey:NSStringFromSelector(@selector(isCurrentUsersData))]; } diff --git a/ios/src/CountlyRemoteConfig.h b/ios/src/CountlyRemoteConfig.h index b782913f..86bfee20 100644 --- a/ios/src/CountlyRemoteConfig.h +++ b/ios/src/CountlyRemoteConfig.h @@ -6,6 +6,7 @@ #import #import "CountlyRCData.h" +#import "CountlyExperimentInformation.h" @interface CountlyRemoteConfig : NSObject @@ -16,6 +17,10 @@ - (NSDictionary *)getAllValues; +- (CountlyRCData *)getValueAndEnroll:(NSString *)key; + +- (NSDictionary *)getAllValuesAndEnroll; + -(void)registerDownloadCallback:(RCDownloadCallback) callback; -(void)removeDownloadCallback:(RCDownloadCallback) callback; @@ -38,6 +43,9 @@ - (void)testingEnrollIntoVariant:(NSString *)key variantName:(NSString *)variantName completionHandler:(RCVariantCallback)completionHandler; +- (void) testingDownloadExperimentInformation:(RCVariantCallback)completionHandler; +- (NSDictionary *) testingGetAllExperimentInfo; + - (void)clearAll; @end diff --git a/ios/src/CountlyRemoteConfig.m b/ios/src/CountlyRemoteConfig.m index c5a78eda..45e45c9b 100644 --- a/ios/src/CountlyRemoteConfig.m +++ b/ios/src/CountlyRemoteConfig.m @@ -69,6 +69,18 @@ - (CountlyRCData *)getValue:(NSString *)key return [CountlyRemoteConfigInternal.sharedInstance getAllValues]; } +- (CountlyRCData *)getValueAndEnroll:(NSString *)key +{ + CLY_LOG_I(@"%s %@", __FUNCTION__, key); + return [CountlyRemoteConfigInternal.sharedInstance getValueAndEnroll:key]; +} + +- (NSDictionary *)getAllValuesAndEnroll +{ + CLY_LOG_I(@"%s", __FUNCTION__); + return [CountlyRemoteConfigInternal.sharedInstance getAllValuesAndEnroll]; +} + - (void)enrollIntoABTestsForKeys:(NSArray *)keys { CLY_LOG_I(@"%s %@", __FUNCTION__, keys); @@ -113,6 +125,19 @@ - (void)downloadOmittingKeys:(NSArray *)omitKeys completionHandler:(RCDownloadCa [CountlyRemoteConfigInternal.sharedInstance downloadValuesForKeys:nil omitKeys:omitKeys completionHandler:completionHandler]; } +- (void) testingDownloadExperimentInformation:(RCVariantCallback)completionHandler; +{ + CLY_LOG_I(@"%s %@", __FUNCTION__, completionHandler); + + [CountlyRemoteConfigInternal.sharedInstance testingDownloadExperimentInformation:completionHandler]; +} + +- (NSDictionary *) testingGetAllExperimentInfo +{ + CLY_LOG_I(@"%s", __FUNCTION__); + return [CountlyRemoteConfigInternal.sharedInstance testingGetAllExperimentInfo]; +} + - (void)clearAll { [CountlyRemoteConfigInternal.sharedInstance clearAll]; diff --git a/ios/src/CountlyRemoteConfigInternal.h b/ios/src/CountlyRemoteConfigInternal.h index 4879761e..137f1c07 100644 --- a/ios/src/CountlyRemoteConfigInternal.h +++ b/ios/src/CountlyRemoteConfigInternal.h @@ -24,7 +24,13 @@ - (void)downloadRemoteConfigAutomatically; + - (CountlyRCData *)getValue:(NSString *)key; +- (NSDictionary *)getAllValues; + +- (CountlyRCData *)getValueAndEnroll:(NSString *)key; +- (NSDictionary *)getAllValuesAndEnroll; + - (void)downloadValuesForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys completionHandler:(RCDownloadCallback)completionHandler; - (NSDictionary *)testingGetAllVariants; @@ -32,7 +38,9 @@ - (void)testingDownloadAllVariants:(RCVariantCallback)completionHandler; - (void)testingEnrollIntoVariant:(NSString *)key variantName:(NSString *)variantName completionHandler:(RCVariantCallback)completionHandler; -- (NSDictionary *)getAllValues; +- (void) testingDownloadExperimentInformation:(RCVariantCallback)completionHandler; +- (NSDictionary *) testingGetAllExperimentInfo; + - (void)enrollIntoABTestsForKeys:(NSArray *)keys; - (void)exitABTestsForKeys:(NSArray *)keys; diff --git a/ios/src/CountlyRemoteConfigInternal.m b/ios/src/CountlyRemoteConfigInternal.m index ec57c4cf..0854e76b 100644 --- a/ios/src/CountlyRemoteConfigInternal.m +++ b/ios/src/CountlyRemoteConfigInternal.m @@ -9,14 +9,13 @@ NSString* const kCountlyRCKeyFetchRemoteConfig = @"fetch_remote_config"; NSString* const kCountlyRCKeyFetchVariant = @"ab_fetch_variants"; NSString* const kCountlyRCKeyEnrollVariant = @"ab_enroll_variant"; +NSString* const kCountlyRCKeyFetchExperiments = @"ab_fetch_experiments"; NSString* const kCountlyRCKeyVariant = @"variant"; NSString* const kCountlyRCKeyKey = @"key"; NSString* const kCountlyRCKeyKeys = @"keys"; NSString* const kCountlyRCKeyOmitKeys = @"omit_keys"; NSString* const kCountlyRCKeyRC = @"rc"; -NSString* const kCountlyRCKeyABOptIn = @"ab"; -NSString* const kCountlyRCKeyABOptOut = @"ab_opt_out"; NSString* const kCountlyRCKeyAutoOptIn = @"oi"; @@ -27,6 +26,7 @@ @interface CountlyRemoteConfigInternal () @property (nonatomic) NSDictionary* localCachedVariants; @property (nonatomic) NSDictionary* cachedRemoteConfig; +@property (nonatomic) NSDictionary * localCachedExperiments; @end @implementation CountlyRemoteConfigInternal @@ -46,9 +46,14 @@ - (instancetype)init { if (self = [super init]) { - self.cachedRemoteConfig = [CountlyPersistency.sharedInstance retrieveRemoteConfig] ; + self.cachedRemoteConfig = [CountlyPersistency.sharedInstance retrieveRemoteConfig]; + if(!self.cachedRemoteConfig) { + self.cachedRemoteConfig = NSMutableDictionary.new; + } self.remoteConfigGlobalCallbacks = [[NSMutableArray alloc] init]; + + self.localCachedExperiments = NSMutableDictionary.new; } return self; @@ -153,7 +158,7 @@ - (void)updateRemoteConfigForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys c - (id)remoteConfigValueForKey:(NSString *)key { CountlyRCData* countlyRCValue = self.cachedRemoteConfig[key]; - if(countlyRCValue) { + if (countlyRCValue) { return countlyRCValue.value; } return nil; @@ -161,7 +166,7 @@ - (id)remoteConfigValueForKey:(NSString *)key - (void)clearCachedRemoteConfig { - if(!self.isRCValueCachingEnabled) + if (!self.isRCValueCachingEnabled) { [self clearAll]; } @@ -173,7 +178,7 @@ - (void)clearCachedRemoteConfig -(void)clearAll { - self.cachedRemoteConfig = nil; + self.cachedRemoteConfig = NSMutableDictionary.new; [CountlyPersistency.sharedInstance storeRemoteConfig:self.cachedRemoteConfig]; } @@ -250,14 +255,17 @@ - (NSURLRequest *)remoteConfigRequestForKeys:(NSArray *)keys omitKeys:(NSArray * queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyOmitKeys, [omitKeys cly_JSONify]]; } + if (self.enrollABOnRCDownload) { + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyAutoOptIn, @"1"]; + } + if (CountlyConsentManager.sharedInstance.consentForSessions) { queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMetrics, [CountlyDeviceInfo metrics]]; } - if(self.enrollABOnRCDownload) { - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyAutoOptIn, @"1"]; - } + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; @@ -282,7 +290,11 @@ - (NSURLRequest *)remoteConfigRequestForKeys:(NSArray *)keys omitKeys:(NSArray * - (CountlyRCData *)getValue:(NSString *)key { - return self.cachedRemoteConfig[key]; + CountlyRCData *countlyRCData = self.cachedRemoteConfig[key]; + if (!countlyRCData) { + countlyRCData = [[CountlyRCData alloc] initWithValue:nil isCurrentUsersData:YES]; + } + return countlyRCData; } - (NSDictionary *)getAllValues @@ -290,6 +302,29 @@ - (CountlyRCData *)getValue:(NSString *)key return self.cachedRemoteConfig; } +- (CountlyRCData *)getValueAndEnroll:(NSString *)key +{ + CountlyRCData *countlyRCData = [self getValue:key]; + if (countlyRCData.value) { + [self enrollIntoABTestsForKeys:@[key]]; + } + else { + CLY_LOG_D(@"No value exists against key: %@ to enroll in AB testing", key); + } + return countlyRCData; +} + +- (NSDictionary *)getAllValuesAndEnroll +{ + if (self.cachedRemoteConfig && self.cachedRemoteConfig.count > 0) { + [self enrollIntoABTestsForKeys: self.cachedRemoteConfig.allKeys]; + } + else { + CLY_LOG_D(@"No values exists to enroll in AB testing..."); + } + return self.cachedRemoteConfig; +} + - (void)enrollIntoABTestsForKeys:(NSArray *)keys { if (!CountlyConsentManager.sharedInstance.consentForRemoteConfig) @@ -301,8 +336,7 @@ - (void)enrollIntoABTestsForKeys:(NSArray *)keys CLY_LOG_D(@"Entolling in AB Tests..."); - [self enrollExitABForKeys:keys enroll:YES]; - + [CountlyConnectionManager.sharedInstance sendEnrollABRequestForKeys:keys]; } - (void)exitABTestsForKeys:(NSArray *)keys @@ -316,7 +350,7 @@ - (void)exitABTestsForKeys:(NSArray *)keys CLY_LOG_D(@"Exiting AB Tests..."); - [self enrollExitABForKeys:keys enroll:NO]; + [CountlyConnectionManager.sharedInstance sendExitABRequestForKeys:keys]; } - (void)downloadValuesForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys completionHandler:(RCDownloadCallback)completionHandler @@ -337,7 +371,6 @@ - (void)downloadValuesForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys compl if (!error) { CLY_LOG_D(@"Fetching remote config is successful. \n%@", remoteConfig); -// NSDictionary* remoteConfigMeta = [self createRCMeta:remoteConfig]; if (!keys && !omitKeys) { fullValueUpdate = true; @@ -448,6 +481,7 @@ - (void)testingDownloadAllVariants:(RCVariantCallback)completionHandler }]; } + - (void)testingDownloadAllVariantsInternal:(void (^)(CLYRequestResult response, NSDictionary* variants, NSError * error))completionHandler { if (!CountlyServerConfig.sharedInstance.networkingEnabled) @@ -473,7 +507,7 @@ - (void)testingDownloadAllVariantsInternal:(void (^)(CLYRequestResult response, { NSString *valueType = NSStringFromClass([arrayValue class]); - if([valueType isEqualToString:@"__NSDictionaryI"]) { + if ([valueType isEqualToString:@"__NSDictionaryI"]) { [valuesArray addObject:arrayValue[@"name"]]; } else { @@ -559,12 +593,12 @@ - (void)testingEnrollIntoVariantInternal:(NSString *)key variantName:(NSString * return; } - if(!key) { + if (!key) { CLY_LOG_D(@"'enrollInRCVariant' is aborted: 'key' is not valid"); return; } - if(!variantName) { + if (!variantName) { CLY_LOG_D(@"'enrollInRCVariant' is aborted: 'variantName' is not valid"); return; } @@ -623,10 +657,8 @@ - (NSURLRequest *)downloadVariantsRequest queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyFetchVariant]; - if (CountlyConsentManager.sharedInstance.consentForSessions) - { - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMetrics, [CountlyDeviceInfo metrics]]; - } + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; @@ -649,101 +681,155 @@ - (NSURLRequest *)downloadVariantsRequest } } -- (NSURLRequest *)enrollInVarianRequestForKey:(NSString *)key variantName:(NSString *)variantName +- (void) testingDownloadExperimentInformation:(RCVariantCallback)completionHandler { - NSString* queryString = [CountlyConnectionManager.sharedInstance queryEssentials]; - - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyEnrollVariant]; - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyKey, key]; - if (variantName) + if (!CountlyConsentManager.sharedInstance.consentForRemoteConfig) { - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyVariant, variantName.cly_URLEscaped]; + CLY_LOG_D(@"'testingDownloadExperimentInformation' is aborted: RemoteConfig consent requires"); + return; } - - if (CountlyConsentManager.sharedInstance.consentForSessions) + if (CountlyDeviceInfo.sharedInstance.isDeviceIDTemporary) { - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMetrics, [CountlyDeviceInfo metrics]]; + CLY_LOG_D(@"'testingDownloadExperimentInformation' is aborted: Due to temporary device id"); + return; } - queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; + CLY_LOG_D(@"Download experiments info..."); - NSString* serverOutputSDKEndpoint = [CountlyConnectionManager.sharedInstance.host stringByAppendingFormat:@"%@", - kCountlyEndpointI]; - - if (CountlyConnectionManager.sharedInstance.alwaysUsePOST) - { - NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverOutputSDKEndpoint]]; - request.HTTPMethod = @"POST"; - request.HTTPBody = [queryString cly_dataUTF8]; - return request.copy; - } - else - { - NSString* withQueryString = [serverOutputSDKEndpoint stringByAppendingFormat:@"?%@", queryString]; - NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:withQueryString]]; - return request; - } + [self testingDownloaExperimentInfoInternal:^(CLYRequestResult response, NSDictionary *experimentInfo,NSError *error) + { + if (!error) + { + self.localCachedExperiments = experimentInfo; + CLY_LOG_D(@"Download experiments info is successful. \n%@", experimentInfo); + + } + else + { + CLY_LOG_W(@"Download experiments info failed: %@", error); + } + + if (completionHandler) + completionHandler(response, error); + }]; } -- (void)enrollExitABForKeys:(NSArray *)keys enroll:(BOOL)enroll + +- (void)testingDownloaExperimentInfoInternal:(void (^)(CLYRequestResult response, NSDictionary* experimentsInfo, NSError * error))completionHandler { if (!CountlyServerConfig.sharedInstance.networkingEnabled) { - CLY_LOG_D(@"'%@' is aborted: SDK Networking is disabled from server config!", enroll ? @"enrollABTestForKeys" : @"exitABTestForKeys"); + CLY_LOG_D(@"'testingDownloaExperimentInfoInternal' is aborted: SDK Networking is disabled from server config!"); return; } + if (!completionHandler) + return; - NSURLRequest* request = enroll ? [self enrollABRequestForKeys:keys] : [self exitABRequestForKeys:keys]; + NSURLRequest* request = [self downloadExperimentInfoRequest]; NSURLSessionTask* task = [NSURLSession.sharedSession dataTaskWithRequest:request completionHandler:^(NSData* data, NSURLResponse* response, NSError* error) { - if (error) + NSMutableDictionary * experiments = NSMutableDictionary.new; + + if (!error) { - CLY_LOG_D(@"%@ Request <%p> failed!\nError: %@", enroll ? @"enrollABTestForKeys" : @"exitABTestForKeys", request, error); + + NSArray* experimentsInfo = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + [experimentsInfo enumerateObjectsUsingBlock:^(NSDictionary* value, NSUInteger idx, BOOL * stop) + { + CountlyExperimentInformation* experimentInfo = [[CountlyExperimentInformation alloc] initWithID:value[@"id"] experimentName:value[@"name"] experimentDescription:value[@"description"] currentVariant:value[@"currentVariant"] variants:value[@"variants"]]; + experiments[experimentInfo.experimentID] = experimentInfo; + + }]; } - else + + if (!error) { - CLY_LOG_D(@"%@ Request <%p> successfully completed.", enroll ? @"enrollABTestForKeys" : @"exitABTestForKeys", request); + if (((NSHTTPURLResponse*)response).statusCode != 200) + { + NSMutableDictionary* userInfo = experiments.mutableCopy; + userInfo[NSLocalizedDescriptionKey] = @"Fetch variants general API error"; + error = [NSError errorWithDomain:kCountlyErrorDomain code:CLYErrorRemoteConfigGeneralAPIError userInfo:userInfo]; + } } + if (error) + { + CLY_LOG_D(@"Download experiments Request <%p> failed!\nError: %@", request, error); + + dispatch_async(dispatch_get_main_queue(), ^ + { + completionHandler(CLYResponseError, nil, error); + }); + + return; + } + + CLY_LOG_D(@"Download experiments Request <%p> successfully completed.", request); + + dispatch_async(dispatch_get_main_queue(), ^ + { + completionHandler(CLYResponseSuccess, experiments, nil); + }); }]; [task resume]; - CLY_LOG_D(@"%@ Request <%p> started:\n[%@] %@", enroll ? @"enrollABTestForKeys" : @"exitABTestForKeys", (id)request, request.HTTPMethod, request.URL.absoluteString); + CLY_LOG_D(@"Download experiments Request <%p> started:\n[%@] %@", (id)request, request.HTTPMethod, request.URL.absoluteString); } -- (NSURLRequest *)enrollABRequestForKeys:(NSArray*)keys +- (NSURLRequest *)downloadExperimentInfoRequest { - return [self aBRequestForMethod:kCountlyRCKeyABOptIn keys:keys]; + NSString* queryString = [CountlyConnectionManager.sharedInstance queryEssentials]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyFetchExperiments]; + + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; + + queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; + + NSString* serverOutputSDKEndpoint = [CountlyConnectionManager.sharedInstance.host stringByAppendingFormat:@"%@%@", + kCountlyEndpointO, + kCountlyEndpointSDK]; + + if (CountlyConnectionManager.sharedInstance.alwaysUsePOST) + { + NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverOutputSDKEndpoint]]; + request.HTTPMethod = @"POST"; + request.HTTPBody = [queryString cly_dataUTF8]; + return request.copy; + } + else + { + NSString* withQueryString = [serverOutputSDKEndpoint stringByAppendingFormat:@"?%@", queryString]; + NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:withQueryString]]; + return request; + } } - -- (NSURLRequest *)exitABRequestForKeys:(NSArray*)keys +- (NSDictionary *) testingGetAllExperimentInfo { - return [self aBRequestForMethod:kCountlyRCKeyABOptOut keys:keys]; + return self.localCachedExperiments; } -- (NSURLRequest *)aBRequestForMethod:(NSString*)method keys:(NSArray*)keys +- (NSURLRequest *)enrollInVarianRequestForKey:(NSString *)key variantName:(NSString *)variantName { NSString* queryString = [CountlyConnectionManager.sharedInstance queryEssentials]; - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyABOptIn]; - - if (keys) + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMethod, kCountlyRCKeyEnrollVariant]; + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyKey, key]; + if (variantName) { - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyKeys, [keys cly_JSONify]]; + queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyRCKeyVariant, variantName.cly_URLEscaped]; } - if (CountlyConsentManager.sharedInstance.consentForSessions) - { - queryString = [queryString stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyMetrics, [CountlyDeviceInfo metrics]]; - } + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; - NSString* serverOutputSDKEndpoint = [CountlyConnectionManager.sharedInstance.host stringByAppendingFormat:@"%@%@", - kCountlyEndpointO, - kCountlyEndpointSDK]; + NSString* serverOutputSDKEndpoint = [CountlyConnectionManager.sharedInstance.host stringByAppendingFormat:@"%@", + kCountlyEndpointI]; if (CountlyConnectionManager.sharedInstance.alwaysUsePOST) { diff --git a/ios/src/CountlyServerConfig.m b/ios/src/CountlyServerConfig.m index 8f1b42b3..300f14e7 100644 --- a/ios/src/CountlyServerConfig.m +++ b/ios/src/CountlyServerConfig.m @@ -33,7 +33,7 @@ - (instancetype)init self.trackingEnabled = YES; self.networkingEnabled = YES; NSDictionary* serverConfigObject = [CountlyPersistency.sharedInstance retrieveServerConfig]; - if(serverConfigObject) { + if (serverConfigObject) { [self populateServerConfig:serverConfigObject]; } } @@ -59,11 +59,11 @@ - (BOOL)networkingEnabled - (void)populateServerConfig:(NSDictionary *)dictionary { - if(dictionary[@"tracking"]) + if (dictionary[@"tracking"]) { self.trackingEnabled = [dictionary[@"tracking"] boolValue]; } - if(dictionary[@"networking"]) + if (dictionary[@"networking"]) { self.networkingEnabled = [dictionary[@"networking"] boolValue]; } @@ -111,7 +111,7 @@ - (void)fetchServerConfig } NSDictionary* serverConfigObject = serverConfigResponse[@"c"]; - if(serverConfigObject) { + if (serverConfigObject) { [self populateServerConfig:serverConfigObject]; [CountlyPersistency.sharedInstance storeServerConfig:serverConfigObject]; } @@ -130,6 +130,9 @@ - (NSURLRequest *)serverConfigRequest kCountlyQSKeySDKName, CountlyCommon.sharedInstance.SDKName, kCountlyQSKeySDKVersion, CountlyCommon.sharedInstance.SDKVersion]; + queryString = [queryString stringByAppendingFormat:@"&%@=%@", + kCountlyAppVersionKey, CountlyDeviceInfo.appVersion]; + queryString = [CountlyConnectionManager.sharedInstance appendChecksum:queryString]; NSMutableString* URL = CountlyConnectionManager.sharedInstance.host.mutableCopy; diff --git a/ios/src/CountlyViewData.h b/ios/src/CountlyViewData.h index 774243b4..ec4fd6c3 100644 --- a/ios/src/CountlyViewData.h +++ b/ios/src/CountlyViewData.h @@ -35,6 +35,13 @@ */ @property (nonatomic) BOOL isAutoPaused; + +/** + * Segmentation for a view. + * @discussion You can set this segmentation after the view has started using the "addSegmentationToViewWithID:" or "addSegmentationToViewWithID" methods of view interface. + */ +@property (nonatomic) NSMutableDictionary* segmentation; + /** * Initialize view data * @discussion If set then this view will automatically stopped when new view is started. diff --git a/ios/src/CountlyViewTracking.h b/ios/src/CountlyViewTracking.h index 5986a1ae..ee2850fc 100644 --- a/ios/src/CountlyViewTracking.h +++ b/ios/src/CountlyViewTracking.h @@ -30,5 +30,8 @@ - (void)stopAllViews:(NSDictionary *)segmentation; +- (void)addSegmentationToViewWithID:(NSString *)viewID segmentation:(NSDictionary *)segmentation; + +- (void)addSegmentationToViewWithName:(NSString *)viewName segmentation:(NSDictionary *)segmentation; @end diff --git a/ios/src/CountlyViewTracking.m b/ios/src/CountlyViewTracking.m index a41d7b2c..397b72dc 100644 --- a/ios/src/CountlyViewTracking.m +++ b/ios/src/CountlyViewTracking.m @@ -86,4 +86,15 @@ - (void)stopAllViews:(NSDictionary *)segmentation [CountlyViewTrackingInternal.sharedInstance stopAllViews:segmentation]; } + +- (void)addSegmentationToViewWithID:(NSString *)viewID segmentation:(NSDictionary *)segmentation +{ + [CountlyViewTrackingInternal.sharedInstance addSegmentationToViewWithID:viewID segmentation:segmentation]; +} + +- (void)addSegmentationToViewWithName:(NSString *)viewName segmentation:(NSDictionary *)segmentation +{ + [CountlyViewTrackingInternal.sharedInstance addSegmentationToViewWithName:viewName segmentation:segmentation]; +} + @end diff --git a/ios/src/CountlyViewTrackingInternal.h b/ios/src/CountlyViewTrackingInternal.h index 8bc36cf9..a27e19c8 100644 --- a/ios/src/CountlyViewTrackingInternal.h +++ b/ios/src/CountlyViewTrackingInternal.h @@ -38,6 +38,9 @@ extern NSString* const kCountlyReservedEventView; - (void)applicationWillTerminate; - (void)resetFirstView; +- (void)addSegmentationToViewWithID:(NSString *)viewID segmentation:(NSDictionary *)segmentation; +- (void)addSegmentationToViewWithName:(NSString *)viewName segmentation:(NSDictionary *)segmentation; + #if (TARGET_OS_IOS || TARGET_OS_TV) - (void)addAutoViewTrackingExclutionList:(NSArray *)viewTrackingExclusionList; #endif diff --git a/ios/src/CountlyViewTrackingInternal.m b/ios/src/CountlyViewTrackingInternal.m index 91bd7601..e36ffcb1 100644 --- a/ios/src/CountlyViewTrackingInternal.m +++ b/ios/src/CountlyViewTrackingInternal.m @@ -98,7 +98,7 @@ - (instancetype)init self.viewDataDictionary = NSMutableDictionary.new; self.viewSegmentation = nil; - self.isFirstView = true; + self.isFirstView = YES; } return self; @@ -136,7 +136,7 @@ - (void)setGlobalViewSegmentation:(NSMutableDictionary *)segmentation - (void)updateGlobalViewSegmentation:(NSDictionary *)segmentation { CLY_LOG_I(@"%s %@", __FUNCTION__, segmentation); - if(!self.viewSegmentation) { + if (!self.viewSegmentation) { self.viewSegmentation = NSMutableDictionary.new; } @@ -149,7 +149,7 @@ - (NSString *)startView:(NSString *)viewName segmentation:(NSDictionary *)segmen { CLY_LOG_I(@"%s %@ %@", __FUNCTION__, viewName, segmentation); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually start view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return nil; } @@ -162,12 +162,12 @@ - (NSString *)startAutoStoppedView:(NSString *)viewName segmentation:(NSDictiona { CLY_LOG_I(@"%s %@ %@", __FUNCTION__, viewName, segmentation); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually start view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return nil; } #endif - NSString* viewID = [self startViewInternal:viewName customSegmentation:segmentation isAutoStoppedView:true]; + NSString* viewID = [self startViewInternal:viewName customSegmentation:segmentation isAutoStoppedView:YES]; return viewID; } @@ -175,7 +175,7 @@ - (void)stopViewWithName:(NSString *)viewName segmentation:(NSDictionary *)segme { CLY_LOG_I(@"%s %@ %@", __FUNCTION__, viewName, segmentation); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually stop view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return; } @@ -188,7 +188,7 @@ - (void)stopViewWithID:(NSString *)viewID segmentation:(NSDictionary *)segmentat { CLY_LOG_I(@"%s %@ %@", __FUNCTION__, viewID, segmentation); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually stop view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return; } @@ -200,7 +200,7 @@ - (void)pauseViewWithID:(NSString *)viewID { CLY_LOG_I(@"%s %@", __FUNCTION__, viewID); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually pause view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return; } @@ -212,7 +212,7 @@ - (void)resumeViewWithID:(NSString *)viewID { CLY_LOG_I(@"%s %@", __FUNCTION__, viewID); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually resume view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return; } @@ -224,7 +224,7 @@ - (void)stopAllViews:(NSDictionary *)segmentation { CLY_LOG_I(@"%s %@", __FUNCTION__, segmentation); #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { CLY_LOG_W(@"%s Manually stop view tracking is not allowed when automatic tracking is enabled!", __FUNCTION__); return; } @@ -271,7 +271,7 @@ - (void)setIsAutoViewTrackingActive:(BOOL)isAutoViewTrackingActive if (!CountlyConsentManager.sharedInstance.consentForViewTracking) return; - if(_isAutoViewTrackingActive != isAutoViewTrackingActive) { + if (_isAutoViewTrackingActive != isAutoViewTrackingActive) { [self stopAllViewsInternal:nil]; } @@ -310,7 +310,7 @@ - (void)stopViewWithNameInternal:(NSString *) viewName customSegmentation:(NSDic __block NSString *viewID = nil; [self.viewDataDictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, CountlyViewData * viewData, BOOL * stop) { - if([viewData.viewName isEqualToString:viewName]) + if ([viewData.viewName isEqualToString:viewName]) { viewID = key; *stop = YES; @@ -318,7 +318,7 @@ - (void)stopViewWithNameInternal:(NSString *) viewName customSegmentation:(NSDic }]; - if(viewID) + if (viewID) { [self stopViewWithIDInternal:viewID customSegmentation:customSegmentation]; } @@ -329,7 +329,7 @@ - (void)stopViewWithNameInternal:(NSString *) viewName customSegmentation:(NSDic - (void)stopViewWithIDInternal:(NSString *) viewKey customSegmentation:(NSDictionary *)customSegmentation { - [self stopViewWithIDInternal:viewKey customSegmentation:customSegmentation autoPaused:false]; + [self stopViewWithIDInternal:viewKey customSegmentation:customSegmentation autoPaused:NO]; } - (void)stopViewWithIDInternal:(NSString *) viewKey customSegmentation:(NSDictionary *)customSegmentation autoPaused:(BOOL) autoPaused{ @@ -348,6 +348,11 @@ - (void)stopViewWithIDInternal:(NSString *) viewKey customSegmentation:(NSDictio segmentation[kCountlyVTKeyName] = viewData.viewName; segmentation[kCountlyVTKeySegment] = CountlyDeviceInfo.osName; + if (viewData.segmentation) + { + [segmentation addEntriesFromDictionary:viewData.segmentation]; + } + if (self.viewSegmentation) { [segmentation addEntriesFromDictionary:self.viewSegmentation]; @@ -364,7 +369,7 @@ - (void)stopViewWithIDInternal:(NSString *) viewKey customSegmentation:(NSDictio [Countly.sharedInstance recordReservedEvent:kCountlyReservedEventView segmentation:segmentation count:1 sum:0 duration:duration ID:viewData.viewID timestamp:CountlyCommon.sharedInstance.uniqueTimestamp]; CLY_LOG_D(@"%s View tracking ended: %@ duration: %.17g", __FUNCTION__, viewData.viewName, duration); - if(!autoPaused) { + if (!autoPaused) { [self.viewDataDictionary removeObjectForKey:viewKey]; } } @@ -375,7 +380,7 @@ - (void)stopViewWithIDInternal:(NSString *) viewKey customSegmentation:(NSDictio - (NSString*)startViewInternal:(NSString *)viewName customSegmentation:(NSDictionary *)customSegmentation { - return [self startViewInternal:viewName customSegmentation:customSegmentation isAutoStoppedView:false]; + return [self startViewInternal:viewName customSegmentation:customSegmentation isAutoStoppedView:NO]; } - (NSString*)startViewInternal:(NSString *)viewName customSegmentation:(NSDictionary *)customSegmentation isAutoStoppedView:(BOOL) isAutoStoppedView @@ -404,7 +409,7 @@ - (NSString*)startViewInternal:(NSString *)viewName customSegmentation:(NSDictio if (self.isFirstView) { - self.isFirstView = false; + self.isFirstView = NO; segmentation[kCountlyVTKeyStart] = @1; } @@ -478,7 +483,7 @@ - (void)resumeViewWithIDInternal:(NSString *) viewID -(CountlyViewData* ) currentView { - if(!self.currentViewID) + if (!self.currentViewID) return nil; return [self.viewDataDictionary objectForKey:self.currentViewID]; } @@ -501,46 +506,34 @@ - (void)stopCurrentView } } -- (void)pauseCurrentView -{ - if (self.currentView) - { - [self pauseViewInternal:self.currentView]; - } -} - -- (void)resumeCurrentView -{ - [self.currentView resumeView]; -} - (void)pauseAllViewsInternal { [self.viewDataDictionary enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, CountlyViewData * _Nonnull viewData, BOOL * _Nonnull stop) { - [self pauseViewInternal:viewData autoPaused:true]; + [self pauseViewInternal:viewData autoPaused:YES]; }]; } - (void)pauseViewInternal:(CountlyViewData*) viewData { - [self pauseViewInternal:viewData]; + [self pauseViewInternal:viewData autoPaused:NO]; } - (void)pauseViewInternal:(CountlyViewData*) viewData autoPaused:(BOOL) autoPaused { - if(autoPaused) { + if (autoPaused) { [viewData autoPauseView]; } else { [viewData pauseView]; } - [self stopViewWithIDInternal:viewData.viewID customSegmentation:nil autoPaused:true]; + [self stopViewWithIDInternal:viewData.viewID customSegmentation:nil autoPaused:YES]; } - (void)resumeAllViewsInternal { [self.viewDataDictionary enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, CountlyViewData * _Nonnull viewData, BOOL * _Nonnull stop) { - if(viewData.isAutoPaused) + if (viewData.isAutoPaused) { [viewData resumeView]; } @@ -556,6 +549,73 @@ - (void)stopAllViewsInternal:(NSDictionary *)segmentation }]; } +- (void)addSegmentationToViewWithNameInternal:(NSString *) viewName segmentation:(NSDictionary *)segmentation +{ + if (!viewName || !viewName.length) + { + CLY_LOG_D(@"%s View name should not be null or empty", __FUNCTION__); + return; + } + + __block NSString *viewID = nil; + [self.viewDataDictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, CountlyViewData * viewData, BOOL * stop) + { + if ([viewData.viewName isEqualToString:viewName]) + { + viewID = key; + *stop = YES; + } + + }]; + + if (viewID) + { + [self addSegmentationToViewWithIDInternal:viewID segmentation:segmentation]; + } + else { + CLY_LOG_D(@"%s No View exist with name: %@", __FUNCTION__, viewName); + } +} + +- (void)addSegmentationToViewWithIDInternal:(NSString *) viewID segmentation:(NSDictionary *)segmentation{ + if (!viewID || !viewID.length) + { + CLY_LOG_D(@"%s View ID should not be null or empty", __FUNCTION__); + return; + } + + if (!CountlyConsentManager.sharedInstance.consentForViewTracking) + return; + CountlyViewData* viewData = self.viewDataDictionary[viewID]; + if (viewData) + { + NSMutableDictionary *mutableSegmentation = segmentation.mutableCopy; + [mutableSegmentation removeObjectsForKeys:self.reservedViewTrackingSegmentationKeys]; + if(mutableSegmentation) { + if(!viewData.segmentation) { + viewData.segmentation = NSMutableDictionary.new; + } + [viewData.segmentation addEntriesFromDictionary:mutableSegmentation]; + } + [self.viewDataDictionary setObject:viewData forKey:viewID]; + } + else { + CLY_LOG_D(@"%s No View exist with ID: %@", __FUNCTION__, viewID); + } +} + + +- (void)addSegmentationToViewWithID:(NSString *)viewID segmentation:(NSDictionary *)segmentation +{ + CLY_LOG_I(@"%s %@ %@", __FUNCTION__, viewID, segmentation); + [self addSegmentationToViewWithIDInternal:viewID segmentation:segmentation]; +} + +- (void)addSegmentationToViewWithName:(NSString *)viewName segmentation:(NSDictionary *)segmentation +{ + CLY_LOG_I(@"%s %@ %@", __FUNCTION__, viewName, segmentation); + [self addSegmentationToViewWithNameInternal:viewName segmentation:segmentation]; +} #pragma mark - Internal auto view tracking methods @@ -644,7 +704,7 @@ - (NSString*)titleForViewController:(UIViewController *)viewController - (void)applicationWillEnterForeground { #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { } else { @@ -656,7 +716,7 @@ - (void)applicationWillEnterForeground { } - (void)applicationDidEnterBackground { #if (TARGET_OS_IOS || TARGET_OS_TV) - if(self.isAutoViewTrackingActive) { + if (self.isAutoViewTrackingActive) { [self stopCurrentView]; } else { @@ -674,7 +734,7 @@ - (void)applicationWillTerminate { - (void)resetFirstView { - self.isFirstView = false; + self.isFirstView = NO; } diff --git a/ios/src/README.md b/ios/src/README.md index 3e11cefa..f0d6d5fb 100644 --- a/ios/src/README.md +++ b/ios/src/README.md @@ -1,26 +1,26 @@ -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/68dc667ef1e6465e99fa9d4b2ee56e58)](https://www.codacy.com/gh/Countly/countly-sdk-ios/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Countly/countly-sdk-ios&utm_campaign=Badge_Grade) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/68dc667ef1e6465e99fa9d4b2ee56e58)](https://app.codacy.com/gh/Countly/countly-sdk-ios/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) # Countly iOS SDK -This repository contains the Countly iOS SDK, which can be integrated into iOS, watchOS, tvOS & macOS applications. The Countly iOS SDK is intended to be used with [Countly Community Edition](https://github.com/Countly/countly-server) or [Countly Enterprise Edition](https://count.ly/product). +This repository contains the Countly iOS SDK, which can be integrated into iOS, watchOS, tvOS & macOS applications. The Countly iOS SDK is intended to be used with [Countly Lite](https://countly.com/lite) or [Countly Enterprise](https://count.ly/product). ## What is Countly? -[Countly](https://count.ly) is a product analytics solution and innovation enabler that helps teams track product performance and customer journey and behavior across [mobile](https://count.ly/mobile-analytics), [web](http://count.ly/web-analytics), +[Countly](https://count.ly) is a product analytics solution and innovation enabler that helps teams track product performance and customer journey and behavior across [mobile](https://count.ly/mobile-analytics), [web](https://count.ly/web-analytics), and [desktop](https://count.ly/desktop-analytics) applications. [Ensuring privacy by design](https://count.ly/privacy-by-design), Countly allows you to innovate and enhance your products to provide personalized and customized customer experiences, and meet key business and revenue goals. Track, measure, and take action - all without leaving Countly. * **Questions or feature requests?** [Join the Countly Community on Discord](https://discord.gg/countly) -* **Looking for the Countly Server?** [Countly Community Edition repository](https://github.com/Countly/countly-server) -* **Looking for other Countly SDKs?** [An overview of all Countly SDKs for mobile, web and desktop](https://support.count.ly/hc/en-us/articles/360037236571-Downloading-and-Installing-SDKs#officially-supported-sdks) +* **Looking for the Countly Server?** [Countly Lite repository](https://github.com/Countly/countly-server) +* **Looking for other Countly SDKs?** [An overview of all Countly SDKs for mobile, web and desktop](https://support.count.ly/hc/en-us/articles/360037236571-Downloading-and-Installing-SDKs#h_01H9QCP8G5Y9PZJGERZ4XWYDY9) ## Integrating Countly SDK in your projects For a detailed description on how to use this SDK [check out our documentation](https://support.count.ly/hc/en-us/articles/360037753511-iOS-watchOS-tvOS-macOS). -For information about how to add the SDK to your project, please check [this section of the documentation](https://support.count.ly/hc/en-us/articles/360037753511-iOS-watchOS-tvOS-macOS#adding-the-sdk-to-the-project). +For information about how to add the SDK to your project, please check [this section of the documentation](https://support.count.ly/hc/en-us/articles/360037753511-iOS-watchOS-tvOS-macOS#h_01HAVHW0RNNZT7742WNX46GS1R). -You can find minimal SDK integration information for your project in [this section of the documentation](https://support.count.ly/hc/en-us/articles/360037753511-iOS-watchOS-tvOS-macOS#minimal-setup). +You can find minimal SDK integration information for your project in [this section of the documentation](https://support.count.ly/hc/en-us/articles/360037753511-iOS-watchOS-tvOS-macOS#h_01HAVHW0RNVDW2E2F83R8E6PSB). For an example integration of this SDK, you can have a look [here](https://github.com/Countly/countly-sample-ios). diff --git a/ios/src/countly_dsym_uploader.sh b/ios/src/countly_dsym_uploader.sh index bb061973..0423d59a 100755 --- a/ios/src/countly_dsym_uploader.sh +++ b/ios/src/countly_dsym_uploader.sh @@ -4,10 +4,11 @@ # # This code is provided under the MIT License. # -# Please visit www.count.ly for more information. +# Please visit https://countly.com/ for more information. # For your target, go to `Build Phases` tab and choose `New Run Script Phase` after clicking plus (+) button. +# Here the first line is a find command to find and extract the path to the script. If you know the path you can skip this line. # Add these two lines: # # COUNTLY_DSYM_UPLOADER=$(find $SRCROOT -name "countly_dsym_uploader.sh" | head -n 1) @@ -39,6 +40,7 @@ HOST="${1}"; APPKEY="${2}"; CUSTOM_DSYM_PATH="${3}" +countly_log "Provided server:[$HOST]\n app key:[$APPKEY]\n custom dSYM path:[$CUSTOM_DSYM_PATH]" # Pre-checks if [[ -z $HOST ]]; then @@ -69,11 +71,17 @@ if [[ ! -d $DSYM_PATH ]]; then countly_fail "dSYM path ${DSYM_PATH} does not exist!" fi +countly_log "Current dSYM path:[$DSYM_PATH]" # Extracting Build UUIDs from DSYM using dwarfdump -BUILD_UUIDS=$(xcrun dwarfdump --uuid "${DSYM_PATH}" | awk '{print $2}' | xargs | sed 's/ /,/g') +XCRUN_RES=$(xcrun dwarfdump --uuid "${DSYM_PATH}") +countly_log "Xcrun result:[$XCRUN_RES]" +RAW_UUID=$(echo "${XCRUN_RES}" | awk '{print $2}') +countly_log "Raw UUID:[$RAW_UUID]" +# Remove whitespace and such +BUILD_UUIDS=$(echo "${RAW_UUID}" | xargs | sed 's/ /,/g') if [ $? -eq 0 ]; then - countly_log "Extracted Build UUIDs: ${BUILD_UUIDS}" + countly_log "Extracted Build UUIDs:[${BUILD_UUIDS}]" else countly_fail "Extracting Build UUIDs failed!" fi @@ -103,7 +111,7 @@ fi QUERY="?platform=${PLATFORM}&epn=${EPN}&app_key=${APPKEY}&build=${BUILD_UUIDS}" URL="${HOST}${ENDPOINT}${QUERY}" -countly_log "Uploading to ${URL}" +countly_log "Uploading to:[${URL}]" # Uploading to server using curl @@ -111,7 +119,7 @@ UPLOAD_RESULT=$(curl -s -F "symbols=@${DSYM_ZIP_PATH}" "${URL}") if [ $? -eq 0 ] && [ "${UPLOAD_RESULT}" == "{\"result\":\"Success\"}" ]; then countly_log "dSYM upload succesfully completed." else - countly_fail "dSYM upload failed! ${UPLOAD_RESULT}" + countly_fail "dSYM upload failed! Response from the server:[${UPLOAD_RESULT}]" fi diff --git a/ios/src/include/CountlyExperimentInformation.h b/ios/src/include/CountlyExperimentInformation.h new file mode 120000 index 00000000..b5321454 --- /dev/null +++ b/ios/src/include/CountlyExperimentInformation.h @@ -0,0 +1 @@ +../CountlyExperimentInformation.h \ No newline at end of file From ca405664b6a9b7f8ec1c7186732ed04ebd02e8d9 Mon Sep 17 00:00:00 2001 From: ijunaid Date: Fri, 15 Dec 2023 13:03:46 +0500 Subject: [PATCH 09/48] Added "dr=1" parameter for direct request in iOS (#279) --- ios/src/CountlyConnectionManager.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ios/src/CountlyConnectionManager.m b/ios/src/CountlyConnectionManager.m index d54e60a0..935377e3 100644 --- a/ios/src/CountlyConnectionManager.m +++ b/ios/src/CountlyConnectionManager.m @@ -617,6 +617,8 @@ - (void)addDirectRequest:(NSDictionary *)requestParamete [mutableRequestParameters removeObjectForKey:reservedKey]; } } + + mutableRequestParameters[@"dr"] = [NSNumber numberWithInt:1]; NSMutableString* queryString = [self queryEssentials].mutableCopy; From 4ad895879b7985ebf33f913ab417b815a4c26b7d Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Fri, 15 Dec 2023 21:19:59 +0900 Subject: [PATCH 10/48] version update (#278) --- CHANGELOG.md | 6 ++++++ CountlyReactNative.podspec | 2 +- android/build.gradle | 2 +- .../java/ly/count/android/sdk/react/CountlyReactNative.java | 2 +- ios/src/CountlyReactNative.m | 2 +- package.json | 2 +- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47d1fbbb..573f4a1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 23.12.0 +* Added TS type declerations to the SDK + +* Updated the underlying Android SDK version to 23.12.0 +* Updated the underlying iOS SDK version to 23.12.0 + ## 23.10.0 * Fixed a bug where segment provided to 'logException' was ignored in Android devices * Fixed a bug where bridged SDK logs were not printing diff --git a/CountlyReactNative.podspec b/CountlyReactNative.podspec index 732652e9..cbaf0a6a 100644 --- a/CountlyReactNative.podspec +++ b/CountlyReactNative.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CountlyReactNative' - s.version = '23.10.0' + s.version = '23.12.0' s.license = { :type => 'COMMUNITY', :text => <<-LICENSE diff --git a/android/build.gradle b/android/build.gradle index 35d9a836..4b0b40a4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,7 +41,7 @@ repositories { dependencies { implementation "com.facebook.react:react-native:${safeExtGet('reactNativeVersion', '+')}" - implementation 'ly.count.android:sdk:23.8.2' + implementation 'ly.count.android:sdk:23.12.0' // Import the BoM for the Firebase platform // The BoM version of 28.4.2 is the newest release that will target firebase-messaging version 22 diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 98c7a7bc..526805df 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -88,7 +88,7 @@ public String toString() { public class CountlyReactNative extends ReactContextBaseJavaModule implements LifecycleEventListener { public static final String TAG = "CountlyRNPlugin"; - private String COUNTLY_RN_SDK_VERSION_STRING = "23.10.0"; + private String COUNTLY_RN_SDK_VERSION_STRING = "23.12.0"; private String COUNTLY_RN_SDK_NAME = "js-rnb-android"; private static final CountlyConfig config = new CountlyConfig(); diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index d60591b5..2a54d1f0 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -24,7 +24,7 @@ @interface CountlyFeedbackWidget () + (CountlyFeedbackWidget *)createWithDictionary:(NSDictionary *)dictionary; @end -NSString *const kCountlyReactNativeSDKVersion = @"23.10.0"; +NSString *const kCountlyReactNativeSDKVersion = @"23.12.0"; NSString *const kCountlyReactNativeSDKName = @"js-rnb-ios"; CLYPushTestMode const CLYPushTestModeProduction = @"CLYPushTestModeProduction"; diff --git a/package.json b/package.json index 8ceb7237..fa5fef64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "countly-sdk-react-native-bridge", - "version": "23.10.0", + "version": "23.12.0", "author": "Countly (https://count.ly/)", "bugs": { "url": "https://github.com/Countly/countly-sdk-react-native-bridge/issues" From 2466e81e44d745d2862dbbe4b7a6f801d6b96884 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Tue, 2 Jan 2024 19:04:52 +0900 Subject: [PATCH 11/48] Release notice (#280) --- .github/workflows/release_notice.yml | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/release_notice.yml diff --git a/.github/workflows/release_notice.yml b/.github/workflows/release_notice.yml new file mode 100644 index 00000000..e17315a0 --- /dev/null +++ b/.github/workflows/release_notice.yml @@ -0,0 +1,39 @@ +name: Release Notice +on: + release: + types: [published] + workflow_dispatch: +jobs: + build: + runs-on: ubuntu-latest + steps: + # To check the github context + - name: Dump Github context + env: + GITHUB_CONTEXT: ${{ toJSON(github) }} + run: echo "$GITHUB_CONTEXT" + - name: Send custom JSON data to Slack workflow + id: slack + uses: slackapi/slack-github-action@v1.23.0 + with: + # This data can be any valid JSON from a previous step in the GitHub Action + payload: | + { + "repository": "${{ github.repository }}", + "tag_name": "${{ github.event.release.tag_name }}", + "actor": "${{ github.actor }}", + "body": ${{ toJSON(github.event.release.body) }}, + "html_url": "${{ github.event.release.html_url }}" + } + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_RELEASE }} + - name: Send custom JSON data to Discord + uses: sarisia/actions-status-discord@v1.13.0 + with: + webhook: ${{ secrets.DISCORD_WEBHOOK_URL }} + nodetail: true + title: New ${{ github.repository }} version ${{ github.event.release.tag_name }} published by ${{ github.actor }} + description: | + Release URL: ${{ github.event.release.html_url }} + Click [here](https://github.com/Countly/countly-server/blob/master/CHANGELOG.md) to view the change log. + `${{ github.event.release.body }}` From 027d88256a21b5c7114fd702b91ab86903ae5e49 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Thu, 11 Jan 2024 15:25:12 +0100 Subject: [PATCH 12/48] rules (#295) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rules * fix most lint issues (#296) * fix most lint issues * Update Countly.js * move to double quotes for all files (#297) Co-authored-by: Artūrs Kadiķis --------- Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> Co-authored-by: Artūrs Kadiķis --------- Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> Co-authored-by: Artūrs Kadiķis --- .eslintrc.json | 286 ++++++++------ Countly.d.ts | 6 +- Countly.js | 409 +++++++++++---------- CountlyConfig.js | 2 +- CountlyState.js | 4 +- Feedback.js | 19 +- Logger.js | 4 +- Utils.js | 102 ++--- Validators.js | 10 +- example/CountlyRNExample/APM.tsx | 18 +- example/CountlyRNExample/App.tsx | 34 +- example/CountlyRNExample/Configuration.tsx | 6 +- example/CountlyRNExample/Consent.tsx | 54 +-- example/CountlyRNExample/Constants.js | 26 +- example/CountlyRNExample/CountlyButton.tsx | 10 +- example/CountlyRNExample/Crashes.tsx | 20 +- example/CountlyRNExample/DeviceID.tsx | 14 +- example/CountlyRNExample/Events.tsx | 60 +-- example/CountlyRNExample/Feedback.tsx | 76 ++-- example/CountlyRNExample/Home.tsx | 18 +- example/CountlyRNExample/Others.tsx | 35 +- example/CountlyRNExample/RemoteConfig.tsx | 24 +- example/CountlyRNExample/UserProfiles.tsx | 82 ++--- example/CountlyRNExample/Views.tsx | 20 +- 24 files changed, 708 insertions(+), 631 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 6ef0c761..45a8ae5f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,7 +7,6 @@ "version": "detect" } }, - "extends": ["plugin:react/recommended", "prettier", "eslint:recommended", "plugin:@typescript-eslint/recommended"], "parserOptions": { "ecmaFeatures": { "jsx": true @@ -19,111 +18,186 @@ "parser": "@typescript-eslint/parser", "plugins": ["react", "react-native", "@typescript-eslint"], "root": true, + "extends": ["airbnb/legacy"], "rules": { - //JavaScript rules - "prefer-template": "error", - // allow .js files to contain JSX code - "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx", ".tsx"] }], - - // prevent eslint to complain about the "styles" variable being used before it was defined - "no-use-before-define": ["error", { "variables": false }], - - // ignore errors for the react-navigation package - "react/prop-types": ["error", { "ignore": ["navigation", "navigation.navigate"] }], - "no-var": "warn", - "curly": ["error", "all"], - - //TypeScript related rules - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": "warn", - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": "error", //??? - "@typescript-eslint/ban-types": "error", - "@typescript-eslint/class-literal-property-style": "warn", - "@typescript-eslint/consistent-generic-constructors": "warn", - "@typescript-eslint/consistent-indexed-object-style": "warn", - "@typescript-eslint/consistent-type-assertions": "warn", - "@typescript-eslint/consistent-type-definitions": "warn", - "@typescript-eslint/consistent-type-exports": "warn", - "@typescript-eslint/consistent-type-imports": "warn", - "@typescript-eslint/explicit-function-return-type": "warn", - "@typescript-eslint/explicit-member-accessibility": "warn", - "@typescript-eslint/explicit-module-boundary-types": "warn", - "@typescript-eslint/member-ordering": "warn", //??? - "@typescript-eslint/method-signature-style": "warn", - //"@typescript-eslint/naming-convention": "warn" - "@typescript-eslint/no-base-to-string": "warn", - "@typescript-eslint/no-confusing-non-null-assertion": "warn", - "@typescript-eslint/no-confusing-void-expression": "warn", - "@typescript-eslint/no-duplicate-enum-values": "warn", - "@typescript-eslint/no-dynamic-delete": "warn", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-extraneous-class": "warn", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/no-invalid-void-type": "warn", - "@typescript-eslint/no-meaningless-void-operator": "warn", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "warn", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-non-null-assertion": "warn", - "@typescript-eslint/no-redundant-type-constituents": "warn", - "@typescript-eslint/no-require-imports": "warn", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-type-alias": "warn", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "warn", - "@typescript-eslint/no-unnecessary-condition": "warn", - "@typescript-eslint/no-unnecessary-qualifier": "warn", - "@typescript-eslint/no-unnecessary-type-arguments": "warn", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "warn", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-useless-empty-export": "warn", - "@typescript-eslint/non-nullable-type-assertion-style": "warn", - "@typescript-eslint/parameter-properties": "warn", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-enum-initializers": "warn", - "@typescript-eslint/prefer-for-of": "warn", - "@typescript-eslint/prefer-function-type": "warn", - "@typescript-eslint/prefer-includes": "warn", - "@typescript-eslint/prefer-literal-enum-member": "warn", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/prefer-nullish-coalescing": "warn", - "@typescript-eslint/prefer-optional-chain": "warn", - "@typescript-eslint/prefer-readonly": "warn", - "@typescript-eslint/prefer-readonly-parameter-types": "warn", - "@typescript-eslint/prefer-reduce-type-parameter": "warn", - "@typescript-eslint/prefer-regexp-exec": "warn", - "@typescript-eslint/prefer-return-this-type": "warn", - "@typescript-eslint/prefer-string-starts-ends-with": "warn", - "@typescript-eslint/prefer-ts-expect-error": "warn", - "@typescript-eslint/promise-function-async": "warn", - "@typescript-eslint/require-array-sort-compare": "warn", - "@typescript-eslint/restrict-plus-operands": "error", - "@typescript-eslint/restrict-template-expressions": "error", - "@typescript-eslint/sort-type-constituents": "warn", - "@typescript-eslint/strict-boolean-expressions": "warn", - "@typescript-eslint/switch-exhaustiveness-check": "warn", - "@typescript-eslint/triple-slash-reference": "error", - "@typescript-eslint/typedef": "warn", - "@typescript-eslint/unbound-method": "error", - "@typescript-eslint/unified-signatures": "warn", - - "@typescript-eslint/no-use-before-define": "warn", - "@typescript-eslint/no-var-requires": "error", - - // Note: you must disable the base rule as it can report incorrect errors - "object-curly-spacing": "off", - "@typescript-eslint/object-curly-spacing": "warn" + "prefer-arrow-callback": "off", + "prefer-destructuring": "off", + "comma-dangle": "off", + "no-restricted-globals": "off", + "no-restricted-properties": "off", + "strict": "off", + "no-unused-vars": "warn", + "no-var": "off", + "func-names": "off", + "consistent-return": "off", + "prefer-rest-params": "off", + "radix": "off", + "prefer-spread": "off", + "no-plusplus": "off", + "camelcase": "off", + "no-use-before-define": "off", + "no-lonely-if": "off", + "no-restricted-syntax": "off", + "vars-on-top": "off", + "no-param-reassign": "off", + "max-len": "off", + "guard-for-in": "off", + "no-underscore-dangle": "off", + "no-bitwise": "off", + "no-mixed-operators": "off", + "object-shorthand": "off", + "block-spacing": [ + "error", + "always" + ], + "brace-style": [ + "error", + "1tbs" + ], + "comma-spacing": [ + "error", + { + "before": false, + "after": true + } + ], + "comma-style": [ + "error", + "last" + ], + "computed-property-spacing": [ + "error", + "never" + ], + "curly": [ + "error", + "all" + ], + "eol-last": "off", + "func-call-spacing": [ + "error", + "never" + ], + "indent": [ + "error", + 4 + ], + "key-spacing": [ + "error", + { + "beforeColon": false, + "afterColon": true + } + ], + "keyword-spacing": [ + "error", + { + "before": true, + "after": true + } + ], + "lines-between-class-members": [ + "error", + "always" + ], + "no-multi-spaces": [ + "error" + ], + "no-trailing-spaces": [ + "error", + { + "ignoreComments": true + } + ], + "no-whitespace-before-property": [ + "error" + ], + "object-curly-newline": [ + "error", + { + "multiline": true, + "consistent": true + } + ], + "object-property-newline": [ + "error", + { + "allowAllPropertiesOnSameLine": true + } + ], + "semi": [ + "error", + "always" + ], + "semi-style": [ + "error", + "last" + ], + "space-before-blocks": [ + "error", + "always" + ], + "space-in-parens": [ + "error", + "never" + ], + "space-infix-ops": [ + "error" + ], + "space-unary-ops": [ + "error", + { + "words": true, + "nonwords": false + } + ], + "switch-colon-spacing": [ + "error" + ], + "unicode-bom": [ + "error", + "never" + ], + "linebreak-style": [ + "error", + "unix" + ], + "no-useless-escape": "off", + "no-useless-concat": "off", + "quotes": [ + "error", + "double" + ], + "no-console": [ + "off" + ], + "dot-notation": [ + "error" + ], + "eqeqeq": [ + "warn", + "always" + ], + "no-alert": [ + "error" + ], + "no-caller": [ + "error" + ], + "no-eval": [ + "error" + ], + "no-extend-native": [ + "error" + ], + "no-iterator": [ + "error" + ], + "no-loop-func": [ + "error" + ], + "no-shadow": [ + "error" + ] } } diff --git a/Countly.d.ts b/Countly.d.ts index 01cc0f0e..3a058b74 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -63,8 +63,8 @@ interface ResultObject { } interface ErrorObject { error: string | null } -declare module 'countly-sdk-react-native-bridge' { - import type CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig' +declare module "countly-sdk-react-native-bridge" { + import type CountlyConfig from "countly-sdk-react-native-bridge/CountlyConfig" namespace Countly { serverUrl: string; @@ -710,7 +710,7 @@ declare module 'countly-sdk-react-native-bridge' { export default Countly; } -declare module 'countly-sdk-react-native-bridge/CountlyConfig' { +declare module "countly-sdk-react-native-bridge/CountlyConfig" { /** * * Config object for Countly Init diff --git a/Countly.js b/Countly.js index 74b215dd..ee56cbc8 100644 --- a/Countly.js +++ b/Countly.js @@ -4,21 +4,21 @@ * @Countly */ -import { Platform, NativeModules, NativeEventEmitter } from 'react-native'; +import { Platform, NativeModules, NativeEventEmitter } from "react-native"; -import CountlyConfig from './CountlyConfig.js'; -import CountlyState from './CountlyState.js'; -import Feedback from './Feedback.js'; -import * as L from './Logger.js'; -import * as Utils from './Utils.js'; -import * as Validate from './Validators.js'; +import CountlyConfig from "./CountlyConfig.js"; +import CountlyState from "./CountlyState.js"; +import Feedback from "./Feedback.js"; +import * as L from "./Logger.js"; +import * as Utils from "./Utils.js"; +import * as Validate from "./Validators.js"; const { CountlyReactNative } = NativeModules; const eventEmitter = new NativeEventEmitter(CountlyReactNative); const Countly = {}; -Countly.serverUrl = ''; -Countly.appKey = ''; +Countly.serverUrl = ""; +Countly.appKey = ""; let _state = CountlyState; CountlyState.CountlyReactNative = CountlyReactNative; CountlyState.eventEmitter = eventEmitter; @@ -36,14 +36,14 @@ let _isPushInitialized = false; * Listener for rating widget callback, when callback recieve we will remove the callback using listener. */ let _ratingWidgetListener; -const ratingWidgetCallbackName = 'ratingWidgetCallback'; -const pushNotificationCallbackName = 'pushNotificationCallback'; +const ratingWidgetCallbackName = "ratingWidgetCallback"; +const pushNotificationCallbackName = "pushNotificationCallback"; -Countly.messagingMode = { 'DEVELOPMENT': '1', 'PRODUCTION': '0', 'ADHOC': '2' }; +Countly.messagingMode = { DEVELOPMENT: "1", PRODUCTION: "0", ADHOC: "2" }; if (/android/.exec(Platform.OS)) { - Countly.messagingMode.DEVELOPMENT = '2'; + Countly.messagingMode.DEVELOPMENT = "2"; } -Countly.TemporaryDeviceIDString = 'TemporaryDeviceID'; +Countly.TemporaryDeviceIDString = "TemporaryDeviceID"; /** * Initialize Countly @@ -56,7 +56,7 @@ Countly.TemporaryDeviceIDString = 'TemporaryDeviceID'; * @param {string} deviceId device ID */ Countly.init = async function (serverUrl, appKey, deviceId) { - L.w('Countly.init is deprecated, use Countly.initWithConfig instead'); + L.w("Countly.init is deprecated, use Countly.initWithConfig instead"); const countlyConfig = new CountlyConfig(serverUrl, appKey).setDeviceID(deviceId); await Countly.initWithConfig(countlyConfig); }; @@ -69,22 +69,22 @@ Countly.init = async function (serverUrl, appKey, deviceId) { */ Countly.initWithConfig = async function (countlyConfig) { if (_state.isInitialized) { - L.d('init, SDK is already initialized'); + L.d("init, SDK is already initialized"); return; } - if (countlyConfig.deviceID == '') { + if (countlyConfig.deviceID == "") { L.e("init, Device ID during init can't be an empty string. Value will be ignored."); countlyConfig.deviceId = null; } - if (countlyConfig.serverURL == '') { + if (countlyConfig.serverURL == "") { L.e("init, Server URL during init can't be an empty string"); return; } - if (countlyConfig.appKey == '') { + if (countlyConfig.appKey == "") { L.e("init, App Key during init can't be an empty string"); return; } - L.d('initWithConfig, Initializing Countly'); + L.d("initWithConfig, Initializing Countly"); const args = []; const argsMap = Utils.configToJson(countlyConfig); const argsString = JSON.stringify(argsMap); @@ -119,7 +119,7 @@ Countly.hasBeenCalledOnStart = function () { L.e(`hasBeenCalledOnStart, ${message}`); return message; } - L.w('hasBeenCalledOnStart, This call is deprecated and will be removed with no replacement.'); + L.w("hasBeenCalledOnStart, This call is deprecated and will be removed with no replacement."); return CountlyReactNative.hasBeenCalledOnStart(); }; @@ -137,29 +137,29 @@ Countly.sendEvent = function (options) { return message; } if (!options) { - const message = 'sendEvent, no event object provided'; + const message = "sendEvent, no event object provided"; L.e(`sendEvent, ${message}`); return message; } if (!options.eventName) { - const message = 'sendEvent, eventName is required'; + const message = "sendEvent, eventName is required"; L.e(`sendEvent, ${message}`); return message; } L.d(`sendEvent, Sending event: ${JSON.stringify(options)}]`); const args = []; - let eventType = 'event'; // event, eventWithSum, eventWithSegment, eventWithSumSegment + let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment let segments = {}; if (options.eventSum) { - eventType = 'eventWithSum'; + eventType = "eventWithSum"; } if (options.segments) { - eventType = 'eventWithSegment'; + eventType = "eventWithSegment"; } if (options.segments && options.eventSum) { - eventType = 'eventWithSumSegment'; + eventType = "eventWithSumSegment"; } args.push(eventType); @@ -168,12 +168,12 @@ Countly.sendEvent = function (options) { if (options.eventCount) { args.push(options.eventCount.toString()); } else { - args.push('1'); + args.push("1"); } if (options.eventSum) { options.eventSum = options.eventSum.toString(); - if (options.eventSum.indexOf('.') == -1) { + if (options.eventSum.indexOf(".") == -1) { options.eventSum = parseFloat(options.eventSum).toFixed(2); args.push(options.eventSum); } else { @@ -205,7 +205,7 @@ Countly.recordView = function (recordView, segments) { L.e(`recordView, ${msg}`); return msg; } - const message = Validate.String(recordView, 'view name', 'recordView'); + const message = Validate.String(recordView, "view name", "recordView"); if (message) { return message; } @@ -232,11 +232,11 @@ Countly.recordView = function (recordView, segments) { */ Countly.disablePushNotifications = function () { if (!/ios/.exec(Platform.OS)) { - L.e('disablePushNotifications, ' + 'disablePushNotifications is not implemented for Android'); + L.e("disablePushNotifications, " + "disablePushNotifications is not implemented for Android"); - return 'disablePushNotifications : To be implemented'; + return "disablePushNotifications : To be implemented"; } - L.d('disablePushNotifications, Disabling push notifications'); + L.d("disablePushNotifications, Disabling push notifications"); CountlyReactNative.disablePushNotifications(); }; @@ -249,22 +249,22 @@ Countly.disablePushNotifications = function () { * @return {string | void} error message or void */ Countly.pushTokenType = function (tokenType, channelName, channelDescription) { - const message = Validate.String(tokenType, 'tokenType', 'pushTokenType'); + const message = Validate.String(tokenType, "tokenType", "pushTokenType"); if (message) { return message; } - L.w('pushTokenType, pushTokenType is deprecated, use countlyConfig.pushTokenType instead'); + L.w("pushTokenType, pushTokenType is deprecated, use countlyConfig.pushTokenType instead"); const args = []; args.push(tokenType); - args.push(channelName || ''); - args.push(channelDescription || ''); + args.push(channelName || ""); + args.push(channelDescription || ""); CountlyReactNative.pushTokenType(args); }; Countly.sendPushToken = function (options) { L.d(`sendPushToken, Sending push token: [${JSON.stringify(options)}]`); const args = []; - args.push(options.token || ''); + args.push(options.token || ""); CountlyReactNative.sendPushToken(args); }; @@ -276,7 +276,7 @@ Countly.sendPushToken = function (options) { * Should be called after Countly init * */ -Countly.askForNotificationPermission = function (customSoundPath = 'null') { +Countly.askForNotificationPermission = function (customSoundPath = "null") { if (!_state.isInitialized) { const message = "'init' must be called before 'askForNotificationPermission'"; L.e(`askForNotificationPermission, ${message}`); @@ -294,7 +294,7 @@ Countly.askForNotificationPermission = function (customSoundPath = 'null') { * @return {NativeEventEmitter} event */ Countly.registerForNotification = function (theListener) { - L.d('registerForNotification, Registering for notification'); + L.d("registerForNotification, Registering for notification"); const event = eventEmitter.addListener(pushNotificationCallbackName, theListener); CountlyReactNative.registerForNotification([]); return event; @@ -313,9 +313,9 @@ Countly.registerForNotification = function (theListener) { */ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [], allowedIntentPackageNames = [], useAdditionalIntentRedirectionChecks = true) { if (/ios/.exec(Platform.OS)) { - L.e('configureIntentRedirectionCheck, configureIntentRedirectionCheck is not required for iOS'); + L.e("configureIntentRedirectionCheck, configureIntentRedirectionCheck is not required for iOS"); - return 'configureIntentRedirectionCheck : not required for iOS'; + return "configureIntentRedirectionCheck : not required for iOS"; } if (_isPushInitialized) { @@ -323,24 +323,24 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] L.e(`configureIntentRedirectionCheck, ${message}`); return message; } - L.w('configureIntentRedirectionCheck, configureIntentRedirectionCheck is deprecated, use countlyConfig.configureIntentRedirectionCheck instead'); + L.w("configureIntentRedirectionCheck, configureIntentRedirectionCheck is deprecated, use countlyConfig.configureIntentRedirectionCheck instead"); if (!Array.isArray(allowedIntentClassNames)) { - L.w('configureIntentRedirectionCheck, ' + `Ignoring, unsupported data type '${typeof allowedIntentClassNames}' 'allowedIntentClassNames' should be an array of String`); + L.w("configureIntentRedirectionCheck, " + `Ignoring, unsupported data type '${typeof allowedIntentClassNames}' 'allowedIntentClassNames' should be an array of String`); allowedIntentClassNames = []; } if (!Array.isArray(allowedIntentPackageNames)) { - L.w('configureIntentRedirectionCheck, ' + `Ignoring, unsupported data type '${typeof allowedIntentPackageNames}' 'allowedIntentPackageNames' should be an array of String`); + L.w("configureIntentRedirectionCheck, " + `Ignoring, unsupported data type '${typeof allowedIntentPackageNames}' 'allowedIntentPackageNames' should be an array of String`); allowedIntentPackageNames = []; } - if (typeof useAdditionalIntentRedirectionChecks !== 'boolean') { - L.w('configureIntentRedirectionCheck, ' + `Ignoring, unsupported data type '${typeof useAdditionalIntentRedirectionChecks}' 'useAdditionalIntentRedirectionChecks' should be a boolean`); + if (typeof useAdditionalIntentRedirectionChecks !== "boolean") { + L.w("configureIntentRedirectionCheck, " + `Ignoring, unsupported data type '${typeof useAdditionalIntentRedirectionChecks}' 'useAdditionalIntentRedirectionChecks' should be a boolean`); useAdditionalIntentRedirectionChecks = true; } const _allowedIntentClassNames = []; for (const className of allowedIntentClassNames) { - let message = Validate.String(className, 'class name', 'configureIntentRedirectionCheck'); + let message = Validate.String(className, "class name", "configureIntentRedirectionCheck"); if (message == null) { _allowedIntentClassNames.push(className); } @@ -348,7 +348,7 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] const _allowedIntentPackageNames = []; for (const packageName of allowedIntentPackageNames) { - let message = Validate.String(packageName, 'package name', 'configureIntentRedirectionCheck'); + let message = Validate.String(packageName, "package name", "configureIntentRedirectionCheck"); if (message == null) { _allowedIntentPackageNames.push(packageName); } @@ -365,7 +365,7 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] * @return {string | void} error message or void */ Countly.start = function () { - L.w('start, Automatic sessions are handled by underlying SDK, this function will do nothing.'); + L.w("start, Automatic sessions are handled by underlying SDK, this function will do nothing."); }; /** @@ -376,7 +376,7 @@ Countly.start = function () { * @return {string | void} error message or void */ Countly.stop = function () { - L.w('stop, Automatic sessions are handled by underlying SDK, this function will do nothing.'); + L.w("stop, Automatic sessions are handled by underlying SDK, this function will do nothing."); }; /** @@ -389,7 +389,7 @@ Countly.stop = function () { */ Countly.enableLogging = function () { - L.w('enableLogging, enableLogging is deprecated, use countlyConfig.enableLogging instead'); + L.w("enableLogging, enableLogging is deprecated, use countlyConfig.enableLogging instead"); CountlyReactNative.setLoggingEnabled([true]); }; @@ -401,7 +401,7 @@ Countly.enableLogging = function () { * @function Countly.setLoggingEnabled should be used to enable/disable countly internal debugging logs */ Countly.disableLogging = function () { - L.w('disableLogging, disableLogging is deprecated, use countlyConfig.enableLogging instead'); + L.w("disableLogging, disableLogging is deprecated, use countlyConfig.enableLogging instead"); CountlyReactNative.setLoggingEnabled([false]); }; @@ -428,12 +428,12 @@ Countly.setLoggingEnabled = function (enabled = true) { * @param {string | null} ipAddress IP address of user's */ Countly.setLocationInit = function (countryCode, city, location, ipAddress) { - L.w('setLocationInit, setLocationInit is deprecated, use countlyConfig.setLocation instead'); + L.w("setLocationInit, setLocationInit is deprecated, use countlyConfig.setLocation instead"); const args = []; - args.push(countryCode || 'null'); - args.push(city || 'null'); - args.push(location || 'null'); - args.push(ipAddress || 'null'); + args.push(countryCode || "null"); + args.push(city || "null"); + args.push(location || "null"); + args.push(ipAddress || "null"); CountlyReactNative.setLocationInit(args); }; @@ -453,10 +453,10 @@ Countly.setLocation = function (countryCode, city, location, ipAddress) { } L.d(`setLocation, Setting location: [${countryCode}, ${city}, ${location}, ${ipAddress}]`); const args = []; - args.push(countryCode || 'null'); - args.push(city || 'null'); - args.push(location || 'null'); - args.push(ipAddress || 'null'); + args.push(countryCode || "null"); + args.push(city || "null"); + args.push(location || "null"); + args.push(ipAddress || "null"); CountlyReactNative.setLocation(args); }; @@ -472,7 +472,7 @@ Countly.disableLocation = function () { L.e(`disableLocation, ${message}`); return message; } - L.d('disableLocation, Disabling location'); + L.d("disableLocation, Disabling location"); CountlyReactNative.disableLocation(); }; @@ -489,7 +489,7 @@ Countly.getCurrentDeviceId = async function () { L.e(`getCurrentDeviceId, ${message}`); return message; } - L.d('getCurrentDeviceId, Getting current device id'); + L.d("getCurrentDeviceId, Getting current device id"); const result = await CountlyReactNative.getCurrentDeviceId(); return result; }; @@ -505,10 +505,10 @@ Countly.getDeviceIDType = async function () { L.e("getDeviceIDType, 'init' must be called before 'getDeviceIDType'"); return null; } - L.d('getDeviceIDType, Getting device id type'); + L.d("getDeviceIDType, Getting device id type"); const result = await CountlyReactNative.getDeviceIDType(); - if (result == null || result == '') { - L.e('getDeviceIDType, unexpected null value from native side'); + if (result == null || result == "") { + L.e("getDeviceIDType, unexpected null value from native side"); return null; } return Utils.stringToDeviceIDType(result); @@ -527,16 +527,16 @@ Countly.changeDeviceId = function (newDeviceID, onServer) { L.e(`changeDeviceId, ${msg}`); return msg; } - const message = Validate.String(newDeviceID, 'newDeviceID', 'changeDeviceId'); + const message = Validate.String(newDeviceID, "newDeviceID", "changeDeviceId"); if (message) { return message; } L.d(`changeDeviceId, Changing to new device id: [${newDeviceID}], with merge: [${onServer}]`); if (!onServer) { - onServer = '0'; + onServer = "0"; } else { - onServer = '1'; + onServer = "1"; } newDeviceID = newDeviceID.toString(); CountlyReactNative.changeDeviceId([newDeviceID, onServer]); @@ -551,7 +551,7 @@ Countly.changeDeviceId = function (newDeviceID, onServer) { Countly.setHttpPostForced = function (boolean = true) { L.d(`setHttpPostForced, Setting http post forced to: [${boolean}]`); const args = []; - args.push(boolean ? '1' : '0'); + args.push(boolean ? "1" : "0"); CountlyReactNative.setHttpPostForced(args); }; @@ -562,10 +562,10 @@ Countly.setHttpPostForced = function (boolean = true) { * Should be called before Countly init */ Countly.enableCrashReporting = async function () { - L.w('enableCrashReporting, enableCrashReporting is deprecated, use countlyConfig.enableCrashReporting instead'); + L.w("enableCrashReporting, enableCrashReporting is deprecated, use countlyConfig.enableCrashReporting instead"); CountlyReactNative.enableCrashReporting(); if (ErrorUtils && !_isCrashReportingEnabled) { - L.i('enableCrashReporting, Adding Countly JS error handler.'); + L.i("enableCrashReporting, Adding Countly JS error handler."); const previousHandler = ErrorUtils.getGlobalHandler(); ErrorUtils.setGlobalHandler((error, isFatal) => { const jsStackTrace = Utils.getStackTrace(error); @@ -576,22 +576,22 @@ Countly.enableCrashReporting = async function () { stackArr = error.stack; } else { let fname = jsStackTrace[0].file; - if (fname.startsWith('http')) { - const chunks = fname.split('/'); - fname = chunks[chunks.length - 1].split('?')[0]; + if (fname.startsWith("http")) { + const chunks = fname.split("/"); + fname = chunks[chunks.length - 1].split("?")[0]; } errorTitle = `${error.name} (${jsStackTrace[0].methodName}@${fname})`; - const regExp = '(.*)(@?)http(s?).*/(.*)\\?(.*):(.*):(.*)'; - stackArr = error.stack.split('\n').map((row) => { + const regExp = "(.*)(@?)http(s?).*/(.*)\\?(.*):(.*):(.*)"; + stackArr = error.stack.split("\n").map((row) => { row = row.trim(); - if (!row.includes('http')) { + if (!row.includes("http")) { return row; } const matches = row.match(regExp); return matches && matches.length == 8 ? `${matches[1]}${matches[2]}${matches[4]}(${matches[6]}:${matches[7]})` : row; }); - stackArr = stackArr.join('\n'); + stackArr = stackArr.join("\n"); } CountlyReactNative.logJSException(errorTitle, error.message.trim(), stackArr); @@ -637,13 +637,13 @@ Countly.logException = function (exception, nonfatal, segments) { return message; } L.d(`logException, Logging exception: [${exception}], with nonfatal: [${nonfatal}], with segments: [${JSON.stringify(segments)}]`); - const exceptionArray = exception.split('\n'); - let exceptionString = ''; + const exceptionArray = exception.split("\n"); + let exceptionString = ""; for (let i = 0, il = exceptionArray.length; i < il; i++) { exceptionString += `${exceptionArray[i]}\n`; } const args = []; - args.push(exceptionString || ''); + args.push(exceptionString || ""); args.push(nonfatal || false); for (const key in segments) { args.push(key); @@ -680,7 +680,7 @@ Countly.startSession = function () { L.e(`startSession, ${message}`); return message; } - L.d('startSession, Starting session'); + L.d("startSession, Starting session"); CountlyReactNative.startSession(); }; @@ -696,7 +696,7 @@ Countly.endSession = function () { L.e(`endSession, ${message}`); return message; } - L.d('endSession, Ending session'); + L.d("endSession, Ending session"); CountlyReactNative.endSession(); }; @@ -710,7 +710,7 @@ Countly.endSession = function () { * @return {string | void} error message or void */ Countly.enableParameterTamperingProtection = function (salt) { - const message = Validate.String(salt, 'salt', 'enableParameterTamperingProtection'); + const message = Validate.String(salt, "salt", "enableParameterTamperingProtection"); if (message) { return message; } @@ -726,7 +726,7 @@ Countly.enableParameterTamperingProtection = function (salt) { * @return {string | void} error message or void */ Countly.pinnedCertificates = function (certificateName) { - const message = Validate.String(certificateName, 'certificateName', 'pinnedCertificates'); + const message = Validate.String(certificateName, "certificateName", "pinnedCertificates"); if (message) { return message; } @@ -747,7 +747,7 @@ Countly.startEvent = function (eventName) { L.e(`startEvent, ${msg}`); return msg; } - const message = Validate.String(eventName, 'eventName', 'startEvent'); + const message = Validate.String(eventName, "eventName", "startEvent"); if (message) { return message; } @@ -768,7 +768,7 @@ Countly.cancelEvent = function (eventName) { L.e(`cancelEvent, ${msg}`); return msg; } - const message = Validate.String(eventName, 'eventName', 'cancelEvent'); + const message = Validate.String(eventName, "eventName", "cancelEvent"); if (message) { return message; } @@ -790,45 +790,45 @@ Countly.endEvent = function (options) { return message; } L.d(`endEvent, Ending event: [${JSON.stringify(options)}]`); - if (typeof options === 'string') { + if (typeof options === "string") { options = { eventName: options }; } const args = []; - let eventType = 'event'; // event, eventWithSum, eventWithSegment, eventWithSumSegment + let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment let segments = {}; if (options.eventSum) { - eventType = 'eventWithSum'; + eventType = "eventWithSum"; } if (options.segments) { - eventType = 'eventWithSegment'; + eventType = "eventWithSegment"; } if (options.segments && options.eventSum) { - eventType = 'eventWithSumSegment'; + eventType = "eventWithSumSegment"; } args.push(eventType); if (!options.eventName) { - options.eventName = ''; + options.eventName = ""; } args.push(options.eventName.toString()); if (!options.eventCount) { - options.eventCount = '1'; + options.eventCount = "1"; } args.push(options.eventCount.toString()); if (options.eventSum) { let eventSumTemp = options.eventSum.toString(); - if (eventSumTemp.indexOf('.') == -1) { + if (eventSumTemp.indexOf(".") == -1) { eventSumTemp = parseFloat(eventSumTemp).toFixed(2); args.push(eventSumTemp); } else { args.push(eventSumTemp); } } else { - args.push('0.0'); + args.push("0.0"); } if (options.segments) { @@ -857,19 +857,19 @@ Countly.setUserData = async function (userData) { L.d(`setUserData, Setting user data: [${JSON.stringify(userData)}]`); let message = null; if (!userData) { - message = 'User profile data should not be null or undefined'; + message = "User profile data should not be null or undefined"; L.e(`setUserData, ${message}`); return message; } - if (typeof userData !== 'object') { + if (typeof userData !== "object") { message = `unsupported data type of user data '${typeof userData}'`; L.w(`setUserData, ${message}`); return message; } const args = []; for (const key in userData) { - if (typeof userData[key] !== 'string' && key.toString() != 'byear') { - L.w('setUserData, ' + `skipping value for key '${key.toString()}', due to unsupported data type '${typeof userData[key]}', its data type should be 'string'`); + if (typeof userData[key] !== "string" && key.toString() != "byear") { + L.w("setUserData, " + `skipping value for key '${key.toString()}', due to unsupported data type '${typeof userData[key]}', its data type should be 'string'`); } } @@ -879,7 +879,7 @@ Countly.setUserData = async function (userData) { } if (userData.byear) { - Validate.ParseInt(userData.byear, 'key byear', 'setUserData'); + Validate.ParseInt(userData.byear, "key byear", "setUserData"); userData.byear = userData.byear.toString(); } args.push(userData); @@ -894,18 +894,18 @@ Countly.userData.setProperty = async function (keyName, keyValue) { return msg; } L.d(`setProperty, Setting user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'setProperty'); + let message = Validate.String(keyName, "key", "setProperty"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'setProperty'); + message = Validate.ValidUserData(keyValue, "value", "setProperty"); if (message) { return message; } keyName = keyName.toString(); keyValue = keyValue.toString(); - if (keyName && (keyValue || keyValue == '')) { + if (keyName && (keyValue || keyValue == "")) { await CountlyReactNative.userData_setProperty([keyName, keyValue]); } }; @@ -916,7 +916,7 @@ Countly.userData.increment = async function (keyName) { return msg; } L.d(`increment, Incrementing user property: [${keyName}]`); - const message = Validate.String(keyName, 'key', 'increment'); + const message = Validate.String(keyName, "key", "increment"); if (message) { return message; } @@ -932,11 +932,11 @@ Countly.userData.incrementBy = async function (keyName, keyValue) { return msg; } L.d(`incrementBy, Incrementing user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'incrementBy'); + let message = Validate.String(keyName, "key", "incrementBy"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'incrementBy'); + message = Validate.UserDataValue(keyValue, "value", "incrementBy"); if (message) { return message; } @@ -950,11 +950,11 @@ Countly.userData.multiply = async function (keyName, keyValue) { return msg; } L.d(`multiply, Multiplying user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'multiply'); + let message = Validate.String(keyName, "key", "multiply"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'multiply'); + message = Validate.UserDataValue(keyValue, "value", "multiply"); if (message) { return message; } @@ -968,11 +968,11 @@ Countly.userData.saveMax = async function (keyName, keyValue) { return msg; } L.d(`saveMax, Saving max user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'saveMax'); + let message = Validate.String(keyName, "key", "saveMax"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'saveMax'); + message = Validate.UserDataValue(keyValue, "value", "saveMax"); if (message) { return message; } @@ -986,11 +986,11 @@ Countly.userData.saveMin = async function (keyName, keyValue) { return msg; } L.d(`saveMin, Saving min user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'saveMin'); + let message = Validate.String(keyName, "key", "saveMin"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'saveMin'); + message = Validate.UserDataValue(keyValue, "value", "saveMin"); if (message) { return message; } @@ -1004,16 +1004,16 @@ Countly.userData.setOnce = async function (keyName, keyValue) { return msg; } L.d(`setOnce, Setting once user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'setOnce'); + let message = Validate.String(keyName, "key", "setOnce"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'setOnce'); + message = Validate.ValidUserData(keyValue, "value", "setOnce"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userData_setOnce([keyName, keyValue]); } }; @@ -1024,16 +1024,16 @@ Countly.userData.pushUniqueValue = async function (keyName, keyValue) { return msg; } L.d(`pushUniqueValue, Pushing unique value to user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'pushUniqueValue'); + let message = Validate.String(keyName, "key", "pushUniqueValue"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'pushUniqueValue'); + message = Validate.ValidUserData(keyValue, "value", "pushUniqueValue"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userData_pushUniqueValue([keyName, keyValue]); } }; @@ -1044,16 +1044,16 @@ Countly.userData.pushValue = async function (keyName, keyValue) { return msg; } L.d(`pushValue, Pushing value to user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'pushValue'); + let message = Validate.String(keyName, "key", "pushValue"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'pushValue'); + message = Validate.ValidUserData(keyValue, "value", "pushValue"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userData_pushValue([keyName, keyValue]); } }; @@ -1064,16 +1064,16 @@ Countly.userData.pullValue = async function (keyName, keyValue) { return msg; } L.d(`pullValue, Pulling value from user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'pullValue'); + let message = Validate.String(keyName, "key", "pullValue"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'pullValue'); + message = Validate.ValidUserData(keyValue, "value", "pullValue"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userData_pullValue([keyName, keyValue]); } }; @@ -1086,21 +1086,21 @@ Countly.userDataBulk.setUserProperties = async function (customAndPredefined) { return msg; } L.d(`setUserProperties, Setting user properties: [${JSON.stringify(customAndPredefined)}]`); - L.w('setUserProperties, Countly.userDataBulk.save() must be called after setting user properties!'); + L.w("setUserProperties, Countly.userDataBulk.save() must be called after setting user properties!"); let message = null; if (!customAndPredefined) { - message = 'User profile data should not be null or undefined'; + message = "User profile data should not be null or undefined"; L.e(`setUserProperties, ${message}`); return message; } - if (typeof customAndPredefined !== 'object') { + if (typeof customAndPredefined !== "object") { message = `unsupported data type of user data '${typeof customAndPredefined}'`; L.w(`setUserProperties, ${message}`); return message; } for (const key in customAndPredefined) { - if (typeof customAndPredefined[key] !== 'string' && key.toString() != 'byear') { - L.w('setUserProperties, ' + `skipping value for key '${key.toString()}', due to unsupported data type '${typeof customAndPredefined[key]}', its data type should be 'string'`); + if (typeof customAndPredefined[key] !== "string" && key.toString() != "byear") { + L.w("setUserProperties, " + `skipping value for key '${key.toString()}', due to unsupported data type '${typeof customAndPredefined[key]}', its data type should be 'string'`); } } @@ -1110,7 +1110,7 @@ Countly.userDataBulk.setUserProperties = async function (customAndPredefined) { } if (customAndPredefined.byear) { - Validate.ParseInt(customAndPredefined.byear, 'key byear', 'setUserProperties'); + Validate.ParseInt(customAndPredefined.byear, "key byear", "setUserProperties"); customAndPredefined.byear = customAndPredefined.byear.toString(); } @@ -1123,7 +1123,7 @@ Countly.userDataBulk.save = async function () { L.e(`save, ${msg}`); return msg; } - L.d('save, Saving user data'); + L.d("save, Saving user data"); await CountlyReactNative.userDataBulk_save([]); }; @@ -1134,18 +1134,18 @@ Countly.userDataBulk.setProperty = async function (keyName, keyValue) { return msg; } L.d(`setProperty, Setting user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'setProperty'); + let message = Validate.String(keyName, "key", "setProperty"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'setProperty'); + message = Validate.ValidUserData(keyValue, "value", "setProperty"); if (message) { return message; } keyName = keyName.toString(); keyValue = keyValue.toString(); - if (keyName && (keyValue || keyValue == '')) { + if (keyName && (keyValue || keyValue == "")) { await CountlyReactNative.userDataBulk_setProperty([keyName, keyValue]); } }; @@ -1156,7 +1156,7 @@ Countly.userDataBulk.increment = async function (keyName) { return msg; } L.d(`increment, Incrementing user property: [${keyName}]`); - const message = Validate.String(keyName, 'key', 'setProperty'); + const message = Validate.String(keyName, "key", "setProperty"); if (message) { return message; } @@ -1172,11 +1172,11 @@ Countly.userDataBulk.incrementBy = async function (keyName, keyValue) { return msg; } L.d(`incrementBy, Incrementing user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'incrementBy'); + let message = Validate.String(keyName, "key", "incrementBy"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'incrementBy'); + message = Validate.UserDataValue(keyValue, "value", "incrementBy"); if (message) { return message; } @@ -1190,11 +1190,11 @@ Countly.userDataBulk.multiply = async function (keyName, keyValue) { return msg; } L.d(`multiply, Multiplying user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'multiply'); + let message = Validate.String(keyName, "key", "multiply"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'multiply'); + message = Validate.UserDataValue(keyValue, "value", "multiply"); if (message) { return message; } @@ -1208,11 +1208,11 @@ Countly.userDataBulk.saveMax = async function (keyName, keyValue) { return msg; } L.d(`saveMax, Saving max user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'saveMax'); + let message = Validate.String(keyName, "key", "saveMax"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'saveMax'); + message = Validate.UserDataValue(keyValue, "value", "saveMax"); if (message) { return message; } @@ -1226,11 +1226,11 @@ Countly.userDataBulk.saveMin = async function (keyName, keyValue) { return msg; } L.d(`saveMin, Saving min user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'saveMin'); + let message = Validate.String(keyName, "key", "saveMin"); if (message) { return message; } - message = Validate.UserDataValue(keyValue, 'value', 'saveMin'); + message = Validate.UserDataValue(keyValue, "value", "saveMin"); if (message) { return message; } @@ -1244,16 +1244,16 @@ Countly.userDataBulk.setOnce = async function (keyName, keyValue) { return msg; } L.d(`setOnce, Setting once user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'setOnce'); + let message = Validate.String(keyName, "key", "setOnce"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'setOnce'); + message = Validate.ValidUserData(keyValue, "value", "setOnce"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userDataBulk_setOnce([keyName, keyValue]); } }; @@ -1264,16 +1264,16 @@ Countly.userDataBulk.pushUniqueValue = async function (keyName, keyValue) { return msg; } L.d(`pushUniqueValue, Pushing unique value to user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'pushUniqueValue'); + let message = Validate.String(keyName, "key", "pushUniqueValue"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'pushUniqueValue'); + message = Validate.ValidUserData(keyValue, "value", "pushUniqueValue"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userDataBulk_pushUniqueValue([keyName, keyValue]); } }; @@ -1284,16 +1284,16 @@ Countly.userDataBulk.pushValue = async function (keyName, keyValue) { return msg; } L.d(`pushValue, Pushing value to user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'pushValue'); + let message = Validate.String(keyName, "key", "pushValue"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'pushValue'); + message = Validate.ValidUserData(keyValue, "value", "pushValue"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userDataBulk_pushValue([keyName, keyValue]); } }; @@ -1304,16 +1304,16 @@ Countly.userDataBulk.pullValue = async function (keyName, keyValue) { return msg; } L.d(`pullValue, Pulling value from user property: [${keyName}, ${keyValue}]`); - let message = Validate.String(keyName, 'key', 'pullValue'); + let message = Validate.String(keyName, "key", "pullValue"); if (message) { return message; } - message = Validate.ValidUserData(keyValue, 'value', 'pullValue'); + message = Validate.ValidUserData(keyValue, "value", "pullValue"); if (message) { return message; } keyValue = keyValue.toString(); - if (keyValue || keyValue == '') { + if (keyValue || keyValue == "") { await CountlyReactNative.userDataBulk_pullValue([keyName, keyValue]); } }; @@ -1347,7 +1347,7 @@ Countly.giveConsent = function (args) { } L.d(`giveConsent, Giving consent for features: [${args}]`); let features = []; - if (typeof args === 'string') { + if (typeof args === "string") { features.push(args); } else { features = args; @@ -1364,14 +1364,14 @@ Countly.giveConsent = function (args) { * @param {string[] | string} args list of consents */ Countly.giveConsentInit = async function (args) { - L.w('giveConsentInit, giveConsentInit is deprecated, use countlyConfig.giveConsent instead.'); + L.w("giveConsentInit, giveConsentInit is deprecated, use countlyConfig.giveConsent instead."); let features = []; - if (typeof args === 'string') { + if (typeof args === "string") { features.push(args); } else if (Array.isArray(args)) { features = args; } else { - L.w('giveConsentInit ' + `unsupported data type '${typeof args}'`); + L.w("giveConsentInit " + `unsupported data type '${typeof args}'`); } await CountlyReactNative.giveConsentInit(features); }; @@ -1392,7 +1392,7 @@ Countly.removeConsent = function (args) { } L.d(`removeConsent, Removing consent for features: [${args}]`); let features = []; - if (typeof args === 'string') { + if (typeof args === "string") { features.push(args); } else { features = args; @@ -1413,7 +1413,7 @@ Countly.giveAllConsent = function () { L.e(`giveAllConsent, ${message}`); return message; } - L.d('giveAllConsent, Giving consent for all features'); + L.d("giveAllConsent, Giving consent for all features"); CountlyReactNative.giveAllConsent(); }; @@ -1430,7 +1430,7 @@ Countly.removeAllConsent = function () { L.e(`removeAllConsent, ${message}`); return message; } - L.d('removeAllConsent, Removing consent for all features'); + L.d("removeAllConsent, Removing consent for all features"); CountlyReactNative.removeAllConsent(); }; @@ -1441,7 +1441,7 @@ Countly.remoteConfigUpdate = function (callback) { callback(message); return message; } - L.d('remoteConfigUpdate, Updating remote config'); + L.d("remoteConfigUpdate, Updating remote config"); CountlyReactNative.remoteConfigUpdate([], (stringItem) => { callback(stringItem); }); @@ -1492,8 +1492,8 @@ Countly.getRemoteConfigValueForKey = function (keyName, callback) { callback(message); return message; } - CountlyReactNative.getRemoteConfigValueForKey([keyName.toString() || ''], (value) => { - if (Platform.OS == 'android') { + CountlyReactNative.getRemoteConfigValueForKey([keyName.toString() || ""], (value) => { + if (Platform.OS == "android") { try { value = JSON.parse(value); } catch (e) { @@ -1513,13 +1513,13 @@ Countly.getRemoteConfigValueForKeyP = function (keyName) { return message; } L.d(`getRemoteConfigValueForKeyP, Getting remote config value for key: [${keyName}]`); - if (Platform.OS != 'android') { - return 'To be implemented'; + if (Platform.OS != "android") { + return "To be implemented"; } const promise = CountlyReactNative.getRemoteConfigValueForKeyP(keyName); return promise .then((value) => { - if (Platform.OS == 'android') { + if (Platform.OS == "android") { try { value = JSON.parse(value); } catch (e) { @@ -1530,7 +1530,7 @@ Countly.getRemoteConfigValueForKeyP = function (keyName) { return value; }) .catch((e) => { - L.e('getRemoteConfigValueForKeyP, Catch Error:', e); + L.e("getRemoteConfigValueForKeyP, Catch Error:", e); }); }; @@ -1541,7 +1541,7 @@ Countly.remoteConfigClearValues = async function () { callback(message); return message; } - L.d('remoteConfigClearValues, Clearing remote config values'); + L.d("remoteConfigClearValues, Clearing remote config values"); const result = await CountlyReactNative.remoteConfigClearValues(); return result; }; @@ -1570,7 +1570,7 @@ Countly.showStarRating = function (callback) { L.e(`showStarRating, ${message}`); return message; } - L.d('showStarRating, Showing star rating'); + L.d("showStarRating, Showing star rating"); if (!callback) { callback = function () {}; } @@ -1585,8 +1585,9 @@ Countly.showStarRating = function (callback) { * @param {callback listener} [ratingWidgetCallback] This parameter is optional. */ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingWidgetCallback) { + var message = ""; if (!_state.isInitialized) { - var message = "'init' must be called before 'presentRatingWidgetWithID'"; + message = "'init' must be called before 'presentRatingWidgetWithID'"; L.e(`presentRatingWidgetWithID, ${message}`); return message; } @@ -1595,9 +1596,9 @@ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingW L.e(`presentRatingWidgetWithID, ${message}`); return message; } - if (typeof closeButtonText !== 'string') { - closeButtonText = ''; - L.w('presentRatingWidgetWithID, ' + `unsupported data type of closeButtonText : '${typeof args}'`); + if (typeof closeButtonText !== "string") { + closeButtonText = ""; + L.w("presentRatingWidgetWithID, " + `unsupported data type of closeButtonText : '${typeof args}'`); } if (ratingWidgetCallback) { // eventEmitter.addListener('ratingWidgetCallback', ratingWidgetCallback); @@ -1606,7 +1607,7 @@ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingW _ratingWidgetListener.remove(); }); } - CountlyReactNative.presentRatingWidgetWithID([widgetId.toString() || '', closeButtonText.toString() || 'Done']); + CountlyReactNative.presentRatingWidgetWithID([widgetId.toString() || "", closeButtonText.toString() || "Done"]); }; /** @@ -1651,26 +1652,26 @@ Countly.presentFeedbackWidgetObject = async function (feedbackWidget, closeButto L.e(`presentFeedbackWidgetObject, ${msg}`); return msg; } - L.w('presentFeedbackWidgetObject, presentFeedbackWidgetObject is deprecated, use Countly.feedback.presentFeedbackWidget instead.'); + L.w("presentFeedbackWidgetObject, presentFeedbackWidgetObject is deprecated, use Countly.feedback.presentFeedbackWidget instead."); let message = null; if (!feedbackWidget) { - message = 'feedbackWidget should not be null or undefined'; + message = "feedbackWidget should not be null or undefined"; L.e(`presentFeedbackWidgetObject, ${message}`); return message; } if (!feedbackWidget.id) { - message = 'FeedbackWidget id should not be null or empty'; + message = "FeedbackWidget id should not be null or empty"; L.e(`presentFeedbackWidgetObject, ${message}`); return message; } if (!feedbackWidget.type) { - message = 'FeedbackWidget type should not be null or empty'; + message = "FeedbackWidget type should not be null or empty"; L.e(`presentFeedbackWidgetObject, ${message}`); return message; } - if (typeof closeButtonText !== 'string') { - closeButtonText = ''; - L.w('presentFeedbackWidgetObject, ' + `unsupported data type of closeButtonText : '${typeof args}'`); + if (typeof closeButtonText !== "string") { + closeButtonText = ""; + L.w("presentFeedbackWidgetObject, " + `unsupported data type of closeButtonText : '${typeof args}'`); } if (widgetShownCallback) { @@ -1686,8 +1687,8 @@ Countly.presentFeedbackWidgetObject = async function (feedbackWidget, closeButto }); } - feedbackWidget.name = feedbackWidget.name || ''; - closeButtonText = closeButtonText || ''; + feedbackWidget.name = feedbackWidget.name || ""; + closeButtonText = closeButtonText || ""; CountlyReactNative.presentFeedbackWidget([feedbackWidget.id, feedbackWidget.type, feedbackWidget.name, closeButtonText]); }; @@ -1697,7 +1698,7 @@ Countly.presentFeedbackWidgetObject = async function (feedbackWidget, closeButto * Should be called before Countly init */ Countly.setEventSendThreshold = function (size) { - CountlyReactNative.setEventSendThreshold([size.toString() || '']); + CountlyReactNative.setEventSendThreshold([size.toString() || ""]); }; Countly.startTrace = function (traceKey) { @@ -1730,7 +1731,7 @@ Countly.clearAllTraces = function () { L.e(`clearAllTraces, ${message}`); return message; } - L.d('clearAllTraces, Clearing all traces'); + L.d("clearAllTraces, Clearing all traces"); const args = []; CountlyReactNative.clearAllTraces(args); }; @@ -1776,7 +1777,7 @@ Countly.recordNetworkTrace = function (networkTraceKey, responseCode, requestPay * Should be called before Countly init */ Countly.enableApm = function () { - L.w(`enableApm, enableApm is deprecated, use countlyConfig.enableApm instead.`); + L.w("enableApm, enableApm is deprecated, use countlyConfig.enableApm instead."); const args = []; CountlyReactNative.enableApm(args); }; @@ -1788,17 +1789,17 @@ Countly.enableApm = function () { * For iOS use "recordAttributionID" instead of "enableAttribution" * Should be called before Countly init */ -Countly.enableAttribution = async function (attributionID = '') { - L.w(`enableAttribution, enableAttribution is deprecated, use Countly.recordIndirectAttribution instead.`); +Countly.enableAttribution = async function (attributionID = "") { + L.w("enableAttribution, enableAttribution is deprecated, use Countly.recordIndirectAttribution instead."); if (/ios/.exec(Platform.OS)) { - if (attributionID == '') { + if (attributionID == "") { const message = "attribution Id for iOS can't be empty string"; L.e(`enableAttribution ${message}`); return message; } Countly.recordAttributionID(attributionID); } else { - const message = 'This method does nothing for android'; + const message = "This method does nothing for android"; L.e(`enableAttribution, ${message}`); return message; } @@ -1812,9 +1813,9 @@ Countly.enableAttribution = async function (attributionID = '') { * Currently implemented for iOS only */ Countly.recordAttributionID = function (attributionID) { - L.w(`recordAttributionID, recordAttributionID is deprecated, use Countly.recordIndirectAttribution instead.`); + L.w("recordAttributionID, recordAttributionID is deprecated, use Countly.recordIndirectAttribution instead."); if (!/ios/.exec(Platform.OS)) { - return 'recordAttributionID : To be implemented'; + return "recordAttributionID : To be implemented"; } const args = []; args.push(attributionID); @@ -1831,7 +1832,7 @@ Countly.replaceAllAppKeysInQueueWithCurrentAppKey = function () { L.e(`replaceAllAppKeysInQueueWithCurrentAppKey, ${message}`); return message; } - L.d('replaceAllAppKeysInQueueWithCurrentAppKey, Replacing all app keys in queue with current app key'); + L.d("replaceAllAppKeysInQueueWithCurrentAppKey, Replacing all app keys in queue with current app key"); CountlyReactNative.replaceAllAppKeysInQueueWithCurrentAppKey(); }; /** @@ -1874,7 +1875,7 @@ Countly.removeDifferentAppKeysFromQueue = function () { L.e(`removeDifferentAppKeysFromQueue, ${message}`); return message; } - L.d('removeDifferentAppKeysFromQueue, Removing all requests with a different app key in request queue'); + L.d("removeDifferentAppKeysFromQueue, Removing all requests with a different app key in request queue"); CountlyReactNative.removeDifferentAppKeysFromQueue(); }; @@ -1888,7 +1889,7 @@ Countly.appLoadingFinished = async function () { L.e(`appLoadingFinished, ${message}`); return message; } - L.d('appLoadingFinished, App loading finished'); + L.d("appLoadingFinished, App loading finished"); CountlyReactNative.appLoadingFinished(); }; @@ -1902,22 +1903,22 @@ Countly.setCustomMetrics = async function (customMetric) { L.d(`setCustomMetrics, Setting custom metrics: [${JSON.stringify(customMetric)}]`); let message = null; if (!customMetric) { - message = 'customMetric should not be null or undefined'; + message = "customMetric should not be null or undefined"; L.e(`setCustomMetrics, ${message}`); return message; } - if (typeof customMetric !== 'object') { + if (typeof customMetric !== "object") { message = `unsupported data type of customMetric '${typeof customMetric}'`; L.w(`setCustomMetrics, ${message}`); return message; } const args = []; for (const key in customMetric) { - if (typeof customMetric[key] === 'string') { + if (typeof customMetric[key] === "string") { args.push(key.toString()); args.push(customMetric[key].toString()); } else { - L.w('setCustomMetrics, ' + `skipping value for key '${key.toString()}', due to unsupported data type '${typeof customMetric[key]}'`); + L.w("setCustomMetrics, " + `skipping value for key '${key.toString()}', due to unsupported data type '${typeof customMetric[key]}'`); } } if (args.length != 0) { diff --git a/CountlyConfig.js b/CountlyConfig.js index a4ce2d36..6b4bd5c6 100644 --- a/CountlyConfig.js +++ b/CountlyConfig.js @@ -1,4 +1,4 @@ -import { initialize } from './Logger.js'; +import { initialize } from "./Logger.js"; /** * Countly SDK React Native Bridge * https://github.com/Countly/countly-sdk-react-native-bridge diff --git a/CountlyState.js b/CountlyState.js index 23bb3c80..97755c43 100644 --- a/CountlyState.js +++ b/CountlyState.js @@ -5,8 +5,8 @@ CountlyState.CountlyReactNative = null; CountlyState.eventEmitter = null; // Feedback module related variables -CountlyState.widgetShownCallbackName = 'widgetShownCallback'; -CountlyState.widgetClosedCallbackName = 'widgetClosedCallback'; +CountlyState.widgetShownCallbackName = "widgetShownCallback"; +CountlyState.widgetClosedCallbackName = "widgetClosedCallback"; /* * Callback to be executed when feedback widget is displayed */ diff --git a/Feedback.js b/Feedback.js index 7653d6ea..c2fa20ca 100644 --- a/Feedback.js +++ b/Feedback.js @@ -1,7 +1,8 @@ -import * as L from './Logger.js'; +import * as L from "./Logger.js"; class Feedback { #state; + constructor(state) { this.#state = state; } @@ -18,7 +19,7 @@ class Feedback { return { error: message, data: null }; } - L.d('getAvailableFeedbackWidgets, getAvailableFeedbackWidgets'); + L.d("getAvailableFeedbackWidgets, getAvailableFeedbackWidgets"); let result = null; let error = null; try { @@ -50,22 +51,22 @@ class Feedback { } let message = null; if (!feedbackWidget) { - message = 'feedbackWidget should not be null or undefined'; + message = "feedbackWidget should not be null or undefined"; L.e(`presentFeedbackWidget, ${message}`); return { error: message }; } if (!feedbackWidget.id) { - message = 'FeedbackWidget id should not be null or empty'; + message = "FeedbackWidget id should not be null or empty"; L.e(`presentFeedbackWidget, ${message}`); return { error: message }; } if (!feedbackWidget.type) { - message = 'FeedbackWidget type should not be null or empty'; + message = "FeedbackWidget type should not be null or empty"; L.e(`presentFeedbackWidget, ${message}`); return { error: message }; } - if (typeof closeButtonText !== 'string') { - closeButtonText = ''; + if (typeof closeButtonText !== "string") { + closeButtonText = ""; L.w(`presentFeedbackWidget, unsupported data type of closeButtonText : [${typeof args}]`); } @@ -83,8 +84,8 @@ class Feedback { }); } - feedbackWidget.name = feedbackWidget.name || ''; - closeButtonText = closeButtonText || ''; + feedbackWidget.name = feedbackWidget.name || ""; + closeButtonText = closeButtonText || ""; this.#state.CountlyReactNative.presentFeedbackWidget([feedbackWidget.id, feedbackWidget.type, feedbackWidget.name, closeButtonText]); return { error: null }; } diff --git a/Logger.js b/Logger.js index 403165a2..3c87bbd0 100644 --- a/Logger.js +++ b/Logger.js @@ -1,4 +1,4 @@ -const countlyNamespace = '[CountlyReactNative] '; +const countlyNamespace = "[CountlyReactNative] "; let canLog = false; /** @@ -7,7 +7,7 @@ let canLog = false; */ function initialize(debugMode) { canLog = debugMode && console !== undefined; - i('[Logger] initializing the module'); + i("[Logger] initializing the module"); } /** diff --git a/Utils.js b/Utils.js index 661bea7b..940e1fd1 100644 --- a/Utils.js +++ b/Utils.js @@ -1,10 +1,10 @@ -import parseErrorStackLib from '../react-native/Libraries/Core/Devtools/parseErrorStack.js'; -import * as L from './Logger.js'; +import parseErrorStackLib from "../react-native/Libraries/Core/Devtools/parseErrorStack.js"; +import * as L from "./Logger.js"; const DeviceIdType = { - DEVELOPER_SUPPLIED: 'DEVELOPER_SUPPLIED', - SDK_GENERATED: 'SDK_GENERATED', - TEMPORARY_ID: 'TEMPORARY_ID', + DEVELOPER_SUPPLIED: "DEVELOPER_SUPPLIED", + SDK_GENERATED: "SDK_GENERATED", + TEMPORARY_ID: "TEMPORARY_ID", }; /** @@ -16,18 +16,20 @@ const DeviceIdType = { function stringToDeviceIDType(deviceIdType) { let result = null; switch (deviceIdType) { - case 'DS': - result = DeviceIdType.DEVELOPER_SUPPLIED; - break; - case 'TID': - result = DeviceIdType.TEMPORARY_ID; - break; - case 'SG': - result = DeviceIdType.SDK_GENERATED; - break; + case "DS": + result = DeviceIdType.DEVELOPER_SUPPLIED; + break; + case "TID": + result = DeviceIdType.TEMPORARY_ID; + break; + case "SG": + result = DeviceIdType.SDK_GENERATED; + break; + default: + break; } if (result == null) { - L.e(`_getDeviceIdType, ` + `unexpected deviceIdType [${deviceIdType}] from native side`); + L.e("_getDeviceIdType, " + `unexpected deviceIdType [${deviceIdType}] from native side`); return null; } return result; @@ -41,78 +43,78 @@ function stringToDeviceIDType(deviceIdType) { * @return {Object} json */ function configToJson(config) { - L.d('configToJson, Converting config to json'); + L.d("configToJson, Converting config to json"); const json = {}; try { - json['serverURL'] = config.serverURL; - json['appKey'] = config.appKey; - json['deviceID'] = config.deviceID; + json.serverURL = config.serverURL; + json.appKey = config.appKey; + json.deviceID = config.deviceID; if (config.loggingEnabled) { - json['loggingEnabled'] = config.loggingEnabled; + json.loggingEnabled = config.loggingEnabled; } if (config.crashReporting) { - json['crashReporting'] = config.crashReporting; + json.crashReporting = config.crashReporting; } if (config.shouldRequireConsent) { - json['shouldRequireConsent'] = config.shouldRequireConsent; + json.shouldRequireConsent = config.shouldRequireConsent; } if (config.consents) { - json['consents'] = config.consents; + json.consents = config.consents; } if (config.locationCountryCode) { - json['locationCountryCode'] = config.locationCountryCode; + json.locationCountryCode = config.locationCountryCode; } if (config.locationCity) { - json['locationCity'] = config.locationCity; + json.locationCity = config.locationCity; } if (config.locationGpsCoordinates) { - json['locationGpsCoordinates'] = config.locationGpsCoordinates; + json.locationGpsCoordinates = config.locationGpsCoordinates; } if (config.locationIpAddress) { - json['locationIpAddress'] = config.locationIpAddress; + json.locationIpAddress = config.locationIpAddress; } if (config.tamperingProtectionSalt) { - json['tamperingProtectionSalt'] = config.tamperingProtectionSalt; + json.tamperingProtectionSalt = config.tamperingProtectionSalt; } if (config.enableApm) { - json['enableApm'] = config.enableApm; + json.enableApm = config.enableApm; } const pushNotification = {}; if (config.tokenType) { - pushNotification['tokenType'] = config.tokenType; + pushNotification.tokenType = config.tokenType; } if (config.channelName) { - pushNotification['channelName'] = config.channelName; + pushNotification.channelName = config.channelName; } if (config.channelDescription) { - pushNotification['channelDescription'] = config.channelDescription; + pushNotification.channelDescription = config.channelDescription; } if (config.accentColor) { - pushNotification['accentColor'] = config.accentColor; + pushNotification.accentColor = config.accentColor; } - json['pushNotification'] = pushNotification; + json.pushNotification = pushNotification; if (config.allowedIntentClassNames) { - json['allowedIntentClassNames'] = config.allowedIntentClassNames; + json.allowedIntentClassNames = config.allowedIntentClassNames; } if (config.allowedIntentClassNames) { - json['allowedIntentPackageNames'] = config.allowedIntentPackageNames; + json.allowedIntentPackageNames = config.allowedIntentPackageNames; } if (config.starRatingTextTitle) { - json['starRatingTextTitle'] = config.starRatingTextTitle; + json.starRatingTextTitle = config.starRatingTextTitle; } if (config.starRatingTextMessage) { - json['starRatingTextMessage'] = config.starRatingTextMessage; + json.starRatingTextMessage = config.starRatingTextMessage; } if (config.starRatingTextDismiss) { - json['starRatingTextDismiss'] = config.starRatingTextDismiss; + json.starRatingTextDismiss = config.starRatingTextDismiss; } if (config.campaignType) { - json['campaignType'] = config.campaignType; - json['campaignData'] = config.campaignData; + json.campaignType = config.campaignType; + json.campaignData = config.campaignData; } if (config.attributionValues) { - json['attributionValues'] = config.attributionValues; + json.attributionValues = config.attributionValues; } } catch (err) { L.e(`configToJson, Exception occured during converting config to json.${err.toString()}`); @@ -130,23 +132,21 @@ function configToJson(config) { function getStackTrace(e) { let jsStackTrace = null; try { - if (Platform.hasOwnProperty('constants')) { + if (Platform.hasOwnProperty("constants")) { // RN version >= 0.63 if (Platform.constants.reactNativeVersion.minor >= 64) { // RN version >= 0.64 jsStackTrace = parseErrorStackLib(e.stack); - } - // RN version == 0.63 - else { + } else { + // RN version == 0.63 jsStackTrace = parseErrorStackLib(e); } - } - // RN version < 0.63 - else { + } else { + // RN version < 0.63 jsStackTrace = parseErrorStackLib(e); } - } catch (e) { - // L.e('getStackTrace', e.message); + } catch (err) { + // L.e('getStackTrace', err.message); } return jsStackTrace; } diff --git a/Validators.js b/Validators.js index b4b97058..ce12f698 100644 --- a/Validators.js +++ b/Validators.js @@ -1,4 +1,4 @@ -import * as L from './Logger.js'; +import * as L from "./Logger.js"; /** * Validate user data value, it should be 'number' or 'string' that is parseable to 'number' @@ -11,10 +11,10 @@ import * as L from './Logger.js'; function validateUserDataType(stringValue, stringName, functionName) { L.d(`validateUserDataType, Validating user data type: [${stringValue}], name: [${stringName}], function: [${functionName}]`); let message = null; - if (typeof stringValue === 'number') { + if (typeof stringValue === "number") { return null; } - if (typeof stringValue === 'string') { + if (typeof stringValue === "string") { L.w(`${functionName} unsupported data type '${typeof stringValue}', its data type should be 'number'`); return null; } @@ -34,7 +34,7 @@ function validateUserDataType(stringValue, stringName, functionName) { */ function validateValidUserData(stringValue, stringName, functionName) { L.d(`validateValidUserData, Validating valid user data: [${stringValue}], name: [${stringName}], function: [${functionName}]`); - if (stringValue || stringValue == '') { + if (stringValue || stringValue == "") { return null; } @@ -76,7 +76,7 @@ function validateString(stringValue, stringName, functionName) { let message = null; if (!stringValue) { message = `${stringName} should not be null, undefined or empty`; - } else if (typeof stringValue !== 'string') { + } else if (typeof stringValue !== "string") { message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'string'`; } if (message) { diff --git a/example/CountlyRNExample/APM.tsx b/example/CountlyRNExample/APM.tsx index f8069e49..24173810 100644 --- a/example/CountlyRNExample/APM.tsx +++ b/example/CountlyRNExample/APM.tsx @@ -1,18 +1,18 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; const successCodes = [100, 101, 200, 201, 202, 205, 300, 301, 303, 305]; const failureCodes = [400, 402, 405, 408, 500, 501, 502, 505]; const startTrace = () => { - const traceKey = 'Trace Key'; + const traceKey = "Trace Key"; Countly.startTrace(traceKey); }; const endTrace = () => { - const traceKey = 'Trace Key'; + const traceKey = "Trace Key"; const customMetric = { ABC: 1233, C44C: 1337, @@ -23,7 +23,7 @@ const random = (number: number) => { return Math.floor(Math.random() * number); }; const recordNetworkTraceSuccess = () => { - const networkTraceKey = 'api/endpoint.1'; + const networkTraceKey = "api/endpoint.1"; const responseCode = successCodes[random(successCodes.length)]; const requestPayloadSize = random(700) + 200; const responsePayloadSize = random(700) + 200; @@ -32,7 +32,7 @@ const recordNetworkTraceSuccess = () => { Countly.recordNetworkTrace(networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime); }; const recordNetworkTraceFailure = () => { - const networkTraceKey = 'api/endpoint.1'; + const networkTraceKey = "api/endpoint.1"; const responseCode = failureCodes[random(failureCodes.length)]; const requestPayloadSize = random(700) + 250; const responsePayloadSize = random(700) + 250; diff --git a/example/CountlyRNExample/App.tsx b/example/CountlyRNExample/App.tsx index 7a206aec..cdab68a9 100644 --- a/example/CountlyRNExample/App.tsx +++ b/example/CountlyRNExample/App.tsx @@ -1,20 +1,20 @@ -import * as React from 'react'; -import { NavigationContainer } from '@react-navigation/native'; -import { createNativeStackNavigator } from '@react-navigation/native-stack'; +import * as React from "react"; +import { NavigationContainer } from "@react-navigation/native"; +import { createNativeStackNavigator } from "@react-navigation/native-stack"; -import { navigationName } from './Constants'; -import HomeScreen from './Home'; -import FeedbackScreen from './Feedback'; -import EventScreen from './Events'; -import UserProfilesScreen from './UserProfiles'; -import ViewsScreen from './Views'; -import APMScreen from './APM'; -import DeviceIDScreen from './DeviceID'; -import ConsentScreen from './Consent'; -import RemoteConfigScreen from './RemoteConfig'; -import OthersScreen from './Others'; -import CrashesScreen from './Crashes'; -import { Image } from 'react-native'; +import { navigationName } from "./Constants"; +import HomeScreen from "./Home"; +import FeedbackScreen from "./Feedback"; +import EventScreen from "./Events"; +import UserProfilesScreen from "./UserProfiles"; +import ViewsScreen from "./Views"; +import APMScreen from "./APM"; +import DeviceIDScreen from "./DeviceID"; +import ConsentScreen from "./Consent"; +import RemoteConfigScreen from "./RemoteConfig"; +import OthersScreen from "./Others"; +import CrashesScreen from "./Crashes"; +import { Image } from "react-native"; const Stack = createNativeStackNavigator(); class Example extends React.Component { @@ -28,7 +28,7 @@ class Example extends React.Component { options={{ headerTitle: (props) => ( { console.log(e.nativeEvent.error); diff --git a/example/CountlyRNExample/Configuration.tsx b/example/CountlyRNExample/Configuration.tsx index cd4b90bc..10e08102 100644 --- a/example/CountlyRNExample/Configuration.tsx +++ b/example/CountlyRNExample/Configuration.tsx @@ -1,7 +1,7 @@ -import CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig'; +import CountlyConfig from "countly-sdk-react-native-bridge/CountlyConfig"; -const COUNTLY_SERVER_KEY = 'https://yourdomain.countly'; -const COUNTLY_APP_KEY = 'COUNTLY_APP_KEY'; +const COUNTLY_SERVER_KEY = "https://yourdomain.countly"; +const COUNTLY_APP_KEY = "COUNTLY_APP_KEY"; const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY).setLoggingEnabled(true); // Enable countly internal debugging logs // .setDeviceID(Countly.TemporaryDeviceIDString) // Enable temporary id mode diff --git a/example/CountlyRNExample/Consent.tsx b/example/CountlyRNExample/Consent.tsx index b6d131e7..9beb4c61 100644 --- a/example/CountlyRNExample/Consent.tsx +++ b/example/CountlyRNExample/Consent.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; const giveConsent = (name: string) => { Countly.giveConsent([name]); @@ -13,11 +13,11 @@ const removeConsent = (name: string) => { }; const giveMultipleConsent = () => { - Countly.giveConsent(['events', 'views', 'star-rating', 'crashes', 'invalidFeatureName']); + Countly.giveConsent(["events", "views", "star-rating", "crashes", "invalidFeatureName"]); }; const removeMultipleConsent = () => { - Countly.removeConsent(['events', 'views']); + Countly.removeConsent(["events", "views"]); }; const giveAllConsent = () => { @@ -36,70 +36,70 @@ function ConsentScreen({ navigation }) { { - giveConsent('sessions'); + giveConsent("sessions"); }} title="Give sessions" color="#00b5ad" /> { - giveConsent('events'); + giveConsent("events"); }} title="Give events" color="#00b5ad" /> { - giveConsent('views'); + giveConsent("views"); }} title="Give views" color="#00b5ad" /> { - giveConsent('location'); + giveConsent("location"); }} title="Give location" color="#00b5ad" /> { - giveConsent('crashes'); + giveConsent("crashes"); }} title="Give crashes" color="#00b5ad" /> { - giveConsent('attribution'); + giveConsent("attribution"); }} title="Give attribution" color="#00b5ad" /> { - giveConsent('users'); + giveConsent("users"); }} title="Give users" color="#00b5ad" /> { - giveConsent('push'); + giveConsent("push"); }} title="Give push" color="#00b5ad" /> { - giveConsent('star-rating'); + giveConsent("star-rating"); }} title="Give star-rating" color="#00b5ad" /> { - giveConsent('apm'); + giveConsent("apm"); }} title="Give APM" color="#00b5ad" @@ -107,70 +107,70 @@ function ConsentScreen({ navigation }) { { - removeConsent('sessions'); + removeConsent("sessions"); }} title="Remove sessions" color="#00b5ad" /> { - removeConsent('events'); + removeConsent("events"); }} title="Remove events" color="#00b5ad" /> { - removeConsent('views'); + removeConsent("views"); }} title="Remove views" color="#00b5ad" /> { - removeConsent('location'); + removeConsent("location"); }} title="Remove location" color="#00b5ad" /> { - removeConsent('crashes'); + removeConsent("crashes"); }} title="Remove crashes" color="#00b5ad" /> { - removeConsent('attribution'); + removeConsent("attribution"); }} title="Remove attribution" color="#00b5ad" /> { - removeConsent('users'); + removeConsent("users"); }} title="Remove users" color="#00b5ad" /> { - removeConsent('push'); + removeConsent("push"); }} title="Remove push" color="#00b5ad" /> { - removeConsent('star-rating'); + removeConsent("star-rating"); }} title="Remove star-rating" color="#00b5ad" /> { - removeConsent('apm'); + removeConsent("apm"); }} title="Remove APM" color="#00b5ad" diff --git a/example/CountlyRNExample/Constants.js b/example/CountlyRNExample/Constants.js index 429a8a51..11f8d8ab 100644 --- a/example/CountlyRNExample/Constants.js +++ b/example/CountlyRNExample/Constants.js @@ -1,18 +1,18 @@ -const lightOrange = '#FFA737'; -const lightGreen = '#2DA657'; // countly green +const lightOrange = "#FFA737"; +const lightGreen = "#2DA657"; // countly green const navigationName = { - Home: 'Countly RN Example', - Feedback: 'Feedback', - Events: 'Events', - UserProfiles: 'User Profiles', - Views: 'Views', - Crashes: 'Crashes', - APM: 'APM', - Consent: 'Consent', - Others: 'Others', - DeviceID: 'Device ID', - RemoteConfig: 'Remote Config', + Home: "Countly RN Example", + Feedback: "Feedback", + Events: "Events", + UserProfiles: "User Profiles", + Views: "Views", + Crashes: "Crashes", + APM: "APM", + Consent: "Consent", + Others: "Others", + DeviceID: "Device ID", + RemoteConfig: "Remote Config", }; export { lightOrange, navigationName, lightGreen }; diff --git a/example/CountlyRNExample/CountlyButton.tsx b/example/CountlyRNExample/CountlyButton.tsx index 67a25bb2..fe7c3c37 100644 --- a/example/CountlyRNExample/CountlyButton.tsx +++ b/example/CountlyRNExample/CountlyButton.tsx @@ -1,12 +1,12 @@ /* eslint-disable react-native/no-inline-styles */ -import React from 'react'; -import { Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from 'react-native'; +import React from "react"; +import { Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from "react-native"; const customStyleOverrides = StyleSheet.create({ button: { borderRadius: 10, - justifyContent: 'center', - alignItems: 'center', + justifyContent: "center", + alignItems: "center", marginVertical: 5, marginHorizontal: 20, paddingHorizontal: 10, @@ -31,7 +31,7 @@ const CountlyButton = (props: CountlyButtonProps): JSX.Element => { { const timestamp = Math.floor(new Date().getTime() / 1000); @@ -10,24 +10,24 @@ const addCrashLog = () => { }; const recordException = () => { - Countly.addCrashLog('User Performed Step A'); + Countly.addCrashLog("User Performed Step A"); setTimeout(() => { - Countly.addCrashLog('User Performed Step B'); + Countly.addCrashLog("User Performed Step B"); }, 1000); setTimeout(() => { - Countly.addCrashLog('User Performed Step C'); + Countly.addCrashLog("User Performed Step C"); try { const a = {}; const x = a.b.c; // this will create error. } catch (error) { const stack = error.stack.toString(); - Countly.logException(stack, true, { _library_a_version: '0.0.1' }); + Countly.logException(stack, true, { _library_a_version: "0.0.1" }); } }, 1010); }; const setCustomCrashSegments = () => { - const segment = { Key: 'Value' }; + const segment = { Key: "Value" }; Countly.setCustomCrashSegments(segment); }; diff --git a/example/CountlyRNExample/DeviceID.tsx b/example/CountlyRNExample/DeviceID.tsx index 3002884e..6cd735d8 100644 --- a/example/CountlyRNExample/DeviceID.tsx +++ b/example/CountlyRNExample/DeviceID.tsx @@ -1,16 +1,16 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; -import { lightOrange } from './Constants'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; +import { lightOrange } from "./Constants"; const temporaryDeviceIdMode = () => { Countly.changeDeviceId(Countly.TemporaryDeviceIDString, true); }; const changeDeviceId = () => { - Countly.changeDeviceId('02d56d66-6a39-482d-aff0-d14e4d5e5fda', true); + Countly.changeDeviceId("02d56d66-6a39-482d-aff0-d14e4d5e5fda", true); }; function DeviceIDScreen({ navigation }) { diff --git a/example/CountlyRNExample/Events.tsx b/example/CountlyRNExample/Events.tsx index 779455cd..305d4f96 100644 --- a/example/CountlyRNExample/Events.tsx +++ b/example/CountlyRNExample/Events.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; interface Segmentation {} interface SegmentationCustom_1 extends Segmentation { @@ -21,53 +21,53 @@ interface EventPropsCustom_1 extends EventProps { const basicEvent = () => { // example for basic event - const event = { eventName: 'Basic Event', eventCount: 1 }; + const event = { eventName: "Basic Event", eventCount: 1 }; Countly.sendEvent(event); }; const eventWithSum = () => { // example for event with sum - const event = { eventName: 'Event With Sum', eventCount: 1, eventSum: '0.99' }; + const event = { eventName: "Event With Sum", eventCount: 1, eventSum: "0.99" }; Countly.sendEvent(event); }; const eventWithSegment = () => { // example for event with segment let event: EventPropsCustom_1 = { - eventName: 'Event With Segment', + eventName: "Event With Segment", eventCount: 1, - segments: { Country: 'Turkey', Age: '28' }, + segments: { Country: "Turkey", Age: "28" }, }; - event.segments = { Country: 'Turkey', Age: '28' }; + event.segments = { Country: "Turkey", Age: "28" }; Countly.sendEvent(event); event = { - eventName: 'Event With Segment', + eventName: "Event With Segment", eventCount: 1, - segments: { Country: 'France', Age: '38' }, + segments: { Country: "France", Age: "38" }, }; Countly.sendEvent(event); }; const eventWithSumAndSegment = () => { // example for event with segment and sum let event: EventPropsCustom_1 = { - eventName: 'Event With Sum And Segment', + eventName: "Event With Sum And Segment", eventCount: 1, - eventSum: '0.99', - segments: { Country: 'Turkey', Age: '28' }, + eventSum: "0.99", + segments: { Country: "Turkey", Age: "28" }, }; Countly.sendEvent(event); event = { - eventName: 'Event With Sum And Segment', + eventName: "Event With Sum And Segment", eventCount: 3, - eventSum: '1.99', - segments: { Country: 'France', Age: '38' }, + eventSum: "1.99", + segments: { Country: "France", Age: "38" }, }; Countly.sendEvent(event); }; // TIMED EVENTS const startEvent = () => { - Countly.startEvent('timedEvent'); + Countly.startEvent("timedEvent"); setTimeout(() => { - Countly.endEvent('timedEvent'); + Countly.endEvent("timedEvent"); }, 1000); }; @@ -77,11 +77,11 @@ const startEvent = () => { */ const timedEventWithSum = () => { // Event with sum - Countly.startEvent('timedEventWithSum'); + Countly.startEvent("timedEventWithSum"); const event: EventProps = { - eventName: 'timedEventWithSum', - eventSum: '0.99', + eventName: "timedEventWithSum", + eventSum: "0.99", }; setTimeout(() => { @@ -91,11 +91,11 @@ const timedEventWithSum = () => { const timedEventWithSegment = () => { // Event with segment - Countly.startEvent('timedEventWithSegment'); + Countly.startEvent("timedEventWithSegment"); const event: EventPropsCustom_1 = { - eventName: 'timedEventWithSegment', - segments: { Country: 'Germany', Age: '32' }, + eventName: "timedEventWithSegment", + segments: { Country: "Germany", Age: "32" }, }; setTimeout(() => { Countly.endEvent(event); @@ -104,13 +104,13 @@ const timedEventWithSegment = () => { const timedEventWithSumAndSegment = () => { // Event with Segment, sum and count - Countly.startEvent('timedEventWithSumAndSegment'); + Countly.startEvent("timedEventWithSumAndSegment"); const event: EventPropsCustom_1 = { - eventName: 'timedEventWithSumAndSegment', + eventName: "timedEventWithSumAndSegment", eventCount: 1, - eventSum: '0.99', - segments: { Country: 'India', Age: '21' }, + eventSum: "0.99", + segments: { Country: "India", Age: "21" }, }; setTimeout(() => { Countly.endEvent(event); diff --git a/example/CountlyRNExample/Feedback.tsx b/example/CountlyRNExample/Feedback.tsx index 24794ab9..7c91ce73 100644 --- a/example/CountlyRNExample/Feedback.tsx +++ b/example/CountlyRNExample/Feedback.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-native/no-inline-styles */ -import React from 'react'; -import { ScrollView, StyleSheet, Text, TextInput } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; -import { lightOrange } from './Constants'; +import React from "react"; +import { ScrollView, StyleSheet, Text, TextInput } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; +import { lightOrange } from "./Constants"; // This function fetches the widget list and presents the widget with the given type. (with callback) function getAndPresentWidgetWithCallback(widgetType: string) { @@ -46,12 +46,12 @@ async function getAndPresentWidgetAsync(widgetType: string) { function presentWidget(widget: any) { Countly.feedback.presentFeedbackWidget( widget, - 'Close', + "Close", function () { - console.log('presentWidget, Widgetshown'); + console.log("presentWidget, Widgetshown"); }, function () { - console.log('presentWidget, Widgetclosed'); + console.log("presentWidget, Widgetclosed"); } ); } @@ -76,17 +76,17 @@ async function reportWidgetManually(widgetType: string) { // Get widget data const widgetData = await Countly.feedback.getFeedbackWidgetData(widget); if (widgetData.error != null) { - console.error('reportWidgetManually, Error while fetching widget data'); + console.error("reportWidgetManually, Error while fetching widget data"); return; } // Report widget manually. Third parameter is some random data for the sake of example. - Countly.feedback.reportFeedbackWidgetManually(widget, widgetData.data, { rating: 5, comment: 'This is random' }); + Countly.feedback.reportFeedbackWidgetManually(widget, widgetData.data, { rating: 5, comment: "This is random" }); } -//============================================================ +// ============================================================ // Old methods from the example project -//============================================================ +// ============================================================ const setStarRatingDialogTexts = () => { Countly.setStarRatingDialogTexts(); }; @@ -96,7 +96,7 @@ const showStarRating = () => { }; const presentRatingWidgetUsingEditBox = function () { - Countly.presentRatingWidgetWithID(state.ratingId, 'Submit', (error) => { + Countly.presentRatingWidgetWithID(state.ratingId, "Submit", (error) => { if (error != null) { console.log(`presentRatingWidgetUsingEditBox : ${error}`); } @@ -109,16 +109,16 @@ const showSurvey = () => { console.log(`showSurvey Error : ${error}`); } else { console.log(`showSurvey Success : ${retrivedWidgets.length}`); - const surveyWidget = retrivedWidgets.find((x) => x.type === 'survey'); + const surveyWidget = retrivedWidgets.find((x) => x.type === "survey"); if (surveyWidget) { Countly.presentFeedbackWidgetObject( surveyWidget, - 'Close', + "Close", function () { - console.log('showSurvey presentFeedbackWidgetObject : ' + 'Widgetshown'); + console.log("showSurvey presentFeedbackWidgetObject : " + "Widgetshown"); }, function () { - console.log('showSurvey presentFeedbackWidgetObject : ' + 'Widgetclosed'); + console.log("showSurvey presentFeedbackWidgetObject : " + "Widgetclosed"); } ); } @@ -132,16 +132,16 @@ const showNPS = () => { console.log(`showNPS Error : ${error}`); } else { console.log(`showNPS Success : ${retrivedWidgets.length}`); - const npsWidget = retrivedWidgets.find((x) => x.type === 'nps'); + const npsWidget = retrivedWidgets.find((x) => x.type === "nps"); if (npsWidget) { Countly.presentFeedbackWidgetObject( npsWidget, - 'Close', + "Close", function () { - console.log('showNPS presentFeedbackWidgetObject : ' + 'Widgetshown'); + console.log("showNPS presentFeedbackWidgetObject : " + "Widgetshown"); }, function () { - console.log('showNPS presentFeedbackWidgetObject : ' + 'Widgetclosed'); + console.log("showNPS presentFeedbackWidgetObject : " + "Widgetclosed"); } ); } @@ -152,26 +152,26 @@ const showNPS = () => { const styles = StyleSheet.create({ inputRoundedBorder: { margin: 5, - backgroundColor: 'white', + backgroundColor: "white", borderWidth: 1, borderRadius: 10, - borderColor: 'grey', + borderColor: "grey", padding: 10, fontSize: 20, }, }); -const state = { ratingId: '61eac4627b8ad224e37bb3f5' }; +const state = { ratingId: "61eac4627b8ad224e37bb3f5" }; function FeedbackScreen({ navigation }) { return ( - With Callback + With Callback { - getAndPresentWidgetWithCallback('rating'); + getAndPresentWidgetWithCallback("rating"); }} color={lightOrange} lightText={true} @@ -179,7 +179,7 @@ function FeedbackScreen({ navigation }) { { - getAndPresentWidgetWithCallback('survey'); + getAndPresentWidgetWithCallback("survey"); }} color={lightOrange} lightText={true} @@ -187,16 +187,16 @@ function FeedbackScreen({ navigation }) { { - getAndPresentWidgetWithCallback('nps'); + getAndPresentWidgetWithCallback("nps"); }} color={lightOrange} lightText={true} /> - Async Method + Async Method - getAndPresentWidgetAsync('rating').catch((e) => { + getAndPresentWidgetAsync("rating").catch((e) => { console.log(e); }) } @@ -206,7 +206,7 @@ function FeedbackScreen({ navigation }) { - getAndPresentWidgetAsync('survey').catch((e) => { + getAndPresentWidgetAsync("survey").catch((e) => { console.log(e); }) } @@ -216,18 +216,18 @@ function FeedbackScreen({ navigation }) { - getAndPresentWidgetAsync('nps').catch((e) => { + getAndPresentWidgetAsync("nps").catch((e) => { console.log(e); }) } color={lightOrange} lightText={true} /> - Report Widget Manually + Report Widget Manually - reportWidgetManually('rating').catch((e) => { + reportWidgetManually("rating").catch((e) => { console.log(e); }) } @@ -237,7 +237,7 @@ function FeedbackScreen({ navigation }) { - reportWidgetManually('survey').catch((e) => { + reportWidgetManually("survey").catch((e) => { console.log(e); }) } @@ -247,14 +247,14 @@ function FeedbackScreen({ navigation }) { - reportWidgetManually('nps').catch((e) => { + reportWidgetManually("nps").catch((e) => { console.log(e); }) } color={lightOrange} lightText={true} /> - Legacy Methods + Legacy Methods - Features List + Features List navigation.navigate(navigationName.Feedback)} color={lightGreen} lightText={true} /> navigation.navigate(navigationName.Events)} color={lightGreen} lightText={true} /> navigation.navigate(navigationName.UserProfiles)} color={lightGreen} lightText={true} /> diff --git a/example/CountlyRNExample/Others.tsx b/example/CountlyRNExample/Others.tsx index 1afb49c5..5c98e702 100644 --- a/example/CountlyRNExample/Others.tsx +++ b/example/CountlyRNExample/Others.tsx @@ -1,22 +1,23 @@ -import React from 'react'; -import { Platform, ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { Platform, ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; class AttributionKey { - static IDFA = 'idfa'; - static AdvertisingID = 'adid'; + static IDFA = "idfa"; + + static AdvertisingID = "adid"; } -const campaignData = '{"cid":"[PROVIDED_CAMPAIGN_ID]", "cuid":"[PROVIDED_CAMPAIGN_USER_ID]"}'; +const campaignData = "{\"cid\":\"[PROVIDED_CAMPAIGN_ID]\", \"cuid\":\"[PROVIDED_CAMPAIGN_USER_ID]\"}"; const setLocation = () => { - const countryCode = 'us'; - const city = 'Houston'; - const latitude = '29.634933'; - const longitude = '-95.220255'; - const ipAddress = '103.238.105.167'; + const countryCode = "us"; + const city = "Houston"; + const latitude = "29.634933"; + const longitude = "-95.220255"; + const ipAddress = "103.238.105.167"; Countly.setLocation(countryCode, city, `${latitude},${longitude}`, ipAddress); }; const disableLocation = () => { @@ -29,21 +30,21 @@ const askForNotificationPermission = () => { const setCustomMetrics = () => { const customMetric = { - _carrier: 'Custom Carrier', + _carrier: "Custom Carrier", }; Countly.setCustomMetrics(customMetric); }; const recordDirectAttribution = () => { - Countly.recordDirectAttribution('countly', campaignData); + Countly.recordDirectAttribution("countly", campaignData); }; const recordIndirectAttribution = () => { const attributionValues = {}; if (/ios/.exec(Platform.OS)) { - attributionValues[AttributionKey.IDFA] = 'IDFA'; + attributionValues[AttributionKey.IDFA] = "IDFA"; } else { - attributionValues[AttributionKey.AdvertisingID] = 'AdvertisingID'; + attributionValues[AttributionKey.AdvertisingID] = "AdvertisingID"; } Countly.recordIndirectAttribution(attributionValues); diff --git a/example/CountlyRNExample/RemoteConfig.tsx b/example/CountlyRNExample/RemoteConfig.tsx index 997a08a3..bf05453f 100644 --- a/example/CountlyRNExample/RemoteConfig.tsx +++ b/example/CountlyRNExample/RemoteConfig.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; const remoteConfigUpdate = () => { Countly.remoteConfigUpdate((data) => { @@ -11,39 +11,39 @@ const remoteConfigUpdate = () => { }; const updateRemoteConfigForKeysOnly = () => { - Countly.updateRemoteConfigForKeysOnly(['test1'], (data) => { + Countly.updateRemoteConfigForKeysOnly(["test1"], (data) => { console.log(data); }); }; const updateRemoteConfigExceptKeys = () => { - Countly.updateRemoteConfigExceptKeys(['test1'], (data) => { + Countly.updateRemoteConfigExceptKeys(["test1"], (data) => { console.log(data); }); }; const getRemoteConfigValueForKeyBoolean = () => { - Countly.getRemoteConfigValueForKey('booleanValue', (data) => { + Countly.getRemoteConfigValueForKey("booleanValue", (data) => { console.log(data); }); }; const getRemoteConfigValueForKeyFloat = () => { - Countly.getRemoteConfigValueForKey('floatValue', (data) => { + Countly.getRemoteConfigValueForKey("floatValue", (data) => { console.log(data); }); }; const getRemoteConfigValueForKeyInteger = () => { - Countly.getRemoteConfigValueForKey('integerValue', (data) => { + Countly.getRemoteConfigValueForKey("integerValue", (data) => { console.log(data); }); }; const getRemoteConfigValueForKeyString = () => { - Countly.getRemoteConfigValueForKey('stringValue', (data) => { + Countly.getRemoteConfigValueForKey("stringValue", (data) => { console.log(data); }); }; const getRemoteConfigValueForKeyJSON = () => { - Countly.getRemoteConfigValueForKey('jsonValue', (data) => { + Countly.getRemoteConfigValueForKey("jsonValue", (data) => { console.log(data); }); }; diff --git a/example/CountlyRNExample/UserProfiles.tsx b/example/CountlyRNExample/UserProfiles.tsx index 5d1af150..55cec93e 100644 --- a/example/CountlyRNExample/UserProfiles.tsx +++ b/example/CountlyRNExample/UserProfiles.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; interface UserDataPredefined { name?: string; @@ -23,14 +23,14 @@ interface UserDataBulkCustom_1 extends UserDataPredefined { const onSendUserData = () => { // example for setUserData const options: UserDataPredefined = { - name: 'Name of User', - username: 'Username', - email: 'User Email', - organization: 'User Organization', - phone: 'User Contact number', - picture: 'https://count.ly/images/logos/countly-logo.png', - picturePath: '', - gender: 'Male', + name: "Name of User", + username: "Username", + email: "User Email", + organization: "User Organization", + phone: "User Contact number", + picture: "https://count.ly/images/logos/countly-logo.png", + picturePath: "", + gender: "Male", byear: 1989, }; Countly.setUserData(options); @@ -40,18 +40,18 @@ const onSetUserProperties = () => { // example for setUserData // Predefined user properties const options: UserDataBulkCustom_1 = { - name: 'Name of User', - username: 'Username', - email: 'User Email', - organization: 'User Organization', - phone: 'User Contact number', - picture: 'https://count.ly/images/logos/countly-logo.png', - picturePath: '', - gender: 'Male', + name: "Name of User", + username: "Username", + email: "User Email", + organization: "User Organization", + phone: "User Contact number", + picture: "https://count.ly/images/logos/countly-logo.png", + picturePath: "", + gender: "Male", byear: 1989, // Custom User Properties - customeValueA: 'Custom value A', - customeValueB: 'Custom value B', + customeValueA: "Custom value A", + customeValueB: "Custom value B", }; Countly.userDataBulk.setUserProperties(options); Countly.userDataBulk.save(); @@ -82,57 +82,57 @@ const onSendUserDataBulk = () => { const onUpdateUserData = () => { // example for setUserData const options: UserDataPredefined = { - organization: 'Updated User Organization', - phone: 'Updated User Contact number', - gender: 'Female', + organization: "Updated User Organization", + phone: "Updated User Contact number", + gender: "Female", byear: 1995, }; Countly.setUserData(options); }; const userData_setProperty = () => { - Countly.userData.setProperty('setProperty', 'keyValue'); + Countly.userData.setProperty("setProperty", "keyValue"); }; const userData_increment = () => { - Countly.userData.setProperty('increment', 5); - Countly.userData.increment('increment'); + Countly.userData.setProperty("increment", 5); + Countly.userData.increment("increment"); }; const userData_incrementBy = () => { - Countly.userData.setProperty('incrementBy', 5); - Countly.userData.incrementBy('incrementBy', 10); + Countly.userData.setProperty("incrementBy", 5); + Countly.userData.incrementBy("incrementBy", 10); }; const userData_multiply = () => { - Countly.userData.setProperty('multiply', 5); - Countly.userData.multiply('multiply', 20); + Countly.userData.setProperty("multiply", 5); + Countly.userData.multiply("multiply", 20); }; const userData_saveMax = () => { - Countly.userData.setProperty('saveMax', 5); - Countly.userData.saveMax('saveMax', 100); + Countly.userData.setProperty("saveMax", 5); + Countly.userData.saveMax("saveMax", 100); }; const userData_saveMin = () => { - Countly.userData.setProperty('saveMin', 5); - Countly.userData.saveMin('saveMin', 50); + Countly.userData.setProperty("saveMin", 5); + Countly.userData.saveMin("saveMin", 50); }; const userData_setOnce = () => { - Countly.userData.setOnce('setOnce', 200); + Countly.userData.setOnce("setOnce", 200); }; const userData_pushUniqueValue = () => { - Countly.userData.pushUniqueValue('type', 'morning'); + Countly.userData.pushUniqueValue("type", "morning"); }; const userData_pushValue = () => { - Countly.userData.pushValue('type', 'morning'); + Countly.userData.pushValue("type", "morning"); }; const userData_pullValue = () => { - Countly.userData.pullValue('type', 'morning'); + Countly.userData.pullValue("type", "morning"); }; function UserProfilesScreen({ navigation }) { diff --git a/example/CountlyRNExample/Views.tsx b/example/CountlyRNExample/Views.tsx index 6f7aa33c..2ede2f46 100644 --- a/example/CountlyRNExample/Views.tsx +++ b/example/CountlyRNExample/Views.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { ScrollView } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Countly from 'countly-sdk-react-native-bridge'; -import CountlyButton from './CountlyButton'; +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; function ViewsScreen({ navigation }) { return ( @@ -10,23 +10,23 @@ function ViewsScreen({ navigation }) { Date: Wed, 17 Jan 2024 12:21:03 +0100 Subject: [PATCH 13/48] removed undefined callbacks (#294) * removed undefined callbacks * added changelog entry for the callback * changelog fix --- CHANGELOG.md | 6 ++++++ Countly.js | 2 -- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 573f4a1b..927fb9c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## xx.x.x +* Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. + +* Underlying Android SDK version is 23.12.0 +* Underlying iOS SDK version to 23.12.0 + ## 23.12.0 * Added TS type declerations to the SDK diff --git a/Countly.js b/Countly.js index ee56cbc8..f6cacfbb 100644 --- a/Countly.js +++ b/Countly.js @@ -1509,7 +1509,6 @@ Countly.getRemoteConfigValueForKeyP = function (keyName) { if (!_state.isInitialized) { const message = "'init' must be called before 'getRemoteConfigValueForKeyP'"; L.e(`getRemoteConfigValueForKeyP, ${message}`); - callback(message); return message; } L.d(`getRemoteConfigValueForKeyP, Getting remote config value for key: [${keyName}]`); @@ -1538,7 +1537,6 @@ Countly.remoteConfigClearValues = async function () { if (!_state.isInitialized) { const message = "'init' must be called before 'remoteConfigClearValues'"; L.e(`remoteConfigClearValues, ${message}`); - callback(message); return message; } L.d("remoteConfigClearValues, Clearing remote config values"); From a8e2b9785d60f8f8e0b38f5ec05c6cb06138b8f4 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Mon, 29 Jan 2024 22:44:21 +0900 Subject: [PATCH 14/48] Added disableAdditionalIntentRedirectionChecks (#291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * disableAdditionalIntentRedirectionChecks * dts lint * more kint * much more --------- Co-authored-by: Artūrs Kadiķis --- CHANGELOG.md | 4 ++- Countly.d.ts | 6 ++++ CountlyConfig.js | 9 ++++++ Utils.js | 3 ++ .../android/sdk/react/CountlyReactNative.java | 32 ++++++++++++------- example/CountlyRNExample/Configuration.tsx | 1 + 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 927fb9c7..252b88cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ -## xx.x.x +## X.X.X +* Added 'disableAdditionalIntentRedirectionChecks' config method + * Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. * Underlying Android SDK version is 23.12.0 diff --git a/Countly.d.ts b/Countly.d.ts index 3a058b74..0778b2e2 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -801,6 +801,12 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { */ enableApm(): CountlyConfig; + /** + * AdditionalIntentRedirectionChecks are enabled by default. + * This method should be used to disable them. + */ + disableAdditionalIntentRedirectionChecks(): CountlyConfig; + /** * Method to set the push token type * @deprecated diff --git a/CountlyConfig.js b/CountlyConfig.js index 6b4bd5c6..e2a9e8cd 100644 --- a/CountlyConfig.js +++ b/CountlyConfig.js @@ -129,6 +129,15 @@ class CountlyConfig { return this; } + /** + * AdditionalIntentRedirectionChecks are enabled by default. + * This method should be used to disable them. + */ + disableAdditionalIntentRedirectionChecks() { + this.disableAdditionalIntentRedirectionChecks = true; + return this; + } + /** * Method to set the push token type * @deprecated diff --git a/Utils.js b/Utils.js index 940e1fd1..0d9621e2 100644 --- a/Utils.js +++ b/Utils.js @@ -80,6 +80,9 @@ function configToJson(config) { if (config.enableApm) { json.enableApm = config.enableApm; } + if (config.disableAdditionalIntentRedirectionChecks) { + json['disableAdditionalIntentRedirectionChecks'] = config.disableAdditionalIntentRedirectionChecks; + } const pushNotification = {}; if (config.tokenType) { pushNotification.tokenType = config.tokenType; diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 526805df..209503a2 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -102,6 +102,7 @@ public class CountlyReactNative extends ReactContextBaseJavaModule implements Li private List allowedIntentClassNames = new ArrayList<>(); private List allowedIntentPackageNames = new ArrayList<>(); private boolean useAdditionalIntentRedirectionChecks = true; + private boolean disableAdditionalIntentRedirectionChecksConfigSet = false; private final ReactApplicationContext _reactContext; @@ -224,22 +225,28 @@ private void populateConfig(JSONObject _config) { } if (_config.has("pushNotification")) { JSONObject pushObject = _config.getJSONObject("pushNotification"); - int messagingMode = Integer.parseInt(pushObject.getString("tokenType")); - channelName = pushObject.getString("channelName"); - channelDescription = pushObject.getString("channelDescription"); - if (pushObject.has("accentColor")) { - setHexNotificationAccentColor(pushObject.getString("accentColor")); - } - - if (messagingMode == 0) { - CountlyReactNative.messagingMode = Countly.CountlyMessagingMode.PRODUCTION; - } else { + if (!pushObject.toString().equals("{}")) { + int messagingMode = Integer.parseInt(pushObject.getString("tokenType")); + channelName = pushObject.getString("channelName"); + channelDescription = pushObject.getString("channelDescription"); + if (pushObject.has("accentColor")) { + setHexNotificationAccentColor(pushObject.getString("accentColor")); + } + + if (messagingMode == 0) { + CountlyReactNative.messagingMode = Countly.CountlyMessagingMode.PRODUCTION; + } else { CountlyReactNative.messagingMode = Countly.CountlyMessagingMode.TEST; + } } } if (_config.has("attributionID")) { log("recordAttributionID: Not implemented for Android", LogLevel.DEBUG); } + if (_config.has("disableAdditionalIntentRedirectionChecks")) { + useAdditionalIntentRedirectionChecks = false; + disableAdditionalIntentRedirectionChecksConfigSet = true; + } if (_config.has("allowedIntentClassNames")) { JSONArray intentArr = _config.getJSONArray("allowedIntentClassNames"); String[] newArray = new String[intentArr.length()]; @@ -945,7 +952,10 @@ public void onComplete(@NonNull Task task) { @ReactMethod public void configureIntentRedirectionCheck(ReadableArray intentClassNames, ReadableArray intentPackageNames, boolean useAdditionalIntentRedirectionChecks) { Countly.sharedInstance(); - this.useAdditionalIntentRedirectionChecks = useAdditionalIntentRedirectionChecks; + // if in config you disabled this option, then you can't enable it later + if (disableAdditionalIntentRedirectionChecksConfigSet == false) { + this.useAdditionalIntentRedirectionChecks = useAdditionalIntentRedirectionChecks; + } allowedIntentClassNames.clear(); allowedIntentPackageNames.clear(); diff --git a/example/CountlyRNExample/Configuration.tsx b/example/CountlyRNExample/Configuration.tsx index 10e08102..130ac77d 100644 --- a/example/CountlyRNExample/Configuration.tsx +++ b/example/CountlyRNExample/Configuration.tsx @@ -4,6 +4,7 @@ const COUNTLY_SERVER_KEY = "https://yourdomain.countly"; const COUNTLY_APP_KEY = "COUNTLY_APP_KEY"; const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY).setLoggingEnabled(true); // Enable countly internal debugging logs +// .disableAdditionalIntentRedirectionChecks() // Disable additional intent redirection checks // .setDeviceID(Countly.TemporaryDeviceIDString) // Enable temporary id mode // .enableCrashReporting() // Enable crash reporting to report unhandled crashes to Countly // .setRequiresConsent(true) // Set that consent should be required for features to work. From 363a96983180184244ad35ea74934da3fedebf6d Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:15:45 +0100 Subject: [PATCH 15/48] Added all function comments (#298) * Added all function comments * removed void return and used string[] --- Countly.d.ts | 352 +++++++++++++++++++++++++++++++++++++++++++++++++-- Countly.js | 344 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 677 insertions(+), 19 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index 0778b2e2..de007795 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -64,7 +64,7 @@ interface ResultObject { interface ErrorObject { error: string | null } declare module "countly-sdk-react-native-bridge" { - import type CountlyConfig from "countly-sdk-react-native-bridge/CountlyConfig" + import type CountlyConfig from "countly-sdk-react-native-bridge/CountlyConfig"; namespace Countly { serverUrl: string; @@ -204,6 +204,15 @@ declare module "countly-sdk-react-native-bridge" { * @return {string | void} error message or void */ export function pushTokenType(tokenType: string, channelName: string, channelDescription: string): Promise | string; + + /** + * + * Send push token + * @param {object} options - object containing the push token + * {token: string} + * + * @return {string | void} error message or void + */ export function sendPushToken(options: { readonly token?: string }): void; /** @@ -213,6 +222,7 @@ declare module "countly-sdk-react-native-bridge" { * Custom sound should be place at 'your_project_root/android/app/src/main/res/raw' * Should be called after Countly init * + * @return {string | void} error message or void */ export function askForNotificationPermission(customSoundPath?: string): string | void; @@ -246,7 +256,6 @@ declare module "countly-sdk-react-native-bridge" { * * Countly start for android * - * @return {string | void} error message or void */ export function start(): void; @@ -255,7 +264,6 @@ declare module "countly-sdk-react-native-bridge" { * * Countly stop for android * - * @return {string | void} error message or void */ export function stop(): void; @@ -310,7 +318,8 @@ declare module "countly-sdk-react-native-bridge" { * @param {string | null} city Name of the user's city * @param {string | null} location comma separate lat and lng values. For example, "56.42345,123.45325" * @param {string | null} ipAddress IP address of user's - * */ + * @return {string | void} error message or void + */ export function setLocation( countryCode: string | null, city: string | null, @@ -340,17 +349,16 @@ declare module "countly-sdk-react-native-bridge" { * Should be called after Countly init * * @return {DeviceIdType | null} deviceIdType or null - * */ + */ export function getDeviceIDType(): Promise | null; - /** * Change the current device id * * @param {string} newDeviceID id new device id * @param {boolean} onServer merge device id * @return {string | void} error message or void - * */ + */ export function changeDeviceId(newDeviceID: string, onServer: boolean): string | void; /** @@ -470,30 +478,232 @@ declare module "countly-sdk-react-native-bridge" { export function setUserData(userData: CountlyUserData): string | Promise; namespace userData { + /** + * + * Set custom key and value pair for the current user. + * + * @param {string} keyName user property key + * @param {object} keyValue user property value + * @return {string | void} error message or void + */ export function setProperty(keyName: string, keyValue: any): Promise | string; + + /** + * + * Increment custom user data by 1 + * + * @param {string} keyName user property key + * @return {string | void} error message or void + */ export function increment(keyName: string): Promise | string; + + /** + * + * Increment custom user data by a specified value + * + * @param {string} keyName user property key + * @param {string} keyValue value to increment user property by + * @return {string | void} error message or void + */ export function incrementBy(keyName: string, keyValue: any): Promise | string; + + /** + * + * Multiply custom user data by a specified value + * + * @param {string} keyName user property key + * @param {string} keyValue value to multiply user property by + * @return {string | void} error message or void + */ export function multiply(keyName: string, keyValue: any): Promise | string; + + /** + * + * Save the max value between current and provided value. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function saveMax(keyName: string, keyValue: any): Promise | string; + + /** + * + * Save the min value between current and provided value. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function saveMin(keyName: string, keyValue: any): Promise | string; + + /** + * + * Set the property value if it does not exist. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function setOnce(keyName: string, keyValue: any): Promise | string; + + /** + * + * Add value to custom property (array) if value does not exist within. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function pushUniqueValue(keyName: string, keyValue: any): Promise | string; + + /** + * + * Add value to custom property (array). + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function pushValue(keyName: string, keyValue: any): Promise | string; + + /** + * + * Remove value to custom property (array). + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function pullValue(keyName: string, keyValue: any): Promise | string; } namespace userDataBulk { + /** + * + * Custom key and value pairs for the current user. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {object} customAndPredefined custom key value pairs + * @return {string | void} error message or void + */ export function setUserProperties(properties: object): Promise | string; + + /** + * + * Save user data and send to server. + * + * @return {string | void} error message or void + */ export function save(): Promise; + + /** + * + * Set custom key and value pair for the current user. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName custom user data key + * @param {string} keyValue custom user data value + * @return {string | void} error message or void + */ export function setProperty(keyName: string, keyValue: any): Promise | string; + + /** + * + * Increment custom user data by 1 + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @return {string | void} error message or void + */ export function increment(keyName: string): Promise | string; + + /** + * + * Increment custom user data by a specified value + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue value to increment user property by + * @return {string | void} error message or void + */ export function incrementBy(keyName: string, keyValue: any): Promise | string; + + /** + * + * Multiply custom user data by a specified value + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue value to multiply user property by + * @return {string | void} error message or void + */ export function multiply(keyName: string, keyValue: any): Promise | string; + + /** + * + * Save the max value between current and provided value. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function saveMax(keyName: string, keyValue: any): Promise | string; + + /** + * + * Save the min value between current and provided value. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function saveMin(keyName: string, keyValue: any): Promise | string; + + /** + * + * Set the property value if it does not exist. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function setOnce(keyName: string, keyValue: any): Promise | string; + + /** + * + * Add value to custom property (array) if value does not exist within. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function pushUniqueValue(keyName: string, keyValue: any): Promise | string; + + /** + * + * Add value to custom property (array). + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function pushValue(keyName: string, keyValue: any): Promise | string; + + /** + * + * Remove value to custom property (array). + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ export function pullValue(keyName: string, keyValue: any): Promise | string; } @@ -554,11 +764,62 @@ declare module "countly-sdk-react-native-bridge" { * @return {string | void} error message or void */ export function removeAllConsent(): string | void; + + /** + * + * Replaces all stored Remote Config values with new values from server. + * + * @param {function} callback function to be called after fetching values. + * @return {string | void} error message or void + */ export function remoteConfigUpdate(callback: CountlyCallback): string | void; + + /** + * + * Replace specific Remote Config key value pairs with new values from server. + * + * @param {string[]} keyNames array of keys to replace. + * @param {function} callback function to be called after fetching values. + * @return {string | void} error message or void + */ export function updateRemoteConfigForKeysOnly(keyNames: readonly string[], callback: CountlyCallback): string | void; + + /** + * + * Replace all except specific Remote Config key value pairs with new values from server. + * + * @param {string[]} keyNames array of keys to skip. + * @param {function} callback function to be called after fetching values. + * @return {string | void} error message or void + */ export function updateRemoteConfigExceptKeys(keyNames: readonly string[], callback: CountlyCallback): string | void; + + /** + * + * Replace Remote Config key value for a specific key with new values from server. + * This takes in a callback that is called after new values are fetched. + * + * @param {string} keyNames key to fetch. + * @param {function} callback function to be called after fetching new values. + * @return {string | void} error message or void + */ export function getRemoteConfigValueForKey(keyName: string, callback: (value: any) => void): string | void; + + /** + * + * Replace Remote Config key value for a specific key with new values from server. This returns a promise that can be listened to. + * + * @param {string} keyName key to fetch. + * @return {string | promise} error message or promise + */ export function getRemoteConfigValueForKeyP(keyName: string): string | Promise; + + /** + * + * Clear all Remote Config values downloaded from the server. + * + * @return {string | promise} error message or promise + */ export function remoteConfigClearValues(): string | Promise; /** @@ -576,6 +837,15 @@ declare module "countly-sdk-react-native-bridge" { starRatingTextMessage: string, starRatingTextDismiss: string, ): void; + + /** + * + * For getting brief feedback from your users to be displayed on the + Countly dashboard. + * + * @param {function} callback function to be called after it completes. + * @return {string | void} error message or void + */ export function showStarRating(callback?: CountlyCallback): string | void; /** @@ -584,6 +854,7 @@ declare module "countly-sdk-react-native-bridge" { * @param {string} widgetId - id of rating widget to present * @param {string} closeButtonText - text for cancel/close button * @param {callback listener} [ratingWidgetCallback] This parameter is optional. + * @return {string | void} error message or void */ export function presentRatingWidgetWithID(widgetId: string, closeButtonText: string, ratingWidgetCallback?: CountlyErrorCallback): string | void; @@ -591,7 +862,7 @@ declare module "countly-sdk-react-native-bridge" { * Get a list of available feedback widgets as array of object to handle multiple widgets of same type. * @deprecated in 23.8.0 : use 'Countly.feedback.getAvailableFeedbackWidgets' instead of 'getFeedbackWidgets'. * @param {callback listener} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. - * @return {string | []} error message or [] + * @return {string | []} error message or array of feedback widgets */ export function getFeedbackWidgets(onFinished?: FeedbackWidgetCallback): Promise | string; @@ -619,14 +890,62 @@ declare module "countly-sdk-react-native-bridge" { * Should be called before Countly init * * @param {number} size - event count - * */ export function setEventSendThreshold(size: number): void; + /** + * + * Measure and record time taken by any operation. + * + * @param {string} traceKey name of trace + * @return {string | void} error message or void + */ export function startTrace(traceKey: string): string | void; + + /** + * + * Cancel custom trace. + * + * @param {string} traceKey name of trace + * @return {string | void} error message or void + */ export function cancelTrace(traceKey: string): string | void; + + /** + * + * Cancel all custom traces. + * + * @return {string | void} error message or void + */ export function clearAllTraces(): string | void; + + /** + * + * End a custom trace. + * + * @param {string} traceKey name of trace + * @param {object} customMetric metric with key/value pair + * @return {string | void} error message or void + */ export function endTrace(traceKey: string, customMetric?: TraceCustomMetric): string | void; + + /** + * + * Manually record a custom trace + * + * @param {string} networkTraceKey name of trace + * @param {number} responseCode HTTP status code of the received + response + * @param {number} requestPayloadSize Size of the request's + payload in bytes + * @param {number} responsePayloadSize Size + of the received response's payload in bytes + * @param {number} startTime UNIX timestamp in milliseconds for + the starting time of the request + * @param {number} endTime UNIX timestamp in milliseconds for + the ending time of the request + * @return {string | void} error message or void + */ export function recordNetworkTrace( networkTraceKey: string, responseCode: number, @@ -650,6 +969,8 @@ declare module "countly-sdk-react-native-bridge" { * Enable campaign attribution reporting to Countly. * For iOS use "recordAttributionID" instead of "enableAttribution" * Should be called before Countly init + * @param {string} attributionID attribution ID + * @return {string | void} error message or void */ export function enableAttribution(attributionID?: string): string; @@ -659,6 +980,8 @@ declare module "countly-sdk-react-native-bridge" { * * set attribution Id for campaign attribution reporting. * Currently implemented for iOS only + * @param {string} attributionID attribution ID + * @return {string | void} error message or void */ export function recordAttributionID(attributionID: string): string | void; @@ -667,16 +990,22 @@ declare module "countly-sdk-react-native-bridge" { * In request queue, if there are any request whose app key is different * than the current app key, * these requests' app key will be replaced with the current app key. + * @return {string | void} error message or void */ export function replaceAllAppKeysInQueueWithCurrentAppKey(): string | void; /** * set direct attribution Id for campaign attribution reporting. + * @param {string} campaignType type + * @param {string} campaignData data + * @return {string | void} error message or void */ export function recordDirectAttribution(campaignType, campaignData): void; /** * set indirect attribution Id for campaign attribution reporting. + * @param {string} attributionValues attribution values + * @return {string | void} error message or void */ export function recordIndirectAttribution(attributionValues): void; @@ -684,20 +1013,23 @@ declare module "countly-sdk-react-native-bridge" { * Removes all requests with a different app key in request queue. * In request queue, if there are any request whose app key is different than the current app key, * these requests will be removed from request queue. + * @return {string | void} error message or void */ export function removeDifferentAppKeysFromQueue(): string | void; /** * Call this function when app is loaded, so that the app launch duration can be recorded. * Should be called after init. + * @return {string | void} error message or void */ export function appLoadingFinished(): string | void; /** * Set the metrics you want to override * Should be called before Countly init - * @param {object} customMetric - metric with key/value pair + * @param {object} customMetric metric with key/value pair * Supported data type for customMetric values is string + * @return {string | void} error message or void */ export function setCustomMetrics(customMetric: CustomMetric): string | void; validateUserDataValue: ValidationFunction; diff --git a/Countly.js b/Countly.js index f6cacfbb..3b0ecab2 100644 --- a/Countly.js +++ b/Countly.js @@ -261,6 +261,14 @@ Countly.pushTokenType = function (tokenType, channelName, channelDescription) { CountlyReactNative.pushTokenType(args); }; +/** + * + * Send push token + * @param {object} options - object containing the push token + * {token: string} + * + * @return {string | void} error message or void + */ Countly.sendPushToken = function (options) { L.d(`sendPushToken, Sending push token: [${JSON.stringify(options)}]`); const args = []; @@ -275,6 +283,7 @@ Countly.sendPushToken = function (options) { * Custom sound should be place at 'your_project_root/android/app/src/main/res/raw' * Should be called after Countly init * + * @return {string | void} error message or void */ Countly.askForNotificationPermission = function (customSoundPath = "null") { if (!_state.isInitialized) { @@ -362,7 +371,6 @@ Countly.configureIntentRedirectionCheck = function (allowedIntentClassNames = [] * * Countly start for android * - * @return {string | void} error message or void */ Countly.start = function () { L.w("start, Automatic sessions are handled by underlying SDK, this function will do nothing."); @@ -373,7 +381,6 @@ Countly.start = function () { * * Countly stop for android * - * @return {string | void} error message or void */ Countly.stop = function () { L.w("stop, Automatic sessions are handled by underlying SDK, this function will do nothing."); @@ -386,6 +393,7 @@ Countly.stop = function () { * @deprecated in 20.04.6 * * @function Countly.setLoggingEnabled should be used to enable/disable countly internal debugging logs + * */ Countly.enableLogging = function () { @@ -399,6 +407,7 @@ Countly.enableLogging = function () { * @deprecated in 20.04.6 * * @function Countly.setLoggingEnabled should be used to enable/disable countly internal debugging logs + * */ Countly.disableLogging = function () { L.w("disableLogging, disableLogging is deprecated, use countlyConfig.enableLogging instead"); @@ -444,7 +453,8 @@ Countly.setLocationInit = function (countryCode, city, location, ipAddress) { * @param {string | null} city Name of the user's city * @param {string | null} location comma separate lat and lng values. For example, "56.42345,123.45325" * @param {string | null} ipAddress IP address of user's - * */ + * @return {string | void} error message or void + */ Countly.setLocation = function (countryCode, city, location, ipAddress) { if (!_state.isInitialized) { const message = "'init' must be called before 'setLocation'"; @@ -499,7 +509,7 @@ Countly.getCurrentDeviceId = async function () { * Should be called after Countly init * * @return {DeviceIdType | null} deviceIdType or null - * */ + */ Countly.getDeviceIDType = async function () { if (!_state.isInitialized) { L.e("getDeviceIDType, 'init' must be called before 'getDeviceIDType'"); @@ -520,7 +530,7 @@ Countly.getDeviceIDType = async function () { * @param {string} newDeviceID id new device id * @param {boolean} onServer merge device id * @return {string | void} error message or void - * */ + */ Countly.changeDeviceId = function (newDeviceID, onServer) { if (!_state.isInitialized) { const msg = "'init' must be called before 'changeDeviceId'"; @@ -887,6 +897,14 @@ Countly.setUserData = async function (userData) { await CountlyReactNative.setUserData(args); }; +/** + * + * Set custom key and value pair for the current user. + * + * @param {string} keyName user property key + * @param {object} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.setProperty = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'setProperty'"; @@ -909,6 +927,14 @@ Countly.userData.setProperty = async function (keyName, keyValue) { await CountlyReactNative.userData_setProperty([keyName, keyValue]); } }; + +/** + * + * Increment custom user data by 1 + * + * @param {string} keyName user property key + * @return {string | void} error message or void + */ Countly.userData.increment = async function (keyName) { if (!_state.isInitialized) { const msg = "'init' must be called before 'increment'"; @@ -925,6 +951,15 @@ Countly.userData.increment = async function (keyName) { await CountlyReactNative.userData_increment([keyName]); } }; + +/** + * + * Increment custom user data by a specified value + * + * @param {string} keyName user property key + * @param {string} keyValue value to increment user property by + * @return {string | void} error message or void + */ Countly.userData.incrementBy = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'incrementBy'"; @@ -943,6 +978,15 @@ Countly.userData.incrementBy = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userData_incrementBy([keyName, intValue]); }; + +/** + * + * Multiply custom user data by a specified value + * + * @param {string} keyName user property key + * @param {string} keyValue value to multiply user property by + * @return {string | void} error message or void + */ Countly.userData.multiply = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'multiply'"; @@ -961,6 +1005,15 @@ Countly.userData.multiply = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userData_multiply([keyName, intValue]); }; + +/** + * + * Save the max value between current and provided value. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.saveMax = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'saveMax'"; @@ -979,6 +1032,15 @@ Countly.userData.saveMax = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userData_saveMax([keyName, intValue]); }; + +/** + * + * Save the min value between current and provided value. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.saveMin = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'saveMin'"; @@ -997,6 +1059,15 @@ Countly.userData.saveMin = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userData_saveMin([keyName, intValue]); }; + +/** + * + * Set the property value if it does not exist. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.setOnce = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'setOnce'"; @@ -1017,6 +1088,15 @@ Countly.userData.setOnce = async function (keyName, keyValue) { await CountlyReactNative.userData_setOnce([keyName, keyValue]); } }; + +/** + * + * Add value to custom property (array) if value does not exist within. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.pushUniqueValue = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'pushUniqueValue'"; @@ -1037,6 +1117,15 @@ Countly.userData.pushUniqueValue = async function (keyName, keyValue) { await CountlyReactNative.userData_pushUniqueValue([keyName, keyValue]); } }; + +/** + * + * Add value to custom property (array). + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.pushValue = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'pushValue'"; @@ -1057,6 +1146,15 @@ Countly.userData.pushValue = async function (keyName, keyValue) { await CountlyReactNative.userData_pushValue([keyName, keyValue]); } }; + +/** + * + * Remove value to custom property (array). + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userData.pullValue = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'pullValue'"; @@ -1078,7 +1176,14 @@ Countly.userData.pullValue = async function (keyName, keyValue) { } }; -// providing key/values with predefined and custom properties +/** + * + * Custom key and value pairs for the current user. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {object} customAndPredefined custom key value pairs + * @return {string | void} error message or void + */ Countly.userDataBulk.setUserProperties = async function (customAndPredefined) { if (!_state.isInitialized) { const msg = "'init' must be called before 'setUserProperties'"; @@ -1117,6 +1222,12 @@ Countly.userDataBulk.setUserProperties = async function (customAndPredefined) { await CountlyReactNative.userDataBulk_setUserProperties(customAndPredefined); }; +/** + * + * Save user data and send to server. + * + * @return {string | void} error message or void + */ Countly.userDataBulk.save = async function () { if (!_state.isInitialized) { const msg = "'init' must be called before 'save'"; @@ -1127,6 +1238,15 @@ Countly.userDataBulk.save = async function () { await CountlyReactNative.userDataBulk_save([]); }; +/** + * + * Set custom key and value pair for the current user. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName custom user data key + * @param {string} keyValue custom user data value + * @return {string | void} error message or void + */ Countly.userDataBulk.setProperty = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'setProperty'"; @@ -1149,6 +1269,15 @@ Countly.userDataBulk.setProperty = async function (keyName, keyValue) { await CountlyReactNative.userDataBulk_setProperty([keyName, keyValue]); } }; + +/** + * + * Increment custom user data by 1 + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @return {string | void} error message or void + */ Countly.userDataBulk.increment = async function (keyName) { if (!_state.isInitialized) { const msg = "'init' must be called before 'increment'"; @@ -1165,6 +1294,16 @@ Countly.userDataBulk.increment = async function (keyName) { await CountlyReactNative.userDataBulk_increment([keyName]); } }; + +/** + * + * Increment custom user data by a specified value + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue value to increment user property by + * @return {string | void} error message or void + */ Countly.userDataBulk.incrementBy = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'incrementBy'"; @@ -1183,6 +1322,16 @@ Countly.userDataBulk.incrementBy = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userDataBulk_incrementBy([keyName, intValue]); }; + +/** + * + * Multiply custom user data by a specified value + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue value to multiply user property by + * @return {string | void} error message or void + */ Countly.userDataBulk.multiply = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'multiply'"; @@ -1201,6 +1350,16 @@ Countly.userDataBulk.multiply = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userDataBulk_multiply([keyName, intValue]); }; + +/** + * + * Save the max value between current and provided value. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userDataBulk.saveMax = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'saveMax'"; @@ -1219,6 +1378,16 @@ Countly.userDataBulk.saveMax = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userDataBulk_saveMax([keyName, intValue]); }; + +/** + * + * Save the min value between current and provided value. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userDataBulk.saveMin = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'saveMin'"; @@ -1237,6 +1406,16 @@ Countly.userDataBulk.saveMin = async function (keyName, keyValue) { const intValue = parseInt(keyValue).toString(); await CountlyReactNative.userDataBulk_saveMin([keyName, intValue]); }; + +/** + * + * Set the property value if it does not exist. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userDataBulk.setOnce = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'setOnce'"; @@ -1257,6 +1436,16 @@ Countly.userDataBulk.setOnce = async function (keyName, keyValue) { await CountlyReactNative.userDataBulk_setOnce([keyName, keyValue]); } }; + +/** + * + * Add value to custom property (array) if value does not exist within. + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userDataBulk.pushUniqueValue = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'pushUniqueValue'"; @@ -1277,6 +1466,16 @@ Countly.userDataBulk.pushUniqueValue = async function (keyName, keyValue) { await CountlyReactNative.userDataBulk_pushUniqueValue([keyName, keyValue]); } }; + +/** + * + * Add value to custom property (array). + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userDataBulk.pushValue = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'pushValue'"; @@ -1297,6 +1496,16 @@ Countly.userDataBulk.pushValue = async function (keyName, keyValue) { await CountlyReactNative.userDataBulk_pushValue([keyName, keyValue]); } }; + +/** + * + * Remove value to custom property (array). + * Remember to call Countly.userDataBulk.save() after calling all userDataBulk methods to send the bulk data to server. + * + * @param {string} keyName user property key + * @param {string} keyValue user property value + * @return {string | void} error message or void + */ Countly.userDataBulk.pullValue = async function (keyName, keyValue) { if (!_state.isInitialized) { const msg = "'init' must be called before 'pullValue'"; @@ -1434,6 +1643,13 @@ Countly.removeAllConsent = function () { CountlyReactNative.removeAllConsent(); }; +/** + * + * Replaces all stored Remote Config values with new values from server. + * + * @param {function} callback function to be called after fetching values. + * @return {string | void} error message or void + */ Countly.remoteConfigUpdate = function (callback) { if (!_state.isInitialized) { const message = "'init' must be called before 'remoteConfigUpdate'"; @@ -1447,6 +1663,14 @@ Countly.remoteConfigUpdate = function (callback) { }); }; +/** + * + * Replace specific Remote Config key value pairs with new values from server. + * + * @param {string[]} keyNames array of keys to replace. + * @param {function} callback function to be called after fetching values. + * @return {string | void} error message or void + */ Countly.updateRemoteConfigForKeysOnly = function (keyNames, callback) { if (!_state.isInitialized) { const message = "'init' must be called before 'updateRemoteConfigForKeysOnly'"; @@ -1466,6 +1690,14 @@ Countly.updateRemoteConfigForKeysOnly = function (keyNames, callback) { } }; +/** + * + * Replace all except specific Remote Config key value pairs with new values from server. + * + * @param {string[]} keyNames array of keys to skip. + * @param {function} callback function to be called after fetching values. + * @return {string | void} error message or void + */ Countly.updateRemoteConfigExceptKeys = function (keyNames, callback) { if (!_state.isInitialized) { const message = "'init' must be called before 'updateRemoteConfigExceptKeys'"; @@ -1485,6 +1717,14 @@ Countly.updateRemoteConfigExceptKeys = function (keyNames, callback) { } }; +/** + * + * Replace Remote Config key value for a specific key with new values from server. + * + * @param {string} keyNames key to fetch. + * @param {function} callback function to be called after fetching new values. + * @return {string | void} error message or void + */ Countly.getRemoteConfigValueForKey = function (keyName, callback) { if (!_state.isInitialized) { const message = "'init' must be called before 'getRemoteConfigValueForKey'"; @@ -1505,6 +1745,13 @@ Countly.getRemoteConfigValueForKey = function (keyName, callback) { }); }; +/** + * + * Replace Remote Config key value for a specific key with new values from server. + * + * @param {string} keyName key to fetch. + * @return {string | promise} error message or promise + */ Countly.getRemoteConfigValueForKeyP = function (keyName) { if (!_state.isInitialized) { const message = "'init' must be called before 'getRemoteConfigValueForKeyP'"; @@ -1533,6 +1780,12 @@ Countly.getRemoteConfigValueForKeyP = function (keyName) { }); }; +/** + * + * Clear all Remote Config values downloaded from the server. + * + * @return {string | promise} error message or promise + */ Countly.remoteConfigClearValues = async function () { if (!_state.isInitialized) { const message = "'init' must be called before 'remoteConfigClearValues'"; @@ -1543,6 +1796,7 @@ Countly.remoteConfigClearValues = async function () { const result = await CountlyReactNative.remoteConfigClearValues(); return result; }; + /** * @deprecated in 23.02.0 : use 'countlyConfig.setStarRatingDialogTexts' instead of 'setStarRatingDialogTexts'. * @@ -1562,6 +1816,14 @@ Countly.setStarRatingDialogTexts = function (starRatingTextTitle, starRatingText CountlyReactNative.setStarRatingDialogTexts(args); }; +/** + * + * For getting brief feedback from your users to be displayed on the + Countly dashboard. + * + * @param {function} callback function to be called after it completes. + * @return {string | void} error message or void + */ Countly.showStarRating = function (callback) { if (!_state.isInitialized) { const message = "'init' must be called before 'showStarRating'"; @@ -1581,6 +1843,7 @@ Countly.showStarRating = function (callback) { * @param {string} widgetId - id of rating widget to present * @param {string} closeButtonText - text for cancel/close button * @param {callback listener} [ratingWidgetCallback] This parameter is optional. + * @return {string | void} error message or void */ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingWidgetCallback) { var message = ""; @@ -1590,7 +1853,7 @@ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingW return message; } if (!widgetId) { - message = 'Rating Widget id should not be null or empty'; + message = "Rating Widget id should not be null or empty"; L.e(`presentRatingWidgetWithID, ${message}`); return message; } @@ -1612,7 +1875,7 @@ Countly.presentRatingWidgetWithID = function (widgetId, closeButtonText, ratingW * Get a list of available feedback widgets as array of object to handle multiple widgets of same type. * @deprecated in 23.8.0 : use 'Countly.feedback.getAvailableFeedbackWidgets' instead of 'getFeedbackWidgets'. * @param {callback listener} [onFinished] - returns (retrievedWidgets, error). This parameter is optional. - * @return {string | []} error message or [] + * @return {string | []} error message or array of feedback widgets */ Countly.getFeedbackWidgets = async function (onFinished) { if (!_state.isInitialized) { @@ -1694,11 +1957,19 @@ Countly.presentFeedbackWidgetObject = async function (feedbackWidget, closeButto * * Events get grouped together and are sent either every minute or after the unsent event count reaches a threshold. By default it is 10 * Should be called before Countly init + * @param {number} size - event count */ Countly.setEventSendThreshold = function (size) { CountlyReactNative.setEventSendThreshold([size.toString() || ""]); }; +/** + * + * Measure and record time taken by any operation. + * + * @param {string} traceKey name of trace + * @return {string | void} error message or void + */ Countly.startTrace = function (traceKey) { if (!_state.isInitialized) { const message = "'init' must be called before 'startTrace'"; @@ -1711,6 +1982,13 @@ Countly.startTrace = function (traceKey) { CountlyReactNative.startTrace(args); }; +/** + * + * Cancel custom trace. + * + * @param {string} traceKey name of trace + * @return {string | void} error message or void + */ Countly.cancelTrace = function (traceKey) { if (!_state.isInitialized) { const message = "'init' must be called before 'cancelTrace'"; @@ -1723,6 +2001,12 @@ Countly.cancelTrace = function (traceKey) { CountlyReactNative.cancelTrace(args); }; +/** + * + * Cancel all custom traces. + * + * @return {string | void} error message or void + */ Countly.clearAllTraces = function () { if (!_state.isInitialized) { const message = "'init' must be called before 'clearAllTraces'"; @@ -1734,6 +2018,14 @@ Countly.clearAllTraces = function () { CountlyReactNative.clearAllTraces(args); }; +/** + * + * End a custom trace. + * + * @param {string} traceKey name of trace + * @param {object} customMetric metric with key/value pair + * @return {string | void} error message or void + */ Countly.endTrace = function (traceKey, customMetric) { if (!_state.isInitialized) { const message = "'init' must be called before 'endTrace'"; @@ -1751,6 +2043,23 @@ Countly.endTrace = function (traceKey, customMetric) { CountlyReactNative.endTrace(args); }; +/** + * + * Manually record a custom trace + * + * @param {string} networkTraceKey name of trace + * @param {number} responseCode HTTP status code of the received + response + * @param {number} requestPayloadSize Size of the request's + payload in bytes + * @param {number} responsePayloadSize Size + of the received response's payload in bytes + * @param {number} startTime UNIX timestamp in milliseconds for + the starting time of the request + * @param {number} endTime UNIX timestamp in milliseconds for + the ending time of the request + * @return {string | void} error message or void + */ Countly.recordNetworkTrace = function (networkTraceKey, responseCode, requestPayloadSize, responsePayloadSize, startTime, endTime) { if (!_state.isInitialized) { const message = "'init' must be called before 'recordNetworkTrace'"; @@ -1786,6 +2095,8 @@ Countly.enableApm = function () { * Enable campaign attribution reporting to Countly. * For iOS use "recordAttributionID" instead of "enableAttribution" * Should be called before Countly init + * @param {string} attributionID attribution ID + * @return {string | void} error message or void */ Countly.enableAttribution = async function (attributionID = "") { L.w("enableAttribution, enableAttribution is deprecated, use Countly.recordIndirectAttribution instead."); @@ -1809,6 +2120,8 @@ Countly.enableAttribution = async function (attributionID = "") { * * set attribution Id for campaign attribution reporting. * Currently implemented for iOS only + * @param {string} attributionID attribution ID + * @return {string | void} error message or void */ Countly.recordAttributionID = function (attributionID) { L.w("recordAttributionID, recordAttributionID is deprecated, use Countly.recordIndirectAttribution instead."); @@ -1819,10 +2132,12 @@ Countly.recordAttributionID = function (attributionID) { args.push(attributionID); CountlyReactNative.recordAttributionID(args); }; + /** * Replaces all requests with a different app key with the current app key. * In request queue, if there are any request whose app key is different than the current app key, * these requests' app key will be replaced with the current app key. + * @return {string | void} error message or void */ Countly.replaceAllAppKeysInQueueWithCurrentAppKey = function () { if (!_state.isInitialized) { @@ -1833,8 +2148,12 @@ Countly.replaceAllAppKeysInQueueWithCurrentAppKey = function () { L.d("replaceAllAppKeysInQueueWithCurrentAppKey, Replacing all app keys in queue with current app key"); CountlyReactNative.replaceAllAppKeysInQueueWithCurrentAppKey(); }; + /** * set direct attribution Id for campaign attribution reporting. + * @param {string} campaignType type + * @param {string} campaignData data + * @return {string | void} error message or void */ Countly.recordDirectAttribution = function (campaignType, campaignData) { if (!_state.isInitialized) { @@ -1848,8 +2167,11 @@ Countly.recordDirectAttribution = function (campaignType, campaignData) { args.push(campaignData); CountlyReactNative.recordDirectAttribution(args); }; + /** * set indirect attribution Id for campaign attribution reporting. + * @param {string} attributionValues attribution values + * @return {string | void} error message or void */ Countly.recordIndirectAttribution = function (attributionValues) { if (!_state.isInitialized) { @@ -1862,10 +2184,12 @@ Countly.recordIndirectAttribution = function (attributionValues) { args.push(attributionValues); CountlyReactNative.recordIndirectAttribution(args); }; + /** * Removes all requests with a different app key in request queue. * In request queue, if there are any request whose app key is different than the current app key, * these requests will be removed from request queue. + * @return {string | void} error message or void */ Countly.removeDifferentAppKeysFromQueue = function () { if (!_state.isInitialized) { @@ -1880,6 +2204,7 @@ Countly.removeDifferentAppKeysFromQueue = function () { /** * Call this function when app is loaded, so that the app launch duration can be recorded. * Should be called after init. + * @return {string | void} error message or void */ Countly.appLoadingFinished = async function () { if (!_state.isInitialized) { @@ -1894,8 +2219,9 @@ Countly.appLoadingFinished = async function () { /** * Set the metrics you want to override * Should be called before Countly init - * @param {object} customMetric - metric with key/value pair + * @param {object} customMetric metric with key/value pair * Supported data type for customMetric values is String + * @return {string | void} error message or void */ Countly.setCustomMetrics = async function (customMetric) { L.d(`setCustomMetrics, Setting custom metrics: [${JSON.stringify(customMetric)}]`); From d4fb8288a0b2d97f72aeeee58952e300a650c838 Mon Sep 17 00:00:00 2001 From: Arif Burak Demiray <57103426+arifBurakDemiray@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:04:45 +0000 Subject: [PATCH 16/48] [RN] Add warnings to all SDK example apps that would check if propper credentials have been set or it still has the defaults. (#299) * feat: add warning for defaults * Update Configuration.tsx * Update Configuration.tsx --------- Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> --- example/CountlyRNExample/Configuration.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/example/CountlyRNExample/Configuration.tsx b/example/CountlyRNExample/Configuration.tsx index 130ac77d..11c2062e 100644 --- a/example/CountlyRNExample/Configuration.tsx +++ b/example/CountlyRNExample/Configuration.tsx @@ -1,7 +1,11 @@ import CountlyConfig from "countly-sdk-react-native-bridge/CountlyConfig"; -const COUNTLY_SERVER_KEY = "https://yourdomain.countly"; -const COUNTLY_APP_KEY = "COUNTLY_APP_KEY"; +const COUNTLY_SERVER_KEY = "https://your.server.ly"; +const COUNTLY_APP_KEY = "YOUR_APP_KEY"; + +if (COUNTLY_APP_KEY === "YOUR_APP_KEY" || COUNTLY_SERVER_KEY === "https://your.server.ly") { + console.warn("Please do not use default set of app key and server url") +} const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY).setLoggingEnabled(true); // Enable countly internal debugging logs // .disableAdditionalIntentRedirectionChecks() // Disable additional intent redirection checks From 6f4e8a069c2e2618bb389654095201843d23bca9 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:03:23 +0100 Subject: [PATCH 17/48] update to android 24.1.1 (#312) * update to android 24.1.0 * 1 --------- Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 4b0b40a4..1351b4ad 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,7 +41,7 @@ repositories { dependencies { implementation "com.facebook.react:react-native:${safeExtGet('reactNativeVersion', '+')}" - implementation 'ly.count.android:sdk:23.12.0' + implementation 'ly.count.android:sdk:24.1.1' // Import the BoM for the Firebase platform // The BoM version of 28.4.2 is the newest release that will target firebase-messaging version 22 From 3a31c9f2715ab1f2e9eebb77035b555b6e86c7c1 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:03:51 +0100 Subject: [PATCH 18/48] update ios to 24.1.0 (#311) --- .../project.pbxproj | 258 +++++++++++------- ios/src/CHANGELOG.md | 15 + ios/src/Countly-PL.podspec | 4 +- ios/src/Countly.m | 6 +- ios/src/Countly.podspec | 4 +- ios/src/Countly.xcodeproj/project.pbxproj | 12 +- ios/src/CountlyAPMConfig.h | 25 ++ ios/src/CountlyAPMConfig.m | 38 +++ ios/src/CountlyCommon.m | 2 +- ios/src/CountlyConfig.h | 9 +- ios/src/CountlyConfig.m | 34 ++- ios/src/CountlyPerformanceMonitoring.h | 2 +- ios/src/CountlyPerformanceMonitoring.m | 45 ++- ios/src/countly_dsym_uploader.sh | 142 ++++++---- ios/src/include/CountlyAPMConfig.h | 1 + 15 files changed, 432 insertions(+), 165 deletions(-) create mode 100644 ios/src/CountlyAPMConfig.h create mode 100644 ios/src/CountlyAPMConfig.m create mode 120000 ios/src/include/CountlyAPMConfig.h diff --git a/ios/countly-sdk-react-native-bridge.xcodeproj/project.pbxproj b/ios/countly-sdk-react-native-bridge.xcodeproj/project.pbxproj index 69535f94..0ef8cd1a 100644 --- a/ios/countly-sdk-react-native-bridge.xcodeproj/project.pbxproj +++ b/ios/countly-sdk-react-native-bridge.xcodeproj/project.pbxproj @@ -11,22 +11,32 @@ 8B0E001F225527EA00C809EF /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B0E001E225527EA00C809EF /* CoreTelephony.framework */; }; 8B0E0021225527F100C809EF /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B0E0020225527F100C809EF /* OpenGLES.framework */; }; 8B23E3372255198200807805 /* CountlyReactNative.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B23E30A2255197B00807805 /* CountlyReactNative.m */; }; - 8B7E63DC243DD1BA000BB76D /* CountlyCrashReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63C3243DD1B7000BB76D /* CountlyCrashReporter.m */; }; - 8B7E63DD243DD1BA000BB76D /* CountlyDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63C4243DD1B7000BB76D /* CountlyDeviceInfo.m */; }; - 8B7E63DE243DD1BA000BB76D /* CountlyCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63C6243DD1B8000BB76D /* CountlyCommon.m */; }; - 8B7E63DF243DD1BA000BB76D /* CountlyUserDetails.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63C7243DD1B8000BB76D /* CountlyUserDetails.m */; }; - 8B7E63E0243DD1BA000BB76D /* CountlyPersistency.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63CC243DD1B8000BB76D /* CountlyPersistency.m */; }; - 8B7E63E1243DD1BA000BB76D /* CountlyConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63CD243DD1B8000BB76D /* CountlyConnectionManager.m */; }; - 8B7E63E2243DD1BA000BB76D /* CountlyEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63CE243DD1B8000BB76D /* CountlyEvent.m */; }; - 8B7E63E3243DD1BA000BB76D /* CountlyStarRating.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63CF243DD1B8000BB76D /* CountlyStarRating.m */; }; - 8B7E63E4243DD1BA000BB76D /* CountlyViewTracking.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D0243DD1B8000BB76D /* CountlyViewTracking.m */; }; - 8B7E63E5243DD1BA000BB76D /* CountlyPushNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D1243DD1B8000BB76D /* CountlyPushNotifications.m */; }; - 8B7E63E6243DD1BA000BB76D /* CountlyConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D2243DD1B9000BB76D /* CountlyConfig.m */; }; - 8B7E63E7243DD1BA000BB76D /* Countly.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D4243DD1B9000BB76D /* Countly.m */; }; - 8B7E63E8243DD1BA000BB76D /* CountlyLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D5243DD1B9000BB76D /* CountlyLocationManager.m */; }; - 8B7E63E9243DD1BA000BB76D /* CountlyConsentManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D6243DD1B9000BB76D /* CountlyConsentManager.m */; }; - 8B7E63EA243DD1BA000BB76D /* CountlyRemoteConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63D8243DD1B9000BB76D /* CountlyRemoteConfig.m */; }; - 8B7E63EB243DD1BA000BB76D /* CountlyNotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7E63DA243DD1BA000BB76D /* CountlyNotificationService.m */; }; + C0C546C32B7E5FD400EF5418 /* CountlyConsentManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C5467F2B7E5FD100EF5418 /* CountlyConsentManager.m */; }; + C0C546C42B7E5FD400EF5418 /* CountlyLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546812B7E5FD100EF5418 /* CountlyLocationManager.m */; }; + C0C546C52B7E5FD400EF5418 /* Countly.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546822B7E5FD100EF5418 /* Countly.m */; }; + C0C546C62B7E5FD400EF5418 /* CountlyDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546832B7E5FD100EF5418 /* CountlyDeviceInfo.m */; }; + C0C546C72B7E5FD400EF5418 /* CountlyFeedbacks.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546842B7E5FD100EF5418 /* CountlyFeedbacks.m */; }; + C0C546C82B7E5FD400EF5418 /* CountlyPushNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546882B7E5FD200EF5418 /* CountlyPushNotifications.m */; }; + C0C546C92B7E5FD400EF5418 /* CountlyRemoteConfigInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C5468D2B7E5FD200EF5418 /* CountlyRemoteConfigInternal.m */; }; + C0C546CA2B7E5FD400EF5418 /* CountlyPersistency.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C5468E2B7E5FD200EF5418 /* CountlyPersistency.m */; }; + C0C546CB2B7E5FD400EF5418 /* CountlyExperimentInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546902B7E5FD200EF5418 /* CountlyExperimentInformation.m */; }; + C0C546CC2B7E5FD400EF5418 /* CountlyRemoteConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546912B7E5FD200EF5418 /* CountlyRemoteConfig.m */; }; + C0C546CD2B7E5FD400EF5418 /* CountlyCrashReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546942B7E5FD200EF5418 /* CountlyCrashReporter.m */; }; + C0C546CE2B7E5FD400EF5418 /* CountlyRCData.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C5469B2B7E5FD200EF5418 /* CountlyRCData.m */; }; + C0C546CF2B7E5FD400EF5418 /* CountlyServerConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C5469D2B7E5FD200EF5418 /* CountlyServerConfig.m */; }; + C0C546D02B7E5FD400EF5418 /* CountlyUserDetails.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C5469E2B7E5FD200EF5418 /* CountlyUserDetails.m */; }; + C0C546D12B7E5FD400EF5418 /* CountlyViewTrackingInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546A12B7E5FD300EF5418 /* CountlyViewTrackingInternal.m */; }; + C0C546D22B7E5FD400EF5418 /* CountlyPerformanceMonitoring.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546A72B7E5FD300EF5418 /* CountlyPerformanceMonitoring.m */; }; + C0C546D32B7E5FD400EF5418 /* CountlyCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546A82B7E5FD300EF5418 /* CountlyCommon.m */; }; + C0C546D42B7E5FD400EF5418 /* CountlyConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546A92B7E5FD300EF5418 /* CountlyConnectionManager.m */; }; + C0C546D52B7E5FD400EF5418 /* CountlyRNPushNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546AB2B7E5FD300EF5418 /* CountlyRNPushNotifications.m */; }; + C0C546D62B7E5FD400EF5418 /* CountlyViewData.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546AC2B7E5FD300EF5418 /* CountlyViewData.m */; }; + C0C546D72B7E5FD400EF5418 /* CountlyViewTracking.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546AD2B7E5FD300EF5418 /* CountlyViewTracking.m */; }; + C0C546D82B7E5FD400EF5418 /* CountlyConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546AE2B7E5FD300EF5418 /* CountlyConfig.m */; }; + C0C546DA2B7E5FD400EF5418 /* CountlyNotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546B52B7E5FD400EF5418 /* CountlyNotificationService.m */; }; + C0C546DB2B7E5FD400EF5418 /* CountlyEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546B92B7E5FD400EF5418 /* CountlyEvent.m */; }; + C0C546DC2B7E5FD400EF5418 /* CountlyFeedbackWidget.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546BB2B7E5FD400EF5418 /* CountlyFeedbackWidget.m */; }; + C0C546DD2B7E5FD400EF5418 /* CountlyAPMConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C546BC2B7E5FD400EF5418 /* CountlyAPMConfig.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -49,38 +59,58 @@ 8B0E0020225527F100C809EF /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 8B23E30A2255197B00807805 /* CountlyReactNative.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyReactNative.m; sourceTree = ""; }; 8B23E31A2255197D00807805 /* CountlyReactNative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyReactNative.h; sourceTree = ""; }; - 8B7E63BC243DD1B7000BB76D /* CountlyEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyEvent.h; path = Pods/Countly/CountlyEvent.h; sourceTree = SOURCE_ROOT; }; - 8B7E63BD243DD1B7000BB76D /* CountlyViewTracking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyViewTracking.h; path = Pods/Countly/CountlyViewTracking.h; sourceTree = SOURCE_ROOT; }; - 8B7E63BE243DD1B7000BB76D /* Countly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Countly.h; path = Pods/Countly/Countly.h; sourceTree = SOURCE_ROOT; }; - 8B7E63BF243DD1B7000BB76D /* CountlyPersistency.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyPersistency.h; path = Pods/Countly/CountlyPersistency.h; sourceTree = SOURCE_ROOT; }; - 8B7E63C0243DD1B7000BB76D /* CountlyStarRating.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyStarRating.h; path = Pods/Countly/CountlyStarRating.h; sourceTree = SOURCE_ROOT; }; - 8B7E63C1243DD1B7000BB76D /* CountlyRemoteConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyRemoteConfig.h; path = Pods/Countly/CountlyRemoteConfig.h; sourceTree = SOURCE_ROOT; }; - 8B7E63C2243DD1B7000BB76D /* CountlyConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyConfig.h; path = Pods/Countly/CountlyConfig.h; sourceTree = SOURCE_ROOT; }; - 8B7E63C3243DD1B7000BB76D /* CountlyCrashReporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyCrashReporter.m; path = Pods/Countly/CountlyCrashReporter.m; sourceTree = SOURCE_ROOT; }; - 8B7E63C4243DD1B7000BB76D /* CountlyDeviceInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyDeviceInfo.m; path = Pods/Countly/CountlyDeviceInfo.m; sourceTree = SOURCE_ROOT; }; - 8B7E63C5243DD1B7000BB76D /* CountlyLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyLocationManager.h; path = Pods/Countly/CountlyLocationManager.h; sourceTree = SOURCE_ROOT; }; - 8B7E63C6243DD1B8000BB76D /* CountlyCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyCommon.m; path = Pods/Countly/CountlyCommon.m; sourceTree = SOURCE_ROOT; }; - 8B7E63C7243DD1B8000BB76D /* CountlyUserDetails.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyUserDetails.m; path = Pods/Countly/CountlyUserDetails.m; sourceTree = SOURCE_ROOT; }; - 8B7E63C8243DD1B8000BB76D /* CountlyCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyCommon.h; path = Pods/Countly/CountlyCommon.h; sourceTree = SOURCE_ROOT; }; - 8B7E63C9243DD1B8000BB76D /* CountlyConnectionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyConnectionManager.h; path = Pods/Countly/CountlyConnectionManager.h; sourceTree = SOURCE_ROOT; }; - 8B7E63CA243DD1B8000BB76D /* CountlyCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyCrashReporter.h; path = Pods/Countly/CountlyCrashReporter.h; sourceTree = SOURCE_ROOT; }; - 8B7E63CB243DD1B8000BB76D /* CountlyConsentManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyConsentManager.h; path = Pods/Countly/CountlyConsentManager.h; sourceTree = SOURCE_ROOT; }; - 8B7E63CC243DD1B8000BB76D /* CountlyPersistency.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyPersistency.m; path = Pods/Countly/CountlyPersistency.m; sourceTree = SOURCE_ROOT; }; - 8B7E63CD243DD1B8000BB76D /* CountlyConnectionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyConnectionManager.m; path = Pods/Countly/CountlyConnectionManager.m; sourceTree = SOURCE_ROOT; }; - 8B7E63CE243DD1B8000BB76D /* CountlyEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyEvent.m; path = Pods/Countly/CountlyEvent.m; sourceTree = SOURCE_ROOT; }; - 8B7E63CF243DD1B8000BB76D /* CountlyStarRating.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyStarRating.m; path = Pods/Countly/CountlyStarRating.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D0243DD1B8000BB76D /* CountlyViewTracking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyViewTracking.m; path = Pods/Countly/CountlyViewTracking.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D1243DD1B8000BB76D /* CountlyPushNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyPushNotifications.m; path = Pods/Countly/CountlyPushNotifications.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D2243DD1B9000BB76D /* CountlyConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyConfig.m; path = Pods/Countly/CountlyConfig.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D3243DD1B9000BB76D /* CountlyUserDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyUserDetails.h; path = Pods/Countly/CountlyUserDetails.h; sourceTree = SOURCE_ROOT; }; - 8B7E63D4243DD1B9000BB76D /* Countly.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Countly.m; path = Pods/Countly/Countly.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D5243DD1B9000BB76D /* CountlyLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyLocationManager.m; path = Pods/Countly/CountlyLocationManager.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D6243DD1B9000BB76D /* CountlyConsentManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyConsentManager.m; path = Pods/Countly/CountlyConsentManager.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D7243DD1B9000BB76D /* CountlyPushNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyPushNotifications.h; path = Pods/Countly/CountlyPushNotifications.h; sourceTree = SOURCE_ROOT; }; - 8B7E63D8243DD1B9000BB76D /* CountlyRemoteConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyRemoteConfig.m; path = Pods/Countly/CountlyRemoteConfig.m; sourceTree = SOURCE_ROOT; }; - 8B7E63D9243DD1BA000BB76D /* CountlyNotificationService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyNotificationService.h; path = Pods/Countly/CountlyNotificationService.h; sourceTree = SOURCE_ROOT; }; - 8B7E63DA243DD1BA000BB76D /* CountlyNotificationService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CountlyNotificationService.m; path = Pods/Countly/CountlyNotificationService.m; sourceTree = SOURCE_ROOT; }; - 8B7E63DB243DD1BA000BB76D /* CountlyDeviceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CountlyDeviceInfo.h; path = Pods/Countly/CountlyDeviceInfo.h; sourceTree = SOURCE_ROOT; }; + C0C5467F2B7E5FD100EF5418 /* CountlyConsentManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyConsentManager.m; sourceTree = ""; }; + C0C546802B7E5FD100EF5418 /* CountlyRemoteConfigInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRemoteConfigInternal.h; sourceTree = ""; }; + C0C546812B7E5FD100EF5418 /* CountlyLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyLocationManager.m; sourceTree = ""; }; + C0C546822B7E5FD100EF5418 /* Countly.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Countly.m; sourceTree = ""; }; + C0C546832B7E5FD100EF5418 /* CountlyDeviceInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyDeviceInfo.m; sourceTree = ""; }; + C0C546842B7E5FD100EF5418 /* CountlyFeedbacks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyFeedbacks.m; sourceTree = ""; }; + C0C546852B7E5FD200EF5418 /* CountlyConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyConfig.h; sourceTree = ""; }; + C0C546862B7E5FD200EF5418 /* CountlyViewTrackingInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyViewTrackingInternal.h; sourceTree = ""; }; + C0C546872B7E5FD200EF5418 /* CountlyFeedbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyFeedbacks.h; sourceTree = ""; }; + C0C546882B7E5FD200EF5418 /* CountlyPushNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyPushNotifications.m; sourceTree = ""; }; + C0C5468A2B7E5FD200EF5418 /* CountlyFeedbackWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyFeedbackWidget.h; sourceTree = ""; }; + C0C5468B2B7E5FD200EF5418 /* CountlyRCData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRCData.h; sourceTree = ""; }; + C0C5468D2B7E5FD200EF5418 /* CountlyRemoteConfigInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRemoteConfigInternal.m; sourceTree = ""; }; + C0C5468E2B7E5FD200EF5418 /* CountlyPersistency.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyPersistency.m; sourceTree = ""; }; + C0C546902B7E5FD200EF5418 /* CountlyExperimentInformation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyExperimentInformation.m; sourceTree = ""; }; + C0C546912B7E5FD200EF5418 /* CountlyRemoteConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRemoteConfig.m; sourceTree = ""; }; + C0C546932B7E5FD200EF5418 /* CountlyServerConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyServerConfig.h; sourceTree = ""; }; + C0C546942B7E5FD200EF5418 /* CountlyCrashReporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyCrashReporter.m; sourceTree = ""; }; + C0C546962B7E5FD200EF5418 /* CountlyNotificationService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyNotificationService.h; sourceTree = ""; }; + C0C546972B7E5FD200EF5418 /* CountlyPersistency.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyPersistency.h; sourceTree = ""; }; + C0C546992B7E5FD200EF5418 /* CountlyRemoteConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRemoteConfig.h; sourceTree = ""; }; + C0C5469A2B7E5FD200EF5418 /* CountlyCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyCrashReporter.h; sourceTree = ""; }; + C0C5469B2B7E5FD200EF5418 /* CountlyRCData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRCData.m; sourceTree = ""; }; + C0C5469D2B7E5FD200EF5418 /* CountlyServerConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyServerConfig.m; sourceTree = ""; }; + C0C5469E2B7E5FD200EF5418 /* CountlyUserDetails.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyUserDetails.m; sourceTree = ""; }; + C0C5469F2B7E5FD300EF5418 /* CountlyConsentManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyConsentManager.h; sourceTree = ""; }; + C0C546A02B7E5FD300EF5418 /* CountlyRNPushNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRNPushNotifications.h; sourceTree = ""; }; + C0C546A12B7E5FD300EF5418 /* CountlyViewTrackingInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyViewTrackingInternal.m; sourceTree = ""; }; + C0C546A32B7E5FD300EF5418 /* CountlyAPMConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyAPMConfig.h; sourceTree = ""; }; + C0C546A42B7E5FD300EF5418 /* CountlyEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyEvent.h; sourceTree = ""; }; + C0C546A52B7E5FD300EF5418 /* CountlyDeviceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyDeviceInfo.h; sourceTree = ""; }; + C0C546A62B7E5FD300EF5418 /* CountlyCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyCommon.h; sourceTree = ""; }; + C0C546A72B7E5FD300EF5418 /* CountlyPerformanceMonitoring.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyPerformanceMonitoring.m; sourceTree = ""; }; + C0C546A82B7E5FD300EF5418 /* CountlyCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyCommon.m; sourceTree = ""; }; + C0C546A92B7E5FD300EF5418 /* CountlyConnectionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyConnectionManager.m; sourceTree = ""; }; + C0C546AA2B7E5FD300EF5418 /* Countly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Countly.h; sourceTree = ""; }; + C0C546AB2B7E5FD300EF5418 /* CountlyRNPushNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRNPushNotifications.m; sourceTree = ""; }; + C0C546AC2B7E5FD300EF5418 /* CountlyViewData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyViewData.m; sourceTree = ""; }; + C0C546AD2B7E5FD300EF5418 /* CountlyViewTracking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyViewTracking.m; sourceTree = ""; }; + C0C546AE2B7E5FD300EF5418 /* CountlyConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyConfig.m; sourceTree = ""; }; + C0C546AF2B7E5FD300EF5418 /* CountlyPerformanceMonitoring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyPerformanceMonitoring.h; sourceTree = ""; }; + C0C546B02B7E5FD300EF5418 /* CountlyConnectionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyConnectionManager.h; sourceTree = ""; }; + C0C546B22B7E5FD300EF5418 /* CountlyViewTracking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyViewTracking.h; sourceTree = ""; }; + C0C546B42B7E5FD300EF5418 /* CountlyViewData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyViewData.h; sourceTree = ""; }; + C0C546B52B7E5FD400EF5418 /* CountlyNotificationService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyNotificationService.m; sourceTree = ""; }; + C0C546B62B7E5FD400EF5418 /* CountlyLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyLocationManager.h; sourceTree = ""; }; + C0C546B72B7E5FD400EF5418 /* CountlyExperimentInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyExperimentInformation.h; sourceTree = ""; }; + C0C546B82B7E5FD400EF5418 /* CountlyUserDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyUserDetails.h; sourceTree = ""; }; + C0C546B92B7E5FD400EF5418 /* CountlyEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyEvent.m; sourceTree = ""; }; + C0C546BA2B7E5FD400EF5418 /* CountlyPushNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyPushNotifications.h; sourceTree = ""; }; + C0C546BB2B7E5FD400EF5418 /* CountlyFeedbackWidget.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyFeedbackWidget.m; sourceTree = ""; }; + C0C546BC2B7E5FD400EF5418 /* CountlyAPMConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyAPMConfig.m; sourceTree = ""; }; DA5891D81BA9A9FC002B4DB2 /* libcountly-sdk-react-native-bridge.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libcountly-sdk-react-native-bridge.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -138,38 +168,58 @@ DA5891DA1BA9A9FC002B4DB2 /* src */ = { isa = PBXGroup; children = ( - 8B7E63BE243DD1B7000BB76D /* Countly.h */, - 8B7E63D4243DD1B9000BB76D /* Countly.m */, - 8B7E63C8243DD1B8000BB76D /* CountlyCommon.h */, - 8B7E63C6243DD1B8000BB76D /* CountlyCommon.m */, - 8B7E63C2243DD1B7000BB76D /* CountlyConfig.h */, - 8B7E63D2243DD1B9000BB76D /* CountlyConfig.m */, - 8B7E63C9243DD1B8000BB76D /* CountlyConnectionManager.h */, - 8B7E63CD243DD1B8000BB76D /* CountlyConnectionManager.m */, - 8B7E63CB243DD1B8000BB76D /* CountlyConsentManager.h */, - 8B7E63D6243DD1B9000BB76D /* CountlyConsentManager.m */, - 8B7E63CA243DD1B8000BB76D /* CountlyCrashReporter.h */, - 8B7E63C3243DD1B7000BB76D /* CountlyCrashReporter.m */, - 8B7E63DB243DD1BA000BB76D /* CountlyDeviceInfo.h */, - 8B7E63C4243DD1B7000BB76D /* CountlyDeviceInfo.m */, - 8B7E63BC243DD1B7000BB76D /* CountlyEvent.h */, - 8B7E63CE243DD1B8000BB76D /* CountlyEvent.m */, - 8B7E63C5243DD1B7000BB76D /* CountlyLocationManager.h */, - 8B7E63D5243DD1B9000BB76D /* CountlyLocationManager.m */, - 8B7E63D9243DD1BA000BB76D /* CountlyNotificationService.h */, - 8B7E63DA243DD1BA000BB76D /* CountlyNotificationService.m */, - 8B7E63BF243DD1B7000BB76D /* CountlyPersistency.h */, - 8B7E63CC243DD1B8000BB76D /* CountlyPersistency.m */, - 8B7E63D7243DD1B9000BB76D /* CountlyPushNotifications.h */, - 8B7E63D1243DD1B8000BB76D /* CountlyPushNotifications.m */, - 8B7E63C1243DD1B7000BB76D /* CountlyRemoteConfig.h */, - 8B7E63D8243DD1B9000BB76D /* CountlyRemoteConfig.m */, - 8B7E63C0243DD1B7000BB76D /* CountlyStarRating.h */, - 8B7E63CF243DD1B8000BB76D /* CountlyStarRating.m */, - 8B7E63D3243DD1B9000BB76D /* CountlyUserDetails.h */, - 8B7E63C7243DD1B8000BB76D /* CountlyUserDetails.m */, - 8B7E63BD243DD1B7000BB76D /* CountlyViewTracking.h */, - 8B7E63D0243DD1B8000BB76D /* CountlyViewTracking.m */, + C0C546AA2B7E5FD300EF5418 /* Countly.h */, + C0C546822B7E5FD100EF5418 /* Countly.m */, + C0C546A32B7E5FD300EF5418 /* CountlyAPMConfig.h */, + C0C546BC2B7E5FD400EF5418 /* CountlyAPMConfig.m */, + C0C546A62B7E5FD300EF5418 /* CountlyCommon.h */, + C0C546A82B7E5FD300EF5418 /* CountlyCommon.m */, + C0C546852B7E5FD200EF5418 /* CountlyConfig.h */, + C0C546AE2B7E5FD300EF5418 /* CountlyConfig.m */, + C0C546B02B7E5FD300EF5418 /* CountlyConnectionManager.h */, + C0C546A92B7E5FD300EF5418 /* CountlyConnectionManager.m */, + C0C5469F2B7E5FD300EF5418 /* CountlyConsentManager.h */, + C0C5467F2B7E5FD100EF5418 /* CountlyConsentManager.m */, + C0C5469A2B7E5FD200EF5418 /* CountlyCrashReporter.h */, + C0C546942B7E5FD200EF5418 /* CountlyCrashReporter.m */, + C0C546A52B7E5FD300EF5418 /* CountlyDeviceInfo.h */, + C0C546832B7E5FD100EF5418 /* CountlyDeviceInfo.m */, + C0C546A42B7E5FD300EF5418 /* CountlyEvent.h */, + C0C546B92B7E5FD400EF5418 /* CountlyEvent.m */, + C0C546B72B7E5FD400EF5418 /* CountlyExperimentInformation.h */, + C0C546902B7E5FD200EF5418 /* CountlyExperimentInformation.m */, + C0C546872B7E5FD200EF5418 /* CountlyFeedbacks.h */, + C0C546842B7E5FD100EF5418 /* CountlyFeedbacks.m */, + C0C5468A2B7E5FD200EF5418 /* CountlyFeedbackWidget.h */, + C0C546BB2B7E5FD400EF5418 /* CountlyFeedbackWidget.m */, + C0C546B62B7E5FD400EF5418 /* CountlyLocationManager.h */, + C0C546812B7E5FD100EF5418 /* CountlyLocationManager.m */, + C0C546962B7E5FD200EF5418 /* CountlyNotificationService.h */, + C0C546B52B7E5FD400EF5418 /* CountlyNotificationService.m */, + C0C546AF2B7E5FD300EF5418 /* CountlyPerformanceMonitoring.h */, + C0C546A72B7E5FD300EF5418 /* CountlyPerformanceMonitoring.m */, + C0C546972B7E5FD200EF5418 /* CountlyPersistency.h */, + C0C5468E2B7E5FD200EF5418 /* CountlyPersistency.m */, + C0C546BA2B7E5FD400EF5418 /* CountlyPushNotifications.h */, + C0C546882B7E5FD200EF5418 /* CountlyPushNotifications.m */, + C0C5468B2B7E5FD200EF5418 /* CountlyRCData.h */, + C0C5469B2B7E5FD200EF5418 /* CountlyRCData.m */, + C0C546992B7E5FD200EF5418 /* CountlyRemoteConfig.h */, + C0C546912B7E5FD200EF5418 /* CountlyRemoteConfig.m */, + C0C546802B7E5FD100EF5418 /* CountlyRemoteConfigInternal.h */, + C0C5468D2B7E5FD200EF5418 /* CountlyRemoteConfigInternal.m */, + C0C546A02B7E5FD300EF5418 /* CountlyRNPushNotifications.h */, + C0C546AB2B7E5FD300EF5418 /* CountlyRNPushNotifications.m */, + C0C546932B7E5FD200EF5418 /* CountlyServerConfig.h */, + C0C5469D2B7E5FD200EF5418 /* CountlyServerConfig.m */, + C0C546B82B7E5FD400EF5418 /* CountlyUserDetails.h */, + C0C5469E2B7E5FD200EF5418 /* CountlyUserDetails.m */, + C0C546B42B7E5FD300EF5418 /* CountlyViewData.h */, + C0C546AC2B7E5FD300EF5418 /* CountlyViewData.m */, + C0C546B22B7E5FD300EF5418 /* CountlyViewTracking.h */, + C0C546AD2B7E5FD300EF5418 /* CountlyViewTracking.m */, + C0C546862B7E5FD200EF5418 /* CountlyViewTrackingInternal.h */, + C0C546A12B7E5FD300EF5418 /* CountlyViewTrackingInternal.m */, 8B23E31A2255197D00807805 /* CountlyReactNative.h */, 8B23E30A2255197B00807805 /* CountlyReactNative.m */, ); @@ -208,6 +258,7 @@ TargetAttributes = { DA5891D71BA9A9FC002B4DB2 = { CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 1430; }; }; }; @@ -259,23 +310,33 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8B7E63EA243DD1BA000BB76D /* CountlyRemoteConfig.m in Sources */, - 8B7E63E7243DD1BA000BB76D /* Countly.m in Sources */, - 8B7E63E0243DD1BA000BB76D /* CountlyPersistency.m in Sources */, - 8B7E63E3243DD1BA000BB76D /* CountlyStarRating.m in Sources */, - 8B7E63E4243DD1BA000BB76D /* CountlyViewTracking.m in Sources */, - 8B7E63E2243DD1BA000BB76D /* CountlyEvent.m in Sources */, - 8B7E63EB243DD1BA000BB76D /* CountlyNotificationService.m in Sources */, - 8B7E63E8243DD1BA000BB76D /* CountlyLocationManager.m in Sources */, - 8B7E63E5243DD1BA000BB76D /* CountlyPushNotifications.m in Sources */, - 8B7E63E1243DD1BA000BB76D /* CountlyConnectionManager.m in Sources */, - 8B7E63E6243DD1BA000BB76D /* CountlyConfig.m in Sources */, - 8B7E63DD243DD1BA000BB76D /* CountlyDeviceInfo.m in Sources */, - 8B7E63E9243DD1BA000BB76D /* CountlyConsentManager.m in Sources */, - 8B7E63DE243DD1BA000BB76D /* CountlyCommon.m in Sources */, 8B23E3372255198200807805 /* CountlyReactNative.m in Sources */, - 8B7E63DC243DD1BA000BB76D /* CountlyCrashReporter.m in Sources */, - 8B7E63DF243DD1BA000BB76D /* CountlyUserDetails.m in Sources */, + C0C546D12B7E5FD400EF5418 /* CountlyViewTrackingInternal.m in Sources */, + C0C546CC2B7E5FD400EF5418 /* CountlyRemoteConfig.m in Sources */, + C0C546D52B7E5FD400EF5418 /* CountlyRNPushNotifications.m in Sources */, + C0C546D32B7E5FD400EF5418 /* CountlyCommon.m in Sources */, + C0C546C82B7E5FD400EF5418 /* CountlyPushNotifications.m in Sources */, + C0C546CF2B7E5FD400EF5418 /* CountlyServerConfig.m in Sources */, + C0C546D02B7E5FD400EF5418 /* CountlyUserDetails.m in Sources */, + C0C546CB2B7E5FD400EF5418 /* CountlyExperimentInformation.m in Sources */, + C0C546DB2B7E5FD400EF5418 /* CountlyEvent.m in Sources */, + C0C546D82B7E5FD400EF5418 /* CountlyConfig.m in Sources */, + C0C546C32B7E5FD400EF5418 /* CountlyConsentManager.m in Sources */, + C0C546D72B7E5FD400EF5418 /* CountlyViewTracking.m in Sources */, + C0C546D62B7E5FD400EF5418 /* CountlyViewData.m in Sources */, + C0C546C52B7E5FD400EF5418 /* Countly.m in Sources */, + C0C546C72B7E5FD400EF5418 /* CountlyFeedbacks.m in Sources */, + C0C546D22B7E5FD400EF5418 /* CountlyPerformanceMonitoring.m in Sources */, + C0C546CD2B7E5FD400EF5418 /* CountlyCrashReporter.m in Sources */, + C0C546DC2B7E5FD400EF5418 /* CountlyFeedbackWidget.m in Sources */, + C0C546CE2B7E5FD400EF5418 /* CountlyRCData.m in Sources */, + C0C546C92B7E5FD400EF5418 /* CountlyRemoteConfigInternal.m in Sources */, + C0C546CA2B7E5FD400EF5418 /* CountlyPersistency.m in Sources */, + C0C546C62B7E5FD400EF5418 /* CountlyDeviceInfo.m in Sources */, + C0C546C42B7E5FD400EF5418 /* CountlyLocationManager.m in Sources */, + C0C546DA2B7E5FD400EF5418 /* CountlyNotificationService.m in Sources */, + C0C546D42B7E5FD400EF5418 /* CountlyConnectionManager.m in Sources */, + C0C546DD2B7E5FD400EF5418 /* CountlyAPMConfig.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -364,6 +425,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 3CBC73E2DAF5C8B752B35AE3 /* Pods-countly-sdk-react-native-bridge.debug.xcconfig */; buildSettings = { + CLANG_ENABLE_MODULES = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(BUILT_PRODUCTS_DIR)/usr/local/include", @@ -376,6 +438,8 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -383,6 +447,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 81E9EE645A50A0CF974ED6CB /* Pods-countly-sdk-react-native-bridge.release.xcconfig */; buildSettings = { + CLANG_ENABLE_MODULES = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(BUILT_PRODUCTS_DIR)/usr/local/include", @@ -395,6 +460,7 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/ios/src/CHANGELOG.md b/ios/src/CHANGELOG.md index 9ff45c57..4e706be2 100644 --- a/ios/src/CHANGELOG.md +++ b/ios/src/CHANGELOG.md @@ -1,3 +1,18 @@ +## 24.1.0 +* Added a separate APM Configs with following options: + * `enableForegroundBackgroundTracking` + * `enableAppStartTimeTracking` + * `enableManualAppLoadedTrigger` + * `setAppStartTimestampOverride:` + +* Mitigated an issue in the symbol file uploading script where some dSYM files were archived without content + +* Deprecated `enablePerformanceMonitoring` initial config flag + +## 23.12.1 +* dSYM uploading script now can upload multiple dSYM files if their location is provided +* Added support for Xcode 15 DWARF file environment variable changes while using dSYM upload script + ## 23.12.0 * Added `disableLocation` initial config property to disable location tracking * Added `addSegmentationToViewWithID:` in view interface for adding segmentation to an ongoing view diff --git a/ios/src/Countly-PL.podspec b/ios/src/Countly-PL.podspec index 8a44ca2f..16823a69 100644 --- a/ios/src/Countly-PL.podspec +++ b/ios/src/Countly-PL.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Countly-PL' - s.version = '23.12.0' + s.version = '24.1.0' s.license = { :type => 'MIT', :file => 'LICENSE' } s.summary = 'Countly is an innovative, real-time, open source mobile analytics platform.' s.homepage = 'https://github.com/Countly/countly-sdk-ios' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = '*.{h,m}' - core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h' + core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h', 'CountlyAPMConfig.h' core.preserve_path = 'countly_dsym_uploader.sh' core.ios.frameworks = ['Foundation', 'UIKit', 'UserNotifications', 'CoreLocation', 'WebKit', 'CoreTelephony', 'WatchConnectivity'] end diff --git a/ios/src/Countly.m b/ios/src/Countly.m index bb68fe63..7f370ac2 100644 --- a/ios/src/Countly.m +++ b/ios/src/Countly.m @@ -222,9 +222,11 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyRemoteConfigInternal.sharedInstance.enrollABOnRCDownload = config.enrollABOnRCDownload; } [CountlyRemoteConfigInternal.sharedInstance downloadRemoteConfigAutomatically]; + if(config.apm.getAppStartTimestampOverride) { + appLoadStartTime = config.apm.getAppStartTimestampOverride; + } - CountlyPerformanceMonitoring.sharedInstance.isEnabledOnInitialConfig = config.enablePerformanceMonitoring; - [CountlyPerformanceMonitoring.sharedInstance startPerformanceMonitoring]; + [CountlyPerformanceMonitoring.sharedInstance startWithConfig:config.apm]; CountlyCommon.sharedInstance.enableOrientationTracking = config.enableOrientationTracking; [CountlyCommon.sharedInstance observeDeviceOrientationChanges]; diff --git a/ios/src/Countly.podspec b/ios/src/Countly.podspec index 2ea342ea..2f7f1063 100644 --- a/ios/src/Countly.podspec +++ b/ios/src/Countly.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Countly' - s.version = '23.12.0' + s.version = '24.1.0' s.license = { :type => 'MIT', :file => 'LICENSE' } s.summary = 'Countly is an innovative, real-time, open source mobile analytics platform.' s.homepage = 'https://github.com/Countly/countly-sdk-ios' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = '*.{h,m}' - core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h' + core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h', 'CountlyAPMConfig.h' core.preserve_path = 'countly_dsym_uploader.sh' core.ios.frameworks = ['Foundation', 'UIKit', 'UserNotifications', 'CoreLocation', 'WebKit', 'CoreTelephony', 'WatchConnectivity'] end diff --git a/ios/src/Countly.xcodeproj/project.pbxproj b/ios/src/Countly.xcodeproj/project.pbxproj index 581a8f39..fcfd3bff 100644 --- a/ios/src/Countly.xcodeproj/project.pbxproj +++ b/ios/src/Countly.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ 1A9027FE2AB197B50044EBCF /* CountlyExperimentInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */; }; 1ACA5DC12A309E7F001F770B /* CountlyRemoteConfigInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ACA5DBF2A309E7F001F770B /* CountlyRemoteConfigInternal.h */; }; 1ACA5DC22A309E7F001F770B /* CountlyRemoteConfigInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACA5DC02A309E7F001F770B /* CountlyRemoteConfigInternal.m */; }; + 39527E152B5FD27400EE5D7B /* CountlyAPMConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 39527E142B5FD27400EE5D7B /* CountlyAPMConfig.m */; }; + 39527E182B5FD54C00EE5D7B /* CountlyAPMConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 39527E162B5FD28900EE5D7B /* CountlyAPMConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3B20A9872245225A00E3D7AE /* Countly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B20A9852245225A00E3D7AE /* Countly.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3B20A9B22245228700E3D7AE /* CountlyConnectionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B20A98D2245228300E3D7AE /* CountlyConnectionManager.h */; }; 3B20A9B32245228700E3D7AE /* CountlyNotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B20A98E2245228300E3D7AE /* CountlyNotificationService.m */; }; @@ -70,6 +72,8 @@ 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyExperimentInformation.h; sourceTree = ""; }; 1ACA5DBF2A309E7F001F770B /* CountlyRemoteConfigInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRemoteConfigInternal.h; sourceTree = ""; }; 1ACA5DC02A309E7F001F770B /* CountlyRemoteConfigInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRemoteConfigInternal.m; sourceTree = ""; }; + 39527E142B5FD27400EE5D7B /* CountlyAPMConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyAPMConfig.m; sourceTree = ""; }; + 39527E162B5FD28900EE5D7B /* CountlyAPMConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyAPMConfig.h; sourceTree = ""; }; 3B20A9822245225A00E3D7AE /* Countly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Countly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B20A9852245225A00E3D7AE /* Countly.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Countly.h; sourceTree = ""; }; 3B20A9862245225A00E3D7AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -124,6 +128,8 @@ 3B20A9782245225A00E3D7AE = { isa = PBXGroup; children = ( + 39527E162B5FD28900EE5D7B /* CountlyAPMConfig.h */, + 39527E142B5FD27400EE5D7B /* CountlyAPMConfig.m */, 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */, 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */, 1A31106E2A7141AF001CB507 /* CountlyViewTracking.h */, @@ -207,6 +213,7 @@ 3B20A9BF2245228700E3D7AE /* CountlyLocationManager.h in Headers */, D219374B248AC71C00E5798B /* CountlyPerformanceMonitoring.h in Headers */, 3B20A9BC2245228700E3D7AE /* CountlyCommon.h in Headers */, + 39527E182B5FD54C00EE5D7B /* CountlyAPMConfig.h in Headers */, 3B20A9C52245228700E3D7AE /* CountlyCrashReporter.h in Headers */, 3B20A9BE2245228700E3D7AE /* CountlyDeviceInfo.h in Headers */, 3B20A9D62245228700E3D7AE /* CountlyConsentManager.h in Headers */, @@ -302,6 +309,7 @@ 3B20A9CB2245228700E3D7AE /* CountlyRemoteConfig.m in Sources */, 3B20A9BD2245228700E3D7AE /* CountlyConnectionManager.m in Sources */, 3B20A9C02245228700E3D7AE /* CountlyConsentManager.m in Sources */, + 39527E152B5FD27400EE5D7B /* CountlyAPMConfig.m in Sources */, 1A3110712A7141AF001CB507 /* CountlyViewTracking.m in Sources */, 1A3A576329ED47A20041B7BE /* CountlyServerConfig.m in Sources */, D219374C248AC71C00E5798B /* CountlyPerformanceMonitoring.m in Sources */, @@ -464,7 +472,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 23.12.0; + MARKETING_VERSION = 24.1.0; PRODUCT_BUNDLE_IDENTIFIER = ly.count.CountlyiOSSDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -493,7 +501,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 23.12.0; + MARKETING_VERSION = 24.1.0; PRODUCT_BUNDLE_IDENTIFIER = ly.count.CountlyiOSSDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/src/CountlyAPMConfig.h b/ios/src/CountlyAPMConfig.h new file mode 100644 index 00000000..f8f6440f --- /dev/null +++ b/ios/src/CountlyAPMConfig.h @@ -0,0 +1,25 @@ +// CountlyAPMConfig.h +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. + + +#import + + + +@interface CountlyAPMConfig : NSObject + +/** + * For enabling automatic foreground background performance monitoring. + * @discussion If set, Foreground/Background Monitoring will be started automatically on SDK start. + */ +@property (nonatomic) BOOL enableForegroundBackgroundTracking; +@property (nonatomic) BOOL enableAppStartTimeTracking; +@property (nonatomic) BOOL enableManualAppLoadedTrigger; + +- (void)setAppStartTimestampOverride:(long long)appStartTimeTimestamp; +- (long long)getAppStartTimestampOverride; + +@end diff --git a/ios/src/CountlyAPMConfig.m b/ios/src/CountlyAPMConfig.m new file mode 100644 index 00000000..05a0293b --- /dev/null +++ b/ios/src/CountlyAPMConfig.m @@ -0,0 +1,38 @@ +// CountlyAPMConfig.m +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. + +#import "CountlyAPMConfig.h" + +@implementation CountlyAPMConfig + +long long appLoadStartTimeOverride; + +- (instancetype)init +{ + if (self = [super init]) + { + } + + return self; +} + +- (void)setAppStartTimestampOverride:(long long)appStartTimeTimestamp +{ + appLoadStartTimeOverride = appStartTimeTimestamp; +} + +- (long long)getAppStartTimestampOverride +{ + return appLoadStartTimeOverride; +} + +- (void)enableAPMInternal:(BOOL)enableAPM +{ + self.enableForegroundBackgroundTracking = enableAPM; + self.enableAppStartTimeTracking = enableAPM; + self.enableManualAppLoadedTrigger = enableAPM; +} +@end diff --git a/ios/src/CountlyCommon.m b/ios/src/CountlyCommon.m index 79fe2111..c20ab314 100644 --- a/ios/src/CountlyCommon.m +++ b/ios/src/CountlyCommon.m @@ -26,7 +26,7 @@ @interface CountlyCommon () #endif @end -NSString* const kCountlySDKVersion = @"23.12.0"; +NSString* const kCountlySDKVersion = @"24.1.0"; NSString* const kCountlySDKName = @"objc-native-ios"; NSString* const kCountlyErrorDomain = @"ly.count.ErrorDomain"; diff --git a/ios/src/CountlyConfig.h b/ios/src/CountlyConfig.h index d0bd6714..8b3f8934 100644 --- a/ios/src/CountlyConfig.h +++ b/ios/src/CountlyConfig.h @@ -7,6 +7,7 @@ #import #import #import "CountlyRCData.h" +#import "CountlyAPMConfig.h" #if (TARGET_OS_IOS || TARGET_OS_TV) #import @@ -611,7 +612,13 @@ typedef enum : NSUInteger * For enabling automatic performance monitoring. * @discussion If set, Performance Monitoring feature will be started automatically on SDK start. */ -@property (nonatomic) BOOL enablePerformanceMonitoring; +@property (nonatomic) BOOL enablePerformanceMonitoring DEPRECATED_MSG_ATTRIBUTE("Use 'apm' CountlyAPMConfig object instead"); + +/** + * Variable to access apm configurations. + * @discussion APM configurations for developer to interact with SDK. + */ +- (CountlyAPMConfig *) apm; #pragma mark - diff --git a/ios/src/CountlyConfig.m b/ios/src/CountlyConfig.m index 955b0d14..fd2bc860 100644 --- a/ios/src/CountlyConfig.m +++ b/ios/src/CountlyConfig.m @@ -10,6 +10,10 @@ @interface CountlyConfig () @property (nonatomic) NSMutableArray *remoteConfigGlobalCallbacks; @end +@interface CountlyAPMConfig () +- (void)enableAPMInternal:(BOOL)enableAPM; +@end + @implementation CountlyConfig //NOTE: Countly features @@ -29,6 +33,7 @@ @implementation CountlyConfig CLYFeature const CLYCrashReporting = @"CLYCrashReporting"; #endif +CountlyAPMConfig *apmConfig = nil; //NOTE: Device ID options NSString* const CLYDefaultDeviceID = @""; //NOTE: It will be overridden to default device ID mechanism, depending on platform. @@ -52,28 +57,29 @@ - (instancetype)init self.eventSendThreshold = 100; self.storedRequestsLimit = 1000; self.crashLogLimit = 100; - + self.maxKeyLength = 128; self.maxValueLength = 256; self.maxSegmentationValues = 100; - + self.location = kCLLocationCoordinate2DInvalid; - + self.URLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration; - + self.internalLogLevel = CLYInternalLogLevelDebug; - + self.enableOrientationTracking = YES; self.enableServerConfiguration = NO; self.remoteConfigGlobalCallbacks = NSMutableArray.new; } - + return self; } -(void)remoteConfigRegisterGlobalCallback:(RCDownloadCallback) callback { [self.remoteConfigGlobalCallbacks addObject:callback]; + } @@ -82,4 +88,20 @@ -(void)remoteConfigRegisterGlobalCallback:(RCDownloadCallback) callback return self.remoteConfigGlobalCallbacks; } +- (void)setEnablePerformanceMonitoring:(BOOL)enablePerformanceMonitoring +{ + if (apmConfig == nil) { + apmConfig = CountlyAPMConfig.new; + } + [apmConfig enableAPMInternal:enablePerformanceMonitoring]; + +} + +- (nonnull CountlyAPMConfig *)apm { + if (apmConfig == nil) { + apmConfig = CountlyAPMConfig.new; + } + return apmConfig; +} + @end diff --git a/ios/src/CountlyPerformanceMonitoring.h b/ios/src/CountlyPerformanceMonitoring.h index 9c7631a2..29564350 100644 --- a/ios/src/CountlyPerformanceMonitoring.h +++ b/ios/src/CountlyPerformanceMonitoring.h @@ -7,9 +7,9 @@ #import @interface CountlyPerformanceMonitoring : NSObject -@property (nonatomic) BOOL isEnabledOnInitialConfig; + (instancetype)sharedInstance; +- (void) startWithConfig:(CountlyAPMConfig *) apmConfig; - (void)startPerformanceMonitoring; - (void)stopPerformanceMonitoring; diff --git a/ios/src/CountlyPerformanceMonitoring.m b/ios/src/CountlyPerformanceMonitoring.m index 3c6eb0f8..2d65ee41 100644 --- a/ios/src/CountlyPerformanceMonitoring.m +++ b/ios/src/CountlyPerformanceMonitoring.m @@ -32,6 +32,10 @@ @interface CountlyPerformanceMonitoring () @implementation CountlyPerformanceMonitoring +BOOL enableAppStartTimeTracking; +BOOL enableManualAppLoadedTrigger; +BOOL enableForegroundBackgroundTracking; + + (instancetype)sharedInstance { if (!CountlyCommon.sharedInstance.hasStarted) @@ -43,6 +47,18 @@ + (instancetype)sharedInstance return s_sharedInstance; } + +- (void) startWithConfig:(CountlyAPMConfig *) apmConfig +{ + enableAppStartTimeTracking = apmConfig.enableAppStartTimeTracking; + enableManualAppLoadedTrigger = apmConfig.enableManualAppLoadedTrigger; + if(enableAppStartTimeTracking && !enableManualAppLoadedTrigger) { + CLY_LOG_W(@"Automatic app start tracking is currently not supported, use manual app loaded trigger for now by setting 'config.apm.enableManualAppLoadedTrigger'\n Then call '[Countly.sharedInstance appLoadingFinished]'"); + } + enableForegroundBackgroundTracking = apmConfig.enableForegroundBackgroundTracking; + [self startPerformanceMonitoring]; +} + - (instancetype)init { if (self = [super init]) @@ -57,13 +73,13 @@ - (instancetype)init - (void)startPerformanceMonitoring { - if (!self.isEnabledOnInitialConfig) + if (!enableForegroundBackgroundTracking) return; if (!CountlyConsentManager.sharedInstance.consentForPerformanceMonitoring) return; - CLY_LOG_D(@"Starting performance monitoring..."); + CLY_LOG_D(@"Starting performance monitoring foreground/background tracking..."); #if (TARGET_OS_OSX) [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(applicationDidBecomeActive:) name:NSApplicationDidBecomeActiveNotification object:nil]; @@ -97,6 +113,10 @@ - (void)stopPerformanceMonitoring - (void)applicationDidBecomeActive:(NSNotification *)notification { CLY_LOG_D(@"applicationDidBecomeActive: (Performance Monitoring)"); + + if (!enableForegroundBackgroundTracking) + return; + [self startForegroundTrace]; } @@ -104,11 +124,18 @@ - (void)applicationDidBecomeActive:(NSNotification *)notification - (void)applicationWillResignActive:(NSNotification *)notification { CLY_LOG_D(@"applicationWillResignActive: (Performance Monitoring)"); + + if (!enableForegroundBackgroundTracking) + return; + [self startBackgroundTrace]; } - (void)startForegroundTrace { + if (!enableForegroundBackgroundTracking) + return; + [self endBackgroundTrace]; [self startCustomTrace:kCountlyPMKeyAppInForeground]; @@ -116,11 +143,17 @@ - (void)startForegroundTrace - (void)endForegroundTrace { + if (!enableForegroundBackgroundTracking) + return; + [self endCustomTrace:kCountlyPMKeyAppInForeground metrics:nil]; } - (void)startBackgroundTrace { + if (!enableForegroundBackgroundTracking) + return; + [self endForegroundTrace]; [self startCustomTrace:kCountlyPMKeyAppInBackground]; @@ -128,6 +161,8 @@ - (void)startBackgroundTrace - (void)endBackgroundTrace { + if (!enableForegroundBackgroundTracking) + return; [self endCustomTrace:kCountlyPMKeyAppInBackground metrics:nil]; } @@ -138,6 +173,12 @@ - (void)recordAppStartDurationTraceWithStartTime:(long long)startTime endTime:(l if (!CountlyConsentManager.sharedInstance.consentForPerformanceMonitoring) return; + if(!enableAppStartTimeTracking || !enableManualAppLoadedTrigger) + { + CLY_LOG_W(@"Set 'enableAppStartTimeTracking' and 'enableManualAppLoadedTrigger' in config to record App start duration trace!"); + return; + } + if (self.hasAlreadyRecordedAppStartDurationTrace) { CLY_LOG_W(@"App start duration trace can be recorded once per app launch. So, it will not be recorded this time!"); diff --git a/ios/src/countly_dsym_uploader.sh b/ios/src/countly_dsym_uploader.sh index 0423d59a..52378b34 100755 --- a/ios/src/countly_dsym_uploader.sh +++ b/ios/src/countly_dsym_uploader.sh @@ -21,12 +21,16 @@ # Notes: # Do not forget to replace YOUR_COUNTLY_SERVER and YOUR_APP_KEY with real values. # If your project setup and/or CI/CD flow requires a custom path for the generated dSYMs, you can specify it as third argument. +# Third argument is optional. If you do not provide it, the script will try to use Xcode Environment Variables to find the dSYM. +# If you provide it, the script will use the provided path to find the dSYM. +# The path should be absolute and point to the .dSYM file or the folder containing the .dSYM files. # Common functions countly_log () { echo "[Countly] $1"; } countly_fail () { countly_log "$1"; exit 0; } +countly_go_next_iteration () { countly_log "$1"; DSYM_FILE_NAME=$INITIAL_DSYM_FILE_NAME; DSYM_FOLDER_PATH=$INITIAL_FOLDER_PATH; continue; } countly_usage () { @@ -60,70 +64,108 @@ if [[ -z $CUSTOM_DSYM_PATH ]]; then fi DSYM_FOLDER_PATH=${DWARF_DSYM_FOLDER_PATH} + countly_log "dSYM folder path:[$DSYM_FOLDER_PATH]" DSYM_FILE_NAME=${DWARF_DSYM_FILE_NAME} + countly_log "dSYM file name:[$DSYM_FILE_NAME]" else DSYM_FOLDER_PATH=$(dirname "${CUSTOM_DSYM_PATH}") + countly_log "dSYM folder path:[$DSYM_FOLDER_PATH]" DSYM_FILE_NAME=$(basename "${CUSTOM_DSYM_PATH}") + countly_log "dSYM file name:[$DSYM_FILE_NAME]" fi +INITIAL_DSYM_FILE_NAME=$DSYM_FILE_NAME +INITIAL_FOLDER_PATH=$DSYM_FOLDER_PATH +DSYM_PATH="${DSYM_FOLDER_PATH}/${DSYM_FILE_NAME}" + +for file in "$DSYM_PATH"/*; do +printf "======\n[Countly] Processing $file \n" +IN_DSYM=false +IN_FOLDER=false + + if [[ ! $INITIAL_DSYM_FILE_NAME == *.dSYM ]]; then + countly_log "Provided file is not a .dSYM file!" + countly_log "Given Path was a Folder. Checking the files inside the folder for .dSYM files!" + if [[ $file == *.dSYM ]]; then + IN_FOLDER=true + DSYM_FILE_NAME=$(basename "${file}") + DSYM_PATH="${CUSTOM_DSYM_PATH}/${DSYM_FILE_NAME}" + else + countly_go_next_iteration "File inside the folder is not a .dSYM file!" + fi + else + countly_log "Provided file is a dSYM file!" + IN_DSYM=true + fi -DSYM_PATH="${DSYM_FOLDER_PATH}/${DSYM_FILE_NAME}"; -if [[ ! -d $DSYM_PATH ]]; then - countly_fail "dSYM path ${DSYM_PATH} does not exist!" -fi - -countly_log "Current dSYM path:[$DSYM_PATH]" - -# Extracting Build UUIDs from DSYM using dwarfdump -XCRUN_RES=$(xcrun dwarfdump --uuid "${DSYM_PATH}") -countly_log "Xcrun result:[$XCRUN_RES]" -RAW_UUID=$(echo "${XCRUN_RES}" | awk '{print $2}') -countly_log "Raw UUID:[$RAW_UUID]" -# Remove whitespace and such -BUILD_UUIDS=$(echo "${RAW_UUID}" | xargs | sed 's/ /,/g') -if [ $? -eq 0 ]; then - countly_log "Extracted Build UUIDs:[${BUILD_UUIDS}]" -else - countly_fail "Extracting Build UUIDs failed!" -fi - - -# Creating archive of DSYM folder using zip -DSYM_ZIP_PATH="/tmp/$(date +%s)_${DSYM_FILE_NAME}.zip" -pushd "${DSYM_FOLDER_PATH}" > /dev/null -zip -rq "${DSYM_ZIP_PATH}" "${DSYM_FILE_NAME}" -popd > /dev/null -if [ $? -eq 0 ]; then - countly_log "Created archive at $DSYM_ZIP_PATH" -else - countly_fail "Creating archive failed!" -fi + countly_log "Current dSYM path:[$DSYM_PATH]" + + # Extracting Build UUIDs from DSYM using dwarfdump + XCRUN_RES=$(xcrun dwarfdump --uuid "${DSYM_PATH}") + countly_log "Xcrun result:[$XCRUN_RES]" + RAW_UUID=$(echo "${XCRUN_RES}" | awk '{print $2}') + countly_log "Raw UUID:[$RAW_UUID]" + # Remove whitespace and such + BUILD_UUIDS=$(echo "${RAW_UUID}" | xargs | sed 's/ /,/g') + if [ $? -eq 0 ]; then + countly_log "Extracted Build UUIDs:[${BUILD_UUIDS}]" + if [ ! "$BUILD_UUIDS" ]; then + countly_go_next_iteration "Nothing was extracted! Check if your Xcode configuration or the provided path is correct." + fi + + else + countly_go_next_iteration "Extracting Build UUIDs failed!" + fi -# Preparing for upload -ENDPOINT="/i/crash_symbols/upload_symbol" + # Creating archive of DSYM folder using zip + countly_log "Creating archive of dSYM folder using zip" + countly_log "Current dSYM folder path:[$DSYM_FOLDER_PATH]" + countly_log "Current dSYM file name:[$DSYM_FILE_NAME]" + DSYM_ZIP_PATH="/tmp/$(date +%s)_${DSYM_FILE_NAME}.zip" + if [ $IN_FOLDER == true ]; then + countly_log "In folder. Pushd to:[$(dirname "${DSYM_PATH}")]" + pushd $(dirname "${DSYM_PATH}") > /dev/null + fi + if [ $IN_DSYM == true ]; then + countly_log "In dSYM. Pushd to:["${DSYM_FOLDER_PATH}"]" + pushd "${DSYM_FOLDER_PATH}" > /dev/null + fi + zip -r "${DSYM_ZIP_PATH}" "${DSYM_FILE_NAME}" + popd > /dev/null + if [ $? -eq 0 ]; then + countly_log "Created archive at $DSYM_ZIP_PATH" + else + countly_go_next_iteration "Creating archive failed!" + fi -PLATFORM="ios" #This value is common for all iOS/iPadOS/watchOS/tvOS/macOS + # Preparing for upload + ENDPOINT="/i/crash_symbols/upload_symbol" -EPN=${EFFECTIVE_PLATFORM_NAME:1} -if [[ -z $EPN ]]; then -EPN="macos" -fi + PLATFORM="ios" #This value is common for all iOS/iPadOS/watchOS/tvOS/macOS -QUERY="?platform=${PLATFORM}&epn=${EPN}&app_key=${APPKEY}&build=${BUILD_UUIDS}" -URL="${HOST}${ENDPOINT}${QUERY}" -countly_log "Uploading to:[${URL}]" + EPN=${EFFECTIVE_PLATFORM_NAME:1} + if [[ -z $EPN ]]; then + EPN="macos" + fi + QUERY="?platform=${PLATFORM}&epn=${EPN}&app_key=${APPKEY}&build=${BUILD_UUIDS}" + URL="${HOST}${ENDPOINT}${QUERY}" + countly_log "Uploading to:[${URL}]" -# Uploading to server using curl -UPLOAD_RESULT=$(curl -s -F "symbols=@${DSYM_ZIP_PATH}" "${URL}") -if [ $? -eq 0 ] && [ "${UPLOAD_RESULT}" == "{\"result\":\"Success\"}" ]; then - countly_log "dSYM upload succesfully completed." -else - countly_fail "dSYM upload failed! Response from the server:[${UPLOAD_RESULT}]" -fi + # Uploading to server using curl + UPLOAD_RESULT=$(curl -s -F "symbols=@${DSYM_ZIP_PATH}" "${URL}") + if [ $? -eq 0 ] && [ "${UPLOAD_RESULT}" == "{\"result\":\"Success\"}" ]; then + countly_log "dSYM upload succesfully completed." + else + countly_go_next_iteration "dSYM upload failed! Response from the server:[${UPLOAD_RESULT}]" + fi -# Removing artifacts -rm "${DSYM_ZIP_PATH}" + # Removing artifacts + rm "${DSYM_ZIP_PATH}" + # return variables to default + DSYM_FILE_NAME=$INITIAL_DSYM_FILE_NAME + DSYM_FOLDER_PATH=$INITIAL_FOLDER_PATH +done exit 0 diff --git a/ios/src/include/CountlyAPMConfig.h b/ios/src/include/CountlyAPMConfig.h new file mode 120000 index 00000000..3921d1df --- /dev/null +++ b/ios/src/include/CountlyAPMConfig.h @@ -0,0 +1 @@ +../CountlyAPMConfig.h \ No newline at end of file From b4ff065fc8152a29f68dd36c2a2615165ca06377 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 28 Feb 2024 07:44:03 +0100 Subject: [PATCH 19/48] remove package-lock.json file (#315) --- .gitignore | 3 +- package-lock.json | 28569 -------------------------------------------- 2 files changed, 2 insertions(+), 28570 deletions(-) delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 8b9ea54b..ab9a2268 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ android/android.iml android/.settings/org.eclipse.buildship.core.prefs android/.classpath countly-sdk-react-native-bridge-*.tgz -example/AwesomeProject \ No newline at end of file +example/AwesomeProject +package-lock.json \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a07321a8..00000000 --- a/package-lock.json +++ /dev/null @@ -1,28569 +0,0 @@ -{ - "name": "countly-sdk-react-native-bridge", - "version": "23.8.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "countly-sdk-react-native-bridge", - "version": "23.8.1", - "license": "MIT", - "devDependencies": { - "@babel/core": "7.23.3", - "@babel/preset-env": "7.23.3", - "@babel/runtime": "7.23.2", - "@react-native-community/eslint-config": "3.2.0", - "@swc/core": "1.3.96", - "@swc/wasm": "1.3.97", - "@tsconfig/react-native": "3.0.2", - "@types/jest": "^29.5.8", - "@types/react": "18.2.37", - "@types/react-native": "0.72.6", - "@types/react-test-renderer": "18.0.6", - "@typescript-eslint/eslint-plugin": "6.10.0", - "@typescript-eslint/parser": "6.10.0", - "babel-jest": "29.7.0", - "bufferutil": "4.0.8", - "encoding": "0.1.13", - "eslint": "8.53.0", - "eslint-config-airbnb": "19.0.4", - "eslint-config-prettier": "9.0.0", - "eslint-config-standard-with-typescript": "39.1.1", - "eslint-plugin-import": "2.29.0", - "eslint-plugin-jsx-a11y": "6.8.0", - "eslint-plugin-n": "16.3.1", - "eslint-plugin-promise": "6.1.1", - "eslint-plugin-react": "7.33.2", - "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-react-native": "4.1.0", - "jest": "^29.7.0", - "jest-config": "29.7.0", - "metro-react-native-babel-preset": "0.76.7", - "node-notifier": "10.0.1", - "prettier": "3.0.3", - "react-test-renderer": "18.2.0", - "ts-node": "10.9.1", - "typescript": "5.2.2", - "utf-8-validate": "6.0.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", - "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", - "dev": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", - "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-default-from": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", - "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", - "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", - "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", - "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", - "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", - "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", - "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", - "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", - "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", - "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", - "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", - "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", - "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", - "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", - "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", - "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", - "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-flow-strip-types": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", - "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", - "dev": true, - "peer": true, - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/register/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@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.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "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" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true, - "peer": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "peer": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@react-native-community/cli": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.7.tgz", - "integrity": "sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-clean": "11.3.7", - "@react-native-community/cli-config": "11.3.7", - "@react-native-community/cli-debugger-ui": "11.3.7", - "@react-native-community/cli-doctor": "11.3.7", - "@react-native-community/cli-hermes": "11.3.7", - "@react-native-community/cli-plugin-metro": "11.3.7", - "@react-native-community/cli-server-api": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "@react-native-community/cli-types": "11.3.7", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.0", - "semver": "^7.5.2" - }, - "bin": { - "react-native": "build/bin.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@react-native-community/cli-clean": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.7.tgz", - "integrity": "sha512-twtsv54ohcRyWVzPXL3F9VHGb4Qhn3slqqRs3wEuRzjR7cTmV2TIO2b1VhaqF4HlCgNd+cGuirvLtK2JJyaxMg==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "prompts": "^2.4.0" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-config": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.7.tgz", - "integrity": "sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "glob": "^7.1.3", - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.7.tgz", - "integrity": "sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ==", - "dev": true, - "peer": true, - "dependencies": { - "serve-static": "^1.13.1" - } - }, - "node_modules/@react-native-community/cli-doctor": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.7.tgz", - "integrity": "sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-config": "11.3.7", - "@react-native-community/cli-platform-android": "11.3.7", - "@react-native-community/cli-platform-ios": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "envinfo": "^7.7.2", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "prompts": "^2.4.0", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^9.0.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-hermes": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.7.tgz", - "integrity": "sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-platform-android": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-hermes/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.7.tgz", - "integrity": "sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "glob": "^7.1.3", - "logkitty": "^0.7.1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.7.tgz", - "integrity": "sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.0.12", - "glob": "^7.1.3", - "ora": "^5.4.1" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-plugin-metro": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.7.tgz", - "integrity": "sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-server-api": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "metro": "0.76.8", - "metro-config": "0.76.8", - "metro-core": "0.76.8", - "metro-react-native-babel-transformer": "0.76.8", - "metro-resolver": "0.76.8", - "metro-runtime": "0.76.8", - "readline": "^1.3.0" - } - }, - "node_modules/@react-native-community/cli-plugin-metro/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-plugin-metro/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-plugin-metro/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-plugin-metro/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-plugin-metro/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-plugin-metro/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.7.tgz", - "integrity": "sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native-community/cli-debugger-ui": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^7.5.1" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "version": "15.0.18", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", - "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@react-native-community/cli-tools": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.7.tgz", - "integrity": "sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA==", - "dev": true, - "peer": true, - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-tools/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli-types": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.7.tgz", - "integrity": "sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g==", - "dev": true, - "peer": true, - "dependencies": { - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@react-native-community/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-native-community/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/@react-native-community/eslint-config": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-native-community/eslint-config/-/eslint-config-3.2.0.tgz", - "integrity": "sha512-ZjGvoeiBtCbd506hQqwjKmkWPgynGUoJspG8/MuV/EfKnkjCtBmeJvq2n+sWbWEvL9LWXDp2GJmPzmvU5RSvKQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.14.0", - "@babel/eslint-parser": "^7.18.2", - "@react-native-community/eslint-plugin": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.30.5", - "@typescript-eslint/parser": "^5.30.5", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-ft-flow": "^2.0.1", - "eslint-plugin-jest": "^26.5.3", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-native": "^4.0.0" - }, - "peerDependencies": { - "eslint": ">=8", - "prettier": ">=2" - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/eslint-plugin-jest": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz", - "integrity": "sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/eslint-config/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@react-native-community/eslint-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz", - "integrity": "sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg==", - "dev": true - }, - "node_modules/@react-native/assets-registry": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.72.0.tgz", - "integrity": "sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==", - "dev": true, - "peer": true - }, - "node_modules/@react-native/codegen": { - "version": "0.72.7", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.72.7.tgz", - "integrity": "sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "jscodeshift": "^0.14.0", - "nullthrows": "^1.1.1" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.72.11", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz", - "integrity": "sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==", - "dev": true, - "peer": true - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.72.1", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz", - "integrity": "sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==", - "dev": true, - "peer": true - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz", - "integrity": "sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==", - "dev": true, - "peer": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.72.8", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz", - "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==", - "dev": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "peerDependencies": { - "react-native": "*" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "peer": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true, - "peer": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true, - "peer": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@swc/core": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.96.tgz", - "integrity": "sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@swc/counter": "^0.1.1", - "@swc/types": "^0.1.5" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.96", - "@swc/core-darwin-x64": "1.3.96", - "@swc/core-linux-arm-gnueabihf": "1.3.96", - "@swc/core-linux-arm64-gnu": "1.3.96", - "@swc/core-linux-arm64-musl": "1.3.96", - "@swc/core-linux-x64-gnu": "1.3.96", - "@swc/core-linux-x64-musl": "1.3.96", - "@swc/core-win32-arm64-msvc": "1.3.96", - "@swc/core-win32-ia32-msvc": "1.3.96", - "@swc/core-win32-x64-msvc": "1.3.96" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.96.tgz", - "integrity": "sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz", - "integrity": "sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz", - "integrity": "sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz", - "integrity": "sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz", - "integrity": "sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz", - "integrity": "sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz", - "integrity": "sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz", - "integrity": "sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz", - "integrity": "sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz", - "integrity": "sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", - "dev": true - }, - "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true - }, - "node_modules/@swc/wasm": { - "version": "1.3.97", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.3.97.tgz", - "integrity": "sha512-O9p6R6zN1NV1U64eBmU/2NvJGA79W/vUl9BaQwIgoSf2qrPrKMtexDV/aFk2N/mQriWxaK3HHxJAQSPRWsRs+w==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@tsconfig/react-native": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/react-native/-/react-native-3.0.2.tgz", - "integrity": "sha512-F7IoHEqf741lut4Z2K+IkWQRvXAhBiZMeY5L7BysG7Z2Z3MlIyFR+AagD8jQ/CqC1vowGnRwfLjeuwIpaeoJxA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.4.tgz", - "integrity": "sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", - "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-native": { - "version": "0.72.6", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.72.6.tgz", - "integrity": "sha512-5Tan0ejOjbYyrnRreRZ7ftcWbehQELoHevJQliAu0Rhqrsnall8dyodf/434jdDJuQEzLisBMg7ZkQNnghUXIw==", - "dev": true, - "dependencies": { - "@react-native/virtualized-lists": "^0.72.4", - "@types/react": "*" - } - }, - "node_modules/@types/react-test-renderer": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.6.tgz", - "integrity": "sha512-O2JT1J3/v/NaYHYmPf2DXBSqUGmp6iwhFPicES6Pc1Y90B9Qgu99mmaBGqfZFpVuXLzF/pNJB4K9ySL3iqFeXA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.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" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "peer": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "peer": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "dev": true, - "peer": true, - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "node_modules/ansi-fragments/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-fragments/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appdirsjs": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "dev": true, - "peer": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true - }, - "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "dev": true, - "peer": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "peer": true - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true, - "peer": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true, - "peer": true - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/builtins/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/builtins/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "peer": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "peer": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001553", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz", - "integrity": "sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "peer": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "peer": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "peer": true - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true, - "peer": true - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "peer": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "peer": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "peer": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "peer": true - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "peer": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "dev": true, - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true, - "peer": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "peer": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "dev": true, - "peer": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecated-react-native-prop-types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.1.0.tgz", - "integrity": "sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==", - "dev": true, - "peer": true, - "dependencies": { - "@react-native/normalize-colors": "*", - "invariant": "*", - "prop-types": "*" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.563", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz", - "integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", - "dev": true, - "peer": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "dev": true, - "peer": true, - "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "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.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "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.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "peer": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-config-standard-with-typescript": { - "version": "39.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-39.1.1.tgz", - "integrity": "sha512-t6B5Ep8E4I18uuoYeYxINyqcXb2UbC0SOOTxRtBSt2JUs+EzeXbfe2oaiPs71AIdnoWhXDO2fYOHz8df3kV84A==", - "dev": true, - "dependencies": { - "@typescript-eslint/parser": "^6.4.0", - "eslint-config-standard": "17.1.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.4.0", - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0", - "typescript": "*" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.3.0.tgz", - "integrity": "sha512-W9zIs+k00I/I13+Bdkl/zG1MEO07G97XjUSQuH117w620SJ6bHtLUmoMvkGA2oYnI/gNdr+G7BONLyYnFaLLEQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "engines": { - "node": ">=6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-ft-flow": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz", - "integrity": "sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "@babel/eslint-parser": "^7.12.0", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dev": true, - "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.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-n": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.1.tgz", - "integrity": "sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.1.0", - "get-tsconfig": "^4.7.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" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-n/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-native": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz", - "integrity": "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==", - "dev": true, - "dependencies": { - "eslint-plugin-react-native-globals": "^0.1.1" - }, - "peerDependencies": { - "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-xml-parser": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", - "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "peer": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "peer": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/flow-enums-runtime": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz", - "integrity": "sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==", - "dev": true, - "peer": true - }, - "node_modules/flow-parser": { - "version": "0.206.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", - "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.12.0.tgz", - "integrity": "sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==", - "dev": true, - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.12.0.tgz", - "integrity": "sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==", - "dev": true, - "peer": true, - "dependencies": { - "hermes-estree": "0.12.0" - } - }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "dev": true, - "peer": true, - "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hermes-profile-transformer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "peer": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dev": true, - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true, - "peer": true - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "peer": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "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" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "dev": true, - "peer": true, - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "dev": true, - "peer": true - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true - }, - "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/jscodeshift/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jscodeshift/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/jscodeshift/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" - } - }, - "node_modules/logkitty/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/logkitty/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/logkitty/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true - }, - "node_modules/logkitty/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/metro": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.76.8.tgz", - "integrity": "sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "accepts": "^1.3.7", - "async": "^3.2.2", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.12.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^27.2.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.76.8", - "metro-cache": "0.76.8", - "metro-cache-key": "0.76.8", - "metro-config": "0.76.8", - "metro-core": "0.76.8", - "metro-file-map": "0.76.8", - "metro-inspector-proxy": "0.76.8", - "metro-minify-terser": "0.76.8", - "metro-minify-uglify": "0.76.8", - "metro-react-native-babel-preset": "0.76.8", - "metro-resolver": "0.76.8", - "metro-runtime": "0.76.8", - "metro-source-map": "0.76.8", - "metro-symbolicate": "0.76.8", - "metro-transform-plugins": "0.76.8", - "metro-transform-worker": "0.76.8", - "mime-types": "^2.1.27", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "rimraf": "^3.0.2", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "throat": "^5.0.0", - "ws": "^7.5.1", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz", - "integrity": "sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "hermes-parser": "0.12.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-cache": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.76.8.tgz", - "integrity": "sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==", - "dev": true, - "peer": true, - "dependencies": { - "metro-core": "0.76.8", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-cache-key": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.76.8.tgz", - "integrity": "sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-config": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.76.8.tgz", - "integrity": "sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==", - "dev": true, - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "jest-validate": "^29.2.1", - "metro": "0.76.8", - "metro-cache": "0.76.8", - "metro-core": "0.76.8", - "metro-runtime": "0.76.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-core": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.76.8.tgz", - "integrity": "sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.76.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-file-map": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.76.8.tgz", - "integrity": "sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==", - "dev": true, - "peer": true, - "dependencies": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-regex-util": "^27.0.6", - "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", - "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/metro-file-map/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/metro-file-map/node_modules/@types/yargs": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", - "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/metro-file-map/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/metro-file-map/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/metro-file-map/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/metro-file-map/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro-file-map/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro-file-map/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true, - "peer": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/metro-file-map/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/metro-file-map/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/metro-file-map/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/metro-file-map/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro-inspector-proxy": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.76.8.tgz", - "integrity": "sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==", - "dev": true, - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "ws": "^7.5.1", - "yargs": "^17.6.2" - }, - "bin": { - "metro-inspector-proxy": "src/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-inspector-proxy/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro-inspector-proxy/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/metro-inspector-proxy/node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/metro-inspector-proxy/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/metro-minify-terser": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.76.8.tgz", - "integrity": "sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==", - "dev": true, - "peer": true, - "dependencies": { - "terser": "^5.15.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-minify-uglify": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.76.8.tgz", - "integrity": "sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==", - "dev": true, - "peer": true, - "dependencies": { - "uglify-es": "^3.1.9" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-react-native-babel-preset": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.7.tgz", - "integrity": "sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro-react-native-babel-transformer": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.8.tgz", - "integrity": "sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "babel-preset-fbjs": "^3.4.0", - "hermes-parser": "0.12.0", - "metro-react-native-babel-preset": "0.76.8", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro-react-native-babel-transformer/node_modules/metro-react-native-babel-preset": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz", - "integrity": "sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro-resolver": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.76.8.tgz", - "integrity": "sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-runtime": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.8.tgz", - "integrity": "sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "react-refresh": "^0.4.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-source-map": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.8.tgz", - "integrity": "sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.76.8", - "nullthrows": "^1.1.1", - "ob1": "0.76.8", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz", - "integrity": "sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==", - "dev": true, - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "metro-source-map": "0.76.8", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.76.8.tgz", - "integrity": "sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.76.8.tgz", - "integrity": "sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "babel-preset-fbjs": "^3.4.0", - "metro": "0.76.8", - "metro-babel-transformer": "0.76.8", - "metro-cache": "0.76.8", - "metro-cache-key": "0.76.8", - "metro-source-map": "0.76.8", - "metro-transform-plugins": "0.76.8", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/metro/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/metro/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true - }, - "node_modules/metro/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/metro/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/metro/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/metro/node_modules/metro-react-native-babel-preset": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz", - "integrity": "sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/nocache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true, - "peer": true - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-notifier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", - "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", - "dev": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "node_modules/ob1": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.8.tgz", - "integrity": "sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, - "peer": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "peer": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", - "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", - "dev": true, - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/react-native": { - "version": "0.72.6", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.6.tgz", - "integrity": "sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.2.1", - "@react-native-community/cli": "11.3.7", - "@react-native-community/cli-platform-android": "11.3.7", - "@react-native-community/cli-platform-ios": "11.3.7", - "@react-native/assets-registry": "^0.72.0", - "@react-native/codegen": "^0.72.7", - "@react-native/gradle-plugin": "^0.72.11", - "@react-native/js-polyfills": "^0.72.1", - "@react-native/normalize-colors": "^0.72.0", - "@react-native/virtualized-lists": "^0.72.8", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "base64-js": "^1.1.2", - "deprecated-react-native-prop-types": "4.1.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.5", - "invariant": "^2.2.4", - "jest-environment-node": "^29.2.1", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "0.76.8", - "metro-source-map": "0.76.8", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.3.0", - "react-devtools-core": "^4.27.2", - "react-refresh": "^0.4.0", - "react-shallow-renderer": "^16.15.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "stacktrace-parser": "^0.1.10", - "use-sync-external-store": "^1.0.0", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "node_modules/react-native/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/react-native/node_modules/@types/yargs": { - "version": "15.0.18", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", - "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/react-native/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-native/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-native/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-native/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/react-native/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/react-native/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "peer": true - }, - "node_modules/react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true - }, - "node_modules/react-native/node_modules/scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-native/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-test-renderer": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", - "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", - "dev": true, - "dependencies": { - "react-is": "^18.2.0", - "react-shallow-renderer": "^16.15.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "dev": true, - "peer": true - }, - "node_modules/recast": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", - "dev": true, - "peer": true, - "dependencies": { - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "peer": true - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "peer": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "peer": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "peer": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "peer": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "peer": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "peer": true - }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dev": true, - "peer": true - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dev": true, - "peer": true, - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", - "dev": true, - "peer": true, - "dependencies": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-es/node_modules/commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true, - "peer": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "dev": true, - "peer": true, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/utf-8-validate": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.3.tgz", - "integrity": "sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "peer": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "peer": true - }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", - "dev": true, - "peer": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "peer": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "peer": true - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", - "dev": true - }, - "@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/eslint-parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", - "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", - "dev": true, - "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, - "requires": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", - "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-default-from": "^7.18.6" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", - "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", - "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", - "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", - "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", - "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", - "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", - "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", - "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", - "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", - "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", - "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", - "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", - "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", - "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", - "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", - "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "dependencies": { - "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - } - } - } - }, - "@babel/preset-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", - "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-flow-strip-types": "^7.23.3" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - } - }, - "@babel/register": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", - "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", - "dev": true, - "peer": true, - "requires": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "peer": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@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.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", - "dev": true - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true, - "peer": true - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^29.6.3" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "requires": { - "eslint-scope": "5.1.1" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@react-native-community/cli": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.7.tgz", - "integrity": "sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-clean": "11.3.7", - "@react-native-community/cli-config": "11.3.7", - "@react-native-community/cli-debugger-ui": "11.3.7", - "@react-native-community/cli-doctor": "11.3.7", - "@react-native-community/cli-hermes": "11.3.7", - "@react-native-community/cli-plugin-metro": "11.3.7", - "@react-native-community/cli-server-api": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "@react-native-community/cli-types": "11.3.7", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.0", - "semver": "^7.5.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - } - } - }, - "@react-native-community/cli-clean": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.7.tgz", - "integrity": "sha512-twtsv54ohcRyWVzPXL3F9VHGb4Qhn3slqqRs3wEuRzjR7cTmV2TIO2b1VhaqF4HlCgNd+cGuirvLtK2JJyaxMg==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "prompts": "^2.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@react-native-community/cli-config": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.7.tgz", - "integrity": "sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "glob": "^7.1.3", - "joi": "^17.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@react-native-community/cli-debugger-ui": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.7.tgz", - "integrity": "sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ==", - "dev": true, - "peer": true, - "requires": { - "serve-static": "^1.13.1" - } - }, - "@react-native-community/cli-doctor": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.7.tgz", - "integrity": "sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-config": "11.3.7", - "@react-native-community/cli-platform-android": "11.3.7", - "@react-native-community/cli-platform-ios": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "envinfo": "^7.7.2", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "prompts": "^2.4.0", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^9.0.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - } - } - }, - "@react-native-community/cli-hermes": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.7.tgz", - "integrity": "sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-platform-android": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@react-native-community/cli-platform-android": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.7.tgz", - "integrity": "sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "glob": "^7.1.3", - "logkitty": "^0.7.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@react-native-community/cli-platform-ios": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.7.tgz", - "integrity": "sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.0.12", - "glob": "^7.1.3", - "ora": "^5.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@react-native-community/cli-plugin-metro": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.7.tgz", - "integrity": "sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-server-api": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "metro": "0.76.8", - "metro-config": "0.76.8", - "metro-core": "0.76.8", - "metro-react-native-babel-transformer": "0.76.8", - "metro-resolver": "0.76.8", - "metro-runtime": "0.76.8", - "readline": "^1.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@react-native-community/cli-server-api": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.7.tgz", - "integrity": "sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg==", - "dev": true, - "peer": true, - "requires": { - "@react-native-community/cli-debugger-ui": "11.3.7", - "@react-native-community/cli-tools": "11.3.7", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^7.5.1" - }, - "dependencies": { - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "peer": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@types/yargs": { - "version": "15.0.18", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", - "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", - "dev": true, - "peer": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "@react-native-community/cli-tools": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.7.tgz", - "integrity": "sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA==", - "dev": true, - "peer": true, - "requires": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - } - } - }, - "@react-native-community/cli-types": { - "version": "11.3.7", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.7.tgz", - "integrity": "sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g==", - "dev": true, - "peer": true, - "requires": { - "joi": "^17.2.1" - } - }, - "@react-native-community/eslint-config": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-native-community/eslint-config/-/eslint-config-3.2.0.tgz", - "integrity": "sha512-ZjGvoeiBtCbd506hQqwjKmkWPgynGUoJspG8/MuV/EfKnkjCtBmeJvq2n+sWbWEvL9LWXDp2GJmPzmvU5RSvKQ==", - "dev": true, - "requires": { - "@babel/core": "^7.14.0", - "@babel/eslint-parser": "^7.18.2", - "@react-native-community/eslint-plugin": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.30.5", - "@typescript-eslint/parser": "^5.30.5", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-ft-flow": "^2.0.1", - "eslint-plugin-jest": "^26.5.3", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-native": "^4.0.0" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "requires": {} - }, - "eslint-plugin-jest": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz", - "integrity": "sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "^5.10.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@react-native-community/eslint-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz", - "integrity": "sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg==", - "dev": true - }, - "@react-native/assets-registry": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.72.0.tgz", - "integrity": "sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==", - "dev": true, - "peer": true - }, - "@react-native/codegen": { - "version": "0.72.7", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.72.7.tgz", - "integrity": "sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==", - "dev": true, - "peer": true, - "requires": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "jscodeshift": "^0.14.0", - "nullthrows": "^1.1.1" - } - }, - "@react-native/gradle-plugin": { - "version": "0.72.11", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz", - "integrity": "sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==", - "dev": true, - "peer": true - }, - "@react-native/js-polyfills": { - "version": "0.72.1", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz", - "integrity": "sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==", - "dev": true, - "peer": true - }, - "@react-native/normalize-colors": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz", - "integrity": "sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==", - "dev": true, - "peer": true - }, - "@react-native/virtualized-lists": { - "version": "0.72.8", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz", - "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==", - "dev": true, - "requires": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true, - "peer": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true, - "peer": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@swc/core": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.96.tgz", - "integrity": "sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ==", - "dev": true, - "requires": { - "@swc/core-darwin-arm64": "1.3.96", - "@swc/core-darwin-x64": "1.3.96", - "@swc/core-linux-arm-gnueabihf": "1.3.96", - "@swc/core-linux-arm64-gnu": "1.3.96", - "@swc/core-linux-arm64-musl": "1.3.96", - "@swc/core-linux-x64-gnu": "1.3.96", - "@swc/core-linux-x64-musl": "1.3.96", - "@swc/core-win32-arm64-msvc": "1.3.96", - "@swc/core-win32-ia32-msvc": "1.3.96", - "@swc/core-win32-x64-msvc": "1.3.96", - "@swc/counter": "^0.1.1", - "@swc/types": "^0.1.5" - } - }, - "@swc/core-darwin-arm64": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.96.tgz", - "integrity": "sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==", - "dev": true, - "optional": true - }, - "@swc/core-darwin-x64": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz", - "integrity": "sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm-gnueabihf": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz", - "integrity": "sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-gnu": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz", - "integrity": "sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-musl": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz", - "integrity": "sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-gnu": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz", - "integrity": "sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-musl": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz", - "integrity": "sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==", - "dev": true, - "optional": true - }, - "@swc/core-win32-arm64-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz", - "integrity": "sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==", - "dev": true, - "optional": true - }, - "@swc/core-win32-ia32-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz", - "integrity": "sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==", - "dev": true, - "optional": true - }, - "@swc/core-win32-x64-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz", - "integrity": "sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==", - "dev": true, - "optional": true - }, - "@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", - "dev": true - }, - "@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true - }, - "@swc/wasm": { - "version": "1.3.97", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.3.97.tgz", - "integrity": "sha512-O9p6R6zN1NV1U64eBmU/2NvJGA79W/vUl9BaQwIgoSf2qrPrKMtexDV/aFk2N/mQriWxaK3HHxJAQSPRWsRs+w==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@tsconfig/react-native": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/react-native/-/react-native-3.0.2.tgz", - "integrity": "sha512-F7IoHEqf741lut4Z2K+IkWQRvXAhBiZMeY5L7BysG7Z2Z3MlIyFR+AagD8jQ/CqC1vowGnRwfLjeuwIpaeoJxA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/node": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.4.tgz", - "integrity": "sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "18.2.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", - "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-native": { - "version": "0.72.6", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.72.6.tgz", - "integrity": "sha512-5Tan0ejOjbYyrnRreRZ7ftcWbehQELoHevJQliAu0Rhqrsnall8dyodf/434jdDJuQEzLisBMg7ZkQNnghUXIw==", - "dev": true, - "requires": { - "@react-native/virtualized-lists": "^0.72.4", - "@types/react": "*" - } - }, - "@types/react-test-renderer": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.6.tgz", - "integrity": "sha512-O2JT1J3/v/NaYHYmPf2DXBSqUGmp6iwhFPicES6Pc1Y90B9Qgu99mmaBGqfZFpVuXLzF/pNJB4K9ySL3iqFeXA==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.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" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - } - }, - "@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - } - }, - "@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - } - }, - "@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "peer": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "peer": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "dev": true, - "peer": true, - "requires": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "appdirsjs": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "dev": true, - "peer": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "requires": { - "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-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true - }, - "ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "peer": true - } - } - }, - "ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "peer": true - }, - "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true, - "peer": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, - "peer": true - }, - "asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true - }, - "axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "peer": true, - "requires": {} - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true, - "peer": true - }, - "babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, - "peer": true, - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "peer": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "peer": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "peer": true - }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "peer": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "peer": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "peer": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001553", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz", - "integrity": "sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "peer": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true, - "peer": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "peer": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "peer": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "peer": true - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true, - "peer": true - }, - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "peer": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "peer": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "peer": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "peer": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "peer": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", - "dev": true, - "requires": { - "browserslist": "^4.22.1" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "peer": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "peer": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "dev": true, - "peer": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true - } - } - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true, - "peer": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true - }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "peer": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "dev": true, - "peer": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "peer": true - }, - "deprecated-react-native-prop-types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.1.0.tgz", - "integrity": "sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==", - "dev": true, - "peer": true, - "requires": { - "@react-native/normalize-colors": "*", - "invariant": "*", - "prop-types": "*" - } - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "peer": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "peer": true - }, - "electron-to-chromium": { - "version": "1.4.563", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz", - "integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "peer": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", - "dev": true, - "peer": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "peer": true, - "requires": { - "stackframe": "^1.3.4" - } - }, - "errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "dev": true, - "peer": true, - "requires": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - } - }, - "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "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.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "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.13" - } - }, - "es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "requires": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.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" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - } - }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - } - }, - "eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "requires": {} - }, - "eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "requires": {} - }, - "eslint-config-standard-with-typescript": { - "version": "39.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-39.1.1.tgz", - "integrity": "sha512-t6B5Ep8E4I18uuoYeYxINyqcXb2UbC0SOOTxRtBSt2JUs+EzeXbfe2oaiPs71AIdnoWhXDO2fYOHz8df3kV84A==", - "dev": true, - "requires": { - "@typescript-eslint/parser": "^6.4.0", - "eslint-config-standard": "17.1.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es-x": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.3.0.tgz", - "integrity": "sha512-W9zIs+k00I/I13+Bdkl/zG1MEO07G97XjUSQuH117w620SJ6bHtLUmoMvkGA2oYnI/gNdr+G7BONLyYnFaLLEQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0" - } - }, - "eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - } - }, - "eslint-plugin-ft-flow": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz", - "integrity": "sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==", - "dev": true, - "requires": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dev": true, - "requires": { - "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.14.2" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - } - }, - "eslint-plugin-n": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.1.tgz", - "integrity": "sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.1.0", - "get-tsconfig": "^4.7.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" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react-native": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz", - "integrity": "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==", - "dev": true, - "requires": { - "eslint-plugin-react-native-globals": "^0.1.1" - } - }, - "eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "peer": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "peer": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fast-xml-parser": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", - "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", - "dev": true, - "peer": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "peer": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "peer": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "peer": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "peer": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "peer": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "peer": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "peer": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "flow-enums-runtime": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz", - "integrity": "sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==", - "dev": true, - "peer": true - }, - "flow-parser": { - "version": "0.206.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", - "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", - "dev": true, - "peer": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "peer": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "hermes-estree": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.12.0.tgz", - "integrity": "sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==", - "dev": true, - "peer": true - }, - "hermes-parser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.12.0.tgz", - "integrity": "sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==", - "dev": true, - "peer": true, - "requires": { - "hermes-estree": "0.12.0" - } - }, - "hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "dev": true, - "peer": true, - "requires": { - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "peer": true - } - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "peer": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "peer": true - } - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "peer": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dev": true, - "peer": true, - "requires": { - "queue": "6.0.2" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true, - "peer": true - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "peer": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "peer": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "peer": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.11" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "peer": true - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "peer": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "requires": { - "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" - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "dev": true, - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "dev": true, - "peer": true - }, - "jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true, - "peer": true - }, - "jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "peer": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "requires": { - "language-subtag-registry": "^0.3.20" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "peer": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "peer": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "peer": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "peer": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true, - "peer": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "metro": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.76.8.tgz", - "integrity": "sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "accepts": "^1.3.7", - "async": "^3.2.2", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.12.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^27.2.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.76.8", - "metro-cache": "0.76.8", - "metro-cache-key": "0.76.8", - "metro-config": "0.76.8", - "metro-core": "0.76.8", - "metro-file-map": "0.76.8", - "metro-inspector-proxy": "0.76.8", - "metro-minify-terser": "0.76.8", - "metro-minify-uglify": "0.76.8", - "metro-react-native-babel-preset": "0.76.8", - "metro-resolver": "0.76.8", - "metro-runtime": "0.76.8", - "metro-source-map": "0.76.8", - "metro-symbolicate": "0.76.8", - "metro-transform-plugins": "0.76.8", - "metro-transform-worker": "0.76.8", - "mime-types": "^2.1.27", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "rimraf": "^3.0.2", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "throat": "^5.0.0", - "ws": "^7.5.1", - "yargs": "^17.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "metro-react-native-babel-preset": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz", - "integrity": "sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "metro-babel-transformer": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz", - "integrity": "sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.20.0", - "hermes-parser": "0.12.0", - "nullthrows": "^1.1.1" - } - }, - "metro-cache": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.76.8.tgz", - "integrity": "sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==", - "dev": true, - "peer": true, - "requires": { - "metro-core": "0.76.8", - "rimraf": "^3.0.2" - } - }, - "metro-cache-key": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.76.8.tgz", - "integrity": "sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==", - "dev": true, - "peer": true - }, - "metro-config": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.76.8.tgz", - "integrity": "sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==", - "dev": true, - "peer": true, - "requires": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "jest-validate": "^29.2.1", - "metro": "0.76.8", - "metro-cache": "0.76.8", - "metro-core": "0.76.8", - "metro-runtime": "0.76.8" - } - }, - "metro-core": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.76.8.tgz", - "integrity": "sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==", - "dev": true, - "peer": true, - "requires": { - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.76.8" - } - }, - "metro-file-map": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.76.8.tgz", - "integrity": "sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==", - "dev": true, - "peer": true, - "requires": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-regex-util": "^27.0.6", - "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", - "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "dependencies": { - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "peer": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@types/yargs": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", - "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", - "dev": true, - "peer": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true, - "peer": true - }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "metro-inspector-proxy": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.76.8.tgz", - "integrity": "sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==", - "dev": true, - "peer": true, - "requires": { - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "ws": "^7.5.1", - "yargs": "^17.6.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "metro-minify-terser": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.76.8.tgz", - "integrity": "sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==", - "dev": true, - "peer": true, - "requires": { - "terser": "^5.15.0" - } - }, - "metro-minify-uglify": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.76.8.tgz", - "integrity": "sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==", - "dev": true, - "peer": true, - "requires": { - "uglify-es": "^3.1.9" - } - }, - "metro-react-native-babel-preset": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.7.tgz", - "integrity": "sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw==", - "dev": true, - "requires": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - } - }, - "metro-react-native-babel-transformer": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.8.tgz", - "integrity": "sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.20.0", - "babel-preset-fbjs": "^3.4.0", - "hermes-parser": "0.12.0", - "metro-react-native-babel-preset": "0.76.8", - "nullthrows": "^1.1.1" - }, - "dependencies": { - "metro-react-native-babel-preset": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz", - "integrity": "sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - } - } - } - }, - "metro-resolver": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.76.8.tgz", - "integrity": "sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==", - "dev": true, - "peer": true - }, - "metro-runtime": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.8.tgz", - "integrity": "sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==", - "dev": true, - "peer": true, - "requires": { - "@babel/runtime": "^7.0.0", - "react-refresh": "^0.4.0" - } - }, - "metro-source-map": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.8.tgz", - "integrity": "sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==", - "dev": true, - "peer": true, - "requires": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.76.8", - "nullthrows": "^1.1.1", - "ob1": "0.76.8", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - } - } - }, - "metro-symbolicate": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz", - "integrity": "sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==", - "dev": true, - "peer": true, - "requires": { - "invariant": "^2.2.4", - "metro-source-map": "0.76.8", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "peer": true - } - } - }, - "metro-transform-plugins": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.76.8.tgz", - "integrity": "sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "nullthrows": "^1.1.1" - } - }, - "metro-transform-worker": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.76.8.tgz", - "integrity": "sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "babel-preset-fbjs": "^3.4.0", - "metro": "0.76.8", - "metro-babel-transformer": "0.76.8", - "metro-cache": "0.76.8", - "metro-cache-key": "0.76.8", - "metro-source-map": "0.76.8", - "metro-transform-plugins": "0.76.8", - "nullthrows": "^1.1.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "peer": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "peer": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "nocache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "dev": true, - "peer": true - }, - "node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true, - "peer": true - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^3.0.2" - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "peer": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-notifier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", - "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "dev": true, - "peer": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "ob1": { - "version": "0.76.8", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.8.tgz", - "integrity": "sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==", - "dev": true, - "peer": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "peer": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "peer": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, - "peer": true, - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "peer": true - } - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@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" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "peer": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "peer": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "peer": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "peer": true, - "requires": { - "asap": "~2.0.6" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", - "dev": true - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "~2.0.3" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "peer": true - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "peer": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-devtools-core": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", - "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", - "dev": true, - "peer": true, - "requires": { - "shell-quote": "^1.6.1", - "ws": "^7" - }, - "dependencies": { - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "react-native": { - "version": "0.72.6", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.6.tgz", - "integrity": "sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==", - "dev": true, - "peer": true, - "requires": { - "@jest/create-cache-key-function": "^29.2.1", - "@react-native-community/cli": "11.3.7", - "@react-native-community/cli-platform-android": "11.3.7", - "@react-native-community/cli-platform-ios": "11.3.7", - "@react-native/assets-registry": "^0.72.0", - "@react-native/codegen": "^0.72.7", - "@react-native/gradle-plugin": "^0.72.11", - "@react-native/js-polyfills": "^0.72.1", - "@react-native/normalize-colors": "^0.72.0", - "@react-native/virtualized-lists": "^0.72.8", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "base64-js": "^1.1.2", - "deprecated-react-native-prop-types": "4.1.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.5", - "invariant": "^2.2.4", - "jest-environment-node": "^29.2.1", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "0.76.8", - "metro-source-map": "0.76.8", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.3.0", - "react-devtools-core": "^4.27.2", - "react-refresh": "^0.4.0", - "react-shallow-renderer": "^16.15.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "stacktrace-parser": "^0.1.10", - "use-sync-external-store": "^1.0.0", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", - "yargs": "^17.6.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "peer": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@types/yargs": { - "version": "15.0.18", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", - "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", - "dev": true, - "peer": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "peer": true - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "peer": true - }, - "scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "dev": true, - "peer": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", - "dev": true - }, - "react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - } - }, - "react-test-renderer": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", - "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", - "dev": true, - "requires": { - "react-is": "^18.2.0", - "react-shallow-renderer": "^16.15.0", - "scheduler": "^0.23.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "dev": true, - "peer": true - }, - "recast": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", - "dev": true, - "peer": true, - "requires": { - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "peer": true - } - } - }, - "reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "peer": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "peer": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "peer": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "peer": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "peer": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "peer": true - } - } - }, - "serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "dev": true, - "peer": true - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "peer": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true - }, - "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "peer": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "peer": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "peer": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "peer": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "peer": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "peer": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "peer": true - }, - "sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dev": true, - "peer": true, - "requires": { - "rimraf": "~2.6.2" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "peer": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "peer": true - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true - }, - "ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "peer": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true, - "peer": true - } - } - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "peer": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "peer": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "dev": true, - "peer": true, - "requires": {} - }, - "utf-8-validate": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.3.tgz", - "integrity": "sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "peer": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "peer": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "peer": true - }, - "vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "peer": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "peer": true - }, - "whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", - "dev": true, - "peer": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "peer": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "requires": { - "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": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "peer": true - }, - "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "peer": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "peer": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "peer": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} From 6cae43217d8f3109325a0203cb1cf8a30845c7f2 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 28 Feb 2024 08:11:55 +0100 Subject: [PATCH 20/48] adding apm sub config module (#310) * adding apm sub config module - draft * nested apm config * added native integration * updated native android to latest version * Updated native ios to latest version * fixed bug in native implementation * remove package-lock file * Update CountlyReactNative.java * Update Countly.d.ts * changelog and deprecation * example config * remove package-lock --------- Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> --- .eslintrc.json | 1 + CHANGELOG.md | 14 +++- Countly.d.ts | 41 +++++++++- Countly.js | 4 +- CountlyConfig.js | 11 +++ Utils.js | 15 ++++ .../android/sdk/react/CountlyReactNative.java | 16 +++- example/CountlyRNExample/Configuration.tsx | 9 ++- ios/src/CountlyReactNative.m | 19 +++++ .../countly_config_apm.js | 75 +++++++++++++++++++ 10 files changed, 198 insertions(+), 7 deletions(-) create mode 100644 lib/configuration_interfaces/countly_config_apm.js diff --git a/.eslintrc.json b/.eslintrc.json index 45a8ae5f..841ebcc8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -46,6 +46,7 @@ "no-bitwise": "off", "no-mixed-operators": "off", "object-shorthand": "off", + "max-classes-per-file": "off", "block-spacing": [ "error", "always" diff --git a/CHANGELOG.md b/CHANGELOG.md index 252b88cb..755fe1e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,20 @@ ## X.X.X +* ! Minor breaking change ! Tracking of foreground and background time for APM is disabled by default + * Added 'disableAdditionalIntentRedirectionChecks' config method +* Added a new metric for detecting whether or not a device has a hinge for Android +* Added four new APM configuration options under the 'apm' interface of 'CountlyConfig': + * 'enableForegroundBackgroundTracking' for enabling automatic F/B time tracking + * 'enableAppStartTimeTracking' for enabling automatic app launch time tracking (Android only) + * 'enableManualAppLoadedTrigger' for enabling the manipulation of app load time finished timestamp + * 'setAppStartTimestampOverride' for enabling the manipulation of app load time starting timestamp + +Deprecated 'enableApm' config option. Use instead 'apm.enableAppStartTimeTracking'. (for iOS also 'enableForegroundBackgroundTracking' must be used) * Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. -* Underlying Android SDK version is 23.12.0 -* Underlying iOS SDK version to 23.12.0 +* Updated the underlying Android SDK version to 24.1.1 +* Updated the underlying iOS SDK version to 24.1.0 ## 23.12.0 * Added TS type declerations to the SDK diff --git a/Countly.d.ts b/Countly.d.ts index de007795..58ffb7fd 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -956,7 +956,7 @@ declare module "countly-sdk-react-native-bridge" { ): string | void; /** - * @deprecated in 23.02.0 : use 'countlyConfig.enableApm' instead of 'enableApm'. + * @deprecated in 23.02.0 : use 'countlyConfig.apm' interface instead of 'enableApm'. * * Enable APM features, which includes the recording of app start time. * Should be called before Countly init @@ -1043,6 +1043,38 @@ declare module "countly-sdk-react-native-bridge" { } declare module "countly-sdk-react-native-bridge/CountlyConfig" { + /** + * + * This class holds APM specific configurations to be used with + * CountlyConfig class and serves as an interface. + * + */ + class CountlyConfigApm { + /** + * Enables the tracking of app start time. (For iOS after this call you + * will have to call [enableManualAppLoadedTrigger]) + */ + enableAppStartTimeTracking(): CountlyConfigApm; + + /** + * Enables the automatic tracking of app foreground and background + * durations. + */ + enableForegroundBackgroundTracking(): CountlyConfigApm; + + /** + * Enables the usage of manual trigger [Countly.appLoadingFinished] to + * determine app start finish time. + */ + enableManualAppLoadedTrigger(): CountlyConfigApm; + + /** + * Gives you the ability to override the app start initial timestamp. + * [timestamp] is the timestamp (in milliseconds) + */ + setAppStartTimestampOverride(timestamp: number): CountlyConfigApm; + } + /** * * Config object for Countly Init @@ -1056,6 +1088,11 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { */ constructor(serverURL: string, appKey: string); + /** + * getter for CountlyConfigApm instance that is used to access CountlyConfigApm methods + */ + apm: CountlyConfigApm; + /** * Method to set the server url * @@ -1129,6 +1166,8 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { enableParameterTamperingProtection(tamperingProtectionSalt: string): CountlyConfig; /** + * @deprecated in 24.1.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. + * * Method to enable application performance monitoring which includes the recording of app start time. */ enableApm(): CountlyConfig; diff --git a/Countly.js b/Countly.js index 3b0ecab2..51f60401 100644 --- a/Countly.js +++ b/Countly.js @@ -2078,13 +2078,13 @@ Countly.recordNetworkTrace = function (networkTraceKey, responseCode, requestPay }; /** - * @deprecated in 23.02.0 : use 'countlyConfig.enableApm' instead of 'enableApm'. + * @deprecated in 23.02.0 : use 'countlyConfig.apm' interface instead of 'enableApm'. * * Enable APM features, which includes the recording of app start time. * Should be called before Countly init */ Countly.enableApm = function () { - L.w("enableApm, enableApm is deprecated, use countlyConfig.enableApm instead."); + L.w("enableApm, enableApm is deprecated, use countlyConfig.apm interface instead."); const args = []; CountlyReactNative.enableApm(args); }; diff --git a/CountlyConfig.js b/CountlyConfig.js index e2a9e8cd..2214b19b 100644 --- a/CountlyConfig.js +++ b/CountlyConfig.js @@ -1,4 +1,5 @@ import { initialize } from "./Logger.js"; +import CountlyConfigApm from "./lib/configuration_interfaces/countly_config_apm.js"; /** * Countly SDK React Native Bridge * https://github.com/Countly/countly-sdk-react-native-bridge @@ -16,6 +17,14 @@ class CountlyConfig { constructor(serverURL, appKey) { this.serverURL = serverURL; this.appKey = appKey; + this._countlyConfigApmInstance = new CountlyConfigApm(); + } + + /** + * Getter to get the APM specific configurations + */ + get apm() { + return this._countlyConfigApmInstance; } /** @@ -122,6 +131,8 @@ class CountlyConfig { } /** + * @deprecated in 24.1.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. + * * Method to enable application performance monitoring which includes the recording of app start time. */ enableApm() { diff --git a/Utils.js b/Utils.js index 0d9621e2..60c27e7b 100644 --- a/Utils.js +++ b/Utils.js @@ -77,9 +77,24 @@ function configToJson(config) { if (config.tamperingProtectionSalt) { json.tamperingProtectionSalt = config.tamperingProtectionSalt; } + // APM ------------------------------------------------ + if (config.apm.enableForegroundBackground) { + json.enableForegroundBackground = config.apm.enableForegroundBackground; + } + if (config.apm.enableManualAppLoaded) { + json.enableManualAppLoaded = config.apm.enableManualAppLoaded; + } + if (config.apm.startTSOverride) { + json.startTSOverride = config.apm.startTSOverride; + } + if (config.apm.trackAppStartTime) { + json.trackAppStartTime = config.apm.trackAppStartTime; + } + // Legacy APM if (config.enableApm) { json.enableApm = config.enableApm; } + // APM END -------------------------------------------- if (config.disableAdditionalIntentRedirectionChecks) { json['disableAdditionalIntentRedirectionChecks'] = config.disableAdditionalIntentRedirectionChecks; } diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 209503a2..94758a75 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -130,7 +130,6 @@ public class CountlyReactNative extends ReactContextBaseJavaModule implements Li public CountlyReactNative(ReactApplicationContext reactContext) { super(reactContext); _reactContext = reactContext; - config.enableManualAppLoadedTrigger(); reactContext.addLifecycleEventListener(this); } @@ -217,9 +216,24 @@ private void populateConfig(JSONObject _config) { if (_config.has("starRatingTextDismiss")) { config.setStarRatingTextDismiss(_config.getString("starRatingTextDismiss")); } + // APM ------------------------------------------------ + if (_config.has("enableForegroundBackground")) { + config.apm.enableForegroundBackgroundTracking(); + } + if (_config.has("enableManualAppLoaded")) { + config.apm.enableManualAppLoadedTrigger(); + } + if (_config.has("startTSOverride")) { + config.apm.setAppStartTimestampOverride(_config.getLong("startTSOverride")); + } + if (_config.has("trackAppStartTime")) { + config.apm.enableAppStartTimeTracking(); + } + // Legacy APM if (_config.has("enableApm")) { config.setRecordAppStartTime(_config.getBoolean("enableApm")); } + // APM END -------------------------------------------- if (_config.has("crashReporting")) { config.enableCrashReporting(); } diff --git a/example/CountlyRNExample/Configuration.tsx b/example/CountlyRNExample/Configuration.tsx index 11c2062e..b6ba1e64 100644 --- a/example/CountlyRNExample/Configuration.tsx +++ b/example/CountlyRNExample/Configuration.tsx @@ -17,10 +17,17 @@ const countlyConfig = new CountlyConfig(COUNTLY_SERVER_KEY, COUNTLY_APP_KEY).set // .enableParameterTamperingProtection('salt') // Set the optional salt to be used for calculating the checksum of requested data which will be sent with each request // .pinnedCertificates("count.ly.cer") // It will ensure that connection is made with one of the public keys specified // .setHttpPostForced(false) // Set to "true" if you want HTTP POST to be used for all requests -// .enableApm() // Enable APM features, which includes the recording of app start time. // .pushTokenType(Countly.messagingMode.DEVELOPMENT, 'ChannelName', 'ChannelDescription') // Set messaging mode for push notifications // .configureIntentRedirectionCheck(['MainActivity'], ['com.countly.demo']) // .setStarRatingDialogTexts('Title', 'Message', 'Dismiss') // .recordDirectAttribution('countly', campaignData) // .recordIndirectAttribution(attributionValues) + +// APM configuration ======================================== +// countlyConfig.apm +// .enableAppStartTimeTracking() +// .enableForegroundBackgroundTracking() +// .enableManualAppLoadedTrigger() +// .setAppStartTimestampOverride(11223344); + export default countlyConfig; diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 2a54d1f0..6203a916 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -148,9 +148,28 @@ - (void) populateConfig:(id) json { config.starRatingMessage = json[@"starRatingTextMessage"]; } + // APM ------------------------------------------------ + NSNumber *enableForegroundBackground = json[@"enableForegroundBackground"]; + if (enableForegroundBackground) { + config.apm.enableForegroundBackgroundTracking = [enableForegroundBackground boolValue]; + } + NSNumber *enableManualAppLoaded = json[@"enableManualAppLoaded"]; + if (enableManualAppLoaded) { + config.apm.enableManualAppLoadedTrigger = [enableManualAppLoaded boolValue]; + } + NSNumber *trackAppStartTime = json[@"trackAppStartTime"]; + if (trackAppStartTime) { + config.apm.enableAppStartTimeTracking = [trackAppStartTime boolValue]; + } + NSNumber *startTSOverride = json[@"startTSOverride"]; + if (startTSOverride) { + [config.apm setAppStartTimestampOverride:[startTSOverride longLongValue]]; + } + // Legacy APM if (json[@"enableApm"]) { config.enablePerformanceMonitoring = YES; } + // APM END -------------------------------------------- if (json[@"crashReporting"]) { [self addCountlyFeature:CLYCrashReporting]; diff --git a/lib/configuration_interfaces/countly_config_apm.js b/lib/configuration_interfaces/countly_config_apm.js new file mode 100644 index 00000000..25469dbc --- /dev/null +++ b/lib/configuration_interfaces/countly_config_apm.js @@ -0,0 +1,75 @@ +/** + * Countly SDK React Native Bridge APM Configuration + * https://github.com/Countly/countly-sdk-react-native-bridge + * @Countly + */ + +/** + * + * This class holds APM specific configurations to be used with CountlyConfig + * class and serves as an interface. + */ +class CountlyConfigApm { + constructor() { + this._enableForegroundBackground = false; + this._enableManualAppLoaded = false; + this._startTSOverride = 0; + this._trackAppStartTime = false; + } + + get enableForegroundBackground() { + return this._enableForegroundBackground; + } + + get enableManualAppLoaded() { + return this._enableManualAppLoaded; + } + + get startTSOverride() { + return this._startTSOverride; + } + + get trackAppStartTime() { + return this._trackAppStartTime; + } + + /** + * Enables the tracking of app start time. (For iOS after this call you + * will have to call [enableManualAppLoadedTrigger]) + */ + enableAppStartTimeTracking() { + this._trackAppStartTime = true; + return this; + } + + /** + * Enables the automatic tracking of app foreground and background + * durations. + */ + enableForegroundBackgroundTracking() { + this._enableForegroundBackground = true; + return this; + } + + /** + * Enables the usage of manual trigger [Countly.appLoadingFinished] to + * determine app start finish time. + */ + enableManualAppLoadedTrigger() { + this._enableManualAppLoaded = true; + return this; + } + + /** + * Gives you the ability to override the app start initial timestamp. + * [timestamp] is the timestamp (in milliseconds) + */ + setAppStartTimestampOverride(timestamp) { + if (timestamp > 0) { + this._startTSOverride = timestamp; + } + return this; + } +} + +export default CountlyConfigApm; From 00138aed74dd1b6bcb9c5b0d6b6ea539fd751bf9 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:26:42 +0100 Subject: [PATCH 21/48] Proof of concept for RN Tests (#314) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Proof of concept for RN Tests * fixed file and updated test * remove example tests * jest config * removed utilscrash * crash related things back * adding comments to test * undo dot notation * added more test concepts and better comments --------- Co-authored-by: Artūrs Kadiķis Co-authored-by: turtledreams <62231246+turtledreams@users.noreply.github.com> --- .eslintrc.json | 8 ++++++ .gitignore | 3 ++- Utils.js | 4 +-- __tests__/utils.test.js | 57 +++++++++++++++++++++++++++++++++++++++++ babel.config.js | 3 +++ jest.config.js | 21 +++++++++++++++ package.json | 12 +++++---- 7 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 __tests__/utils.test.js create mode 100644 babel.config.js create mode 100644 jest.config.js diff --git a/.eslintrc.json b/.eslintrc.json index 841ebcc8..aa574bd9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,6 +15,14 @@ "sourceType": "module", "project": ["**/tsconfig.json"] }, + "overrides": [ + { + "files": ["__tests__/**/*"], + "env": { + "jest": true + } + } + ], "parser": "@typescript-eslint/parser", "plugins": ["react", "react-native", "@typescript-eslint"], "root": true, diff --git a/.gitignore b/.gitignore index ab9a2268..5cf2d35d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ android/.settings/org.eclipse.buildship.core.prefs android/.classpath countly-sdk-react-native-bridge-*.tgz example/AwesomeProject -package-lock.json \ No newline at end of file +coverage/ +package-lock.json diff --git a/Utils.js b/Utils.js index 60c27e7b..ed170671 100644 --- a/Utils.js +++ b/Utils.js @@ -1,5 +1,5 @@ -import parseErrorStackLib from "../react-native/Libraries/Core/Devtools/parseErrorStack.js"; import * as L from "./Logger.js"; +import parseErrorStackLib from "react-native/Libraries/Core/Devtools/parseErrorStack.js"; const DeviceIdType = { DEVELOPER_SUPPLIED: "DEVELOPER_SUPPLIED", @@ -96,7 +96,7 @@ function configToJson(config) { } // APM END -------------------------------------------- if (config.disableAdditionalIntentRedirectionChecks) { - json['disableAdditionalIntentRedirectionChecks'] = config.disableAdditionalIntentRedirectionChecks; + json["disableAdditionalIntentRedirectionChecks"] = config.disableAdditionalIntentRedirectionChecks; } const pushNotification = {}; if (config.tokenType) { diff --git a/__tests__/utils.test.js b/__tests__/utils.test.js new file mode 100644 index 00000000..c2702090 --- /dev/null +++ b/__tests__/utils.test.js @@ -0,0 +1,57 @@ +const { stringToDeviceIDType, DeviceIdType } = require("../Utils.js"); + +// 'stringToDeviceIDType' +// 'SG' is provided as input +// The function should return DeviceIdType.SDK_GENERATED +test("'SG' maps to DeviceIdType.SDK_GENERATED", () => { + expect(stringToDeviceIDType("SG")).toBe(DeviceIdType.SDK_GENERATED); +}); + +// 'stringToDeviceIDType' +// 'DS' is provided as input +// The function should return DeviceIdType.DEVELOPER_SUPPLIED +test("'DS' maps to DeviceIdType.DEVELOPER_SUPPLIED", () => { + expect(stringToDeviceIDType("DS")).toBe(DeviceIdType.DEVELOPER_SUPPLIED); +}); + +// 'stringToDeviceIDType' +// 'TID' is provided as input +// The function should return DeviceIdType.TEMPORARY_ID +test("'TID' maps to DeviceIdType.TEMPORARY_ID", () => { + expect(stringToDeviceIDType("TID")).toBe(DeviceIdType.TEMPORARY_ID); +}); + +// 'stringToDeviceIDType' +// An empty string is provided as input +// The function should return 'null', indicating an invalid input +test("Invalid input results in 'null'", () => { + expect(stringToDeviceIDType("")).toBe(null); +}); + +// 'stringToDeviceIDType' +// An 'null' is provided as input +// The function should return 'null', indicating an invalid input +test("'null' input results in 'null'", () => { + expect(stringToDeviceIDType(null)).toBe(null); +}); + +// 'stringToDeviceIDType' +// An 'dsaifedos' is provided as input +// The function should return 'null', indicating an invalid input +test("'dsaifedos' input results in 'null'", () => { + expect(stringToDeviceIDType("dsaifedos")).toBe(null); +}); + +// 'stringToDeviceIDType' +// An 0 is provided as input +// The function should return 'null', indicating an invalid input +test("0 input results in 'null'", () => { + expect(stringToDeviceIDType(0)).toBe(null); +}); + +// 'stringToDeviceIDType' +// An 'undefined' is provided as input +// The function should return 'null', indicating an invalid input +test("'undefined' input results in 'null'", () => { + expect(stringToDeviceIDType(undefined)).toBe(null); +}); diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..d88277db --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["module:metro-react-native-babel-preset"], +}; \ No newline at end of file diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..8f8cf5d9 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,21 @@ +module.exports = { + globals: { + __DEV__: true + }, + displayName: { + name: "Countly React Native SDK Tests", + color: "blue", + }, + collectCoverage: true, + collectCoverageFrom: [ + "**/*.{js,jsx}", + "!**/node_modules/**", + "!**/vendor/**", + "!**/example/**", + ], + testPathIgnorePatterns: ["/node_modules/", "AwesomeProject"], + transformIgnorePatterns: [ + "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg)" + ], + preset: "react-native", +}; \ No newline at end of file diff --git a/package.json b/package.json index fa5fef64..5d2765cb 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "bugs": { "url": "https://github.com/Countly/countly-sdk-react-native-bridge/issues" }, - "scripts": {}, + "scripts": { + "test": "jest" + }, "deprecated": false, "description": "Countly is an innovative, real-time, open source mobile analytics and push notifications platform.", "homepage": "https://github.com/Countly/countly-sdk-react-native-bridge", @@ -21,8 +23,8 @@ "url": "git+https://github.com/Countly/countly-sdk-react-native-bridge.git" }, "devDependencies": { - "@babel/core": "7.23.3", - "@babel/preset-env": "7.23.3", + "@babel/core": "^7.23.3", + "@babel/preset-env": "^7.23.9", "@babel/runtime": "7.23.2", "@react-native-community/eslint-config": "3.2.0", "@swc/core": "1.3.96", @@ -34,7 +36,7 @@ "@types/react-test-renderer": "18.0.6", "@typescript-eslint/eslint-plugin": "6.10.0", "@typescript-eslint/parser": "6.10.0", - "babel-jest": "29.7.0", + "babel-jest": "^29.7.0", "bufferutil": "4.0.8", "encoding": "0.1.13", "eslint": "8.53.0", @@ -58,4 +60,4 @@ "typescript": "5.2.2", "utf-8-validate": "6.0.3" } -} \ No newline at end of file +} From 0d7bc3463acadbd78c9c77ad0657e038d70f90a5 Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Wed, 6 Mar 2024 10:58:07 +0100 Subject: [PATCH 22/48] added event module --- Countly.d.ts | 40 +++++++++++ Countly.js | 4 +- Event.js | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 Event.js diff --git a/Countly.d.ts b/Countly.d.ts index 58ffb7fd..ddb5633b 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -126,6 +126,46 @@ declare module "countly-sdk-react-native-bridge" { export function reportFeedbackWidgetManually(widgetInfo: FeedbackWidget, widgetData: object, widgetResult: RatingWidgetResult | object): Promise; } + /** + * Countly Event Module + */ + namespace event { + /** + * Used to send various types of event; + * + * @param {CountlyEventOptions} options event + * @return {string | void} error message or void + */ + export function sendEvent(options: CountlyEventOptions): string | void; + + /** + * + * Start Event + * + * @param {string} eventName name of event + * @return {string | void} error message or void + */ + export function startEvent(eventName: string): string | void; + + /** + * + * Cancel Event + * + * @param {string} eventName name of event + * @return {string | void} error message or void + */ + export function cancelEvent(eventName: string): string | void; + + /** + * + * End Event + * + * @param {string | CountlyEventOptions} options event options + * @return {string | void} error message or void + */ + export function endEvent(options: string | CountlyEventOptions): string | void; + } + /** * Initialize Countly * diff --git a/Countly.js b/Countly.js index 51f60401..41942fd2 100644 --- a/Countly.js +++ b/Countly.js @@ -127,7 +127,7 @@ Countly.hasBeenCalledOnStart = function () { * * Used to send various types of event; * - * @param {object} options event + * @param {CountlyEventOptions} options event * @return {string | void} error message or void */ Countly.sendEvent = function (options) { @@ -790,7 +790,7 @@ Countly.cancelEvent = function (eventName) { * * End Event * - * @param {string | object} options event options + * @param {string | CountlyEventOptions} options event options * @return {string | void} error message or void */ Countly.endEvent = function (options) { diff --git a/Event.js b/Event.js new file mode 100644 index 00000000..716790c6 --- /dev/null +++ b/Event.js @@ -0,0 +1,186 @@ +import * as L from "./Logger.js"; +import * as Validate from "./Validators.js"; + +class Event { + #state; + + constructor(state) { + this.#state = state; + } + + /** + * Used to send various types of event; + * + * @param {CountlyEventOptions} options event + * @return {string | void} error message or void + */ + sendEvent(options) { + if (!this.#state.isInitialized) { + const message = "'init' must be called before 'sendEvent'"; + L.e(`sendEvent, ${message}`); + return message; + } + if (!options) { + const message = "sendEvent, no event object provided"; + L.e(`sendEvent, ${message}`); + return message; + } + if (!options.eventName) { + const message = "sendEvent, eventName is required"; + L.e(`sendEvent, ${message}`); + return message; + } + L.d(`sendEvent, Sending event: ${JSON.stringify(options)}]`); + + const args = []; + let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment + let segments = {}; + + if (options.eventSum) { + eventType = "eventWithSum"; + } + if (options.segments) { + eventType = "eventWithSegment"; + } + if (options.segments && options.eventSum) { + eventType = "eventWithSumSegment"; + } + + args.push(eventType); + args.push(options.eventName.toString()); + + if (options.eventCount) { + args.push(options.eventCount.toString()); + } else { + args.push("1"); + } + + if (options.eventSum) { + options.eventSum = options.eventSum.toString(); + if (options.eventSum.indexOf(".") === -1) { + options.eventSum = parseFloat(options.eventSum).toFixed(2); + args.push(options.eventSum); + } else { + args.push(options.eventSum); + } + } + + if (options.segments) { + segments = options.segments; + } + for (const event in segments) { + args.push(event); + args.push(segments[event]); + } + this.#state.this.#state.CountlyReactNative.event(args); + } + + /** + * + * Start Event + * + * @param {string} eventName name of event + * @return {string | void} error message or void + */ + startEvent(eventName) { + if (!this.#state.isInitialized) { + const msg = "'init' must be called before 'startEvent'"; + L.e(`startEvent, ${msg}`); + return msg; + } + const message = Validate.String(eventName, "eventName", "startEvent"); + if (message) { + return message; + } + L.d(`startEvent, Starting event: [${eventName}]`); + this.#state.CountlyReactNative.startEvent([eventName.toString()]); + } + + /** + * + * Cancel Event + * + * @param {string} eventName name of event + * @return {string | void} error message or void + */ + cancelEvent(eventName) { + if (!this.#state.isInitialized) { + const msg = "'init' must be called before 'cancelEvent'"; + L.e(`cancelEvent, ${msg}`); + return msg; + } + const message = Validate.String(eventName, "eventName", "cancelEvent"); + if (message) { + return message; + } + L.d(`cancelEvent, Canceling event: [${eventName}]`); + this.#state.CountlyReactNative.cancelEvent([eventName.toString()]); + } + + /** + * + * End Event + * + * @param {string | CountlyEventOptions} options event options + * @return {string | void} error message or void + */ + endEvent(options) { + if (!this.#state.isInitialized) { + const message = "'init' must be called before 'endEvent'"; + L.e(`endEvent, ${message}`); + return message; + } + L.d(`endEvent, Ending event: [${JSON.stringify(options)}]`); + if (typeof options === "string") { + options = { eventName: options }; + } + const args = []; + let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment + let segments = {}; + + if (options.eventSum) { + eventType = "eventWithSum"; + } + if (options.segments) { + eventType = "eventWithSegment"; + } + if (options.segments && options.eventSum) { + eventType = "eventWithSumSegment"; + } + + args.push(eventType); + + if (!options.eventName) { + options.eventName = ""; + } + args.push(options.eventName.toString()); + + if (!options.eventCount) { + options.eventCount = "1"; + } + args.push(options.eventCount.toString()); + + if (options.eventSum) { + let eventSumTemp = options.eventSum.toString(); + if (eventSumTemp.indexOf(".") === -1) { + eventSumTemp = parseFloat(eventSumTemp).toFixed(2); + args.push(eventSumTemp); + } else { + args.push(eventSumTemp); + } + } else { + args.push("0.0"); + } + + if (options.segments) { + segments = options.segments; + } + for (const event in segments) { + args.push(event); + args.push(segments[event]); + } + this.#state.CountlyReactNative.endEvent(args); + } +} + +export default Event; From 023a5080f39ae27a33c1a9cc274a79054afde15b Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Wed, 6 Mar 2024 17:50:48 +0100 Subject: [PATCH 23/48] requested changes --- Countly.d.ts | 20 ++++++++++++++++---- Countly.js | 18 ++++++++++++++++-- Event.js | 20 ++++++++++++++++---- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index ddb5633b..79a2ab04 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -129,14 +129,20 @@ declare module "countly-sdk-react-native-bridge" { /** * Countly Event Module */ - namespace event { + namespace events { /** * Used to send various types of event; * - * @param {CountlyEventOptions} options event + * @param {string | CountlyEventOptions} options event options. + * CountlyEventOptions { + * eventName: string; + * eventCount?: number; + * eventSum?: number | string; + * segments?: Segmentation; + * } * @return {string | void} error message or void */ - export function sendEvent(options: CountlyEventOptions): string | void; + export function recordEvent(options: CountlyEventOptions): string | void; /** * @@ -160,7 +166,13 @@ declare module "countly-sdk-react-native-bridge" { * * End Event * - * @param {string | CountlyEventOptions} options event options + * @param {string | CountlyEventOptions} options event options. + * CountlyEventOptions { + * eventName: string; + * eventCount?: number; + * eventSum?: number | string; + * segments?: Segmentation; + * } * @return {string | void} error message or void */ export function endEvent(options: string | CountlyEventOptions): string | void; diff --git a/Countly.js b/Countly.js index 41942fd2..49bfd227 100644 --- a/Countly.js +++ b/Countly.js @@ -9,6 +9,7 @@ import { Platform, NativeModules, NativeEventEmitter } from "react-native"; import CountlyConfig from "./CountlyConfig.js"; import CountlyState from "./CountlyState.js"; import Feedback from "./Feedback.js"; +import Event from "./Event.js"; import * as L from "./Logger.js"; import * as Utils from "./Utils.js"; import * as Validate from "./Validators.js"; @@ -24,6 +25,7 @@ CountlyState.CountlyReactNative = CountlyReactNative; CountlyState.eventEmitter = eventEmitter; Countly.feedback = new Feedback(CountlyState); +Countly.events = new Event(CountlyState); let _isCrashReportingEnabled = false; @@ -127,7 +129,13 @@ Countly.hasBeenCalledOnStart = function () { * * Used to send various types of event; * - * @param {CountlyEventOptions} options event + * @param {CountlyEventOptions} options event options. + * CountlyEventOptions { + * eventName: string; + * eventCount?: number; + * eventSum?: number | string; + * segments?: Segmentation; + * } * @return {string | void} error message or void */ Countly.sendEvent = function (options) { @@ -790,7 +798,13 @@ Countly.cancelEvent = function (eventName) { * * End Event * - * @param {string | CountlyEventOptions} options event options + * @param {string | CountlyEventOptions} options event options. + * CountlyEventOptions { + * eventName: string; + * eventCount?: number; + * eventSum?: number | string; + * segments?: Segmentation; + * } * @return {string | void} error message or void */ Countly.endEvent = function (options) { diff --git a/Event.js b/Event.js index 716790c6..67df0bfb 100644 --- a/Event.js +++ b/Event.js @@ -11,10 +11,16 @@ class Event { /** * Used to send various types of event; * - * @param {CountlyEventOptions} options event + * @param {string | CountlyEventOptions} options event options. + * CountlyEventOptions { + * eventName: string; + * eventCount?: number; + * eventSum?: number | string; + * segments?: Segmentation; + * } * @return {string | void} error message or void */ - sendEvent(options) { + recordEvent(options) { if (!this.#state.isInitialized) { const message = "'init' must be called before 'sendEvent'"; L.e(`sendEvent, ${message}`); @@ -72,7 +78,7 @@ class Event { args.push(event); args.push(segments[event]); } - this.#state.this.#state.CountlyReactNative.event(args); + this.#state.CountlyReactNative.event(args); } /** @@ -121,7 +127,13 @@ class Event { * * End Event * - * @param {string | CountlyEventOptions} options event options + * @param {string | CountlyEventOptions} options event options. + * CountlyEventOptions { + * eventName: string; + * eventCount?: number; + * eventSum?: number | string; + * segments?: Segmentation; + * } * @return {string | void} error message or void */ endEvent(options) { From 47cf7826a5def45c6134a14f9b95f18bb1ff79eb Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Thu, 7 Mar 2024 14:50:31 +0100 Subject: [PATCH 24/48] added legacy methods --- Countly.d.ts | 26 ++-- Countly.js | 4 +- Event.js | 111 ++++++++---------- .../android/sdk/react/CountlyReactNative.java | 89 +++++++++++++- ios/src/CountlyReactNative.m | 106 ++++++++++++++++- 5 files changed, 251 insertions(+), 85 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index 79a2ab04..137fa0d2 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -133,16 +133,13 @@ declare module "countly-sdk-react-native-bridge" { /** * Used to send various types of event; * - * @param {string | CountlyEventOptions} options event options. - * CountlyEventOptions { - * eventName: string; - * eventCount?: number; - * eventSum?: number | string; - * segments?: Segmentation; - * } + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. + * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ - export function recordEvent(options: CountlyEventOptions): string | void; + export function recordEvent(eventName: string, eventCount?: number, eventSum?: number, segments?: Segmentation): string | void; /** * @@ -166,16 +163,13 @@ declare module "countly-sdk-react-native-bridge" { * * End Event * - * @param {string | CountlyEventOptions} options event options. - * CountlyEventOptions { - * eventName: string; - * eventCount?: number; - * eventSum?: number | string; - * segments?: Segmentation; - * } + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. + * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ - export function endEvent(options: string | CountlyEventOptions): string | void; + export function endEvent(eventName: string, eventCount?: number, eventSum?: number, segments?: Segmentation): string | void; } /** diff --git a/Countly.js b/Countly.js index 49bfd227..7b7a8142 100644 --- a/Countly.js +++ b/Countly.js @@ -196,7 +196,7 @@ Countly.sendEvent = function (options) { args.push(event); args.push(segments[event]); } - CountlyReactNative.event(args); + CountlyReactNative.eventLegacy(args); }; /** @@ -862,7 +862,7 @@ Countly.endEvent = function (options) { args.push(event); args.push(segments[event]); } - CountlyReactNative.endEvent(args); + CountlyReactNative.endEventLegacy(args); }; /** diff --git a/Event.js b/Event.js index 67df0bfb..1fa73cd1 100644 --- a/Event.js +++ b/Event.js @@ -11,69 +11,57 @@ class Event { /** * Used to send various types of event; * - * @param {string | CountlyEventOptions} options event options. - * CountlyEventOptions { - * eventName: string; - * eventCount?: number; - * eventSum?: number | string; - * segments?: Segmentation; - * } + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. + * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ - recordEvent(options) { + recordEvent(eventName, eventCount, eventSum, segments) { if (!this.#state.isInitialized) { - const message = "'init' must be called before 'sendEvent'"; - L.e(`sendEvent, ${message}`); + const message = "'init' must be called before 'recordEvent'"; + L.e(`recordEvent, ${message}`); return message; } - if (!options) { - const message = "sendEvent, no event object provided"; - L.e(`sendEvent, ${message}`); + if (!eventName) { + const message = "recordEvent, eventName is required"; + L.e(`recordEvent, ${message}`); return message; } - if (!options.eventName) { - const message = "sendEvent, eventName is required"; - L.e(`sendEvent, ${message}`); - return message; - } - L.d(`sendEvent, Sending event: ${JSON.stringify(options)}]`); + L.d(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); const args = []; let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment - let segments = {}; - if (options.eventSum) { + if (eventSum) { eventType = "eventWithSum"; } - if (options.segments) { + if (segments) { eventType = "eventWithSegment"; } - if (options.segments && options.eventSum) { + if (segments && eventSum) { eventType = "eventWithSumSegment"; } args.push(eventType); - args.push(options.eventName.toString()); + args.push(eventName); - if (options.eventCount) { - args.push(options.eventCount.toString()); + if (eventCount) { + args.push(eventCount); } else { - args.push("1"); + args.push(1); } - if (options.eventSum) { - options.eventSum = options.eventSum.toString(); - if (options.eventSum.indexOf(".") === -1) { - options.eventSum = parseFloat(options.eventSum).toFixed(2); - args.push(options.eventSum); + if (eventSum) { + let eventSumTemp = eventSum.toString(); + if (eventSumTemp.indexOf(".") === -1) { + eventSumTemp = parseFloat(eventSumTemp).toFixed(2); + args.push(eventSumTemp); } else { - args.push(options.eventSum); + args.push(eventSum); } } - if (options.segments) { - segments = options.segments; - } for (const event in segments) { args.push(event); args.push(segments[event]); @@ -127,66 +115,63 @@ class Event { * * End Event * - * @param {string | CountlyEventOptions} options event options. - * CountlyEventOptions { - * eventName: string; - * eventCount?: number; - * eventSum?: number | string; - * segments?: Segmentation; - * } + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. + * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ - endEvent(options) { + endEvent(eventName, eventCount, eventSum, segments) { if (!this.#state.isInitialized) { const message = "'init' must be called before 'endEvent'"; L.e(`endEvent, ${message}`); return message; } - L.d(`endEvent, Ending event: [${JSON.stringify(options)}]`); - if (typeof options === "string") { - options = { eventName: options }; + L.d(`endEvent, Ending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); + + if (!eventName) { + const message = "endEvent, eventName is required"; + L.e(`endEvent, ${message}`); + return message; } + const args = []; let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment - let segments = {}; - if (options.eventSum) { + if (eventSum) { eventType = "eventWithSum"; } - if (options.segments) { + if (segments) { eventType = "eventWithSegment"; } - if (options.segments && options.eventSum) { + if (segments && eventSum) { eventType = "eventWithSumSegment"; } args.push(eventType); - if (!options.eventName) { - options.eventName = ""; + if (!eventName) { + eventName = ""; } - args.push(options.eventName.toString()); + args.push(eventName); - if (!options.eventCount) { - options.eventCount = "1"; + if (!eventCount) { + eventCount = 1; } - args.push(options.eventCount.toString()); + args.push(eventCount); - if (options.eventSum) { - let eventSumTemp = options.eventSum.toString(); + if (eventSum) { + let eventSumTemp = eventSum.toString(); if (eventSumTemp.indexOf(".") === -1) { eventSumTemp = parseFloat(eventSumTemp).toFixed(2); args.push(eventSumTemp); } else { - args.push(eventSumTemp); + args.push(eventSum); } } else { args.push("0.0"); } - if (options.segments) { - segments = options.segments; - } for (const event in segments) { args.push(event); args.push(segments[event]); diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 94758a75..5809df47 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -707,7 +707,7 @@ public void setCustomCrashSegments(ReadableArray args) { } @ReactMethod - public void event(ReadableArray args) { + public void eventLegacy(ReadableArray args) { String eventType = args.getString(0); switch (eventType) { case "event": { @@ -749,6 +749,49 @@ public void event(ReadableArray args) { } } + @ReactMethod + public void event(ReadableArray args) { + String eventType = args.getString(0); + switch (eventType) { + case "event": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + Countly.sharedInstance().events().recordEvent(eventName, eventCount); + break; + } + case "eventWithSum": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + double eventSum = args.getDouble(3); + Countly.sharedInstance().events().recordEvent(eventName, eventCount, eventSum); + break; + } + case "eventWithSegment": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + HashMap segmentation = new HashMap<>(); + for (int i = 3, il = args.size(); i < il; i += 2) { + segmentation.put(args.getString(i), args.getString(i + 1)); + } + Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount); + break; + } + case "eventWithSumSegment": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + double eventSum = args.getDouble(3); + HashMap segmentation = new HashMap<>(); + for (int i = 4, il = args.size(); i < il; i += 2) { + segmentation.put(args.getString(i), args.getString(i + 1)); + } + Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount, eventSum); + break; + } + default: + break; + } + } + @ReactMethod public void startEvent(ReadableArray args) { String startEvent = args.getString(0); @@ -762,7 +805,7 @@ public void cancelEvent(ReadableArray args) { } @ReactMethod - public void endEvent(ReadableArray args) { + public void endEventLegacy(ReadableArray args) { String eventType = args.getString(0); switch (eventType) { case "event": { @@ -803,6 +846,48 @@ public void endEvent(ReadableArray args) { } } + @ReactMethod + public void endEvent(ReadableArray args) { + String eventType = args.getString(0); + switch (eventType) { + case "event": { + String eventName = args.getString(1); + Countly.sharedInstance().events().endEvent(eventName); + break; + } + case "eventWithSum": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + double eventSum = args.getDouble(3); + Countly.sharedInstance().events().endEvent(eventName, null, eventCount, eventSum); + break; + } + case "eventWithSegment": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + HashMap segmentation = new HashMap<>(); + for (int i = 4, il = args.size(); i < il; i += 2) { + segmentation.put(args.getString(i), args.getString(i + 1)); + } + Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, 0); + break; + } + case "eventWithSumSegment": { + String eventName = args.getString(1); + int eventCount = args.getInt(2); + double eventSum = args.getDouble(3); + HashMap segmentation = new HashMap<>(); + for (int i = 4, il = args.size(); i < il; i += 2) { + segmentation.put(args.getString(i), args.getString(i + 1)); + } + Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, eventSum); + break; + } + default: + break; + } + } + @ReactMethod public void recordView(ReadableArray args) { String viewName = args.getString(0); diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 6203a916..8b4e94b1 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -231,7 +231,7 @@ - (void) populateConfig:(id) json { } } -RCT_EXPORT_METHOD(event : (NSArray *)arguments) { +RCT_EXPORT_METHOD(eventLegacy : (NSArray *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *eventType = [arguments objectAtIndex:0]; if (eventType != nil && [eventType length] > 0) { @@ -274,6 +274,58 @@ - (void) populateConfig:(id) json { } }); } + +RCT_EXPORT_METHOD(event : (NSArray *)arguments) { + dispatch_async(dispatch_get_main_queue(), ^{ + NSString *eventType = [arguments objectAtIndex:0]; + if (eventType != nil && [eventType length] > 0) { + if ([eventType isEqual:@"event"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + [[Countly sharedInstance] recordEvent:eventName count:countInt]; + } else if ([eventType isEqual:@"eventWithSum"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + + NSNumber *sumNumber = [arguments objectAtIndex:3]; + float sumFloat = [sumNumber floatValue]; + + [[Countly sharedInstance] recordEvent:eventName count:countInt sum:sumFloat]; + } else if ([eventType isEqual:@"eventWithSegment"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + for (int i = 3, il = (int)arguments.count; i < il; i += 2) { + dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; + } + [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt]; + } else if ([eventType isEqual:@"eventWithSumSegment"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + + NSNumber *sumNumber = [arguments objectAtIndex:3]; + float sumFloat = [sumNumber floatValue]; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + + for (int i = 4, il = (int)arguments.count; i < il; i += 2) { + dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; + } + [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt sum:sumFloat]; + } + } + }); +} + RCT_EXPORT_METHOD(recordView : (NSArray *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *recordView = [arguments objectAtIndex:0]; @@ -480,7 +532,7 @@ + (void)log:(NSString *)theMessage { }); } -RCT_EXPORT_METHOD(endEvent : (NSArray *)arguments) { +RCT_EXPORT_METHOD(endEventLegacy : (NSArray *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *eventType = [arguments objectAtIndex:0]; @@ -530,6 +582,56 @@ + (void)log:(NSString *)theMessage { }); } +RCT_EXPORT_METHOD(endEvent : (NSArray *)arguments) { + dispatch_async(dispatch_get_main_queue(), ^{ + NSString *eventType = [arguments objectAtIndex:0]; + + if ([eventType isEqual:@"event"]) { + NSString *eventName = [arguments objectAtIndex:1]; + [Countly.sharedInstance endEvent:eventName]; + } else if ([eventType isEqual:@"eventWithSum"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + + NSNumber *sumNumber = [arguments objectAtIndex:3]; + float sumInt = [sumNumber floatValue]; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:sumInt]; + } else if ([eventType isEqual:@"eventWithSegment"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + for (int i = 4, il = (int)arguments.count; i < il; i += 2) { + dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; + } + + [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:0]; + } else if ([eventType isEqual:@"eventWithSumSegment"]) { + NSString *eventName = [arguments objectAtIndex:1]; + + NSNumber *countNumber = [arguments objectAtIndex:2]; + int countInt = [countNumber intValue]; + + NSNumber *sumNumber = [arguments objectAtIndex:3]; + float sumInt = [sumNumber floatValue]; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + for (int i = 4, il = (int)arguments.count; i < il; i += 2) { + dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; + } + + [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:sumInt]; + } else { + } + }); +} + RCT_EXPORT_METHOD(setLocationInit : (NSArray *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ if (config == nil) { From acc657a4b2c9d83d7c37803bfa5ebb53fb817671 Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Thu, 7 Mar 2024 15:05:34 +0100 Subject: [PATCH 25/48] updated example app to use new event interface --- example/CountlyRNExample/Events.tsx | 79 +++++------------------------ 1 file changed, 12 insertions(+), 67 deletions(-) diff --git a/example/CountlyRNExample/Events.tsx b/example/CountlyRNExample/Events.tsx index 305d4f96..9377a118 100644 --- a/example/CountlyRNExample/Events.tsx +++ b/example/CountlyRNExample/Events.tsx @@ -4,70 +4,30 @@ import { SafeAreaView } from "react-native-safe-area-context"; import Countly from "countly-sdk-react-native-bridge"; import CountlyButton from "./CountlyButton"; -interface Segmentation {} -interface SegmentationCustom_1 extends Segmentation { - Country: string; - Age: string; -} -interface EventProps { - eventName: string; - segments?: Segmentation; - eventCount?: number; - eventSum?: string; -} -interface EventPropsCustom_1 extends EventProps { - segments?: SegmentationCustom_1; -} - const basicEvent = () => { // example for basic event - const event = { eventName: "Basic Event", eventCount: 1 }; - Countly.sendEvent(event); + Countly.events.recordEvent("Basic Event", 1); }; const eventWithSum = () => { // example for event with sum - const event = { eventName: "Event With Sum", eventCount: 1, eventSum: "0.99" }; - Countly.sendEvent(event); + Countly.events.recordEvent("Event With Sum", 1, 0.99); }; const eventWithSegment = () => { // example for event with segment - let event: EventPropsCustom_1 = { - eventName: "Event With Segment", - eventCount: 1, - segments: { Country: "Turkey", Age: "28" }, - }; - event.segments = { Country: "Turkey", Age: "28" }; - Countly.sendEvent(event); - event = { - eventName: "Event With Segment", - eventCount: 1, - segments: { Country: "France", Age: "38" }, - }; - Countly.sendEvent(event); + Countly.events.recordEvent("Event With Segment", 1, undefined, { Country: "Turkey", Age: "28" }); + Countly.events.recordEvent("Event With Segment", 1, undefined, { Country: "France", Age: "38" }); }; const eventWithSumAndSegment = () => { // example for event with segment and sum - let event: EventPropsCustom_1 = { - eventName: "Event With Sum And Segment", - eventCount: 1, - eventSum: "0.99", - segments: { Country: "Turkey", Age: "28" }, - }; - Countly.sendEvent(event); - event = { - eventName: "Event With Sum And Segment", - eventCount: 3, - eventSum: "1.99", - segments: { Country: "France", Age: "38" }, - }; - Countly.sendEvent(event); + Countly.events.recordEvent("Event With Sum And Segment", 1, 0.99, { Country: "Turkey", Age: "28" }); + Countly.events.recordEvent("Event With Sum And Segment", 3, 1.99, { Country: "France", Age: "38" }); }; // TIMED EVENTS const startEvent = () => { - Countly.startEvent("timedEvent"); + Countly.events.startEvent("timedEvent"); setTimeout(() => { - Countly.endEvent("timedEvent"); + Countly.events.endEvent("timedEvent"); }, 1000); }; @@ -77,15 +37,10 @@ const startEvent = () => { */ const timedEventWithSum = () => { // Event with sum - Countly.startEvent("timedEventWithSum"); - - const event: EventProps = { - eventName: "timedEventWithSum", - eventSum: "0.99", - }; + Countly.events.startEvent("timedEventWithSum"); setTimeout(() => { - Countly.endEvent(event); + Countly.events.endEvent("timedEventWithSum", undefined, 0.99); }, 1000); }; @@ -93,12 +48,8 @@ const timedEventWithSegment = () => { // Event with segment Countly.startEvent("timedEventWithSegment"); - const event: EventPropsCustom_1 = { - eventName: "timedEventWithSegment", - segments: { Country: "Germany", Age: "32" }, - }; setTimeout(() => { - Countly.endEvent(event); + Countly.events.endEvent("timedEventWithSegment", undefined, undefined, { Country: "Germany", Age: "32" }); }, 1000); }; @@ -106,14 +57,8 @@ const timedEventWithSumAndSegment = () => { // Event with Segment, sum and count Countly.startEvent("timedEventWithSumAndSegment"); - const event: EventPropsCustom_1 = { - eventName: "timedEventWithSumAndSegment", - eventCount: 1, - eventSum: "0.99", - segments: { Country: "India", Age: "21" }, - }; setTimeout(() => { - Countly.endEvent(event); + Countly.events.endEvent("timedEventWithSumAndSegment", 1, 0.99, { Country: "India", Age: "21" }); }, 1000); }; // TIMED EVENTS From e87c491305276c3cf336138731084f1e83b0a11b Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Mon, 11 Mar 2024 14:48:12 +0100 Subject: [PATCH 26/48] switched to map --- Countly.d.ts | 12 +- Event.js | 89 +++++--------- .../android/sdk/react/CountlyReactNative.java | 114 ++++++------------ ios/src/CountlyReactNative.m | 111 ++++------------- 4 files changed, 94 insertions(+), 232 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index 137fa0d2..acea7f56 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -133,9 +133,9 @@ declare module "countly-sdk-react-native-bridge" { /** * Used to send various types of event; * - * @param {string} eventName event name. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ @@ -163,9 +163,9 @@ declare module "countly-sdk-react-native-bridge" { * * End Event * - * @param {string} eventName event name. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ diff --git a/Event.js b/Event.js index 1fa73cd1..56954a4d 100644 --- a/Event.js +++ b/Event.js @@ -11,9 +11,9 @@ class Event { /** * Used to send various types of event; * - * @param {string} eventName event name. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ @@ -30,41 +30,29 @@ class Event { } L.d(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); - const args = []; - let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment - - if (eventSum) { - eventType = "eventWithSum"; - } - if (segments) { - eventType = "eventWithSegment"; - } - if (segments && eventSum) { - eventType = "eventWithSumSegment"; - } - - args.push(eventType); - args.push(eventName); + const args = {}; + args.n = eventName; if (eventCount) { - args.push(eventCount); + args.c = eventCount; } else { - args.push(1); + args.c = 1; } if (eventSum) { let eventSumTemp = eventSum.toString(); if (eventSumTemp.indexOf(".") === -1) { eventSumTemp = parseFloat(eventSumTemp).toFixed(2); - args.push(eventSumTemp); + args.s = eventSumTemp; } else { - args.push(eventSum); + args.s = eventSum; } } + args.g = []; for (const event in segments) { - args.push(event); - args.push(segments[event]); + args.g.push(event); + args.g.push(segments[event]); } this.#state.CountlyReactNative.event(args); } @@ -115,9 +103,9 @@ class Event { * * End Event * - * @param {string} eventName event name. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName event name. + * @param {number} eventCount event count. + * @param {number} eventSum event sum. * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ @@ -127,54 +115,31 @@ class Event { L.e(`endEvent, ${message}`); return message; } - L.d(`endEvent, Ending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); - - if (!eventName) { - const message = "endEvent, eventName is required"; - L.e(`endEvent, ${message}`); - return message; - } - - const args = []; - let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment - - if (eventSum) { - eventType = "eventWithSum"; - } - if (segments) { - eventType = "eventWithSegment"; - } - if (segments && eventSum) { - eventType = "eventWithSumSegment"; - } - - args.push(eventType); + L.d(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); - if (!eventName) { - eventName = ""; - } - args.push(eventName); + const args = {}; + args.n = eventName; - if (!eventCount) { - eventCount = 1; + if (eventCount) { + args.c = eventCount; + } else { + args.c = 1; } - args.push(eventCount); if (eventSum) { let eventSumTemp = eventSum.toString(); if (eventSumTemp.indexOf(".") === -1) { eventSumTemp = parseFloat(eventSumTemp).toFixed(2); - args.push(eventSumTemp); + args.s = eventSumTemp; } else { - args.push(eventSum); + args.s = eventSum; } - } else { - args.push("0.0"); } + args.g = []; for (const event in segments) { - args.push(event); - args.push(segments[event]); + args.g.push(event); + args.g.push(segments[event]); } this.#state.CountlyReactNative.endEvent(args); } diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 5809df47..dd3ed659 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -750,46 +750,25 @@ public void eventLegacy(ReadableArray args) { } @ReactMethod - public void event(ReadableArray args) { - String eventType = args.getString(0); - switch (eventType) { - case "event": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - Countly.sharedInstance().events().recordEvent(eventName, eventCount); - break; - } - case "eventWithSum": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - double eventSum = args.getDouble(3); - Countly.sharedInstance().events().recordEvent(eventName, eventCount, eventSum); - break; - } - case "eventWithSegment": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - HashMap segmentation = new HashMap<>(); - for (int i = 3, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount); - break; - } - case "eventWithSumSegment": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - double eventSum = args.getDouble(3); - HashMap segmentation = new HashMap<>(); - for (int i = 4, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount, eventSum); - break; - } - default: - break; + public void event(ReadableMap args) { + String eventName = args.getString("n"); + + int eventCount = 0; + if (args.hasKey("c")) { + eventCount = args.getInt("c"); + } + + double eventSum = 0; + if (args.hasKey("s")) { + eventSum = args.getDouble("s"); } + + HashMap segmentation = new HashMap<>(); + ReadableArray segments = args.getArray("g"); + for (int i = 0, il = segments != null ? segments.size() : 0; i < il; i += 2) { + segmentation.put(segments.getString(i), segments.getString(i + 1)); + } + Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount, eventSum); } @ReactMethod @@ -847,45 +826,26 @@ public void endEventLegacy(ReadableArray args) { } @ReactMethod - public void endEvent(ReadableArray args) { - String eventType = args.getString(0); - switch (eventType) { - case "event": { - String eventName = args.getString(1); - Countly.sharedInstance().events().endEvent(eventName); - break; - } - case "eventWithSum": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - double eventSum = args.getDouble(3); - Countly.sharedInstance().events().endEvent(eventName, null, eventCount, eventSum); - break; - } - case "eventWithSegment": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - HashMap segmentation = new HashMap<>(); - for (int i = 4, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, 0); - break; - } - case "eventWithSumSegment": { - String eventName = args.getString(1); - int eventCount = args.getInt(2); - double eventSum = args.getDouble(3); - HashMap segmentation = new HashMap<>(); - for (int i = 4, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, eventSum); - break; - } - default: - break; + public void endEvent(ReadableMap args) { + String eventName = args.getString("n"); + + int eventCount = 0; + if (args.hasKey("c")) { + eventCount = args.getInt("c"); + } + + double eventSum = 0; + if (args.hasKey("s")) { + eventSum = args.getDouble("s"); } + + HashMap segmentation = new HashMap<>(); + ReadableArray segments = args.getArray("g"); + for (int i = 0, il = segments != null ? segments.size() : 0; i < il; i += 2) { + segmentation.put(segments.getString(i), segments.getString(i + 1)); + } + + Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, eventSum); } @ReactMethod diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 8b4e94b1..193131d6 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -275,54 +275,22 @@ - (void) populateConfig:(id) json { }); } -RCT_EXPORT_METHOD(event : (NSArray *)arguments) { +RCT_EXPORT_METHOD(event : (NSDictionary *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ - NSString *eventType = [arguments objectAtIndex:0]; - if (eventType != nil && [eventType length] > 0) { - if ([eventType isEqual:@"event"]) { - NSString *eventName = [arguments objectAtIndex:1]; + NSString *eventName = [arguments objectForKey:@"n"]; - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; - [[Countly sharedInstance] recordEvent:eventName count:countInt]; - } else if ([eventType isEqual:@"eventWithSum"]) { - NSString *eventName = [arguments objectAtIndex:1]; + NSNumber *countNumber = [arguments objectForKey:@"c"]; + int countInt = [countNumber intValue]; - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; + NSNumber *sumNumber = [arguments objectForKey:@"s"]; + float sumFloat = [sumNumber floatValue]; - NSNumber *sumNumber = [arguments objectAtIndex:3]; - float sumFloat = [sumNumber floatValue]; - - [[Countly sharedInstance] recordEvent:eventName count:countInt sum:sumFloat]; - } else if ([eventType isEqual:@"eventWithSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - for (int i = 3, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt]; - } else if ([eventType isEqual:@"eventWithSumSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; - - NSNumber *sumNumber = [arguments objectAtIndex:3]; - float sumFloat = [sumNumber floatValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - - for (int i = 4, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt sum:sumFloat]; - } - } + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + NSArray *segments = [arguments objectForKey:@"g"]; + for (int i = 0, il = (int)segments.count; i < il; i += 2) { + dict[[segments objectAtIndex:i]] = [segments objectAtIndex:i + 1]; + } + [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt sum:sumFloat]; }); } @@ -582,53 +550,22 @@ + (void)log:(NSString *)theMessage { }); } -RCT_EXPORT_METHOD(endEvent : (NSArray *)arguments) { +RCT_EXPORT_METHOD(endEvent : (NSDictionary *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ - NSString *eventType = [arguments objectAtIndex:0]; + NSString *eventName = [arguments objectForKey:@"n"]; - if ([eventType isEqual:@"event"]) { - NSString *eventName = [arguments objectAtIndex:1]; - [Countly.sharedInstance endEvent:eventName]; - } else if ([eventType isEqual:@"eventWithSum"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; - - NSNumber *sumNumber = [arguments objectAtIndex:3]; - float sumInt = [sumNumber floatValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:sumInt]; - } else if ([eventType isEqual:@"eventWithSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - for (int i = 4, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - - [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:0]; - } else if ([eventType isEqual:@"eventWithSumSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSNumber *countNumber = [arguments objectAtIndex:2]; - int countInt = [countNumber intValue]; - - NSNumber *sumNumber = [arguments objectAtIndex:3]; - float sumInt = [sumNumber floatValue]; + NSNumber *countNumber = [arguments objectForKey:@"c"]; + int countInt = [countNumber intValue]; - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - for (int i = 4, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } + NSNumber *sumNumber = [arguments objectForKey:@"s"]; + float sumFloat = [sumNumber floatValue]; - [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:sumInt]; - } else { - } + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + NSArray *segments = [arguments objectForKey:@"g"]; + for (int i = 0, il = (int)segments.count; i < il; i += 2) { + dict[[segments objectAtIndex:i]] = [segments objectAtIndex:i + 1]; + } + [[Countly sharedInstance] endEvent:eventName segmentation:dict count:countInt sum:sumFloat]; }); } From e8ef6177aaed56fa69b959a659906c1e26cb975b Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Tue, 12 Mar 2024 10:46:13 +0100 Subject: [PATCH 27/48] reordered segements --- Countly.d.ts | 4 ++-- Event.js | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index acea7f56..b3105c2b 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -164,12 +164,12 @@ declare module "countly-sdk-react-native-bridge" { * End Event * * @param {string} eventName event name. + * @param {Segmentation} segments event segmentation. * @param {number} eventCount event count. * @param {number} eventSum event sum. - * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ - export function endEvent(eventName: string, eventCount?: number, eventSum?: number, segments?: Segmentation): string | void; + export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): string | void; } /** diff --git a/Event.js b/Event.js index 56954a4d..a850527b 100644 --- a/Event.js +++ b/Event.js @@ -28,7 +28,7 @@ class Event { L.e(`recordEvent, ${message}`); return message; } - L.d(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); + L.i(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); const args = {}; args.n = eventName; @@ -74,7 +74,7 @@ class Event { if (message) { return message; } - L.d(`startEvent, Starting event: [${eventName}]`); + L.i(`startEvent, Starting event: [${eventName}]`); this.#state.CountlyReactNative.startEvent([eventName.toString()]); } @@ -95,7 +95,7 @@ class Event { if (message) { return message; } - L.d(`cancelEvent, Canceling event: [${eventName}]`); + L.i(`cancelEvent, Canceling event: [${eventName}]`); this.#state.CountlyReactNative.cancelEvent([eventName.toString()]); } @@ -104,18 +104,18 @@ class Event { * End Event * * @param {string} eventName event name. + * @param {Segmentation} segments event segmentation. * @param {number} eventCount event count. * @param {number} eventSum event sum. - * @param {Segmentation} segments event segmentation. * @return {string | void} error message or void */ - endEvent(eventName, eventCount, eventSum, segments) { + endEvent(eventName, segments, eventCount, eventSum) { if (!this.#state.isInitialized) { const message = "'init' must be called before 'endEvent'"; L.e(`endEvent, ${message}`); return message; } - L.d(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); + L.i(`recordEvent, Sending event: [eventName: ${eventName}, segments: ${segments}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); const args = {}; args.n = eventName; From 5a21f53189a826c9cc79135f14e5639c26826765 Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:51:21 +0100 Subject: [PATCH 28/48] updated dependencies (#328) --- package.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 5d2765cb..dee3b2ee 100644 --- a/package.json +++ b/package.json @@ -27,25 +27,25 @@ "@babel/preset-env": "^7.23.9", "@babel/runtime": "7.23.2", "@react-native-community/eslint-config": "3.2.0", - "@swc/core": "1.3.96", - "@swc/wasm": "1.3.97", + "@swc/core": "1.4.2", + "@swc/wasm": "1.4.2", "@tsconfig/react-native": "3.0.2", "@types/jest": "^29.5.8", - "@types/react": "18.2.37", + "@types/react": "18.2.61", "@types/react-native": "0.72.6", "@types/react-test-renderer": "18.0.6", - "@typescript-eslint/eslint-plugin": "6.10.0", - "@typescript-eslint/parser": "6.10.0", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "babel-jest": "^29.7.0", "bufferutil": "4.0.8", "encoding": "0.1.13", - "eslint": "8.53.0", + "eslint": "8.57.0", "eslint-config-airbnb": "19.0.4", - "eslint-config-prettier": "9.0.0", + "eslint-config-prettier": "9.1.0", "eslint-config-standard-with-typescript": "39.1.1", "eslint-plugin-import": "2.29.0", "eslint-plugin-jsx-a11y": "6.8.0", - "eslint-plugin-n": "16.3.1", + "eslint-plugin-n": "16.6.2", "eslint-plugin-promise": "6.1.1", "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", @@ -54,7 +54,7 @@ "jest-config": "29.7.0", "metro-react-native-babel-preset": "0.76.7", "node-notifier": "10.0.1", - "prettier": "3.0.3", + "prettier": "3.2.5", "react-test-renderer": "18.2.0", "ts-node": "10.9.1", "typescript": "5.2.2", From 40fdd33d885c3fa962c66526728ea24dc307aedc Mon Sep 17 00:00:00 2001 From: Peter Obiechina <43280227+peterBrxwn@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:31:07 +0100 Subject: [PATCH 29/48] switched to intToDeviceId (#326) * switched to intToDeviceId * added more tests and switched to NSInteger * tests * reverted to NSNumber * added logs to each switch statement * fixed log issues --- Countly.js | 6 +- Utils.js | 26 +++--- __tests__/utils.test.js | 86 +++++++++++-------- .../android/sdk/react/CountlyReactNative.java | 20 ++--- ios/src/CountlyReactNative.m | 12 ++- 5 files changed, 76 insertions(+), 74 deletions(-) diff --git a/Countly.js b/Countly.js index 51f60401..379ce9cc 100644 --- a/Countly.js +++ b/Countly.js @@ -517,11 +517,7 @@ Countly.getDeviceIDType = async function () { } L.d("getDeviceIDType, Getting device id type"); const result = await CountlyReactNative.getDeviceIDType(); - if (result == null || result == "") { - L.e("getDeviceIDType, unexpected null value from native side"); - return null; - } - return Utils.stringToDeviceIDType(result); + return Utils.intToDeviceIDType(result); }; /** diff --git a/Utils.js b/Utils.js index ed170671..74f6bc86 100644 --- a/Utils.js +++ b/Utils.js @@ -9,29 +9,29 @@ const DeviceIdType = { /** * - * internal countly function that converts String to DeviceIdType. + * internal countly function that converts int to DeviceIdType. + * @param {number} deviceIdType device id type as int * - * @return {DeviceIdType || null} deviceIdType e.g DeviceIdType.DEVELOPER_SUPPLIED, DeviceIdType.TEMPORARY_ID, DeviceIdType.SDK_GENERATED. + * @return {DeviceIdType} deviceIdType e.g DeviceIdType.DEVELOPER_SUPPLIED, DeviceIdType.TEMPORARY_ID, DeviceIdType.SDK_GENERATED. */ -function stringToDeviceIDType(deviceIdType) { +function intToDeviceIDType(deviceIdType) { let result = null; switch (deviceIdType) { - case "DS": + case 10101: + result = DeviceIdType.SDK_GENERATED; + break; + case 20202: result = DeviceIdType.DEVELOPER_SUPPLIED; break; - case "TID": + case 30303: result = DeviceIdType.TEMPORARY_ID; break; - case "SG": - result = DeviceIdType.SDK_GENERATED; - break; default: - break; - } - if (result == null) { L.e("_getDeviceIdType, " + `unexpected deviceIdType [${deviceIdType}] from native side`); - return null; + result = DeviceIdType.SDK_GENERATED; + break; } + L.d(`_getDeviceIdType, DeviceIDType: ${result}`); return result; } @@ -169,4 +169,4 @@ function getStackTrace(e) { return jsStackTrace; } -export { configToJson, stringToDeviceIDType, DeviceIdType, getStackTrace }; +export { configToJson, intToDeviceIDType, DeviceIdType, getStackTrace }; diff --git a/__tests__/utils.test.js b/__tests__/utils.test.js index c2702090..937b2ee7 100644 --- a/__tests__/utils.test.js +++ b/__tests__/utils.test.js @@ -1,57 +1,71 @@ -const { stringToDeviceIDType, DeviceIdType } = require("../Utils.js"); +const { intToDeviceIDType, DeviceIdType } = require("../Utils.js"); -// 'stringToDeviceIDType' -// 'SG' is provided as input +// 'intToDeviceIDType' +// 10101 is provided as input // The function should return DeviceIdType.SDK_GENERATED -test("'SG' maps to DeviceIdType.SDK_GENERATED", () => { - expect(stringToDeviceIDType("SG")).toBe(DeviceIdType.SDK_GENERATED); +test("10101 maps to DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType(10101)).toBe(DeviceIdType.SDK_GENERATED); }); -// 'stringToDeviceIDType' -// 'DS' is provided as input +// 'intToDeviceIDType' +// 20202 is provided as input // The function should return DeviceIdType.DEVELOPER_SUPPLIED -test("'DS' maps to DeviceIdType.DEVELOPER_SUPPLIED", () => { - expect(stringToDeviceIDType("DS")).toBe(DeviceIdType.DEVELOPER_SUPPLIED); +test("20202 maps to DeviceIdType.DEVELOPER_SUPPLIED", () => { + expect(intToDeviceIDType(20202)).toBe(DeviceIdType.DEVELOPER_SUPPLIED); }); -// 'stringToDeviceIDType' -// 'TID' is provided as input +// 'intToDeviceIDType' +// 30303 is provided as input // The function should return DeviceIdType.TEMPORARY_ID -test("'TID' maps to DeviceIdType.TEMPORARY_ID", () => { - expect(stringToDeviceIDType("TID")).toBe(DeviceIdType.TEMPORARY_ID); +test("30303 maps to DeviceIdType.TEMPORARY_ID", () => { + expect(intToDeviceIDType(30303)).toBe(DeviceIdType.TEMPORARY_ID); }); -// 'stringToDeviceIDType' +// 'intToDeviceIDType' +// An 0 is provided as input +// The function should return DeviceIdType.SDK_GENERATED +test("0 input results in DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType(0)).toBe(DeviceIdType.SDK_GENERATED); +}); + +// 'intToDeviceIDType' +// 1337 is provided as input +// The function should return DeviceIdType.SDK_GENERATED +test("1337 maps to DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType(1337)).toBe(DeviceIdType.SDK_GENERATED); +}); + +// 'intToDeviceIDType' +// An -1 is provided as input +// The function should return DeviceIdType.SDK_GENERATED +test("-1 input results in DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType(-1)).toBe(DeviceIdType.SDK_GENERATED); +}); + +// 'intToDeviceIDType' // An empty string is provided as input -// The function should return 'null', indicating an invalid input -test("Invalid input results in 'null'", () => { - expect(stringToDeviceIDType("")).toBe(null); +// The function should return DeviceIdType.SDK_GENERATED +test("Invalid input results in DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType("")).toBe(DeviceIdType.SDK_GENERATED); }); -// 'stringToDeviceIDType' +// 'intToDeviceIDType' // An 'null' is provided as input -// The function should return 'null', indicating an invalid input -test("'null' input results in 'null'", () => { - expect(stringToDeviceIDType(null)).toBe(null); +// The function should return DeviceIdType.SDK_GENERATED +test("'null' input results in DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType(null)).toBe(DeviceIdType.SDK_GENERATED); }); -// 'stringToDeviceIDType' +// 'intToDeviceIDType' // An 'dsaifedos' is provided as input -// The function should return 'null', indicating an invalid input -test("'dsaifedos' input results in 'null'", () => { - expect(stringToDeviceIDType("dsaifedos")).toBe(null); -}); - -// 'stringToDeviceIDType' -// An 0 is provided as input -// The function should return 'null', indicating an invalid input -test("0 input results in 'null'", () => { - expect(stringToDeviceIDType(0)).toBe(null); +// The function should return DeviceIdType.SDK_GENERATED +test("'dsaifedos' input results in DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType("dsaifedos")).toBe(DeviceIdType.SDK_GENERATED); }); -// 'stringToDeviceIDType' +// 'intToDeviceIDType' // An 'undefined' is provided as input -// The function should return 'null', indicating an invalid input -test("'undefined' input results in 'null'", () => { - expect(stringToDeviceIDType(undefined)).toBe(null); +// The function should return DeviceIdType.SDK_GENERATED +test("'undefined' input results in DeviceIdType.SDK_GENERATED", () => { + expect(intToDeviceIDType(undefined)).toBe(DeviceIdType.SDK_GENERATED); }); diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 94758a75..5f3a0f18 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -521,20 +521,14 @@ public void getCurrentDeviceId(Promise promise) { @ReactMethod public void getDeviceIDType(Promise promise) { DeviceIdType deviceIDType = Countly.sharedInstance().deviceId().getType(); - String deviceIDTypeString = null; - switch (deviceIDType) { - case DEVELOPER_SUPPLIED: - deviceIDTypeString = "DS"; - break; - case TEMPORARY_ID: - deviceIDTypeString = "TID"; - break; - case OPEN_UDID: - default: - deviceIDTypeString = "SG"; - break; + int deviceIDTypeInt = 10101; + if (deviceIDType.equals(DeviceIdType.DEVELOPER_SUPPLIED)) { + deviceIDTypeInt = 20202; + } else if (deviceIDType.equals(DeviceIdType.TEMPORARY_ID)) { + deviceIDTypeInt = 30303; } - promise.resolve(deviceIDTypeString); + + promise.resolve(deviceIDTypeInt); } @ReactMethod diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 6203a916..2c94124a 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -401,17 +401,15 @@ + (void)log:(NSString *)theMessage { RCT_REMAP_METHOD(getDeviceIDType, getDeviceIDTypeWithResolver : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) { dispatch_async(dispatch_get_main_queue(), ^{ CLYDeviceIDType deviceIDType = [Countly.sharedInstance deviceIDType]; - NSString *deviceIDTypeString = NULL; + NSNumber *deviceIDTypeInt = NULL; if ([deviceIDType isEqualToString:CLYDeviceIDTypeCustom]) { - deviceIDTypeString = @"DS"; - } else if ([deviceIDType isEqualToString:CLYDeviceIDTypeIDFV]) { - deviceIDTypeString = @"SG"; + deviceIDTypeInt = @20202; } else if ([deviceIDType isEqualToString:CLYDeviceIDTypeTemporary]) { - deviceIDTypeString = @"TID"; + deviceIDTypeInt = @30303; } else { - deviceIDTypeString = @""; + deviceIDTypeInt = @10101; } - resolve(deviceIDTypeString); + resolve(deviceIDTypeInt); }); } From 99766aee415d42ebc82309de393dd48a23c85796 Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Tue, 19 Mar 2024 14:39:55 +0100 Subject: [PATCH 30/48] reworked eventSum --- Event.js | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/Event.js b/Event.js index a850527b..af0b77f2 100644 --- a/Event.js +++ b/Event.js @@ -39,15 +39,7 @@ class Event { args.c = 1; } - if (eventSum) { - let eventSumTemp = eventSum.toString(); - if (eventSumTemp.indexOf(".") === -1) { - eventSumTemp = parseFloat(eventSumTemp).toFixed(2); - args.s = eventSumTemp; - } else { - args.s = eventSum; - } - } + args.s = eventSum; args.g = []; for (const event in segments) { @@ -126,15 +118,7 @@ class Event { args.c = 1; } - if (eventSum) { - let eventSumTemp = eventSum.toString(); - if (eventSumTemp.indexOf(".") === -1) { - eventSumTemp = parseFloat(eventSumTemp).toFixed(2); - args.s = eventSumTemp; - } else { - args.s = eventSum; - } - } + args.s = eventSum; args.g = []; for (const event in segments) { From f40e851854498bcf39744241eb7ee987090e917b Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Tue, 26 Mar 2024 12:47:06 +0100 Subject: [PATCH 31/48] event methods do not return string --- Countly.d.ts | 16 ++++++++-------- Event.js | 37 +++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index b3105c2b..bd179b65 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -137,27 +137,27 @@ declare module "countly-sdk-react-native-bridge" { * @param {number} eventCount event count. * @param {number} eventSum event sum. * @param {Segmentation} segments event segmentation. - * @return {string | void} error message or void + * @return {void} void */ - export function recordEvent(eventName: string, eventCount?: number, eventSum?: number, segments?: Segmentation): string | void; + export function recordEvent(eventName: string, eventCount?: number, eventSum?: number, segments?: Segmentation): void; /** * * Start Event * * @param {string} eventName name of event - * @return {string | void} error message or void + * @return {void} void */ - export function startEvent(eventName: string): string | void; + export function startEvent(eventName: string): void; /** * * Cancel Event * * @param {string} eventName name of event - * @return {string | void} error message or void + * @return {void} void */ - export function cancelEvent(eventName: string): string | void; + export function cancelEvent(eventName: string): void; /** * @@ -167,9 +167,9 @@ declare module "countly-sdk-react-native-bridge" { * @param {Segmentation} segments event segmentation. * @param {number} eventCount event count. * @param {number} eventSum event sum. - * @return {string | void} error message or void + * @return {void} void */ - export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): string | void; + export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; } /** diff --git a/Event.js b/Event.js index af0b77f2..26b17028 100644 --- a/Event.js +++ b/Event.js @@ -15,18 +15,16 @@ class Event { * @param {number} eventCount event count. * @param {number} eventSum event sum. * @param {Segmentation} segments event segmentation. - * @return {string | void} error message or void + * @return {void} void */ recordEvent(eventName, eventCount, eventSum, segments) { if (!this.#state.isInitialized) { - const message = "'init' must be called before 'recordEvent'"; - L.e(`recordEvent, ${message}`); - return message; + L.e("recordEvent, 'init' must be called before 'recordEvent'"); + return; } if (!eventName) { - const message = "recordEvent, eventName is required"; - L.e(`recordEvent, ${message}`); - return message; + L.e("recordEvent, eventName is required"); + return; } L.i(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); @@ -54,17 +52,17 @@ class Event { * Start Event * * @param {string} eventName name of event - * @return {string | void} error message or void + * @return {void} void */ startEvent(eventName) { if (!this.#state.isInitialized) { - const msg = "'init' must be called before 'startEvent'"; - L.e(`startEvent, ${msg}`); - return msg; + L.e("startEvent, 'init' must be called before 'startEvent'"); + return; } const message = Validate.String(eventName, "eventName", "startEvent"); if (message) { - return message; + L.e(`startEvent, ${message}`); + return; } L.i(`startEvent, Starting event: [${eventName}]`); this.#state.CountlyReactNative.startEvent([eventName.toString()]); @@ -75,17 +73,17 @@ class Event { * Cancel Event * * @param {string} eventName name of event - * @return {string | void} error message or void + * @return {void} void */ cancelEvent(eventName) { if (!this.#state.isInitialized) { - const msg = "'init' must be called before 'cancelEvent'"; - L.e(`cancelEvent, ${msg}`); + L.e("cancelEvent, 'init' must be called before 'cancelEvent'"); return msg; } const message = Validate.String(eventName, "eventName", "cancelEvent"); if (message) { - return message; + L.e(`cancelEvent, ${message}`); + return; } L.i(`cancelEvent, Canceling event: [${eventName}]`); this.#state.CountlyReactNative.cancelEvent([eventName.toString()]); @@ -99,13 +97,12 @@ class Event { * @param {Segmentation} segments event segmentation. * @param {number} eventCount event count. * @param {number} eventSum event sum. - * @return {string | void} error message or void + * @return {void} void */ endEvent(eventName, segments, eventCount, eventSum) { if (!this.#state.isInitialized) { - const message = "'init' must be called before 'endEvent'"; - L.e(`endEvent, ${message}`); - return message; + L.e("endEvent, 'init' must be called before 'endEvent'"); + return; } L.i(`recordEvent, Sending event: [eventName: ${eventName}, segments: ${segments}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); From 950ea2dd55947e781aa302a0a0a042d5357ce9d1 Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Wed, 27 Mar 2024 14:06:03 +0100 Subject: [PATCH 32/48] Added deprecated and updated example app --- Countly.d.ts | 10 +++++--- Countly.js | 11 +++++---- Event.js | 6 ++--- example/CountlyRNExample/Events.tsx | 38 ++++++++++++++++++++--------- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index bd179b65..f3ffab27 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -131,15 +131,15 @@ declare module "countly-sdk-react-native-bridge" { */ namespace events { /** - * Used to send various types of event; + * Used to record an event; * * @param {string} eventName event name. + * @param {Segmentation} segments event segmentation. * @param {number} eventCount event count. * @param {number} eventSum event sum. - * @param {Segmentation} segments event segmentation. * @return {void} void */ - export function recordEvent(eventName: string, eventCount?: number, eventSum?: number, segments?: Segmentation): void; + export function recordEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; /** * @@ -213,6 +213,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Used to send various types of event; + * @deprecated in xx.x.x : use 'Countly.event.cancelEvent' instead of this. * * @param {CountlyEventOptions} options event * @return {string | void} error message or void @@ -490,6 +491,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Start Event + * @deprecated in xx.x.x : use 'Countly.event.startEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void @@ -499,6 +501,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Cancel Event + * @deprecated in xx.x.x : use 'Countly.event.cancelEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void @@ -508,6 +511,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * End Event + * @deprecated in xx.x.x : use 'Countly.event.endEvent' instead of this. * * @param {string | object} options event options * @return {string | void} error message or void diff --git a/Countly.js b/Countly.js index 7b7a8142..3335bcd7 100644 --- a/Countly.js +++ b/Countly.js @@ -126,9 +126,10 @@ Countly.hasBeenCalledOnStart = function () { }; /** + * Used to send event; * - * Used to send various types of event; - * + * @deprecated in xx.x.x : use 'Countly.event.recordEvent' instead of this. + * * @param {CountlyEventOptions} options event options. * CountlyEventOptions { * eventName: string; @@ -753,8 +754,8 @@ Countly.pinnedCertificates = function (certificateName) { }; /** - * * Start Event + * @deprecated in xx.x.x : use 'Countly.event.startEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void @@ -774,8 +775,8 @@ Countly.startEvent = function (eventName) { }; /** - * * Cancel Event + * @deprecated in xx.x.x : use 'Countly.event.cancelEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void @@ -795,8 +796,8 @@ Countly.cancelEvent = function (eventName) { }; /** - * * End Event + * @deprecated in xx.x.x : use 'Countly.event.endEvent' instead of this. * * @param {string | CountlyEventOptions} options event options. * CountlyEventOptions { diff --git a/Event.js b/Event.js index 26b17028..75cfe139 100644 --- a/Event.js +++ b/Event.js @@ -9,15 +9,15 @@ class Event { } /** - * Used to send various types of event; + * Used to record an event; * * @param {string} eventName event name. + * @param {Segmentation} segments event segmentation. * @param {number} eventCount event count. * @param {number} eventSum event sum. - * @param {Segmentation} segments event segmentation. * @return {void} void */ - recordEvent(eventName, eventCount, eventSum, segments) { + recordEvent(eventName, segments, eventCount, eventSum) { if (!this.#state.isInitialized) { L.e("recordEvent, 'init' must be called before 'recordEvent'"); return; diff --git a/example/CountlyRNExample/Events.tsx b/example/CountlyRNExample/Events.tsx index 9377a118..a3b6357f 100644 --- a/example/CountlyRNExample/Events.tsx +++ b/example/CountlyRNExample/Events.tsx @@ -6,21 +6,21 @@ import CountlyButton from "./CountlyButton"; const basicEvent = () => { // example for basic event - Countly.events.recordEvent("Basic Event", 1); + Countly.events.recordEvent("Basic Event", undefined, 1); }; const eventWithSum = () => { // example for event with sum - Countly.events.recordEvent("Event With Sum", 1, 0.99); + Countly.events.recordEvent("Event With Sum", undefined, 1, 0.99); }; const eventWithSegment = () => { // example for event with segment - Countly.events.recordEvent("Event With Segment", 1, undefined, { Country: "Turkey", Age: "28" }); - Countly.events.recordEvent("Event With Segment", 1, undefined, { Country: "France", Age: "38" }); + Countly.events.recordEvent("Event With Segment", { Country: "Turkey", Age: "28" }, 1, undefined); + Countly.events.recordEvent("Event With Segment", { Country: "France", Age: "38" }, 1, undefined); }; const eventWithSumAndSegment = () => { // example for event with segment and sum - Countly.events.recordEvent("Event With Sum And Segment", 1, 0.99, { Country: "Turkey", Age: "28" }); - Countly.events.recordEvent("Event With Sum And Segment", 3, 1.99, { Country: "France", Age: "38" }); + Countly.events.recordEvent("Event With Sum And Segment", { Country: "Turkey", Age: "28" }, 1, 0.99); + Countly.events.recordEvent("Event With Sum And Segment", { Country: "France", Age: "38" }, 3, 1.99); }; // TIMED EVENTS @@ -40,29 +40,44 @@ const timedEventWithSum = () => { Countly.events.startEvent("timedEventWithSum"); setTimeout(() => { - Countly.events.endEvent("timedEventWithSum", undefined, 0.99); + Countly.events.endEvent("timedEventWithSum", undefined, undefined, 0.99); }, 1000); }; const timedEventWithSegment = () => { // Event with segment - Countly.startEvent("timedEventWithSegment"); + Countly.events.startEvent("timedEventWithSegment"); setTimeout(() => { - Countly.events.endEvent("timedEventWithSegment", undefined, undefined, { Country: "Germany", Age: "32" }); + Countly.events.endEvent("timedEventWithSegment", { Country: "Germany", Age: "32" }, undefined, undefined); }, 1000); }; const timedEventWithSumAndSegment = () => { // Event with Segment, sum and count - Countly.startEvent("timedEventWithSumAndSegment"); + Countly.events.startEvent("timedEventWithSumAndSegment"); setTimeout(() => { - Countly.events.endEvent("timedEventWithSumAndSegment", 1, 0.99, { Country: "India", Age: "21" }); + Countly.events.endEvent("timedEventWithSumAndSegment", { Country: "India", Age: "21" }, 1, 0.99); }, 1000); }; // TIMED EVENTS +// Test Bad Values +const testEventWithBadValues = () => { + Countly.events.recordEvent(10); + Countly.events.recordEvent("Basic Event", "11"); + Countly.events.recordEvent("Basic Event", 1, "abc"); + Countly.events.recordEvent("Event With Sum", undefined, "1", "0.99"); + Countly.events.recordEvent("Event With Segment", ["Country", "France"], "1", "0.99"); + Countly.events.recordEvent("Event With Segment", ["Country", "France"], "abc", "def"); + Countly.events.recordEvent(null, null, null, null); + Countly.events.recordEvent(0, 0, 0, 0); + Countly.events.recordEvent(" ", " ", " ", " "); + Countly.events.recordEvent("", "", "", ""); +}; +// Test Bad Values + const eventSendThreshold = () => { Countly.setEventSendThreshold(10); }; @@ -79,6 +94,7 @@ function EventScreen({ navigation }) { + From e0fc29ca35f8d000f489ca6f2f40734e1d3cd06c Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Fri, 29 Mar 2024 13:41:52 +0100 Subject: [PATCH 33/48] added changelog entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 755fe1e2..5edb9942 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,12 @@ Deprecated 'enableApm' config option. Use instead 'apm.enableAppStartTimeTrackin * Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. +* Deprecated the old events methods. You should now use the `events` object. Deprecated methods are: + * sendEvent + * startEvent + * cancelEvent + * endEvent + * Updated the underlying Android SDK version to 24.1.1 * Updated the underlying iOS SDK version to 24.1.0 From 9f1e4cd12b6dd3794188223afcf2b8e1ab343c68 Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Fri, 29 Mar 2024 13:43:00 +0100 Subject: [PATCH 34/48] added event parameters check --- Event.js | 9 +++++++++ Logger.js | 2 +- Validators.js | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Event.js b/Event.js index 75cfe139..1ff49981 100644 --- a/Event.js +++ b/Event.js @@ -26,6 +26,11 @@ class Event { L.e("recordEvent, eventName is required"); return; } + const validParameters = Validate.isEventParametersValid('recordEvent', eventName, segments, eventCount, eventSum); + if (!validParameters) { + return; + } + L.i(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); const args = {}; @@ -104,6 +109,10 @@ class Event { L.e("endEvent, 'init' must be called before 'endEvent'"); return; } + const validParameters = Validate.isEventParametersValid('recordEvent', eventName, segments, eventCount, eventSum); + if (!validParameters) { + return; + } L.i(`recordEvent, Sending event: [eventName: ${eventName}, segments: ${segments}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); const args = {}; diff --git a/Logger.js b/Logger.js index 3c87bbd0..87d7028e 100644 --- a/Logger.js +++ b/Logger.js @@ -11,7 +11,7 @@ function initialize(debugMode) { } /** - * Error - this is a issues that needs attention right now. + * Error - this is an issues that needs attention right now. * @param {String} message */ function e(message) { diff --git a/Validators.js b/Validators.js index ce12f698..a638b7df 100644 --- a/Validators.js +++ b/Validators.js @@ -112,4 +112,39 @@ function validateUserDataValue(stringValue, stringName, functionName) { return validateParseInt(stringValue, stringName, functionName); } -export { validateUserDataValue as UserDataValue, validateString as String, validateParseInt as ParseInt, validateValidUserData as ValidUserData, validateUserDataType as UserDataType }; +/** + * Validate event module parameters. + * and it should not be null or undefined + * It will log a message if any issue found related to data validation and return true. + * If the parameters are valid, it will return true. + * @param {String} functionName : name of function from where value is validating. + * @param {String} eventName : event name + * @param {String} segments : segmentation data + * @param {String} eventCount : event count + * @param {String} eventSum : event sum + * @returns + */ +function isEventParametersValid(functionName, eventName, segments, eventCount, eventSum) { + if (eventName && typeof eventName !== 'string') { + L.w(`${functionName}, eventName: [${eventName}] must be a string`); + return false; + } + if (segments && typeof segments !== 'object') { + L.w(`${functionName}, segments: [${segments}] must be an instance of Segmentation`); + return false; + } + + if (eventCount && typeof eventCount !== 'number') { + L.w(`${functionName}, eventCount: [${eventCount}] must be a number`); + return false; + } + + if (eventSum && typeof eventSum !== 'number') { + L.w(`${functionName}, eventSum: [${eventSum}] must be a number`); + return false; + } + + return true; +} + +export { validateUserDataValue as UserDataValue, validateString as String, validateParseInt as ParseInt, validateValidUserData as ValidUserData, validateUserDataType as UserDataType, isEventParametersValid }; From ebae386b9ac11cecc18ea30c846fe76f48130586 Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Wed, 3 Apr 2024 12:21:30 +0100 Subject: [PATCH 35/48] renamed functions --- CHANGELOG.md | 7 +- Countly.d.ts | 37 ++--- Event.js | 51 ++++--- Logger.js | 2 +- Validators.js | 34 ++--- .../android/sdk/react/CountlyReactNative.java | 2 +- example/CountlyRNExample/App.tsx | 2 + example/CountlyRNExample/Constants.js | 1 + example/CountlyRNExample/EventsLegacy.tsx | 143 ++++++++++++++++++ example/CountlyRNExample/Home.tsx | 1 + ios/src/CountlyReactNative.m | 2 +- 11 files changed, 215 insertions(+), 67 deletions(-) create mode 100644 example/CountlyRNExample/EventsLegacy.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 5edb9942..d7d502ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,11 +13,8 @@ Deprecated 'enableApm' config option. Use instead 'apm.enableAppStartTimeTrackin * Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. -* Deprecated the old events methods. You should now use the `events` object. Deprecated methods are: - * sendEvent - * startEvent - * cancelEvent - * endEvent +* Added new Event interface (`Countly.event`) on the SDK interface that exposes the event calls. +* Deprecated the old events methods. * Updated the underlying Android SDK version to 24.1.1 * Updated the underlying iOS SDK version to 24.1.0 diff --git a/Countly.d.ts b/Countly.d.ts index f3ffab27..bd5468b6 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -131,45 +131,48 @@ declare module "countly-sdk-react-native-bridge" { */ namespace events { /** - * Used to record an event; + * Record an event; * - * @param {string} eventName event name. - * @param {Segmentation} segments event segmentation. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName - Name of the event. + * @param {Segmentation} segments - segementation data for the event. + * @param {number} eventCount - event count. + * @param {number} eventSum - event sum. * @return {void} void */ export function recordEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; /** * - * Start Event + * Starts a timed Event. + * NB: If endEvent is not called (with the same event name), + * no event will be recorded. * - * @param {string} eventName name of event + * @param {string} eventName - Name of the event. * @return {void} void */ export function startEvent(eventName: string): void; /** * - * Cancel Event + * Ends a timed Event + * NB: Should be called after startEvent. * - * @param {string} eventName name of event + * @param {string} eventName - Name of the event. + * @param {Segmentation} segments - segementation data for the event. + * @param {number} eventCount - event count. + * @param {number} eventSum - event sum. * @return {void} void */ - export function cancelEvent(eventName: string): void; + export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; /** * - * End Event + * Cancels an event * - * @param {string} eventName event name. - * @param {Segmentation} segments event segmentation. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName - Name of the event. * @return {void} void */ - export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; + export function cancelEvent(eventName: string): void; } /** @@ -213,7 +216,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Used to send various types of event; - * @deprecated in xx.x.x : use 'Countly.event.cancelEvent' instead of this. + * @deprecated in xx.x.x : use 'Countly.event.recordEvent' instead of this. * * @param {CountlyEventOptions} options event * @return {string | void} error message or void diff --git a/Event.js b/Event.js index 1ff49981..a58e6b88 100644 --- a/Event.js +++ b/Event.js @@ -9,24 +9,24 @@ class Event { } /** - * Used to record an event; + * Record an event; * - * @param {string} eventName event name. - * @param {Segmentation} segments event segmentation. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName - Name of the event. + * @param {Segmentation} segments - segementation data for the event. + * @param {number} eventCount - event count. + * @param {number} eventSum - event sum. * @return {void} void */ recordEvent(eventName, segments, eventCount, eventSum) { if (!this.#state.isInitialized) { - L.e("recordEvent, 'init' must be called before 'recordEvent'"); + L.d("recordEvent, 'init' must be called before 'recordEvent'"); return; } if (!eventName) { - L.e("recordEvent, eventName is required"); + L.d("recordEvent, eventName is required"); return; } - const validParameters = Validate.isEventParametersValid('recordEvent', eventName, segments, eventCount, eventSum); + const validParameters = Validate.areEventParametersValid('recordEvent', eventName, segments, eventCount, eventSum); if (!validParameters) { return; } @@ -49,24 +49,25 @@ class Event { args.g.push(event); args.g.push(segments[event]); } - this.#state.CountlyReactNative.event(args); + this.#state.CountlyReactNative.recordEvent(args); } /** * * Start Event + * NB: If endEvent is not called (with the same event name), + * no event will be recorded. * * @param {string} eventName name of event * @return {void} void */ startEvent(eventName) { if (!this.#state.isInitialized) { - L.e("startEvent, 'init' must be called before 'startEvent'"); + L.d("startEvent, 'init' must be called before 'startEvent'"); return; } - const message = Validate.String(eventName, "eventName", "startEvent"); - if (message) { - L.e(`startEvent, ${message}`); + const isInvalid = Validate.String(eventName, "eventName", "startEvent"); + if (isInvalid) { return; } L.i(`startEvent, Starting event: [${eventName}]`); @@ -75,19 +76,18 @@ class Event { /** * - * Cancel Event + * Cancels an Event * * @param {string} eventName name of event * @return {void} void */ cancelEvent(eventName) { if (!this.#state.isInitialized) { - L.e("cancelEvent, 'init' must be called before 'cancelEvent'"); + L.d("cancelEvent, 'init' must be called before 'cancelEvent'"); return msg; } - const message = Validate.String(eventName, "eventName", "cancelEvent"); - if (message) { - L.e(`cancelEvent, ${message}`); + const isInvalid = Validate.String(eventName, "eventName", "cancelEvent"); + if (isInvalid) { return; } L.i(`cancelEvent, Canceling event: [${eventName}]`); @@ -97,23 +97,24 @@ class Event { /** * * End Event + * NB: Should be called after startEvent. * - * @param {string} eventName event name. - * @param {Segmentation} segments event segmentation. - * @param {number} eventCount event count. - * @param {number} eventSum event sum. + * @param {string} eventName - Name of the event. + * @param {Segmentation} segments - segementation data for the event. + * @param {number} eventCount - event count. + * @param {number} eventSum - event sum. * @return {void} void */ endEvent(eventName, segments, eventCount, eventSum) { if (!this.#state.isInitialized) { - L.e("endEvent, 'init' must be called before 'endEvent'"); + L.d("endEvent, 'init' must be called before 'endEvent'"); return; } - const validParameters = Validate.isEventParametersValid('recordEvent', eventName, segments, eventCount, eventSum); + const validParameters = Validate.areEventParametersValid('endEvent', eventName, segments, eventCount, eventSum); if (!validParameters) { return; } - L.i(`recordEvent, Sending event: [eventName: ${eventName}, segments: ${segments}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); + L.i(`endEvent, Sending event: [eventName: ${eventName}, segments: ${segments}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); const args = {}; args.n = eventName; diff --git a/Logger.js b/Logger.js index 87d7028e..a7184892 100644 --- a/Logger.js +++ b/Logger.js @@ -11,7 +11,7 @@ function initialize(debugMode) { } /** - * Error - this is an issues that needs attention right now. + * Error - this is for things that need immediate attention because SDK won’t work. * @param {String} message */ function e(message) { diff --git a/Validators.js b/Validators.js index a638b7df..1a02a81e 100644 --- a/Validators.js +++ b/Validators.js @@ -15,7 +15,7 @@ function validateUserDataType(stringValue, stringName, functionName) { return null; } if (typeof stringValue === "string") { - L.w(`${functionName} unsupported data type '${typeof stringValue}', its data type should be 'number'`); + L.d(`${functionName} unsupported data type '${typeof stringValue}', its data type should be 'number'`); return null; } @@ -80,7 +80,7 @@ function validateString(stringValue, stringName, functionName) { message = `skipping value for '${stringName.toString()}', due to unsupported data type '${typeof stringValue}', its data type should be 'string'`; } if (message) { - L.e(`${functionName}, ${message}`); + L.d(`${functionName}, ${message}`); } return message; } @@ -113,38 +113,38 @@ function validateUserDataValue(stringValue, stringName, functionName) { } /** - * Validate event module parameters. - * and it should not be null or undefined - * It will log a message if any issue found related to data validation and return true. + * Validate event module parameters for undefined or wrong type. + * It will log a message if any issue found and return false. * If the parameters are valid, it will return true. - * @param {String} functionName : name of function from where value is validating. - * @param {String} eventName : event name - * @param {String} segments : segmentation data - * @param {String} eventCount : event count - * @param {String} eventSum : event sum + * + * @param {String} functionName : name of function that called this method. + * @param {string} eventName - Name of the event. + * @param {Segmentation} segments - segementation data for the event. + * @param {number} eventCount - event count. + * @param {number} eventSum - event sum. * @returns */ -function isEventParametersValid(functionName, eventName, segments, eventCount, eventSum) { - if (eventName && typeof eventName !== 'string') { - L.w(`${functionName}, eventName: [${eventName}] must be a string`); +function areEventParametersValid(functionName, eventName, segments, eventCount, eventSum) { + if (!eventName || typeof eventName !== 'string') { + L.d(`${functionName}, eventName: [${eventName}] must be a string`); return false; } if (segments && typeof segments !== 'object') { - L.w(`${functionName}, segments: [${segments}] must be an instance of Segmentation`); + L.d(`${functionName}, segments: [${segments}] must be an object`); return false; } if (eventCount && typeof eventCount !== 'number') { - L.w(`${functionName}, eventCount: [${eventCount}] must be a number`); + L.d(`${functionName}, eventCount: [${eventCount}] must be a number`); return false; } if (eventSum && typeof eventSum !== 'number') { - L.w(`${functionName}, eventSum: [${eventSum}] must be a number`); + L.d(`${functionName}, eventSum: [${eventSum}] must be a number`); return false; } return true; } -export { validateUserDataValue as UserDataValue, validateString as String, validateParseInt as ParseInt, validateValidUserData as ValidUserData, validateUserDataType as UserDataType, isEventParametersValid }; +export { validateUserDataValue as UserDataValue, validateString as String, validateParseInt as ParseInt, validateValidUserData as ValidUserData, validateUserDataType as UserDataType, areEventParametersValid }; diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index dd3ed659..515d359f 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -750,7 +750,7 @@ public void eventLegacy(ReadableArray args) { } @ReactMethod - public void event(ReadableMap args) { + public void recordEvent(ReadableMap args) { String eventName = args.getString("n"); int eventCount = 0; diff --git a/example/CountlyRNExample/App.tsx b/example/CountlyRNExample/App.tsx index cdab68a9..2b5013d2 100644 --- a/example/CountlyRNExample/App.tsx +++ b/example/CountlyRNExample/App.tsx @@ -14,6 +14,7 @@ import ConsentScreen from "./Consent"; import RemoteConfigScreen from "./RemoteConfig"; import OthersScreen from "./Others"; import CrashesScreen from "./Crashes"; +import EventLegacyScreen from "./EventsLegacy"; import { Image } from "react-native"; const Stack = createNativeStackNavigator(); @@ -47,6 +48,7 @@ class Example extends React.Component { + ); diff --git a/example/CountlyRNExample/Constants.js b/example/CountlyRNExample/Constants.js index 11f8d8ab..e2d8c3d2 100644 --- a/example/CountlyRNExample/Constants.js +++ b/example/CountlyRNExample/Constants.js @@ -13,6 +13,7 @@ const navigationName = { Others: "Others", DeviceID: "Device ID", RemoteConfig: "Remote Config", + eventLegacy: "Events Legacy" }; export { lightOrange, navigationName, lightGreen }; diff --git a/example/CountlyRNExample/EventsLegacy.tsx b/example/CountlyRNExample/EventsLegacy.tsx new file mode 100644 index 00000000..0f767e6c --- /dev/null +++ b/example/CountlyRNExample/EventsLegacy.tsx @@ -0,0 +1,143 @@ +import React from "react"; +import { ScrollView } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import Countly from "countly-sdk-react-native-bridge"; +import CountlyButton from "./CountlyButton"; + +interface Segmentation {} +interface SegmentationCustom_1 extends Segmentation { + Country: string; + Age: string; +} +interface EventProps { + eventName: string; + segments?: Segmentation; + eventCount?: number; + eventSum?: string; +} +interface EventPropsCustom_1 extends EventProps { + segments?: SegmentationCustom_1; +} + +const basicEvent = () => { + // example for basic event + const event = { eventName: "Basic Event", eventCount: 1 }; + Countly.sendEvent(event); +}; +const eventWithSum = () => { + // example for event with sum + const event = { eventName: "Event With Sum", eventCount: 1, eventSum: "0.99" }; + Countly.sendEvent(event); +}; +const eventWithSegment = () => { + // example for event with segment + let event: EventPropsCustom_1 = { + eventName: "Event With Segment", + eventCount: 1, + segments: { Country: "Turkey", Age: "28" }, + }; + event.segments = { Country: "Turkey", Age: "28" }; + Countly.sendEvent(event); + event = { + eventName: "Event With Segment", + eventCount: 1, + segments: { Country: "France", Age: "38" }, + }; + Countly.sendEvent(event); +}; +const eventWithSumAndSegment = () => { + // example for event with segment and sum + let event: EventPropsCustom_1 = { + eventName: "Event With Sum And Segment", + eventCount: 1, + eventSum: "0.99", + segments: { Country: "Turkey", Age: "28" }, + }; + Countly.sendEvent(event); + event = { + eventName: "Event With Sum And Segment", + eventCount: 3, + eventSum: "1.99", + segments: { Country: "France", Age: "38" }, + }; + Countly.sendEvent(event); +}; + +// TIMED EVENTS +const startEvent = () => { + Countly.startEvent("timedEvent"); + setTimeout(() => { + Countly.endEvent("timedEvent"); + }, 1000); +}; + +/* + setTimeout may not work correctly if you are attached to Chrome Debugger. + for workaround see: https://github.com/facebook/react-native/issues/9436 +*/ +const timedEventWithSum = () => { + // Event with sum + Countly.startEvent("timedEventWithSum"); + + const event: EventProps = { + eventName: "timedEventWithSum", + eventSum: "0.99", + }; + + setTimeout(() => { + Countly.endEvent(event); + }, 1000); +}; + +const timedEventWithSegment = () => { + // Event with segment + Countly.startEvent("timedEventWithSegment"); + + const event: EventPropsCustom_1 = { + eventName: "timedEventWithSegment", + segments: { Country: "Germany", Age: "32" }, + }; + setTimeout(() => { + Countly.endEvent(event); + }, 1000); +}; + +const timedEventWithSumAndSegment = () => { + // Event with Segment, sum and count + Countly.startEvent("timedEventWithSumAndSegment"); + + const event: EventPropsCustom_1 = { + eventName: "timedEventWithSumAndSegment", + eventCount: 1, + eventSum: "0.99", + segments: { Country: "India", Age: "21" }, + }; + setTimeout(() => { + Countly.endEvent(event); + }, 1000); +}; +// TIMED EVENTS + +const eventSendThreshold = () => { + Countly.setEventSendThreshold(10); +}; + +function EventLegacyScreen({ navigation }) { + return ( + + + + + + + + + + + + + + ); +} + +export default EventLegacyScreen; \ No newline at end of file diff --git a/example/CountlyRNExample/Home.tsx b/example/CountlyRNExample/Home.tsx index 25040530..ccd2273f 100644 --- a/example/CountlyRNExample/Home.tsx +++ b/example/CountlyRNExample/Home.tsx @@ -43,6 +43,7 @@ function HomeScreen({ navigation }) { navigation.navigate(navigationName.RemoteConfig)} color={lightGreen} lightText={true} /> navigation.navigate(navigationName.Crashes)} color={lightGreen} lightText={true} /> navigation.navigate(navigationName.Others)} color={lightGreen} lightText={true} /> + navigation.navigate(navigationName.eventLegacy)} color={lightGreen} lightText={true} /> ); diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 193131d6..85adb5b8 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -275,7 +275,7 @@ - (void) populateConfig:(id) json { }); } -RCT_EXPORT_METHOD(event : (NSDictionary *)arguments) { +RCT_EXPORT_METHOD(recordEvent : (NSDictionary *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *eventName = [arguments objectForKey:@"n"]; From e8bbba5503036dba6f3d255455439e2ac47b8c63 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Thu, 4 Apr 2024 19:00:22 +0900 Subject: [PATCH 36/48] ch --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d502ef..cda85779 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,8 @@ Deprecated 'enableApm' config option. Use instead 'apm.enableAppStartTimeTrackin * Added new Event interface (`Countly.event`) on the SDK interface that exposes the event calls. * Deprecated the old events methods. -* Updated the underlying Android SDK version to 24.1.1 -* Updated the underlying iOS SDK version to 24.1.0 +* Updated the underlying Android SDK version to 24.x.x +* Updated the underlying iOS SDK version to 24.x.x ## 23.12.0 * Added TS type declerations to the SDK From 1ab4646e4077c204a916eddbb21607a2556ce21c Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Mon, 8 Apr 2024 13:49:31 +0100 Subject: [PATCH 37/48] segmentation can include numbers and boolean --- CHANGELOG.md | 2 +- Countly.d.ts | 2 +- Event.js | 6 +-- Validators.js | 16 +++++++ .../android/sdk/react/CountlyReactNative.java | 45 +++++++++++++++---- example/CountlyRNExample/Events.tsx | 15 ++++--- 6 files changed, 66 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d502ef..5ecfae05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ Deprecated 'enableApm' config option. Use instead 'apm.enableAppStartTimeTrackin * Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. -* Added new Event interface (`Countly.event`) on the SDK interface that exposes the event calls. +* Added new Event interface (`Countly.events`) on the SDK interface that exposes the event calls. * Deprecated the old events methods. * Updated the underlying Android SDK version to 24.1.1 diff --git a/Countly.d.ts b/Countly.d.ts index bd5468b6..c2c90a30 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -1,5 +1,5 @@ interface Segmentation { - [key: string]: string; + [key: string]: number | string | boolean; } interface CountlyEventOptions { diff --git a/Event.js b/Event.js index a58e6b88..292d996e 100644 --- a/Event.js +++ b/Event.js @@ -31,7 +31,7 @@ class Event { return; } - L.i(`recordEvent, Sending event: [eventName: ${eventName}, eventCount: ${eventCount}, eventSum: ${eventSum}, segments: ${segments}]`); + L.i(`recordEvent, Sending event: [eventName: ${eventName}, segments: ${JSON.stringify(segments)}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); const args = {}; args.n = eventName; @@ -84,7 +84,7 @@ class Event { cancelEvent(eventName) { if (!this.#state.isInitialized) { L.d("cancelEvent, 'init' must be called before 'cancelEvent'"); - return msg; + return; } const isInvalid = Validate.String(eventName, "eventName", "cancelEvent"); if (isInvalid) { @@ -114,7 +114,7 @@ class Event { if (!validParameters) { return; } - L.i(`endEvent, Sending event: [eventName: ${eventName}, segments: ${segments}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); + L.i(`endEvent, Sending event: [eventName: ${eventName}, segments: ${JSON.stringify(segments)}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); const args = {}; args.n = eventName; diff --git a/Validators.js b/Validators.js index 1a02a81e..e6ecbb41 100644 --- a/Validators.js +++ b/Validators.js @@ -134,11 +134,27 @@ function areEventParametersValid(functionName, eventName, segments, eventCount, return false; } + if (segments) { + for (const event in segments) { + const value = segments[event]; + const valueType = typeof value; + if (value && valueType !== 'string' && valueType !== 'number' && valueType !== 'boolean') { + L.d(`${functionName}, segmentation value: [${eventSum}] must be a number, string or boolean`); + return false; + } + } + } + if (eventCount && typeof eventCount !== 'number') { L.d(`${functionName}, eventCount: [${eventCount}] must be a number`); return false; } + if (eventCount && typeof eventCount === 'number' && eventCount < 0) { + L.d(`${functionName}, eventCount: [${eventCount}] must be a positive number`); + return false; + } + if (eventSum && typeof eventSum !== 'number') { L.d(`${functionName}, eventSum: [${eventSum}] must be a number`); return false; diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 515d359f..27e062f8 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -19,6 +19,7 @@ import android.content.Context; import com.facebook.react.bridge.ReadableMapKeySetIterator; +import com.facebook.react.bridge.ReadableType; import ly.count.android.sdk.Countly; import ly.count.android.sdk.CountlyConfig; import ly.count.android.sdk.DeviceIdType; @@ -753,20 +754,35 @@ public void eventLegacy(ReadableArray args) { public void recordEvent(ReadableMap args) { String eventName = args.getString("n"); - int eventCount = 0; + int eventCount = 1; if (args.hasKey("c")) { eventCount = args.getInt("c"); } - double eventSum = 0; + double eventSum = 0.0; if (args.hasKey("s")) { eventSum = args.getDouble("s"); } HashMap segmentation = new HashMap<>(); ReadableArray segments = args.getArray("g"); - for (int i = 0, il = segments != null ? segments.size() : 0; i < il; i += 2) { - segmentation.put(segments.getString(i), segments.getString(i + 1)); + int len = segments != null ? segments.size() : 0; + for (int i = 0; i < len; i += 2) { + String key = segments.getString(i); + + if (segments.getType(i + 1) == ReadableType.String) { + segmentation.put(key, segments.getString(i + 1)); + } else if (segments.getType(i + 1) == ReadableType.Boolean) { + segmentation.put(key, segments.getBoolean(i + 1)); + } else if (segments.getType(i + 1) == ReadableType.Number) { + double doubleValue = segments.getDouble(i + 1); + int intValue = segments.getInt(i + 1); + if (doubleValue == intValue) { + segmentation.put(key, intValue); + } else { + segmentation.put(key, doubleValue); + } + } } Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount, eventSum); } @@ -829,20 +845,33 @@ public void endEventLegacy(ReadableArray args) { public void endEvent(ReadableMap args) { String eventName = args.getString("n"); - int eventCount = 0; + int eventCount = 1; if (args.hasKey("c")) { eventCount = args.getInt("c"); } - double eventSum = 0; + double eventSum = 0.0; if (args.hasKey("s")) { eventSum = args.getDouble("s"); } HashMap segmentation = new HashMap<>(); ReadableArray segments = args.getArray("g"); - for (int i = 0, il = segments != null ? segments.size() : 0; i < il; i += 2) { - segmentation.put(segments.getString(i), segments.getString(i + 1)); + int len = segments != null ? segments.size() : 0; + for (int i = 0; i < len; i += 2) { + String key = segments.getString(i); + + if (segments.getType(i + 1) == ReadableType.String) { + segmentation.put(key, segments.getString(i + 1)); + } else if (segments.getType(i + 1) == ReadableType.Number) { + double doubleValue = segments.getDouble(i + 1); + int intValue = segments.getInt(i + 1); + if (doubleValue == intValue) { + segmentation.put(key, intValue); + } else { + segmentation.put(key, doubleValue); + } + } } Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, eventSum); diff --git a/example/CountlyRNExample/Events.tsx b/example/CountlyRNExample/Events.tsx index a3b6357f..5e582457 100644 --- a/example/CountlyRNExample/Events.tsx +++ b/example/CountlyRNExample/Events.tsx @@ -14,13 +14,13 @@ const eventWithSum = () => { }; const eventWithSegment = () => { // example for event with segment - Countly.events.recordEvent("Event With Segment", { Country: "Turkey", Age: "28" }, 1, undefined); - Countly.events.recordEvent("Event With Segment", { Country: "France", Age: "38" }, 1, undefined); + Countly.events.recordEvent("Event With Segment", { Country: "Turkey", Age: 28 }, 1, undefined); + Countly.events.recordEvent("Event With Segment", { Country: "France", Age: 38 }, 1, undefined); }; const eventWithSumAndSegment = () => { // example for event with segment and sum - Countly.events.recordEvent("Event With Sum And Segment", { Country: "Turkey", Age: "28" }, 1, 0.99); - Countly.events.recordEvent("Event With Sum And Segment", { Country: "France", Age: "38" }, 3, 1.99); + Countly.events.recordEvent("Event With Sum And Segment", { Country: "Turkey", Age: 28, height: 180.21, male: true, }, 1, 0.99); + Countly.events.recordEvent("Event With Sum And Segment", { Country: "France", Age: 38, height: 150.55, male: false, }, 3, 1.99); }; // TIMED EVENTS @@ -49,7 +49,7 @@ const timedEventWithSegment = () => { Countly.events.startEvent("timedEventWithSegment"); setTimeout(() => { - Countly.events.endEvent("timedEventWithSegment", { Country: "Germany", Age: "32" }, undefined, undefined); + Countly.events.endEvent("timedEventWithSegment", { Country: "Germany", Age: 32 }, undefined, undefined); }, 1000); }; @@ -58,7 +58,7 @@ const timedEventWithSumAndSegment = () => { Countly.events.startEvent("timedEventWithSumAndSegment"); setTimeout(() => { - Countly.events.endEvent("timedEventWithSumAndSegment", { Country: "India", Age: "21" }, 1, 0.99); + Countly.events.endEvent("timedEventWithSumAndSegment", { Country: "India", Age: 21 }, 1, 0.99); }, 1000); }; // TIMED EVENTS @@ -70,7 +70,8 @@ const testEventWithBadValues = () => { Countly.events.recordEvent("Basic Event", 1, "abc"); Countly.events.recordEvent("Event With Sum", undefined, "1", "0.99"); Countly.events.recordEvent("Event With Segment", ["Country", "France"], "1", "0.99"); - Countly.events.recordEvent("Event With Segment", ["Country", "France"], "abc", "def"); + Countly.events.recordEvent("Event With Segment", {"hello": ["Country", "France"]}, "abc", "def"); + Countly.events.recordEvent("timedEventWithSumAndSegment", { Country: "India", Age: 21 }, -2, 0.99); Countly.events.recordEvent(null, null, null, null); Countly.events.recordEvent(0, 0, 0, 0); Countly.events.recordEvent(" ", " ", " ", " "); From 576b8be00421bf47eae95c6156b415968a3ec88c Mon Sep 17 00:00:00 2001 From: Peter Obiechina Date: Mon, 8 Apr 2024 15:27:47 +0100 Subject: [PATCH 38/48] removed legacy methods --- Countly.js | 140 ++---------------- Event.js | 4 +- .../android/sdk/react/CountlyReactNative.java | 85 ----------- ios/src/CountlyReactNative.m | 94 ------------ 4 files changed, 14 insertions(+), 309 deletions(-) diff --git a/Countly.js b/Countly.js index 3335bcd7..5b988127 100644 --- a/Countly.js +++ b/Countly.js @@ -140,64 +140,13 @@ Countly.hasBeenCalledOnStart = function () { * @return {string | void} error message or void */ Countly.sendEvent = function (options) { - if (!_state.isInitialized) { - const message = "'init' must be called before 'sendEvent'"; - L.e(`sendEvent, ${message}`); - return message; - } - if (!options) { - const message = "sendEvent, no event object provided"; - L.e(`sendEvent, ${message}`); - return message; - } - if (!options.eventName) { - const message = "sendEvent, eventName is required"; - L.e(`sendEvent, ${message}`); - return message; - } - L.d(`sendEvent, Sending event: ${JSON.stringify(options)}]`); - - const args = []; - let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment - let segments = {}; - - if (options.eventSum) { - eventType = "eventWithSum"; - } - if (options.segments) { - eventType = "eventWithSegment"; + if (typeof options.eventCount === "string") { + options.eventCount = parseInt(options.eventCount); } - if (options.segments && options.eventSum) { - eventType = "eventWithSumSegment"; + if (typeof options.eventSum === "string") { + options.eventSum = parseFloat(options.eventSum); } - - args.push(eventType); - args.push(options.eventName.toString()); - - if (options.eventCount) { - args.push(options.eventCount.toString()); - } else { - args.push("1"); - } - - if (options.eventSum) { - options.eventSum = options.eventSum.toString(); - if (options.eventSum.indexOf(".") == -1) { - options.eventSum = parseFloat(options.eventSum).toFixed(2); - args.push(options.eventSum); - } else { - args.push(options.eventSum); - } - } - - if (options.segments) { - segments = options.segments; - } - for (const event in segments) { - args.push(event); - args.push(segments[event]); - } - CountlyReactNative.eventLegacy(args); + Countly.events.recordEvent(options.eventName, options.segments, options.eventCount, options.eventSum); }; /** @@ -761,17 +710,7 @@ Countly.pinnedCertificates = function (certificateName) { * @return {string | void} error message or void */ Countly.startEvent = function (eventName) { - if (!_state.isInitialized) { - const msg = "'init' must be called before 'startEvent'"; - L.e(`startEvent, ${msg}`); - return msg; - } - const message = Validate.String(eventName, "eventName", "startEvent"); - if (message) { - return message; - } - L.d(`startEvent, Starting event: [${eventName}]`); - CountlyReactNative.startEvent([eventName.toString()]); + Countly.events.startEvent(eventName); }; /** @@ -782,17 +721,7 @@ Countly.startEvent = function (eventName) { * @return {string | void} error message or void */ Countly.cancelEvent = function (eventName) { - if (!_state.isInitialized) { - const msg = "'init' must be called before 'cancelEvent'"; - L.e(`cancelEvent, ${msg}`); - return msg; - } - const message = Validate.String(eventName, "eventName", "cancelEvent"); - if (message) { - return message; - } - L.d(`cancelEvent, Canceling event: [${eventName}]`); - CountlyReactNative.cancelEvent([eventName.toString()]); + Countly.events.cancelEvent(eventName); }; /** @@ -809,61 +738,16 @@ Countly.cancelEvent = function (eventName) { * @return {string | void} error message or void */ Countly.endEvent = function (options) { - if (!_state.isInitialized) { - const message = "'init' must be called before 'endEvent'"; - L.e(`endEvent, ${message}`); - return message; - } - L.d(`endEvent, Ending event: [${JSON.stringify(options)}]`); if (typeof options === "string") { options = { eventName: options }; } - const args = []; - let eventType = "event"; // event, eventWithSum, eventWithSegment, eventWithSumSegment - let segments = {}; - - if (options.eventSum) { - eventType = "eventWithSum"; - } - if (options.segments) { - eventType = "eventWithSegment"; - } - if (options.segments && options.eventSum) { - eventType = "eventWithSumSegment"; - } - - args.push(eventType); - - if (!options.eventName) { - options.eventName = ""; - } - args.push(options.eventName.toString()); - - if (!options.eventCount) { - options.eventCount = "1"; - } - args.push(options.eventCount.toString()); - - if (options.eventSum) { - let eventSumTemp = options.eventSum.toString(); - if (eventSumTemp.indexOf(".") == -1) { - eventSumTemp = parseFloat(eventSumTemp).toFixed(2); - args.push(eventSumTemp); - } else { - args.push(eventSumTemp); - } - } else { - args.push("0.0"); - } - - if (options.segments) { - segments = options.segments; + if (typeof options.eventCount === "string") { + options.eventCount = parseInt(options.eventCount); } - for (const event in segments) { - args.push(event); - args.push(segments[event]); + if (typeof options.eventSum === "string") { + options.eventSum = parseFloat(options.eventSum); } - CountlyReactNative.endEventLegacy(args); + Countly.events.endEvent(options.eventName, options.segments, options.eventCount, options.eventSum); }; /** diff --git a/Event.js b/Event.js index 292d996e..76d7e314 100644 --- a/Event.js +++ b/Event.js @@ -71,7 +71,7 @@ class Event { return; } L.i(`startEvent, Starting event: [${eventName}]`); - this.#state.CountlyReactNative.startEvent([eventName.toString()]); + this.#state.CountlyReactNative.startEvent([eventName]); } /** @@ -91,7 +91,7 @@ class Event { return; } L.i(`cancelEvent, Canceling event: [${eventName}]`); - this.#state.CountlyReactNative.cancelEvent([eventName.toString()]); + this.#state.CountlyReactNative.cancelEvent([eventName]); } /** diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 27e062f8..7a66f2f9 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -707,49 +707,6 @@ public void setCustomCrashSegments(ReadableArray args) { config.setCustomCrashSegment(segments); } - @ReactMethod - public void eventLegacy(ReadableArray args) { - String eventType = args.getString(0); - switch (eventType) { - case "event": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - Countly.sharedInstance().events().recordEvent(eventName, eventCount); - break; - } - case "eventWithSum": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - float eventSum = Float.parseFloat(args.getString(3)); - Countly.sharedInstance().events().recordEvent(eventName, eventCount, eventSum); - break; - } - case "eventWithSegment": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - HashMap segmentation = new HashMap<>(); - for (int i = 3, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount); - break; - } - case "eventWithSumSegment": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - float eventSum = Float.parseFloat(args.getString(3)); - HashMap segmentation = new HashMap<>(); - for (int i = 4, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount, eventSum); - break; - } - default: - break; - } - } - @ReactMethod public void recordEvent(ReadableMap args) { String eventName = args.getString("n"); @@ -799,48 +756,6 @@ public void cancelEvent(ReadableArray args) { Countly.sharedInstance().events().cancelEvent(cancelEvent); } - @ReactMethod - public void endEventLegacy(ReadableArray args) { - String eventType = args.getString(0); - switch (eventType) { - case "event": { - String eventName = args.getString(1); - Countly.sharedInstance().events().endEvent(eventName); - break; - } - case "eventWithSum": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - float eventSum = Float.parseFloat(args.getString(3)); - Countly.sharedInstance().events().endEvent(eventName, null, eventCount, eventSum); - break; - } - case "eventWithSegment": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - HashMap segmentation = new HashMap<>(); - for (int i = 4, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, 0); - break; - } - case "eventWithSumSegment": { - String eventName = args.getString(1); - int eventCount = Integer.parseInt(args.getString(2)); - float eventSum = Float.parseFloat(args.getString(3)); - HashMap segmentation = new HashMap<>(); - for (int i = 4, il = args.size(); i < il; i += 2) { - segmentation.put(args.getString(i), args.getString(i + 1)); - } - Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, eventSum); - break; - } - default: - break; - } - } - @ReactMethod public void endEvent(ReadableMap args) { String eventName = args.getString("n"); diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 85adb5b8..a371a7a7 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -231,50 +231,6 @@ - (void) populateConfig:(id) json { } } -RCT_EXPORT_METHOD(eventLegacy : (NSArray *)arguments) { - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *eventType = [arguments objectAtIndex:0]; - if (eventType != nil && [eventType length] > 0) { - if ([eventType isEqual:@"event"]) { - NSString *eventName = [arguments objectAtIndex:1]; - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - [[Countly sharedInstance] recordEvent:eventName count:countInt]; - - } else if ([eventType isEqual:@"eventWithSum"]) { - NSString *eventName = [arguments objectAtIndex:1]; - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - NSString *sumString = [arguments objectAtIndex:3]; - float sumFloat = [sumString floatValue]; - [[Countly sharedInstance] recordEvent:eventName count:countInt sum:sumFloat]; - } else if ([eventType isEqual:@"eventWithSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - - for (int i = 3, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt]; - } else if ([eventType isEqual:@"eventWithSumSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - NSString *sumString = [arguments objectAtIndex:3]; - float sumFloat = [sumString floatValue]; - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - - for (int i = 4, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt sum:sumFloat]; - } - } - }); -} - RCT_EXPORT_METHOD(recordEvent : (NSDictionary *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *eventName = [arguments objectForKey:@"n"]; @@ -500,56 +456,6 @@ + (void)log:(NSString *)theMessage { }); } -RCT_EXPORT_METHOD(endEventLegacy : (NSArray *)arguments) { - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *eventType = [arguments objectAtIndex:0]; - - if ([eventType isEqual:@"event"]) { - NSString *eventName = [arguments objectAtIndex:1]; - [Countly.sharedInstance endEvent:eventName]; - } else if ([eventType isEqual:@"eventWithSum"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - - NSString *sumString = [arguments objectAtIndex:3]; - float sumInt = [sumString floatValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:sumInt]; - } else if ([eventType isEqual:@"eventWithSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - for (int i = 4, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - - [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:0]; - } else if ([eventType isEqual:@"eventWithSumSegment"]) { - NSString *eventName = [arguments objectAtIndex:1]; - - NSString *countString = [arguments objectAtIndex:2]; - int countInt = [countString intValue]; - - NSString *sumString = [arguments objectAtIndex:3]; - float sumInt = [sumString floatValue]; - - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - for (int i = 4, il = (int)arguments.count; i < il; i += 2) { - dict[[arguments objectAtIndex:i]] = [arguments objectAtIndex:i + 1]; - } - - [Countly.sharedInstance endEvent:eventName segmentation:dict count:countInt sum:sumInt]; - } else { - } - }); -} - RCT_EXPORT_METHOD(endEvent : (NSDictionary *)arguments) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *eventName = [arguments objectForKey:@"n"]; From 3ac147d617f120434d0f1a517b5a65a8bc946d50 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Thu, 11 Apr 2024 21:44:55 +0900 Subject: [PATCH 39/48] Update android version --- Countly.d.ts | 165 +++++++++--------- Countly.js | 69 ++++++-- Event.js | 128 ++++++-------- Validators.js | 50 +++--- android/build.gradle | 2 +- .../android/sdk/react/CountlyReactNative.java | 113 ++++++------ example/CountlyRNExample/Events.tsx | 6 +- package.json | 4 +- 8 files changed, 274 insertions(+), 263 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index c2c90a30..071aac28 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -130,48 +130,49 @@ declare module "countly-sdk-react-native-bridge" { * Countly Event Module */ namespace events { - /** - * Record an event; - * - * @param {string} eventName - Name of the event. - * @param {Segmentation} segments - segementation data for the event. - * @param {number} eventCount - event count. - * @param {number} eventSum - event sum. - * @return {void} void - */ + /** + * Records an event. + * Event will be saved to the internal queue and will be sent to the server with the next trigger. + * + * @param {string} eventName - Name of the event (This will be displayed on the dashboard) + * @param {Segmentation} segmentation - Extra information to send with your event as key/value pairs + * @param {number} eventCount - Indicates how many times this event has happened (Default is 1) + * @param {number} eventSum - A numerical value that is attached to this event (Will be summed up on the dashboard for all events with the same name) + * @return {void} + */ export function recordEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; - /** - * - * Starts a timed Event. - * NB: If endEvent is not called (with the same event name), - * no event will be recorded. - * - * @param {string} eventName - Name of the event. - * @return {void} void - */ + /** + * + * Starts a Timed Event + * If 'endEvent' is not called (with the same event name) no event will be recorded. + * + * @param {string} eventName - name of the event + * @return {void} + */ export function startEvent(eventName: string): void; - /** - * - * Ends a timed Event - * NB: Should be called after startEvent. - * - * @param {string} eventName - Name of the event. - * @param {Segmentation} segments - segementation data for the event. - * @param {number} eventCount - event count. - * @param {number} eventSum - event sum. - * @return {void} void - */ + /** + * + * Ends a Timed Event if it is started. + * Should be called after startEvent. + * This will behave like recordEvent. + * + * @param {string} eventName - Name of the event (This will be displayed on the dashboard) + * @param {Segmentation} segmentation - Extra information to send with your event as key/value pairs + * @param {number} eventCount - Indicates how many times this event has happened (Default is 1) + * @param {number} eventSum - A numerical value that is attached to this event (Will be summed up on the dashboard for all events with the same name) + * @return {void} void + */ export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; - /** - * - * Cancels an event - * - * @param {string} eventName - Name of the event. - * @return {void} void - */ + /** + * + * Cancels a Timed Event if it is started. + * + * @param {string} eventName - name of the event + * @return {void} + */ export function cancelEvent(eventName: string): void; } @@ -216,7 +217,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Used to send various types of event; - * @deprecated in xx.x.x : use 'Countly.event.recordEvent' instead of this. + * @deprecated in 24.4.0 : use 'Countly.events.recordEvent' instead of this. * * @param {CountlyEventOptions} options event * @return {string | void} error message or void @@ -494,7 +495,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Start Event - * @deprecated in xx.x.x : use 'Countly.event.startEvent' instead of this. + * @deprecated in 24.4.0 : use 'Countly.events.startEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void @@ -504,7 +505,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * Cancel Event - * @deprecated in xx.x.x : use 'Countly.event.cancelEvent' instead of this. + * @deprecated in 24.4.0 : use 'Countly.events.cancelEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void @@ -514,7 +515,7 @@ declare module "countly-sdk-react-native-bridge" { /** * * End Event - * @deprecated in xx.x.x : use 'Countly.event.endEvent' instead of this. + * @deprecated in 24.4.0 : use 'Countly.events.endEvent' instead of this. * * @param {string | object} options event options * @return {string | void} error message or void @@ -1135,52 +1136,52 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { * */ declare class CountlyConfig { - /** + /** * @param {string} serverURL server url * @param {string} appKey application key */ - constructor(serverURL: string, appKey: string); + constructor(serverURL: string, appKey: string); - /** + /** * getter for CountlyConfigApm instance that is used to access CountlyConfigApm methods */ - apm: CountlyConfigApm; + apm: CountlyConfigApm; - /** + /** * Method to set the server url * * @param {string} serverURL server url */ - setServerURL(serverURL: string): CountlyConfig; + setServerURL(serverURL: string): CountlyConfig; - /** + /** * Method to set the app key * * @param {string} appKey application key */ - setAppKey(appKey: string): CountlyConfig; + setAppKey(appKey: string): CountlyConfig; - /** + /** * Method to set the device id * * @param {string} deviceID device id */ - setDeviceID(deviceID: string): CountlyConfig; + setDeviceID(deviceID: string): CountlyConfig; - /** + /** * Method to enable countly internal debugging logs * * @param {boolean} loggingEnabled enable * if true, countly sdk would log to console. */ - setLoggingEnabled(loggingEnabled: boolean): CountlyConfig; + setLoggingEnabled(loggingEnabled: boolean): CountlyConfig; - /** + /** * Method to enable crash reporting to report unhandled crashes to Countly */ - enableCrashReporting(): CountlyConfig; + enableCrashReporting(): CountlyConfig; - /** + /** * Method to set if the consent feature is enabled. * * If set to true, no feature will work without consent being given. @@ -1188,18 +1189,18 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { * @param {boolean} shouldRequireConsent required. True: It is enabled. False: * It is disabled. */ - setRequiresConsent(shouldRequireConsent: boolean): CountlyConfig; + setRequiresConsent(shouldRequireConsent: boolean): CountlyConfig; - /** + /** * Method to give consent for specific features before init * * @param {string[]} consents consents e.g ['location', 'sessions', * 'attribution', 'push', 'events', 'views', 'crashes', 'users', 'push', * 'star-rating', 'apm', 'feedback', 'remote-config'] */ - giveConsent(consents: readonly string[]): CountlyConfig; + giveConsent(consents: readonly string[]): CountlyConfig; - /** + /** * Method to set the user initial location * * @param {string} locationCountryCode country code e.g 'TR' @@ -1207,31 +1208,31 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { * @param {string} locationGpsCoordinates gps coordinates e.g '41.0082,28.9784' * @param {string} locationIpAddress ip address e.g '10.2.33.12' */ - setLocation(locationCountryCode: string, locationCity: string, locationGpsCoordinates: string, locationIpAddress: string): CountlyConfig; + setLocation(locationCountryCode: string, locationCity: string, locationGpsCoordinates: string, locationIpAddress: string): CountlyConfig; - /** + /** * Method to enable tamper protection. This sets the optional salt to be * used for calculating the checksum of requested data which will be sent * with each request * * @param {string} tamperingProtectionSalt salt */ - enableParameterTamperingProtection(tamperingProtectionSalt: string): CountlyConfig; + enableParameterTamperingProtection(tamperingProtectionSalt: string): CountlyConfig; - /** + /** * @deprecated in 24.1.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. * * Method to enable application performance monitoring which includes the recording of app start time. */ - enableApm(): CountlyConfig; + enableApm(): CountlyConfig; - /** + /** * AdditionalIntentRedirectionChecks are enabled by default. * This method should be used to disable them. */ - disableAdditionalIntentRedirectionChecks(): CountlyConfig; + disableAdditionalIntentRedirectionChecks(): CountlyConfig; - /** + /** * Method to set the push token type * @deprecated * Use setPushTokenType() instead to set pushToken @@ -1241,66 +1242,66 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { * @param {string} channelName channel name * @param {string} channelDescription channel description */ - pushTokenType(tokenType: TokenType, channelName: string, channelDescription: string): CountlyConfig; + pushTokenType(tokenType: TokenType, channelName: string, channelDescription: string): CountlyConfig; - /** + /** * Method to set the push token type * NB: ONLY FOR iOS * * @param {Countly.messagingMode} tokenType token type * Possible values include 'DEVELOPMENT', 'PRODUCTION', 'ADHOC'. */ - setPushTokenType(tokenType: messagingMode): CountlyConfig; + setPushTokenType(tokenType: messagingMode): CountlyConfig; - /** + /** * Method to set the push channel name and description * NB: ONLY FOR ANDROID * * @param {string} name channel name * @param {string} description channel description */ - setPushNotificationChannelInformation(name: string, description: string): CountlyConfig; + setPushNotificationChannelInformation(name: string, description: string): CountlyConfig; - /** + /** * Method to set the push notification accent color * NB: ONLY FOR ANDROID * * @param {string} accentColor notification accent color * example '#000000' */ - setPushNotificationAccentColor(accentColor: string): CountlyConfig; + setPushNotificationAccentColor(accentColor: string): CountlyConfig; - /** + /** * Method to configure intent redirection check * * @param {string[]} allowedIntentClassNames allowed intent class names * @param {string[]} allowedIntentPackageNames allowed intent package name */ - configureIntentRedirectionCheck(allowedIntentClassNames: readonly string[], allowedIntentPackageNames: readonly string[]): CountlyConfig; + configureIntentRedirectionCheck(allowedIntentClassNames: readonly string[], allowedIntentPackageNames: readonly string[]): CountlyConfig; - /** + /** * Method to set star rating dialog text * * @param {string} starRatingTextTitle title * @param {string} starRatingTextMessage message * @param {string} starRatingTextDismiss dismiss */ - setStarRatingDialogTexts(starRatingTextTitle: string, starRatingTextMessage: string, starRatingTextDismiss: string): CountlyConfig; + setStarRatingDialogTexts(starRatingTextTitle: string, starRatingTextMessage: string, starRatingTextDismiss: string): CountlyConfig; - /** + /** * Report direct user attribution * * @param {string} campaignType campaign type * @param {object} campaignData campaign data */ - recordDirectAttribution(campaignType: string, campaignData: object): CountlyConfig; + recordDirectAttribution(campaignType: string, campaignData: object): CountlyConfig; - /** + /** * Report indirect user attribution * * @param {object} attributionValues attribution values */ - recordIndirectAttribution(attributionValues: object): CountlyConfig; + recordIndirectAttribution(attributionValues: object): CountlyConfig; } export default CountlyConfig; diff --git a/Countly.js b/Countly.js index 5b988127..a2313350 100644 --- a/Countly.js +++ b/Countly.js @@ -126,9 +126,9 @@ Countly.hasBeenCalledOnStart = function () { }; /** - * Used to send event; + * Sends an event to the server * - * @deprecated in xx.x.x : use 'Countly.event.recordEvent' instead of this. + * @deprecated in 24.4.0 : use 'Countly.events.recordEvent' instead of this. * * @param {CountlyEventOptions} options event options. * CountlyEventOptions { @@ -140,12 +140,23 @@ Countly.hasBeenCalledOnStart = function () { * @return {string | void} error message or void */ Countly.sendEvent = function (options) { - if (typeof options.eventCount === "string") { - options.eventCount = parseInt(options.eventCount); + if (!_state.isInitialized) { + const msg = "'init' must be called before 'recordView'"; + L.w(`sendEvent, ${msg}`); + return msg; } - if (typeof options.eventSum === "string") { - options.eventSum = parseFloat(options.eventSum); + L.w("sendEvent, This method is deprecated, use 'Countly.events.recordEvent' instead"); + if (!options) { + const message = "no event object provided!"; + L.w(`sendEvent, ${message}`); + return message; } + // previous implementation was not clear about the data types of eventCount and eventSum + // here parse them to make sure they are in correct format for the new method + // parser will return a false value (NaN) in case of invalid data (like undefined, null, empty string, etc.) + options.eventCount = parseInt(options.eventCount) || 1; + options.eventSum = parseFloat(options.eventSum) || 0; + Countly.events.recordEvent(options.eventName, options.segments, options.eventCount, options.eventSum); }; @@ -703,30 +714,42 @@ Countly.pinnedCertificates = function (certificateName) { }; /** - * Start Event - * @deprecated in xx.x.x : use 'Countly.event.startEvent' instead of this. + * Start a Timed Event + * @deprecated in 24.4.0 : use 'Countly.events.startEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void */ Countly.startEvent = function (eventName) { + if (!_state.isInitialized) { + const msg = "'init' must be called before 'startEvent'"; + L.e(`startEventLegacy, ${msg}`); + return msg; + } + L.w("startEventLegacy, This method is deprecated, use 'Countly.events.startEvent' instead"); Countly.events.startEvent(eventName); }; /** - * Cancel Event - * @deprecated in xx.x.x : use 'Countly.event.cancelEvent' instead of this. + * Cancel a Timed Event + * @deprecated in 24.4.0 : use 'Countly.events.cancelEvent' instead of this. * * @param {string} eventName name of event * @return {string | void} error message or void */ Countly.cancelEvent = function (eventName) { + if (!_state.isInitialized) { + const msg = "'init' must be called before 'cancelEvent'"; + L.e(`cancelEventLegacy, ${msg}`); + return msg; + } + L.w("cancelEventLegacy, This method is deprecated, use 'Countly.events.cancelEvent' instead"); Countly.events.cancelEvent(eventName); }; /** - * End Event - * @deprecated in xx.x.x : use 'Countly.event.endEvent' instead of this. + * End a Timed Event + * @deprecated in 24.4.0 : use 'Countly.events.endEvent' instead of this. * * @param {string | CountlyEventOptions} options event options. * CountlyEventOptions { @@ -738,15 +761,25 @@ Countly.cancelEvent = function (eventName) { * @return {string | void} error message or void */ Countly.endEvent = function (options) { - if (typeof options === "string") { - options = { eventName: options }; + if (!_state.isInitialized) { + const message = "'init' must be called before 'endEvent'"; + L.e(`endEventLegacy, ${message}`); + return message; } - if (typeof options.eventCount === "string") { - options.eventCount = parseInt(options.eventCount); + L.w("endEventLegacy, This method is deprecated, use 'Countly.events.endEvent' instead"); + if (!options) { + const message = "no event object or event name provided!"; + L.w(`endEventLegacy, ${message}`); + return message; } - if (typeof options.eventSum === "string") { - options.eventSum = parseFloat(options.eventSum); + if (typeof options === "string") { + options = { eventName: options }; } + // previous implementation was not clear about the data types of eventCount and eventSum + // here parse them to make sure they are in correct format for the new method + // parser will return a false value (NaN) in case of invalid data (like undefined, null, empty string, etc.) + options.eventCount = parseInt(options.eventCount) || 1; + options.eventSum = parseFloat(options.eventSum) || 0; Countly.events.endEvent(options.eventName, options.segments, options.eventCount, options.eventSum); }; diff --git a/Event.js b/Event.js index 76d7e314..e2d596a4 100644 --- a/Event.js +++ b/Event.js @@ -9,128 +9,116 @@ class Event { } /** - * Record an event; + * Records an event. + * Event will be saved to the internal queue and will be sent to the server with the next trigger. * - * @param {string} eventName - Name of the event. - * @param {Segmentation} segments - segementation data for the event. - * @param {number} eventCount - event count. - * @param {number} eventSum - event sum. - * @return {void} void + * @param {string} eventName - Name of the event (This will be displayed on the dashboard) + * @param {Segmentation} segmentation - Extra information to send with your event as key/value pairs + * @param {number} eventCount - Indicates how many times this event has happened (Default is 1) + * @param {number} eventSum - A numerical value that is attached to this event (Will be summed up on the dashboard for all events with the same name) + * @return {void} */ - recordEvent(eventName, segments, eventCount, eventSum) { + recordEvent(eventName, segmentation, eventCount, eventSum) { if (!this.#state.isInitialized) { - L.d("recordEvent, 'init' must be called before 'recordEvent'"); - return; - } - if (!eventName) { - L.d("recordEvent, eventName is required"); + L.w("recordEvent, SDK must be initialized before calling 'recordEvent'"); return; } - const validParameters = Validate.areEventParametersValid('recordEvent', eventName, segments, eventCount, eventSum); - if (!validParameters) { + L.i(`recordEvent, called with eventName: [${eventName}], segmentation: [${JSON.stringify(segmentation)}], eventCount: [${eventCount}], eventSum: [${eventSum}]`); + const areParamsValid = Validate.areEventParametersValid("recordEvent", eventName, segmentation, eventCount, eventSum); + if (!areParamsValid) { return; } - L.i(`recordEvent, Sending event: [eventName: ${eventName}, segments: ${JSON.stringify(segments)}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); - + // At this point all parameters should be valid (eventName should exist but other parameters are optional) const args = {}; - args.n = eventName; - - if (eventCount) { - args.c = eventCount; - } else { - args.c = 1; - } - - args.s = eventSum; - - args.g = []; - for (const event in segments) { - args.g.push(event); - args.g.push(segments[event]); + args.n = eventName; // mandatory + args.c = eventCount || 1; // default is 1 + args.s = eventSum || 0; // default is 0 + if (segmentation) { // optional + args.g = []; + for (const key in segmentation) { + args.g.push(key); + args.g.push(segmentation[key]); + } } this.#state.CountlyReactNative.recordEvent(args); } /** * - * Start Event - * NB: If endEvent is not called (with the same event name), - * no event will be recorded. + * Starts a Timed Event + * If 'endEvent' is not called (with the same event name) no event will be recorded. * - * @param {string} eventName name of event - * @return {void} void + * @param {string} eventName - name of the event + * @return {void} */ startEvent(eventName) { if (!this.#state.isInitialized) { - L.d("startEvent, 'init' must be called before 'startEvent'"); + L.w("startEvent, SDK must be initialized before calling 'startEvent'"); return; } - const isInvalid = Validate.String(eventName, "eventName", "startEvent"); - if (isInvalid) { + L.i(`startEvent, called with eventName: [${eventName}]`); + const areParamsValid = Validate.areEventParametersValid("startEvent", eventName, null, null, null); + if (!areParamsValid) { return; } - L.i(`startEvent, Starting event: [${eventName}]`); this.#state.CountlyReactNative.startEvent([eventName]); } /** * - * Cancels an Event + * Cancels a Timed Event if it is started. * - * @param {string} eventName name of event - * @return {void} void + * @param {string} eventName - name of the event + * @return {void} */ cancelEvent(eventName) { if (!this.#state.isInitialized) { - L.d("cancelEvent, 'init' must be called before 'cancelEvent'"); + L.w("cancelEvent, SDK must be initialized before calling 'cancelEvent'"); return; } - const isInvalid = Validate.String(eventName, "eventName", "cancelEvent"); - if (isInvalid) { + L.i(`cancelEvent, called with eventName: [${eventName}]`); + const areParamsValid = Validate.areEventParametersValid("cancelEvent", eventName, null, null, null); + if (!areParamsValid) { return; } - L.i(`cancelEvent, Canceling event: [${eventName}]`); this.#state.CountlyReactNative.cancelEvent([eventName]); } /** * - * End Event - * NB: Should be called after startEvent. + * Ends a Timed Event if it is started. + * Should be called after startEvent. + * This will behave like recordEvent. * - * @param {string} eventName - Name of the event. - * @param {Segmentation} segments - segementation data for the event. - * @param {number} eventCount - event count. - * @param {number} eventSum - event sum. + * @param {string} eventName - Name of the event (This will be displayed on the dashboard) + * @param {Segmentation} segmentation - Extra information to send with your event as key/value pairs + * @param {number} eventCount - Indicates how many times this event has happened (Default is 1) + * @param {number} eventSum - A numerical value that is attached to this event (Will be summed up on the dashboard for all events with the same name) * @return {void} void */ - endEvent(eventName, segments, eventCount, eventSum) { + endEvent(eventName, segmentation, eventCount, eventSum) { if (!this.#state.isInitialized) { - L.d("endEvent, 'init' must be called before 'endEvent'"); + L.w("endEvent, SDK must be initialized before calling 'endEvent'"); return; } - const validParameters = Validate.areEventParametersValid('endEvent', eventName, segments, eventCount, eventSum); + L.i(`endEvent, called with eventName: [${eventName}], segmentation: [${JSON.stringify(segmentation)}], eventCount: [${eventCount}], eventSum: [${eventSum}]`); + const validParameters = Validate.areEventParametersValid("endEvent", eventName, segmentation, eventCount, eventSum); if (!validParameters) { return; } - L.i(`endEvent, Sending event: [eventName: ${eventName}, segments: ${JSON.stringify(segments)}, eventCount: ${eventCount}, eventSum: ${eventSum}]`); + // At this point all parameters should be valid (eventName should exist but other parameters are optional) const args = {}; - args.n = eventName; - - if (eventCount) { - args.c = eventCount; - } else { - args.c = 1; - } - - args.s = eventSum; - - args.g = []; - for (const event in segments) { - args.g.push(event); - args.g.push(segments[event]); + args.n = eventName; // mandatory + args.c = eventCount || 1; // default is 1 + args.s = eventSum || 0; // default is 0 + if (segmentation) { // optional + args.g = []; + for (const key in segmentation) { + args.g.push(key); + args.g.push(segmentation[key]); + } } this.#state.CountlyReactNative.endEvent(args); } diff --git a/Validators.js b/Validators.js index e6ecbb41..9f09e424 100644 --- a/Validators.js +++ b/Validators.js @@ -113,50 +113,46 @@ function validateUserDataValue(stringValue, stringName, functionName) { } /** - * Validate event module parameters for undefined or wrong type. - * It will log a message if any issue found and return false. + * Validates event parameters. + * It will log a message if any issue is found and return false. * If the parameters are valid, it will return true. * - * @param {String} functionName : name of function that called this method. - * @param {string} eventName - Name of the event. - * @param {Segmentation} segments - segementation data for the event. - * @param {number} eventCount - event count. - * @param {number} eventSum - event sum. - * @returns + * @param {string} functionName - name of function that called this method for logging + * @param {string} eventName - provided event name + * @param {Segmentation} segmentation - provided segmentation + * @param {number} eventCount - provided event count + * @param {number} eventSum - provided event sum + * @returns {boolean} true if parameters are valid, false otherwise */ -function areEventParametersValid(functionName, eventName, segments, eventCount, eventSum) { - if (!eventName || typeof eventName !== 'string') { - L.d(`${functionName}, eventName: [${eventName}] must be a string`); +function areEventParametersValid(functionName, eventName, segmentation, eventCount, eventSum) { + if (!eventName || typeof eventName !== "string" || eventName.length === 0) { + L.w(`${functionName}, provided eventName: [${eventName}]. It must be a valid string!`); return false; } - if (segments && typeof segments !== 'object') { - L.d(`${functionName}, segments: [${segments}] must be an object`); + if (segmentation && typeof segmentation !== "object") { + L.w(`${functionName}, provided segmentation: [${segmentation}]. It must be an object!`); return false; } - if (segments) { - for (const event in segments) { - const value = segments[event]; + // validate segmentation values + if (segmentation) { + for (const key in segmentation) { + const value = segmentation[key]; const valueType = typeof value; - if (value && valueType !== 'string' && valueType !== 'number' && valueType !== 'boolean') { - L.d(`${functionName}, segmentation value: [${eventSum}] must be a number, string or boolean`); + if (value && valueType !== "string" && valueType !== "number" && valueType !== "boolean") { + L.w(`${functionName}, segmentation value: [${value}] for the key: [${key}] must be a number, string or boolean!`); return false; } } } - if (eventCount && typeof eventCount !== 'number') { - L.d(`${functionName}, eventCount: [${eventCount}] must be a number`); - return false; - } - - if (eventCount && typeof eventCount === 'number' && eventCount < 0) { - L.d(`${functionName}, eventCount: [${eventCount}] must be a positive number`); + if (eventCount && (typeof eventCount !== "number" || eventCount < 0)) { + L.w(`${functionName}, provided eventCount: [${eventCount}]. It must be a positive number!`); return false; } - if (eventSum && typeof eventSum !== 'number') { - L.d(`${functionName}, eventSum: [${eventSum}] must be a number`); + if (eventSum && typeof eventSum !== "number") { + L.w(`${functionName}, provided eventSum: [${eventSum}]. It must be a number!`); return false; } diff --git a/android/build.gradle b/android/build.gradle index 1351b4ad..e87cd84e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -41,7 +41,7 @@ repositories { dependencies { implementation "com.facebook.react:react-native:${safeExtGet('reactNativeVersion', '+')}" - implementation 'ly.count.android:sdk:24.1.1' + implementation 'ly.count.android:sdk:24.4.0' // Import the BoM for the Firebase platform // The BoM version of 28.4.2 is the newest release that will target firebase-messaging version 22 diff --git a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java index 7a66f2f9..c2da84b0 100644 --- a/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java +++ b/android/src/main/java/ly/count/android/sdk/react/CountlyReactNative.java @@ -89,7 +89,7 @@ public String toString() { public class CountlyReactNative extends ReactContextBaseJavaModule implements LifecycleEventListener { public static final String TAG = "CountlyRNPlugin"; - private String COUNTLY_RN_SDK_VERSION_STRING = "23.12.0"; + private String COUNTLY_RN_SDK_VERSION_STRING = "24.4.0"; private String COUNTLY_RN_SDK_NAME = "js-rnb-android"; private static final CountlyConfig config = new CountlyConfig(); @@ -707,40 +707,21 @@ public void setCustomCrashSegments(ReadableArray args) { config.setCustomCrashSegment(segments); } + // Recieves an object with the following structure: + // {string} n: event name (mandatory) + // {number} c: event count (1 or a positive number) + // {number} s: event sum (0 or a number) + // {array} g: event segmentation (optional, as an array of key-value pairs consecutively) @ReactMethod public void recordEvent(ReadableMap args) { String eventName = args.getString("n"); + int eventCount = args.getInt("c"); + double eventSum = args.getDouble("s"); + Map segmentation = null; + if (args.hasKey("g")) { + segmentation = convertToEventMap(args.getArray("g")); + } - int eventCount = 1; - if (args.hasKey("c")) { - eventCount = args.getInt("c"); - } - - double eventSum = 0.0; - if (args.hasKey("s")) { - eventSum = args.getDouble("s"); - } - - HashMap segmentation = new HashMap<>(); - ReadableArray segments = args.getArray("g"); - int len = segments != null ? segments.size() : 0; - for (int i = 0; i < len; i += 2) { - String key = segments.getString(i); - - if (segments.getType(i + 1) == ReadableType.String) { - segmentation.put(key, segments.getString(i + 1)); - } else if (segments.getType(i + 1) == ReadableType.Boolean) { - segmentation.put(key, segments.getBoolean(i + 1)); - } else if (segments.getType(i + 1) == ReadableType.Number) { - double doubleValue = segments.getDouble(i + 1); - int intValue = segments.getInt(i + 1); - if (doubleValue == intValue) { - segmentation.put(key, intValue); - } else { - segmentation.put(key, doubleValue); - } - } - } Countly.sharedInstance().events().recordEvent(eventName, segmentation, eventCount, eventSum); } @@ -759,35 +740,12 @@ public void cancelEvent(ReadableArray args) { @ReactMethod public void endEvent(ReadableMap args) { String eventName = args.getString("n"); - - int eventCount = 1; - if (args.hasKey("c")) { - eventCount = args.getInt("c"); - } - - double eventSum = 0.0; - if (args.hasKey("s")) { - eventSum = args.getDouble("s"); - } - - HashMap segmentation = new HashMap<>(); - ReadableArray segments = args.getArray("g"); - int len = segments != null ? segments.size() : 0; - for (int i = 0; i < len; i += 2) { - String key = segments.getString(i); - - if (segments.getType(i + 1) == ReadableType.String) { - segmentation.put(key, segments.getString(i + 1)); - } else if (segments.getType(i + 1) == ReadableType.Number) { - double doubleValue = segments.getDouble(i + 1); - int intValue = segments.getInt(i + 1); - if (doubleValue == intValue) { - segmentation.put(key, intValue); - } else { - segmentation.put(key, doubleValue); - } - } - } + int eventCount = args.getInt("c"); + double eventSum = args.getDouble("s"); + Map segmentation = null; + if (args.hasKey("g")) { + segmentation = convertToEventMap(args.getArray("g")); + } Countly.sharedInstance().events().endEvent(eventName, segmentation, eventCount, eventSum); } @@ -1671,6 +1629,41 @@ static void log(String message, Throwable tr, LogLevel logLevel) { } } + public Map convertToEventMap(ReadableArray segments) { + Map segmentation = new HashMap<>(); + if (segments == null) { + return segmentation; + } + int len = segments.size(); + for (int i = 0; i < len; i += 2) { + String key = segments.getString(i); + if (i + 1 < len) { + ReadableType valueType = segments.getType(i + 1); + switch (valueType) { + case String: + segmentation.put(key, segments.getString(i + 1)); + break; + case Boolean: + segmentation.put(key, segments.getBoolean(i + 1)); + break; + case Number: + double doubleValue = segments.getDouble(i + 1); + int intValue = (int) doubleValue; // casting to int will remove the decimal part + if (doubleValue == intValue) { + segmentation.put(key, intValue); + } else { + segmentation.put(key, doubleValue); + } + break; + default: + // Skip other types + break; + } + } + } + return segmentation; + } + Activity getActivity() { Activity activity = getCurrentActivity(); if (activity == null && _reactContext != null) { diff --git a/example/CountlyRNExample/Events.tsx b/example/CountlyRNExample/Events.tsx index 5e582457..e6276732 100644 --- a/example/CountlyRNExample/Events.tsx +++ b/example/CountlyRNExample/Events.tsx @@ -14,12 +14,12 @@ const eventWithSum = () => { }; const eventWithSegment = () => { // example for event with segment - Countly.events.recordEvent("Event With Segment", { Country: "Turkey", Age: 28 }, 1, undefined); + Countly.events.recordEvent("Event With Segment", { Country: "Paris", Age: 28 }, 1, undefined); Countly.events.recordEvent("Event With Segment", { Country: "France", Age: 38 }, 1, undefined); }; const eventWithSumAndSegment = () => { // example for event with segment and sum - Countly.events.recordEvent("Event With Sum And Segment", { Country: "Turkey", Age: 28, height: 180.21, male: true, }, 1, 0.99); + Countly.events.recordEvent("Event With Sum And Segment", { Country: "Lyon", Age: 28, height: 180.21, male: true, }, 1, 0.99); Countly.events.recordEvent("Event With Sum And Segment", { Country: "France", Age: 38, height: 150.55, male: false, }, 3, 1.99); }; @@ -70,7 +70,7 @@ const testEventWithBadValues = () => { Countly.events.recordEvent("Basic Event", 1, "abc"); Countly.events.recordEvent("Event With Sum", undefined, "1", "0.99"); Countly.events.recordEvent("Event With Segment", ["Country", "France"], "1", "0.99"); - Countly.events.recordEvent("Event With Segment", {"hello": ["Country", "France"]}, "abc", "def"); + Countly.events.recordEvent("Event With Segment", { hello: ["Country", "France"] }, "abc", "def"); Countly.events.recordEvent("timedEventWithSumAndSegment", { Country: "India", Age: 21 }, -2, 0.99); Countly.events.recordEvent(null, null, null, null); Countly.events.recordEvent(0, 0, 0, 0); diff --git a/package.json b/package.json index 5d2765cb..396edf5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "countly-sdk-react-native-bridge", - "version": "23.12.0", + "version": "24.4.0", "author": "Countly (https://count.ly/)", "bugs": { "url": "https://github.com/Countly/countly-sdk-react-native-bridge/issues" @@ -60,4 +60,4 @@ "typescript": "5.2.2", "utf-8-validate": "6.0.3" } -} +} \ No newline at end of file From 6c453591efd7f161205549a947e4d28fd133b5ed Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Thu, 11 Apr 2024 22:52:15 +0900 Subject: [PATCH 40/48] ios 24.4.0 --- ios/src/CHANGELOG.md | 18 ++++ ios/src/Countly-PL.podspec | 4 +- ios/src/Countly.h | 15 ++- ios/src/Countly.m | 123 +++++++++++++++++++++-- ios/src/Countly.podspec | 4 +- ios/src/CountlyCommon.h | 3 +- ios/src/CountlyCommon.m | 17 +++- ios/src/CountlyConfig.h | 15 ++- ios/src/CountlyConfig.m | 16 ++- ios/src/CountlyConnectionManager.h | 1 + ios/src/CountlyConnectionManager.m | 104 +++++++++++++++---- ios/src/CountlyCrashReporter.m | 4 +- ios/src/CountlyDeviceInfo.h | 2 +- ios/src/CountlyDeviceInfo.m | 13 ++- ios/src/CountlyFeedbacks.m | 2 +- ios/src/CountlyPerformanceMonitoring.m | 2 +- ios/src/CountlyPersistency.h | 2 +- ios/src/CountlyPersistency.m | 26 ++++- ios/src/CountlyRemoteConfigInternal.m | 28 +++--- ios/src/CountlySDKLimitsConfig.h | 36 +++++++ ios/src/CountlySDKLimitsConfig.m | 104 +++++++++++++++++++ ios/src/PrivacyInfo.xcprivacy | 68 +++++++++++++ ios/src/Resettable.h | 14 +++ ios/src/include/CountlySDKLimitsConfig.h | 1 + ios/src/include/Resettable.h | 1 + 25 files changed, 549 insertions(+), 74 deletions(-) create mode 100644 ios/src/CountlySDKLimitsConfig.h create mode 100644 ios/src/CountlySDKLimitsConfig.m create mode 100644 ios/src/PrivacyInfo.xcprivacy create mode 100644 ios/src/Resettable.h create mode 100644 ios/src/include/CountlySDKLimitsConfig.h create mode 100644 ios/src/include/Resettable.h diff --git a/ios/src/CHANGELOG.md b/ios/src/CHANGELOG.md index 4e706be2..478a8faf 100644 --- a/ios/src/CHANGELOG.md +++ b/ios/src/CHANGELOG.md @@ -1,3 +1,21 @@ +## 24.4.0 +* Added `attemptToSendStoredRequests` method to combine all events in event queue into a request and attempt to process stored requests +* Added the iOS privacy manifest to the Countly SDK +* Added a separate SDK Limits Config with the following options: + * `setMaxKeyLength` + * `setMaxValueSize` + * `setMaxBreadcrumbCount` + * `setMaxSegmentationValues` + * `setMaxStackTraceLineLength` + * `setMaxStackTraceLinesPerThread` + +* Fixed session duration inconsistency by incorporating checks for whether the session has started or not. + +* Deprecated `maxKeyLength` initial config flag +* Deprecated `crashLogLimit` initial config flag +* Deprecated `maxValueLength` initial config flag +* Deprecated `maxSegmentationValues` initial config flag + ## 24.1.0 * Added a separate APM Configs with following options: * `enableForegroundBackgroundTracking` diff --git a/ios/src/Countly-PL.podspec b/ios/src/Countly-PL.podspec index 16823a69..3f661a6a 100644 --- a/ios/src/Countly-PL.podspec +++ b/ios/src/Countly-PL.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Countly-PL' - s.version = '24.1.0' + s.version = '24.4.0' s.license = { :type => 'MIT', :file => 'LICENSE' } s.summary = 'Countly is an innovative, real-time, open source mobile analytics platform.' s.homepage = 'https://github.com/Countly/countly-sdk-ios' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = '*.{h,m}' - core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h', 'CountlyAPMConfig.h' + core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h', 'CountlyAPMConfig.h', 'CountlySDKLimitsConfig.h', 'Resettable.h' core.preserve_path = 'countly_dsym_uploader.sh' core.ios.frameworks = ['Foundation', 'UIKit', 'UserNotifications', 'CoreLocation', 'WebKit', 'CoreTelephony', 'WatchConnectivity'] end diff --git a/ios/src/Countly.h b/ios/src/Countly.h index 045da604..f5659181 100644 --- a/ios/src/Countly.h +++ b/ios/src/Countly.h @@ -12,13 +12,14 @@ #import "CountlyRemoteConfig.h" #import "CountlyFeedbackWidget.h" #import "CountlyViewTracking.h" +#import "Resettable.h" #if (TARGET_OS_IOS || TARGET_OS_OSX) #import #endif NS_ASSUME_NONNULL_BEGIN -@interface Countly : NSObject +@interface Countly : NSObject #pragma mark - Core @@ -805,6 +806,18 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)appLoadingFinished; +/** + * Reset the state of SDK that it is not initialized. + * @discussion Reset shared instances + * @discussion Clear request queue and events queue + */ +- (void)halt; +- (void)halt:(BOOL) clearStorage; + +/* Combine all events in event queue into a request and attempt to process stored requests on demand + */ +- (void)attemptToSendStoredRequests; + NS_ASSUME_NONNULL_END @end diff --git a/ios/src/Countly.m b/ios/src/Countly.m index 7f370ac2..f5f70233 100644 --- a/ios/src/Countly.m +++ b/ios/src/Countly.m @@ -28,14 +28,21 @@ + (void)load appLoadStartTime = floor(NSDate.date.timeIntervalSince1970 * 1000); } +static Countly *s_sharedCountly = nil; +static dispatch_once_t onceToken; + + (instancetype)sharedInstance { - static Countly *s_sharedCountly = nil; - static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{s_sharedCountly = self.new;}); return s_sharedCountly; } +- (void)resetInstance { + CLY_LOG_I(@"%s", __FUNCTION__); + onceToken = 0; + s_sharedCountly = nil; +} + - (instancetype)init { if (self = [super init]) @@ -74,10 +81,27 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyCommon.sharedInstance.shouldIgnoreTrustCheck = config.shouldIgnoreTrustCheck; CountlyCommon.sharedInstance.loggerDelegate = config.loggerDelegate; CountlyCommon.sharedInstance.internalLogLevel = config.internalLogLevel; - CountlyCommon.sharedInstance.maxKeyLength = config.maxKeyLength; - CountlyCommon.sharedInstance.maxValueLength = config.maxValueLength; - CountlyCommon.sharedInstance.maxSegmentationValues = config.maxSegmentationValues; - + + config = [self checkAndFixInternalLimitsConfig:config]; + + CountlyCommon.sharedInstance.maxKeyLength = config.sdkInternalLimits.getMaxKeyLength; + CountlyCommon.sharedInstance.maxValueLength = config.sdkInternalLimits.getMaxValueSize; + CountlyCommon.sharedInstance.maxSegmentationValues = config.sdkInternalLimits.getMaxSegmentationValues; + + // For backward compatibility, deprecated values are only set incase new values are not provided using sdkInternalLimits interface + if(CountlyCommon.sharedInstance.maxKeyLength == kCountlyMaxKeyLength && config.maxKeyLength != kCountlyMaxKeyLength) { + CountlyCommon.sharedInstance.maxKeyLength = config.maxKeyLength; + CLY_LOG_I(@"%s provided 'maxKeyLength' override:[ %lu ]", __FUNCTION__, (unsigned long)config.maxKeyLength); + } + if(CountlyCommon.sharedInstance.maxValueLength == kCountlyMaxValueSize && config.maxValueLength != kCountlyMaxValueSize) { + CountlyCommon.sharedInstance.maxValueLength = config.maxValueLength; + CLY_LOG_I(@"%s provided 'maxValueLength' override:[ %lu ]", __FUNCTION__, (unsigned long)config.maxValueLength); + } + if(CountlyCommon.sharedInstance.maxSegmentationValues == kCountlyMaxSegmentationValues && config.maxSegmentationValues != kCountlyMaxSegmentationValues) { + CountlyCommon.sharedInstance.maxSegmentationValues = config.maxSegmentationValues; + CLY_LOG_I(@"%s provided 'maxSegmentationValues' override:[ %lu ]", __FUNCTION__, (unsigned long)config.maxSegmentationValues); + } + CountlyConsentManager.sharedInstance.requiresConsent = config.requiresConsent; if (!config.appKey.length || [config.appKey isEqualToString:@"YOUR_APP_KEY"]) @@ -183,7 +207,12 @@ - (void)startWithConfig:(CountlyConfig *)config #endif CountlyCrashReporter.sharedInstance.crashSegmentation = [config.crashSegmentation cly_truncated:@"Crash segmentation"]; - CountlyCrashReporter.sharedInstance.crashLogLimit = MAX(1, config.crashLogLimit); + CountlyCrashReporter.sharedInstance.crashLogLimit = config.sdkInternalLimits.getMaxBreadcrumbCount; + // For backward compatibility, deprecated values are only set incase new values are not provided using sdkInternalLimits interface + if(CountlyCrashReporter.sharedInstance.crashLogLimit == kCountlyMaxBreadcrumbCount && config.crashLogLimit != kCountlyMaxBreadcrumbCount) { + CountlyCrashReporter.sharedInstance.crashLogLimit = MAX(1, config.crashLogLimit); + CLY_LOG_W(@"%s provided 'maxBreadcrumbCount' override:[ %lu ]", __FUNCTION__, (unsigned long)config.crashLogLimit); + } CountlyCrashReporter.sharedInstance.crashFilter = config.crashFilter; CountlyCrashReporter.sharedInstance.shouldUsePLCrashReporter = config.shouldUsePLCrashReporter; CountlyCrashReporter.sharedInstance.shouldUseMachSignalHandler = config.shouldUseMachSignalHandler; @@ -222,7 +251,7 @@ - (void)startWithConfig:(CountlyConfig *)config CountlyRemoteConfigInternal.sharedInstance.enrollABOnRCDownload = config.enrollABOnRCDownload; } [CountlyRemoteConfigInternal.sharedInstance downloadRemoteConfigAutomatically]; - if(config.apm.getAppStartTimestampOverride) { + if (config.apm.getAppStartTimestampOverride) { appLoadStartTime = config.apm.getAppStartTimestampOverride; } @@ -246,6 +275,56 @@ - (void)startWithConfig:(CountlyConfig *)config [self recordIndirectAttribution:config.indirectAttribution]; } +- (CountlyConfig *) checkAndFixInternalLimitsConfig:(CountlyConfig *)config +{ + if (config.sdkInternalLimits.getMaxKeyLength == 0) { + [config.sdkInternalLimits setMaxKeyLength:kCountlyMaxKeyLength]; + CLY_LOG_W(@"%s Ignoring provided value of %lu for 'maxKeyLength' because it's less than 1", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxKeyLength); + } + else if(config.sdkInternalLimits.getMaxKeyLength != kCountlyMaxKeyLength) + { + CLY_LOG_I(@"%s provided 'maxKeyLength' override:[ %lu ]", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxKeyLength); + } + + if (config.sdkInternalLimits.getMaxValueSize == 0) { + [config.sdkInternalLimits setMaxValueSize:kCountlyMaxValueSize]; + CLY_LOG_W(@"%s Ignoring provided value of %lu for 'maxValueSize' because it's less than 1", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxValueSize); + } + else if(config.sdkInternalLimits.getMaxValueSize != kCountlyMaxValueSize) + { + CLY_LOG_I(@"%s provided 'maxValueSize' override:[ %lu ]", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxValueSize); + } + + if (config.sdkInternalLimits.getMaxSegmentationValues == 0) { + [config.sdkInternalLimits setMaxSegmentationValues:kCountlyMaxSegmentationValues]; + CLY_LOG_W(@"%s Ignoring provided value of %lu for 'maxSegmentationValues' because it's less than 1", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxSegmentationValues); + } + else if(config.sdkInternalLimits.getMaxSegmentationValues != kCountlyMaxSegmentationValues) + { + CLY_LOG_I(@"%s provided 'maxSegmentationValues' override:[ %lu ]", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxSegmentationValues); + } + + if (config.sdkInternalLimits.getMaxBreadcrumbCount == 0) { + [config.sdkInternalLimits setMaxBreadcrumbCount:kCountlyMaxBreadcrumbCount]; + CLY_LOG_W(@"%s Ignoring provided value of %lu for 'maxBreadcrumbCount' because it's less than 1", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxBreadcrumbCount); + } + else if(config.sdkInternalLimits.getMaxBreadcrumbCount != kCountlyMaxBreadcrumbCount) + { + CLY_LOG_I(@"%s provided 'maxBreadcrumbCount' override:[ %lu ]", __FUNCTION__, (unsigned long)config.sdkInternalLimits.getMaxBreadcrumbCount); + } + + if(config.sdkInternalLimits.getMaxStackTraceLineLength != kCountlyMaxStackTraceLinesPerThread) + { + CLY_LOG_W(@"%s 'maxStackTraceLineLength' is currently a placeholder and doesn't actively utilize the set values.", __FUNCTION__); + } + + if(config.sdkInternalLimits.getMaxStackTraceLinesPerThread != kCountlyMaxStackTraceLineLength) + { + CLY_LOG_I(@"%s 'maxStackTraceLinesPerThread' is currently a placeholder and doesn't actively utilize the set values.", __FUNCTION__); + } + return config; +} + #pragma mark - - (void)onTimer:(NSTimer *)timer @@ -1264,4 +1343,32 @@ - (void)appLoadingFinished [CountlyPerformanceMonitoring.sharedInstance recordAppStartDurationTraceWithStartTime:appLoadStartTime endTime:appLoadEndTime]; } +- (void)halt +{ + CLY_LOG_I(@"%s", __FUNCTION__); + [self halt:true]; +} + +- (void)halt:(BOOL) clearStorage +{ + CLY_LOG_I(@"%s %d", __FUNCTION__, clearStorage); + [CountlyPersistency.sharedInstance resetInstance:clearStorage]; + [CountlyDeviceInfo.sharedInstance resetInstance]; + [self resetInstance]; + [CountlyCommon.sharedInstance resetInstance]; + + if(clearStorage) + { + NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; + [NSUserDefaults.standardUserDefaults removePersistentDomainForName:appDomain]; + [NSUserDefaults.standardUserDefaults synchronize]; + } +} + +- (void)attemptToSendStoredRequests +{ + CLY_LOG_I(@"%s", __FUNCTION__); + [CountlyConnectionManager.sharedInstance attemptToSendStoredRequests]; +} + @end diff --git a/ios/src/Countly.podspec b/ios/src/Countly.podspec index 2f7f1063..54e7f614 100644 --- a/ios/src/Countly.podspec +++ b/ios/src/Countly.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Countly' - s.version = '24.1.0' + s.version = '24.4.0' s.license = { :type => 'MIT', :file => 'LICENSE' } s.summary = 'Countly is an innovative, real-time, open source mobile analytics platform.' s.homepage = 'https://github.com/Countly/countly-sdk-ios' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = '*.{h,m}' - core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h', 'CountlyAPMConfig.h' + core.public_header_files = 'Countly.h', 'CountlyUserDetails.h', 'CountlyConfig.h', 'CountlyFeedbackWidget.h', 'CountlyRCData.h', 'CountlyRemoteConfig.h', 'CountlyViewTracking.h', 'CountlyExperimentInformation.h', 'CountlyAPMConfig.h', 'CountlySDKLimitsConfig.h', 'Resettable.h' core.preserve_path = 'countly_dsym_uploader.sh' core.ios.frameworks = ['Foundation', 'UIKit', 'UserNotifications', 'CoreLocation', 'WebKit', 'CoreTelephony', 'WatchConnectivity'] end diff --git a/ios/src/CountlyCommon.h b/ios/src/CountlyCommon.h index 826aa739..36a8562b 100644 --- a/ios/src/CountlyCommon.h +++ b/ios/src/CountlyCommon.h @@ -27,6 +27,7 @@ #import "CountlyViewData.h" #import "CountlyRemoteConfig.h" #import "CountlyViewTracking.h" +#import "Resettable.h" #define CLY_LOG_E(fmt, ...) CountlyInternalLog(CLYInternalLogLevelError, fmt, ##__VA_ARGS__) #define CLY_LOG_W(fmt, ...) CountlyInternalLog(CLYInternalLogLevelWarning, fmt, ##__VA_ARGS__) @@ -68,7 +69,7 @@ NS_ERROR_ENUM(kCountlyErrorDomain) extern NSString* const kCountlySDKVersion; extern NSString* const kCountlySDKName; -@interface CountlyCommon : NSObject +@interface CountlyCommon : NSObject @property (nonatomic, copy) NSString* SDKVersion; @property (nonatomic, copy) NSString* SDKName; diff --git a/ios/src/CountlyCommon.m b/ios/src/CountlyCommon.m index c20ab314..75c9ddd2 100644 --- a/ios/src/CountlyCommon.m +++ b/ios/src/CountlyCommon.m @@ -26,7 +26,7 @@ @interface CountlyCommon () #endif @end -NSString* const kCountlySDKVersion = @"24.1.0"; +NSString* const kCountlySDKVersion = @"24.4.0"; NSString* const kCountlySDKName = @"objc-native-ios"; NSString* const kCountlyErrorDomain = @"ly.count.ErrorDomain"; @@ -36,10 +36,10 @@ @interface CountlyCommon () @implementation CountlyCommon +static CountlyCommon *s_sharedInstance = nil; +static dispatch_once_t onceToken; + (instancetype)sharedInstance { - static CountlyCommon *s_sharedInstance = nil; - static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{s_sharedInstance = self.new;}); return s_sharedInstance; } @@ -58,6 +58,13 @@ - (instancetype)init return self; } +- (void)resetInstance { + CLY_LOG_I(@"%s", __FUNCTION__); + onceToken = 0; + s_sharedInstance = nil; + _hasStarted = false; +} + - (BOOL)hasStarted { @@ -456,7 +463,7 @@ - (void)forwardInvocation:(NSInvocation *)invocation NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error]; if (error) { - CLY_LOG_W(@"JSON can not be created: \n%@", error); + CLY_LOG_W(@"%s, JSON can not be created error:[ %@ ]", __FUNCTION__, error); } return [data cly_stringUTF8]; @@ -574,7 +581,7 @@ - (NSDictionary *)cly_limited:(NSString *)explanation NSMutableArray* excessKeys = allKeys.mutableCopy; [excessKeys removeObjectsInRange:(NSRange){0, CountlyCommon.sharedInstance.maxSegmentationValues}]; - CLY_LOG_W(@"Number of key-value pairs in %@ is more than the limit (%ld)! So, some of them will be removed:\n %@", explanation, (long)CountlyCommon.sharedInstance.maxSegmentationValues, [excessKeys description]); + CLY_LOG_W(@"%s, Number of key-value pairs in %@ is more than the limit (%ld)! So, some of them will be removed %@", __FUNCTION__, explanation, (long)CountlyCommon.sharedInstance.maxSegmentationValues, [excessKeys description]); NSMutableDictionary* limitedDict = self.mutableCopy; [limitedDict removeObjectsForKeys:excessKeys]; diff --git a/ios/src/CountlyConfig.h b/ios/src/CountlyConfig.h index 8b3f8934..bf4bc9bf 100644 --- a/ios/src/CountlyConfig.h +++ b/ios/src/CountlyConfig.h @@ -8,6 +8,7 @@ #import #import "CountlyRCData.h" #import "CountlyAPMConfig.h" +#import "CountlySDKLimitsConfig.h" #if (TARGET_OS_IOS || TARGET_OS_TV) #import @@ -382,7 +383,7 @@ typedef enum : NSUInteger * @discussion Keys longer than this limit will be truncated. * @discussion If not set, it will be 128 chars by default. */ -@property (nonatomic) NSUInteger maxKeyLength; +@property(nonatomic) NSUInteger maxKeyLength DEPRECATED_MSG_ATTRIBUTE("Use 'sdkInternalLimits' CountlySDKLimitsConfig object instead"); /** * Limit for the length of values in all key-value pairs. @@ -395,7 +396,7 @@ typedef enum : NSUInteger * @discussion Values longer than this limit will be truncated. * @discussion If not set, it will be 256 chars by default. */ -@property (nonatomic) NSUInteger maxValueLength; +@property(nonatomic) NSUInteger maxValueLength DEPRECATED_MSG_ATTRIBUTE("Use 'sdkInternalLimits' CountlySDKLimitsConfig object instead"); /** * Limit for the number of key-value pairs in segmentations. @@ -403,7 +404,13 @@ typedef enum : NSUInteger * @discussion As obviously there is no order among the keys of an NSDictionary, it is not defined which ones will be removed. * @discussion If not set, it will be 30 by default. */ -@property (nonatomic) NSUInteger maxSegmentationValues; +@property(nonatomic) NSUInteger maxSegmentationValues DEPRECATED_MSG_ATTRIBUTE("Use 'sdkInternalLimits' CountlySDKLimitsConfig object instead"); + +/** + * Variable to access sdkInternalLimits configurations. + * @discussion SDK internal limits configurations for developer to interact with SDK. + */ +- (CountlySDKLimitsConfig *)sdkInternalLimits; /** * For sending all requests using HTTP POST method. @@ -469,7 +476,7 @@ typedef enum : NSUInteger * @discussion If not set, it will be 100 by default. * @discussion If @c shouldUsePLCrashReporter flag is set on initial config, this limit will not be applied. */ -@property (nonatomic) NSUInteger crashLogLimit; +@property (nonatomic) NSUInteger crashLogLimit DEPRECATED_MSG_ATTRIBUTE("Use 'sdkInternalLimits' CountlySDKLimitsConfig object instead"); /** * Regular expression used for filtering crash reports and preventing them from being sent to Countly Server. diff --git a/ios/src/CountlyConfig.m b/ios/src/CountlyConfig.m index fd2bc860..f93150e5 100644 --- a/ios/src/CountlyConfig.m +++ b/ios/src/CountlyConfig.m @@ -34,6 +34,7 @@ @implementation CountlyConfig #endif CountlyAPMConfig *apmConfig = nil; +CountlySDKLimitsConfig *sdkLimitsConfig = nil; //NOTE: Device ID options NSString* const CLYDefaultDeviceID = @""; //NOTE: It will be overridden to default device ID mechanism, depending on platform. @@ -56,11 +57,11 @@ - (instancetype)init #endif self.eventSendThreshold = 100; self.storedRequestsLimit = 1000; - self.crashLogLimit = 100; + self.crashLogLimit = kCountlyMaxBreadcrumbCount; - self.maxKeyLength = 128; - self.maxValueLength = 256; - self.maxSegmentationValues = 100; + self.maxKeyLength = kCountlyMaxKeyLength; + self.maxValueLength = kCountlyMaxValueSize; + self.maxSegmentationValues = kCountlyMaxSegmentationValues; self.location = kCLLocationCoordinate2DInvalid; @@ -104,4 +105,11 @@ - (nonnull CountlyAPMConfig *)apm { return apmConfig; } +- (nonnull CountlySDKLimitsConfig *)sdkInternalLimits { + if (sdkLimitsConfig == nil) { + sdkLimitsConfig = CountlySDKLimitsConfig.new; + } + return sdkLimitsConfig; +} + @end diff --git a/ios/src/CountlyConnectionManager.h b/ios/src/CountlyConnectionManager.h index d6ee7274..5c7d7446 100644 --- a/ios/src/CountlyConnectionManager.h +++ b/ios/src/CountlyConnectionManager.h @@ -44,6 +44,7 @@ extern const NSInteger kCountlyGETRequestMaxLength; - (void)endSession; - (void)sendEvents; +- (void)attemptToSendStoredRequests; - (void)sendPushToken:(NSString *)token; - (void)sendLocationInfo; - (void)sendUserDetails:(NSString *)userDetails; diff --git a/ios/src/CountlyConnectionManager.m b/ios/src/CountlyConnectionManager.m index 935377e3..e389c635 100644 --- a/ios/src/CountlyConnectionManager.m +++ b/ios/src/CountlyConnectionManager.m @@ -11,6 +11,7 @@ @interface CountlyConnectionManager () NSTimeInterval unsentSessionLength; NSTimeInterval lastSessionStartTime; BOOL isCrashing; + BOOL isSessionStarted; } @property (nonatomic) NSURLSession* URLSession; @end @@ -97,6 +98,7 @@ - (instancetype)init if (self = [super init]) { unsentSessionLength = 0.0; + isSessionStarted = NO; } return self; @@ -197,17 +199,38 @@ - (void)proceedOnQueue [CountlyCommon.sharedInstance startBackgroundTask]; queryString = [self appendRemainingRequest:queryString]; - queryString = [self appendChecksum:queryString]; + NSMutableData* pictureUploadData = [self pictureUploadDataForQueryString:queryString]; - NSString* serverInputEndpoint = [self.host stringByAppendingString:endPoint]; - NSString* fullRequestURL = [serverInputEndpoint stringByAppendingFormat:@"?%@", queryString]; - NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:fullRequestURL]]; + if (!pictureUploadData) + { + queryString = [self appendChecksum:queryString]; + } - NSData* pictureUploadData = [self pictureUploadDataForQueryString:queryString]; + NSString* serverInputEndpoint = [self.host stringByAppendingString:endPoint]; + NSMutableURLRequest* request; + if (pictureUploadData) { + request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverInputEndpoint]]; NSString *contentType = [@"multipart/form-data; boundary=" stringByAppendingString:kCountlyUploadBoundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; + + NSArray *query = [queryString componentsSeparatedByString:@"&"]; + NSEnumerator *e = [query objectEnumerator]; + NSString* kvString; + while (kvString = [e nextObject]) { + NSArray *kv = [kvString componentsSeparatedByString:@"="]; + [self addMultipart:pictureUploadData andKey:[kv[0] stringByRemovingPercentEncoding] andValue:[kv[1] stringByRemovingPercentEncoding]]; + } + + if (self.secretSalt) + { + NSString* checksum = [[[queryString stringByRemovingPercentEncoding] stringByAppendingString:self.secretSalt] cly_SHA256]; + [self addMultipart:pictureUploadData andKey:kCountlyQSKeyChecksum256 andValue:checksum]; + } + + NSString* boundaryEnd = [NSString stringWithFormat:@"\r\n--%@--\r\n", kCountlyUploadBoundary]; + [pictureUploadData appendData:[boundaryEnd cly_dataUTF8]]; request.HTTPMethod = @"POST"; request.HTTPBody = pictureUploadData; } @@ -217,6 +240,11 @@ - (void)proceedOnQueue request.HTTPMethod = @"POST"; request.HTTPBody = [queryString cly_dataUTF8]; } + else + { + NSString* fullRequestURL = [serverInputEndpoint stringByAppendingFormat:@"?%@", queryString]; + request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:fullRequestURL]]; + } request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; @@ -229,7 +257,7 @@ - (void)proceedOnQueue if(response) { NSInteger code = ((NSHTTPURLResponse*)response).statusCode; - CLY_LOG_V(@"Response received from server with status code: %ld\nFor Request: %@", (long)code, ((NSHTTPURLResponse*)response).URL); + CLY_LOG_V(@"%s, Response received from server with status code:[ %ld ] request:[ %@ ]", __FUNCTION__, (long)code, ((NSHTTPURLResponse*)response).URL); } @@ -247,12 +275,12 @@ - (void)proceedOnQueue } else { - CLY_LOG_D(@"Request <%p> failed!\nServer reply: %@", request, [data cly_stringUTF8]); + CLY_LOG_D(@"%s, request:[ <%p> ] failed! response:[ %@ ]", __FUNCTION__, request, [data cly_stringUTF8]); } } else { - CLY_LOG_D(@"Request <%p> failed!\nError: %@", request, error); + CLY_LOG_D(@"%s, request:[ <%p> ] failed! error:[ %@ ]", __FUNCTION__, request, error); #if (TARGET_OS_WATCH) [CountlyPersistency.sharedInstance saveToFile]; #endif @@ -291,7 +319,7 @@ - (void)logRequest:(NSURLRequest *)request sentSize += request.HTTPBody.length; } - CLY_LOG_D(@"Request <%p> started:\n[%@] %@ \n%@", (id)request, request.HTTPMethod, request.URL.absoluteString, bodyAsString); + CLY_LOG_D(@"%s, request:[ <%p> ] started. [%@] %@ %@", __FUNCTION__, (id)request, request.HTTPMethod, request.URL.absoluteString, bodyAsString); CLY_LOG_V(@"Approximate sent data size for request <%p> is %ld bytes.", (id)request, (long)sentSize); } @@ -301,7 +329,13 @@ - (void)beginSession { if (!CountlyConsentManager.sharedInstance.consentForSessions) return; + + if (isSessionStarted) { + CLY_LOG_W(@"%s A session is already running, this 'beginSession' will be ignored", __FUNCTION__); + return; + } + isSessionStarted = YES; lastSessionStartTime = NSDate.date.timeIntervalSince1970; unsentSessionLength = 0.0; @@ -326,6 +360,11 @@ - (void)updateSession { if (!CountlyConsentManager.sharedInstance.consentForSessions) return; + + if (!isSessionStarted) { + CLY_LOG_W(@"%s No session is running, this 'updateSession' will be ignored", __FUNCTION__); + return; + } NSString* queryString = [[self queryEssentials] stringByAppendingFormat:@"&%@=%d", kCountlyQSKeySessionDuration, (int)[self sessionLengthInSeconds]]; @@ -339,7 +378,13 @@ - (void)endSession { if (!CountlyConsentManager.sharedInstance.consentForSessions) return; + + if (!isSessionStarted) { + CLY_LOG_W(@"%s No session is running, this 'endSession' will be ignored", __FUNCTION__); + return; + } + isSessionStarted = NO; NSString* queryString = [[self queryEssentials] stringByAppendingFormat:@"&%@=%@&%@=%d", kCountlyQSKeySessionEnd, @"1", kCountlyQSKeySessionDuration, (int)[self sessionLengthInSeconds]]; @@ -355,16 +400,30 @@ - (void)endSession - (void)sendEvents { - NSString* events = [CountlyPersistency.sharedInstance serializedRecordedEvents]; + [self sendEvents:false]; +} + +- (void)attemptToSendStoredRequests +{ + [self sendEvents:true]; +} +- (void)sendEvents:(BOOL) saveToFile +{ + NSString* events = [CountlyPersistency.sharedInstance serializedRecordedEvents]; + if (!events) return; - + NSString* queryString = [[self queryEssentials] stringByAppendingFormat:@"&%@=%@", kCountlyQSKeyEvents, events]; - + [CountlyPersistency.sharedInstance addToQueue:queryString]; - + + if(saveToFile) { + [CountlyPersistency.sharedInstance saveToFileSync]; + } + [self proceedOnQueue]; } @@ -472,7 +531,7 @@ - (void)sendCrashReport:(NSString *)report immediately:(BOOL)immediately; { if (error || ![self isRequestSuccessful:response data:data]) { - CLY_LOG_D(@"Request <%p> failed!\n%@: %@", request, error ? @"Error" : @"Server reply", error ?: [data cly_stringUTF8]); + CLY_LOG_D(@"%s, request: [ %p ] failed! %@: %@", __FUNCTION__, request, error ? @"Error" : @"Server reply", error ?: [data cly_stringUTF8]); [CountlyPersistency.sharedInstance addToQueue:queryString]; [CountlyPersistency.sharedInstance saveToFileSync]; } @@ -619,7 +678,6 @@ - (void)addDirectRequest:(NSDictionary *)requestParamete } mutableRequestParameters[@"dr"] = [NSNumber numberWithInt:1]; - NSMutableString* queryString = [self queryEssentials].mutableCopy; [mutableRequestParameters enumerateKeysAndObjectsUsingBlock:^(NSString * key, NSString * value, BOOL * stop) @@ -715,7 +773,7 @@ - (NSString *)attributionQueryString return [NSString stringWithFormat:@"&%@=%@", kCountlyQSKeyAttributionID, [attribution cly_JSONify]]; } -- (NSData *)pictureUploadDataForQueryString:(NSString *)queryString +- (NSMutableData *)pictureUploadDataForQueryString:(NSString *)queryString { #if (TARGET_OS_IOS) NSString* localPicturePath = nil; @@ -764,19 +822,27 @@ - (NSData *)pictureUploadDataForQueryString:(NSString *)queryString NSString* boundaryStart = [NSString stringWithFormat:@"--%@\r\n", kCountlyUploadBoundary]; NSString* contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"pictureFile\"; filename=\"%@\"\r\n", localPicturePath.lastPathComponent]; NSString* contentType = [NSString stringWithFormat:@"Content-Type: image/%@\r\n\r\n", allowedFileTypes[fileExtIndex]]; - NSString* boundaryEnd = [NSString stringWithFormat:@"\r\n--%@--\r\n", kCountlyUploadBoundary]; NSMutableData* uploadData = NSMutableData.new; [uploadData appendData:[boundaryStart cly_dataUTF8]]; [uploadData appendData:[contentDisposition cly_dataUTF8]]; [uploadData appendData:[contentType cly_dataUTF8]]; [uploadData appendData:imageData]; - [uploadData appendData:[boundaryEnd cly_dataUTF8]]; return uploadData; #endif return nil; } +- (void)addMultipart:(NSMutableData *)uploadData andKey:(NSString *)key andValue:(NSString *)value +{ + NSString* boundaryStart = [NSString stringWithFormat:@"\r\n--%@\r\n", kCountlyUploadBoundary]; + NSString* contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\";\r\n\r\n", key]; + + [uploadData appendData:[boundaryStart cly_dataUTF8]]; + [uploadData appendData:[contentDisposition cly_dataUTF8]]; + [uploadData appendData:[value cly_dataUTF8]]; +} + - (NSString *)appendChecksum:(NSString *)queryString { if (self.secretSalt) @@ -814,7 +880,7 @@ - (BOOL)isRequestSuccessful:(NSURLResponse *)response data:(NSData *)data return NO; } - CLY_LOG_V(@"Response recieved from server:\n%@\nFor Request: %@", serverReply, ((NSHTTPURLResponse*)response).URL); + CLY_LOG_V(@"%s, response:[ %@ ] request:[ %@ ]", __FUNCTION__, serverReply, ((NSHTTPURLResponse*)response).URL); NSString* result = serverReply[@"result"]; diff --git a/ios/src/CountlyCrashReporter.m b/ios/src/CountlyCrashReporter.m index 4f5d9c17..f3c6e30c 100644 --- a/ios/src/CountlyCrashReporter.m +++ b/ios/src/CountlyCrashReporter.m @@ -414,11 +414,11 @@ - (NSDictionary *)binaryImagesForStackTrace:(NSArray *)stackTrace if (![binaryImagesInStack containsObject:imageName]) { - CLY_LOG_V(@"Image Name is not in the stack trace, so it will be ignored!\n%@", imageName); + CLY_LOG_V(@"%s, imageName:[%@] is not in the stack trace, so it will be ignored!", __FUNCTION__, imageName); continue; } - CLY_LOG_D(@"Image Name is in the stack trace, so it will be used!\n%@", imageName); + CLY_LOG_D(@"%s, imageName:[%@] is in the stack trace, so it will be used!", __FUNCTION__, imageName); const struct mach_header* imageHeader = _dyld_get_image_header(i); if (imageHeader == NULL) diff --git a/ios/src/CountlyDeviceInfo.h b/ios/src/CountlyDeviceInfo.h index cdaaca1f..109f5f97 100644 --- a/ios/src/CountlyDeviceInfo.h +++ b/ios/src/CountlyDeviceInfo.h @@ -6,7 +6,7 @@ #import -@interface CountlyDeviceInfo : NSObject +@interface CountlyDeviceInfo : NSObject typedef enum : NSUInteger { diff --git a/ios/src/CountlyDeviceInfo.m b/ios/src/CountlyDeviceInfo.m index 396ddc76..41c55321 100644 --- a/ios/src/CountlyDeviceInfo.m +++ b/ios/src/CountlyDeviceInfo.m @@ -46,10 +46,10 @@ @interface CountlyDeviceInfo () @implementation CountlyDeviceInfo +static CountlyDeviceInfo *s_sharedInstance = nil; +static dispatch_once_t onceToken; + (instancetype)sharedInstance { - static CountlyDeviceInfo *s_sharedInstance = nil; - static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{s_sharedInstance = self.new;}); return s_sharedInstance; } @@ -372,7 +372,7 @@ + (NSUInteger)connectionType } @catch (NSException *exception) { - CLY_LOG_W(@"Connection type can not be retrieved: \n%@", exception); + CLY_LOG_W(@"%s, Connection type can not be retrieved, got exception: %@", __FUNCTION__, exception); } return connType; @@ -464,4 +464,11 @@ + (BOOL)isInBackground return CountlyDeviceInfo.sharedInstance.isInBackground; } +- (void)resetInstance { + CLY_LOG_I(@"%s", __FUNCTION__); + self.deviceID = nil; + onceToken = 0; + s_sharedInstance = nil; +} + @end diff --git a/ios/src/CountlyFeedbacks.m b/ios/src/CountlyFeedbacks.m index 290024b3..44fff2ba 100644 --- a/ios/src/CountlyFeedbacks.m +++ b/ios/src/CountlyFeedbacks.m @@ -117,7 +117,7 @@ - (void)showDialog:(void(^)(NSInteger rating))completion } @catch (NSException* exception) { - CLY_LOG_W(@"UIAlertController's contentViewController can not be set: \n%@", exception); + CLY_LOG_W(@"%s, UIAlertController's contentViewController can not be set, got exception %@", __FUNCTION__, exception); } [CountlyCommon.sharedInstance tryPresentingViewController:self.alertController]; diff --git a/ios/src/CountlyPerformanceMonitoring.m b/ios/src/CountlyPerformanceMonitoring.m index 2d65ee41..35fbbf26 100644 --- a/ios/src/CountlyPerformanceMonitoring.m +++ b/ios/src/CountlyPerformanceMonitoring.m @@ -53,7 +53,7 @@ - (void) startWithConfig:(CountlyAPMConfig *) apmConfig enableAppStartTimeTracking = apmConfig.enableAppStartTimeTracking; enableManualAppLoadedTrigger = apmConfig.enableManualAppLoadedTrigger; if(enableAppStartTimeTracking && !enableManualAppLoadedTrigger) { - CLY_LOG_W(@"Automatic app start tracking is currently not supported, use manual app loaded trigger for now by setting 'config.apm.enableManualAppLoadedTrigger'\n Then call '[Countly.sharedInstance appLoadingFinished]'"); + CLY_LOG_W(@"%s, Automatic app start tracking is currently not supported, use manual app loaded trigger for now by setting 'config.apm.enableManualAppLoadedTrigger' Then call '[Countly.sharedInstance appLoadingFinished]'", __FUNCTION__); } enableForegroundBackgroundTracking = apmConfig.enableForegroundBackgroundTracking; [self startPerformanceMonitoring]; diff --git a/ios/src/CountlyPersistency.h b/ios/src/CountlyPersistency.h index a43a5c61..a80b3b1f 100644 --- a/ios/src/CountlyPersistency.h +++ b/ios/src/CountlyPersistency.h @@ -8,7 +8,7 @@ @class CountlyEvent; -@interface CountlyPersistency : NSObject +@interface CountlyPersistency : NSObject + (instancetype)sharedInstance; diff --git a/ios/src/CountlyPersistency.m b/ios/src/CountlyPersistency.m index 85b6cbb9..3f64e365 100644 --- a/ios/src/CountlyPersistency.m +++ b/ios/src/CountlyPersistency.m @@ -28,13 +28,14 @@ @implementation CountlyPersistency NSString* const kCountlyCustomCrashLogFileName = @"CountlyCustomCrash.log"; +static CountlyPersistency* s_sharedInstance = nil; +static dispatch_once_t onceToken; + + (instancetype)sharedInstance { if (!CountlyCommon.sharedInstance.hasStarted) return nil; - static CountlyPersistency* s_sharedInstance = nil; - static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{s_sharedInstance = self.new;}); return s_sharedInstance; } @@ -295,6 +296,21 @@ - (void)flushEvents } } +- (void)resetInstance:(BOOL) clearStorage +{ + CLY_LOG_I(@"%s Clear Storage: %d", __FUNCTION__, clearStorage); + [CountlyConnectionManager.sharedInstance sendEvents]; + [self flushEvents]; + [self clearAllTimedEvents]; + [self flushQueue]; + if(clearStorage) + { + [self saveToFile]; + } + onceToken = 0; + s_sharedInstance = nil; +} + #pragma mark --- - (void)recordTimedEvent:(CountlyEvent *)event @@ -358,7 +374,7 @@ - (void)writeCustomCrashLogToFile:(NSString *)log [line writeToFile:crashLogFileURL.path atomically:YES encoding:NSUTF8StringEncoding error:&error]; if (error) { - CLY_LOG_W(@"Crash Log File can not be created: \n%@", error); + CLY_LOG_W(@"%s, Crash Log File can not be created, got error %@", __FUNCTION__, error); } } }); @@ -388,7 +404,7 @@ - (void)deleteCustomCrashLogFile [NSFileManager.defaultManager removeItemAtURL:crashLogFileURL error:&error]; if (error) { - CLY_LOG_W(@"Crash Log File can not be deleted: \n%@", error); + CLY_LOG_W(@"%s, Crash Log File can not be deleted, got error %@", __FUNCTION__, error); } } } @@ -419,7 +435,7 @@ - (NSURL *)storageDirectoryURL [NSFileManager.defaultManager createDirectoryAtURL:URL withIntermediateDirectories:YES attributes:nil error:&error]; if (error) { - CLY_LOG_W(@"Application Support directory can not be created: \n%@", error); + CLY_LOG_W(@"%s, Application Support directory can not be created, got error %@", __FUNCTION__, error); } } }); diff --git a/ios/src/CountlyRemoteConfigInternal.m b/ios/src/CountlyRemoteConfigInternal.m index 0854e76b..8f375bb7 100644 --- a/ios/src/CountlyRemoteConfigInternal.m +++ b/ios/src/CountlyRemoteConfigInternal.m @@ -78,7 +78,7 @@ - (void)startRemoteConfig { if (!error) { - CLY_LOG_D(@"Fetching remote config on start is successful. \n%@", remoteConfig); + CLY_LOG_D(@"%s, Fetching remote config on start is successful. %@", __FUNCTION__, remoteConfig); self.cachedRemoteConfig = [self createRCMeta:remoteConfig]; [CountlyPersistency.sharedInstance storeRemoteConfig:self.cachedRemoteConfig]; @@ -128,7 +128,7 @@ - (void)updateRemoteConfigForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys c { if (!error) { - CLY_LOG_D(@"Fetching remote config manually is successful. \n%@", remoteConfig); + CLY_LOG_D(@"%s, Fetching remote config manually is successful. %@", __FUNCTION__, remoteConfig); NSDictionary* remoteConfigMeta = [self createRCMeta:remoteConfig]; if (!keys && !omitKeys) { @@ -216,7 +216,7 @@ - (void)fetchRemoteConfigForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys i if (error) { - CLY_LOG_D(@"Remote Config Request <%p> failed!\nError: %@", request, error); + CLY_LOG_D(@"%s, Remote Config Request:[ %p ] failed! error:[ %@ ]", __FUNCTION__, request, error); dispatch_async(dispatch_get_main_queue(), ^ { @@ -236,7 +236,7 @@ - (void)fetchRemoteConfigForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys i [task resume]; - CLY_LOG_D(@"Remote Config Request <%p> started:\n[%@] %@", (id)request, request.HTTPMethod, request.URL.absoluteString); + CLY_LOG_D(@"%s, Remote Config Request <%p> started: [%@] %@", __FUNCTION__, (id)request, request.HTTPMethod, request.URL.absoluteString); } - (NSURLRequest *)remoteConfigRequestForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys isLegacy:(BOOL)isLegacy @@ -370,7 +370,7 @@ - (void)downloadValuesForKeys:(NSArray *)keys omitKeys:(NSArray *)omitKeys compl CLYRequestResult requestResult = CLYResponseSuccess; if (!error) { - CLY_LOG_D(@"Fetching remote config is successful. \n%@", remoteConfig); + CLY_LOG_D(@"%s, fetching remote config is successful. %@", __FUNCTION__, remoteConfig); if (!keys && !omitKeys) { fullValueUpdate = true; @@ -468,12 +468,12 @@ - (void)testingDownloadAllVariants:(RCVariantCallback)completionHandler if (!error) { self.localCachedVariants = varaints; - CLY_LOG_D(@"Fetching variants manually is successful. \n%@", varaints); + CLY_LOG_D(@"%s, Fetching variants manually is successful. %@", __FUNCTION__, varaints); } else { - CLY_LOG_W(@"Fetching variants manually failed: %@", error); + CLY_LOG_W(@"%s, Fetching variants manually failed: %@", __FUNCTION__, error); } if (completionHandler) @@ -530,7 +530,7 @@ - (void)testingDownloadAllVariantsInternal:(void (^)(CLYRequestResult response, if (error) { - CLY_LOG_D(@"Fetch variants Request <%p> failed!\nError: %@", request, error); + CLY_LOG_D(@"%s, Fetch variants Request <%p> failed! Error: %@", __FUNCTION__, request, error); dispatch_async(dispatch_get_main_queue(), ^ { @@ -550,7 +550,7 @@ - (void)testingDownloadAllVariantsInternal:(void (^)(CLYRequestResult response, [task resume]; - CLY_LOG_D(@"Fetch variants Request <%p> started:\n[%@] %@", (id)request, request.HTTPMethod, request.URL.absoluteString); + CLY_LOG_D(@"%s, Fetch variants Request <%p> started [%@] %@", __FUNCTION__, (id)request, request.HTTPMethod, request.URL.absoluteString); } - (void)testingEnrollIntoVariant:(NSString *)key variantName:(NSString *)variantName completionHandler:(RCVariantCallback)completionHandler @@ -625,7 +625,7 @@ - (void)testingEnrollIntoVariantInternal:(NSString *)key variantName:(NSString * if (error) { - CLY_LOG_D(@"Enroll RC Variant Request <%p> failed!\nError: %@", request, error); + CLY_LOG_D(@"%s, Enroll RC Variant Request <%p> failed! Error: %@", __FUNCTION__, request, error); dispatch_async(dispatch_get_main_queue(), ^ { @@ -648,7 +648,7 @@ - (void)testingEnrollIntoVariantInternal:(NSString *)key variantName:(NSString * [task resume]; - CLY_LOG_D(@"Fetch variants Request <%p> started:\n[%@] %@", (id)request, request.HTTPMethod, request.URL.absoluteString); + CLY_LOG_D(@"%s, Fetch variants Request <%p> started: [%@] %@", __FUNCTION__, (id)request, request.HTTPMethod, request.URL.absoluteString); } - (NSURLRequest *)downloadVariantsRequest @@ -701,7 +701,7 @@ - (void) testingDownloadExperimentInformation:(RCVariantCallback)completionHandl if (!error) { self.localCachedExperiments = experimentInfo; - CLY_LOG_D(@"Download experiments info is successful. \n%@", experimentInfo); + CLY_LOG_D(@"%s, Download experiments info is successful. %@", __FUNCTION__,experimentInfo); } else @@ -755,7 +755,7 @@ - (void)testingDownloaExperimentInfoInternal:(void (^)(CLYRequestResult response if (error) { - CLY_LOG_D(@"Download experiments Request <%p> failed!\nError: %@", request, error); + CLY_LOG_D(@"%s, Download experiments Request <%p> failed! Error: %@", __FUNCTION__, request, error); dispatch_async(dispatch_get_main_queue(), ^ { @@ -775,7 +775,7 @@ - (void)testingDownloaExperimentInfoInternal:(void (^)(CLYRequestResult response [task resume]; - CLY_LOG_D(@"Download experiments Request <%p> started:\n[%@] %@", (id)request, request.HTTPMethod, request.URL.absoluteString); + CLY_LOG_D(@"%s, Download experiments Request <%p> started: [%@] %@", __FUNCTION__, (id)request, request.HTTPMethod, request.URL.absoluteString); } - (NSURLRequest *)downloadExperimentInfoRequest diff --git a/ios/src/CountlySDKLimitsConfig.h b/ios/src/CountlySDKLimitsConfig.h new file mode 100644 index 00000000..fa3d77f1 --- /dev/null +++ b/ios/src/CountlySDKLimitsConfig.h @@ -0,0 +1,36 @@ +// CountlySDKLimitsConfig.h +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. + + +#import + +extern const NSUInteger kCountlyMaxKeyLength; +extern const NSUInteger kCountlyMaxValueSize; +extern const NSUInteger kCountlyMaxBreadcrumbCount; +extern const NSUInteger kCountlyMaxSegmentationValues; +extern const NSUInteger kCountlyMaxStackTraceLineLength; +extern const NSUInteger kCountlyMaxStackTraceLinesPerThread; + + +@interface CountlySDKLimitsConfig : NSObject + +- (void)setMaxKeyLength:(NSUInteger)maxKeyLength; +- (void)setMaxValueSize:(NSUInteger)maxValueSize; +- (void)setMaxBreadcrumbCount:(NSUInteger)maxBreadcrumbCount; +- (void)setMaxSegmentationValues:(NSUInteger)maxSegmentationValues; +- (void)setMaxStackTraceLineLength:(NSUInteger)maxStackTraceLineLength; +- (void)setMaxStackTraceLinesPerThread:(NSUInteger)maxStackTraceLinesPerThread; + +- (NSUInteger)getMaxKeyLength; +- (NSUInteger)getMaxValueSize; +- (NSUInteger)getMaxBreadcrumbCount; +- (NSUInteger)getMaxSegmentationValues; +- (NSUInteger)getMaxStackTraceLineLength; +- (NSUInteger)getMaxStackTraceLinesPerThread; + + +@end + diff --git a/ios/src/CountlySDKLimitsConfig.m b/ios/src/CountlySDKLimitsConfig.m new file mode 100644 index 00000000..2a085e5c --- /dev/null +++ b/ios/src/CountlySDKLimitsConfig.m @@ -0,0 +1,104 @@ +// CountlySDKLimitsConfig.m +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. + +#import "CountlySDKLimitsConfig.h" +#import "CountlyCommon.h" + + +const NSUInteger kCountlyMaxKeyLength = 128; +const NSUInteger kCountlyMaxValueSize = 256; +const NSUInteger kCountlyMaxSegmentationValues = 100; +const NSUInteger kCountlyMaxBreadcrumbCount = 100; +const NSUInteger kCountlyMaxStackTraceLinesPerThread = 30; +const NSUInteger kCountlyMaxStackTraceLineLength = 200; + +@interface CountlySDKLimitsConfig () +{ + NSUInteger _maxKeyLength; + NSUInteger _maxValueSize; + NSUInteger _maxSegmentationValues; + NSUInteger _maxBreadcrumbCount; + NSUInteger _maxStackTraceLinesPerThread; + NSUInteger _maxStackTraceLineLength; +} +@end +@implementation CountlySDKLimitsConfig + +- (instancetype)init +{ + if (self = [super init]) + { + _maxKeyLength = kCountlyMaxKeyLength; + _maxValueSize = kCountlyMaxValueSize; + _maxSegmentationValues = kCountlyMaxSegmentationValues; + _maxBreadcrumbCount = kCountlyMaxBreadcrumbCount; + _maxStackTraceLinesPerThread = kCountlyMaxStackTraceLinesPerThread; + _maxStackTraceLineLength = kCountlyMaxStackTraceLineLength; + } + + return self; +} + +- (void)setMaxKeyLength:(NSUInteger)maxKeyLength +{ + _maxKeyLength = maxKeyLength; +} + +- (void)setMaxValueSize:(NSUInteger)maxValueSize +{ + _maxValueSize = maxValueSize; +} + +- (void)setMaxSegmentationValues:(NSUInteger)maxSegmentationValues +{ + _maxSegmentationValues = maxSegmentationValues; +} + +- (void)setMaxBreadcrumbCount:(NSUInteger)maxBreadcrumbCount +{ + _maxBreadcrumbCount = maxBreadcrumbCount; +} + +- (void)setMaxStackTraceLineLength:(NSUInteger)maxStackTraceLineLength +{ + _maxStackTraceLineLength = maxStackTraceLineLength; +} + +- (void)setMaxStackTraceLinesPerThread:(NSUInteger)maxStackTraceLinesPerThread +{ + _maxStackTraceLinesPerThread = maxStackTraceLinesPerThread; +} + +- (NSUInteger)getMaxKeyLength +{ + return _maxKeyLength; +} + +- (NSUInteger)getMaxValueSize +{ + return _maxValueSize; +} + +- (NSUInteger)getMaxSegmentationValues +{ + return _maxSegmentationValues; +} + +- (NSUInteger)getMaxBreadcrumbCount +{ + return _maxBreadcrumbCount; +} + +- (NSUInteger)getMaxStackTraceLineLength +{ + return _maxStackTraceLineLength; +} + +- (NSUInteger)getMaxStackTraceLinesPerThread +{ + return _maxStackTraceLinesPerThread; +} +@end diff --git a/ios/src/PrivacyInfo.xcprivacy b/ios/src/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..c735f528 --- /dev/null +++ b/ios/src/PrivacyInfo.xcprivacy @@ -0,0 +1,68 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + 7D9E.1 + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePerformanceData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCrashData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeDeviceID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyTrackingDomains + + NSPrivacyTracking + + + diff --git a/ios/src/Resettable.h b/ios/src/Resettable.h new file mode 100644 index 00000000..d8ad7ef8 --- /dev/null +++ b/ios/src/Resettable.h @@ -0,0 +1,14 @@ +// Resettable.h +// +// This code is provided under the MIT License. +// +// Please visit www.count.ly for more information. +#import + +@protocol Resettable + +@optional +- (void)resetInstance; +- (void)resetInstance:(BOOL) clearStorage; + +@end diff --git a/ios/src/include/CountlySDKLimitsConfig.h b/ios/src/include/CountlySDKLimitsConfig.h new file mode 100644 index 00000000..cdcf9a9a --- /dev/null +++ b/ios/src/include/CountlySDKLimitsConfig.h @@ -0,0 +1 @@ +../CountlySDKLimitsConfig.h \ No newline at end of file diff --git a/ios/src/include/Resettable.h b/ios/src/include/Resettable.h new file mode 100644 index 00000000..2fcb4360 --- /dev/null +++ b/ios/src/include/Resettable.h @@ -0,0 +1 @@ +../Resettable.h \ No newline at end of file From b09b64458a73f6ec5a1523f7b706ee1ca8f54a4f Mon Sep 17 00:00:00 2001 From: turtledreams Date: Thu, 11 Apr 2024 23:29:03 +0900 Subject: [PATCH 41/48] rn ios --- CountlyReactNative.podspec | 2 +- ios/src/CountlyReactNative.m | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CountlyReactNative.podspec b/CountlyReactNative.podspec index cbaf0a6a..d32be47c 100644 --- a/CountlyReactNative.podspec +++ b/CountlyReactNative.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CountlyReactNative' - s.version = '23.12.0' + s.version = '24.4.0' s.license = { :type => 'COMMUNITY', :text => <<-LICENSE diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index a371a7a7..499bb39b 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -24,7 +24,7 @@ @interface CountlyFeedbackWidget () + (CountlyFeedbackWidget *)createWithDictionary:(NSDictionary *)dictionary; @end -NSString *const kCountlyReactNativeSDKVersion = @"23.12.0"; +NSString *const kCountlyReactNativeSDKVersion = @"24.4.0"; NSString *const kCountlyReactNativeSDKName = @"js-rnb-ios"; CLYPushTestMode const CLYPushTestModeProduction = @"CLYPushTestModeProduction"; @@ -241,10 +241,13 @@ - (void) populateConfig:(id) json { NSNumber *sumNumber = [arguments objectForKey:@"s"]; float sumFloat = [sumNumber floatValue]; - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *dict = nil; NSArray *segments = [arguments objectForKey:@"g"]; - for (int i = 0, il = (int)segments.count; i < il; i += 2) { - dict[[segments objectAtIndex:i]] = [segments objectAtIndex:i + 1]; + if (segments != nil) { + dict = [[NSMutableDictionary alloc] init]; + for (int i = 0, il = (int)segments.count; i < il; i += 2) { + dict[[segments objectAtIndex:i]] = [segments objectAtIndex:i + 1]; + } } [[Countly sharedInstance] recordEvent:eventName segmentation:dict count:countInt sum:sumFloat]; }); From 3f5d5cf64c8d73bb2dcef61ba6d5aa7ca546f4f6 Mon Sep 17 00:00:00 2001 From: turtledreams Date: Fri, 12 Apr 2024 00:06:56 +0900 Subject: [PATCH 42/48] extend to end event --- ios/src/CountlyReactNative.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ios/src/CountlyReactNative.m b/ios/src/CountlyReactNative.m index 499bb39b..81a511f5 100644 --- a/ios/src/CountlyReactNative.m +++ b/ios/src/CountlyReactNative.m @@ -469,10 +469,13 @@ + (void)log:(NSString *)theMessage { NSNumber *sumNumber = [arguments objectForKey:@"s"]; float sumFloat = [sumNumber floatValue]; - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *dict = nil; NSArray *segments = [arguments objectForKey:@"g"]; - for (int i = 0, il = (int)segments.count; i < il; i += 2) { - dict[[segments objectAtIndex:i]] = [segments objectAtIndex:i + 1]; + if (segments != nil) { + dict = [[NSMutableDictionary alloc] init]; + for (int i = 0, il = (int)segments.count; i < il; i += 2) { + dict[[segments objectAtIndex:i]] = [segments objectAtIndex:i + 1]; + } } [[Countly sharedInstance] endEvent:eventName segmentation:dict count:countInt sum:sumFloat]; }); From d9fe6d36aba0b1912c8a92196ee0f240cd62542c Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:17:56 +0900 Subject: [PATCH 43/48] added radix --- Countly.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Countly.js b/Countly.js index a2313350..f7e4b72d 100644 --- a/Countly.js +++ b/Countly.js @@ -154,7 +154,7 @@ Countly.sendEvent = function (options) { // previous implementation was not clear about the data types of eventCount and eventSum // here parse them to make sure they are in correct format for the new method // parser will return a false value (NaN) in case of invalid data (like undefined, null, empty string, etc.) - options.eventCount = parseInt(options.eventCount) || 1; + options.eventCount = parseInt(options.eventCount, 10) || 1; options.eventSum = parseFloat(options.eventSum) || 0; Countly.events.recordEvent(options.eventName, options.segments, options.eventCount, options.eventSum); @@ -778,7 +778,7 @@ Countly.endEvent = function (options) { // previous implementation was not clear about the data types of eventCount and eventSum // here parse them to make sure they are in correct format for the new method // parser will return a false value (NaN) in case of invalid data (like undefined, null, empty string, etc.) - options.eventCount = parseInt(options.eventCount) || 1; + options.eventCount = parseInt(options.eventCount, 10) || 1; options.eventSum = parseFloat(options.eventSum) || 0; Countly.events.endEvent(options.eventName, options.segments, options.eventCount, options.eventSum); }; @@ -907,7 +907,7 @@ Countly.userData.incrementBy = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userData_incrementBy([keyName, intValue]); }; @@ -934,7 +934,7 @@ Countly.userData.multiply = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userData_multiply([keyName, intValue]); }; @@ -961,7 +961,7 @@ Countly.userData.saveMax = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userData_saveMax([keyName, intValue]); }; @@ -988,7 +988,7 @@ Countly.userData.saveMin = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userData_saveMin([keyName, intValue]); }; @@ -1251,7 +1251,7 @@ Countly.userDataBulk.incrementBy = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userDataBulk_incrementBy([keyName, intValue]); }; @@ -1279,7 +1279,7 @@ Countly.userDataBulk.multiply = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userDataBulk_multiply([keyName, intValue]); }; @@ -1307,7 +1307,7 @@ Countly.userDataBulk.saveMax = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userDataBulk_saveMax([keyName, intValue]); }; @@ -1335,7 +1335,7 @@ Countly.userDataBulk.saveMin = async function (keyName, keyValue) { if (message) { return message; } - const intValue = parseInt(keyValue).toString(); + const intValue = parseInt(keyValue, 10).toString(); await CountlyReactNative.userDataBulk_saveMin([keyName, intValue]); }; From 44c78dfe66e489b0aa43cf9c5b7fe553518b0f8e Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:47:47 +0900 Subject: [PATCH 44/48] changelog ipdate --- CHANGELOG.md | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbca3023..1e1cd50b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,30 @@ -## X.X.X +## 24.4.0 * ! Minor breaking change ! Tracking of foreground and background time for APM is disabled by default -* Added 'disableAdditionalIntentRedirectionChecks' config method +* Added `disableAdditionalIntentRedirectionChecks` config method * Added a new metric for detecting whether or not a device has a hinge for Android -* Added four new APM configuration options under the 'apm' interface of 'CountlyConfig': - * 'enableForegroundBackgroundTracking' for enabling automatic F/B time tracking - * 'enableAppStartTimeTracking' for enabling automatic app launch time tracking (Android only) - * 'enableManualAppLoadedTrigger' for enabling the manipulation of app load time finished timestamp - * 'setAppStartTimestampOverride' for enabling the manipulation of app load time starting timestamp - -Deprecated 'enableApm' config option. Use instead 'apm.enableAppStartTimeTracking'. (for iOS also 'enableForegroundBackgroundTracking' must be used) - -* Fixed a bug in `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` where those functions would produce a "Property 'callback' doesn't exist", if they are called before initializing the SDK. - -* Added new Event interface (`Countly.events`) on the SDK interface that exposes the event calls. -* Deprecated the old events methods. - -* Updated the underlying Android SDK version to 24.x.x -* Updated the underlying iOS SDK version to 24.x.x +* Added four new APM configuration options under the `CountlyConfig.apm` interface: + * `enableForegroundBackgroundTracking` for enabling automatic F/B time tracking + * `enableAppStartTimeTracking` for enabling automatic app launch time tracking (Android only) + * `enableManualAppLoadedTrigger` for enabling the manipulation of app load time finished timestamp + * `setAppStartTimestampOverride` for enabling the manipulation of app load time starting timestamp +* Added a new Event interface (`Countly.events`) that groups event related calls: + * `recordEvent` for recording an event + * `startEvent` for starting a timed event + * `cancelEvent` for canceling an ongoing timed event + * `endEvent` for ending a timed event and record it + +* Mitigated an issue with `getRemoteConfigValueForKeyP` and `remoteConfigClearValues` happening when they were called before initializing the SDK + +* Deprecated `enableApm` config option. Use `apm.enableAppStartTimeTracking` instead (for iOS also `enableForegroundBackgroundTracking` must be used) +* Deprecated the old events methods: + * `sendEvent` use `Countly.events.recordEvent` instead + * `startEvent` use `Countly.events.startEvent` instead + * `cancelEvent` use `Countly.events.cancelEvent` instead + * `endEvent` use `Countly.events.endEvent` instead + +* Updated the underlying Android SDK version to 24.4.0 +* Updated the underlying iOS SDK version to 24.4.0 ## 23.12.0 * Added TS type declerations to the SDK From 105bec94ac90ed766e49b1340e41ee69d3d43c76 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Fri, 12 Apr 2024 01:00:37 +0900 Subject: [PATCH 45/48] typo --- Countly.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Countly.js b/Countly.js index f7e4b72d..89d11a9e 100644 --- a/Countly.js +++ b/Countly.js @@ -141,7 +141,7 @@ Countly.hasBeenCalledOnStart = function () { */ Countly.sendEvent = function (options) { if (!_state.isInitialized) { - const msg = "'init' must be called before 'recordView'"; + const msg = "'init' must be called before 'sendEvent'"; L.w(`sendEvent, ${msg}`); return msg; } From 0b9f064d74a8f68efd69fa0923a4db05b2f04d14 Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Fri, 12 Apr 2024 01:04:18 +0900 Subject: [PATCH 46/48] segmentation --- Countly.d.ts | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index 071aac28..78ab8da6 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -67,17 +67,17 @@ declare module "countly-sdk-react-native-bridge" { import type CountlyConfig from "countly-sdk-react-native-bridge/CountlyConfig"; namespace Countly { - serverUrl: string; - appKey: string; - eventEmitter: any; - CountlyReactNative: any; - _isCrashReportingEnabled: boolean; - _isInitialized: boolean; - _isPushInitialized: boolean; - widgetShownCallbackName: string; - widgetClosedCallbackName: string; - ratingWidgetCallbackName: string; - pushNotificationCallbackName: string; + string; + string; + any; + any; + boolean; + boolean; + boolean; + string; + string; + string; + string; export const TemporaryDeviceIDString: string; export interface messagingMode { DEVELOPMENT: string; @@ -140,7 +140,7 @@ declare module "countly-sdk-react-native-bridge" { * @param {number} eventSum - A numerical value that is attached to this event (Will be summed up on the dashboard for all events with the same name) * @return {void} */ - export function recordEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; + export function recordEvent(eventName: string, segmentation?: Segmentation, eventCount?: number, eventSum?: number): void; /** * @@ -164,7 +164,7 @@ declare module "countly-sdk-react-native-bridge" { * @param {number} eventSum - A numerical value that is attached to this event (Will be summed up on the dashboard for all events with the same name) * @return {void} void */ - export function endEvent(eventName: string, segments?: Segmentation, eventCount?: number, eventSum?: number): void; + export function endEvent(eventName: string, segmentation?: Segmentation, eventCount?: number, eventSum?: number): void; /** * @@ -1086,11 +1086,11 @@ declare module "countly-sdk-react-native-bridge" { * @return {string | void} error message or void */ export function setCustomMetrics(customMetric: CustomMetric): string | void; - validateUserDataValue: ValidationFunction; - validateUserDataType: ValidationFunction; - validateValidUserData: ValidationFunction; - validateParseInt: ValidationFunction; - logWarning: (functionName: string, warning: string) => Promise; + ValidationFunction; + ValidationFunction; + ValidationFunction; + ValidationFunction; + (functionName: string, warning: string) => Promise; } export default Countly; From 7adfa3c3a231d109adf4dd76fd396febdda2fe4e Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:39:42 +0900 Subject: [PATCH 47/48] Deprecation number fix --- Countly.d.ts | 2 +- CountlyConfig.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Countly.d.ts b/Countly.d.ts index 78ab8da6..015e1860 100644 --- a/Countly.d.ts +++ b/Countly.d.ts @@ -1220,7 +1220,7 @@ declare module "countly-sdk-react-native-bridge/CountlyConfig" { enableParameterTamperingProtection(tamperingProtectionSalt: string): CountlyConfig; /** - * @deprecated in 24.1.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. + * @deprecated in 24.4.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. * * Method to enable application performance monitoring which includes the recording of app start time. */ diff --git a/CountlyConfig.js b/CountlyConfig.js index 2214b19b..1f8395d7 100644 --- a/CountlyConfig.js +++ b/CountlyConfig.js @@ -131,7 +131,7 @@ class CountlyConfig { } /** - * @deprecated in 24.1.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. + * @deprecated in 24.4.0 : use 'countlyConfig.apm' interface instead of 'config.enableApm'. * * Method to enable application performance monitoring which includes the recording of app start time. */ From c31a838f5408dac1a66614b24acb56349a64390c Mon Sep 17 00:00:00 2001 From: ijunaid Date: Wed, 17 Apr 2024 12:12:04 +0500 Subject: [PATCH 48/48] Update iOS sdk missing things --- ios/src/Countly.xcodeproj/project.pbxproj | 181 +++++++++++++++++- .../CountlyTests/CountlyBaseTestCase.swift | 42 ++++ .../CountlyTests-Bridging-Header.h | 1 + ios/src/CountlyTests/CountlyTests.swift | 67 +++++++ ios/src/Package.swift | 9 +- ios/src/include/CountlySDKLimitsConfig.h | 0 ios/src/include/Resettable.h | 0 7 files changed, 295 insertions(+), 5 deletions(-) create mode 100644 ios/src/CountlyTests/CountlyBaseTestCase.swift create mode 100644 ios/src/CountlyTests/CountlyTests-Bridging-Header.h create mode 100644 ios/src/CountlyTests/CountlyTests.swift mode change 100644 => 120000 ios/src/include/CountlySDKLimitsConfig.h mode change 100644 => 120000 ios/src/include/Resettable.h diff --git a/ios/src/Countly.xcodeproj/project.pbxproj b/ios/src/Countly.xcodeproj/project.pbxproj index fcfd3bff..a76ecdf4 100644 --- a/ios/src/Countly.xcodeproj/project.pbxproj +++ b/ios/src/Countly.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ @@ -16,11 +16,18 @@ 1A423E9E2A271E46008C4757 /* CountlyRCData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A423E9D2A271E46008C4757 /* CountlyRCData.m */; }; 1A423EA02A271FE0008C4757 /* CountlyRCData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A423E9F2A271E52008C4757 /* CountlyRCData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1A478D032AB314750056A5E7 /* CountlyExperimentInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A50D7052B3C5AA3009C6938 /* CountlyBaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A50D7042B3C5AA3009C6938 /* CountlyBaseTestCase.swift */; }; + 1A5C4C972B35B0850032EE1F /* CountlyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A5C4C962B35B0850032EE1F /* CountlyTests.swift */; }; + 1A5C4C982B35B0850032EE1F /* Countly.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B20A9822245225A00E3D7AE /* Countly.framework */; platformFilters = (ios, macos, ); }; 1A9027FE2AB197B50044EBCF /* CountlyExperimentInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */; }; 1ACA5DC12A309E7F001F770B /* CountlyRemoteConfigInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ACA5DBF2A309E7F001F770B /* CountlyRemoteConfigInternal.h */; }; 1ACA5DC22A309E7F001F770B /* CountlyRemoteConfigInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACA5DC02A309E7F001F770B /* CountlyRemoteConfigInternal.m */; }; + 1AFD79022B3EF82C00772FBD /* CountlyTests-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFD79012B3EF82C00772FBD /* CountlyTests-Bridging-Header.h */; }; + 3948A8572BAC2E7D002D09AA /* CountlySDKLimitsConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 3948A8552BAC2E7D002D09AA /* CountlySDKLimitsConfig.m */; }; + 3948A8582BAC2E7D002D09AA /* CountlySDKLimitsConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 3948A8562BAC2E7D002D09AA /* CountlySDKLimitsConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 39527E152B5FD27400EE5D7B /* CountlyAPMConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 39527E142B5FD27400EE5D7B /* CountlyAPMConfig.m */; }; 39527E182B5FD54C00EE5D7B /* CountlyAPMConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 39527E162B5FD28900EE5D7B /* CountlyAPMConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 39911B672B457DBB00AC053C /* Resettable.h in Headers */ = {isa = PBXBuildFile; fileRef = 39911B662B457DB500AC053C /* Resettable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3B20A9872245225A00E3D7AE /* Countly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B20A9852245225A00E3D7AE /* Countly.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3B20A9B22245228700E3D7AE /* CountlyConnectionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B20A98D2245228300E3D7AE /* CountlyConnectionManager.h */; }; 3B20A9B32245228700E3D7AE /* CountlyNotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B20A98E2245228300E3D7AE /* CountlyNotificationService.m */; }; @@ -59,6 +66,16 @@ D2CFEF982545FBE80026B044 /* CountlyFeedbacks.m in Sources */ = {isa = PBXBuildFile; fileRef = D2CFEF962545FBE80026B044 /* CountlyFeedbacks.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 1A5C4C992B35B0850032EE1F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3B20A9792245225A00E3D7AE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3B20A9812245225A00E3D7AE; + remoteInfo = Countly; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 1A3110622A7128CD001CB507 /* CountlyViewData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyViewData.m; sourceTree = ""; }; 1A3110642A7128DC001CB507 /* CountlyViewData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyViewData.h; sourceTree = ""; }; @@ -68,12 +85,20 @@ 1A3A576429ED47B50041B7BE /* CountlyServerConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyServerConfig.h; sourceTree = ""; }; 1A423E9D2A271E46008C4757 /* CountlyRCData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyRCData.m; sourceTree = ""; }; 1A423E9F2A271E52008C4757 /* CountlyRCData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyRCData.h; sourceTree = ""; }; + 1A50D7042B3C5AA3009C6938 /* CountlyBaseTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountlyBaseTestCase.swift; sourceTree = ""; }; + 1A5C4C942B35B0850032EE1F /* CountlyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountlyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A5C4C962B35B0850032EE1F /* CountlyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountlyTests.swift; sourceTree = ""; }; 1A9027FD2AB197B50044EBCF /* CountlyExperimentInformation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyExperimentInformation.m; sourceTree = ""; }; 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyExperimentInformation.h; sourceTree = ""; }; 1ACA5DBF2A309E7F001F770B /* CountlyRemoteConfigInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlyRemoteConfigInternal.h; sourceTree = ""; }; 1ACA5DC02A309E7F001F770B /* CountlyRemoteConfigInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlyRemoteConfigInternal.m; sourceTree = ""; }; + 1AFD79012B3EF82C00772FBD /* CountlyTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CountlyTests-Bridging-Header.h"; sourceTree = ""; }; + 3948A8552BAC2E7D002D09AA /* CountlySDKLimitsConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountlySDKLimitsConfig.m; sourceTree = ""; }; + 3948A8562BAC2E7D002D09AA /* CountlySDKLimitsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountlySDKLimitsConfig.h; sourceTree = ""; }; 39527E142B5FD27400EE5D7B /* CountlyAPMConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CountlyAPMConfig.m; sourceTree = ""; }; 39527E162B5FD28900EE5D7B /* CountlyAPMConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CountlyAPMConfig.h; sourceTree = ""; }; + 395683372BB2988300C7A06B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + 39911B662B457DB500AC053C /* Resettable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Resettable.h; sourceTree = ""; }; 3B20A9822245225A00E3D7AE /* Countly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Countly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B20A9852245225A00E3D7AE /* Countly.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Countly.h; sourceTree = ""; }; 3B20A9862245225A00E3D7AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -115,6 +140,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1A5C4C912B35B0850032EE1F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A5C4C982B35B0850032EE1F /* Countly.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3B20A97F2245225A00E3D7AE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -125,9 +158,23 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1A5C4C952B35B0850032EE1F /* CountlyTests */ = { + isa = PBXGroup; + children = ( + 1A5C4C962B35B0850032EE1F /* CountlyTests.swift */, + 1A50D7042B3C5AA3009C6938 /* CountlyBaseTestCase.swift */, + 1AFD79012B3EF82C00772FBD /* CountlyTests-Bridging-Header.h */, + ); + path = CountlyTests; + sourceTree = ""; + }; 3B20A9782245225A00E3D7AE = { isa = PBXGroup; children = ( + 395683372BB2988300C7A06B /* PrivacyInfo.xcprivacy */, + 3948A8562BAC2E7D002D09AA /* CountlySDKLimitsConfig.h */, + 3948A8552BAC2E7D002D09AA /* CountlySDKLimitsConfig.m */, + 39911B662B457DB500AC053C /* Resettable.h */, 39527E162B5FD28900EE5D7B /* CountlyAPMConfig.h */, 39527E142B5FD27400EE5D7B /* CountlyAPMConfig.m */, 1A9027FF2AB197C00044EBCF /* CountlyExperimentInformation.h */, @@ -179,6 +226,7 @@ 3B20A9A72245228500E3D7AE /* CountlyViewTrackingInternal.h */, 3B20A9A32245228500E3D7AE /* CountlyViewTrackingInternal.m */, 3B20A9862245225A00E3D7AE /* Info.plist */, + 1A5C4C952B35B0850032EE1F /* CountlyTests */, 3B20A9832245225A00E3D7AE /* Products */, ); sourceTree = ""; @@ -187,6 +235,7 @@ isa = PBXGroup; children = ( 3B20A9822245225A00E3D7AE /* Countly.framework */, + 1A5C4C942B35B0850032EE1F /* CountlyTests.xctest */, ); name = Products; sourceTree = ""; @@ -194,6 +243,14 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 1AFD78FC2B3EF63D00772FBD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AFD79022B3EF82C00772FBD /* CountlyTests-Bridging-Header.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3B20A97D2245225A00E3D7AE /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -210,8 +267,10 @@ 1A3A576529ED47BD0041B7BE /* CountlyServerConfig.h in Headers */, 1ACA5DC12A309E7F001F770B /* CountlyRemoteConfigInternal.h in Headers */, 3B20A9CC2245228700E3D7AE /* CountlyViewTrackingInternal.h in Headers */, + 3948A8582BAC2E7D002D09AA /* CountlySDKLimitsConfig.h in Headers */, 3B20A9BF2245228700E3D7AE /* CountlyLocationManager.h in Headers */, D219374B248AC71C00E5798B /* CountlyPerformanceMonitoring.h in Headers */, + 39911B672B457DBB00AC053C /* Resettable.h in Headers */, 3B20A9BC2245228700E3D7AE /* CountlyCommon.h in Headers */, 39527E182B5FD54C00EE5D7B /* CountlyAPMConfig.h in Headers */, 3B20A9C52245228700E3D7AE /* CountlyCrashReporter.h in Headers */, @@ -229,6 +288,25 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 1A5C4C932B35B0850032EE1F /* CountlyTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A5C4C9B2B35B0850032EE1F /* Build configuration list for PBXNativeTarget "CountlyTests" */; + buildPhases = ( + 1AFD78FC2B3EF63D00772FBD /* Headers */, + 1A5C4C902B35B0850032EE1F /* Sources */, + 1A5C4C912B35B0850032EE1F /* Frameworks */, + 1A5C4C922B35B0850032EE1F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1A5C4C9A2B35B0850032EE1F /* PBXTargetDependency */, + ); + name = CountlyTests; + productName = CountlyTests; + productReference = 1A5C4C942B35B0850032EE1F /* CountlyTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 3B20A9812245225A00E3D7AE /* Countly */ = { isa = PBXNativeTarget; buildConfigurationList = 3B20A98A2245225A00E3D7AE /* Build configuration list for PBXNativeTarget "Countly" */; @@ -253,11 +331,16 @@ 3B20A9792245225A00E3D7AE /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 1410; LastUpgradeCheck = 1410; ORGANIZATIONNAME = "Alin Radut"; TargetAttributes = { + 1A5C4C932B35B0850032EE1F = { + CreatedOnToolsVersion = 14.1; + }; 3B20A9812245225A00E3D7AE = { CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1410; }; }; }; @@ -275,11 +358,19 @@ projectRoot = ""; targets = ( 3B20A9812245225A00E3D7AE /* Countly */, + 1A5C4C932B35B0850032EE1F /* CountlyTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1A5C4C922B35B0850032EE1F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3B20A9802245225A00E3D7AE /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -290,6 +381,15 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1A5C4C902B35B0850032EE1F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A5C4C972B35B0850032EE1F /* CountlyTests.swift in Sources */, + 1A50D7052B3C5AA3009C6938 /* CountlyBaseTestCase.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3B20A97E2245225A00E3D7AE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -303,6 +403,7 @@ 3B20A9CE2245228700E3D7AE /* CountlyCrashReporter.m in Sources */, 3B20A9D42245228700E3D7AE /* CountlyPersistency.m in Sources */, 3B20A9B32245228700E3D7AE /* CountlyNotificationService.m in Sources */, + 3948A8572BAC2E7D002D09AA /* CountlySDKLimitsConfig.m in Sources */, D2CFEF982545FBE80026B044 /* CountlyFeedbacks.m in Sources */, 1A3110632A7128CD001CB507 /* CountlyViewData.m in Sources */, 1A423E9E2A271E46008C4757 /* CountlyRCData.m in Sources */, @@ -324,7 +425,67 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1A5C4C9A2B35B0850032EE1F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilters = ( + ios, + macos, + ); + target = 3B20A9812245225A00E3D7AE /* Countly */; + targetProxy = 1A5C4C992B35B0850032EE1F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 1A5C4C9C2B35B0850032EE1F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.1; + MACOSX_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.countly.CountlyTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OBJC_BRIDGING_HEADER = "CountlyTests/CountlyTests-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1A5C4C9D2B35B0850032EE1F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.1; + MACOSX_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.countly.CountlyTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OBJC_BRIDGING_HEADER = "CountlyTests/CountlyTests-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 3B20A9882245225A00E3D7AE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -456,6 +617,7 @@ 3B20A98B2245225A00E3D7AE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; @@ -472,12 +634,14 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 24.1.0; + MARKETING_VERSION = 24.4.0; PRODUCT_BUNDLE_IDENTIFIER = ly.count.CountlyiOSSDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; name = Debug; @@ -485,6 +649,7 @@ 3B20A98C2245225A00E3D7AE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; @@ -501,12 +666,13 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 24.1.0; + MARKETING_VERSION = 24.4.0; PRODUCT_BUNDLE_IDENTIFIER = ly.count.CountlyiOSSDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; name = Release; @@ -514,6 +680,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1A5C4C9B2B35B0850032EE1F /* Build configuration list for PBXNativeTarget "CountlyTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A5C4C9C2B35B0850032EE1F /* Debug */, + 1A5C4C9D2B35B0850032EE1F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 3B20A97C2245225A00E3D7AE /* Build configuration list for PBXProject "Countly" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ios/src/CountlyTests/CountlyBaseTestCase.swift b/ios/src/CountlyTests/CountlyBaseTestCase.swift new file mode 100644 index 00000000..fde220b4 --- /dev/null +++ b/ios/src/CountlyTests/CountlyBaseTestCase.swift @@ -0,0 +1,42 @@ +// +// CountlyBaseTestCase.swift +// CountlyTests +// +// Created by Muhammad Junaid Akram on 27/12/2023. +// Copyright © 2023 Alin Radut. All rights reserved. +// + +import XCTest +@testable import Countly + +class CountlyBaseTestCase: XCTestCase { + var countly: Countly! + var deviceID: String = "" + let appKey: String = "appkey" + var host: String = "https://test.count.ly/" + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + cleanupState() + } + + func createBaseConfig() -> CountlyConfig { + let config: CountlyConfig = CountlyConfig() + config.appKey = appKey + config.host = host + config.enableDebug = true + config.features = [CLYFeature.crashReporting]; + return config + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func cleanupState() { + Countly.sharedInstance().halt(true) + } + +} + + diff --git a/ios/src/CountlyTests/CountlyTests-Bridging-Header.h b/ios/src/CountlyTests/CountlyTests-Bridging-Header.h new file mode 100644 index 00000000..d744d0d9 --- /dev/null +++ b/ios/src/CountlyTests/CountlyTests-Bridging-Header.h @@ -0,0 +1 @@ +#import "CountlyCommon.h" diff --git a/ios/src/CountlyTests/CountlyTests.swift b/ios/src/CountlyTests/CountlyTests.swift new file mode 100644 index 00000000..d1289132 --- /dev/null +++ b/ios/src/CountlyTests/CountlyTests.swift @@ -0,0 +1,67 @@ +// +// CountlyTests.swift +// CountlyTests +// +// Created by Muhammad Junaid Akram on 22/12/2023. +// Copyright © 2023 Alin Radut. All rights reserved. +// + +import XCTest +@testable import Countly + + +class CountlyTests: CountlyBaseTestCase { + + // MARK: - Configuration Tests + + func testReInitWithDeviceId() throws { + let config = createBaseConfig() + // No Device ID provided during init + Countly.sharedInstance().start(with: config); + + let sdkGeneratedDeviceID = Countly.sharedInstance().deviceID() + XCTAssertTrue(CountlyCommon.sharedInstance().hasStarted, "Countly initialization failed.") + XCTAssertTrue(Countly.sharedInstance().deviceIDType() == CLYDeviceIDType.IDFV, "Countly deviced id type should be IDFV when no device id is provided during init.") + Countly.sharedInstance().halt(false) + XCTAssertTrue(!CountlyCommon.sharedInstance().hasStarted, "Countly halt failed.") + + let deviceID = String(Int.random(in: 0..<100)) + + let newConfig = createBaseConfig() + newConfig.deviceID = deviceID + Countly.sharedInstance().start(with: newConfig); + + XCTAssertTrue(CountlyCommon.sharedInstance().hasStarted, "Countly initialization failed.") + XCTAssertTrue(Countly.sharedInstance().deviceID() == sdkGeneratedDeviceID, "Countly device id not match with provided device id.") + XCTAssertTrue(Countly.sharedInstance().deviceIDType() == CLYDeviceIDType.IDFV, "Countly deviced id type should be custom when device id is provided during init.") + } + + func testPerformanceExample() async throws { + // This is an example of a performance test case. + measure { + // Put the code you want to measure the time of here. + } + } + + + func checkPersistentValues() { + let countlyPersistency = CountlyPersistency.sharedInstance() + if(countlyPersistency != nil) { + if let queuedRequests = CountlyPersistency.sharedInstance().value(forKey: "queuedRequests") as? NSMutableArray, + let recordedEvents = CountlyPersistency.sharedInstance().value(forKey: "recordedEvents") as? NSMutableArray, + let startedEvents = CountlyPersistency.sharedInstance().value(forKey: "startedEvents") as? NSMutableDictionary, + let isQueueBeingModified = CountlyPersistency.sharedInstance().value(forKey: "isQueueBeingModified") as? Bool { + print("Successfully access private properties.") + + + } + else { + print("Failed to access private properties.") + } + } + + } +} + + + diff --git a/ios/src/Package.swift b/ios/src/Package.swift index a37185d1..70ecfc6f 100644 --- a/ios/src/Package.swift +++ b/ios/src/Package.swift @@ -33,11 +33,12 @@ let package = Package( "Info.plist", "Countly.podspec", "Countly-PL.podspec", - "LICENSE.md", + "LICENSE", "README.md", "countly_dsym_uploader.sh", "CHANGELOG.md", - "SECURITY.md" + "SECURITY.md", + "CountlyTests/" ], linkerSettings: @@ -53,5 +54,9 @@ let package = Package( .linkedFramework("WebKit", .when(platforms: [.iOS])), .linkedFramework("CoreTelephony", .when(platforms: [.iOS])), ]), + .testTarget( + name: "CountlyTests", + dependencies: ["Countly"] + ), ] ) diff --git a/ios/src/include/CountlySDKLimitsConfig.h b/ios/src/include/CountlySDKLimitsConfig.h deleted file mode 100644 index cdcf9a9a..00000000 --- a/ios/src/include/CountlySDKLimitsConfig.h +++ /dev/null @@ -1 +0,0 @@ -../CountlySDKLimitsConfig.h \ No newline at end of file diff --git a/ios/src/include/CountlySDKLimitsConfig.h b/ios/src/include/CountlySDKLimitsConfig.h new file mode 120000 index 00000000..cdcf9a9a --- /dev/null +++ b/ios/src/include/CountlySDKLimitsConfig.h @@ -0,0 +1 @@ +../CountlySDKLimitsConfig.h \ No newline at end of file diff --git a/ios/src/include/Resettable.h b/ios/src/include/Resettable.h deleted file mode 100644 index 2fcb4360..00000000 --- a/ios/src/include/Resettable.h +++ /dev/null @@ -1 +0,0 @@ -../Resettable.h \ No newline at end of file diff --git a/ios/src/include/Resettable.h b/ios/src/include/Resettable.h new file mode 120000 index 00000000..2fcb4360 --- /dev/null +++ b/ios/src/include/Resettable.h @@ -0,0 +1 @@ +../Resettable.h \ No newline at end of file