diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 00000000..e42e22e5 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "uac2-7d0f9" + } +} diff --git a/.gitignore b/.gitignore index 892d7ac9..f99cbc8b 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ app.*.map.json /windows/flutter/generated_plugin_registrant.cc /windows/flutter/generated_plugin_registrant.h /windows/flutter/generated_plugins.cmake +/lib/firebase_options.dart +/firebase.json diff --git a/android/app/build.gradle b/android/app/build.gradle index 67c2953a..987709b9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -13,12 +13,12 @@ if (flutterRoot == null) { def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { - flutterVersionCode = '1' + flutterVersionCode = '2' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = '0.2.0' } apply plugin: 'com.android.application' @@ -32,7 +32,7 @@ if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { - compileSdkVersion rootProject.ext.compileSdkVersion + compileSdkVersion 34 ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -72,7 +72,7 @@ android { // Signing with the debug keys for now, so `flutter run --release` works. minifyEnabled true shrinkResources true - signingConfig signingConfigs.debug + signingConfig signingConfigs.release } } } diff --git a/android/app/google-services.json b/android/app/google-services.json index b487a8d6..c4b99b50 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -49,43 +49,6 @@ ] } } - }, - { - "client_info": { - "mobilesdk_app_id": "1:127901953489:android:02cb55ff82004bb03fc4f0", - "android_client_info": { - "package_name": "com.example.ultimate_alarm_clock" - } - }, - "oauth_client": [ - { - "client_id": "127901953489-09r774m4cup6mlt341i2v9fpbhngmq2h.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.example.ultimate_alarm_clock", - "certificate_hash": "30bf4033c248d9a3ecccbe3615c8baec5f4ed31a" - } - }, - { - "client_id": "127901953489-lnsmj324f5eutudkjvaidotj99bq1l47.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCEaWUdYF_PnGFu0uJL8Zl_BlT8knDVeHg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "127901953489-lnsmj324f5eutudkjvaidotj99bq1l47.apps.googleusercontent.com", - "client_type": 3 - } - ] - } - } } ], "configuration_version": "1" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ed1ec3df..c213a79a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -19,6 +19,8 @@ + + @@ -46,6 +48,7 @@ android:name="com.ccextractor.ultimate_alarm_clock.ScreenMonitorService" android:enabled="true" android:exported="true"> + + ? { +fun getLatestAlarm(db: SQLiteDatabase, wantNextAlarm: Boolean, profile: String): Map? { val now = Calendar.getInstance() var nowInMinutes = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE) + var nowInSeconds = nowInMinutes * 60 + now.get(Calendar.SECOND) if (wantNextAlarm) { nowInMinutes++ } - val currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK) + val currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1 val currentTime = SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date()) + Log.d("d","cd ${currentDay}") + val cursor = db.rawQuery( """ SELECT * FROM alarms WHERE isEnabled = 1 - AND alarmTime > ? - AND ((isOneTime = 0 AND (days NOT LIKE '%1%' OR SUBSTR(days, ?, 1) = '1')) OR (isOneTime = 1 AND SUBSTR(days, ?, 4) = 'true')) - ORDER BY ABS(minutesSinceMidnight - ?) ASC - LIMIT 1 - """, - arrayOf(currentTime, currentDay.toString(), currentDay.toString(), nowInMinutes.toString()) + AND (profile = ? OR ringOn = 1) + """, arrayOf(profile) ) + var selectedAlarm = null; + Log.d("Alarm", cursor.count.toString()) - return if (cursor.moveToFirst()) { + return if (cursor.count>0) { // Parse the cursor into an AlarmModel object - val alarm = AlarmModel.fromCursor(cursor) - cursor.close() - Log.d("Alarm", alarm.alarmTime) - val latestAlarmTimeOftheDay = stringToTimeOfDay(alarm.alarmTime) - val intervaltoAlarm = getMillisecondsToAlarm(LocalTime.now(), latestAlarmTimeOftheDay) - Log.d("a", "${alarm.weatherTypes} ") - - mapOf( - "interval" to intervaltoAlarm, - "isActivity" to alarm.activityMonitor, - "isLocation" to alarm.isLocationEnabled, - "location" to alarm.location, - "isWeather" to alarm.isWeatherEnabled, - "weatherTypes" to alarm.weatherTypes - ) - } else { - cursor.close() - val selectAllQuery = """ - SELECT * FROM alarms - WHERE isEnabled = 1 - AND alarmTime > ? - """ - val allAlarmsCursor = db.rawQuery(selectAllQuery, arrayOf(currentTime)) - if (allAlarmsCursor.moveToFirst()) { - val alarms = ArrayList() - val alarmDetails = ArrayList>() - do { - var k = 0 - for (i in 0..6) { - val dayIndex = ((currentDay - 1) + i) % 6 - if (AlarmModel.fromCursor(allAlarmsCursor).days[dayIndex] == '1') { - k = i - break + cursor.moveToFirst() + var alarm = AlarmModel.fromCursor(cursor) + var intervaltoAlarm = Long.MAX_VALUE + var setAlarm: AlarmModel? =null + do { + alarm = AlarmModel.fromCursor(cursor) + if (alarm.ringOn == 0) { + + var dayfromToday = 0 + var timeDif = getTimeDifferenceInMillis(alarm.alarmTime) + Log.d("d","timeDiff ${timeDif}") + + if ((alarm.days[currentDay] == '1' || alarm.days=="0000000") && timeDif > -1L) { + if (timeDif < intervaltoAlarm) { + intervaltoAlarm = timeDif + setAlarm = alarm + } + } else { + dayfromToday = getDaysUntilNextAlarm(alarm.days, currentDay) + if (dayfromToday == 0) { + + if(alarm.days=="0000000") + { + + var timeDif = + getTimeDifferenceFromMidnight(alarm.alarmTime) + getMillisecondsUntilMidnight() + if (timeDif < intervaltoAlarm && timeDif > -1L ) { + intervaltoAlarm = timeDif + setAlarm = alarm + } + } + else{ + + var timeDif = + getTimeDifferenceFromMidnight(alarm.alarmTime) + getMillisecondsUntilMidnight() + 86400000 * 6 + if (timeDif < intervaltoAlarm && timeDif > -1L ) { + intervaltoAlarm = timeDif + setAlarm = alarm + } + } + } else if (dayfromToday == 1) { + var timeDif = + getTimeDifferenceFromMidnight(alarm.alarmTime) + getMillisecondsUntilMidnight() + Log.d("d","timeDiff ${timeDif}") + + if (timeDif < intervaltoAlarm && timeDif > -1L) { + intervaltoAlarm = timeDif + setAlarm = alarm + } + } else { + var timeDif = + getTimeDifferenceFromMidnight(alarm.alarmTime) + getMillisecondsUntilMidnight() + 86400000 * (dayfromToday - 1) + if (timeDif < intervaltoAlarm && timeDif > -1L) { + intervaltoAlarm = timeDif + setAlarm = alarm + } } } - val latestAlarmTimeOftheDay = - stringToTimeOfDay(AlarmModel.fromCursor(allAlarmsCursor).alarmTime) - val intervaltoAlarm = - getMillisecondsToAlarm(LocalTime.now(), latestAlarmTimeOftheDay) - if (k != 0) { - alarms.add(intervaltoAlarm + (86400000 * (k)).toLong()) - alarmDetails.add( - mapOf( - "interval" to intervaltoAlarm, - "isActivity" to AlarmModel.fromCursor(allAlarmsCursor).activityMonitor, - "isLocation" to AlarmModel.fromCursor(allAlarmsCursor).isLocationEnabled, - "location" to AlarmModel.fromCursor(allAlarmsCursor).location, - "isWeather" to AlarmModel.fromCursor(allAlarmsCursor).isWeatherEnabled, - "weatherTypes" to AlarmModel.fromCursor(allAlarmsCursor).weatherTypes - ) - ) - } - else - { - alarms.add(intervaltoAlarm + (86400000 * (7)).toLong()) - alarmDetails.add( - mapOf( - "interval" to intervaltoAlarm, - "isActivity" to AlarmModel.fromCursor(allAlarmsCursor).activityMonitor, - "isLocation" to AlarmModel.fromCursor(allAlarmsCursor).isLocationEnabled, - "location" to AlarmModel.fromCursor(allAlarmsCursor).location, - "isWeather" to AlarmModel.fromCursor(allAlarmsCursor).isWeatherEnabled, - "weatherTypes" to AlarmModel.fromCursor(allAlarmsCursor).weatherTypes - ) - ) + } else { + val dayfromToday = getDaysFromCurrentDate(alarm.alarmDate) + if (dayfromToday == 0L) { + var timeDif = getTimeDifferenceInMillis(alarm.alarmTime) + if (alarm.days[currentDay] == '1' && timeDif > -1L) { + if (timeDif < intervaltoAlarm) { + intervaltoAlarm = timeDif + setAlarm = alarm + } + } + } else if (dayfromToday == 1L) { + var timeDif = + getTimeDifferenceFromMidnight(alarm.alarmTime) + getMillisecondsUntilMidnight() + if (timeDif < intervaltoAlarm) { + intervaltoAlarm = timeDif + setAlarm = alarm + } + } else { + + var timeDif = + getTimeDifferenceFromMidnight(alarm.alarmTime) + getMillisecondsUntilMidnight() + 86400000 * (dayfromToday - 1) + if (timeDif < intervaltoAlarm && timeDif > -1L) { + intervaltoAlarm = timeDif + setAlarm = alarm + } } - } while (allAlarmsCursor.moveToNext()) - allAlarmsCursor.close() + } + + } while (cursor.moveToNext()) + cursor.close() + if (setAlarm != null) { + Log.d("Alarm", intervaltoAlarm.toString()) + val a = mapOf( + "interval" to intervaltoAlarm, + "isActivity" to setAlarm.activityMonitor, + "isLocation" to setAlarm.isLocationEnabled, + "location" to setAlarm.location, + "isWeather" to setAlarm.isWeatherEnabled, + "weatherTypes" to setAlarm.weatherTypes + ) + Log.d("s","sdsd ${a}") + return a + } + null + } else { + null + } +} + + +fun getTimeDifferenceInMillis(timeString: String): Long { + // Define the time format + val timeFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) + + // Get the current time + val currentTime = Calendar.getInstance() + + // Parse the received time string into a Date object + val receivedTime: Date? = timeFormat.parse(timeString) - alarms.sortWith(Comparator { a, b -> - a.compareTo(b) + // Create a Calendar object for the received time + val receivedCalendar = Calendar.getInstance().apply { + time = receivedTime!! + set(Calendar.YEAR, currentTime.get(Calendar.YEAR)) // Set the same day as today + set(Calendar.MONTH, currentTime.get(Calendar.MONTH)) + set(Calendar.DAY_OF_MONTH, currentTime.get(Calendar.DAY_OF_MONTH)) + } - }) - val sortedList = alarmDetails.sortedBy { it["interval"] as? String } - Log.d("Alarm", "${sortedList.first()["interval"]}") - sortedList.first() + // Compare the received time with the current time + return if (receivedCalendar.after(currentTime)) { + receivedCalendar.timeInMillis - currentTime.timeInMillis + } else { + -1 // Return -1 if the received time is less than or equal to current time + } +} + + +fun getDaysUntilNextAlarm(alarmDays: String, currentDay: Int): Int { + // Validate that the alarmDays string has exactly 7 characters + if (alarmDays.length != 7) { + throw IllegalArgumentException("The alarmDays string must have exactly 7 characters") + } + // Convert the string into a list of integers (0 or 1) representing the alarm status for each day + val alarms = alarmDays.map { it.toString().toInt() } - } else { - null + // Loop through the days starting from the current day to find the next "on" (1) + for (i in 0 until 7) { + val dayToCheck = (currentDay + i) % 7 // Wrap around the week using modulo + if (alarms[dayToCheck] == 1) { + return i // Return the number of days until the next alarm is on } } + + // If no alarms are on in the week, return -1 + return 0 +} + +fun getTimeDifferenceFromMidnight(timeString: String): Long { + // Define the time format + val timeFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) + + // Parse the received time string into a Date object + val receivedTime: Date? = timeFormat.parse(timeString) + + // Get the reference time for midnight ("00:00") + val midnight = Calendar.getInstance().apply { + set(Calendar.HOUR_OF_DAY, 0) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + } + + // Create a Calendar object for the received time + val receivedCalendar = Calendar.getInstance().apply { + time = receivedTime!! + set(Calendar.YEAR, midnight.get(Calendar.YEAR)) // Keep the same day (midnight) + set(Calendar.MONTH, midnight.get(Calendar.MONTH)) + set(Calendar.DAY_OF_MONTH, midnight.get(Calendar.DAY_OF_MONTH)) + } + + // Return the difference between the received time and midnight in milliseconds + return receivedCalendar.timeInMillis - midnight.timeInMillis } -fun stringToTimeOfDay(time: String): LocalTime { - val parts = time.split(":") - val hour = parts[0].toInt() - val minute = parts[1].toInt() - return LocalTime.of(hour, minute) +fun getMillisecondsUntilMidnight(): Long { + // Get the current time + val currentTime = Calendar.getInstance() + + // Create a Calendar object for the next midnight + val nextMidnight = Calendar.getInstance().apply { + add(Calendar.DAY_OF_MONTH, 1) // Move to the next day + set(Calendar.HOUR_OF_DAY, 0) // Set the time to midnight + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + } + + // Calculate the difference in milliseconds + return nextMidnight.timeInMillis - currentTime.timeInMillis } -fun getMillisecondsToAlarm(now: LocalTime, alarmTime: LocalTime): Long { - var adjustedAlarmTime = alarmTime - val duration = Duration.between(now, adjustedAlarmTime) - return duration.toMillis() +fun getDaysFromCurrentDate(dateString: String): Long { + // Define the date format + val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) + + // Parse the received date string into a Date object + val receivedDate: Date? = dateFormat.parse(dateString) + + // Get the current date + val currentDate = Calendar.getInstance().apply { + set(Calendar.HOUR_OF_DAY, 0) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.time + + // Ensure received date is not null + if (receivedDate == null) { + throw IllegalArgumentException("Invalid date format") + } + + // Calculate the difference in milliseconds between the two dates + val differenceInMillis = receivedDate.time - currentDate.time + + // If the received date is in the past, return -1 + if (differenceInMillis < 0) { + return -1 + } + + // Convert the difference in milliseconds to days + return TimeUnit.MILLISECONDS.toDays(differenceInMillis) } + data class AlarmModel( val id: Int, val minutesSinceMidnight: Int, @@ -142,9 +282,13 @@ data class AlarmModel( val isWeatherEnabled: Int, val weatherTypes: String, val isLocationEnabled: Int, - val location: String + val location: String, + val alarmDate: String, + val alarmId: String, + val ringOn: Int ) { companion object { + @SuppressLint("Range") fun fromCursor(cursor: Cursor): AlarmModel { val id = cursor.getInt(cursor.getColumnIndex("id")) val minutesSinceMidnight = cursor.getInt(cursor.getColumnIndex("minutesSinceMidnight")) @@ -156,6 +300,9 @@ data class AlarmModel( val weatherTypes = cursor.getString(cursor.getColumnIndex("weatherTypes")) val isLocationEnabled = cursor.getInt(cursor.getColumnIndex("isLocationEnabled")) val location = cursor.getString(cursor.getColumnIndex("location")) + val alarmDate = cursor.getString(cursor.getColumnIndex("alarmDate")) + val alarmId = cursor.getString(cursor.getColumnIndex("alarmID")) + val ringOn = cursor.getInt(cursor.getColumnIndex("ringOn")) return AlarmModel( id, minutesSinceMidnight, @@ -166,7 +313,10 @@ data class AlarmModel( isWeatherEnabled, weatherTypes, isLocationEnabled, - location + location, + alarmDate, + alarmId, + ringOn ) } } diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt index f0a3b563..e5c72433 100644 --- a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt @@ -92,7 +92,10 @@ class MainActivity : FlutterActivity() { println("FLUTTER CALLED SCHEDULE") val dbHelper = DatabaseHelper(context) val db = dbHelper.readableDatabase - val ringTime = getLatestAlarm(db, true) + val sharedPreferences = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE) + val profile = sharedPreferences.getString("flutter.profile", "Default") + val ringTime = getLatestAlarm(db, true, profile?: "Default") + Log.d("yay yay", "yay ${ringTime?:"null"}") if (ringTime != null) { android.util.Log.d("yay", "yay ${ringTime["interval"]}") Log.d("yay", "yay ${ringTime["isLocation"]}") diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/ScreenMonitorService.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/ScreenMonitorService.kt index cff24dc0..af2b91e8 100644 --- a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/ScreenMonitorService.kt +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/ScreenMonitorService.kt @@ -1,5 +1,4 @@ package com.ccextractor.ultimate_alarm_clock - import android.app.Service import android.content.BroadcastReceiver import android.content.Context diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/Utilities/SpotifyPlayerService.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/Utilities/SpotifyPlayerService.kt new file mode 100644 index 00000000..5cc8f055 --- /dev/null +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/Utilities/SpotifyPlayerService.kt @@ -0,0 +1,24 @@ +package com.ccextractor.ultimate_alarm_clock + +import android.app.Service +import android.content.Intent +import android.net.Uri +import android.os.IBinder + + +class SpotifyPlayerService : Service() { + + + override fun onBind(p0: Intent?): IBinder? { + TODO("Not yet implemented") + } + + override fun onCreate() { + super.onCreate() + val spotifyIntent = + Intent(Intent.ACTION_VIEW, Uri.parse("spotify:playlist:37i9dQZF1DXaTIN6XNquoW:play")) + startActivity(spotifyIntent) + + } + +} \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 41672498..a6738207 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -android.enableR8=true \ No newline at end of file +android.enableR8=true diff --git a/assets/images/GC.svg b/assets/images/GC.svg new file mode 100644 index 00000000..7f74652d --- /dev/null +++ b/assets/images/GC.svg @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/functions/.eslintrc.js b/functions/.eslintrc.js new file mode 100644 index 00000000..f4cb76ca --- /dev/null +++ b/functions/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + env: { + es6: true, + node: true, + }, + parserOptions: { + "ecmaVersion": 2018, + }, + extends: [ + "eslint:recommended", + "google", + ], + rules: { + "no-restricted-globals": ["error", "name", "length"], + "prefer-arrow-callback": "error", + "quotes": ["error", "double", {"allowTemplateLiterals": true}], + }, + overrides: [ + { + files: ["**/*.spec.*"], + env: { + mocha: true, + }, + rules: {}, + }, + ], + globals: {}, +}; diff --git a/functions/.gitignore b/functions/.gitignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/functions/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/functions/index.js b/functions/index.js new file mode 100644 index 00000000..fc352b4e --- /dev/null +++ b/functions/index.js @@ -0,0 +1,30 @@ +const functions = require('firebase-functions'); +const admin = require('firebase-admin'); +const {onCall, HttpsError} = require("firebase-functions/v2/https"); +const {logger} = require("firebase-functions/v2"); +admin.initializeApp(); + + +exports.sendNotificationOnDataChange = functions.firestore + .document('your_collection/{docId}') + .onUpdate((change, context) => { + const newValue = change.after.data(); + const previousValue = change.before.data(); + + // Check if the data has changed + if (newValue.someField !== previousValue.someField) { + const userEmail = newValue.userEmail; + return admin.firestore().collection('user').doc(userEmail).get() + .then(userDoc => { + const userToken = userDoc.data().token; + const payload = { + notification: { + title: 'Data Changed', + body: 'The data has been updated.', + } + }; + return admin.messaging().sendToDevice(userToken, payload); + }); + } + return null; + }); diff --git a/functions/package-lock.json b/functions/package-lock.json new file mode 100644 index 00000000..90650b76 --- /dev/null +++ b/functions/package-lock.json @@ -0,0 +1,6912 @@ +{ + "name": "functions", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "functions", + "dependencies": { + "firebase-admin": "^11.8.0", + "firebase-functions": "^4.3.1" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0", + "firebase-functions-test": "^3.1.0" + }, + "engines": { + "node": "18" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "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/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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, + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "peer": true + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "devOptional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "devOptional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/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, + "peer": true + }, + "node_modules/@babel/highlight/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, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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, + "peer": 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, + "peer": 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, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "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, + "peer": 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, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.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, + "peer": 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.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "devOptional": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "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, + "peer": true + }, + "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/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", + "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", + "dependencies": { + "text-decoding": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/component": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "dependencies": { + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", + "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", + "dependencies": { + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", + "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/database": "0.14.4", + "@firebase/database-types": "0.10.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", + "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.3" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-6.8.0.tgz", + "integrity": "sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^3.5.7", + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz", + "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", + "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", + "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@google-cloud/storage": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.12.0.tgz", + "integrity": "sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==", + "optional": true, + "dependencies": { + "@google-cloud/paginator": "^3.0.7", + "@google-cloud/projectify": "^3.0.0", + "@google-cloud/promisify": "^3.0.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "compressible": "^2.0.12", + "duplexify": "^4.0.0", + "ent": "^2.2.0", + "extend": "^3.0.2", + "fast-xml-parser": "^4.2.2", + "gaxios": "^5.0.0", + "google-auth-library": "^8.0.1", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "retry-request": "^5.0.0", + "teeny-request": "^8.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@google-cloud/storage/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==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.22", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.22.tgz", + "integrity": "sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.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.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "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, + "peer": 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/load-nyc-config/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, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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, + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "peer": true, + "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, + "peer": 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, + "peer": 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/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "peer": 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/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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/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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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/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, + "peer": 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/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", + "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "optional": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "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/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "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, + "peer": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "peer": 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, + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "peer": 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.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", + "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "optional": true, + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "peer": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "optional": true + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "optional": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "optional": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "optional": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "optional": true + }, + "node_modules/@types/node": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", + "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", + "optional": true, + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "peer": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "peer": true + }, + "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==", + "optional": 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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "devOptional": 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==", + "devOptional": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.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/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, + "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/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, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "devOptional": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "optional": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "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, + "peer": 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-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, + "peer": 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-istanbul/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, + "peer": 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/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, + "peer": 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-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, + "peer": 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-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, + "peer": 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==", + "devOptional": 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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "optional": true + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "peer": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "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" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "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, + "peer": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "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, + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "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" + } + ], + "peer": true + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "optional": true, + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": 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/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, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true, + "peer": true + }, + "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==", + "devOptional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "peer": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "peer": true + }, + "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==", + "devOptional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "devOptional": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "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, + "peer": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "peer": 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/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/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peer": 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==", + "devOptional": 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, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "dev": true, + "peer": 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, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==", + "devOptional": 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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "optional": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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, + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "devOptional": 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==" + }, + "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/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "optional": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "optional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "optional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "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-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==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "devOptional": 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/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "devOptional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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==", + "devOptional": 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==", + "devOptional": 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==", + "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==", + "optional": 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, + "peer": 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, + "peer": 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, + "peer": 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/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "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==", + "devOptional": true + }, + "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==", + "devOptional": true + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "optional": true + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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, + "peer": 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.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==" + }, + "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/firebase-admin": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.11.1.tgz", + "integrity": "sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==", + "dependencies": { + "@fastify/busboy": "^1.2.1", + "@firebase/database-compat": "^0.3.4", + "@firebase/database-types": "^0.10.4", + "@types/node": ">=12.12.47", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.0.1", + "node-forge": "^1.3.1", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^6.8.0", + "@google-cloud/storage": "^6.9.5" + } + }, + "node_modules/firebase-functions": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.9.0.tgz", + "integrity": "sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==", + "dependencies": { + "@types/cors": "^2.8.5", + "@types/express": "4.17.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "protobufjs": "^7.2.2" + }, + "bin": { + "firebase-functions": "lib/bin/firebase-functions.js" + }, + "engines": { + "node": ">=14.10.0" + }, + "peerDependencies": { + "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" + } + }, + "node_modules/firebase-functions-test": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-3.3.0.tgz", + "integrity": "sha512-X+OOA34MGrsTimFXTDnWT0psAqnmBkJ85bGCoLMwjgei5Prfkqh3bv5QASnXC/cmIVBSF2Qw9uW1+mF/t3kFlw==", + "dev": true, + "dependencies": { + "@types/lodash": "^4.14.104", + "lodash": "^4.17.5", + "ts-deepmerge": "^2.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "firebase-functions": ">=4.9.0", + "jest": ">=28.0.0" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "devOptional": 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" + ], + "peer": true, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "optional": true + }, + "node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "optional": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "peer": 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==", + "devOptional": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "peer": 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, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-gax": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz", + "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "~1.8.0", + "@grpc/proto-loader": "^0.7.0", + "@types/long": "^4.0.0", + "@types/rimraf": "^3.0.2", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^8.0.2", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^1.0.0", + "protobufjs": "7.2.4", + "protobufjs-cli": "1.1.1", + "retry-request": "^5.0.0" + }, + "bin": { + "compileProtos": "build/tools/compileProtos.js", + "minifyProtoJson": "build/tools/minify.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-gax/node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "deprecated": "Package is no longer maintained", + "optional": true, + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "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==", + "devOptional": 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/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "optional": true, + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "peer": 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==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "peer": 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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "devOptional": 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==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "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, + "peer": true + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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==", + "devOptional": 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, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": 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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "peer": 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-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, + "peer": 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.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "peer": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": 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-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, + "peer": 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-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, + "peer": 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-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "peer": 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-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "peer": 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, + "peer": 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-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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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-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, + "peer": 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-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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "peer": 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-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, + "peer": 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-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, + "peer": 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/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "peer": 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-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, + "peer": 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/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "peer": 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-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, + "peer": 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/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/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "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, + "peer": true + }, + "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/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "optional": true, + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", + "optional": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/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==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "optional": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": 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, + "peer": 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, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", + "dependencies": { + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", + "debug": "^4.3.4", + "jose": "^4.14.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jwks-rsa/node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "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, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "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, + "peer": 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/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "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, + "peer": true + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "optional": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "devOptional": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "optional": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "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.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "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, + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "optional": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "optional": true, + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "optional": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "optional": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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, + "peer": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "optional": 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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/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==", + "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, + "peer": 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==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "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/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "optional": 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-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "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, + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "peer": true + }, + "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, + "peer": 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, + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "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==", + "devOptional": 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, + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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, + "peer": 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, + "peer": 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==", + "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, + "peer": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "peer": 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, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "peer": 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, + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-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/pkg-dir/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, + "peer": true, + "dependencies": { + "p-limit": "^2.2.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/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, + "peer": 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, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto3-json-serializer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz", + "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==", + "optional": true, + "dependencies": { + "protobufjs": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs-cli": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", + "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", + "optional": true, + "dependencies": { + "chalk": "^4.0.0", + "escodegen": "^1.13.0", + "espree": "^9.0.0", + "estraverse": "^5.1.0", + "glob": "^8.0.0", + "jsdoc": "^4.0.0", + "minimist": "^1.2.0", + "semver": "^7.1.2", + "tmp": "^0.2.1", + "uglify-js": "^3.7.7" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "protobufjs": "^7.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/protobufjs-cli/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs-cli/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "optional": true + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "peer": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "peer": true + }, + "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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "optional": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "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, + "peer": 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, + "peer": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "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/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, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", + "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", + "optional": true, + "dependencies": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "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-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "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, + "peer": 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==", + "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==", + "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==" + }, + "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==", + "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==" + }, + "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==", + "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-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "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==" + }, + "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/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "peer": 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, + "peer": 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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "optional": true + }, + "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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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, + "peer": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": 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, + "peer": 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, + "peer": 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==", + "devOptional": 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==", + "optional": true + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "optional": true + }, + "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==", + "devOptional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/teeny-request": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", + "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", + "optional": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-decoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", + "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" + }, + "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/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "optional": true, + "engines": { + "node": ">=14.14" + } + }, + "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, + "peer": 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==", + "devOptional": 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, + "peer": 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==", + "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==", + "optional": true + }, + "node_modules/ts-deepmerge": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", + "integrity": "sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "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/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "optional": true + }, + "node_modules/uglify-js": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "optional": true + }, + "node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "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" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "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/uri-js/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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "optional": 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==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "peer": 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==", + "engines": { + "node": ">= 0.8" + } + }, + "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, + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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==", + "optional": true + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "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==", + "optional": 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/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "devOptional": 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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": 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, + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "optional": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "devOptional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "devOptional": 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==", + "devOptional": true, + "engines": { + "node": ">=12" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/functions/package.json b/functions/package.json new file mode 100644 index 00000000..a88bc5e2 --- /dev/null +++ b/functions/package.json @@ -0,0 +1,26 @@ +{ + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "18" + }, + "main": "index.js", + "dependencies": { + "firebase-admin": "^11.8.0", + "firebase-functions": "^4.3.1" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0", + "firebase-functions-test": "^3.1.0" + }, + "private": true +} diff --git a/lib/app/data/models/alarm_model.dart b/lib/app/data/models/alarm_model.dart index 5d8d9493..4bd43aad 100644 --- a/lib/app/data/models/alarm_model.dart +++ b/lib/app/data/models/alarm_model.dart @@ -5,6 +5,7 @@ import 'package:cloud_firestore/cloud_firestore.dart' as firestore; import 'package:isar/isar.dart'; import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + part 'alarm_model.g.dart'; @collection @@ -51,6 +52,13 @@ class AlarmModel { late double volMax; late double volMin; late int activityMonitor; + late String alarmDate; + late bool ringOn; + late String profile; + late bool isGuardian; + late int guardianTimer; + late String guardian; + late bool isCall; @ignore Map? offsetDetails; @@ -94,7 +102,14 @@ class AlarmModel { required this.showMotivationalQuote, required this.volMax, required this.volMin, - required this.activityMonitor}); + required this.activityMonitor, + required this.ringOn, + required this.alarmDate, + required this.profile, + required this.isGuardian, + required this.guardianTimer, + required this.guardian, + required this.isCall}); AlarmModel.fromDocumentSnapshot({ required firestore.DocumentSnapshot documentSnapshot, @@ -157,50 +172,66 @@ class AlarmModel { volMin = documentSnapshot['volMin']; activityMonitor = documentSnapshot['activityMonitor']; + alarmDate = documentSnapshot['alarmDate']; + profile = documentSnapshot['profile']; + + isGuardian = documentSnapshot['isGuardian']; + guardianTimer = documentSnapshot['guardianTimer']; + guardian = documentSnapshot['guardian']; + isCall = documentSnapshot['isCall']; } + AlarmModel fromMapSQFlite(Map map) { return AlarmModel( - alarmTime: map['alarmTime'], - alarmID: map['alarmID'], - isEnabled: map['isEnabled'] == 1, - isLocationEnabled: map['isLocationEnabled'] == 1, - isSharedAlarmEnabled: map['isSharedAlarmEnabled'] == 1, - isWeatherEnabled: map['isWeatherEnabled'] == 1, - location: map['location'], - activityInterval: map['activityInterval'], - minutesSinceMidnight: map['minutesSinceMidnight'], - days: stringToBoolList(map['days']), - weatherTypes: List.from(jsonDecode(map['weatherTypes'])), - isMathsEnabled: map['isMathsEnabled'] == 1, - mathsDifficulty: map['mathsDifficulty'], - numMathsQuestions: map['numMathsQuestions'], - isShakeEnabled: map['isShakeEnabled'] == 1, - shakeTimes: map['shakeTimes'], - isQrEnabled: map['isQrEnabled'] == 1, - qrValue: map['qrValue'], - isPedometerEnabled: map['isPedometerEnabled'] == 1, - numberOfSteps: map['numberOfSteps'], - intervalToAlarm: map['intervalToAlarm'], - isActivityEnabled: map['isActivityEnabled'] == 1, - sharedUserIds: map['sharedUserIds'] != null - ? List.from(jsonDecode(map['sharedUserIds'])) - : null, - ownerId: map['ownerId'], - ownerName: map['ownerName'], - lastEditedUserId: map['lastEditedUserId'], - mutexLock: map['mutexLock'] == 1, - mainAlarmTime: map['mainAlarmTime'], - label: map['label'], - isOneTime: map['isOneTime'] == 1, - snoozeDuration: map['snoozeDuration'], - gradient: map['gradient'], - ringtoneName: map['ringtoneName'], - note: map['note'], - deleteAfterGoesOff: map['deleteAfterGoesOff'] == 1, - showMotivationalQuote: map['showMotivationalQuote'] == 1, - volMin: map['volMin'], - volMax: map['volMax'], - activityMonitor: map['activityMonitor']); + alarmTime: map['alarmTime'], + alarmID: map['alarmID'], + isEnabled: map['isEnabled'] == 1, + isLocationEnabled: map['isLocationEnabled'] == 1, + isSharedAlarmEnabled: map['isSharedAlarmEnabled'] == 1, + isWeatherEnabled: map['isWeatherEnabled'] == 1, + location: map['location'], + activityInterval: map['activityInterval'], + minutesSinceMidnight: map['minutesSinceMidnight'], + days: stringToBoolList(map['days']), + weatherTypes: List.from(jsonDecode(map['weatherTypes'])), + isMathsEnabled: map['isMathsEnabled'] == 1, + mathsDifficulty: map['mathsDifficulty'], + numMathsQuestions: map['numMathsQuestions'], + isShakeEnabled: map['isShakeEnabled'] == 1, + shakeTimes: map['shakeTimes'], + isQrEnabled: map['isQrEnabled'] == 1, + qrValue: map['qrValue'], + isPedometerEnabled: map['isPedometerEnabled'] == 1, + numberOfSteps: map['numberOfSteps'], + intervalToAlarm: map['intervalToAlarm'], + isActivityEnabled: map['isActivityEnabled'] == 1, + sharedUserIds: map['sharedUserIds'] != null + ? List.from(jsonDecode(map['sharedUserIds'])) + : null, + ownerId: map['ownerId'], + ownerName: map['ownerName'], + lastEditedUserId: map['lastEditedUserId'], + mutexLock: map['mutexLock'] == 1, + mainAlarmTime: map['mainAlarmTime'], + label: map['label'], + isOneTime: map['isOneTime'] == 1, + snoozeDuration: map['snoozeDuration'], + gradient: map['gradient'], + ringtoneName: map['ringtoneName'], + note: map['note'], + deleteAfterGoesOff: map['deleteAfterGoesOff'] == 1, + showMotivationalQuote: map['showMotivationalQuote'] == 1, + volMin: map['volMin'], + volMax: map['volMax'], + activityMonitor: map['activityMonitor'], + alarmDate: map['alarmDate'], + profile: map['profile'], + isGuardian: map['isGuardian'] == 1, + guardianTimer: map['guardianTimer'], + guardian: map['guardian'], + isCall: map['isCall'] == 1, + ringOn: map['ringOn'] == 1, + ); } Map toSQFliteMap() { @@ -244,7 +275,14 @@ class AlarmModel { 'showMotivationalQuote': showMotivationalQuote ? 1 : 0, 'volMin': volMin, 'volMax': volMax, - 'activityMonitor' : activityMonitor + 'activityMonitor': activityMonitor, + 'alarmDate': alarmDate, + 'ringOn': ringOn ? 1 : 0, + 'profile': profile, + 'isGuardian': isGuardian ? 1 : 0, + 'guardianTimer': guardianTimer, + 'guardian': guardian, + 'isCall': isCall ? 1 : 0, }; } @@ -257,17 +295,17 @@ class AlarmModel { alarmTime = alarmData['alarmTime']; firestoreId = alarmData['firestoreId']; alarmID = alarmData['alarmID']; - sharedUserIds = alarmData['sharedUserIds']; + sharedUserIds = List.from(alarmData['sharedUserIds']); lastEditedUserId = alarmData['lastEditedUserId']; mutexLock = alarmData['mutexLock']; ownerId = alarmData['ownerId']; ownerName = alarmData['ownerName']; - days = alarmData['days']; + days = List.from(alarmData['days']); isEnabled = alarmData['isEnabled']; intervalToAlarm = alarmData['intervalToAlarm']; isActivityEnabled = alarmData['isActivityEnabled']; isWeatherEnabled = alarmData['isWeatherEnabled']; - weatherTypes = alarmData['weatherTypes']; + weatherTypes = List.from(alarmData['weatherTypes']); activityInterval = alarmData['activityInterval']; isLocationEnabled = alarmData['isLocationEnabled']; @@ -293,6 +331,13 @@ class AlarmModel { volMin = alarmData['volMin']; volMax = alarmData['volMax']; activityMonitor = alarmData['activityMonitor']; + alarmDate = alarmData['alarmDate']; + profile = alarmData['profile']; + isGuardian = alarmData['isGuardian']; + guardianTimer = alarmData['guardianTimer']; + guardian = alarmData['guardian']; + isCall = alarmData['isCall']; + ringOn = alarmData['ringOn']; } AlarmModel.fromJson(String alarmData, UserModel? user) { @@ -343,7 +388,14 @@ class AlarmModel { 'showMotivationalQuote': alarmRecord.showMotivationalQuote, 'volMin': alarmRecord.volMin, 'volMax': alarmRecord.volMax, - 'activityMonitor' : alarmRecord.activityMonitor + 'activityMonitor': alarmRecord.activityMonitor, + 'alarmDate': alarmRecord.alarmDate, + 'profile': alarmRecord.profile, + 'isGuardian': alarmRecord.isGuardian, + 'guardianTimer': alarmRecord.guardianTimer, + 'guardian': alarmRecord.guardian, + 'isCall': alarmRecord.isCall, + 'ringOn': alarmRecord.ringOn }; if (alarmRecord.isSharedAlarmEnabled) { diff --git a/lib/app/data/models/alarm_model.g.dart b/lib/app/data/models/alarm_model.g.dart index d42a0f12..4f95ab4a 100644 --- a/lib/app/data/models/alarm_model.g.dart +++ b/lib/app/data/models/alarm_model.g.dart @@ -27,193 +27,228 @@ const AlarmModelSchema = CollectionSchema( name: r'activityMonitor', type: IsarType.long, ), - r'alarmID': PropertySchema( + r'alarmDate': PropertySchema( id: 2, + name: r'alarmDate', + type: IsarType.string, + ), + r'alarmID': PropertySchema( + id: 3, name: r'alarmID', type: IsarType.string, ), r'alarmTime': PropertySchema( - id: 3, + id: 4, name: r'alarmTime', type: IsarType.string, ), r'days': PropertySchema( - id: 4, + id: 5, name: r'days', type: IsarType.boolList, ), r'deleteAfterGoesOff': PropertySchema( - id: 5, + id: 6, name: r'deleteAfterGoesOff', type: IsarType.bool, ), r'firestoreId': PropertySchema( - id: 6, + id: 7, name: r'firestoreId', type: IsarType.string, ), r'gradient': PropertySchema( - id: 7, + id: 8, name: r'gradient', type: IsarType.long, ), + r'guardian': PropertySchema( + id: 9, + name: r'guardian', + type: IsarType.string, + ), + r'guardianTimer': PropertySchema( + id: 10, + name: r'guardianTimer', + type: IsarType.long, + ), r'intervalToAlarm': PropertySchema( - id: 8, + id: 11, name: r'intervalToAlarm', type: IsarType.long, ), r'isActivityEnabled': PropertySchema( - id: 9, + id: 12, name: r'isActivityEnabled', type: IsarType.bool, ), + r'isCall': PropertySchema( + id: 13, + name: r'isCall', + type: IsarType.bool, + ), r'isEnabled': PropertySchema( - id: 10, + id: 14, name: r'isEnabled', type: IsarType.bool, ), + r'isGuardian': PropertySchema( + id: 15, + name: r'isGuardian', + type: IsarType.bool, + ), r'isLocationEnabled': PropertySchema( - id: 11, + id: 16, name: r'isLocationEnabled', type: IsarType.bool, ), r'isMathsEnabled': PropertySchema( - id: 12, + id: 17, name: r'isMathsEnabled', type: IsarType.bool, ), r'isOneTime': PropertySchema( - id: 13, + id: 18, name: r'isOneTime', type: IsarType.bool, ), r'isPedometerEnabled': PropertySchema( - id: 14, + id: 19, name: r'isPedometerEnabled', type: IsarType.bool, ), r'isQrEnabled': PropertySchema( - id: 15, + id: 20, name: r'isQrEnabled', type: IsarType.bool, ), r'isShakeEnabled': PropertySchema( - id: 16, + id: 21, name: r'isShakeEnabled', type: IsarType.bool, ), r'isSharedAlarmEnabled': PropertySchema( - id: 17, + id: 22, name: r'isSharedAlarmEnabled', type: IsarType.bool, ), r'isWeatherEnabled': PropertySchema( - id: 18, + id: 23, name: r'isWeatherEnabled', type: IsarType.bool, ), r'label': PropertySchema( - id: 19, + id: 24, name: r'label', type: IsarType.string, ), r'lastEditedUserId': PropertySchema( - id: 20, + id: 25, name: r'lastEditedUserId', type: IsarType.string, ), r'location': PropertySchema( - id: 21, + id: 26, name: r'location', type: IsarType.string, ), r'mainAlarmTime': PropertySchema( - id: 22, + id: 27, name: r'mainAlarmTime', type: IsarType.string, ), r'mathsDifficulty': PropertySchema( - id: 23, + id: 28, name: r'mathsDifficulty', type: IsarType.long, ), r'minutesSinceMidnight': PropertySchema( - id: 24, + id: 29, name: r'minutesSinceMidnight', type: IsarType.long, ), r'mutexLock': PropertySchema( - id: 25, + id: 30, name: r'mutexLock', type: IsarType.bool, ), r'note': PropertySchema( - id: 26, + id: 31, name: r'note', type: IsarType.string, ), r'numMathsQuestions': PropertySchema( - id: 27, + id: 32, name: r'numMathsQuestions', type: IsarType.long, ), r'numberOfSteps': PropertySchema( - id: 28, + id: 33, name: r'numberOfSteps', type: IsarType.long, ), r'ownerId': PropertySchema( - id: 29, + id: 34, name: r'ownerId', type: IsarType.string, ), r'ownerName': PropertySchema( - id: 30, + id: 35, name: r'ownerName', type: IsarType.string, ), + r'profile': PropertySchema( + id: 36, + name: r'profile', + type: IsarType.string, + ), r'qrValue': PropertySchema( - id: 31, + id: 37, name: r'qrValue', type: IsarType.string, ), + r'ringOn': PropertySchema( + id: 38, + name: r'ringOn', + type: IsarType.bool, + ), r'ringtoneName': PropertySchema( - id: 32, + id: 39, name: r'ringtoneName', type: IsarType.string, ), r'shakeTimes': PropertySchema( - id: 33, + id: 40, name: r'shakeTimes', type: IsarType.long, ), r'sharedUserIds': PropertySchema( - id: 34, + id: 41, name: r'sharedUserIds', type: IsarType.stringList, ), r'showMotivationalQuote': PropertySchema( - id: 35, + id: 42, name: r'showMotivationalQuote', type: IsarType.bool, ), r'snoozeDuration': PropertySchema( - id: 36, + id: 43, name: r'snoozeDuration', type: IsarType.long, ), r'volMax': PropertySchema( - id: 37, + id: 44, name: r'volMax', type: IsarType.double, ), r'volMin': PropertySchema( - id: 38, + id: 45, name: r'volMin', type: IsarType.double, ), r'weatherTypes': PropertySchema( - id: 39, + id: 46, name: r'weatherTypes', type: IsarType.longList, ) @@ -238,6 +273,7 @@ int _alarmModelEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; + bytesCount += 3 + object.alarmDate.length * 3; bytesCount += 3 + object.alarmID.length * 3; bytesCount += 3 + object.alarmTime.length * 3; bytesCount += 3 + object.days.length; @@ -247,6 +283,7 @@ int _alarmModelEstimateSize( bytesCount += 3 + value.length * 3; } } + bytesCount += 3 + object.guardian.length * 3; bytesCount += 3 + object.label.length * 3; bytesCount += 3 + object.lastEditedUserId.length * 3; bytesCount += 3 + object.location.length * 3; @@ -259,6 +296,7 @@ int _alarmModelEstimateSize( bytesCount += 3 + object.note.length * 3; bytesCount += 3 + object.ownerId.length * 3; bytesCount += 3 + object.ownerName.length * 3; + bytesCount += 3 + object.profile.length * 3; bytesCount += 3 + object.qrValue.length * 3; bytesCount += 3 + object.ringtoneName.length * 3; { @@ -285,44 +323,51 @@ void _alarmModelSerialize( ) { writer.writeLong(offsets[0], object.activityInterval); writer.writeLong(offsets[1], object.activityMonitor); - writer.writeString(offsets[2], object.alarmID); - writer.writeString(offsets[3], object.alarmTime); - writer.writeBoolList(offsets[4], object.days); - writer.writeBool(offsets[5], object.deleteAfterGoesOff); - writer.writeString(offsets[6], object.firestoreId); - writer.writeLong(offsets[7], object.gradient); - writer.writeLong(offsets[8], object.intervalToAlarm); - writer.writeBool(offsets[9], object.isActivityEnabled); - writer.writeBool(offsets[10], object.isEnabled); - writer.writeBool(offsets[11], object.isLocationEnabled); - writer.writeBool(offsets[12], object.isMathsEnabled); - writer.writeBool(offsets[13], object.isOneTime); - writer.writeBool(offsets[14], object.isPedometerEnabled); - writer.writeBool(offsets[15], object.isQrEnabled); - writer.writeBool(offsets[16], object.isShakeEnabled); - writer.writeBool(offsets[17], object.isSharedAlarmEnabled); - writer.writeBool(offsets[18], object.isWeatherEnabled); - writer.writeString(offsets[19], object.label); - writer.writeString(offsets[20], object.lastEditedUserId); - writer.writeString(offsets[21], object.location); - writer.writeString(offsets[22], object.mainAlarmTime); - writer.writeLong(offsets[23], object.mathsDifficulty); - writer.writeLong(offsets[24], object.minutesSinceMidnight); - writer.writeBool(offsets[25], object.mutexLock); - writer.writeString(offsets[26], object.note); - writer.writeLong(offsets[27], object.numMathsQuestions); - writer.writeLong(offsets[28], object.numberOfSteps); - writer.writeString(offsets[29], object.ownerId); - writer.writeString(offsets[30], object.ownerName); - writer.writeString(offsets[31], object.qrValue); - writer.writeString(offsets[32], object.ringtoneName); - writer.writeLong(offsets[33], object.shakeTimes); - writer.writeStringList(offsets[34], object.sharedUserIds); - writer.writeBool(offsets[35], object.showMotivationalQuote); - writer.writeLong(offsets[36], object.snoozeDuration); - writer.writeDouble(offsets[37], object.volMax); - writer.writeDouble(offsets[38], object.volMin); - writer.writeLongList(offsets[39], object.weatherTypes); + writer.writeString(offsets[2], object.alarmDate); + writer.writeString(offsets[3], object.alarmID); + writer.writeString(offsets[4], object.alarmTime); + writer.writeBoolList(offsets[5], object.days); + writer.writeBool(offsets[6], object.deleteAfterGoesOff); + writer.writeString(offsets[7], object.firestoreId); + writer.writeLong(offsets[8], object.gradient); + writer.writeString(offsets[9], object.guardian); + writer.writeLong(offsets[10], object.guardianTimer); + writer.writeLong(offsets[11], object.intervalToAlarm); + writer.writeBool(offsets[12], object.isActivityEnabled); + writer.writeBool(offsets[13], object.isCall); + writer.writeBool(offsets[14], object.isEnabled); + writer.writeBool(offsets[15], object.isGuardian); + writer.writeBool(offsets[16], object.isLocationEnabled); + writer.writeBool(offsets[17], object.isMathsEnabled); + writer.writeBool(offsets[18], object.isOneTime); + writer.writeBool(offsets[19], object.isPedometerEnabled); + writer.writeBool(offsets[20], object.isQrEnabled); + writer.writeBool(offsets[21], object.isShakeEnabled); + writer.writeBool(offsets[22], object.isSharedAlarmEnabled); + writer.writeBool(offsets[23], object.isWeatherEnabled); + writer.writeString(offsets[24], object.label); + writer.writeString(offsets[25], object.lastEditedUserId); + writer.writeString(offsets[26], object.location); + writer.writeString(offsets[27], object.mainAlarmTime); + writer.writeLong(offsets[28], object.mathsDifficulty); + writer.writeLong(offsets[29], object.minutesSinceMidnight); + writer.writeBool(offsets[30], object.mutexLock); + writer.writeString(offsets[31], object.note); + writer.writeLong(offsets[32], object.numMathsQuestions); + writer.writeLong(offsets[33], object.numberOfSteps); + writer.writeString(offsets[34], object.ownerId); + writer.writeString(offsets[35], object.ownerName); + writer.writeString(offsets[36], object.profile); + writer.writeString(offsets[37], object.qrValue); + writer.writeBool(offsets[38], object.ringOn); + writer.writeString(offsets[39], object.ringtoneName); + writer.writeLong(offsets[40], object.shakeTimes); + writer.writeStringList(offsets[41], object.sharedUserIds); + writer.writeBool(offsets[42], object.showMotivationalQuote); + writer.writeLong(offsets[43], object.snoozeDuration); + writer.writeDouble(offsets[44], object.volMax); + writer.writeDouble(offsets[45], object.volMin); + writer.writeLongList(offsets[46], object.weatherTypes); } AlarmModel _alarmModelDeserialize( @@ -334,45 +379,52 @@ AlarmModel _alarmModelDeserialize( final object = AlarmModel( activityInterval: reader.readLong(offsets[0]), activityMonitor: reader.readLong(offsets[1]), - alarmID: reader.readString(offsets[2]), - alarmTime: reader.readString(offsets[3]), - days: reader.readBoolList(offsets[4]) ?? [], - deleteAfterGoesOff: reader.readBool(offsets[5]), - gradient: reader.readLong(offsets[7]), - intervalToAlarm: reader.readLong(offsets[8]), - isActivityEnabled: reader.readBool(offsets[9]), - isEnabled: reader.readBoolOrNull(offsets[10]) ?? true, - isLocationEnabled: reader.readBool(offsets[11]), - isMathsEnabled: reader.readBool(offsets[12]), - isOneTime: reader.readBool(offsets[13]), - isPedometerEnabled: reader.readBool(offsets[14]), - isQrEnabled: reader.readBool(offsets[15]), - isShakeEnabled: reader.readBool(offsets[16]), - isSharedAlarmEnabled: reader.readBool(offsets[17]), - isWeatherEnabled: reader.readBool(offsets[18]), - label: reader.readString(offsets[19]), - lastEditedUserId: reader.readString(offsets[20]), - location: reader.readString(offsets[21]), - mainAlarmTime: reader.readStringOrNull(offsets[22]), - mathsDifficulty: reader.readLong(offsets[23]), - minutesSinceMidnight: reader.readLong(offsets[24]), - mutexLock: reader.readBool(offsets[25]), - note: reader.readString(offsets[26]), - numMathsQuestions: reader.readLong(offsets[27]), - numberOfSteps: reader.readLong(offsets[28]), - ownerId: reader.readString(offsets[29]), - ownerName: reader.readString(offsets[30]), - qrValue: reader.readString(offsets[31]), - ringtoneName: reader.readString(offsets[32]), - shakeTimes: reader.readLong(offsets[33]), - sharedUserIds: reader.readStringList(offsets[34]), - showMotivationalQuote: reader.readBool(offsets[35]), - snoozeDuration: reader.readLong(offsets[36]), - volMax: reader.readDouble(offsets[37]), - volMin: reader.readDouble(offsets[38]), - weatherTypes: reader.readLongList(offsets[39]) ?? [], + alarmDate: reader.readString(offsets[2]), + alarmID: reader.readString(offsets[3]), + alarmTime: reader.readString(offsets[4]), + days: reader.readBoolList(offsets[5]) ?? [], + deleteAfterGoesOff: reader.readBool(offsets[6]), + gradient: reader.readLong(offsets[8]), + guardian: reader.readString(offsets[9]), + guardianTimer: reader.readLong(offsets[10]), + intervalToAlarm: reader.readLong(offsets[11]), + isActivityEnabled: reader.readBool(offsets[12]), + isCall: reader.readBool(offsets[13]), + isEnabled: reader.readBoolOrNull(offsets[14]) ?? true, + isGuardian: reader.readBool(offsets[15]), + isLocationEnabled: reader.readBool(offsets[16]), + isMathsEnabled: reader.readBool(offsets[17]), + isOneTime: reader.readBool(offsets[18]), + isPedometerEnabled: reader.readBool(offsets[19]), + isQrEnabled: reader.readBool(offsets[20]), + isShakeEnabled: reader.readBool(offsets[21]), + isSharedAlarmEnabled: reader.readBool(offsets[22]), + isWeatherEnabled: reader.readBool(offsets[23]), + label: reader.readString(offsets[24]), + lastEditedUserId: reader.readString(offsets[25]), + location: reader.readString(offsets[26]), + mainAlarmTime: reader.readStringOrNull(offsets[27]), + mathsDifficulty: reader.readLong(offsets[28]), + minutesSinceMidnight: reader.readLong(offsets[29]), + mutexLock: reader.readBool(offsets[30]), + note: reader.readString(offsets[31]), + numMathsQuestions: reader.readLong(offsets[32]), + numberOfSteps: reader.readLong(offsets[33]), + ownerId: reader.readString(offsets[34]), + ownerName: reader.readString(offsets[35]), + profile: reader.readString(offsets[36]), + qrValue: reader.readString(offsets[37]), + ringOn: reader.readBool(offsets[38]), + ringtoneName: reader.readString(offsets[39]), + shakeTimes: reader.readLong(offsets[40]), + sharedUserIds: reader.readStringList(offsets[41]), + showMotivationalQuote: reader.readBool(offsets[42]), + snoozeDuration: reader.readLong(offsets[43]), + volMax: reader.readDouble(offsets[44]), + volMin: reader.readDouble(offsets[45]), + weatherTypes: reader.readLongList(offsets[46]) ?? [], ); - object.firestoreId = reader.readStringOrNull(offsets[6]); + object.firestoreId = reader.readStringOrNull(offsets[7]); object.isarId = id; return object; } @@ -393,27 +445,27 @@ P _alarmModelDeserializeProp

( case 3: return (reader.readString(offset)) as P; case 4: - return (reader.readBoolList(offset) ?? []) as P; + return (reader.readString(offset)) as P; case 5: - return (reader.readBool(offset)) as P; + return (reader.readBoolList(offset) ?? []) as P; case 6: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBool(offset)) as P; case 7: - return (reader.readLong(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 8: return (reader.readLong(offset)) as P; case 9: - return (reader.readBool(offset)) as P; + return (reader.readString(offset)) as P; case 10: - return (reader.readBoolOrNull(offset) ?? true) as P; + return (reader.readLong(offset)) as P; case 11: - return (reader.readBool(offset)) as P; + return (reader.readLong(offset)) as P; case 12: return (reader.readBool(offset)) as P; case 13: return (reader.readBool(offset)) as P; case 14: - return (reader.readBool(offset)) as P; + return (reader.readBoolOrNull(offset) ?? true) as P; case 15: return (reader.readBool(offset)) as P; case 16: @@ -423,46 +475,60 @@ P _alarmModelDeserializeProp

( case 18: return (reader.readBool(offset)) as P; case 19: - return (reader.readString(offset)) as P; + return (reader.readBool(offset)) as P; case 20: - return (reader.readString(offset)) as P; + return (reader.readBool(offset)) as P; case 21: - return (reader.readString(offset)) as P; + return (reader.readBool(offset)) as P; case 22: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBool(offset)) as P; case 23: - return (reader.readLong(offset)) as P; + return (reader.readBool(offset)) as P; case 24: - return (reader.readLong(offset)) as P; + return (reader.readString(offset)) as P; case 25: - return (reader.readBool(offset)) as P; + return (reader.readString(offset)) as P; case 26: return (reader.readString(offset)) as P; case 27: - return (reader.readLong(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 28: return (reader.readLong(offset)) as P; case 29: - return (reader.readString(offset)) as P; + return (reader.readLong(offset)) as P; case 30: - return (reader.readString(offset)) as P; + return (reader.readBool(offset)) as P; case 31: return (reader.readString(offset)) as P; case 32: - return (reader.readString(offset)) as P; + return (reader.readLong(offset)) as P; case 33: return (reader.readLong(offset)) as P; case 34: - return (reader.readStringList(offset)) as P; + return (reader.readString(offset)) as P; case 35: - return (reader.readBool(offset)) as P; + return (reader.readString(offset)) as P; case 36: - return (reader.readLong(offset)) as P; + return (reader.readString(offset)) as P; case 37: - return (reader.readDouble(offset)) as P; + return (reader.readString(offset)) as P; case 38: - return (reader.readDouble(offset)) as P; + return (reader.readBool(offset)) as P; case 39: + return (reader.readString(offset)) as P; + case 40: + return (reader.readLong(offset)) as P; + case 41: + return (reader.readStringList(offset)) as P; + case 42: + return (reader.readBool(offset)) as P; + case 43: + return (reader.readLong(offset)) as P; + case 44: + return (reader.readDouble(offset)) as P; + case 45: + return (reader.readDouble(offset)) as P; + case 46: return (reader.readLongList(offset) ?? []) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -676,6 +742,140 @@ extension AlarmModelQueryFilter }); } + QueryBuilder alarmDateEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder alarmDateLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder alarmDateBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'alarmDate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder alarmDateEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder alarmDateContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder alarmDateMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'alarmDate', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'alarmDate', + value: '', + )); + }); + } + + QueryBuilder + alarmDateIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'alarmDate', + value: '', + )); + }); + } + QueryBuilder alarmIDEqualTo( String value, { bool caseSensitive = true, @@ -1021,59 +1221,248 @@ extension AlarmModelQueryFilter }); } - QueryBuilder daysLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { + QueryBuilder daysLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder + deleteAfterGoesOffEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'deleteAfterGoesOff', + value: value, + )); + }); + } + + QueryBuilder + firestoreIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'firestoreId', + )); + }); + } + + QueryBuilder + firestoreIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'firestoreId', + )); + }); + } + + QueryBuilder + firestoreIdEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'firestoreId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'firestoreId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'firestoreId', + value: '', + )); + }); + } + + QueryBuilder + firestoreIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'firestoreId', + value: '', + )); + }); + } + + QueryBuilder gradientEqualTo( + int value) { return QueryBuilder.apply(this, (query) { - return query.listLength( - r'days', - lower, - includeLower, - upper, - includeUpper, - ); + return query.addFilterCondition(FilterCondition.equalTo( + property: r'gradient', + value: value, + )); }); } QueryBuilder - deleteAfterGoesOffEqualTo(bool value) { + gradientGreaterThan( + int value, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'deleteAfterGoesOff', + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'gradient', value: value, )); }); } - QueryBuilder - firestoreIdIsNull() { + QueryBuilder gradientLessThan( + int value, { + bool include = false, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'firestoreId', + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'gradient', + value: value, )); }); } - QueryBuilder - firestoreIdIsNotNull() { + QueryBuilder gradientBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'firestoreId', + return query.addFilterCondition(FilterCondition.between( + property: r'gradient', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, )); }); } - QueryBuilder - firestoreIdEqualTo( - String? value, { + QueryBuilder guardianEqualTo( + String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'firestoreId', + property: r'guardian', value: value, caseSensitive: caseSensitive, )); @@ -1081,48 +1470,46 @@ extension AlarmModelQueryFilter } QueryBuilder - firestoreIdGreaterThan( - String? value, { + guardianGreaterThan( + String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, - property: r'firestoreId', + property: r'guardian', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder - firestoreIdLessThan( - String? value, { + QueryBuilder guardianLessThan( + String value, { bool include = false, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, - property: r'firestoreId', + property: r'guardian', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder - firestoreIdBetween( - String? lower, - String? upper, { + QueryBuilder guardianBetween( + String lower, + String upper, { bool includeLower = true, bool includeUpper = true, bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( - property: r'firestoreId', + property: r'guardian', lower: lower, includeLower: includeLower, upper: upper, @@ -1133,49 +1520,50 @@ extension AlarmModelQueryFilter } QueryBuilder - firestoreIdStartsWith( + guardianStartsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.startsWith( - property: r'firestoreId', + property: r'guardian', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder - firestoreIdEndsWith( + QueryBuilder guardianEndsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.endsWith( - property: r'firestoreId', + property: r'guardian', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder - firestoreIdContains(String value, {bool caseSensitive = true}) { + QueryBuilder guardianContains( + String value, + {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.contains( - property: r'firestoreId', + property: r'guardian', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder - firestoreIdMatches(String pattern, {bool caseSensitive = true}) { + QueryBuilder guardianMatches( + String pattern, + {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.matches( - property: r'firestoreId', + property: r'guardian', wildcard: pattern, caseSensitive: caseSensitive, )); @@ -1183,63 +1571,65 @@ extension AlarmModelQueryFilter } QueryBuilder - firestoreIdIsEmpty() { + guardianIsEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'firestoreId', + property: r'guardian', value: '', )); }); } QueryBuilder - firestoreIdIsNotEmpty() { + guardianIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( - property: r'firestoreId', + property: r'guardian', value: '', )); }); } - QueryBuilder gradientEqualTo( - int value) { + QueryBuilder + guardianTimerEqualTo(int value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'gradient', + property: r'guardianTimer', value: value, )); }); } QueryBuilder - gradientGreaterThan( + guardianTimerGreaterThan( int value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, - property: r'gradient', + property: r'guardianTimer', value: value, )); }); } - QueryBuilder gradientLessThan( + QueryBuilder + guardianTimerLessThan( int value, { bool include = false, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, - property: r'gradient', + property: r'guardianTimer', value: value, )); }); } - QueryBuilder gradientBetween( + QueryBuilder + guardianTimerBetween( int lower, int upper, { bool includeLower = true, @@ -1247,7 +1637,7 @@ extension AlarmModelQueryFilter }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( - property: r'gradient', + property: r'guardianTimer', lower: lower, includeLower: includeLower, upper: upper, @@ -1322,6 +1712,16 @@ extension AlarmModelQueryFilter }); } + QueryBuilder isCallEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isCall', + value: value, + )); + }); + } + QueryBuilder isEnabledEqualTo( bool value) { return QueryBuilder.apply(this, (query) { @@ -1332,6 +1732,16 @@ extension AlarmModelQueryFilter }); } + QueryBuilder isGuardianEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isGuardian', + value: value, + )); + }); + } + QueryBuilder isLocationEnabledEqualTo(bool value) { return QueryBuilder.apply(this, (query) { @@ -2374,23 +2784,155 @@ extension AlarmModelQueryFilter bool includeUpper = true, }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'numberOfSteps', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, + return query.addFilterCondition(FilterCondition.between( + property: r'numberOfSteps', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder ownerIdEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'ownerId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'ownerId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ownerIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ownerId', + value: '', + )); + }); + } + + QueryBuilder + ownerIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'ownerId', + value: '', )); }); } - QueryBuilder ownerIdEqualTo( + QueryBuilder ownerNameEqualTo( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'ownerId', + property: r'ownerName', value: value, caseSensitive: caseSensitive, )); @@ -2398,7 +2940,7 @@ extension AlarmModelQueryFilter } QueryBuilder - ownerIdGreaterThan( + ownerNameGreaterThan( String value, { bool include = false, bool caseSensitive = true, @@ -2406,14 +2948,14 @@ extension AlarmModelQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, - property: r'ownerId', + property: r'ownerName', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerIdLessThan( + QueryBuilder ownerNameLessThan( String value, { bool include = false, bool caseSensitive = true, @@ -2421,14 +2963,14 @@ extension AlarmModelQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, - property: r'ownerId', + property: r'ownerName', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerIdBetween( + QueryBuilder ownerNameBetween( String lower, String upper, { bool includeLower = true, @@ -2437,7 +2979,7 @@ extension AlarmModelQueryFilter }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( - property: r'ownerId', + property: r'ownerName', lower: lower, includeLower: includeLower, upper: upper, @@ -2447,82 +2989,84 @@ extension AlarmModelQueryFilter }); } - QueryBuilder ownerIdStartsWith( + QueryBuilder + ownerNameStartsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.startsWith( - property: r'ownerId', + property: r'ownerName', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerIdEndsWith( + QueryBuilder ownerNameEndsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.endsWith( - property: r'ownerId', + property: r'ownerName', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerIdContains( + QueryBuilder ownerNameContains( String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.contains( - property: r'ownerId', + property: r'ownerName', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerIdMatches( + QueryBuilder ownerNameMatches( String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.matches( - property: r'ownerId', + property: r'ownerName', wildcard: pattern, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerIdIsEmpty() { + QueryBuilder + ownerNameIsEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'ownerId', + property: r'ownerName', value: '', )); }); } QueryBuilder - ownerIdIsNotEmpty() { + ownerNameIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( - property: r'ownerId', + property: r'ownerName', value: '', )); }); } - QueryBuilder ownerNameEqualTo( + QueryBuilder profileEqualTo( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'ownerName', + property: r'profile', value: value, caseSensitive: caseSensitive, )); @@ -2530,7 +3074,7 @@ extension AlarmModelQueryFilter } QueryBuilder - ownerNameGreaterThan( + profileGreaterThan( String value, { bool include = false, bool caseSensitive = true, @@ -2538,14 +3082,14 @@ extension AlarmModelQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, - property: r'ownerName', + property: r'profile', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerNameLessThan( + QueryBuilder profileLessThan( String value, { bool include = false, bool caseSensitive = true, @@ -2553,14 +3097,14 @@ extension AlarmModelQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, - property: r'ownerName', + property: r'profile', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerNameBetween( + QueryBuilder profileBetween( String lower, String upper, { bool includeLower = true, @@ -2569,7 +3113,7 @@ extension AlarmModelQueryFilter }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( - property: r'ownerName', + property: r'profile', lower: lower, includeLower: includeLower, upper: upper, @@ -2579,72 +3123,70 @@ extension AlarmModelQueryFilter }); } - QueryBuilder - ownerNameStartsWith( + QueryBuilder profileStartsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.startsWith( - property: r'ownerName', + property: r'profile', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerNameEndsWith( + QueryBuilder profileEndsWith( String value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.endsWith( - property: r'ownerName', + property: r'profile', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerNameContains( + QueryBuilder profileContains( String value, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.contains( - property: r'ownerName', + property: r'profile', value: value, caseSensitive: caseSensitive, )); }); } - QueryBuilder ownerNameMatches( + QueryBuilder profileMatches( String pattern, {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.matches( - property: r'ownerName', + property: r'profile', wildcard: pattern, caseSensitive: caseSensitive, )); }); } - QueryBuilder - ownerNameIsEmpty() { + QueryBuilder profileIsEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'ownerName', + property: r'profile', value: '', )); }); } QueryBuilder - ownerNameIsNotEmpty() { + profileIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( - property: r'ownerName', + property: r'profile', value: '', )); }); @@ -2782,6 +3324,16 @@ extension AlarmModelQueryFilter }); } + QueryBuilder ringOnEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ringOn', + value: value, + )); + }); + } + QueryBuilder ringtoneNameEqualTo( String value, { @@ -3586,6 +4138,18 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByAlarmDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.asc); + }); + } + + QueryBuilder sortByAlarmDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.desc); + }); + } + QueryBuilder sortByAlarmID() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'alarmID', Sort.asc); @@ -3648,6 +4212,30 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.asc); + }); + } + + QueryBuilder sortByGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.desc); + }); + } + + QueryBuilder sortByGuardianTimer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.asc); + }); + } + + QueryBuilder sortByGuardianTimerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.desc); + }); + } + QueryBuilder sortByIntervalToAlarm() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'intervalToAlarm', Sort.asc); @@ -3674,6 +4262,18 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByIsCall() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.asc); + }); + } + + QueryBuilder sortByIsCallDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.desc); + }); + } + QueryBuilder sortByIsEnabled() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isEnabled', Sort.asc); @@ -3686,6 +4286,18 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByIsGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.asc); + }); + } + + QueryBuilder sortByIsGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.desc); + }); + } + QueryBuilder sortByIsLocationEnabled() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isLocationEnabled', Sort.asc); @@ -3939,6 +4551,18 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByProfile() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profile', Sort.asc); + }); + } + + QueryBuilder sortByProfileDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profile', Sort.desc); + }); + } + QueryBuilder sortByQrValue() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'qrValue', Sort.asc); @@ -3951,6 +4575,18 @@ extension AlarmModelQuerySortBy }); } + QueryBuilder sortByRingOn() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.asc); + }); + } + + QueryBuilder sortByRingOnDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.desc); + }); + } + QueryBuilder sortByRingtoneName() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'ringtoneName', Sort.asc); @@ -4055,6 +4691,18 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByAlarmDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.asc); + }); + } + + QueryBuilder thenByAlarmDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.desc); + }); + } + QueryBuilder thenByAlarmID() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'alarmID', Sort.asc); @@ -4117,6 +4765,30 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.asc); + }); + } + + QueryBuilder thenByGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.desc); + }); + } + + QueryBuilder thenByGuardianTimer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.asc); + }); + } + + QueryBuilder thenByGuardianTimerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.desc); + }); + } + QueryBuilder thenByIntervalToAlarm() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'intervalToAlarm', Sort.asc); @@ -4143,6 +4815,18 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByIsCall() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.asc); + }); + } + + QueryBuilder thenByIsCallDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.desc); + }); + } + QueryBuilder thenByIsEnabled() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isEnabled', Sort.asc); @@ -4155,6 +4839,18 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByIsGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.asc); + }); + } + + QueryBuilder thenByIsGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.desc); + }); + } + QueryBuilder thenByIsLocationEnabled() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'isLocationEnabled', Sort.asc); @@ -4420,6 +5116,18 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByProfile() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profile', Sort.asc); + }); + } + + QueryBuilder thenByProfileDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profile', Sort.desc); + }); + } + QueryBuilder thenByQrValue() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'qrValue', Sort.asc); @@ -4432,6 +5140,18 @@ extension AlarmModelQuerySortThenBy }); } + QueryBuilder thenByRingOn() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.asc); + }); + } + + QueryBuilder thenByRingOnDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.desc); + }); + } + QueryBuilder thenByRingtoneName() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'ringtoneName', Sort.asc); @@ -4522,6 +5242,13 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByAlarmDate( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'alarmDate', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByAlarmID( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4562,6 +5289,19 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByGuardian( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'guardian', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByGuardianTimer() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'guardianTimer'); + }); + } + QueryBuilder distinctByIntervalToAlarm() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'intervalToAlarm'); @@ -4575,12 +5315,24 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByIsCall() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isCall'); + }); + } + QueryBuilder distinctByIsEnabled() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'isEnabled'); }); } + QueryBuilder distinctByIsGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isGuardian'); + }); + } + QueryBuilder distinctByIsLocationEnabled() { return QueryBuilder.apply(this, (query) { @@ -4715,6 +5467,13 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByProfile( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'profile', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByQrValue( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4722,6 +5481,12 @@ extension AlarmModelQueryWhereDistinct }); } + QueryBuilder distinctByRingOn() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ringOn'); + }); + } + QueryBuilder distinctByRingtoneName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4793,6 +5558,12 @@ extension AlarmModelQueryProperty }); } + QueryBuilder alarmDateProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'alarmDate'); + }); + } + QueryBuilder alarmIDProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'alarmID'); @@ -4830,6 +5601,18 @@ extension AlarmModelQueryProperty }); } + QueryBuilder guardianProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'guardian'); + }); + } + + QueryBuilder guardianTimerProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'guardianTimer'); + }); + } + QueryBuilder intervalToAlarmProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'intervalToAlarm'); @@ -4842,12 +5625,24 @@ extension AlarmModelQueryProperty }); } + QueryBuilder isCallProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isCall'); + }); + } + QueryBuilder isEnabledProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'isEnabled'); }); } + QueryBuilder isGuardianProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isGuardian'); + }); + } + QueryBuilder isLocationEnabledProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'isLocationEnabled'); @@ -4972,12 +5767,24 @@ extension AlarmModelQueryProperty }); } + QueryBuilder profileProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'profile'); + }); + } + QueryBuilder qrValueProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'qrValue'); }); } + QueryBuilder ringOnProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ringOn'); + }); + } + QueryBuilder ringtoneNameProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'ringtoneName'); diff --git a/lib/app/data/models/profile_model.dart b/lib/app/data/models/profile_model.dart new file mode 100644 index 00000000..04a6b89b --- /dev/null +++ b/lib/app/data/models/profile_model.dart @@ -0,0 +1,315 @@ +import 'dart:convert'; + +import 'package:cloud_firestore/cloud_firestore.dart' as firestore; + +import 'package:isar/isar.dart'; +import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; +import 'package:ultimate_alarm_clock/app/utils/utils.dart'; +part 'profile_model.g.dart'; + +@collection +class ProfileModel { + Id isarId = Isar.autoIncrement; + late String profileName; + String? firestoreId; + late bool isEnabled; + late bool isLocationEnabled; + late bool isSharedAlarmEnabled; + late bool isWeatherEnabled; + late bool isMathsEnabled; + late bool isShakeEnabled; + late bool isQrEnabled; + late bool isPedometerEnabled; + late int intervalToAlarm; + late bool isActivityEnabled; + late String location; + late int activityInterval; + late int minutesSinceMidnight; + late List days; + late List weatherTypes; + late int shakeTimes; + late int numberOfSteps; + late int numMathsQuestions; + late int mathsDifficulty; + late String qrValue; + List? sharedUserIds; + late String ownerId; + late String ownerName; + late String lastEditedUserId; + late bool mutexLock; + late String label; + late bool isOneTime; + late int snoozeDuration; + late int gradient; + late String ringtoneName; + late String note; + late bool deleteAfterGoesOff; + late bool showMotivationalQuote; + late double volMax; + late double volMin; + late String alarmDate; + late bool ringOn; + late int activityMonitor; + late bool isGuardian; + late int guardianTimer; + late String guardian; + late bool isCall; + @ignore + Map? offsetDetails; + + ProfileModel( + {required this.profileName, + this.sharedUserIds = const [], + required this.ownerId, + required this.ownerName, + required this.lastEditedUserId, + required this.mutexLock, + this.isEnabled = true, + required this.days, + required this.intervalToAlarm, + required this.isActivityEnabled, + required this.minutesSinceMidnight, + required this.isLocationEnabled, + required this.isSharedAlarmEnabled, + required this.isWeatherEnabled, + required this.location, + required this.weatherTypes, + required this.isMathsEnabled, + required this.mathsDifficulty, + required this.numMathsQuestions, + required this.isShakeEnabled, + required this.shakeTimes, + required this.isQrEnabled, + required this.qrValue, + required this.isPedometerEnabled, + required this.numberOfSteps, + required this.activityInterval, + this.offsetDetails = const {}, + required this.label, + required this.isOneTime, + required this.snoozeDuration, + required this.gradient, + required this.ringtoneName, + required this.note, + required this.deleteAfterGoesOff, + required this.showMotivationalQuote, + required this.volMax, + required this.volMin, + required this.activityMonitor, + required this.alarmDate, + required this.ringOn, + required this.isGuardian, + required this.guardianTimer, + required this.guardian, + required this.isCall}); + + ProfileModel.fromDocumentSnapshot({ + required firestore.DocumentSnapshot documentSnapshot, + required UserModel? user, + }) { + // Making sure the profiles work with the offsets + isSharedAlarmEnabled = documentSnapshot['isSharedAlarmEnabled']; + offsetDetails = documentSnapshot['offsetDetails']; + + if (isSharedAlarmEnabled && user != null) { + // Using offsetted time only if it is enabled + + minutesSinceMidnight = Utils.timeOfDayToInt( + Utils.stringToTimeOfDay(offsetDetails![user.id]['offsettedTime']), + ); + } else { + minutesSinceMidnight = documentSnapshot['minutesSinceMidnight']; + } + snoozeDuration = documentSnapshot['snoozeDuration']; + gradient = documentSnapshot['gradient']; + label = documentSnapshot['label']; + isOneTime = documentSnapshot['isOneTime']; + firestoreId = documentSnapshot.id; + sharedUserIds = List.from(documentSnapshot['sharedUserIds']); + lastEditedUserId = documentSnapshot['lastEditedUserId']; + mutexLock = documentSnapshot['mutexLock']; + ownerId = documentSnapshot['ownerId']; + ownerName = documentSnapshot['ownerName']; + days = List.from(documentSnapshot['days']); + isEnabled = documentSnapshot['isEnabled']; + intervalToAlarm = documentSnapshot['intervalToAlarm']; + isActivityEnabled = documentSnapshot['isActivityEnabled']; + activityInterval = documentSnapshot['activityInterval']; + + isLocationEnabled = documentSnapshot['isLocationEnabled']; + isWeatherEnabled = documentSnapshot['isWeatherEnabled']; + weatherTypes = List.from(documentSnapshot['weatherTypes']); + location = documentSnapshot['location']; + isMathsEnabled = documentSnapshot['isMathsEnabled']; + mathsDifficulty = documentSnapshot['mathsDifficulty']; + numMathsQuestions = documentSnapshot['numMathsQuestions']; + isQrEnabled = documentSnapshot['isQrEnabled']; + qrValue = documentSnapshot['qrValue']; + isShakeEnabled = documentSnapshot['isShakeEnabled']; + shakeTimes = documentSnapshot['shakeTimes']; + isPedometerEnabled = documentSnapshot['isPedometerEnabled']; + numberOfSteps = documentSnapshot['numberOfSteps']; + ringtoneName = documentSnapshot['ringtoneName']; + note = documentSnapshot['note']; + deleteAfterGoesOff = documentSnapshot['deleteAfterGoesOff']; + showMotivationalQuote = documentSnapshot['showMotivationalQuote']; + + volMax = documentSnapshot['volMax']; + volMin = documentSnapshot['volMin']; + + activityMonitor = documentSnapshot['activityMonitor']; + + alarmDate = documentSnapshot['alarmDate']; + isGuardian = documentSnapshot['isGuardian']; + guardianTimer = documentSnapshot['guardianTimer']; + guardian = documentSnapshot['guardian']; + isGuardian = documentSnapshot['isGuardian']; + guardianTimer = documentSnapshot['guardianTimer']; + guardian = documentSnapshot['guardian']; + isCall = documentSnapshot['isCall']; + } + + ProfileModel.fromMap(Map profileData) { + // Making sure the profiles work with the offsets + profileName = profileData['profileName']; + snoozeDuration = profileData['snoozeDuration']; + gradient = profileData['gradient']; + isSharedAlarmEnabled = profileData['isSharedAlarmEnabled']; + minutesSinceMidnight = profileData['minutesSinceMidnight']; + firestoreId = profileData['firestoreId']; + sharedUserIds = List.from(profileData['sharedUserIds']); + lastEditedUserId = profileData['lastEditedUserId']; + mutexLock = profileData['mutexLock']; + ownerId = profileData['ownerId']; + ownerName = profileData['ownerName']; + days = List.from(profileData['days']); + isEnabled = profileData['isEnabled']; + intervalToAlarm = profileData['intervalToAlarm']; + isActivityEnabled = profileData['isActivityEnabled']; + isWeatherEnabled = profileData['isWeatherEnabled']; + weatherTypes = List.from(profileData['weatherTypes']); + + activityInterval = profileData['activityInterval']; + isLocationEnabled = profileData['isLocationEnabled']; + isSharedAlarmEnabled = profileData['isSharedAlarmEnabled']; + location = profileData['location']; + + isMathsEnabled = profileData['isMathsEnabled']; + mathsDifficulty = profileData['mathsDifficulty']; + numMathsQuestions = profileData['numMathsQuestions']; + isQrEnabled = profileData['isQrEnabled']; + qrValue = profileData['qrValue']; + isShakeEnabled = profileData['isShakeEnabled']; + shakeTimes = profileData['shakeTimes']; + isPedometerEnabled = profileData['isPedometerEnabled']; + numberOfSteps = profileData['numberOfSteps']; + label = profileData['label']; + isOneTime = profileData['isOneTime']; + ringtoneName = profileData['ringtoneName']; + note = profileData['note']; + deleteAfterGoesOff = profileData['deleteAfterGoesOff']; + showMotivationalQuote = profileData['showMotivationalQuote']; + + volMin = profileData['volMin']; + volMax = profileData['volMax']; + activityMonitor = profileData['activityMonitor']; + alarmDate = profileData['alarmDate']; + isGuardian = profileData['isGuardian']; + guardianTimer = profileData['guardianTimer']; + guardian = profileData['guardian']; + isCall = profileData['isCall']; + ringOn = profileData['ringOn']; + } + + ProfileModel.fromJson(String profileData, UserModel? user) { + ProfileModel.fromMap(jsonDecode(profileData)); + } + + static String toJson(ProfileModel profileRecord) { + return jsonEncode(ProfileModel.toMap(profileRecord)); + } + + static Map toMap(ProfileModel profileRecord) { + final profileMap = { + 'profileName': profileRecord.profileName, + 'firestoreId': profileRecord.firestoreId, + 'ownerId': profileRecord.ownerId, + 'lastEditedUserId': profileRecord.lastEditedUserId, + 'mutexLock': profileRecord.mutexLock, + 'isOneTime': profileRecord.isOneTime, + 'label': profileRecord.label, + 'ownerName': profileRecord.ownerName, + 'sharedUserIds': profileRecord.sharedUserIds, + 'days': profileRecord.days, + 'intervalToAlarm': profileRecord.intervalToAlarm, + 'isEnabled': profileRecord.isEnabled, + 'isActivityEnabled': profileRecord.isActivityEnabled, + 'weatherTypes': profileRecord.weatherTypes, + 'isWeatherEnabled': profileRecord.isWeatherEnabled, + 'activityInterval': profileRecord.activityInterval, + 'minutesSinceMidnight': profileRecord.minutesSinceMidnight, + 'isLocationEnabled': profileRecord.isLocationEnabled, + 'location': profileRecord.location, + 'isSharedAlarmEnabled': profileRecord.isSharedAlarmEnabled, + 'isMathsEnabled': profileRecord.isMathsEnabled, + 'mathsDifficulty': profileRecord.mathsDifficulty, + 'numMathsQuestions': profileRecord.numMathsQuestions, + 'isQrEnabled': profileRecord.isQrEnabled, + 'qrValue': profileRecord.qrValue, + 'isShakeEnabled': profileRecord.isShakeEnabled, + 'shakeTimes': profileRecord.shakeTimes, + 'isPedometerEnabled': profileRecord.isPedometerEnabled, + 'numberOfSteps': profileRecord.numberOfSteps, + 'snoozeDuration': profileRecord.snoozeDuration, + 'gradient': profileRecord.gradient, + 'ringtoneName': profileRecord.ringtoneName, + 'note': profileRecord.note, + 'deleteAfterGoesOff': profileRecord.deleteAfterGoesOff, + 'showMotivationalQuote': profileRecord.showMotivationalQuote, + 'volMin': profileRecord.volMin, + 'volMax': profileRecord.volMax, + 'activityMonitor': profileRecord.activityMonitor, + 'alarmDate': profileRecord.alarmDate, + 'isGuardian': profileRecord.isGuardian, + 'guardianTimer': profileRecord.guardianTimer, + 'guardian': profileRecord.guardian, + 'isCall': profileRecord.isCall, + 'ringOn': profileRecord.ringOn + }; + + if (profileRecord.isSharedAlarmEnabled) { + profileMap['offsetDetails'] = profileRecord.offsetDetails; + } + return profileMap; + } + + String boolListToString(List boolList) { + // Rotate the list to start with Sunday + var rotatedList = + [boolList.last] + boolList.sublist(0, boolList.length - 1); + // Convert the list of bools to a string of 1s and 0s + return rotatedList.map((b) => b ? '1' : '0').join(); + } + + List stringToBoolList(String s) { + // Rotate the string to start with Monday + final rotatedString = s.substring(1) + s[0]; + // Convert the rotated string to a list of boolean values + return rotatedString.split('').map((c) => c == '1').toList(); + } +} + +int fastHash(String string) { + var hash = 0xcbf29ce484222325; + + var i = 0; + while (i < string.length) { + final codeUnit = string.codeUnitAt(i++); + hash ^= codeUnit >> 8; + hash *= 0x100000001b3; + hash ^= codeUnit & 0xFF; + hash *= 0x100000001b3; + } + + return hash; +} diff --git a/lib/app/data/models/profile_model.g.dart b/lib/app/data/models/profile_model.g.dart new file mode 100644 index 00000000..48e7a8c7 --- /dev/null +++ b/lib/app/data/models/profile_model.g.dart @@ -0,0 +1,5366 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'profile_model.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetProfileModelCollection on Isar { + IsarCollection get profileModels => this.collection(); +} + +const ProfileModelSchema = CollectionSchema( + name: r'ProfileModel', + id: 7663001939508120177, + properties: { + r'activityInterval': PropertySchema( + id: 0, + name: r'activityInterval', + type: IsarType.long, + ), + r'activityMonitor': PropertySchema( + id: 1, + name: r'activityMonitor', + type: IsarType.long, + ), + r'alarmDate': PropertySchema( + id: 2, + name: r'alarmDate', + type: IsarType.string, + ), + r'days': PropertySchema( + id: 3, + name: r'days', + type: IsarType.boolList, + ), + r'deleteAfterGoesOff': PropertySchema( + id: 4, + name: r'deleteAfterGoesOff', + type: IsarType.bool, + ), + r'firestoreId': PropertySchema( + id: 5, + name: r'firestoreId', + type: IsarType.string, + ), + r'gradient': PropertySchema( + id: 6, + name: r'gradient', + type: IsarType.long, + ), + r'guardian': PropertySchema( + id: 7, + name: r'guardian', + type: IsarType.string, + ), + r'guardianTimer': PropertySchema( + id: 8, + name: r'guardianTimer', + type: IsarType.long, + ), + r'intervalToAlarm': PropertySchema( + id: 9, + name: r'intervalToAlarm', + type: IsarType.long, + ), + r'isActivityEnabled': PropertySchema( + id: 10, + name: r'isActivityEnabled', + type: IsarType.bool, + ), + r'isCall': PropertySchema( + id: 11, + name: r'isCall', + type: IsarType.bool, + ), + r'isEnabled': PropertySchema( + id: 12, + name: r'isEnabled', + type: IsarType.bool, + ), + r'isGuardian': PropertySchema( + id: 13, + name: r'isGuardian', + type: IsarType.bool, + ), + r'isLocationEnabled': PropertySchema( + id: 14, + name: r'isLocationEnabled', + type: IsarType.bool, + ), + r'isMathsEnabled': PropertySchema( + id: 15, + name: r'isMathsEnabled', + type: IsarType.bool, + ), + r'isOneTime': PropertySchema( + id: 16, + name: r'isOneTime', + type: IsarType.bool, + ), + r'isPedometerEnabled': PropertySchema( + id: 17, + name: r'isPedometerEnabled', + type: IsarType.bool, + ), + r'isQrEnabled': PropertySchema( + id: 18, + name: r'isQrEnabled', + type: IsarType.bool, + ), + r'isShakeEnabled': PropertySchema( + id: 19, + name: r'isShakeEnabled', + type: IsarType.bool, + ), + r'isSharedAlarmEnabled': PropertySchema( + id: 20, + name: r'isSharedAlarmEnabled', + type: IsarType.bool, + ), + r'isWeatherEnabled': PropertySchema( + id: 21, + name: r'isWeatherEnabled', + type: IsarType.bool, + ), + r'label': PropertySchema( + id: 22, + name: r'label', + type: IsarType.string, + ), + r'lastEditedUserId': PropertySchema( + id: 23, + name: r'lastEditedUserId', + type: IsarType.string, + ), + r'location': PropertySchema( + id: 24, + name: r'location', + type: IsarType.string, + ), + r'mathsDifficulty': PropertySchema( + id: 25, + name: r'mathsDifficulty', + type: IsarType.long, + ), + r'minutesSinceMidnight': PropertySchema( + id: 26, + name: r'minutesSinceMidnight', + type: IsarType.long, + ), + r'mutexLock': PropertySchema( + id: 27, + name: r'mutexLock', + type: IsarType.bool, + ), + r'note': PropertySchema( + id: 28, + name: r'note', + type: IsarType.string, + ), + r'numMathsQuestions': PropertySchema( + id: 29, + name: r'numMathsQuestions', + type: IsarType.long, + ), + r'numberOfSteps': PropertySchema( + id: 30, + name: r'numberOfSteps', + type: IsarType.long, + ), + r'ownerId': PropertySchema( + id: 31, + name: r'ownerId', + type: IsarType.string, + ), + r'ownerName': PropertySchema( + id: 32, + name: r'ownerName', + type: IsarType.string, + ), + r'profileName': PropertySchema( + id: 33, + name: r'profileName', + type: IsarType.string, + ), + r'qrValue': PropertySchema( + id: 34, + name: r'qrValue', + type: IsarType.string, + ), + r'ringOn': PropertySchema( + id: 35, + name: r'ringOn', + type: IsarType.bool, + ), + r'ringtoneName': PropertySchema( + id: 36, + name: r'ringtoneName', + type: IsarType.string, + ), + r'shakeTimes': PropertySchema( + id: 37, + name: r'shakeTimes', + type: IsarType.long, + ), + r'sharedUserIds': PropertySchema( + id: 38, + name: r'sharedUserIds', + type: IsarType.stringList, + ), + r'showMotivationalQuote': PropertySchema( + id: 39, + name: r'showMotivationalQuote', + type: IsarType.bool, + ), + r'snoozeDuration': PropertySchema( + id: 40, + name: r'snoozeDuration', + type: IsarType.long, + ), + r'volMax': PropertySchema( + id: 41, + name: r'volMax', + type: IsarType.double, + ), + r'volMin': PropertySchema( + id: 42, + name: r'volMin', + type: IsarType.double, + ), + r'weatherTypes': PropertySchema( + id: 43, + name: r'weatherTypes', + type: IsarType.longList, + ) + }, + estimateSize: _profileModelEstimateSize, + serialize: _profileModelSerialize, + deserialize: _profileModelDeserialize, + deserializeProp: _profileModelDeserializeProp, + idName: r'isarId', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _profileModelGetId, + getLinks: _profileModelGetLinks, + attach: _profileModelAttach, + version: '3.1.0+1', +); + +int _profileModelEstimateSize( + ProfileModel object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.alarmDate.length * 3; + bytesCount += 3 + object.days.length; + { + final value = object.firestoreId; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + bytesCount += 3 + object.guardian.length * 3; + bytesCount += 3 + object.label.length * 3; + bytesCount += 3 + object.lastEditedUserId.length * 3; + bytesCount += 3 + object.location.length * 3; + bytesCount += 3 + object.note.length * 3; + bytesCount += 3 + object.ownerId.length * 3; + bytesCount += 3 + object.ownerName.length * 3; + bytesCount += 3 + object.profileName.length * 3; + bytesCount += 3 + object.qrValue.length * 3; + bytesCount += 3 + object.ringtoneName.length * 3; + { + final list = object.sharedUserIds; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } + bytesCount += 3 + object.weatherTypes.length * 8; + return bytesCount; +} + +void _profileModelSerialize( + ProfileModel object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.activityInterval); + writer.writeLong(offsets[1], object.activityMonitor); + writer.writeString(offsets[2], object.alarmDate); + writer.writeBoolList(offsets[3], object.days); + writer.writeBool(offsets[4], object.deleteAfterGoesOff); + writer.writeString(offsets[5], object.firestoreId); + writer.writeLong(offsets[6], object.gradient); + writer.writeString(offsets[7], object.guardian); + writer.writeLong(offsets[8], object.guardianTimer); + writer.writeLong(offsets[9], object.intervalToAlarm); + writer.writeBool(offsets[10], object.isActivityEnabled); + writer.writeBool(offsets[11], object.isCall); + writer.writeBool(offsets[12], object.isEnabled); + writer.writeBool(offsets[13], object.isGuardian); + writer.writeBool(offsets[14], object.isLocationEnabled); + writer.writeBool(offsets[15], object.isMathsEnabled); + writer.writeBool(offsets[16], object.isOneTime); + writer.writeBool(offsets[17], object.isPedometerEnabled); + writer.writeBool(offsets[18], object.isQrEnabled); + writer.writeBool(offsets[19], object.isShakeEnabled); + writer.writeBool(offsets[20], object.isSharedAlarmEnabled); + writer.writeBool(offsets[21], object.isWeatherEnabled); + writer.writeString(offsets[22], object.label); + writer.writeString(offsets[23], object.lastEditedUserId); + writer.writeString(offsets[24], object.location); + writer.writeLong(offsets[25], object.mathsDifficulty); + writer.writeLong(offsets[26], object.minutesSinceMidnight); + writer.writeBool(offsets[27], object.mutexLock); + writer.writeString(offsets[28], object.note); + writer.writeLong(offsets[29], object.numMathsQuestions); + writer.writeLong(offsets[30], object.numberOfSteps); + writer.writeString(offsets[31], object.ownerId); + writer.writeString(offsets[32], object.ownerName); + writer.writeString(offsets[33], object.profileName); + writer.writeString(offsets[34], object.qrValue); + writer.writeBool(offsets[35], object.ringOn); + writer.writeString(offsets[36], object.ringtoneName); + writer.writeLong(offsets[37], object.shakeTimes); + writer.writeStringList(offsets[38], object.sharedUserIds); + writer.writeBool(offsets[39], object.showMotivationalQuote); + writer.writeLong(offsets[40], object.snoozeDuration); + writer.writeDouble(offsets[41], object.volMax); + writer.writeDouble(offsets[42], object.volMin); + writer.writeLongList(offsets[43], object.weatherTypes); +} + +ProfileModel _profileModelDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = ProfileModel( + activityInterval: reader.readLong(offsets[0]), + activityMonitor: reader.readLong(offsets[1]), + alarmDate: reader.readString(offsets[2]), + days: reader.readBoolList(offsets[3]) ?? [], + deleteAfterGoesOff: reader.readBool(offsets[4]), + gradient: reader.readLong(offsets[6]), + guardian: reader.readString(offsets[7]), + guardianTimer: reader.readLong(offsets[8]), + intervalToAlarm: reader.readLong(offsets[9]), + isActivityEnabled: reader.readBool(offsets[10]), + isCall: reader.readBool(offsets[11]), + isEnabled: reader.readBoolOrNull(offsets[12]) ?? true, + isGuardian: reader.readBool(offsets[13]), + isLocationEnabled: reader.readBool(offsets[14]), + isMathsEnabled: reader.readBool(offsets[15]), + isOneTime: reader.readBool(offsets[16]), + isPedometerEnabled: reader.readBool(offsets[17]), + isQrEnabled: reader.readBool(offsets[18]), + isShakeEnabled: reader.readBool(offsets[19]), + isSharedAlarmEnabled: reader.readBool(offsets[20]), + isWeatherEnabled: reader.readBool(offsets[21]), + label: reader.readString(offsets[22]), + lastEditedUserId: reader.readString(offsets[23]), + location: reader.readString(offsets[24]), + mathsDifficulty: reader.readLong(offsets[25]), + minutesSinceMidnight: reader.readLong(offsets[26]), + mutexLock: reader.readBool(offsets[27]), + note: reader.readString(offsets[28]), + numMathsQuestions: reader.readLong(offsets[29]), + numberOfSteps: reader.readLong(offsets[30]), + ownerId: reader.readString(offsets[31]), + ownerName: reader.readString(offsets[32]), + profileName: reader.readString(offsets[33]), + qrValue: reader.readString(offsets[34]), + ringOn: reader.readBool(offsets[35]), + ringtoneName: reader.readString(offsets[36]), + shakeTimes: reader.readLong(offsets[37]), + sharedUserIds: reader.readStringList(offsets[38]), + showMotivationalQuote: reader.readBool(offsets[39]), + snoozeDuration: reader.readLong(offsets[40]), + volMax: reader.readDouble(offsets[41]), + volMin: reader.readDouble(offsets[42]), + weatherTypes: reader.readLongList(offsets[43]) ?? [], + ); + object.firestoreId = reader.readStringOrNull(offsets[5]); + object.isarId = id; + return object; +} + +P _profileModelDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLong(offset)) as P; + case 1: + return (reader.readLong(offset)) as P; + case 2: + return (reader.readString(offset)) as P; + case 3: + return (reader.readBoolList(offset) ?? []) as P; + case 4: + return (reader.readBool(offset)) as P; + case 5: + return (reader.readStringOrNull(offset)) as P; + case 6: + return (reader.readLong(offset)) as P; + case 7: + return (reader.readString(offset)) as P; + case 8: + return (reader.readLong(offset)) as P; + case 9: + return (reader.readLong(offset)) as P; + case 10: + return (reader.readBool(offset)) as P; + case 11: + return (reader.readBool(offset)) as P; + case 12: + return (reader.readBoolOrNull(offset) ?? true) as P; + case 13: + return (reader.readBool(offset)) as P; + case 14: + return (reader.readBool(offset)) as P; + case 15: + return (reader.readBool(offset)) as P; + case 16: + return (reader.readBool(offset)) as P; + case 17: + return (reader.readBool(offset)) as P; + case 18: + return (reader.readBool(offset)) as P; + case 19: + return (reader.readBool(offset)) as P; + case 20: + return (reader.readBool(offset)) as P; + case 21: + return (reader.readBool(offset)) as P; + case 22: + return (reader.readString(offset)) as P; + case 23: + return (reader.readString(offset)) as P; + case 24: + return (reader.readString(offset)) as P; + case 25: + return (reader.readLong(offset)) as P; + case 26: + return (reader.readLong(offset)) as P; + case 27: + return (reader.readBool(offset)) as P; + case 28: + return (reader.readString(offset)) as P; + case 29: + return (reader.readLong(offset)) as P; + case 30: + return (reader.readLong(offset)) as P; + case 31: + return (reader.readString(offset)) as P; + case 32: + return (reader.readString(offset)) as P; + case 33: + return (reader.readString(offset)) as P; + case 34: + return (reader.readString(offset)) as P; + case 35: + return (reader.readBool(offset)) as P; + case 36: + return (reader.readString(offset)) as P; + case 37: + return (reader.readLong(offset)) as P; + case 38: + return (reader.readStringList(offset)) as P; + case 39: + return (reader.readBool(offset)) as P; + case 40: + return (reader.readLong(offset)) as P; + case 41: + return (reader.readDouble(offset)) as P; + case 42: + return (reader.readDouble(offset)) as P; + case 43: + return (reader.readLongList(offset) ?? []) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _profileModelGetId(ProfileModel object) { + return object.isarId; +} + +List> _profileModelGetLinks(ProfileModel object) { + return []; +} + +void _profileModelAttach( + IsarCollection col, Id id, ProfileModel object) { + object.isarId = id; +} + +extension ProfileModelQueryWhereSort + on QueryBuilder { + QueryBuilder anyIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension ProfileModelQueryWhere + on QueryBuilder { + QueryBuilder isarIdEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: isarId, + upper: isarId, + )); + }); + } + + QueryBuilder isarIdNotEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ); + } + }); + } + + QueryBuilder isarIdGreaterThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: include), + ); + }); + } + + QueryBuilder isarIdLessThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: include), + ); + }); + } + + QueryBuilder isarIdBetween( + Id lowerIsarId, + Id upperIsarId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerIsarId, + includeLower: includeLower, + upper: upperIsarId, + includeUpper: includeUpper, + )); + }); + } +} + +extension ProfileModelQueryFilter + on QueryBuilder { + QueryBuilder + activityIntervalEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'activityInterval', + value: value, + )); + }); + } + + QueryBuilder + activityIntervalGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'activityInterval', + value: value, + )); + }); + } + + QueryBuilder + activityIntervalLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'activityInterval', + value: value, + )); + }); + } + + QueryBuilder + activityIntervalBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'activityInterval', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + activityMonitorEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'activityMonitor', + value: value, + )); + }); + } + + QueryBuilder + activityMonitorGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'activityMonitor', + value: value, + )); + }); + } + + QueryBuilder + activityMonitorLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'activityMonitor', + value: value, + )); + }); + } + + QueryBuilder + activityMonitorBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'activityMonitor', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + alarmDateEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'alarmDate', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'alarmDate', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'alarmDate', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + alarmDateIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'alarmDate', + value: '', + )); + }); + } + + QueryBuilder + alarmDateIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'alarmDate', + value: '', + )); + }); + } + + QueryBuilder + daysElementEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'days', + value: value, + )); + }); + } + + QueryBuilder + daysLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder + daysIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + daysIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + daysLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + daysLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + daysLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'days', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder + deleteAfterGoesOffEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'deleteAfterGoesOff', + value: value, + )); + }); + } + + QueryBuilder + firestoreIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'firestoreId', + )); + }); + } + + QueryBuilder + firestoreIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'firestoreId', + )); + }); + } + + QueryBuilder + firestoreIdEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'firestoreId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'firestoreId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'firestoreId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + firestoreIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'firestoreId', + value: '', + )); + }); + } + + QueryBuilder + firestoreIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'firestoreId', + value: '', + )); + }); + } + + QueryBuilder + gradientEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'gradient', + value: value, + )); + }); + } + + QueryBuilder + gradientGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'gradient', + value: value, + )); + }); + } + + QueryBuilder + gradientLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'gradient', + value: value, + )); + }); + } + + QueryBuilder + gradientBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'gradient', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + guardianEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'guardian', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'guardian', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'guardian', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'guardian', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'guardian', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'guardian', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'guardian', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'guardian', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + guardianIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'guardian', + value: '', + )); + }); + } + + QueryBuilder + guardianIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'guardian', + value: '', + )); + }); + } + + QueryBuilder + guardianTimerEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'guardianTimer', + value: value, + )); + }); + } + + QueryBuilder + guardianTimerGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'guardianTimer', + value: value, + )); + }); + } + + QueryBuilder + guardianTimerLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'guardianTimer', + value: value, + )); + }); + } + + QueryBuilder + guardianTimerBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'guardianTimer', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + intervalToAlarmEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'intervalToAlarm', + value: value, + )); + }); + } + + QueryBuilder + intervalToAlarmGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'intervalToAlarm', + value: value, + )); + }); + } + + QueryBuilder + intervalToAlarmLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'intervalToAlarm', + value: value, + )); + }); + } + + QueryBuilder + intervalToAlarmBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'intervalToAlarm', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + isActivityEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isActivityEnabled', + value: value, + )); + }); + } + + QueryBuilder isCallEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isCall', + value: value, + )); + }); + } + + QueryBuilder + isEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isEnabled', + value: value, + )); + }); + } + + QueryBuilder + isGuardianEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isGuardian', + value: value, + )); + }); + } + + QueryBuilder + isLocationEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isLocationEnabled', + value: value, + )); + }); + } + + QueryBuilder + isMathsEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isMathsEnabled', + value: value, + )); + }); + } + + QueryBuilder + isOneTimeEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isOneTime', + value: value, + )); + }); + } + + QueryBuilder + isPedometerEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isPedometerEnabled', + value: value, + )); + }); + } + + QueryBuilder + isQrEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isQrEnabled', + value: value, + )); + }); + } + + QueryBuilder + isShakeEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isShakeEnabled', + value: value, + )); + }); + } + + QueryBuilder + isSharedAlarmEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isSharedAlarmEnabled', + value: value, + )); + }); + } + + QueryBuilder + isWeatherEnabledEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isWeatherEnabled', + value: value, + )); + }); + } + + QueryBuilder isarIdEqualTo( + Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder + isarIdGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder + isarIdLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder isarIdBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'isarId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder labelEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'label', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + labelGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'label', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder labelLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'label', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder labelBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'label', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + labelStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'label', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder labelEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'label', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder labelContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'label', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder labelMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'label', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + labelIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'label', + value: '', + )); + }); + } + + QueryBuilder + labelIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'label', + value: '', + )); + }); + } + + QueryBuilder + lastEditedUserIdEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'lastEditedUserId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'lastEditedUserId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'lastEditedUserId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'lastEditedUserId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'lastEditedUserId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'lastEditedUserId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'lastEditedUserId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'lastEditedUserId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + lastEditedUserIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'lastEditedUserId', + value: '', + )); + }); + } + + QueryBuilder + lastEditedUserIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'lastEditedUserId', + value: '', + )); + }); + } + + QueryBuilder + locationEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'location', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'location', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'location', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'location', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'location', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'location', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'location', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'location', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + locationIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'location', + value: '', + )); + }); + } + + QueryBuilder + locationIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'location', + value: '', + )); + }); + } + + QueryBuilder + mathsDifficultyEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'mathsDifficulty', + value: value, + )); + }); + } + + QueryBuilder + mathsDifficultyGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'mathsDifficulty', + value: value, + )); + }); + } + + QueryBuilder + mathsDifficultyLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'mathsDifficulty', + value: value, + )); + }); + } + + QueryBuilder + mathsDifficultyBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'mathsDifficulty', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + minutesSinceMidnightEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'minutesSinceMidnight', + value: value, + )); + }); + } + + QueryBuilder + minutesSinceMidnightGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'minutesSinceMidnight', + value: value, + )); + }); + } + + QueryBuilder + minutesSinceMidnightLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'minutesSinceMidnight', + value: value, + )); + }); + } + + QueryBuilder + minutesSinceMidnightBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'minutesSinceMidnight', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + mutexLockEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'mutexLock', + value: value, + )); + }); + } + + QueryBuilder noteEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'note', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + noteGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'note', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder noteLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'note', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder noteBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'note', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + noteStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'note', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder noteEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'note', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder noteContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'note', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder noteMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'note', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + noteIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'note', + value: '', + )); + }); + } + + QueryBuilder + noteIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'note', + value: '', + )); + }); + } + + QueryBuilder + numMathsQuestionsEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'numMathsQuestions', + value: value, + )); + }); + } + + QueryBuilder + numMathsQuestionsGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'numMathsQuestions', + value: value, + )); + }); + } + + QueryBuilder + numMathsQuestionsLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'numMathsQuestions', + value: value, + )); + }); + } + + QueryBuilder + numMathsQuestionsBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'numMathsQuestions', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + numberOfStepsEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'numberOfSteps', + value: value, + )); + }); + } + + QueryBuilder + numberOfStepsGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'numberOfSteps', + value: value, + )); + }); + } + + QueryBuilder + numberOfStepsLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'numberOfSteps', + value: value, + )); + }); + } + + QueryBuilder + numberOfStepsBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'numberOfSteps', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + ownerIdEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'ownerId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'ownerId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'ownerId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ownerId', + value: '', + )); + }); + } + + QueryBuilder + ownerIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'ownerId', + value: '', + )); + }); + } + + QueryBuilder + ownerNameEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ownerName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'ownerName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'ownerName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'ownerName', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'ownerName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'ownerName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'ownerName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'ownerName', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ownerNameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ownerName', + value: '', + )); + }); + } + + QueryBuilder + ownerNameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'ownerName', + value: '', + )); + }); + } + + QueryBuilder + profileNameEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'profileName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'profileName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'profileName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'profileName', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'profileName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'profileName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'profileName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'profileName', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + profileNameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'profileName', + value: '', + )); + }); + } + + QueryBuilder + profileNameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'profileName', + value: '', + )); + }); + } + + QueryBuilder + qrValueEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'qrValue', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'qrValue', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'qrValue', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'qrValue', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'qrValue', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'qrValue', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'qrValue', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'qrValue', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + qrValueIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'qrValue', + value: '', + )); + }); + } + + QueryBuilder + qrValueIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'qrValue', + value: '', + )); + }); + } + + QueryBuilder ringOnEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ringOn', + value: value, + )); + }); + } + + QueryBuilder + ringtoneNameEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ringtoneName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'ringtoneName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'ringtoneName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'ringtoneName', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'ringtoneName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'ringtoneName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'ringtoneName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'ringtoneName', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + ringtoneNameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ringtoneName', + value: '', + )); + }); + } + + QueryBuilder + ringtoneNameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'ringtoneName', + value: '', + )); + }); + } + + QueryBuilder + shakeTimesEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'shakeTimes', + value: value, + )); + }); + } + + QueryBuilder + shakeTimesGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'shakeTimes', + value: value, + )); + }); + } + + QueryBuilder + shakeTimesLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'shakeTimes', + value: value, + )); + }); + } + + QueryBuilder + shakeTimesBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'shakeTimes', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + sharedUserIdsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'sharedUserIds', + )); + }); + } + + QueryBuilder + sharedUserIdsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'sharedUserIds', + )); + }); + } + + QueryBuilder + sharedUserIdsElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sharedUserIds', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'sharedUserIds', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'sharedUserIds', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'sharedUserIds', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'sharedUserIds', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'sharedUserIds', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'sharedUserIds', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'sharedUserIds', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + sharedUserIdsElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sharedUserIds', + value: '', + )); + }); + } + + QueryBuilder + sharedUserIdsElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'sharedUserIds', + value: '', + )); + }); + } + + QueryBuilder + sharedUserIdsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'sharedUserIds', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder + sharedUserIdsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'sharedUserIds', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + sharedUserIdsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'sharedUserIds', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + sharedUserIdsLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'sharedUserIds', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + sharedUserIdsLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'sharedUserIds', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + sharedUserIdsLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'sharedUserIds', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder + showMotivationalQuoteEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'showMotivationalQuote', + value: value, + )); + }); + } + + QueryBuilder + snoozeDurationEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'snoozeDuration', + value: value, + )); + }); + } + + QueryBuilder + snoozeDurationGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'snoozeDuration', + value: value, + )); + }); + } + + QueryBuilder + snoozeDurationLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'snoozeDuration', + value: value, + )); + }); + } + + QueryBuilder + snoozeDurationBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'snoozeDuration', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder volMaxEqualTo( + double value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'volMax', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + volMaxGreaterThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'volMax', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + volMaxLessThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'volMax', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMaxBetween( + double lower, + double upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'volMax', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMinEqualTo( + double value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'volMin', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + volMinGreaterThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'volMin', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + volMinLessThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'volMin', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder volMinBetween( + double lower, + double upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'volMin', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + weatherTypesElementEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'weatherTypes', + value: value, + )); + }); + } + + QueryBuilder + weatherTypesElementGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'weatherTypes', + value: value, + )); + }); + } + + QueryBuilder + weatherTypesElementLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'weatherTypes', + value: value, + )); + }); + } + + QueryBuilder + weatherTypesElementBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'weatherTypes', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + weatherTypesLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'weatherTypes', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder + weatherTypesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'weatherTypes', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + weatherTypesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'weatherTypes', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + weatherTypesLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'weatherTypes', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + weatherTypesLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'weatherTypes', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + weatherTypesLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'weatherTypes', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } +} + +extension ProfileModelQueryObject + on QueryBuilder {} + +extension ProfileModelQueryLinks + on QueryBuilder {} + +extension ProfileModelQuerySortBy + on QueryBuilder { + QueryBuilder + sortByActivityInterval() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityInterval', Sort.asc); + }); + } + + QueryBuilder + sortByActivityIntervalDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityInterval', Sort.desc); + }); + } + + QueryBuilder + sortByActivityMonitor() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityMonitor', Sort.asc); + }); + } + + QueryBuilder + sortByActivityMonitorDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityMonitor', Sort.desc); + }); + } + + QueryBuilder sortByAlarmDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.asc); + }); + } + + QueryBuilder sortByAlarmDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.desc); + }); + } + + QueryBuilder + sortByDeleteAfterGoesOff() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleteAfterGoesOff', Sort.asc); + }); + } + + QueryBuilder + sortByDeleteAfterGoesOffDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleteAfterGoesOff', Sort.desc); + }); + } + + QueryBuilder sortByFirestoreId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'firestoreId', Sort.asc); + }); + } + + QueryBuilder + sortByFirestoreIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'firestoreId', Sort.desc); + }); + } + + QueryBuilder sortByGradient() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.asc); + }); + } + + QueryBuilder sortByGradientDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.desc); + }); + } + + QueryBuilder sortByGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.asc); + }); + } + + QueryBuilder sortByGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.desc); + }); + } + + QueryBuilder sortByGuardianTimer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.asc); + }); + } + + QueryBuilder + sortByGuardianTimerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.desc); + }); + } + + QueryBuilder + sortByIntervalToAlarm() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'intervalToAlarm', Sort.asc); + }); + } + + QueryBuilder + sortByIntervalToAlarmDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'intervalToAlarm', Sort.desc); + }); + } + + QueryBuilder + sortByIsActivityEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isActivityEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsActivityEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isActivityEnabled', Sort.desc); + }); + } + + QueryBuilder sortByIsCall() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.asc); + }); + } + + QueryBuilder sortByIsCallDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.desc); + }); + } + + QueryBuilder sortByIsEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isEnabled', Sort.asc); + }); + } + + QueryBuilder sortByIsEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isEnabled', Sort.desc); + }); + } + + QueryBuilder sortByIsGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.asc); + }); + } + + QueryBuilder + sortByIsGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.desc); + }); + } + + QueryBuilder + sortByIsLocationEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isLocationEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsLocationEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isLocationEnabled', Sort.desc); + }); + } + + QueryBuilder + sortByIsMathsEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMathsEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsMathsEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMathsEnabled', Sort.desc); + }); + } + + QueryBuilder sortByIsOneTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isOneTime', Sort.asc); + }); + } + + QueryBuilder sortByIsOneTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isOneTime', Sort.desc); + }); + } + + QueryBuilder + sortByIsPedometerEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPedometerEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsPedometerEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPedometerEnabled', Sort.desc); + }); + } + + QueryBuilder sortByIsQrEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isQrEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsQrEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isQrEnabled', Sort.desc); + }); + } + + QueryBuilder + sortByIsShakeEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isShakeEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsShakeEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isShakeEnabled', Sort.desc); + }); + } + + QueryBuilder + sortByIsSharedAlarmEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isSharedAlarmEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsSharedAlarmEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isSharedAlarmEnabled', Sort.desc); + }); + } + + QueryBuilder + sortByIsWeatherEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isWeatherEnabled', Sort.asc); + }); + } + + QueryBuilder + sortByIsWeatherEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isWeatherEnabled', Sort.desc); + }); + } + + QueryBuilder sortByLabel() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'label', Sort.asc); + }); + } + + QueryBuilder sortByLabelDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'label', Sort.desc); + }); + } + + QueryBuilder + sortByLastEditedUserId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastEditedUserId', Sort.asc); + }); + } + + QueryBuilder + sortByLastEditedUserIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastEditedUserId', Sort.desc); + }); + } + + QueryBuilder sortByLocation() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'location', Sort.asc); + }); + } + + QueryBuilder sortByLocationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'location', Sort.desc); + }); + } + + QueryBuilder + sortByMathsDifficulty() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mathsDifficulty', Sort.asc); + }); + } + + QueryBuilder + sortByMathsDifficultyDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mathsDifficulty', Sort.desc); + }); + } + + QueryBuilder + sortByMinutesSinceMidnight() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'minutesSinceMidnight', Sort.asc); + }); + } + + QueryBuilder + sortByMinutesSinceMidnightDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'minutesSinceMidnight', Sort.desc); + }); + } + + QueryBuilder sortByMutexLock() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mutexLock', Sort.asc); + }); + } + + QueryBuilder sortByMutexLockDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mutexLock', Sort.desc); + }); + } + + QueryBuilder sortByNote() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'note', Sort.asc); + }); + } + + QueryBuilder sortByNoteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'note', Sort.desc); + }); + } + + QueryBuilder + sortByNumMathsQuestions() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numMathsQuestions', Sort.asc); + }); + } + + QueryBuilder + sortByNumMathsQuestionsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numMathsQuestions', Sort.desc); + }); + } + + QueryBuilder sortByNumberOfSteps() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfSteps', Sort.asc); + }); + } + + QueryBuilder + sortByNumberOfStepsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfSteps', Sort.desc); + }); + } + + QueryBuilder sortByOwnerId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerId', Sort.asc); + }); + } + + QueryBuilder sortByOwnerIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerId', Sort.desc); + }); + } + + QueryBuilder sortByOwnerName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerName', Sort.asc); + }); + } + + QueryBuilder sortByOwnerNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerName', Sort.desc); + }); + } + + QueryBuilder sortByProfileName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profileName', Sort.asc); + }); + } + + QueryBuilder + sortByProfileNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profileName', Sort.desc); + }); + } + + QueryBuilder sortByQrValue() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'qrValue', Sort.asc); + }); + } + + QueryBuilder sortByQrValueDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'qrValue', Sort.desc); + }); + } + + QueryBuilder sortByRingOn() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.asc); + }); + } + + QueryBuilder sortByRingOnDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.desc); + }); + } + + QueryBuilder sortByRingtoneName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringtoneName', Sort.asc); + }); + } + + QueryBuilder + sortByRingtoneNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringtoneName', Sort.desc); + }); + } + + QueryBuilder sortByShakeTimes() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'shakeTimes', Sort.asc); + }); + } + + QueryBuilder + sortByShakeTimesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'shakeTimes', Sort.desc); + }); + } + + QueryBuilder + sortByShowMotivationalQuote() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showMotivationalQuote', Sort.asc); + }); + } + + QueryBuilder + sortByShowMotivationalQuoteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showMotivationalQuote', Sort.desc); + }); + } + + QueryBuilder + sortBySnoozeDuration() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'snoozeDuration', Sort.asc); + }); + } + + QueryBuilder + sortBySnoozeDurationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'snoozeDuration', Sort.desc); + }); + } + + QueryBuilder sortByVolMax() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.asc); + }); + } + + QueryBuilder sortByVolMaxDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.desc); + }); + } + + QueryBuilder sortByVolMin() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.asc); + }); + } + + QueryBuilder sortByVolMinDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.desc); + }); + } +} + +extension ProfileModelQuerySortThenBy + on QueryBuilder { + QueryBuilder + thenByActivityInterval() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityInterval', Sort.asc); + }); + } + + QueryBuilder + thenByActivityIntervalDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityInterval', Sort.desc); + }); + } + + QueryBuilder + thenByActivityMonitor() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityMonitor', Sort.asc); + }); + } + + QueryBuilder + thenByActivityMonitorDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'activityMonitor', Sort.desc); + }); + } + + QueryBuilder thenByAlarmDate() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.asc); + }); + } + + QueryBuilder thenByAlarmDateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'alarmDate', Sort.desc); + }); + } + + QueryBuilder + thenByDeleteAfterGoesOff() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleteAfterGoesOff', Sort.asc); + }); + } + + QueryBuilder + thenByDeleteAfterGoesOffDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleteAfterGoesOff', Sort.desc); + }); + } + + QueryBuilder thenByFirestoreId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'firestoreId', Sort.asc); + }); + } + + QueryBuilder + thenByFirestoreIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'firestoreId', Sort.desc); + }); + } + + QueryBuilder thenByGradient() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.asc); + }); + } + + QueryBuilder thenByGradientDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'gradient', Sort.desc); + }); + } + + QueryBuilder thenByGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.asc); + }); + } + + QueryBuilder thenByGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardian', Sort.desc); + }); + } + + QueryBuilder thenByGuardianTimer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.asc); + }); + } + + QueryBuilder + thenByGuardianTimerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'guardianTimer', Sort.desc); + }); + } + + QueryBuilder + thenByIntervalToAlarm() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'intervalToAlarm', Sort.asc); + }); + } + + QueryBuilder + thenByIntervalToAlarmDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'intervalToAlarm', Sort.desc); + }); + } + + QueryBuilder + thenByIsActivityEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isActivityEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsActivityEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isActivityEnabled', Sort.desc); + }); + } + + QueryBuilder thenByIsCall() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.asc); + }); + } + + QueryBuilder thenByIsCallDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isCall', Sort.desc); + }); + } + + QueryBuilder thenByIsEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isEnabled', Sort.asc); + }); + } + + QueryBuilder thenByIsEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isEnabled', Sort.desc); + }); + } + + QueryBuilder thenByIsGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.asc); + }); + } + + QueryBuilder + thenByIsGuardianDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isGuardian', Sort.desc); + }); + } + + QueryBuilder + thenByIsLocationEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isLocationEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsLocationEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isLocationEnabled', Sort.desc); + }); + } + + QueryBuilder + thenByIsMathsEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMathsEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsMathsEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMathsEnabled', Sort.desc); + }); + } + + QueryBuilder thenByIsOneTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isOneTime', Sort.asc); + }); + } + + QueryBuilder thenByIsOneTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isOneTime', Sort.desc); + }); + } + + QueryBuilder + thenByIsPedometerEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPedometerEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsPedometerEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPedometerEnabled', Sort.desc); + }); + } + + QueryBuilder thenByIsQrEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isQrEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsQrEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isQrEnabled', Sort.desc); + }); + } + + QueryBuilder + thenByIsShakeEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isShakeEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsShakeEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isShakeEnabled', Sort.desc); + }); + } + + QueryBuilder + thenByIsSharedAlarmEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isSharedAlarmEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsSharedAlarmEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isSharedAlarmEnabled', Sort.desc); + }); + } + + QueryBuilder + thenByIsWeatherEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isWeatherEnabled', Sort.asc); + }); + } + + QueryBuilder + thenByIsWeatherEnabledDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isWeatherEnabled', Sort.desc); + }); + } + + QueryBuilder thenByIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.asc); + }); + } + + QueryBuilder thenByIsarIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.desc); + }); + } + + QueryBuilder thenByLabel() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'label', Sort.asc); + }); + } + + QueryBuilder thenByLabelDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'label', Sort.desc); + }); + } + + QueryBuilder + thenByLastEditedUserId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastEditedUserId', Sort.asc); + }); + } + + QueryBuilder + thenByLastEditedUserIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastEditedUserId', Sort.desc); + }); + } + + QueryBuilder thenByLocation() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'location', Sort.asc); + }); + } + + QueryBuilder thenByLocationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'location', Sort.desc); + }); + } + + QueryBuilder + thenByMathsDifficulty() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mathsDifficulty', Sort.asc); + }); + } + + QueryBuilder + thenByMathsDifficultyDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mathsDifficulty', Sort.desc); + }); + } + + QueryBuilder + thenByMinutesSinceMidnight() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'minutesSinceMidnight', Sort.asc); + }); + } + + QueryBuilder + thenByMinutesSinceMidnightDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'minutesSinceMidnight', Sort.desc); + }); + } + + QueryBuilder thenByMutexLock() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mutexLock', Sort.asc); + }); + } + + QueryBuilder thenByMutexLockDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mutexLock', Sort.desc); + }); + } + + QueryBuilder thenByNote() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'note', Sort.asc); + }); + } + + QueryBuilder thenByNoteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'note', Sort.desc); + }); + } + + QueryBuilder + thenByNumMathsQuestions() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numMathsQuestions', Sort.asc); + }); + } + + QueryBuilder + thenByNumMathsQuestionsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numMathsQuestions', Sort.desc); + }); + } + + QueryBuilder thenByNumberOfSteps() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfSteps', Sort.asc); + }); + } + + QueryBuilder + thenByNumberOfStepsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfSteps', Sort.desc); + }); + } + + QueryBuilder thenByOwnerId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerId', Sort.asc); + }); + } + + QueryBuilder thenByOwnerIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerId', Sort.desc); + }); + } + + QueryBuilder thenByOwnerName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerName', Sort.asc); + }); + } + + QueryBuilder thenByOwnerNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ownerName', Sort.desc); + }); + } + + QueryBuilder thenByProfileName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profileName', Sort.asc); + }); + } + + QueryBuilder + thenByProfileNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'profileName', Sort.desc); + }); + } + + QueryBuilder thenByQrValue() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'qrValue', Sort.asc); + }); + } + + QueryBuilder thenByQrValueDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'qrValue', Sort.desc); + }); + } + + QueryBuilder thenByRingOn() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.asc); + }); + } + + QueryBuilder thenByRingOnDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringOn', Sort.desc); + }); + } + + QueryBuilder thenByRingtoneName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringtoneName', Sort.asc); + }); + } + + QueryBuilder + thenByRingtoneNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ringtoneName', Sort.desc); + }); + } + + QueryBuilder thenByShakeTimes() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'shakeTimes', Sort.asc); + }); + } + + QueryBuilder + thenByShakeTimesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'shakeTimes', Sort.desc); + }); + } + + QueryBuilder + thenByShowMotivationalQuote() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showMotivationalQuote', Sort.asc); + }); + } + + QueryBuilder + thenByShowMotivationalQuoteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showMotivationalQuote', Sort.desc); + }); + } + + QueryBuilder + thenBySnoozeDuration() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'snoozeDuration', Sort.asc); + }); + } + + QueryBuilder + thenBySnoozeDurationDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'snoozeDuration', Sort.desc); + }); + } + + QueryBuilder thenByVolMax() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.asc); + }); + } + + QueryBuilder thenByVolMaxDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMax', Sort.desc); + }); + } + + QueryBuilder thenByVolMin() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.asc); + }); + } + + QueryBuilder thenByVolMinDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volMin', Sort.desc); + }); + } +} + +extension ProfileModelQueryWhereDistinct + on QueryBuilder { + QueryBuilder + distinctByActivityInterval() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'activityInterval'); + }); + } + + QueryBuilder + distinctByActivityMonitor() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'activityMonitor'); + }); + } + + QueryBuilder distinctByAlarmDate( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'alarmDate', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByDays() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'days'); + }); + } + + QueryBuilder + distinctByDeleteAfterGoesOff() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'deleteAfterGoesOff'); + }); + } + + QueryBuilder distinctByFirestoreId( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'firestoreId', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByGradient() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'gradient'); + }); + } + + QueryBuilder distinctByGuardian( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'guardian', caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByGuardianTimer() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'guardianTimer'); + }); + } + + QueryBuilder + distinctByIntervalToAlarm() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'intervalToAlarm'); + }); + } + + QueryBuilder + distinctByIsActivityEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isActivityEnabled'); + }); + } + + QueryBuilder distinctByIsCall() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isCall'); + }); + } + + QueryBuilder distinctByIsEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isEnabled'); + }); + } + + QueryBuilder distinctByIsGuardian() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isGuardian'); + }); + } + + QueryBuilder + distinctByIsLocationEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isLocationEnabled'); + }); + } + + QueryBuilder + distinctByIsMathsEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isMathsEnabled'); + }); + } + + QueryBuilder distinctByIsOneTime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isOneTime'); + }); + } + + QueryBuilder + distinctByIsPedometerEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isPedometerEnabled'); + }); + } + + QueryBuilder distinctByIsQrEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isQrEnabled'); + }); + } + + QueryBuilder + distinctByIsShakeEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isShakeEnabled'); + }); + } + + QueryBuilder + distinctByIsSharedAlarmEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isSharedAlarmEnabled'); + }); + } + + QueryBuilder + distinctByIsWeatherEnabled() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isWeatherEnabled'); + }); + } + + QueryBuilder distinctByLabel( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'label', caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByLastEditedUserId({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'lastEditedUserId', + caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByLocation( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'location', caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByMathsDifficulty() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'mathsDifficulty'); + }); + } + + QueryBuilder + distinctByMinutesSinceMidnight() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'minutesSinceMidnight'); + }); + } + + QueryBuilder distinctByMutexLock() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'mutexLock'); + }); + } + + QueryBuilder distinctByNote( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'note', caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByNumMathsQuestions() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'numMathsQuestions'); + }); + } + + QueryBuilder + distinctByNumberOfSteps() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'numberOfSteps'); + }); + } + + QueryBuilder distinctByOwnerId( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ownerId', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByOwnerName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ownerName', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByProfileName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'profileName', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByQrValue( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'qrValue', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByRingOn() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ringOn'); + }); + } + + QueryBuilder distinctByRingtoneName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ringtoneName', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByShakeTimes() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'shakeTimes'); + }); + } + + QueryBuilder + distinctBySharedUserIds() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'sharedUserIds'); + }); + } + + QueryBuilder + distinctByShowMotivationalQuote() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'showMotivationalQuote'); + }); + } + + QueryBuilder + distinctBySnoozeDuration() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'snoozeDuration'); + }); + } + + QueryBuilder distinctByVolMax() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'volMax'); + }); + } + + QueryBuilder distinctByVolMin() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'volMin'); + }); + } + + QueryBuilder distinctByWeatherTypes() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'weatherTypes'); + }); + } +} + +extension ProfileModelQueryProperty + on QueryBuilder { + QueryBuilder isarIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isarId'); + }); + } + + QueryBuilder activityIntervalProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'activityInterval'); + }); + } + + QueryBuilder activityMonitorProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'activityMonitor'); + }); + } + + QueryBuilder alarmDateProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'alarmDate'); + }); + } + + QueryBuilder, QQueryOperations> daysProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'days'); + }); + } + + QueryBuilder + deleteAfterGoesOffProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'deleteAfterGoesOff'); + }); + } + + QueryBuilder firestoreIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'firestoreId'); + }); + } + + QueryBuilder gradientProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'gradient'); + }); + } + + QueryBuilder guardianProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'guardian'); + }); + } + + QueryBuilder guardianTimerProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'guardianTimer'); + }); + } + + QueryBuilder intervalToAlarmProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'intervalToAlarm'); + }); + } + + QueryBuilder + isActivityEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isActivityEnabled'); + }); + } + + QueryBuilder isCallProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isCall'); + }); + } + + QueryBuilder isEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isEnabled'); + }); + } + + QueryBuilder isGuardianProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isGuardian'); + }); + } + + QueryBuilder + isLocationEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isLocationEnabled'); + }); + } + + QueryBuilder isMathsEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isMathsEnabled'); + }); + } + + QueryBuilder isOneTimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isOneTime'); + }); + } + + QueryBuilder + isPedometerEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isPedometerEnabled'); + }); + } + + QueryBuilder isQrEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isQrEnabled'); + }); + } + + QueryBuilder isShakeEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isShakeEnabled'); + }); + } + + QueryBuilder + isSharedAlarmEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isSharedAlarmEnabled'); + }); + } + + QueryBuilder + isWeatherEnabledProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isWeatherEnabled'); + }); + } + + QueryBuilder labelProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'label'); + }); + } + + QueryBuilder + lastEditedUserIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'lastEditedUserId'); + }); + } + + QueryBuilder locationProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'location'); + }); + } + + QueryBuilder mathsDifficultyProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'mathsDifficulty'); + }); + } + + QueryBuilder + minutesSinceMidnightProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'minutesSinceMidnight'); + }); + } + + QueryBuilder mutexLockProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'mutexLock'); + }); + } + + QueryBuilder noteProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'note'); + }); + } + + QueryBuilder + numMathsQuestionsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'numMathsQuestions'); + }); + } + + QueryBuilder numberOfStepsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'numberOfSteps'); + }); + } + + QueryBuilder ownerIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ownerId'); + }); + } + + QueryBuilder ownerNameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ownerName'); + }); + } + + QueryBuilder profileNameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'profileName'); + }); + } + + QueryBuilder qrValueProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'qrValue'); + }); + } + + QueryBuilder ringOnProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ringOn'); + }); + } + + QueryBuilder ringtoneNameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ringtoneName'); + }); + } + + QueryBuilder shakeTimesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'shakeTimes'); + }); + } + + QueryBuilder?, QQueryOperations> + sharedUserIdsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'sharedUserIds'); + }); + } + + QueryBuilder + showMotivationalQuoteProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'showMotivationalQuote'); + }); + } + + QueryBuilder snoozeDurationProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'snoozeDuration'); + }); + } + + QueryBuilder volMaxProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'volMax'); + }); + } + + QueryBuilder volMinProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'volMin'); + }); + } + + QueryBuilder, QQueryOperations> + weatherTypesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'weatherTypes'); + }); + } +} diff --git a/lib/app/data/models/saved_emails.dart b/lib/app/data/models/saved_emails.dart new file mode 100644 index 00000000..06ce12b2 --- /dev/null +++ b/lib/app/data/models/saved_emails.dart @@ -0,0 +1,11 @@ +import 'package:isar/isar.dart'; + +part 'saved_emails.g.dart'; + +@collection +class Saved_Emails { + Id isarId = Isar.autoIncrement; + late String email; + late String username; + Saved_Emails({required this.email, required this.username}); +} diff --git a/lib/app/data/models/saved_emails.g.dart b/lib/app/data/models/saved_emails.g.dart new file mode 100644 index 00000000..06482a9a --- /dev/null +++ b/lib/app/data/models/saved_emails.g.dart @@ -0,0 +1,626 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'saved_emails.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetSaved_EmailsCollection on Isar { + IsarCollection get saved_Emails => this.collection(); +} + +const Saved_EmailsSchema = CollectionSchema( + name: r'Saved_Emails', + id: -2367323525526520603, + properties: { + r'email': PropertySchema( + id: 0, + name: r'email', + type: IsarType.string, + ), + r'username': PropertySchema( + id: 1, + name: r'username', + type: IsarType.string, + ) + }, + estimateSize: _saved_EmailsEstimateSize, + serialize: _saved_EmailsSerialize, + deserialize: _saved_EmailsDeserialize, + deserializeProp: _saved_EmailsDeserializeProp, + idName: r'isarId', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _saved_EmailsGetId, + getLinks: _saved_EmailsGetLinks, + attach: _saved_EmailsAttach, + version: '3.1.0+1', +); + +int _saved_EmailsEstimateSize( + Saved_Emails object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.email.length * 3; + bytesCount += 3 + object.username.length * 3; + return bytesCount; +} + +void _saved_EmailsSerialize( + Saved_Emails object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.email); + writer.writeString(offsets[1], object.username); +} + +Saved_Emails _saved_EmailsDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Saved_Emails( + email: reader.readString(offsets[0]), + username: reader.readString(offsets[1]), + ); + object.isarId = id; + return object; +} + +P _saved_EmailsDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readString(offset)) as P; + case 1: + return (reader.readString(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _saved_EmailsGetId(Saved_Emails object) { + return object.isarId; +} + +List> _saved_EmailsGetLinks(Saved_Emails object) { + return []; +} + +void _saved_EmailsAttach( + IsarCollection col, Id id, Saved_Emails object) { + object.isarId = id; +} + +extension Saved_EmailsQueryWhereSort + on QueryBuilder { + QueryBuilder anyIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension Saved_EmailsQueryWhere + on QueryBuilder { + QueryBuilder isarIdEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: isarId, + upper: isarId, + )); + }); + } + + QueryBuilder isarIdNotEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ); + } + }); + } + + QueryBuilder isarIdGreaterThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: include), + ); + }); + } + + QueryBuilder isarIdLessThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: include), + ); + }); + } + + QueryBuilder isarIdBetween( + Id lowerIsarId, + Id upperIsarId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerIsarId, + includeLower: includeLower, + upper: upperIsarId, + includeUpper: includeUpper, + )); + }); + } +} + +extension Saved_EmailsQueryFilter + on QueryBuilder { + QueryBuilder emailEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'email', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + emailGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'email', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder emailLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'email', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder emailBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'email', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + emailStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'email', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder emailEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'email', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder emailContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'email', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder emailMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'email', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + emailIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'email', + value: '', + )); + }); + } + + QueryBuilder + emailIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'email', + value: '', + )); + }); + } + + QueryBuilder isarIdEqualTo( + Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder + isarIdGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder + isarIdLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder isarIdBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'isarId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + usernameEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'username', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'username', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'username', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'username', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'username', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'username', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'username', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'username', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + usernameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'username', + value: '', + )); + }); + } + + QueryBuilder + usernameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'username', + value: '', + )); + }); + } +} + +extension Saved_EmailsQueryObject + on QueryBuilder {} + +extension Saved_EmailsQueryLinks + on QueryBuilder {} + +extension Saved_EmailsQuerySortBy + on QueryBuilder { + QueryBuilder sortByEmail() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'email', Sort.asc); + }); + } + + QueryBuilder sortByEmailDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'email', Sort.desc); + }); + } + + QueryBuilder sortByUsername() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'username', Sort.asc); + }); + } + + QueryBuilder sortByUsernameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'username', Sort.desc); + }); + } +} + +extension Saved_EmailsQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByEmail() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'email', Sort.asc); + }); + } + + QueryBuilder thenByEmailDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'email', Sort.desc); + }); + } + + QueryBuilder thenByIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.asc); + }); + } + + QueryBuilder thenByIsarIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.desc); + }); + } + + QueryBuilder thenByUsername() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'username', Sort.asc); + }); + } + + QueryBuilder thenByUsernameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'username', Sort.desc); + }); + } +} + +extension Saved_EmailsQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByEmail( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'email', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByUsername( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'username', caseSensitive: caseSensitive); + }); + } +} + +extension Saved_EmailsQueryProperty + on QueryBuilder { + QueryBuilder isarIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isarId'); + }); + } + + QueryBuilder emailProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'email'); + }); + } + + QueryBuilder usernameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'username'); + }); + } +} diff --git a/lib/app/data/models/user_model.dart b/lib/app/data/models/user_model.dart index 84beedc5..3fff77be 100644 --- a/lib/app/data/models/user_model.dart +++ b/lib/app/data/models/user_model.dart @@ -4,6 +4,7 @@ class UserModel { final String lastName; final String email; final String id; + List receivedItems = []; UserModel({ required this.fullName, @@ -11,6 +12,7 @@ class UserModel { required this.lastName, required this.email, required this.id, + this.receivedItems = const [], }); Map toJson() { @@ -20,6 +22,7 @@ class UserModel { 'lastName': lastName, 'email': email, 'id': id, + 'receivedItems': receivedItems }; } @@ -30,6 +33,7 @@ class UserModel { lastName: json['lastName'], email: json['email'], id: json['id'], + receivedItems: json['receivedItems'], ); } } diff --git a/lib/app/data/providers/firestore_provider.dart b/lib/app/data/providers/firestore_provider.dart index 063f84b5..0b4de2c7 100644 --- a/lib/app/data/providers/firestore_provider.dart +++ b/lib/app/data/providers/firestore_provider.dart @@ -1,21 +1,33 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; +import 'package:ultimate_alarm_clock/app/data/models/profile_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:sqflite/sqflite.dart'; +import '../../modules/home/controllers/home_controller.dart'; +import 'get_storage_provider.dart'; + class FirestoreDb { static final FirebaseFirestore _firebaseFirestore = FirebaseFirestore.instance; static final CollectionReference _usersCollection = FirebaseFirestore.instance.collection('users'); + + static final _firebaseAuthInstance = FirebaseAuth.instance; + + static final storage = Get.find(); + Future getSQLiteDatabase() async { Database? db; final dir = await getDatabasesPath(); - final dbPath = '${dir}/alarms.db'; + final dbPath = '$dir/alarms.db'; print(dir); db = await openDatabase(dbPath, version: 1, onCreate: _onCreate); return db; @@ -24,7 +36,7 @@ class FirestoreDb { void _onCreate(Database db, int version) async { // Create tables for alarms and ringtones (modify column types as needed) await db.execute(''' - CREATE TABLE alarms ( + CREATE TABLE alarms ( id INTEGER PRIMARY KEY AUTOINCREMENT, firestoreId TEXT, alarmTime TEXT NOT NULL, @@ -65,7 +77,14 @@ class FirestoreDb { showMotivationalQuote INTEGER NOT NULL DEFAULT 0, volMin REAL, volMax REAL, - activityMonitor INTEGER + activityMonitor INTEGER, + profile TEXT NOT NULL, + isGuardian INTEGER, + guardianTimer INTEGER, + guardian TEXT, + isCall INTEGER, + ringOn INTEGER + ) '''); await db.execute(''' @@ -91,8 +110,9 @@ class FirestoreDb { } static Future addUser(UserModel userModel) async { - final DocumentReference docRef = _usersCollection.doc(userModel.id); - await docRef.set(userModel.toJson()); + final DocumentReference docRef = _usersCollection.doc(userModel.email); + final user = await docRef.get(); + if (!user.exists) await docRef.set(userModel.toJson()); } static addAlarm(UserModel? user, AlarmModel alarmRecord) async { @@ -103,7 +123,7 @@ class FirestoreDb { } await sql! .insert('alarms', alarmRecord.toSQFliteMap()) - .then((value) => print("insert success")); + .then((value) => print('insert success')); await _alarmsCollection(user) .add(AlarmModel.toMap(alarmRecord)) .then((value) => alarmRecord.firestoreId = value.id); @@ -136,7 +156,8 @@ class FirestoreDb { UserModel? user, String time, ) async { - if (user == null) return Utils.genFakeAlarmModel(); + HomeController homeController = Get.find(); + if (user == null) return homeController.genFakeAlarmModel(); QuerySnapshot snapshot = await _alarmsCollection(user) .where('isEnabled', isEqualTo: true) .where('alarmTime', isEqualTo: time) @@ -278,6 +299,79 @@ class FirestoreDb { .update(AlarmModel.toMap(alarmRecord)); } + static Future userExists(String email) async { + final receiver = + await _firebaseFirestore.collection('users').doc(email).get(); + if (receiver.exists) return receiver.data()!['fullName']; + return 'error'; + } + + static shareProfile(List emails) async { + final profileSet = await IsarDb.getProfileAlarms(); + final currentProfileName = await storage.readProfile(); + + final currentUserEmail = _firebaseAuthInstance.currentUser!.email; + profileSet['owner'] = currentUserEmail; + Map sharedItem = { + 'type': 'profile', + 'profileName': currentProfileName, + 'owner': currentUserEmail + }; + await _firebaseFirestore + .collection('users') + .doc(currentUserEmail) + .collection('sharedProfile') + .doc(currentProfileName) + .set(profileSet); + for (final email in emails) { + await _firebaseFirestore.collection('users').doc(email).update({ + "receivedItems": FieldValue.arrayUnion([sharedItem]) + }); + } + } + + static shareAlarm(List emails, AlarmModel alarm) async { + final currentUserEmail = _firebaseAuthInstance.currentUser!.email; + alarm.profile = 'Default'; + Map sharedItem = { + 'type': 'alarm', + 'AlarmName': alarm.alarmID, + 'owner': currentUserEmail, + 'alarmTime': alarm.alarmTime + }; + await _firebaseFirestore + .collection('users') + .doc(currentUserEmail) + .collection('sharedAlarms') + .doc(alarm.alarmID) + .set(AlarmModel.toMap(alarm)); + for (final email in emails) { + await _firebaseFirestore.collection('users').doc(email).update({ + "receivedItems": FieldValue.arrayUnion([sharedItem]) + }); + } + } + + static Future receiveProfile(String email, String profileName) async { + final profile = await _firebaseFirestore + .collection('users') + .doc(email) + .collection('sharedProfile') + .doc(profileName) + .get(); + return profile.data(); + } + + static Future receiveAlarm(String email, String AlarmName) async { + final alarm = await _firebaseFirestore + .collection('users') + .doc(email) + .collection('sharedAlarms') + .doc(AlarmName) + .get(); + return alarm.data(); + } + static Future deleteOneTimeAlarm( String? ownerId, String? firestoreId, @@ -331,6 +425,7 @@ class FirestoreDb { Stream> userAlarmsStream = _alarmsCollection(user) .orderBy('minutesSinceMidnight', descending: false) .snapshots(includeMetadataChanges: true); + return userAlarmsStream; } else { return _alarmsCollection(user) @@ -408,4 +503,21 @@ class FirestoreDb { return sharedUserIds; // Return the updated sharedUserIds list } + + static Stream>> + getNotifications() async* { + Stream>> userNotifications = + _firebaseFirestore + .collection('users') + .doc(FirebaseAuth.instance.currentUser!.email) + .snapshots(); + + yield* userNotifications; + } + + static removeItem(String email, Map item) async { + await _firebaseFirestore.collection('users').doc(email).update({ + "receivedItems": FieldValue.arrayRemove([item]) + }); + } } diff --git a/lib/app/data/providers/get_storage_provider.dart b/lib/app/data/providers/get_storage_provider.dart index 28cca3d7..d197d2e7 100644 --- a/lib/app/data/providers/get_storage_provider.dart +++ b/lib/app/data/providers/get_storage_provider.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class GetStorageProvider { late final GetStorage _getStorage; @@ -40,4 +41,15 @@ class GetStorageProvider { await _getStorage.write('languageCode', lanCode); await _getStorage.write('countryCode', countryCode); } + + Future writeProfile(String profile) async { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + await _getStorage.write('profile', profile); + await prefs.setString('profile', profile); + } + + Future readProfile() async { + String profile = await _getStorage.read('profile') ?? 'Default'; + return profile; + } } diff --git a/lib/app/data/providers/google_cloud_api_provider.dart b/lib/app/data/providers/google_cloud_api_provider.dart new file mode 100644 index 00000000..837797b4 --- /dev/null +++ b/lib/app/data/providers/google_cloud_api_provider.dart @@ -0,0 +1,125 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:get/get.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:googleapis/calendar/v3.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/controllers/home_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart'; + +import '../../utils/GoogleHttpClient.dart'; +import '../models/user_model.dart'; +import 'firestore_provider.dart'; + +class GoogleCloudProvider { + static final GoogleSignIn _googleSignIn = GoogleSignIn( + scopes: [ + CalendarApi.calendarScope, + ], + ); + static final _firebaseAuthInstance = FirebaseAuth.instance; + + static getInstance() async { + HomeController homeController = Get.find(); + Get.put(SettingsController()); + SettingsController settingsController = Get.find(); + + if (await _firebaseAuthInstance.currentUser == null) { + var googleSignInAccount = await _googleSignIn.signIn(); + final GoogleSignInAuthentication? googleAuth = + await googleSignInAccount?.authentication; + final credential = GoogleAuthProvider.credential( + accessToken: googleAuth?.accessToken, + idToken: googleAuth?.idToken, + ); + await _firebaseAuthInstance.signInWithCredential(credential); + + if (googleSignInAccount != null) { + // Process successful sign-in + String fullName = googleSignInAccount.displayName.toString(); + List parts = fullName.split(' '); + String lastName = ' '; + if (parts.length == 3) { + if (parts[parts.length - 1].length == 1) { + lastName = parts[1].toLowerCase().capitalizeFirst.toString(); + } else { + lastName = parts[parts.length - 1] + .toLowerCase() + .capitalizeFirst + .toString(); + } + } else { + lastName = + parts[parts.length - 1].toLowerCase().capitalizeFirst.toString(); + } + String firstName = parts[0].toLowerCase().capitalizeFirst.toString(); + + var userModel = UserModel( + id: googleSignInAccount.id, + fullName: fullName, + firstName: firstName, + lastName: lastName, + email: googleSignInAccount.email, + ); + await FirestoreDb.addUser(userModel); + await SecureStorageProvider().storeUserModel(userModel); + + settingsController.isUserLoggedIn.value = true; + homeController.isUserSignedIn.value = true; + homeController.userModel.value = userModel; + settingsController.userModel.value = userModel; + return googleSignInAccount; + } else { + return null; + } + } else { + print(_firebaseAuthInstance.currentUser!.email); + } + } + + static isUserLoggedin() { + return _firebaseAuthInstance.currentUser != null; + } + + static Future?> getCalenders() async { + if (_googleSignIn.currentUser == null) { + await _firebaseAuthInstance.signOut(); + await getInstance(); + } + final authHeaders = await _googleSignIn.currentUser!.authHeaders; + final httpClient = GoogleHttpClient(authHeaders); + var dataList = await CalendarApi(httpClient).calendarList.list(); + + if (dataList.items != null) { + return dataList.items; + } else { + return null; + } + } + + static Future?> getEvents(String calenderId) async { + await getInstance(); + final authHeaders = await _googleSignIn.currentUser!.authHeaders; + final httpClient = GoogleHttpClient(authHeaders); + var dataList = await CalendarApi(httpClient).events.list(calenderId); + if (dataList.items != null) { + return dataList.items; + } else { + return null; + } + } + + static Future logoutGoogle() async { + HomeController homeController = Get.find(); + Get.put(SettingsController()); + SettingsController settingsController = Get.find(); + + await _googleSignIn.signOut(); + _firebaseAuthInstance.signOut(); + await SecureStorageProvider().deleteUserModel(); + settingsController.isUserLoggedIn.value = false; + homeController.isUserSignedIn.value = false; + homeController.userModel.value = null; + homeController.Calendars.value = []; + homeController.calendarFetchStatus.value = "Loading"; + } +} diff --git a/lib/app/data/providers/isar_provider.dart b/lib/app/data/providers/isar_provider.dart index e485cbf4..e0e27aca 100644 --- a/lib/app/data/providers/isar_provider.dart +++ b/lib/app/data/providers/isar_provider.dart @@ -1,11 +1,17 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; +import 'package:ultimate_alarm_clock/app/data/models/profile_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/ringtone_model.dart'; +import 'package:ultimate_alarm_clock/app/data/models/saved_emails.dart'; import 'package:ultimate_alarm_clock/app/data/models/timer_model.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/get_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:sqflite/sqflite.dart'; @@ -20,6 +26,7 @@ class IsarDb { IsarDb._internal() { db = openDB(); } + static final storage = Get.find(); Future getAlarmSQLiteDatabase() async { Database? db; @@ -96,7 +103,15 @@ class IsarDb { showMotivationalQuote INTEGER NOT NULL DEFAULT 0, volMin REAL, volMax REAL, - activityMonitor INTEGER + activityMonitor INTEGER, + alarmDate TEXT NOT NULL, + profile TEXT NOT NULL, + isGuardian INTEGER, + guardianTimer INTEGER, + guardian TEXT, + isCall INTEGER, + ringOn INTEGER + ) '''); await db.execute(''' @@ -113,7 +128,13 @@ class IsarDb { final dir = await getApplicationDocumentsDirectory(); if (Isar.instanceNames.isEmpty) { return await Isar.open( - [AlarmModelSchema, RingtoneModelSchema, TimerModelSchema], + [ + AlarmModelSchema, + RingtoneModelSchema, + TimerModelSchema, + ProfileModelSchema, + Saved_EmailsSchema, + ], directory: dir.path, inspector: true, ); @@ -134,6 +155,61 @@ class IsarDb { return alarmRecord; } + static Future addProfile(ProfileModel profileModel) async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + await db.writeTxn(() async { + await db.profileModels.put(profileModel); + }); + return profileModel; + } + + static Stream> getProfiles() async* { + try { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + yield* db.profileModels.where().watch(fireImmediately: true); + } catch (e) { + debugPrint(e.toString()); + rethrow; + } + } + + static Future getProfile(String name) async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final a = db.profileModels.filter().profileNameEqualTo(name).findFirst(); + print('$a appkle'); + return a; + } + + static Future getProfileList() async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final p = await db.profileModels.where().findAll(); + List profileNames = []; + for (final profiles in p) { + profileNames.add(profiles.profileName); + } + return profileNames; + } + + static Future profileExists(String name) async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final a = db.profileModels.filter().profileNameEqualTo(name).findFirst(); + + return a != null; + } + + static Future profileId(String name) async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final a = + await db.profileModels.filter().profileNameEqualTo(name).findFirst(); + return a == null ? 'null' : a.isarId; + } + static Future getTriggeredAlarm(String time) async { final isarProvider = IsarDb(); final db = await isarProvider.db; @@ -153,6 +229,7 @@ class IsarDb { final db = await isarProvider.db; final alarms = await db.alarmModels.where().filter().alarmIDEqualTo(alarmID).findAll(); + print('checkEmpty ${alarms[0].alarmID} ${alarms.isNotEmpty}'); return alarms.isNotEmpty; } @@ -164,6 +241,7 @@ class IsarDb { int nowInMinutes = 0; final isarProvider = IsarDb(); final db = await isarProvider.db; + final currentProfile = await storage.readProfile(); // Increasing a day since we need alarms AFTER the current time // Logically, alarms at current time will ring in the future ;-; @@ -184,8 +262,12 @@ class IsarDb { } // Get all enabled alarms - List alarms = - await db.alarmModels.where().filter().isEnabledEqualTo(true).findAll(); + List alarms = await db.alarmModels + .where() + .filter() + .isEnabledEqualTo(true) + .profileEqualTo(currentProfile) + .findAll(); if (alarms.isEmpty) { alarmRecord.minutesSinceMidnight = -1; @@ -259,17 +341,59 @@ class IsarDb { return db.alarmModels.get(id); } - static getAlarms() async* { + static getAlarms(String name) async* { try { final isarProvider = IsarDb(); final db = await isarProvider.db; - yield* db.alarmModels.where().watch(fireImmediately: true); + yield* db.alarmModels + .filter() + .profileEqualTo(name) + .watch(fireImmediately: true); } catch (e) { debugPrint(e.toString()); rethrow; } } + static Future> getProfileAlarms() async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final currentProfileName = await storage.readProfile(); + final currentProfile = await IsarDb.getProfile(currentProfileName); + List alarmsModels = await db.alarmModels + .where() + .filter() + .profileEqualTo(currentProfileName) + .findAll(); + List alarmMaps = []; + for (final item in alarmsModels) { + alarmMaps.add(AlarmModel.toMap(item)); + } + final Map profileSet = { + 'profileName': currentProfileName, + 'profileData': ProfileModel.toMap(currentProfile!), + 'alarmData': alarmMaps, + 'owner': '' + }; + return profileSet; + } + + static Future updateAlarmProfiles(String newName) async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final currentProfileName = await storage.readProfile(); + final currentProfile = await IsarDb.getProfile(currentProfileName); + List alarmsModels = await db.alarmModels + .where() + .filter() + .profileEqualTo(currentProfileName) + .findAll(); + for (final item in alarmsModels) { + item.profile = newName; + updateAlarm(item); + } + } + static Future deleteAlarm(int id) async { final isarProvider = IsarDb(); final db = await isarProvider.db; @@ -331,16 +455,19 @@ class IsarDb { static Future> getAllTimers() async { final sql = await IsarDb().getTimerSQLiteDatabase(); - List> maps = await sql!.query('timers', columns: [ - 'id', - 'startedOn', - 'timerValue', - 'timeElapsed', - 'ringtoneName', - 'timerName', - 'isPaused', - ]); - if ( maps.length > 0) { + List> maps = await sql!.query( + 'timers', + columns: [ + 'id', + 'startedOn', + 'timerValue', + 'timeElapsed', + 'ringtoneName', + 'timerName', + 'isPaused', + ], + ); + if (maps.isNotEmpty) { return maps.map((timer) => TimerModel.fromMap(timer)).toList(); } return []; @@ -466,4 +593,37 @@ class IsarDb { debugPrint(e.toString()); } } + + static Future addEmail(String email) async { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + final userInDb = await db.saved_Emails + .filter() + .emailEqualTo(email, caseSensitive: false) + .findFirst(); + if (userInDb != null) { + Get.snackbar('Error', 'Email already exists'); + } else { + final username = await FirestoreDb.userExists(email); + if (username == 'error') { + Get.snackbar('Error', 'User not available'); + } else { + await db.writeTxn(() async { + await db.saved_Emails + .put(Saved_Emails(email: email, username: username)); + }).then((value) => Get.snackbar('Success', 'Email Added')); + } + } + } + + static Stream> getEmails() async* { + try { + final isarProvider = IsarDb(); + final db = await isarProvider.db; + yield* db.saved_Emails.where().watch(fireImmediately: true); + } catch (e) { + debugPrint(e.toString()); + rethrow; + } + } } diff --git a/lib/app/data/providers/push_notifications.dart b/lib/app/data/providers/push_notifications.dart new file mode 100644 index 00000000..60cd2985 --- /dev/null +++ b/lib/app/data/providers/push_notifications.dart @@ -0,0 +1,10 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; + +class PushNotifications { + static final _firebaseMessaging = FirebaseMessaging.instance; + static Future init() async { + await _firebaseMessaging.requestPermission(announcement: true); + final token = await _firebaseMessaging.getToken(); + print("token - $token"); + } +} diff --git a/lib/app/modules/about/views/about_view.dart b/lib/app/modules/about/views/about_view.dart index e67e03fe..0f875959 100644 --- a/lib/app/modules/about/views/about_view.dart +++ b/lib/app/modules/about/views/about_view.dart @@ -59,7 +59,7 @@ class AboutView extends GetView { ), const SizedBox(height: 10), Text( - 'Version: 0.1.0'.tr, + 'Version: 0.2.0'.tr, style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, diff --git a/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart b/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart index 30dbb97f..a806d8e4 100644 --- a/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart +++ b/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart @@ -5,13 +5,16 @@ import 'package:flutter_map/flutter_map.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; import 'package:fl_location/fl_location.dart'; +import 'package:get_storage/get_storage.dart'; import 'package:latlong2/latlong.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; +import 'package:ultimate_alarm_clock/app/data/models/profile_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/get_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/data/models/ringtone_model.dart'; @@ -52,7 +55,7 @@ class AddOrUpdateAlarmController extends GetxController { final mutexLock = false.obs; var lastEditedUserId = ''.obs; final sharedUserIds = [].obs; - var alarmRecord = Rxn(null); + var alarmRecord = Utils.alarmModelInit.obs; final RxMap offsetDetails = {}.obs; final offsetDuration = 0.obs; final isOffsetBefore = true.obs; @@ -78,7 +81,7 @@ class AddOrUpdateAlarmController extends GetxController { final selectedWeather = [].obs; final repeatDays = [false, false, false, false, false, false, false].obs; - final RxBool isOneTime = false.obs; + final RxBool isOneTime = true.obs; final RxString label = ''.obs; final RxInt snoozeDuration = 1.obs; var customRingtoneName = 'Default'.obs; @@ -94,6 +97,18 @@ class AddOrUpdateAlarmController extends GetxController { final RxDouble selectedGradientDouble = 0.0.obs; final RxDouble volMin = 0.0.obs; final RxDouble volMax = 10.0.obs; + var selectedDate = DateTime.now().obs; + final RxBool isFutureDate = false.obs; + + final RxBool isAddUser = false.obs; + + final RxList selectedEmails = [].obs; + + TextEditingController profileTextEditingController = TextEditingController(); + + TextEditingController contactTextEditingController = TextEditingController(); + + TextEditingController emailTextEditingController = TextEditingController(); final RxInt hours = 0.obs, minutes = 0.obs, meridiemIndex = 0.obs; final List meridiem = ['AM'.obs, 'PM'.obs]; @@ -101,7 +116,7 @@ class AddOrUpdateAlarmController extends GetxController { Future> fetchUserDetailsForSharedUsers() async { List userDetails = []; - for (String userId in alarmRecord.value?.sharedUserIds ?? []) { + for (String userId in alarmRecord.value.sharedUserIds ?? []) { userDetails.add(await FirestoreDb.fetchUserDetails(userId)); } @@ -117,6 +132,16 @@ class AddOrUpdateAlarmController extends GetxController { Map initialValues = {}; Map changedFields = {}; + RxInt alarmSettingType = 0.obs; + + late ProfileModel profileModel; + final storage = Get.find(); + + final RxBool isGuardian = false.obs; + final RxInt guardianTimer = 0.obs; + final RxString guardian = ''.obs; + final RxBool isCall = false.obs; + void toggleIsPlaying() { isPlaying.toggle(); } @@ -134,7 +159,7 @@ class AddOrUpdateAlarmController extends GetxController { } void setGradient(int value) { - this.gradient.value = value; + gradient.value = value; } void setIsWeekdaysSelected(bool value) { @@ -154,9 +179,8 @@ class AddOrUpdateAlarmController extends GetxController { } checkOverlayPermissionAndNavigate() async { - if (!(await Permission.systemAlertWindow.isGranted) || - !(await Permission.ignoreBatteryOptimizations.isGranted) || - !(await Permission.systemAlertWindow.isGranted)) { + if (!(await Permission.systemAlertWindow.isGranted) && + !(await Permission.ignoreBatteryOptimizations.isGranted)) { Get.defaultDialog( backgroundColor: themeController.isLightMode.value ? kLightSecondaryBackgroundColor @@ -214,7 +238,8 @@ class AddOrUpdateAlarmController extends GetxController { .isGranted; if (!requested) { debugPrint( - 'IGNORE_BATTERY_OPTIMIZATION permission denied!'); + 'IGNORE_BATTERY_OPTIMIZATION permission denied!', + ); return; } } @@ -353,7 +378,9 @@ class AddOrUpdateAlarmController extends GetxController { ? kLightPrimaryTextColor : Colors.white, ), - content: const Text('To ensure timely alarm dismissal, this app requires access to your location. Your location will be accessed in the background at the scheduled alarm time.'), + content: const Text( + 'To ensure timely alarm dismissal, this app requires access to your location. Your location will be accessed in the background at the scheduled alarm time.', + ), actions: [ TextButton( style: TextButton.styleFrom( @@ -531,85 +558,86 @@ class AddOrUpdateAlarmController extends GetxController { if (!cameraStatus.isGranted) { Get.defaultDialog( - backgroundColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - title: 'Camera Permission'.tr, - titleStyle: TextStyle( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : Colors.white, - ), - titlePadding: const EdgeInsets.only( - top: 25, - left: 10, - ), - contentPadding: const EdgeInsets.only(top: 20, left: 20, right: 20,bottom: 23), - content: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Center( - child: Text( - 'Please allow camera access to scan QR codes.'.tr, - textAlign: TextAlign.center, + backgroundColor: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + title: 'Camera Permission'.tr, + titleStyle: TextStyle( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : Colors.white, ), - ), - ], - ), - onCancel: () { - Get.back(); // Close the alert box - }, - onConfirm: () async { - Get.back(); // Close the alert box - PermissionStatus permissionStatus = await Permission.camera.request(); - if (permissionStatus.isGranted) { - // Permission granted, proceed with QR code scanning - showQRDialog(); - } - }, - confirm: TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all(kprimaryColor), - ), - child: Text( - 'OK', - style: Theme.of(context).textTheme.displaySmall!.copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, + titlePadding: const EdgeInsets.only( + top: 25, + left: 10, + ), + contentPadding: + const EdgeInsets.only(top: 20, left: 20, right: 20, bottom: 23), + content: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Text( + 'Please allow camera access to scan QR codes.'.tr, + textAlign: TextAlign.center, + ), + ), + ], + ), + onCancel: () { + Get.back(); // Close the alert box + }, + onConfirm: () async { + Get.back(); // Close the alert box + PermissionStatus permissionStatus = await Permission.camera.request(); + if (permissionStatus.isGranted) { + // Permission granted, proceed with QR code scanning + showQRDialog(); + } + }, + confirm: TextButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(kprimaryColor), ), - ), - onPressed: () async { - Get.back(); // Close the alert box - PermissionStatus permissionStatus = - await Permission.camera.request(); - if (permissionStatus.isGranted) { - // Permission granted, proceed with QR code scanning - showQRDialog(); - } - }, - ), - cancel: TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5), - ), - ), - child: Text( - 'Cancel', - style: Theme.of(context).textTheme.displaySmall!.copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor, + child: Text( + 'OK', + style: Theme.of(context).textTheme.displaySmall!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : ksecondaryTextColor, + ), + ), + onPressed: () async { + Get.back(); // Close the alert box + PermissionStatus permissionStatus = + await Permission.camera.request(); + if (permissionStatus.isGranted) { + // Permission granted, proceed with QR code scanning + showQRDialog(); + } + }, + ), + cancel: TextButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5), + ), ), - ), - onPressed: () { - Get.back(); // Close the alert box - }, - ), -); + child: Text( + 'Cancel', + style: Theme.of(context).textTheme.displaySmall!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ), + ), + onPressed: () { + Get.back(); // Close the alert box + }, + ), + ); } else { showQRDialog(); } @@ -631,23 +659,26 @@ class AddOrUpdateAlarmController extends GetxController { if (isSharedAlarmEnabled.value == true) { // Making sure the alarm wasn't suddenly updated to be an // online (shared) alarm - if (await IsarDb.doesAlarmExist(alarmRecord.value!.alarmID) == false) { - alarmData.firestoreId = alarmRecord.value!.firestoreId; - await FirestoreDb.updateAlarm(alarmRecord.value!.ownerId, alarmData); + if (await IsarDb.doesAlarmExist(alarmRecord.value.alarmID) == false) { + alarmData.firestoreId = alarmRecord.value.firestoreId; + await FirestoreDb.updateAlarm(alarmRecord.value.ownerId, alarmData); } else { // Deleting alarm on IsarDB to ensure no duplicate entry - await IsarDb.deleteAlarm(alarmRecord.value!.isarId); + await IsarDb.deleteAlarm(alarmRecord.value.isarId); createAlarm(alarmData); } } else { // Making sure the alarm wasn't suddenly updated to be an offline alarm - if (await IsarDb.doesAlarmExist(alarmRecord.value!.alarmID) == true) { - alarmData.isarId = alarmRecord.value!.isarId; + print('aid = ${alarmRecord.value.alarmID}'); + if (await IsarDb.doesAlarmExist(alarmRecord.value.alarmID) == true) { + alarmData.isarId = alarmRecord.value.isarId; await IsarDb.updateAlarm(alarmData); } else { // Deleting alarm on firestore to ensure no duplicate entry await FirestoreDb.deleteAlarm( - userModel.value, alarmRecord.value!.firestoreId!); + userModel.value, + alarmRecord.value.firestoreId!, + ); createAlarm(alarmData); } } @@ -663,8 +694,15 @@ class AddOrUpdateAlarmController extends GetxController { void onInit() async { super.onInit(); - alarmRecord.value = Get.arguments; + profileTextEditingController.text = homeController.selectedProfile.value; + emailTextEditingController.text = ''; + + if (Get.arguments != null) { + alarmRecord.value = Get.arguments; + } + userModel.value = homeController.userModel.value; + if (userModel.value != null) { userId.value = userModel.value!.id; userName.value = userModel.value!.fullName; @@ -681,22 +719,30 @@ class AddOrUpdateAlarmController extends GetxController { } }); - if (Get.arguments != null) { - snoozeDuration.value = alarmRecord.value!.snoozeDuration; - gradient.value = alarmRecord.value!.gradient; - volMin.value = alarmRecord.value!.volMin; - volMax.value = alarmRecord.value!.volMax; - isOneTime.value = alarmRecord.value!.isOneTime; - deleteAfterGoesOff.value = alarmRecord.value!.deleteAfterGoesOff; - label.value = alarmRecord.value!.label; - customRingtoneName.value = alarmRecord.value!.ringtoneName; - note.value = alarmRecord.value!.note; - showMotivationalQuote.value = alarmRecord.value!.showMotivationalQuote; - - sharedUserIds.value = alarmRecord.value!.sharedUserIds!; + if (Get.arguments != null || homeController.isProfile.value) { + selectedDate.value = Utils.stringToDate(alarmRecord.value.alarmDate); + isFutureDate.value = + selectedDate.value.difference(DateTime.now()).inHours > 0; + isGuardian.value = alarmRecord.value.isGuardian; + guardian.value = alarmRecord.value.guardian; + guardianTimer.value = alarmRecord.value.guardianTimer; + isActivityMonitorenabled.value = + alarmRecord.value.isActivityEnabled ? 1 : 0; + snoozeDuration.value = alarmRecord.value.snoozeDuration; + gradient.value = alarmRecord.value.gradient; + volMin.value = alarmRecord.value.volMin; + volMax.value = alarmRecord.value.volMax; + isOneTime.value = alarmRecord.value.isOneTime; + deleteAfterGoesOff.value = alarmRecord.value.deleteAfterGoesOff; + label.value = alarmRecord.value.label; + customRingtoneName.value = alarmRecord.value.ringtoneName; + note.value = alarmRecord.value.note; + showMotivationalQuote.value = alarmRecord.value.showMotivationalQuote; + + sharedUserIds.value = alarmRecord.value.sharedUserIds!; // Reinitializing all values here selectedTime.value = Utils.timeOfDayToDateTime( - Utils.stringToTimeOfDay(alarmRecord.value!.alarmTime), + Utils.stringToTimeOfDay(alarmRecord.value.alarmTime), ); hours.value = selectedTime.value.hour; minutes.value = selectedTime.value.minute; @@ -720,16 +766,17 @@ class AddOrUpdateAlarmController extends GetxController { repeatDays, ); - repeatDays.value = alarmRecord.value!.days; + repeatDays.value = alarmRecord.value.days; // Shows the selected days in UI daysRepeating.value = Utils.getRepeatDays(repeatDays); // Setting the old values for all the auto dismissal - isActivityenabled.value = alarmRecord.value!.isActivityEnabled; - activityInterval.value = alarmRecord.value!.activityInterval ~/ 60000; + isActivityenabled.value = alarmRecord.value.isActivityEnabled; + useScreenActivity.value = alarmRecord.value.isActivityEnabled; + activityInterval.value = alarmRecord.value.activityInterval ~/ 60000; - isLocationEnabled.value = alarmRecord.value!.isLocationEnabled; - selectedPoint.value = Utils.stringToLatLng(alarmRecord.value!.location); + isLocationEnabled.value = alarmRecord.value.isLocationEnabled; + selectedPoint.value = Utils.stringToLatLng(alarmRecord.value.location); // Shows the marker in UI markersList.add( Marker( @@ -742,63 +789,67 @@ class AddOrUpdateAlarmController extends GetxController { ), ); - isWeatherEnabled.value = alarmRecord.value!.isWeatherEnabled; + isWeatherEnabled.value = alarmRecord.value.isWeatherEnabled; weatherTypes.value = Utils.getFormattedWeatherTypes(selectedWeather); - isMathsEnabled.value = alarmRecord.value!.isMathsEnabled; - numMathsQuestions.value = alarmRecord.value!.numMathsQuestions; + isMathsEnabled.value = alarmRecord.value.isMathsEnabled; + numMathsQuestions.value = alarmRecord.value.numMathsQuestions; mathsDifficulty.value = - Difficulty.values[alarmRecord.value!.mathsDifficulty]; - mathsSliderValue.value = alarmRecord.value!.mathsDifficulty.toDouble(); + Difficulty.values[alarmRecord.value.mathsDifficulty]; + mathsSliderValue.value = alarmRecord.value.mathsDifficulty.toDouble(); - isShakeEnabled.value = alarmRecord.value!.isShakeEnabled; - shakeTimes.value = alarmRecord.value!.shakeTimes; + isShakeEnabled.value = alarmRecord.value.isShakeEnabled; + shakeTimes.value = alarmRecord.value.shakeTimes; - isPedometerEnabled.value = alarmRecord.value!.isPedometerEnabled; - numberOfSteps.value = alarmRecord.value!.numberOfSteps; + isPedometerEnabled.value = alarmRecord.value.isPedometerEnabled; + numberOfSteps.value = alarmRecord.value.numberOfSteps; - isQrEnabled.value = alarmRecord.value!.isQrEnabled; - qrValue.value = alarmRecord.value!.qrValue; - detectedQrValue.value = alarmRecord.value!.qrValue; + isQrEnabled.value = alarmRecord.value.isQrEnabled; + qrValue.value = alarmRecord.value.qrValue; + detectedQrValue.value = alarmRecord.value.qrValue; - alarmID = alarmRecord.value!.alarmID; + alarmID = alarmRecord.value.alarmID == '' + ? const Uuid().v4() + : alarmRecord.value.alarmID; // if alarmRecord is null or alarmRecord.ownerId is null, // then assign the current logged-in user as the owner. - if (alarmRecord.value == null || alarmRecord.value!.ownerId.isEmpty) { + if (alarmRecord.value.ownerId.isEmpty) { ownerId.value = userId.value; ownerName.value = userName.value; } else { - ownerId.value = alarmRecord.value!.ownerId; - ownerName.value = alarmRecord.value!.ownerName; + ownerId.value = alarmRecord.value.ownerId; + ownerName.value = alarmRecord.value.ownerName; } - mutexLock.value = alarmRecord.value!.mutexLock; - isSharedAlarmEnabled.value = alarmRecord.value!.isSharedAlarmEnabled; + mutexLock.value = alarmRecord.value.mutexLock; + isSharedAlarmEnabled.value = alarmRecord.value.isSharedAlarmEnabled; if (isSharedAlarmEnabled.value) { selectedTime.value = Utils.timeOfDayToDateTime( - Utils.stringToTimeOfDay(alarmRecord.value!.mainAlarmTime!), + Utils.stringToTimeOfDay(alarmRecord.value.mainAlarmTime!), ); mainAlarmTime.value = Utils.timeOfDayToDateTime( - Utils.stringToTimeOfDay(alarmRecord.value!.mainAlarmTime!), + Utils.stringToTimeOfDay(alarmRecord.value.mainAlarmTime!), ); - offsetDetails.value = alarmRecord.value!.offsetDetails!; + offsetDetails.value = alarmRecord.value.offsetDetails!; offsetDuration.value = alarmRecord - .value!.offsetDetails![userModel.value!.id]['offsetDuration']; + .value.offsetDetails![userModel.value!.id]['offsetDuration']; isOffsetBefore.value = alarmRecord - .value!.offsetDetails![userModel.value!.id]['isOffsetBefore']; + .value.offsetDetails![userModel.value!.id]['isOffsetBefore']; } // Set lock only if its not locked if (isSharedAlarmEnabled.value == true && - alarmRecord.value!.mutexLock == false) { - alarmRecord.value!.mutexLock = true; - alarmRecord.value!.lastEditedUserId = userModel.value!.id; + alarmRecord.value.mutexLock == false) { + alarmRecord.value.mutexLock = true; + alarmRecord.value.lastEditedUserId = userModel.value!.id; await FirestoreDb.updateAlarm( - alarmRecord.value!.ownerId, alarmRecord.value!); - alarmRecord.value!.mutexLock = false; + alarmRecord.value.ownerId, + alarmRecord.value, + ); + alarmRecord.value.mutexLock = false; mutexLock.value = false; } } else { @@ -850,7 +901,7 @@ class AddOrUpdateAlarmController extends GetxController { 'numberOfSteps': numberOfSteps.value, 'isSharedAlarmEnabled': isSharedAlarmEnabled.value, 'offsetDuration': offsetDuration.value, - 'isOffsetBefore': isOffsetBefore.value + 'isOffsetBefore': isOffsetBefore.value, }); addListeners(); @@ -921,7 +972,9 @@ class AddOrUpdateAlarmController extends GetxController { ), ); _compareAndSetChange( - 'location', '${point.latitude} ${point.longitude}'); + 'location', + '${point.latitude} ${point.longitude}', + ); }, ); @@ -970,28 +1023,28 @@ class AddOrUpdateAlarmController extends GetxController { // We also make sure the doc was not already locked // If it was suddenly enabled, it will be created newly anyway if (isSharedAlarmEnabled.value == true && - alarmRecord.value!.isSharedAlarmEnabled == true && - alarmRecord.value!.mutexLock == false) { + alarmRecord.value.isSharedAlarmEnabled == true && + alarmRecord.value.mutexLock == false) { AlarmModel updatedModel = updatedAlarmModel(); - updatedModel.firestoreId = alarmRecord.value!.firestoreId; + updatedModel.firestoreId = alarmRecord.value.firestoreId; await FirestoreDb.updateAlarm(updatedModel.ownerId, updatedModel); } } } AlarmModel updatedAlarmModel() { - String _ownerId = ''; - String _ownerName = ''; + String ownerId = ''; + String ownerName = ''; // if alarmRecord is null or alarmRecord.ownerId is null, // then assign the current logged-in user as the owner. - if (alarmRecord.value == null || alarmRecord.value!.ownerId.isEmpty) { - _ownerId = userId.value; - _ownerName = userName.value; + if (alarmRecord.value.ownerId.isEmpty) { + ownerId = userId.value; + ownerName = userName.value; } else { - _ownerId = alarmRecord.value!.ownerId; - _ownerName = alarmRecord.value!.ownerName; + ownerId = alarmRecord.value.ownerId; + ownerName = alarmRecord.value.ownerName; } return AlarmModel( snoozeDuration: snoozeDuration.value, @@ -1008,8 +1061,8 @@ class AddOrUpdateAlarmController extends GetxController { lastEditedUserId: lastEditedUserId.value, mutexLock: mutexLock.value, alarmID: alarmID, - ownerId: _ownerId, - ownerName: _ownerName, + ownerId: ownerId, + ownerName: ownerName, activityInterval: activityInterval.value * 60000, days: repeatDays.toList(), alarmTime: @@ -1038,7 +1091,14 @@ class AddOrUpdateAlarmController extends GetxController { ringtoneName: customRingtoneName.value, note: note.value, showMotivationalQuote: showMotivationalQuote.value, - activityMonitor: isActivityMonitorenabled.value + activityMonitor: isActivityMonitorenabled.value, + alarmDate: selectedDate.value.toString().substring(0, 11), + profile: homeController.selectedProfile.value, + isGuardian: isGuardian.value, + guardianTimer: guardianTimer.value, + guardian: guardian.value, + isCall: isCall.value, + ringOn: isFutureDate.value, ); } @@ -1116,8 +1176,9 @@ class AddOrUpdateAlarmController extends GetxController { currentCounterOfUsage: 1, ); AudioUtils.updateRingtoneCounterOfUsage( - customRingtoneName: previousRingtone, - counterUpdate: CounterUpdate.decrement); + customRingtoneName: previousRingtone, + counterUpdate: CounterUpdate.decrement, + ); await IsarDb.addCustomRingtone(customRingtone); } } @@ -1165,8 +1226,8 @@ class AddOrUpdateAlarmController extends GetxController { Get.snackbar( 'Ringtone Deleted', 'The selected ringtone has been successfully deleted.', - margin: EdgeInsets.all(15), - animationDuration: Duration(seconds: 1), + margin: const EdgeInsets.all(15), + animationDuration: const Duration(seconds: 1), snackPosition: SnackPosition.BOTTOM, barBlur: 15, colorText: kprimaryTextColor, @@ -1175,8 +1236,8 @@ class AddOrUpdateAlarmController extends GetxController { Get.snackbar( 'Ringtone Not Found', 'The selected ringtone does not exist and cannot be deleted.', - margin: EdgeInsets.all(15), - animationDuration: Duration(seconds: 1), + margin: const EdgeInsets.all(15), + animationDuration: const Duration(seconds: 1), snackPosition: SnackPosition.BOTTOM, barBlur: 15, colorText: kprimaryTextColor, @@ -1187,8 +1248,8 @@ class AddOrUpdateAlarmController extends GetxController { 'Ringtone in Use', 'This ringtone cannot be deleted as it is currently assigned' ' to one or more alarms.', - margin: EdgeInsets.all(15), - animationDuration: Duration(seconds: 1), + margin: const EdgeInsets.all(15), + animationDuration: const Duration(seconds: 1), snackPosition: SnackPosition.BOTTOM, barBlur: 15, colorText: kprimaryTextColor, @@ -1200,6 +1261,28 @@ class AddOrUpdateAlarmController extends GetxController { } } + datePicker(BuildContext context) async { + selectedDate.value = (await showDatePicker( + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.dark().copyWith( + colorScheme: const ColorScheme.dark( + primary: kprimaryColor, + ), + ), + child: child!, + ); + }, + context: context, + currentDate: selectedDate.value, + firstDate: DateTime.now(), + lastDate: DateTime.now().add(const Duration(days: 355)), + )) ?? + DateTime.now(); + isFutureDate.value = + selectedDate.value.difference(DateTime.now()).inHours > 0; + } + void showToast({ required AlarmModel alarmRecord, }) { @@ -1223,4 +1306,73 @@ class AddOrUpdateAlarmController extends GetxController { debugPrint(e.toString()); } } + + Future createProfile() async { + profileModel = ProfileModel( + profileName: profileTextEditingController.text, + deleteAfterGoesOff: deleteAfterGoesOff.value, + snoozeDuration: snoozeDuration.value, + volMax: volMax.value, + volMin: volMin.value, + gradient: gradient.value, + offsetDetails: offsetDetails, + label: label.value, + note: note.value, + showMotivationalQuote: showMotivationalQuote.value, + isOneTime: isOneTime.value, + lastEditedUserId: lastEditedUserId.value, + mutexLock: mutexLock.value, + ownerId: ownerId.value, + ownerName: ownerName.value, + activityInterval: activityInterval.value * 60000, + days: repeatDays.toList(), + intervalToAlarm: Utils.getMillisecondsToAlarm( + DateTime.now(), + selectedTime.value, + ), + isActivityEnabled: isActivityenabled.value, + minutesSinceMidnight: Utils.timeOfDayToInt( + TimeOfDay.fromDateTime( + selectedTime.value, + ), + ), + isLocationEnabled: isLocationEnabled.value, + weatherTypes: Utils.getIntFromWeatherTypes( + selectedWeather.toList(), + ), + isWeatherEnabled: isWeatherEnabled.value, + location: Utils.geoPointToString( + Utils.latLngToGeoPoint( + selectedPoint.value, + ), + ), + isSharedAlarmEnabled: isSharedAlarmEnabled.value, + isQrEnabled: isQrEnabled.value, + qrValue: qrValue.value, + isMathsEnabled: isMathsEnabled.value, + numMathsQuestions: numMathsQuestions.value, + mathsDifficulty: mathsDifficulty.value.index, + isShakeEnabled: isShakeEnabled.value, + shakeTimes: shakeTimes.value, + isPedometerEnabled: isPedometerEnabled.value, + numberOfSteps: numberOfSteps.value, + ringtoneName: customRingtoneName.value, + activityMonitor: isActivityMonitorenabled.value, + alarmDate: selectedDate.value.toString().substring(0, 11), + isGuardian: isGuardian.value, + guardianTimer: guardianTimer.value, + guardian: guardian.value, + isCall: isCall.value, + ringOn: isFutureDate.value, + ); + var profileId = + await IsarDb.profileId(homeController.selectedProfile.value); + print(profileId); + if (profileId != 'null') profileModel.isarId = profileId; + print(profileModel.isarId); + await IsarDb.updateAlarmProfiles(profileTextEditingController.text); + await IsarDb.addProfile(profileModel); + homeController.selectedProfile.value = profileModel.profileName; + storage.writeProfile(profileModel.profileName); + } } diff --git a/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart b/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart index 63a2a436..e996636c 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart @@ -1,10 +1,8 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; -import 'package:get_storage/get_storage.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:numberpicker/numberpicker.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/input_time_controller.dart'; @@ -23,6 +21,7 @@ import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/quote_ti import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/repeat_once_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/repeat_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/screen_activity_tile.dart'; +import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/setting_selector.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/shake_to_dismiss_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/shared_alarm_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/shared_users_tile.dart'; @@ -30,1043 +29,1013 @@ import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/snooze_d import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/views/weather_tile.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; -import 'package:ultimate_alarm_clock/app/routes/app_pages.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import '../controllers/add_or_update_alarm_controller.dart'; +import 'alarm_date_tile.dart'; +import 'guardian_angel.dart'; class AddOrUpdateAlarmView extends GetView { AddOrUpdateAlarmView({Key? key}) : super(key: key); - ThemeController themeController = Get.find(); - InputTimeController inputTimeController = Get.put(InputTimeController()); - SettingsController settingsController = Get.find(); + final ThemeController themeController = Get.find(); + final InputTimeController inputTimeController = + Get.put(InputTimeController()); + final SettingsController settingsController = Get.find(); + @override Widget build(BuildContext context) { var width = Get.width; var height = Get.height; return PopScope( - canPop: false, - onPopInvoked: (bool didPop) { - if (didPop) { - return; - } - controller.checkUnsavedChangesAndNavigate(context); - }, - child: Scaffold( - floatingActionButtonLocation: - FloatingActionButtonLocation.centerDocked, - floatingActionButton: (controller.alarmRecord.value != null && - controller.mutexLock.value == true) - ? const SizedBox() - : Padding( - padding: const EdgeInsets.all(18.0), - child: SizedBox( - height: height * 0.06, - width: width * 0.8, - child: TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(kprimaryColor), - ), - child: Text( + canPop: false, + onPopInvoked: (bool didPop) { + if (didPop) { + return; + } + controller.checkUnsavedChangesAndNavigate(context); + }, + child: Scaffold( + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + floatingActionButton: (controller.mutexLock.value == true) + ? const SizedBox() + : Padding( + padding: const EdgeInsets.all(18.0), + child: SizedBox( + height: height * 0.06, + width: width * 0.8, + child: TextButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(kprimaryColor), + ), + child: Text( + (controller.alarmRecord.value.alarmID == '') + ? 'Save'.tr + : 'Update'.tr, + style: Theme.of(context).textTheme.displaySmall!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : ksecondaryTextColor, + ), + ), + onPressed: () async { + Utils.hapticFeedback(); + await controller.checkOverlayPermissionAndNavigate(); - (controller.alarmRecord.value = Get.arguments) == null || - (controller.alarmRecord.value!.alarmID.isEmpty) - ? 'Save'.tr - : 'Update'.tr, - style: - Theme.of(context).textTheme.displaySmall!.copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, + if ((await Permission.systemAlertWindow.isGranted) && + (await Permission + .ignoreBatteryOptimizations.isGranted)) { + if (!controller.homeController.isProfile.value) + { + if (controller.userModel.value != null) { + controller.offsetDetails[ + controller.userModel.value!.id] = { + 'offsettedTime': Utils.timeOfDayToString( + TimeOfDay.fromDateTime( + Utils.calculateOffsetAlarmTime( + controller.selectedTime.value, + controller.isOffsetBefore.value, + controller.offsetDuration.value, + ), ), - ), - onPressed: () async { - Utils.hapticFeedback(); - await controller.checkOverlayPermissionAndNavigate(); - - if (controller.userModel.value != null) { - controller - .offsetDetails[controller.userModel.value!.id] = { - 'offsettedTime': Utils.timeOfDayToString( + ), + 'offsetDuration': controller.offsetDuration.value, + 'isOffsetBefore': controller.isOffsetBefore.value, + }; + } else { + controller.offsetDetails.value = {}; + } + AlarmModel alarmRecord = AlarmModel( + deleteAfterGoesOff: + controller.deleteAfterGoesOff.value, + snoozeDuration: controller.snoozeDuration.value, + volMax: controller.volMax.value, + volMin: controller.volMin.value, + gradient: controller.gradient.value, + offsetDetails: controller.offsetDetails, + label: controller.label.value, + note: controller.note.value, + showMotivationalQuote: + controller.showMotivationalQuote.value, + isOneTime: controller.isOneTime.value, + lastEditedUserId: controller.lastEditedUserId.value, + mutexLock: controller.mutexLock.value, + alarmID: controller.alarmID, + ownerId: controller.ownerId.value, + ownerName: controller.ownerName.value, + activityInterval: + controller.activityInterval.value * 60000, + days: controller.repeatDays.toList(), + alarmTime: Utils.timeOfDayToString( TimeOfDay.fromDateTime( - Utils.calculateOffsetAlarmTime( - controller.selectedTime.value, - controller.isOffsetBefore.value, - controller.offsetDuration.value, - ), + controller.selectedTime.value, ), ), - 'offsetDuration': controller.offsetDuration.value, - 'isOffsetBefore': controller.isOffsetBefore.value, - }; - } else { - controller.offsetDetails.value = {}; - } - AlarmModel alarmRecord = AlarmModel( - deleteAfterGoesOff: - controller.deleteAfterGoesOff.value, - snoozeDuration: controller.snoozeDuration.value, - volMax: controller.volMax.value, - volMin: controller.volMin.value, - gradient: controller.gradient.value, - offsetDetails: controller.offsetDetails, - label: controller.label.value, - note: controller.note.value, - showMotivationalQuote: - controller.showMotivationalQuote.value, - isOneTime: controller.isOneTime.value, - lastEditedUserId: controller.lastEditedUserId.value, - mutexLock: controller.mutexLock.value, - alarmID: controller.alarmID, - ownerId: controller.ownerId.value, - ownerName: controller.ownerName.value, - activityInterval: - controller.activityInterval.value * 60000, - days: controller.repeatDays.toList(), - alarmTime: Utils.timeOfDayToString( - TimeOfDay.fromDateTime( - controller.selectedTime.value, + mainAlarmTime: Utils.timeOfDayToString( + TimeOfDay.fromDateTime( + controller.selectedTime.value, + ), ), - ), - mainAlarmTime: Utils.timeOfDayToString( - TimeOfDay.fromDateTime( + intervalToAlarm: Utils.getMillisecondsToAlarm( + DateTime.now(), controller.selectedTime.value, ), - ), - intervalToAlarm: Utils.getMillisecondsToAlarm( - DateTime.now(), - controller.selectedTime.value, - ), - isActivityEnabled: controller.isActivityenabled.value, - minutesSinceMidnight: Utils.timeOfDayToInt( - TimeOfDay.fromDateTime( - controller.selectedTime.value, + isActivityEnabled: + controller.isActivityenabled.value, + minutesSinceMidnight: Utils.timeOfDayToInt( + TimeOfDay.fromDateTime( + controller.selectedTime.value, + ), ), - ), - isLocationEnabled: controller.isLocationEnabled.value, - weatherTypes: Utils.getIntFromWeatherTypes( - controller.selectedWeather.toList(), - ), - isWeatherEnabled: controller.isWeatherEnabled.value, - location: Utils.geoPointToString( - Utils.latLngToGeoPoint( - controller.selectedPoint.value, + isLocationEnabled: + controller.isLocationEnabled.value, + weatherTypes: Utils.getIntFromWeatherTypes( + controller.selectedWeather.toList(), ), - ), - isSharedAlarmEnabled: - controller.isSharedAlarmEnabled.value, - isQrEnabled: controller.isQrEnabled.value, - qrValue: controller.qrValue.value, - isMathsEnabled: controller.isMathsEnabled.value, - numMathsQuestions: controller.numMathsQuestions.value, - mathsDifficulty: - controller.mathsDifficulty.value.index, - isShakeEnabled: controller.isShakeEnabled.value, - shakeTimes: controller.shakeTimes.value, - isPedometerEnabled: - controller.isPedometerEnabled.value, - numberOfSteps: controller.numberOfSteps.value, - ringtoneName: controller.customRingtoneName.value, - activityMonitor: controller.isActivityMonitorenabled.value - ); - - // Adding offset details to the database if - // its a shared alarm - if (controller.isSharedAlarmEnabled.value) { - alarmRecord.offsetDetails = controller.offsetDetails; - alarmRecord.mainAlarmTime = Utils.timeOfDayToString( - TimeOfDay.fromDateTime( - controller.selectedTime.value, + isWeatherEnabled: controller.isWeatherEnabled.value, + location: Utils.geoPointToString( + Utils.latLngToGeoPoint( + controller.selectedPoint.value, + ), ), + isSharedAlarmEnabled: + controller.isSharedAlarmEnabled.value, + isQrEnabled: controller.isQrEnabled.value, + qrValue: controller.qrValue.value, + isMathsEnabled: controller.isMathsEnabled.value, + numMathsQuestions: + controller.numMathsQuestions.value, + mathsDifficulty: + controller.mathsDifficulty.value.index, + isShakeEnabled: controller.isShakeEnabled.value, + shakeTimes: controller.shakeTimes.value, + isPedometerEnabled: + controller.isPedometerEnabled.value, + numberOfSteps: controller.numberOfSteps.value, + ringtoneName: controller.customRingtoneName.value, + activityMonitor: + controller.isActivityMonitorenabled.value, + alarmDate: controller.selectedDate.value + .toString() + .substring(0, 11), + profile: + controller.homeController.selectedProfile.value, + isGuardian: controller.isGuardian.value, + guardianTimer: 0, + guardian: + controller.contactTextEditingController.text, + isCall: controller.isCall.value, + ringOn: controller.isFutureDate.value, ); - } - try { - controller.alarmRecord.value = Get.arguments; - if (controller.alarmRecord.value == null|| controller. - alarmRecord.value!.alarmID.isEmpty) { - await controller.createAlarm(alarmRecord); - } else { - AlarmModel updatedAlarmModel = - controller.updatedAlarmModel(); - await controller.updateAlarm(updatedAlarmModel); + + // Adding offset details to the database if + // its a shared alarm + if (controller.isSharedAlarmEnabled.value) { + alarmRecord.offsetDetails = + controller.offsetDetails; + alarmRecord.mainAlarmTime = Utils.timeOfDayToString( + TimeOfDay.fromDateTime( + controller.selectedTime.value, + ), + ); + } + try { + if (controller.alarmRecord.value.alarmID == '') { + await controller.createAlarm(alarmRecord); + } else { + AlarmModel updatedAlarmModel = + controller.updatedAlarmModel(); + await controller.updateAlarm(updatedAlarmModel); + } + } catch (e) { + debugPrint(e.toString()); } - } catch (e) { - debugPrint(e.toString()); + } else { + if (controller.profileTextEditingController.text + .isNotEmpty) controller.createProfile(); } - - }, - ), + } + }, ), ), - appBar: AppBar( - backgroundColor: (controller.alarmRecord.value != null && - controller.mutexLock.value == true) - ? themeController.isLightMode.value - ? kLightPrimaryBackgroundColor - : kprimaryBackgroundColor - : themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - elevation: 0.0, - centerTitle: true, - iconTheme: Theme.of(context).iconTheme, - title: (controller.alarmRecord.value != null && - controller.mutexLock.value == true) - ? const Text('') - : Obx( - () => Text( - 'Rings in @timeToAlarm'.trParams( - { - 'timeToAlarm': - controller.timeToAlarm.value.toString(), - }, + ), + appBar: AppBar( + backgroundColor: themeController.isLightMode.value + ? kLightPrimaryBackgroundColor + : kprimaryBackgroundColor, + elevation: 0.0, + centerTitle: true, + iconTheme: Theme.of(context).iconTheme, + title: (controller.mutexLock.value == true) + ? const Text('') + : controller.homeController.isProfile.value + ? const Text('Edit Profile') + : Obx( + () => Text( + 'Rings in @timeToAlarm'.trParams( + { + 'timeToAlarm': + controller.timeToAlarm.value.toString(), + }, + ), + style: Theme.of(context).textTheme.titleSmall, ), - style: Theme.of(context).textTheme.titleSmall, ), - ), - ), - body: (controller.alarmRecord.value != null && - controller.mutexLock.value == true) - ? Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Padding( - padding: const EdgeInsets.all(20.0), - child: Text( - 'Uh-oh!'.tr, - style: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), + ), + body: (controller.mutexLock.value == true) + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + 'Uh-oh!'.tr, + style: + Theme.of(context).textTheme.displayMedium!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), ), - SvgPicture.asset( - 'assets/images/locked.svg', - height: height * 0.24, - width: width * 0.5, + ), + SvgPicture.asset( + 'assets/images/locked.svg', + height: height * 0.24, + width: width * 0.5, + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + // 'This alarm is currently being edited!', + 'alarmEditing'.tr, + style: + Theme.of(context).textTheme.displaySmall!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), ), - Padding( - padding: const EdgeInsets.all(20.0), - child: Text( - // 'This alarm is currently being edited!', - 'alarmEditing'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), + ), + TextButton( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(kprimaryColor), ), - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(kprimaryColor), - ), - child: Text( - 'Go back'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () { - Utils.hapticFeedback(); - Get.back(); - }, + child: Text( + 'Go back'.tr, + style: + Theme.of(context).textTheme.displaySmall!.copyWith( + color: themeController.isLightMode.value + ? kLightSecondaryTextColor + : ksecondaryTextColor, + ), ), - ], - ), - ) - : ListView( - children: [ - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - height: height * 0.32, - width: width, - child: Obx( - () { - return InkWell( - onTap: () { - Utils.hapticFeedback(); - inputTimeController.changeDatePicker(); - }, - child: inputTimeController.isTimePicker.value - ? Obx( - () => Row( - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - NumberPicker( - minValue: settingsController - .is24HrsEnabled.value - ? 0 - : 1, - maxValue: settingsController - .is24HrsEnabled.value - ? 23 - : 12, - value: controller.hours.value, - onChanged: (value) { - Utils.hapticFeedback(); - controller.hours.value = value; - controller.selectedTime.value = - DateTime( - controller - .selectedTime.value.year, - controller - .selectedTime.value.month, - controller.selectedTime.value.day, - inputTimeController - .convert24(value,controller.meridiemIndex.value), - controller - .selectedTime.value.minute, - ); - inputTimeController - .inputHrsController.text = - controller.hours.value - .toString(); - inputTimeController - .inputMinutesController - .text = - controller.minutes.value - .toString(); - inputTimeController.changePeriod( - controller.meridiemIndex.value == - 0 - ? 'AM' - : 'PM', - ); - }, - infiniteLoop: true, - itemWidth: width * 0.17, - zeroPad: true, - selectedTextStyle: Theme.of(context) - .textTheme - .displayLarge! - .copyWith( - fontWeight: FontWeight.bold, - color: kprimaryColor, - ), - textStyle: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - fontSize: 20, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + onPressed: () { + Utils.hapticFeedback(); + Get.back(); + }, + ), + ], + ), + ) + : ListView( + children: [ + !controller.homeController.isProfile.value + ? Padding( + padding: EdgeInsets.only( + top: height * 0.02, + left: width * 0.04, + right: width * 0.04, + ), + child: Container( + decoration: BoxDecoration( + color: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(500), + ), + height: height * 0.25, + child: Obx( + () { + return InkWell( + onTap: () { + Utils.hapticFeedback(); + inputTimeController.changeDatePicker(); + }, + child: inputTimeController.isTimePicker.value + ? Obx( + () => Row( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + NumberPicker( + minValue: settingsController + .is24HrsEnabled.value + ? 0 + : 1, + maxValue: settingsController + .is24HrsEnabled.value + ? 23 + : 12, + value: controller.hours.value, + onChanged: (value) { + Utils.hapticFeedback(); + controller.hours.value = + value; + controller.selectedTime + .value = DateTime( + controller.selectedTime + .value.year, + controller.selectedTime + .value.month, + controller + .selectedTime.value.day, + inputTimeController + .convert24( + value, + controller + .meridiemIndex.value, + ), + controller.selectedTime + .value.minute, + ); + inputTimeController + .inputHrsController + .text = + controller.hours.value + .toString(); + inputTimeController + .inputMinutesController + .text = + controller.minutes.value + .toString(); + inputTimeController + .changePeriod( + controller.meridiemIndex + .value == + 0 + ? 'AM' + : 'PM', + ); + }, + infiniteLoop: true, + itemWidth: width * 0.17, + zeroPad: true, + selectedTextStyle: + Theme.of(context) + .textTheme + .displayLarge! + .copyWith( + fontSize: controller + .homeController + .scalingFactor * + 40, + fontWeight: + FontWeight.bold, + color: kprimaryColor, + ), + textStyle: Theme.of(context) + .textTheme + .displayMedium! + .copyWith( + fontSize: controller + .homeController + .scalingFactor * + 20, + color: themeController + .isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor + .withOpacity(0.5), + ), ), - decoration: BoxDecoration( - border: Border( - top: BorderSide( - width: width * 0.005, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.02, + ), + child: Text( + ':', + style: Theme.of(context) + .textTheme + .displayLarge! + .copyWith( + fontWeight: + FontWeight.bold, + color: themeController + .isLightMode + .value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), ), - bottom: BorderSide( - width: width * 0.005, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + NumberPicker( + minValue: 0, + maxValue: 59, + value: controller.minutes.value, + onChanged: (value) { + Utils.hapticFeedback(); + controller.minutes.value = + value; + controller.selectedTime + .value = DateTime( + controller.selectedTime + .value.year, + controller.selectedTime + .value.month, + controller + .selectedTime.value.day, + controller.selectedTime + .value.hour, + controller.minutes.value, + ); + inputTimeController + .inputHrsController + .text = + controller.hours.value + .toString(); + inputTimeController + .inputMinutesController + .text = + controller.minutes.value + .toString(); + inputTimeController + .changePeriod( + controller.meridiemIndex + .value == + 0 + ? 'AM' + : 'PM', + ); + }, + infiniteLoop: true, + itemWidth: width * 0.17, + zeroPad: true, + selectedTextStyle: + Theme.of(context) + .textTheme + .displayLarge! + .copyWith( + fontSize: controller + .homeController + .scalingFactor * + 40, + fontWeight: + FontWeight.bold, + color: kprimaryColor, + ), + textStyle: Theme.of(context) + .textTheme + .displayMedium! + .copyWith( + fontSize: controller + .homeController + .scalingFactor * + 20, + color: themeController + .isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor + .withOpacity(0.5), + ), ), - ), - ), - ), - Padding( - padding: EdgeInsets.symmetric( - horizontal: width * 0.02, - ), - child: Text( - ':', - style: Theme.of(context) - .textTheme - .displayLarge! - .copyWith( - fontWeight: FontWeight.bold, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + Visibility( + visible: settingsController + .is24HrsEnabled.value + ? false + : true, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.035, + ), + child: Text( + ':', + style: Theme.of(context) + .textTheme + .displayLarge! + .copyWith( + fontWeight: + FontWeight.bold, + color: themeController + .isLightMode + .value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), ), - ), - ), - NumberPicker( - minValue: 0, - maxValue: 59, - value: controller.minutes.value, - onChanged: (value) { - Utils.hapticFeedback(); - controller.minutes.value = value; - controller.selectedTime.value = - DateTime( - controller - .selectedTime.value.year, - controller - .selectedTime.value.month, - controller.selectedTime.value.day, - controller - .selectedTime.value.hour, - controller.minutes.value, - ); - inputTimeController - .inputHrsController.text = - controller.hours.value - .toString(); - inputTimeController - .inputMinutesController - .text = - controller.minutes.value - .toString(); - inputTimeController.changePeriod( - controller.meridiemIndex.value == - 0 - ? 'AM' - : 'PM', - ); - }, - infiniteLoop: true, - itemWidth: width * 0.17, - zeroPad: true, - selectedTextStyle: Theme.of(context) - .textTheme - .displayLarge! - .copyWith( - fontWeight: FontWeight.bold, - color: kprimaryColor, - ), - textStyle: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - fontSize: 20, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, ), - decoration: BoxDecoration( - border: Border( - top: BorderSide( - width: width * 0.005, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + Visibility( + visible: settingsController + .is24HrsEnabled.value + ? false + : true, + child: NumberPicker( + minValue: 0, + maxValue: 1, + value: controller + .meridiemIndex.value, + onChanged: (value) { + Utils.hapticFeedback(); + value == 0 + ? controller + .meridiemIndex + .value = 0 + : controller + .meridiemIndex + .value = 1; + controller.selectedTime + .value = DateTime( + controller.selectedTime + .value.year, + controller.selectedTime + .value.month, + controller.selectedTime + .value.day, + inputTimeController + .convert24( + controller.hours.value, + controller.meridiemIndex + .value, + ), + controller.minutes.value, + ); + inputTimeController + .inputHrsController + .text = + controller.hours.value + .toString(); + inputTimeController + .inputMinutesController + .text = + controller.minutes.value + .toString(); + inputTimeController + .changePeriod( + controller.meridiemIndex + .value == + 0 + ? 'AM' + : 'PM', + ); + }, + textMapper: (numberText) { + return controller + .meridiem[int.parse( + numberText, + )] + .value; + }, + itemWidth: width * 0.17, + selectedTextStyle: + Theme.of(context) + .textTheme + .displayLarge! + .copyWith( + fontSize: controller + .homeController + .scalingFactor * + 40, + fontWeight: + FontWeight.bold, + color: + kprimaryColor, + ), + textStyle: Theme.of(context) + .textTheme + .displayMedium! + .copyWith( + fontSize: controller + .homeController + .scalingFactor * + 20, + color: themeController + .isLightMode + .value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor + .withOpacity( + 0.5, + ), + ), + ), ), - bottom: BorderSide( - width: width * 0.005, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + ], + ), + ) + : Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + SizedBox( + width: 80, + child: TextField( + onChanged: (_) { + inputTimeController.setTime(); + }, + decoration: + const InputDecoration( + hintText: 'HH', + border: InputBorder.none, + ), + textAlign: TextAlign.center, + controller: inputTimeController + .inputHrsController, + keyboardType: + TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter + .allow( + RegExp( + '[1,2,3,4,5,6,7,8,9,0]', + ), + ), + LengthLimitingTextInputFormatter( + 2, + ), + LimitRange( + 0, + settingsController + .is24HrsEnabled + .value + ? 23 + : 12, + ), + ], ), ), - ), - ), - Visibility( - visible: settingsController - .is24HrsEnabled.value - ? false - : true, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: width * 0.02, + SizedBox( + width: 16, + child: Text( + ':', + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .titleMedium, + ), ), - child: Text( - ':', - style: Theme.of(context) - .textTheme - .displayLarge! - .copyWith( - fontWeight: FontWeight.bold, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + SizedBox( + width: 80, + child: TextField( + onChanged: (_) { + inputTimeController.setTime(); + }, + decoration: + const InputDecoration( + hintText: 'MM', + border: InputBorder.none, + ), + textAlign: TextAlign.center, + controller: inputTimeController + .inputMinutesController, + keyboardType: + TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter + .allow( + RegExp( + '[1,2,3,4,5,6,7,8,9,0]', + ), ), + LengthLimitingTextInputFormatter( + 2, + ), + LimitRange(00, 59), + ], + ), ), - ), - ), - Visibility( - visible: settingsController - .is24HrsEnabled.value - ? false - : true, - child: NumberPicker( - minValue: 0, - maxValue: 1, - value: - controller.meridiemIndex.value, - onChanged: (value) { - Utils.hapticFeedback(); - value == 0 - ? controller - .meridiemIndex.value = 0 - : controller - .meridiemIndex.value = 1; - controller.selectedTime.value = - DateTime( - controller - .selectedTime.value.year, - controller - .selectedTime.value.month, - controller - .selectedTime.value.day, - inputTimeController.convert24( - controller.hours.value,controller.meridiemIndex.value), - controller.minutes.value, - ); - inputTimeController - .inputHrsController.text = - controller.hours.value - .toString(); - inputTimeController - .inputMinutesController - .text = - controller.minutes.value - .toString(); - inputTimeController.changePeriod( - controller.meridiemIndex - .value == - 0 + const SizedBox( + width: 16, + ), + Visibility( + visible: !settingsController + .is24HrsEnabled.value, + child: DropdownButton( + underline: Container(), + value: inputTimeController + .isAM.value ? 'AM' : 'PM', - ); - }, - textMapper: (numberText) { - return controller - .meridiem[ - int.parse(numberText)] - .value; - }, - itemWidth: width * 0.17, - selectedTextStyle: Theme.of(context) - .textTheme - .displayLarge! - .copyWith( - fontWeight: FontWeight.bold, - color: kprimaryColor, - ), - textStyle: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - fontSize: 20, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - decoration: BoxDecoration( - border: Border( - top: BorderSide( - width: width * 0.005, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - bottom: BorderSide( - width: width * 0.005, - color: themeController - .isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - ), - ), - ), - ], - ), - ) - : Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - width: 80, - child: TextField( - onChanged: (_) { - inputTimeController.setTime(); - }, - decoration: const InputDecoration( - hintText: 'HH', - border: InputBorder.none, - ), - textAlign: TextAlign.center, - controller: inputTimeController - .inputHrsController, - keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp( - '[1,2,3,4,5,6,7,8,9,0]', + dropdownColor: themeController + .isLightMode.value + ? kLightPrimaryBackgroundColor + : kprimaryBackgroundColor, + items: ['AM', 'PM'] + .map((String period) { + return DropdownMenuItem< + String>( + value: period, + child: Text(period), + ); + }).toList(), + onChanged: (getPeriod) { + inputTimeController + .changePeriod(getPeriod!); + + inputTimeController.setTime(); + }, ), ), - LengthLimitingTextInputFormatter(2), - LimitRange( - 0, - settingsController - .is24HrsEnabled.value - ? 23 - : 12, + const SizedBox( + width: 12, ), - ], - ), - ), - SizedBox( - width: 16, - child: Text( - ':', - textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .titleMedium, - ), - ), - SizedBox( - width: 80, - child: TextField( - onChanged: (_) { - inputTimeController.setTime(); - }, - decoration: const InputDecoration( - hintText: 'MM', - border: InputBorder.none, - ), - textAlign: TextAlign.center, - controller: inputTimeController - .inputMinutesController, - keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp( - '[1,2,3,4,5,6,7,8,9,0]', + Visibility( + visible: inputTimeController + .isTimePicker.isFalse, + child: InkWell( + onTap: () { + Utils.hapticFeedback(); + inputTimeController + .confirmTimeInput(); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 50.0, + ), + border: Border.all( + color: kprimaryColor, + width: 1.0, + ), + ), + padding: + const EdgeInsets.all(5.0), + child: const Icon( + Icons.done, + color: kprimaryColor, + ), + ), ), ), - LengthLimitingTextInputFormatter(2), - LimitRange(00, 59), ], ), - ), - const SizedBox( - width: 16, - ), - Visibility( - visible: !settingsController - .is24HrsEnabled.value, - child: DropdownButton( - underline: Container(), - value: inputTimeController.isAM.value - ? 'AM' - : 'PM', - dropdownColor: - themeController.isLightMode.value - ? kLightPrimaryBackgroundColor - : kprimaryBackgroundColor, - items: - ['AM', 'PM'].map((String period) { - return DropdownMenuItem( - value: period, - child: Text(period), - ); - }).toList(), - onChanged: (getPeriod) { - inputTimeController - .changePeriod(getPeriod!); - - inputTimeController.setTime(); - }, - ), - ), - const SizedBox( - width: 12, - ), - Visibility( - visible: inputTimeController - .isTimePicker.isFalse, - child: InkWell( - onTap: () { - Utils.hapticFeedback(); - inputTimeController - .confirmTimeInput(); - }, - child: Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(50.0), - border: Border.all( - color: kprimaryColor, - width: 1.0, - ), - ), - padding: EdgeInsets.all(5.0), - child: Icon( - Icons.done, - color: kprimaryColor, - ), - ), - ), - ), - ], - ), - ); - }, - ), - ), - RepeatTile( - controller: controller, - themeController: themeController, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - Obx( - () => (!controller.repeatDays - .every((element) => element == false)) - ? RepeatOnceTile( - controller: controller, - themeController: themeController, - ) - : const SizedBox(), - ), - Obx( - () => (!controller.repeatDays - .every((element) => element == false)) - ? Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( + ); + }, + ), + ), + ) + : Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + decoration: const InputDecoration( + hintText: 'Profile Name', + fillColor: ksecondaryBackgroundColor, + filled: true, + ), + controller: controller.profileTextEditingController, + ), + ), + SettingSelector(), + Obx( + () => controller.alarmSettingType.value == 0 + ? Column( + children: [ + AlarmDateTile( + controller: controller, + themeController: themeController, + ), + Divider( color: themeController.isLightMode.value ? kLightPrimaryDisabledTextColor : kprimaryDisabledTextColor, ), - ) - : const SizedBox(), - ), - SnoozeDurationTile( - controller: controller, - themeController: themeController, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - Obx( - () => (controller.repeatDays - .every((element) => element == false)) - ? DeleteAfterGoesOff( - controller: controller, - themeController: themeController, - ) - : const SizedBox(), - ), - LabelTile( - controller: controller, - themeController: themeController, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - NoteTile( - controller: controller, - themeController: themeController, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - ChooseRingtoneTile( - controller: controller, - themeController: themeController, - height: height, - width: width, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - AscendingVolumeTile( - controller: controller, - themeController: themeController, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - QuoteTile( - controller: controller, - themeController: themeController, - ), - Container( - color: themeController.isLightMode.value - ? kLightPrimaryBackgroundColor - : ksecondaryTextColor, - height: 10, - width: width, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Automatic Cancellation'.tr, - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - fontWeight: FontWeight.w500, - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.85) - : kprimaryTextColor.withOpacity(0.85), - ), + RepeatTile( + controller: controller, + themeController: themeController, ), - ), - ), - ScreenActivityTile( - controller: controller, - themeController: themeController, - ), - Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - WeatherTile( - controller: controller, - themeController: themeController, - ), - Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - LocationTile( - controller: controller, - height: height, - width: width, - themeController: themeController, - ), - ], - ), - ), - Container( - color: themeController.isLightMode.value - ? kLightPrimaryBackgroundColor - : ksecondaryTextColor, - height: 10, - width: width, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Challenges'.tr, - style: Theme.of( - context, - ).textTheme.titleMedium!.copyWith( - fontWeight: FontWeight.w500, - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.85) - : kprimaryTextColor.withOpacity(0.85), - ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, ), - ), - ), - ShakeToDismiss( - controller: controller, - themeController: themeController, - ), - Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - QrBarCode( - controller: controller, - themeController: themeController, - ), - Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - MathsChallenge( - controller: controller, - themeController: themeController, - ), - Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - PedometerChallenge( - controller: controller, - themeController: themeController, - ), - ], - ), - ), - Container( - color: themeController.isLightMode.value - ? kLightPrimaryBackgroundColor - : ksecondaryTextColor, - height: 10, - width: width, - ), - Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Text( - 'Shared Alarm'.tr, - style: Theme.of( - context, - ).textTheme.titleMedium!.copyWith( - fontWeight: FontWeight.w500, - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.85) - : kprimaryTextColor.withOpacity(0.85), - ), + Obx( + () => (!controller.repeatDays + .every((element) => element == false)) + ? RepeatOnceTile( + controller: controller, + themeController: themeController, + ) + : const SizedBox(), ), - ), - ), - SharedAlarm( - controller: controller, - themeController: themeController, - ), - Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - AlarmIDTile( - controller: controller, - width: width, - themeController: themeController, - ), - Obx( - () => Container( - child: (controller.isSharedAlarmEnabled.value) - ? Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ) - : const SizedBox(), - ), - ), - AlarmOffset( - controller: controller, - themeController: themeController, - ), - Obx( - () => Container( - child: (controller.isSharedAlarmEnabled.value && - controller.alarmRecord.value != null) - ? Divider( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ) - : const SizedBox(), - ), - ), - SharedUsers( - controller: controller, - themeController: themeController, + Obx( + () => (!controller.repeatDays + .every((element) => element == false)) + ? Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ) + : const SizedBox(), + ), + SnoozeDurationTile( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + Obx( + () => (controller.repeatDays + .every((element) => element == false)) + ? DeleteAfterGoesOff( + controller: controller, + themeController: themeController, + ) + : const SizedBox(), + ), + LabelTile( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + NoteTile( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ChooseRingtoneTile( + controller: controller, + themeController: themeController, + height: height, + width: width, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + AscendingVolumeTile( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + QuoteTile( + controller: controller, + themeController: themeController, + ), + ], + ) + : const SizedBox(), + ), + Obx( + () => controller.alarmSettingType.value == 1 + ? Column( + children: [ + ScreenActivityTile( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + WeatherTile( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + LocationTile( + controller: controller, + height: height, + width: width, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + GaurdianAngel( + controller: controller, + themeController: themeController, + ), + ], + ) + : const SizedBox(), + ), + Obx( + () => controller.alarmSettingType.value == 2 + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ShakeToDismiss( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + QrBarCode( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + MathsChallenge( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + PedometerChallenge( + controller: controller, + themeController: themeController, + ), + ], + ) + : const SizedBox(), + ), + Obx( + () => controller.alarmSettingType.value == 3 + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SharedAlarm( + controller: controller, + themeController: themeController, + ), + Divider( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + AlarmIDTile( + controller: controller, + width: width, + themeController: themeController, + ), + Obx( + () => Container( + child: (controller.isSharedAlarmEnabled.value) + ? Divider( + color: themeController + .isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ) + : const SizedBox(), + ), + ), + AlarmOffset( + controller: controller, + themeController: themeController, + ), + Obx( + () => Container( + child: (controller.isSharedAlarmEnabled.value) + ? Divider( + color: themeController + .isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ) + : const SizedBox(), + ), + ), + SharedUsers( + controller: controller, + themeController: themeController, + ), + ], + ) + : SizedBox( + height: height * 0.15, ), - ], - ), - ), - SizedBox( - height: height * 0.15, - ), - ], - ), - )); + ), + ], + ), + ), + ); } } diff --git a/lib/app/modules/addOrUpdateAlarm/views/alarm_date_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/alarm_date_tile.dart new file mode 100644 index 00000000..074d3f03 --- /dev/null +++ b/lib/app/modules/addOrUpdateAlarm/views/alarm_date_tile.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../utils/constants.dart'; +import '../../settings/controllers/theme_controller.dart'; +import '../controllers/add_or_update_alarm_controller.dart'; + +class AlarmDateTile extends StatelessWidget { + const AlarmDateTile({ + super.key, + required this.controller, + required this.themeController, + }); + + final AddOrUpdateAlarmController controller; + final ThemeController themeController; + + @override + Widget build(BuildContext context) { + return Obx(() => InkWell( + onTap: () async { + controller.datePicker(context); + }, + child: ListTile( + + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + FittedBox( + alignment: Alignment.centerLeft, + fit: BoxFit.scaleDown, + child: Text( + "Ring On", + style: TextStyle( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ), + ), + ), + Obx( + () => Wrap( + children: [Container( + width: 100, + alignment: Alignment.centerRight, + child: Text( + controller.isFutureDate.value + ? "${controller.selectedDate.value.toString().substring(0, 11)}" + : "Off", + style: TextStyle( + color: !controller.isFutureDate.value?themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor + : themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ), + ), + ), Icon( + Icons.chevron_right, + color: !(controller.isFutureDate.value) + ? themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor + : themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ),] + ), + ) + ], + ), + ), + )); + } +} diff --git a/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart b/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart index 3fc2ffa4..6a518773 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/ascending_volume.dart @@ -110,9 +110,6 @@ class AscendingVolumeTile extends StatelessWidget { ); }, child: ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, title: Text( 'Ascending Volume'.tr, style: TextStyle( diff --git a/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart index e29c53b8..20f80ddb 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/choose_ringtone_tile.dart @@ -39,9 +39,7 @@ class ChooseRingtoneTile extends StatelessWidget { Widget build(BuildContext context) { return Obx( () => ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: Text( 'Choose Ringtone'.tr, style: TextStyle( diff --git a/lib/app/modules/addOrUpdateAlarm/views/delete_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/delete_tile.dart index 4ce34e33..ab15a6fa 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/delete_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/delete_tile.dart @@ -28,9 +28,6 @@ class DeleteAfterGoesOff extends StatelessWidget { Visibility( visible: isVisible, child: ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, title: FittedBox( alignment: Alignment.centerLeft, fit: BoxFit.scaleDown, @@ -70,9 +67,6 @@ class DeleteAfterGoesOff extends StatelessWidget { ), ), Container( - color: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, child: Divider( color: themeController.isLightMode.value ? kLightPrimaryDisabledTextColor diff --git a/lib/app/modules/addOrUpdateAlarm/views/guardian_angel.dart b/lib/app/modules/addOrUpdateAlarm/views/guardian_angel.dart new file mode 100644 index 00000000..ae7d1bd6 --- /dev/null +++ b/lib/app/modules/addOrUpdateAlarm/views/guardian_angel.dart @@ -0,0 +1,229 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl_phone_number_input/intl_phone_number_input.dart'; +import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/constants.dart'; +import 'package:ultimate_alarm_clock/app/utils/utils.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:telephony/telephony.dart'; + +class GaurdianAngel extends StatelessWidget { + const GaurdianAngel({ + super.key, + required this.controller, + required this.themeController, + }); + + final AddOrUpdateAlarmController controller; + final ThemeController themeController; + + @override + Widget build(BuildContext context) { + // Check if using Firestore and the current user is the owner + // and if not using, just show the tile + + return Column( + children: [ + ListTile( + onTap: () {}, + title: Row( + children: [ + FittedBox( + fit: BoxFit.scaleDown, + alignment: Alignment.centerLeft, + child: Text( + 'Gaurdian Angel'.tr, + style: TextStyle( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + ), + ), + ), + IconButton( + icon: Icon( + Icons.info_sharp, + size: 21, + color: themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.45) + : kprimaryTextColor.withOpacity(0.3), + ), + onPressed: () { + Utils.showModal( + context: context, + title: 'Guardian Angel', + description: + 'This feature will automatically call or text a person' + ' you trust the most if you dont wake up to an alarm!' + '\n \n CALLING AND SMS PERMISSION REQUIRED.' + '\n \n RATES MAY APPLY AS PER YOUR SERVICE PROVIDER', + iconData: Icons.info_sharp, + isLightMode: themeController.isLightMode.value, + ); + }, + ), + ], + ), + trailing: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Obx( + () { + return Switch.adaptive( + value: controller.isGuardian.value, + activeColor: ksecondaryColor, + onChanged: (value) async { + Utils.hapticFeedback(); + var phonePerm = + await Permission.phone.request().isGranted; + var smsPerm = await Permission.sms.request().isGranted; + + if (phonePerm && smsPerm) { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(18), + ), + backgroundColor: kprimaryBackgroundColor, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: InternationalPhoneNumberInput( + textFieldController: controller + .contactTextEditingController, + onInputChanged: (value) {}, + onInputValidated: (value) {}, + spaceBetweenSelectorAndTextField: 0, + selectorConfig: const SelectorConfig( + showFlags: false, + setSelectorButtonAsPrefixIcon: true, + leadingPadding: 0, + trailingSpace: false, + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric( + vertical: controller + .homeController.scalingFactor * + 8, + horizontal: controller + .homeController.scalingFactor * + 4, + ), + child: Row( + children: [ + Option(0, Icons.sms, 'Text'), + Option(1, Icons.call, 'Call'), + const Spacer(), + Submit(), + ], + ), + ), + ], + ), + ), + ), + ); + } + }, + ); + }, + ), + ], + ), + ), + ], + ); + } + + Widget Option(int val, IconData icon, String name) { + return Obx( + () => Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + borderRadius: BorderRadius.circular(28), + onTap: () { + val == 0 + ? controller.isCall.value = false + : controller.isCall.value = true; + }, + child: Container( + decoration: BoxDecoration( + color: (val == 0 && !controller.isCall.value) || + (val == 1 && controller.isCall.value) + ? kprimaryColor + : ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + icon, + color: (val == 0 && !controller.isCall.value) || + (val == 1 && controller.isCall.value) + ? ksecondaryBackgroundColor + : Colors.white, + ), + ), + ), + ), + ), + Text( + name, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: controller.homeController.scalingFactor.value * 12, + ), + ), + ], + ), + ); + } + + Widget Submit() { + return Obx( + () => Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + borderRadius: BorderRadius.circular(28), + onTap: () { + controller.isGuardian.value = true; + Get.back(); + }, + child: Container( + decoration: BoxDecoration( + color: ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(20), + ), + child: const Padding( + padding: EdgeInsets.all(8.0), + child: Icon( + Icons.check, + color: kprimaryColor, + ), + ), + ), + ), + ), + Text( + 'Confirm', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: controller.homeController.scalingFactor.value * 12, + ), + ), + ], + ), + ); + } +} diff --git a/lib/app/modules/addOrUpdateAlarm/views/label_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/label_tile.dart index 7eaeddb0..ced6d1c9 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/label_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/label_tile.dart @@ -18,9 +18,7 @@ class LabelTile extends StatelessWidget { @override Widget build(BuildContext context) { return ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: FittedBox( alignment: Alignment.centerLeft, fit: BoxFit.scaleDown, diff --git a/lib/app/modules/addOrUpdateAlarm/views/note.dart b/lib/app/modules/addOrUpdateAlarm/views/note.dart index d308a724..9a9f1fe9 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/note.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/note.dart @@ -18,9 +18,7 @@ class NoteTile extends StatelessWidget { @override Widget build(BuildContext context) { return ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: FittedBox( fit: BoxFit.scaleDown, alignment: Alignment.centerLeft, diff --git a/lib/app/modules/addOrUpdateAlarm/views/quote_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/quote_tile.dart index 67d541a8..c2d9df9c 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/quote_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/quote_tile.dart @@ -19,9 +19,7 @@ class QuoteTile extends StatelessWidget { @override Widget build(BuildContext context) { return ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: FittedBox( fit: BoxFit.scaleDown, alignment: Alignment.centerLeft, diff --git a/lib/app/modules/addOrUpdateAlarm/views/repeat_once_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/repeat_once_tile.dart index 8035de55..bf043c07 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/repeat_once_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/repeat_once_tile.dart @@ -18,9 +18,7 @@ class RepeatOnceTile extends StatelessWidget { @override Widget build(BuildContext context) { return ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: FittedBox( fit: BoxFit.scaleDown, alignment: Alignment.centerLeft, @@ -52,7 +50,7 @@ class RepeatOnceTile extends StatelessWidget { activeColor: ksecondaryColor, onChanged: (value) { Utils.hapticFeedback(); - controller.isOneTime.value = false; + controller.isOneTime.value = true; }, ); } diff --git a/lib/app/modules/addOrUpdateAlarm/views/repeat_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/repeat_tile.dart index 86b7fb5c..e759d157 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/repeat_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/repeat_tile.dart @@ -104,9 +104,7 @@ class RepeatTile extends StatelessWidget { ); }, child: ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: Obx( () { bool anyDaySelected = diff --git a/lib/app/modules/addOrUpdateAlarm/views/screen_activity_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/screen_activity_tile.dart index dc54dc7e..d3de3a4b 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/screen_activity_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/screen_activity_tile.dart @@ -18,8 +18,6 @@ class ScreenActivityTile extends StatelessWidget { @override Widget build(BuildContext context) { - var height = Get.height; - var width = Get.width; int activityInterval; bool isActivityEnalbed; return InkWell( diff --git a/lib/app/modules/addOrUpdateAlarm/views/setting_selector.dart b/lib/app/modules/addOrUpdateAlarm/views/setting_selector.dart new file mode 100644 index 00000000..3c3f5dfd --- /dev/null +++ b/lib/app/modules/addOrUpdateAlarm/views/setting_selector.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/google_cloud_api_provider.dart'; +import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/share_dialog.dart'; + +import '../../../utils/constants.dart'; + +class SettingSelector extends StatelessWidget { + SettingSelector({super.key}); + AddOrUpdateAlarmController controller = + Get.find(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric( + vertical: controller.homeController.scalingFactor.value * 30, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Option(0, Icons.alarm, 'Alarm'), + Option(1, Icons.auto_awesome, 'Smart-Controls'), + Option(2, Icons.checklist_rounded, 'Challenges'), + Option(3, Icons.share, 'Share'), + ], + ), + ); + } + + Widget Option(int val, IconData icon, String name) { + return Obx( + () => Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + borderRadius: BorderRadius.circular(28), + onTap: () async { + if (name == 'Share') { + final isLoggedIn = await GoogleCloudProvider.isUserLoggedin(); + if(isLoggedIn) + { + Get.dialog(ShareDialog( + homeController: controller.homeController, + controller: controller, + themeController: controller.themeController, + )); + } + else{ + await GoogleCloudProvider.getInstance(); + + }; + } else { + controller.alarmSettingType.value = val; + } + }, + child: Container( + decoration: BoxDecoration( + color: controller.alarmSettingType.value == val + ? kprimaryColor + : ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + icon, + color: controller.alarmSettingType.value == val + ? ksecondaryBackgroundColor + : Colors.white, + ), + ), + ), + ), + ), + Text( + name, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: controller.homeController.scalingFactor.value * 12, + ), + ), + ], + ), + ); + } +} diff --git a/lib/app/modules/addOrUpdateAlarm/views/shake_to_dismiss_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/shake_to_dismiss_tile.dart index b123af76..e0f8f445 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/shake_to_dismiss_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/shake_to_dismiss_tile.dart @@ -18,8 +18,6 @@ class ShakeToDismiss extends StatelessWidget { @override Widget build(BuildContext context) { - var width = Get.width; - var height = Get.height; int shakeTimes; bool isShakeEnabled; return ListTile( @@ -100,6 +98,7 @@ class ShakeToDismiss extends StatelessWidget { controller.shakeTimes.value = value; }, ), + // ignore: require_trailing_commas Text(controller.shakeTimes.value > 1 ? 'times'.tr : 'time'.tr), diff --git a/lib/app/modules/addOrUpdateAlarm/views/shared_alarm_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/shared_alarm_tile.dart index dc21f076..3d06d0bc 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/shared_alarm_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/shared_alarm_tile.dart @@ -1,3 +1,5 @@ +// ignore_for_file: lines_longer_than_80_chars + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart'; @@ -160,7 +162,7 @@ class SharedAlarm extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.symmetric( - horizontal: 8.0, vertical: 4.0), + horizontal: 8.0, vertical: 4.0,), child: Text( 'To use this feature, you have to link your Google account!' .tr, @@ -269,6 +271,6 @@ class SharedAlarm extends StatelessWidget { ), ), ), - )); + ),); } } diff --git a/lib/app/modules/addOrUpdateAlarm/views/shared_users_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/shared_users_tile.dart index e7d9138e..d48373e1 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/shared_users_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/shared_users_tile.dart @@ -1,4 +1,4 @@ -// ignore_for_file: lines_longer_than_80_chars +// ignore_for_file: lines_longer_than_80_chars, unnecessary_null_comparison import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -25,7 +25,7 @@ class SharedUsers extends StatelessWidget { () => Container( child: (controller.isSharedAlarmEnabled.value && controller.alarmRecord.value != null) - ? (controller.alarmRecord.value!.ownerId != + ? (controller.alarmRecord.value.ownerId != controller.userModel.value!.id) ? ListTile( title: Text( @@ -37,7 +37,7 @@ class SharedUsers extends StatelessWidget { ), ), trailing: Text( - controller.alarmRecord.value!.ownerName, + controller.alarmRecord.value.ownerName, style: Theme.of(context).textTheme.bodyMedium!.copyWith( color: themeController.isLightMode.value ? kLightPrimaryDisabledTextColor diff --git a/lib/app/modules/addOrUpdateAlarm/views/snooze_duration_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/snooze_duration_tile.dart index 137d5397..226ce39a 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/snooze_duration_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/snooze_duration_tile.dart @@ -86,9 +86,7 @@ class SnoozeDurationTile extends StatelessWidget { ); }, child: ListTile( - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: FittedBox( alignment: Alignment.centerLeft, fit: BoxFit.scaleDown, diff --git a/lib/app/modules/addOrUpdateAlarm/views/weather_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/weather_tile.dart index 22d391aa..960717b8 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/weather_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/weather_tile.dart @@ -302,9 +302,7 @@ class WeatherTile extends StatelessWidget { ), ); }, - tileColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, + title: Row( children: [ FittedBox( diff --git a/lib/app/modules/alarmChallenge/views/pedometer_challenge_view.dart b/lib/app/modules/alarmChallenge/views/pedometer_challenge_view.dart index 7a5c35ef..09fa4ee0 100644 --- a/lib/app/modules/alarmChallenge/views/pedometer_challenge_view.dart +++ b/lib/app/modules/alarmChallenge/views/pedometer_challenge_view.dart @@ -1,3 +1,5 @@ +// ignore_for_file: must_be_immutable + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/modules/alarmChallenge/controllers/alarm_challenge_controller.dart'; diff --git a/lib/app/modules/alarmChallenge/views/qr_challenge_view.dart b/lib/app/modules/alarmChallenge/views/qr_challenge_view.dart index fd73a452..e7260f0e 100644 --- a/lib/app/modules/alarmChallenge/views/qr_challenge_view.dart +++ b/lib/app/modules/alarmChallenge/views/qr_challenge_view.dart @@ -1,4 +1,4 @@ -// ignore_for_file: lines_longer_than_80_chars +// ignore_for_file: lines_longer_than_80_chars, must_be_immutable import 'package:flutter/material.dart'; import 'package:get/get.dart'; diff --git a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart index 03d82b26..35e97786 100644 --- a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart +++ b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart @@ -20,6 +20,8 @@ import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:vibration/vibration.dart'; +import '../../home/controllers/home_controller.dart'; + class AlarmControlController extends GetxController { MethodChannel alarmChannel = MethodChannel('ulticlock'); RxString note = ''.obs; @@ -30,31 +32,20 @@ class AlarmControlController extends GetxController { RxInt minutes = 1.obs; RxInt seconds = 0.obs; RxBool showButton = false.obs; - final Rx currentlyRingingAlarm = Utils.genFakeAlarmModel().obs; + HomeController homeController = Get.find(); + Rx currentlyRingingAlarm = Utils.alarmModelInit.obs; final formattedDate = Utils.getFormattedDate(DateTime.now()).obs; final timeNow = Utils.convertTo12HourFormat(Utils.timeOfDayToString(TimeOfDay.now())).obs; Timer? _currentTimeTimer; bool isAlarmActive = true; late double initialVolume; - - getCurrentlyRingingAlarm() async { - UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); - AlarmModel _alarmRecord = Utils.genFakeAlarmModel(); - AlarmModel isarLatestAlarm = - await IsarDb.getLatestAlarm(_alarmRecord, false); - AlarmModel firestoreLatestAlarm = - await FirestoreDb.getLatestAlarm(_userModel, _alarmRecord, false); - AlarmModel latestAlarm = - Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm); - debugPrint('CURRENT RINGING : ${latestAlarm.alarmTime}'); - - return latestAlarm; - } + late Timer guardianTimer; + RxInt guardianCoundown = 120.obs; getNextAlarm() async { UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); - AlarmModel _alarmRecord = Utils.genFakeAlarmModel(); + AlarmModel _alarmRecord = homeController.genFakeAlarmModel(); AlarmModel isarLatestAlarm = await IsarDb.getLatestAlarm(_alarmRecord, true); AlarmModel firestoreLatestAlarm = @@ -162,6 +153,24 @@ class AlarmControlController extends GetxController { @override void onInit() async { super.onInit(); + currentlyRingingAlarm.value = Get.arguments; + print('hwyooo ${currentlyRingingAlarm.value.isGuardian}'); + if (currentlyRingingAlarm.value.isGuardian) { + guardianTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + print(guardianCoundown.value); + if (guardianCoundown.value == 0) { + currentlyRingingAlarm.value.isCall + ? Utils.dialNumber(currentlyRingingAlarm.value.guardian) + : Utils.sendSMS(currentlyRingingAlarm.value.guardian, + "Your Friend is not waking up \n - Ultimate Alarm Clock"); + timer.cancel(); + } else { + guardianCoundown.value = guardianCoundown.value - 1; + } + }); + } + + showButton.value = true; initialVolume = await FlutterVolumeController.getVolume( stream: AudioStream.alarm, ) as double; @@ -193,48 +202,48 @@ class AlarmControlController extends GetxController { }); startTimer(); - if (Get.arguments == null) { - currentlyRingingAlarm.value = await getCurrentlyRingingAlarm(); - showButton.value = true; - // If the alarm is set to NEVER repeat, then it will - // be chosen as the next alarm to ring by default as - // it would ring the next day - if (currentlyRingingAlarm.value.days - .every((element) => element == false)) { - currentlyRingingAlarm.value.isEnabled = false; - - if (currentlyRingingAlarm.value.isSharedAlarmEnabled == false) { - IsarDb.updateAlarm(currentlyRingingAlarm.value); - } else { - FirestoreDb.updateAlarm( - currentlyRingingAlarm.value.ownerId, - currentlyRingingAlarm.value, - ); - } - } else if (currentlyRingingAlarm.value.isOneTime == true) { - // If the alarm has to repeat on one day, but ring just once, we will - // keep seting its days to false until it will never ring - int currentDay = DateTime.now().weekday - 1; - currentlyRingingAlarm.value.days[currentDay] = false; - - if (currentlyRingingAlarm.value.days - .every((element) => element == false)) { - currentlyRingingAlarm.value.isEnabled = false; - } - - if (currentlyRingingAlarm.value.isSharedAlarmEnabled == false) { - IsarDb.updateAlarm(currentlyRingingAlarm.value); - } else { - FirestoreDb.updateAlarm( - currentlyRingingAlarm.value.ownerId, - currentlyRingingAlarm.value, - ); - } - } - } else { - currentlyRingingAlarm.value = Get.arguments; - showButton.value = true; - } + // if (Get.arguments == null) { + // currentlyRingingAlarm.value = await getCurrentlyRingingAlarm(); + // showButton.value = true; + // // If the alarm is set to NEVER repeat, then it will + // // be chosen as the next alarm to ring by default as + // // it would ring the next day + // if (currentlyRingingAlarm.value.days + // .every((element) => element == false)) { + // currentlyRingingAlarm.value.isEnabled = false; + // + // if (currentlyRingingAlarm.value.isSharedAlarmEnabled == false) { + // IsarDb.updateAlarm(currentlyRingingAlarm.value); + // } else { + // FirestoreDb.updateAlarm( + // currentlyRingingAlarm.value.ownerId, + // currentlyRingingAlarm.value, + // ); + // } + // } else if (currentlyRingingAlarm.value.isOneTime == true) { + // // If the alarm has to repeat on one day, but ring just once, we will + // // keep seting its days to false until it will never ring + // int currentDay = DateTime.now().weekday - 1; + // currentlyRingingAlarm.value.days[currentDay] = false; + // + // if (currentlyRingingAlarm.value.days + // .every((element) => element == false)) { + // currentlyRingingAlarm.value.isEnabled = false; + // } + // + // if (currentlyRingingAlarm.value.isSharedAlarmEnabled == false) { + // IsarDb.updateAlarm(currentlyRingingAlarm.value); + // } else { + // FirestoreDb.updateAlarm( + // currentlyRingingAlarm.value.ownerId, + // currentlyRingingAlarm.value, + // ); + // } + // } + // } else { + // currentlyRingingAlarm.value = Get.arguments; + // showButton.value = true; + // } AudioUtils.playAlarm(alarmRecord: currentlyRingingAlarm.value); diff --git a/lib/app/modules/alarmRing/views/alarm_ring_view.dart b/lib/app/modules/alarmRing/views/alarm_ring_view.dart index aa993931..282464f7 100644 --- a/lib/app/modules/alarmRing/views/alarm_ring_view.dart +++ b/lib/app/modules/alarmRing/views/alarm_ring_view.dart @@ -94,6 +94,10 @@ class AlarmControlView extends GetView { ), onPressed: () { Utils.hapticFeedback(); + if (controller + .currentlyRingingAlarm.value.isGuardian) { + controller.guardianTimer.cancel(); + } if (Utils.isChallengeEnabled( controller.currentlyRingingAlarm.value, )) { @@ -105,8 +109,8 @@ class AlarmControlView extends GetView { } else { Get.offNamed( '/bottom-navigation-bar', - arguments: controller.currentlyRingingAlarm - .value, + arguments: + controller.currentlyRingingAlarm.value, ); } }, @@ -115,41 +119,6 @@ class AlarmControlView extends GetView { ), ), ), - (Get.arguments != null) - ? Padding( - padding: const EdgeInsets.all(8.0), - child: Obx( - () => SizedBox( - height: height * 0.06, - width: width, - child: TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.7) - : kprimaryTextColor.withOpacity(0.7), - ), - ), - child: Text( - 'Exit Preview'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () { - Utils.hapticFeedback(); - Get.offNamed('/bottom-navigation-bar'); - }, - ), - ), - ), - ) - : const SizedBox(), ], ), body: Center( @@ -200,21 +169,23 @@ class AlarmControlView extends GetView { ), ), Obx( - () => Visibility( - visible: - controller.currentlyRingingAlarm.value.note.isNotEmpty, - child: Text( - controller.currentlyRingingAlarm.value.note, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor, - fontSize: 20, - fontWeight: FontWeight.w100, - fontStyle: FontStyle.italic, - ), - ), - ), + () { + return Visibility( + visible: controller + .currentlyRingingAlarm.value.note.isNotEmpty, + child: Text( + controller.currentlyRingingAlarm.value.note, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + fontSize: 20, + fontWeight: FontWeight.w100, + fontStyle: FontStyle.italic, + ), + ), + ); + }, ), Obx( () => Visibility( diff --git a/lib/app/modules/bottomNavigationBar/bindings/bottom_navigation_bar_binding.dart b/lib/app/modules/bottomNavigationBar/bindings/bottom_navigation_bar_binding.dart index c2e2a1e8..14be377f 100644 --- a/lib/app/modules/bottomNavigationBar/bindings/bottom_navigation_bar_binding.dart +++ b/lib/app/modules/bottomNavigationBar/bindings/bottom_navigation_bar_binding.dart @@ -12,13 +12,10 @@ class BottomNavigationBarBinding extends Bindings { Get.lazyPut( () => BottomNavigationBarController(), ); - Get.lazyPut( - () => TimerController(), - ); + Get.lazyPut( () => StopwatchController(), ); Get.lazyPut(() => SettingsController(), fenix: true); - Get.lazyPut(() => HomeController()); } } diff --git a/lib/app/modules/home/bindings/home_binding.dart b/lib/app/modules/home/bindings/home_binding.dart index 1c7c303b..b36a5ab1 100644 --- a/lib/app/modules/home/bindings/home_binding.dart +++ b/lib/app/modules/home/bindings/home_binding.dart @@ -12,9 +12,7 @@ class HomeBinding extends Bindings { HomeController(), ); - Get.lazyPut( - () => TimerController(), - ); + Get.lazyPut( () => BottomNavigationBarController(), ); diff --git a/lib/app/modules/home/controllers/home_controller.dart b/lib/app/modules/home/controllers/home_controller.dart index 0ccd6848..d5eefcc2 100644 --- a/lib/app/modules/home/controllers/home_controller.dart +++ b/lib/app/modules/home/controllers/home_controller.dart @@ -1,5 +1,7 @@ import 'dart:async'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/services.dart'; +import 'package:googleapis/calendar/v3.dart' as CalendarApi; import 'package:intl/intl.dart'; import 'package:rxdart/rxdart.dart' as rx; import 'package:cloud_firestore/cloud_firestore.dart'; @@ -9,15 +11,18 @@ import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/quote_model.dart'; -import 'package:ultimate_alarm_clock/app/data/models/timer_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/get_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; +import '../../../data/models/profile_model.dart'; +import '../../../data/providers/google_cloud_api_provider.dart'; + class Pair { final T first; final U second; @@ -41,9 +46,15 @@ class HomeController extends GetxController { Timer? _delayTimer; Timer _timer = Timer.periodic(const Duration(milliseconds: 1), (timer) {}); List alarms = [].obs; + List notifications = [].obs; + int lastRefreshTime = DateTime.now().millisecondsSinceEpoch; Timer? delayToSchedule; - final GoogleSignIn _googleSignIn = GoogleSignIn(); + final GoogleSignIn _googleSignIn = GoogleSignIn( + scopes: [ + CalendarApi.CalendarApi.calendarScope, + ], + ); final Rx userModel = Rx(null); final RxBool isUserSignedIn = false.obs; final floatingButtonKey = GlobalKey(); @@ -67,6 +78,18 @@ class HomeController extends GetxController { final RxDouble selecteddurationDouble = 0.0.obs; ThemeController themeController = Get.find(); + RxList Calendars = [].obs; + RxList Events = [].obs; + final RxString calendarFetchStatus = 'Loading'.obs; + final RxString selectedCalendar = ''.obs; + RxBool isCalender = true.obs; + RxBool expandProfile = false.obs; + + RxBool isProfile = false.obs; + RxString selectedProfile = ''.obs; + Rx profileModel = Utils.genDefaultProfileModel().obs; + + final storage = Get.find(); loginWithGoogle() async { // Logging in again to ensure right details if User has linked account @@ -107,14 +130,12 @@ class HomeController extends GetxController { initStream(UserModel? user) async { firestoreStreamAlarms = FirestoreDb.getAlarms(userModel.value); - isarStreamAlarms = IsarDb.getAlarms(); + isarStreamAlarms = IsarDb.getAlarms(selectedProfile.value); sharedAlarmsStream = FirestoreDb.getSharedAlarms(userModel.value); - - Stream> streamAlarms = rx.Rx.combineLatest3( + Stream> streamAlarms = rx.Rx.combineLatest2( firestoreStreamAlarms!, - sharedAlarmsStream!, isarStreamAlarms!, - (firestoreData, sharedData, isarData) { + (firestoreData, isarData) { List firestoreDocuments = firestoreData.docs; latestFirestoreAlarms = firestoreDocuments.map((doc) { return AlarmModel.fromDocumentSnapshot( @@ -123,15 +144,6 @@ class HomeController extends GetxController { ); }).toList(); - List sharedAlarmDocuments = sharedData.docs; - latestSharedAlarms = sharedAlarmDocuments.map((doc) { - return AlarmModel.fromDocumentSnapshot( - documentSnapshot: doc, - user: user, - ); - }).toList(); - - latestFirestoreAlarms += latestSharedAlarms; latestIsarAlarms = isarData as List; List alarms = [ @@ -214,11 +226,38 @@ class HomeController extends GetxController { return streamAlarms; } + void readProfileName() async { + String profileName = await storage.readProfile(); + selectedProfile.value = profileName; + ProfileModel? p = await IsarDb.getProfile(profileName); + profileModel.value = p!; + } + + void writeProfileName(String name) async { + await storage.writeProfile(name); + selectedProfile.value = name; + ProfileModel? p = await IsarDb.getProfile(name); + profileModel.value = p!; + } + @override void onInit() async { super.onInit(); + final checkDefault = await IsarDb.getProfile('Default'); + if (checkDefault == null) { + IsarDb.addProfile(Utils.genDefaultProfileModel()); + await storage.writeProfile("Default"); + profileModel.value = Utils.genDefaultProfileModel(); + } + readProfileName(); - if (!isUserSignedIn.value) await loginWithGoogle(); + FirebaseAuth.instance.authStateChanges().listen((user) { + if (user == null) { + isUserSignedIn.value = false; + } else { + isUserSignedIn.value = true; + } + }); isSortedAlarmListEnabled.value = await SecureStorageProvider() .readSortedAlarmListValue(key: 'sorted_alarm_list'); @@ -265,7 +304,7 @@ class HomeController extends GetxController { } // Fake object to get latest alarm - AlarmModel alarmRecord = Utils.genFakeAlarmModel(); + AlarmModel alarmRecord = genFakeAlarmModel(); AlarmModel isarLatestAlarm = await IsarDb.getLatestAlarm(alarmRecord, true); @@ -299,7 +338,7 @@ class HomeController extends GetxController { ? nextMinute.difference(now) : Duration.zero; - // Adding a delay till that difference between seconds upto the next + // Adding a delay till that difference between seconds up to the next // minute _delayTimer = Timer(delay, () { // Update the value of timeToAlarm only once till it settles it's time @@ -311,7 +350,7 @@ class HomeController extends GetxController { // AFTER 1 MIN ACCORDING TO BELOW TIMER WHICH WILL CAUSE // MISCALCULATION FOR INITIAL MINUTES // This is just to make sure that our calculated time-to-alarm is - // upto date with the real time for next alarm + // up to date with the real time for next alarm timeToAlarm = Utils.timeUntilAlarm( Utils.stringToTimeOfDay(latestAlarm.alarmTime), latestAlarm.days, @@ -363,9 +402,9 @@ class HomeController extends GetxController { 'milliSeconds': intervaltoAlarm, 'activityMonitor': latestAlarm.activityMonitor, }); - print("Scheduled..."); + print('Scheduled...'); } on PlatformException catch (e) { - print("Failed to schedule alarm: ${e.message}"); + print('Failed to schedule alarm: ${e.message}'); } } } @@ -379,6 +418,47 @@ class HomeController extends GetxController { } } + Future fetchGoogleCalendars() async { + Calendars.value = (await GoogleCloudProvider.getCalenders()) ?? []; + if (Calendars.value == []) { + calendarFetchStatus.value = 'Empty'; + } else { + calendarFetchStatus.value = 'Loaded'; + } + } + + Future fetchEvents(String calenderId) async { + Events.value = await GoogleCloudProvider.getEvents(calenderId) ?? []; + if (Events.value == []) { + calendarFetchStatus.value = 'Empty'; + Get.snackbar('Events', 'No events available'); + } else { + calendarFetchStatus.value = 'Loaded'; + isCalender.value = false; + } + print(Events.value); + } + + Future setAlarmFromEvent(CalendarApi.Event event, String date) async { + AlarmModel alarmModel = genFakeAlarmModel(); + alarmModel.alarmTime = Utils.formatDateTimeToHHMMSS( + event.start?.dateTime?.toLocal() ?? event.start!.date!.toLocal(), + ); + alarmModel.isEnabled = true; + alarmModel.intervalToAlarm = Utils.calculateTimeDifference( + event.start?.dateTime ?? event.start!.date!, + ); + alarmModel.ringOn = true; + + alarmModel.label = event.summary!; + alarmModel.isOneTime = true; + isProfile.value = false; + Get.toNamed( + '/add-update-alarm', + arguments: alarmModel, + ); + } + // Add all alarms to seleted alarm set void addAllAlarmsToSelectedAlarmSet() { for (int index = 0; index < alarmListPairs.first.length; index++) { @@ -609,4 +689,58 @@ class HomeController extends GetxController { ), ); } + + getCurrentProfileModel() async { + profileModel.value = (await IsarDb.getProfile(selectedProfile.value))!; + } + + AlarmModel genFakeAlarmModel() { + return AlarmModel( + volMax: profileModel.value.volMax, + volMin: profileModel.value.volMin, + snoozeDuration: profileModel.value.snoozeDuration, + gradient: profileModel.value.gradient, + label: profileModel.value.label, + isOneTime: profileModel.value.isOneTime, + deleteAfterGoesOff: profileModel.value.deleteAfterGoesOff, + offsetDetails: profileModel.value.offsetDetails, + mainAlarmTime: Utils.timeOfDayToString(TimeOfDay.now()), + lastEditedUserId: profileModel.value.lastEditedUserId, + mutexLock: profileModel.value.mutexLock, + ownerName: profileModel.value.ownerName, + ownerId: profileModel.value.ownerId, + alarmID: '', + activityInterval: profileModel.value.activityInterval, + isMathsEnabled: profileModel.value.isMathsEnabled, + numMathsQuestions: profileModel.value.numMathsQuestions, + mathsDifficulty: profileModel.value.mathsDifficulty, + qrValue: profileModel.value.qrValue, + isQrEnabled: profileModel.value.isQrEnabled, + isShakeEnabled: profileModel.value.isShakeEnabled, + shakeTimes: profileModel.value.shakeTimes, + isPedometerEnabled: profileModel.value.isPedometerEnabled, + numberOfSteps: profileModel.value.numberOfSteps, + days: profileModel.value.days, + weatherTypes: profileModel.value.weatherTypes, + isWeatherEnabled: profileModel.value.isWeatherEnabled, + isEnabled: profileModel.value.isEnabled, + isActivityEnabled: profileModel.value.isActivityEnabled, + isLocationEnabled: profileModel.value.isLocationEnabled, + isSharedAlarmEnabled: profileModel.value.isSharedAlarmEnabled, + intervalToAlarm: 0, + location: profileModel.value.location, + alarmTime: Utils.timeOfDayToString(TimeOfDay.now()), + minutesSinceMidnight: Utils.timeOfDayToInt(TimeOfDay.now()), + ringtoneName: profileModel.value.ringtoneName, + note: profileModel.value.note, + showMotivationalQuote: profileModel.value.showMotivationalQuote, + activityMonitor: profileModel.value.activityMonitor, + alarmDate: profileModel.value.alarmDate, + profile: profileModel.value.profileName, + isGuardian: profileModel.value.isGuardian, + guardianTimer: profileModel.value.guardianTimer, + guardian: profileModel.value.guardian, + isCall: profileModel.value.isCall, + ringOn: false); + } } diff --git a/lib/app/modules/home/views/google_calender_dialog.dart b/lib/app/modules/home/views/google_calender_dialog.dart new file mode 100644 index 00000000..b9a5beb1 --- /dev/null +++ b/lib/app/modules/home/views/google_calender_dialog.dart @@ -0,0 +1,294 @@ +// ignore_for_file: lines_longer_than_80_chars + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/controllers/home_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + +import '../../../utils/constants.dart'; + +Future googleCalenderDialog( + HomeController controller, + ThemeController themeController, + BuildContext context, +) async { + controller.fetchGoogleCalendars(); + return Obx( + () => Dialog( + backgroundColor: kprimaryBackgroundColor, + child: SizedBox( + height: controller.scalingFactor.value * 350, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: controller.calendarFetchStatus == 'Loading' + ? const SizedBox( + child: Center( + child: CircularProgressIndicator( + backgroundColor: Colors.transparent, + valueColor: AlwaysStoppedAnimation( + kprimaryColor, + ), + ), + ), + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/images/GC.svg', + colorFilter: const ColorFilter.mode( + kprimaryColor, + BlendMode.srcIn, + ), + height: 30 * controller.scalingFactor.value, + width: 30 * controller.scalingFactor.value, + ), + Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: Text( + 'Google Calender', + style: Theme.of(context) + .textTheme + .displaySmall! + .copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + fontSize: 20 * controller.scalingFactor.value, + ), + ), + ), + ], + ), + controller.isCalender.value + ? Expanded( + child: ListView.builder( + shrinkWrap: true, + itemCount: controller.Calendars.value.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + controller.calendarFetchStatus.value = + 'Loading'; + controller.fetchEvents( + controller.Calendars.value[index].id, + ); + }, + child: Card( + color: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 16, + ), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Padding( + padding: + const EdgeInsets.all(8.0), + child: Icon( + Icons.calendar_month, + color: kprimaryColor, + ), + ), + Text( + '${controller.Calendars.value[index].summary}', + style: Theme.of(context) + .textTheme + .displaySmall! + .copyWith( + color: themeController + .isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor, + fontSize: 15 * + controller + .scalingFactor + .value, + ), + ), + ], + ), + ), + ), + ), + ), + ); + }, + ), + ) + : Expanded( + child: ListView.builder( + shrinkWrap: true, + itemCount: controller.Events.value.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Card( + color: themeController.isLightMode.value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 16, + ), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: + controller.scalingFactor.value * + 180, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SingleChildScrollView( + scrollDirection: + Axis.horizontal, + child: Row( + children: [ + const Padding( + padding: + EdgeInsets.all(8.0), + child: Icon( + Icons.calendar_month, + color: kprimaryColor, + ), + ), + Text( + '${controller.Events.value[index].summary}', + style: Theme.of(context) + .textTheme + .displaySmall! + .copyWith( + color: themeController + .isLightMode + .value + ? kLightPrimaryTextColor + : kprimaryTextColor, + fontSize: 15 * + controller + .scalingFactor + .value, + ), + ), + ], + ), + ), + SingleChildScrollView( + scrollDirection: + Axis.horizontal, + child: Row( + children: [ + Padding( + padding: + const EdgeInsets + .all( + 8.0, + ), + child: Icon( + Icons + .watch_later_outlined, + color: kprimaryColor, + ), + ), + Text( + Utils.formatDateTimeToStandard( + controller + .Events + .value[ + index] + .start + .dateTime ?? + controller + .Events + .value[ + index] + .start + .date), + ), + ], + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: InkWell( + onTap: () { + + controller.setAlarmFromEvent( + controller + .Events.value[index], + Utils + .formatDateTimeToStandard( + controller + .Events + .value[index] + .start + .dateTime ?? + controller + .Events + .value[index] + .start + .date)[10]); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 16, + ), + color: kprimaryColor, + ), + child: Padding( + padding: + const EdgeInsets.all(8.0), + child: Center( + child: Icon( + Icons + .arrow_forward_ios_rounded, + ), + ), + ), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ), + ], + ), + ), + ), + ), + ); +} diff --git a/lib/app/modules/home/views/home_view.dart b/lib/app/modules/home/views/home_view.dart index 2b26aa30..2d553ee2 100644 --- a/lib/app/modules/home/views/home_view.dart +++ b/lib/app/modules/home/views/home_view.dart @@ -7,16 +7,18 @@ import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/views/google_calender_dialog.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/views/profile_config.dart'; import 'package:ultimate_alarm_clock/app/modules/home/views/toggle_button.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; -import 'package:ultimate_alarm_clock/app/routes/app_pages.dart'; import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/end_drawer.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import '../controllers/home_controller.dart'; +import 'notification_icon.dart'; class HomeView extends GetView { HomeView({Key? key}) : super(key: key); @@ -29,271 +31,29 @@ class HomeView extends GetView { var width = Get.width; var height = Get.height; return Scaffold( - floatingActionButtonLocation: ExpandableFab.location, + floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButton: Obx( () => Visibility( - visible: controller.inMultipleSelectMode.value ? false : true, - child: Container( - child: (controller.isUserSignedIn.value) - ? ExpandableFab( - key: controller.floatingButtonKey, - initialOpen: false, - type: ExpandableFabType.up, - childrenOffset: Offset.zero, - distance: 70, - children: [ - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(kprimaryColor), - ), - onPressed: () { - Utils.hapticFeedback(); - controller.floatingButtonKey.currentState!.toggle(); - Get.defaultDialog( - title: 'Join an alarm'.tr, - titlePadding: - const EdgeInsets.fromLTRB(0, 21, 0, 0), - backgroundColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - titleStyle: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor, - ), - contentPadding: const EdgeInsets.all(21), - content: TextField( - controller: controller.alarmIdController, - style: Theme.of(context).textTheme.bodyLarge, - cursorColor: themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.75) - : kprimaryTextColor.withOpacity(0.75), - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.75) - : kprimaryTextColor.withOpacity(0.75), - width: 1, - ), - borderRadius: const BorderRadius.all( - Radius.circular(12), - ), - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.75) - : kprimaryTextColor.withOpacity(0.75), - width: 1, - ), - borderRadius: const BorderRadius.all( - Radius.circular(12), - ), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.75) - : kprimaryTextColor.withOpacity(0.75), - width: 1, - ), - borderRadius: const BorderRadius.all( - Radius.circular(12), - ), - ), - hintText: 'Enter Alarm ID'.tr, - hintStyle: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - ), - buttonColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - confirm: TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - kprimaryColor, - ), - ), - child: Text( - 'Join'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () async { - Utils.hapticFeedback(); - var result = - await FirestoreDb.addUserToAlarmSharedUsers( - controller.userModel.value, - controller.alarmIdController.text, - ); - - if (result != true) { - Get.defaultDialog( - titlePadding: const EdgeInsets.symmetric( - vertical: 20, - ), - backgroundColor: - themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - title: 'Error!'.tr, - titleStyle: Theme.of(context) - .textTheme - .displaySmall, - content: Column( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - const Icon( - Icons.close, - size: 50, - color: Colors.red, - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 10.0, - ), - child: Text( - result == null - ? 'You cannot join your own alarm!' - .tr - : 'An alarm with this ID doesn\'t exist!' - .tr, - style: Theme.of(context) - .textTheme - .displaySmall, - textAlign: TextAlign.center, - ), - ), - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all( - kprimaryColor, - ), - ), - child: Text( - 'Okay'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController - .isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () { - Utils.hapticFeedback(); - Get.back(); - }, - ), - ], - ), - ); - } else { - Get.back(); - } - }, - ), - ); - }, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.alarm, - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - const SizedBox(width: 8.0), - Text( - 'Join alarm'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - ), - ], - ), - ), - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(kprimaryColor), - ), - onPressed: () { - Utils.hapticFeedback(); - controller.floatingButtonKey.currentState!.toggle(); - Get.toNamed('/add-update-alarm'); - }, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.add, - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - const SizedBox(width: 8.0), - Text( - 'Create alarm'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - ), - ], - ), - ), - ], - ) - : ExpandableFab( - initialOpen: false, - key: controller.floatingButtonKeyLoggedOut, - child: Icon(Icons.add), - children: [], - onOpen: () { - controller.floatingButtonKeyLoggedOut.currentState! - .toggle(); - Utils.hapticFeedback(); - Get.toNamed('/add-update-alarm'); - }, - ), - ), - ), + visible: controller.inMultipleSelectMode.value ? false : true, + child: Container( + height: controller.scalingFactor.value * 90, + width: controller.scalingFactor.value * 90, + child: FloatingActionButton( + onPressed: () { + Utils.hapticFeedback(); + controller.isProfile.value = false; + Get.toNamed( + '/add-update-alarm', + arguments: controller.genFakeAlarmModel(), + ); + }, + child: Container( + child: Icon( + Icons.add, + size: controller.scalingFactor.value * 30, + )), + ), + )), ), endDrawer: buildEndDrawer(context), appBar: null, @@ -375,83 +135,119 @@ class HomeView extends GetView { ], ), ), - Obx( - () => Visibility( - visible: - controller.scalingFactor < 0.9 - ? false - : true, - child: IconButton( - onPressed: () { - Utils.hapticFeedback(); - Scaffold.of(context) - .openEndDrawer(); - }, - icon: const Icon( - Icons.menu, + Row( + children: [ + notificationIcon(controller), + Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () async { + controller.isCalender.value = + true; + Get.dialog( + await googleCalenderDialog( + controller, + themeController, + context, + ), + ); + }, + child: SvgPicture.asset( + 'assets/images/GC.svg', + colorFilter: + const ColorFilter.mode( + kprimaryColor, + BlendMode.srcIn, + ), + height: 30 * + controller + .scalingFactor.value, + width: 30 * + controller + .scalingFactor.value, + ), ), - color: themeController - .isLightMode.value - ? kLightPrimaryTextColor - .withOpacity(0.75) - : kprimaryTextColor - .withOpacity(0.75), - iconSize: 27 * - controller.scalingFactor.value, ), + Obx( + () => Visibility( + visible: + controller.scalingFactor < 0.9 + ? false + : true, + child: IconButton( + onPressed: () { + Utils.hapticFeedback(); + Scaffold.of(context) + .openEndDrawer(); + }, + icon: const Icon( + Icons.menu, + ), + color: themeController + .isLightMode.value + ? kLightPrimaryTextColor + .withOpacity(0.75) + : kprimaryTextColor + .withOpacity(0.75), + iconSize: 27 * + controller + .scalingFactor.value, + ), - // PopupMenuButton( - // // onPressed: () { - // // Utils.hapticFeedback(); - // // Get.toNamed('/settings'); - // // }, + // PopupMenuButton( + // // onPressed: () { + // // Utils.hapticFeedback(); + // // Get.toNamed('/settings'); + // // }, - // icon: const Icon(Icons.more_vert), - // color: themeController - // .isLightMode.value - // ? kLightSecondaryBackgroundColor - // : ksecondaryBackgroundColor, - // iconSize: 27 * - // controller.scalingFactor.value, - // itemBuilder: (context) { - // return [ - // PopupMenuItem( - // onTap: () { - // Utils.hapticFeedback(); - // Get.toNamed('/settings'); - // }, - // child: Text( - // 'Settings', - // style: Theme.of(context) - // .textTheme - // .bodyMedium! - // .copyWith( - // color: themeController - // .isLightMode - // .value - // ? kLightPrimaryTextColor - // : kprimaryTextColor), - // ), - // ), - // PopupMenuItem( - // value: 'option1', - // child: Text( - // 'About', - // style: Theme.of(context) - // .textTheme - // .bodyMedium! - // .copyWith( - // color: themeController - // .isLightMode - // .value - // ? kLightPrimaryTextColor - // : kprimaryTextColor), - // ), - // ), - // ]; - // }, - // ), - ), + // icon: const Icon(Icons.more_vert), + // color: themeController + // .isLightMode.value + // ? kLightSecondaryBackgroundColor + // : ksecondaryBackgroundColor, + // iconSize: 27 * + // controller.scalingFactor.value, + // itemBuilder: (context) { + // return [ + // PopupMenuItem( + // onTap: () { + // Utils.hapticFeedback(); + // Get.toNamed('/settings'); + // }, + // child: Text( + // 'Settings', + // style: Theme.of(context) + // .textTheme + // .bodyMedium! + // .copyWith( + // color: themeController + // .isLightMode + // .value + // ? kLightPrimaryTextColor + // : kprimaryTextColor), + // ), + // ), + // PopupMenuItem( + // value: 'option1', + // child: Text( + // 'About', + // style: Theme.of(context) + // .textTheme + // .bodyMedium! + // .copyWith( + // color: themeController + // .isLightMode + // .value + // ? kLightPrimaryTextColor + // : kprimaryTextColor), + // ), + // ), + // ]; + // }, + // ), + ), + ), + ], ), ], ), @@ -676,7 +472,13 @@ class HomeView extends GetView { child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, children: [ + Padding( + padding: + EdgeInsets.only(bottom: controller.scalingFactor * 20), + child: ProfileSelect(), + ), Expanded( child: GlowingOverscrollIndicator( color: themeController.isLightMode.value @@ -759,596 +561,585 @@ class HomeView extends GetView { final repeatDays = Utils.getRepeatDays(alarm.days); // Main card - return Dismissible( - onDismissed: (direction) async { - // pop up confirmation to delete on swipe - bool userConfirmed = - await showDeleteAlarmConfirmationPopupOnSwipe( - context, - ); - if (userConfirmed) { - if (alarm.isSharedAlarmEnabled == - true) { - await FirestoreDb.deleteAlarm( - controller.userModel.value, - alarm.firestoreId!, - ); - } else { - await IsarDb.deleteAlarm( - alarm.isarId, - ); - } - } else { - // do not delete on dismiss - Get.offNamedUntil( - '/bottom-navigation-bar', - (route) => - route.settings.name == - '/splash-screen', - ); - } - }, - key: ValueKey(alarms[index]), - background: Container( - color: Colors - .red, // Set the background color to red - padding: EdgeInsets.symmetric( - horizontal: 20, - ), - alignment: Alignment.center, - child: Icon( - Icons.delete, - color: Colors.white, - ), - ), - child: Obx( - () => GestureDetector( - onTap: () { - Utils.hapticFeedback(); - - // If multiple select mode is not on, then only you can update the alarm - if (!controller - .inMultipleSelectMode - .value) { - Get.toNamed( - '/add-update-alarm', - arguments: alarm, + return alarm.profile == + controller.selectedProfile.value + ? Dismissible( + onDismissed: (direction) async { + // pop up confirmation to delete on swipe + bool userConfirmed = + await showDeleteAlarmConfirmationPopupOnSwipe( + context, ); - } - }, - onLongPress: () { - // Entering the multiple select mode - controller.inMultipleSelectMode - .value = true; - controller.isAnyAlarmHolded - .value = true; - - // Assigning the alarm list pairs to list of alarms and list of isSelected all equal to false initially - controller.alarmListPairs = - Pair( - alarms, - List.generate( - alarms.length, - (index) => false.obs, + if (userConfirmed) { + if (alarm + .isSharedAlarmEnabled == + true) { + await FirestoreDb + .deleteAlarm( + controller + .userModel.value, + alarm.firestoreId!, + ); + } else { + await IsarDb.deleteAlarm( + alarm.isarId, + ); + } + } else { + // do not delete on dismiss + Get.offNamedUntil( + '/bottom-navigation-bar', + (route) => + route.settings.name == + '/splash-screen', + ); + } + }, + key: ValueKey(alarms[index]), + background: Container( + color: Colors.red, + // Set the background color to red + padding: EdgeInsets.symmetric( + horizontal: 20, + ), + alignment: Alignment.center, + child: Icon( + Icons.delete, + color: Colors.white, ), - ); - - Utils.hapticFeedback(); - }, - onLongPressEnd: (details) { - controller.isAnyAlarmHolded - .value = false; - }, - child: AnimatedContainer( - duration: const Duration( - milliseconds: 600, - ), - curve: Curves.easeInOut, - margin: EdgeInsets.all( - controller.isAnyAlarmHolded - .value - ? 10 - : 0, ), - child: Center( - child: Padding( - padding: const EdgeInsets - .symmetric( - horizontal: 10.0, - ), - child: Card( - color: themeController - .isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - shape: - RoundedRectangleBorder( - borderRadius: - BorderRadius - .circular( - 18, + child: Obx( + () => GestureDetector( + onTap: () { + Utils.hapticFeedback(); + + // If multiple select mode is not on, then only you can update the alarm + if (!controller + .inMultipleSelectMode + .value) { + controller.isProfile + .value = false; + Get.toNamed( + '/add-update-alarm', + arguments: alarm, + ); + } + }, + onLongPress: () { + // Entering the multiple select mode + controller + .inMultipleSelectMode + .value = true; + controller + .isAnyAlarmHolded + .value = true; + + // Assigning the alarm list pairs to list of alarms and list of isSelected all equal to false initially + controller + .alarmListPairs = + Pair( + alarms, + List.generate( + alarms.length, + (index) => false.obs, ), + ); + + Utils.hapticFeedback(); + }, + onLongPressEnd: (details) { + controller + .isAnyAlarmHolded + .value = false; + }, + child: AnimatedContainer( + duration: const Duration( + milliseconds: 600, + ), + curve: Curves.easeInOut, + margin: EdgeInsets.all( + controller + .isAnyAlarmHolded + .value + ? 10 + : 0, ), child: Center( child: Padding( padding: - EdgeInsets.only( - left: 25.0, - right: controller - .inMultipleSelectMode - .value - ? 10.0 - : 0.0, - top: controller - .inMultipleSelectMode - .value - ? Utils.isChallengeEnabled( - alarm, - ) || - Utils.isAutoDismissalEnabled( - alarm, - ) - ? 15.0 - : 18.0 - : Utils.isChallengeEnabled( - alarm, - ) || - Utils.isAutoDismissalEnabled( - alarm, - ) - ? 8.0 - : 0.0, - bottom: controller - .inMultipleSelectMode - .value - ? Utils.isChallengeEnabled( - alarm, - ) || - Utils.isAutoDismissalEnabled( - alarm, - ) - ? 15.0 - : 18.0 - : Utils.isChallengeEnabled( - alarm, - ) || - Utils.isAutoDismissalEnabled( - alarm, - ) - ? 8.0 - : 0.0, + const EdgeInsets + .symmetric( + horizontal: 10.0, ), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Expanded( - flex: 3, - child: Column( + child: Card( + color: themeController + .isLightMode + .value + ? kLightSecondaryBackgroundColor + : ksecondaryBackgroundColor, + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius + .circular( + 18, + ), + ), + child: Center( + child: Padding( + padding: + EdgeInsets + .only( + left: 25.0, + right: controller + .inMultipleSelectMode + .value + ? 10.0 + : 0.0, + top: controller + .inMultipleSelectMode + .value + ? Utils.isChallengeEnabled( + alarm, + ) || + Utils.isAutoDismissalEnabled( + alarm, + ) + ? 15.0 + : 18.0 + : Utils.isChallengeEnabled( + alarm, + ) || + Utils.isAutoDismissalEnabled( + alarm, + ) + ? 8.0 + : 0.0, + bottom: controller + .inMultipleSelectMode + .value + ? Utils.isChallengeEnabled( + alarm, + ) || + Utils.isAutoDismissalEnabled( + alarm, + ) + ? 15.0 + : 18.0 + : Utils.isChallengeEnabled( + alarm, + ) || + Utils.isAutoDismissalEnabled( + alarm, + ) + ? 8.0 + : 0.0, + ), + child: Row( mainAxisAlignment: MainAxisAlignment - .center, - crossAxisAlignment: - CrossAxisAlignment .start, children: [ - IntrinsicHeight( + Expanded( + flex: 3, child: - Row( + Column( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text( - repeatDays.replaceAll( - 'Never'.tr, - 'One Time'.tr, - ), - style: Theme.of(context).textTheme.bodySmall!.copyWith( - fontWeight: FontWeight.w500, - color: alarm.isEnabled == true - ? kprimaryColor - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + IntrinsicHeight( + child: + Row( + children: [ + Text( + repeatDays.replaceAll( + 'Never'.tr, + 'One Time'.tr, + ), + style: Theme.of(context).textTheme.bodySmall!.copyWith( + fontWeight: FontWeight.w500, + color: alarm.isEnabled == true + ? kprimaryColor + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), ), - ), - if (alarm - .label - .isNotEmpty) - VerticalDivider( - color: alarm.isEnabled == true - ? kprimaryColor - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - thickness: 1.4, - width: 6, - indent: 3.1, - endIndent: 3.1, + if (alarm.label.isNotEmpty) + VerticalDivider( + color: alarm.isEnabled == true + ? kprimaryColor + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + thickness: 1.4, + width: 6, + indent: 3.1, + endIndent: 3.1, + ), + Expanded( + child: Container( + child: Text( + alarm.label, + overflow: TextOverflow.ellipsis, + // Set overflow property here + style: Theme.of(context).textTheme.bodySmall!.copyWith( + fontWeight: FontWeight.w500, + color: alarm.isEnabled == true + ? kprimaryColor + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + ), + ), + ], ), - Expanded( - child: - Container( - child: Text( - alarm.label, - overflow: TextOverflow.ellipsis, - // Set overflow property here - style: Theme.of(context).textTheme.bodySmall!.copyWith( - fontWeight: FontWeight.w500, + ), + Row( + children: [ + Text( + (settingsController.is24HrsEnabled.value + ? Utils.split24HourFormat(alarm.alarmTime) + : Utils.convertTo12HourFormat( + alarm.alarmTime, + ))[0], + style: Theme.of( + context, + ).textTheme.displayLarge!.copyWith( color: alarm.isEnabled == true - ? kprimaryColor + ? themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor : themeController.isLightMode.value ? kLightPrimaryDisabledTextColor : kprimaryDisabledTextColor, ), ), - ), - ), - ], - ), - ), - Row( - children: [ - Text( - (settingsController.is24HrsEnabled.value - ? Utils.split24HourFormat(alarm.alarmTime) - : Utils.convertTo12HourFormat( - alarm.alarmTime, - ))[0], - style: Theme.of( - context, - ).textTheme.displayLarge!.copyWith( - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - Padding( - padding: - const EdgeInsets.symmetric( - horizontal: - 3.0, - ), - child: - Text( - (settingsController.is24HrsEnabled.value - ? Utils.split24HourFormat(alarm.alarmTime) - : Utils.convertTo12HourFormat( - alarm.alarmTime, - ))[1], - style: Theme.of(context).textTheme.displayMedium!.copyWith( - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Text( + (settingsController.is24HrsEnabled.value + ? Utils.split24HourFormat(alarm.alarmTime) + : Utils.convertTo12HourFormat( + alarm.alarmTime, + ))[1], + style: Theme.of(context).textTheme.displayMedium!.copyWith( + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), ), - ), - ), - ], - ), - if (Utils - .isChallengeEnabled( - alarm, - ) || - Utils - .isAutoDismissalEnabled( - alarm, - ) || - alarm - .isSharedAlarmEnabled) - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - if (alarm - .isSharedAlarmEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.share_arrival_time, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isLocationEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.location_pin, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isActivityEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.screen_lock_portrait, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isWeatherEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.cloudy_snowing, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isQrEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.qr_code_scanner, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isShakeEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.vibration, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isMathsEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.calculate, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - ), - if (alarm - .isPedometerEnabled) - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 3.0, - ), - child: Icon( - Icons.directions_walk, - size: 24, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.5) - : kprimaryTextColor.withOpacity(0.5) - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, ), + ], + ), + if (Utils.isChallengeEnabled( + alarm, + ) || + Utils.isAutoDismissalEnabled( + alarm, + ) || + alarm.isSharedAlarmEnabled) + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + if (alarm.isSharedAlarmEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.share_arrival_time, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isLocationEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.location_pin, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isActivityEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.screen_lock_portrait, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isWeatherEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.cloudy_snowing, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isQrEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.qr_code_scanner, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isShakeEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.vibration, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isMathsEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.calculate, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + if (alarm.isPedometerEnabled) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 3.0, + ), + child: Icon( + Icons.directions_walk, + size: 24, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity(0.5) + : kprimaryTextColor.withOpacity(0.5) + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, + ), + ), + ], ), ], ), - ], - ), - ), - Padding( - padding: - const EdgeInsets - .symmetric( - horizontal: - 10.0, - ), - child: controller - .inMultipleSelectMode - .value - ? Column( - // Showing the toggle button - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Expanded( - flex: - 0, - child: - ToggleButton( - controller: controller, - alarmIndex: index, - ), - ), - ], - ) - : Column( - // Showing the switch and pop up menu button - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Expanded( - flex: - 0, - child: - Switch.adaptive( - activeColor: ksecondaryColor, - value: alarm.isEnabled, - onChanged: (bool value) async { - Utils.hapticFeedback(); - alarm.isEnabled = value; - if (alarm.isSharedAlarmEnabled == true) { - await FirestoreDb.updateAlarm(alarm.ownerId, alarm); - } else { - await IsarDb.updateAlarm(alarm); - } - controller.refreshTimer = true; - controller.refreshUpcomingAlarms(); - }, - ), - ), - Expanded( - flex: - 0, - child: - PopupMenuButton( - onSelected: (value) async { - Utils.hapticFeedback(); - if (value == 0) { - Get.back(); - Get.offNamed('/alarm-ring', arguments: alarm); - } else if (value == 1) { - debugPrint(alarm.isSharedAlarmEnabled.toString()); - - if (alarm.isSharedAlarmEnabled == true) { - await FirestoreDb.deleteAlarm(controller.userModel.value, alarm.firestoreId!); - } else { - await IsarDb.deleteAlarm(alarm.isarId); - } - - if (Get.isSnackbarOpen) { - Get.closeAllSnackbars(); - } + ), + Padding( + padding: + const EdgeInsets + .symmetric( + horizontal: + 10.0, + ), + child: controller + .inMultipleSelectMode + .value + ? Column( + // Showing the toggle button + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + flex: 0, + child: ToggleButton( + controller: controller, + alarmIndex: index, + ), + ), + ], + ) + : Column( + // Showing the switch and pop up menu button + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + flex: 0, + child: Switch.adaptive( + activeColor: ksecondaryColor, + value: alarm.isEnabled, + onChanged: (bool value) async { + Utils.hapticFeedback(); + alarm.isEnabled = value; + if (alarm.isSharedAlarmEnabled == true) { + await FirestoreDb.updateAlarm(alarm.ownerId, alarm); + } else { + await IsarDb.updateAlarm(alarm); + } + controller.refreshTimer = true; + controller.refreshUpcomingAlarms(); + }, + ), + ), + Expanded( + flex: 0, + child: PopupMenuButton( + onSelected: (value) async { + Utils.hapticFeedback(); + if (value == 0) { + Get.back(); + Get.offNamed('/alarm-ring', arguments: alarm); + } else if (value == 1) { + debugPrint(alarm.isSharedAlarmEnabled.toString()); - Get.snackbar( - 'Alarm deleted', - 'The alarm has been deleted.', - duration: const Duration(seconds: 4), - snackPosition: SnackPosition.BOTTOM, - margin: const EdgeInsets.symmetric( - horizontal: 10, - vertical: 15, - ), - mainButton: TextButton( - onPressed: () async { if (alarm.isSharedAlarmEnabled == true) { - await FirestoreDb.addAlarm(controller.userModel.value, alarm); + await FirestoreDb.deleteAlarm(controller.userModel.value, alarm.firestoreId!); } else { - await IsarDb.addAlarm(alarm); + await IsarDb.deleteAlarm(alarm.isarId); } - }, - child: const Text('Undo'), - ), - ); - String ringtoneName = alarm.ringtoneName; + if (Get.isSnackbarOpen) { + Get.closeAllSnackbars(); + } - await AudioUtils.updateRingtoneCounterOfUsage( - customRingtoneName: ringtoneName, - counterUpdate: CounterUpdate.decrement, - ); + Get.snackbar( + 'Alarm deleted', + 'The alarm has been deleted.', + duration: const Duration(seconds: 4), + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 15, + ), + mainButton: TextButton( + onPressed: () async { + if (alarm.isSharedAlarmEnabled == true) { + await FirestoreDb.addAlarm(controller.userModel.value, alarm); + } else { + await IsarDb.addAlarm(alarm); + } + }, + child: const Text('Undo'), + ), + ); - controller.refreshTimer = true; - controller.refreshUpcomingAlarms(); - } - }, - color: themeController.isLightMode.value ? kLightPrimaryBackgroundColor : kprimaryBackgroundColor, - icon: Icon( - Icons.more_vert, - color: alarm.isEnabled == true - ? themeController.isLightMode.value - ? kLightPrimaryTextColor - : kprimaryTextColor - : themeController.isLightMode.value - ? kLightPrimaryDisabledTextColor - : kprimaryDisabledTextColor, - ), - itemBuilder: (context) { - return [ - PopupMenuItem( - value: 0, - child: Text( - 'Preview Alarm'.tr, - style: Theme.of(context).textTheme.bodyMedium, + String ringtoneName = alarm.ringtoneName; + + await AudioUtils.updateRingtoneCounterOfUsage( + customRingtoneName: ringtoneName, + counterUpdate: CounterUpdate.decrement, + ); + + controller.refreshTimer = true; + controller.refreshUpcomingAlarms(); + } + }, + color: themeController.isLightMode.value ? kLightPrimaryBackgroundColor : kprimaryBackgroundColor, + icon: Icon( + Icons.more_vert, + color: alarm.isEnabled == true + ? themeController.isLightMode.value + ? kLightPrimaryTextColor + : kprimaryTextColor + : themeController.isLightMode.value + ? kLightPrimaryDisabledTextColor + : kprimaryDisabledTextColor, ), - ), - if (alarm.isSharedAlarmEnabled == false || (alarm.isSharedAlarmEnabled == true && alarm.ownerId == controller.userModel.value!.id)) - PopupMenuItem( - value: 1, - child: Text( - 'Delete Alarm'.tr, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: Colors.red, + itemBuilder: (context) { + return [ + PopupMenuItem( + value: 0, + child: Text( + 'Preview Alarm'.tr, + style: Theme.of(context).textTheme.bodyMedium, + ), + ), + if (alarm.isSharedAlarmEnabled == false || (alarm.isSharedAlarmEnabled == true && alarm.ownerId == controller.userModel.value!.id)) + PopupMenuItem( + value: 1, + child: Text( + 'Delete Alarm'.tr, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Colors.red, + ), ), - ), - ), - ]; - }, + ), + ]; + }, + ), + ), + ], ), - ), - ], - ), + ), + ], + ), ), - ], + ), ), ), ), ), ), ), - ), - ), - ), - ); + ) + : SizedBox(); }, ); } @@ -1411,13 +1202,13 @@ class HomeView extends GetView { style: ButtonStyle( backgroundColor: MaterialStateProperty.all( kprimaryTextColor.withOpacity(0.5), - )), - child: Text( - 'Cancel'.tr, - style: Theme.of(context).textTheme.displaySmall!, ), ), - + child: Text( + 'Cancel'.tr, + style: Theme.of(context).textTheme.displaySmall!, + ), + ), TextButton( onPressed: () { Get.back(result: true); // User confirmed @@ -1444,10 +1235,7 @@ class HomeView extends GetView { } void refresh(BuildContext context) async { - await Get.offNamedUntil( - '/bottom-navigation-bar', - (route) => route.settings.name == '/splash-screen', - ); + controller.refresh(); await Future.delayed(const Duration(seconds: 3)); } } diff --git a/lib/app/modules/home/views/notification_icon.dart b/lib/app/modules/home/views/notification_icon.dart new file mode 100644 index 00000000..feb82ce0 --- /dev/null +++ b/lib/app/modules/home/views/notification_icon.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/controllers/home_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/constants.dart'; + +import '../../../routes/app_pages.dart'; + +Widget notificationIcon(HomeController controller) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Obx( + () => controller.isUserSignedIn.value + ? StreamBuilder( + stream: FirestoreDb.getNotifications(), + builder: (context, snapshot) { + if (snapshot.hasData) { + final List notif = snapshot.data!['receivedItems']; + controller.notifications = notif; + return notif.isEmpty + ? InkWell( + onTap: () { + Get.snackbar('Notifications', 'No Notifications'); + }, + child: const Icon(Icons.notifications), + ) + : InkWell( + onTap: () { + Get.toNamed( + Routes.NOTIFICATIONS, + ); + }, + child: Stack( + children: [ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: Icon( + Icons.notifications, + ), + ), + Positioned( + left: 28, + top: -3, + child: Text( + '${notif.length}', + style: const TextStyle( + color: kprimaryColor, + fontWeight: FontWeight.w700, + ), + ), + ), + ], + ), + ); + } + return const Icon( + Icons.notifications_none, + color: kprimaryDisabledTextColor, + ); + }, + ) + : const Icon( + Icons.notifications_none, + color: kprimaryDisabledTextColor, + ), + ), + ); +} diff --git a/lib/app/modules/home/views/profile_config.dart b/lib/app/modules/home/views/profile_config.dart new file mode 100644 index 00000000..96cebe5a --- /dev/null +++ b/lib/app/modules/home/views/profile_config.dart @@ -0,0 +1,194 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart'; +import 'package:ultimate_alarm_clock/app/data/models/profile_model.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/controllers/home_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; + +import '../../../utils/constants.dart'; +import 'package:android_intent_plus/android_intent.dart'; + +import '../../../utils/utils.dart'; + +class ProfileSelect extends StatefulWidget { + const ProfileSelect({super.key}); + + @override + State createState() => _ProfileSelectState(); +} + +class _ProfileSelectState extends State { + HomeController controller = Get.find(); + ThemeController themeController = Get.find(); + + @override + Widget build(BuildContext context) { + return Obx(() => AnimatedSwitcher( + duration: Duration(milliseconds: 250), + transitionBuilder: (child, animation) { + return SizeTransition( + sizeFactor: animation, axis: Axis.horizontal, child: child); + }, + child: !controller.expandProfile.value + ? InkWell( + onTap: () async { + controller.isProfile.value = true; + Get.toNamed('/add-update-alarm', + arguments: controller.genFakeAlarmModel()); + }, + child: Container( + key: ValueKey(1), + child: Row( + children: [ + Padding( + padding: EdgeInsets.only( + left: 18 * controller.scalingFactor.value, + ), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 24 * controller.scalingFactor.value, + vertical: 4 * controller.scalingFactor.value, + ), + decoration: BoxDecoration( + gradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.topCenter, + stops: [0.2, 0.2], + colors: [ + kprimaryColor, + ksecondaryBackgroundColor, + ], + ), + borderRadius: BorderRadius.circular(18)), + child: Obx(() => Text( + "${controller.selectedProfile}", + style: Theme.of(context) + .textTheme + .displaySmall! + .copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity( + 0.75, + ) + : kprimaryTextColor.withOpacity( + 0.75, + ), + fontSize: + 22 * controller.scalingFactor.value, + ), + )), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: InkWell( + borderRadius: BorderRadius.circular(28), + onTap: () { + controller.expandProfile.value = + !controller.expandProfile.value; + }, + child: Container( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.arrow_forward_ios), + )), + ), + ), + InkWell( + borderRadius: BorderRadius.circular(28), + onTap: () async { + controller.isProfile.value = true; + controller.profileModel.value = + (await IsarDb.getProfile( + controller.selectedProfile.value))!; + Get.toNamed( + '/add-update-alarm', + ); + }, + child: Container( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.add), + )), + ), + ], + ), + ), + ) + : Row( + children: [ + Padding( + padding: EdgeInsets.only( + left: 24 * controller.scalingFactor.value, + ), + child: InkWell( + onTap: () { + controller.expandProfile.value = + !controller.expandProfile.value; + }, + child: Container(child: Icon(Icons.arrow_back_ios)), + ), + ), + Container( + width: Get.width * 0.8, + key: ValueKey(2), + child: StreamBuilder( + stream: IsarDb.getProfiles(), + builder: (context, snapshot) { + if (snapshot.hasData) { + final profiles = snapshot.data; + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: profiles! + .map((e) => profileCapsule(e)) + .toList(), + ), + ); + } + return SizedBox(); + }), + ), + ], + ))); + } + + Widget profileCapsule(ProfileModel profile) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: InkWell( + borderRadius: BorderRadius.circular(18), + onTap: () { + controller.writeProfileName(profile.profileName); + + controller.expandProfile.value = !controller.expandProfile.value; + }, + child: Obx(() => Container( + padding: EdgeInsets.symmetric( + horizontal: 24 * controller.scalingFactor.value, + vertical: 4 * controller.scalingFactor.value, + ), + decoration: BoxDecoration( + color: profile.profileName == controller.selectedProfile.value + ? kprimaryColor.withOpacity(0.5) + : ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(18)), + child: Text( + "${profile.profileName}", + style: Theme.of(context).textTheme.displaySmall!.copyWith( + color: themeController.isLightMode.value + ? kLightPrimaryTextColor.withOpacity( + 0.75, + ) + : kprimaryTextColor.withOpacity( + 0.75, + ), + fontSize: 22 * controller.scalingFactor.value, + ), + ), + )), + ), + ); + } +} diff --git a/lib/app/modules/notifications/bindings/notifications_binding.dart b/lib/app/modules/notifications/bindings/notifications_binding.dart new file mode 100644 index 00000000..33ccb222 --- /dev/null +++ b/lib/app/modules/notifications/bindings/notifications_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/notifications_controller.dart'; + +class NotificationsBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => NotificationsController(), + ); + } +} diff --git a/lib/app/modules/notifications/controllers/notifications_controller.dart b/lib/app/modules/notifications/controllers/notifications_controller.dart new file mode 100644 index 00000000..5d431e7b --- /dev/null +++ b/lib/app/modules/notifications/controllers/notifications_controller.dart @@ -0,0 +1,63 @@ +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; +import 'package:uuid/uuid.dart'; +import 'package:uuid/v4.dart'; + +import '../../../data/models/alarm_model.dart'; +import '../../../data/models/profile_model.dart'; +import '../../../data/providers/firestore_provider.dart'; +import '../../home/controllers/home_controller.dart'; + +class NotificationsController extends GetxController { + //TODO: Implement NotificationsController + + late List notifications = [].obs; + HomeController homeController = Get.find(); + late List allProfiles = [].obs; + final selectedProfile = 'Default'.obs; + + @override + void onInit() async { + super.onInit(); + notifications = homeController.notifications; + selectedProfile.value = homeController.selectedProfile.value; + allProfiles = await getAllProfiles(); + } + + Future getAllProfiles() async { + List allProfiles = await IsarDb.getProfileList(); + return allProfiles; + } + + Future importProfile(String email, String profileName) async { + final profileSet = await FirestoreDb.receiveProfile(email, profileName); + final profile = ProfileModel.fromMap(profileSet['profileData']); + final List alarmList = profileSet['alarmData']; + final isPresent = await IsarDb.profileExists(profileName); + if (isPresent) { + profile.profileName = '${profile.profileName}(dup)'; + await IsarDb.addProfile(profile); + for (final alarm in alarmList) { + final a = AlarmModel.fromMap(alarm); + a.profile = profile.profileName; + a.alarmID = Uuid().v4(); + await IsarDb.addAlarm(a); + } + } else { + await IsarDb.addProfile(profile); + for (final alarm in alarmList) { + final a = AlarmModel.fromMap(alarm); + a.alarmID = Uuid().v4(); + await IsarDb.addAlarm(a); + } + } + } + + Future importAlarm(String email, String alarmName) async { + final alarmMap = await FirestoreDb.receiveAlarm(email, alarmName); + final alarm = await AlarmModel.fromMap(alarmMap); + alarm.alarmID = Uuid().v4(); + alarm.profile = selectedProfile.value; + await IsarDb.addAlarm(alarm); + } +} diff --git a/lib/app/modules/notifications/views/notifications_view.dart b/lib/app/modules/notifications/views/notifications_view.dart new file mode 100644 index 00000000..2f0008a2 --- /dev/null +++ b/lib/app/modules/notifications/views/notifications_view.dart @@ -0,0 +1,293 @@ +import 'package:flutter/material.dart'; + +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; + +import '../../../utils/constants.dart'; +import '../controllers/notifications_controller.dart'; + +class NotificationsView extends GetView { + const NotificationsView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Icon(Icons.notifications), + Text(' Notifications'), + ], + ), + centerTitle: true, + ), + body: StreamBuilder( + stream: FirestoreDb.getNotifications(), + builder: (context, snapshot) { + if (snapshot.hasData) { + final List notif = snapshot.data!['receivedItems']; + controller.notifications = notif; + return controller.notifications.isNotEmpty + ? ListView.builder( + itemCount: controller.notifications.length, + itemBuilder: (context, index) { + return ListTile( + onTap: () { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + backgroundColor: ksecondaryBackgroundColor, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Text( + controller.notifications[index] + ['type'] == + 'profile' + ? 'Add profile ' + : 'Add Alarm ', + style: TextStyle( + fontSize: controller.homeController + .scalingFactor * + 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + controller.notifications[index] + ['type'] == + 'profile' + ? "${controller.notifications[index]['profileName']} ?" + : "${controller.notifications[index]['alarmTime']} ?", + style: TextStyle( + color: kprimaryColor, + fontSize: controller.homeController + .scalingFactor * + 20, + fontWeight: FontWeight.w800, + ), + ), + ], + ), + controller.notifications[index]['type'] == + 'profile' + ? const SizedBox() + : Padding( + padding: EdgeInsets.symmetric( + vertical: controller + .homeController + .scalingFactor * + 20, + ), + child: Text( + "Select profile to add to"), + ), + controller.notifications[index]['type'] == + 'profile' + ? const SizedBox() + : ListView.builder( + shrinkWrap: true, + itemCount: + controller.allProfiles.length, + itemBuilder: (context, index) { + return Obx(() => ListTile( + onTap: () { + controller.selectedProfile + .value = + controller + .allProfiles[index]; + }, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 18)), + tileColor: controller + .selectedProfile + .value == + controller + .allProfiles[ + index] + ? kprimaryColor + : ksecondaryBackgroundColor, + title: Text( + controller + .allProfiles[index], + style: TextStyle( + color: controller + .selectedProfile + .value == + controller + .allProfiles[ + index] + ? kprimaryBackgroundColor + : Colors.white, + fontSize: controller + .homeController + .scalingFactor * + 18, + fontWeight: + FontWeight.w600, + ), + ))); + }), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + await FirestoreDb.removeItem( + controller.notifications[index] + ['owner'], + controller + .notifications[index]); + Get.back(); + }, + child: const Text( + 'Reject', + style: TextStyle(color: Colors.red), + ), + ), + TextButton( + onPressed: () async { + controller.notifications[index] + ['type'] == + 'profile' + ? await controller + .importProfile( + controller.notifications[ + index]['owner'], + controller.notifications[ + index]['profileName'], + ) + : await controller.importAlarm( + controller.notifications[ + index]['owner'], + controller.notifications[ + index]['AlarmName'], + ); + await FirestoreDb.removeItem( + controller.notifications[index] + ['owner'], + controller + .notifications[index]); + Get.back(); + }, + child: const Text('Add'), + ), + ], + ), + ], + ), + ), + ), + ); + }, + title: toAccept(controller.notifications[index]), + ); + }, + ) + : const Text( + "No Notifications to see", + style: TextStyle(color: kprimaryDisabledTextColor), + ); + ; + } + return const Text( + "No Notifications to see", + style: TextStyle(color: kprimaryDisabledTextColor), + ); + }, + ), + ); + } + + Widget toAccept(Map notification) { + return SingleChildScrollView(scrollDirection: Axis.horizontal, + child: Row( + children: [ + Container( + decoration: BoxDecoration( + color: ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(18), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + child: Padding( + padding: + EdgeInsets.all(controller.homeController.scalingFactor * 10), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: notification['type'] == 'profile' + ? Text( + '${notification['profileName']}' + .substring(0, 2) + .toUpperCase(), + style: TextStyle( + color: ksecondaryColor, + fontSize: + controller.homeController.scalingFactor * 20, + fontWeight: FontWeight.w700, + ), + ) + : Icon( + Icons.alarm, + size: controller.homeController.scalingFactor * 20, + color: ksecondaryColor, + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + notification['type'] == 'profile' + ? Text( + '${notification['owner']} sent a profile.', + style: TextStyle( + fontSize: controller.homeController.scalingFactor * 14, + ), + ) + : Text( + '${notification['owner']} sent an alarm.', + style: TextStyle( + fontSize: controller.homeController.scalingFactor * 14, + ), + ), + notification['type'] == 'profile' + ? Text( + notification['profileName'], + style: TextStyle( + color: kprimaryColor, + fontSize: controller.homeController.scalingFactor * 20, + fontWeight: FontWeight.w700, + ), + ) + : Text( + notification['alarmTime'], + style: TextStyle( + color: kprimaryColor, + fontSize: controller.homeController.scalingFactor * 20, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/app/modules/settings/controllers/settings_controller.dart b/lib/app/modules/settings/controllers/settings_controller.dart index 931cbb60..b3855eaa 100644 --- a/lib/app/modules/settings/controllers/settings_controller.dart +++ b/lib/app/modules/settings/controllers/settings_controller.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; +import 'package:googleapis/calendar/v3.dart'; import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; @@ -12,8 +13,11 @@ import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:weather/weather.dart'; import 'package:latlong2/latlong.dart'; import 'package:fl_location/fl_location.dart'; +import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart'; import '../../../data/providers/get_storage_provider.dart'; +import '../../../data/providers/google_cloud_api_provider.dart'; +import '../../../utils/GoogleHttpClient.dart'; class SettingsController extends GetxController { HomeController homeController = Get.find(); @@ -28,7 +32,6 @@ class SettingsController extends GetxController { final _secureStorageProvider = SecureStorageProvider(); final apiKey = TextEditingController(); final currentPoint = LatLng(0, 0).obs; - final GoogleSignIn _googleSignIn = GoogleSignIn(); late GoogleSignInAccount? googleSignInAccount; final RxBool isUserLoggedIn = false.obs; final Rx weatherKeyState = WeatherKeyState.add.obs; @@ -37,8 +40,7 @@ class SettingsController extends GetxController { RxBool isApiKeyEmpty = false.obs; final storage = Get.find(); final RxString local = Get.locale.toString().obs; - UserModel? userModel; - + final Rx userModel = Rx(null); final Map optionslocales = { 'en_US': { 'languageCode': 'en', @@ -70,67 +72,20 @@ class SettingsController extends GetxController { @override void onInit() async { super.onInit(); - userModel = homeController.userModel.value; - isUserLoggedIn.value = await _googleSignIn.isSignedIn(); + userModel.value = homeController.userModel.value; + isUserLoggedIn.value = await GoogleCloudProvider.isUserLoggedin(); if (isUserLoggedIn.value) { - userModel = await _secureStorageProvider.retrieveUserModel(); + userModel.value = await _secureStorageProvider.retrieveUserModel(); } _loadPreference(); } // Logins user using GoogleSignIn - loginWithGoogle() async { - try { - googleSignInAccount = await _googleSignIn.signIn(); - - if (googleSignInAccount != null) { - // Process successful sign-in - String fullName = googleSignInAccount!.displayName.toString(); - List parts = fullName.split(' '); - String lastName = ' '; - if (parts.length == 3) { - if (parts[parts.length - 1].length == 1) { - lastName = parts[1].toLowerCase().capitalizeFirst.toString(); - } else { - lastName = parts[parts.length - 1] - .toLowerCase() - .capitalizeFirst - .toString(); - } - } else { - lastName = - parts[parts.length - 1].toLowerCase().capitalizeFirst.toString(); - } - String firstName = parts[0].toLowerCase().capitalizeFirst.toString(); - - userModel = UserModel( - id: googleSignInAccount!.id, - fullName: fullName, - firstName: firstName, - lastName: lastName, - email: googleSignInAccount!.email, - ); - await FirestoreDb.addUser(userModel!); - await SecureStorageProvider().storeUserModel(userModel!); - isUserLoggedIn.value = true; - homeController.isUserSignedIn.value = true; - homeController.userModel.value = userModel; - await homeController.initStream(userModel); - return true; - } else { - return null; - } - } catch (e) { - // Handle any other exceptions that may occur - debugPrint(e.toString()); - return null; - } - } Future logoutGoogle() async { - await _googleSignIn.signOut(); + await GoogleCloudProvider.logoutGoogle(); await SecureStorageProvider().deleteUserModel(); - userModel = null; + userModel.value = null; isUserLoggedIn.value = false; homeController.isUserSignedIn.value = false; homeController.userModel.value = null; diff --git a/lib/app/modules/settings/views/google_sign_in.dart b/lib/app/modules/settings/views/google_sign_in.dart index 48a1209a..4e39425b 100644 --- a/lib/app/modules/settings/views/google_sign_in.dart +++ b/lib/app/modules/settings/views/google_sign_in.dart @@ -5,6 +5,8 @@ import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_cont import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; +import '../../../data/providers/google_cloud_api_provider.dart'; + class GoogleSignIn extends StatelessWidget { const GoogleSignIn({ super.key, @@ -29,7 +31,7 @@ class GoogleSignIn extends StatelessWidget { onTap: () async { Utils.hapticFeedback(); if (controller.isUserLoggedIn.value == false) { - bool? isSuccessfulLogin = await controller.loginWithGoogle(); + var isSuccessfulLogin = await GoogleCloudProvider.getInstance(); if (isSuccessfulLogin != null) { Get.defaultDialog( @@ -149,28 +151,26 @@ class GoogleSignIn extends StatelessWidget { ), child: Padding( padding: EdgeInsets.only(left: 30, right: 30), - child: Row( + child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Obx( - () => Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (controller.isUserLoggedIn.value) - ? - // 'Unlink ${controller.userModel!.email}' - 'Unlink @usermail'.trParams( - {'usermail': controller.userModel!.email}) - : 'Sign-In with Google'.tr, - style: Theme.of(context).textTheme.bodyLarge!.copyWith( - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - ), - IconButton( + Container(width: Get.width*0.55, + child: SingleChildScrollView(scrollDirection: Axis.horizontal, + child: Row(children: [ Obx( + () => Text( + (controller.isUserLoggedIn.value) + ? + // 'Unlink ${controller.userModel!.email}' + 'Unlink @usermail'.trParams( + {'usermail': controller.userModel.value!.email}) + : 'Sign-In with Google'.tr, + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + overflow: TextOverflow.ellipsis, + ), + ), + ), + ],), + ), + ),IconButton( onPressed: () => { Utils.hapticFeedback(), showBottomSheet( @@ -205,7 +205,7 @@ class GoogleSignIn extends StatelessWidget { Text( 'Shared Alarm'.tr, style: - Theme.of(context).textTheme.displaySmall, + Theme.of(context).textTheme.displaySmall, ), Text( // 'Collaborate with friends, family members,' @@ -220,7 +220,7 @@ class GoogleSignIn extends StatelessWidget { Text( 'Syncing Across Devices'.tr, style: - Theme.of(context).textTheme.displaySmall, + Theme.of(context).textTheme.displaySmall, ), Text( // 'Access your alarms across multiple devices' @@ -235,7 +235,7 @@ class GoogleSignIn extends StatelessWidget { Text( 'Your privacy'.tr, style: - Theme.of(context).textTheme.displaySmall, + Theme.of(context).textTheme.displaySmall, ), Text( // 'We do not access, use or sell any' @@ -274,10 +274,10 @@ class GoogleSignIn extends StatelessWidget { .textTheme .displaySmall! .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, - ), + color: themeController.isLightMode.value + ? kLightPrimaryTextColor + : ksecondaryTextColor, + ), ), ), ), @@ -295,7 +295,6 @@ class GoogleSignIn extends StatelessWidget { : kprimaryTextColor.withOpacity(0.3), ), ), - Spacer(), Obx( () => Icon( (controller.isUserLoggedIn.value) diff --git a/lib/app/modules/settings/views/settings_view.dart b/lib/app/modules/settings/views/settings_view.dart index 2dbc1704..ab99e5bb 100644 --- a/lib/app/modules/settings/views/settings_view.dart +++ b/lib/app/modules/settings/views/settings_view.dart @@ -11,7 +11,6 @@ import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_haptic_fe import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_sorted_alarm_list.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/views/language_menu.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/views/theme_value_tile.dart'; -import 'package:ultimate_alarm_clock/app/modules/settings/views/weather_api.dart'; import 'package:ultimate_alarm_clock/app/routes/app_pages.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; @@ -57,15 +56,7 @@ class SettingsView extends GetView { padding: const EdgeInsets.symmetric(vertical: 25.0), child: Column( children: [ - WeatherApi( - controller: controller, - width: width, - height: height, - themeController: controller.themeController, - ), - const SizedBox( - height: 20, - ), + GoogleSignIn( controller: controller, width: width, diff --git a/lib/app/modules/settings/views/weather_api.dart b/lib/app/modules/settings/views/weather_api.dart deleted file mode 100644 index 43b290a9..00000000 --- a/lib/app/modules/settings/views/weather_api.dart +++ /dev/null @@ -1,541 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart'; -import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; -import 'package:ultimate_alarm_clock/app/utils/constants.dart'; -import 'package:ultimate_alarm_clock/app/utils/utils.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -class WeatherApi extends StatelessWidget { - const WeatherApi({ - super.key, - required this.controller, - required this.height, - required this.width, - required this.themeController, - }); - - final SettingsController controller; - final ThemeController themeController; - final double width; - final double height; - - @override - Widget build(BuildContext context) { - return InkWell( - highlightColor: Colors.transparent, - splashFactory: NoSplash.splashFactory, - splashColor: Colors.transparent, - onTap: () async { - Utils.hapticFeedback(); - Get.defaultDialog( - titlePadding: const EdgeInsets.symmetric(vertical: 20), - backgroundColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - title: 'API Key', - titleStyle: Theme.of(context).textTheme.displaySmall, - onWillPop: () async { - Future.delayed( - const Duration( - milliseconds: 300, - ), - () { - controller.isApiKeyEmpty.value = false; - }, - ); - return true; - }, - content: Obx( - () => Stack( - alignment: Alignment.center, - children: [ - Container( - // If the user hasn't clicked on the 'Save' or 'Update' button - // of the dialog, or there is no error in the weather key, - // then show the dialog - child: (controller.weatherKeyState.value != - WeatherKeyState.saveAdded && - controller.weatherKeyState.value != - WeatherKeyState.saveUpdated) - ? (controller.didWeatherKeyError.value == false) - ? Column( - children: [ - TextField( - obscureText: false, - controller: controller.apiKey, - decoration: InputDecoration( - border: const OutlineInputBorder(), - hintText: 'API Key', - errorText: controller.isApiKeyEmpty.value - ? 'API Key cannot be empty' - : null, - ), - ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all( - kprimaryColor, - ), - ), - child: Text( - // If the weather state is add, then - // show 'Save' else show 'Update' text - // on the button - controller.weatherKeyState.value == - WeatherKeyState.add - ? 'Save' - : 'Update', - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController - .isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () async { - Utils.hapticFeedback(); - controller - .showingCircularProgressIndicator - .value = true; - - // Validation If String is empty - if (controller.apiKey.text - .trim() - .isEmpty) { - // setState(() { - controller.isApiKeyEmpty.value = - true; - // }); - controller - .showingCircularProgressIndicator - .value = false; - return; - } - - // Reset state after getting error message - if (controller.apiKey.text - .trim() - .isNotEmpty) { - // setState(() { - controller.isApiKeyEmpty.value = - false; - // }); - } - - // Get the user's location - await controller.getLocation(); - - // If the API key is valid - if (await controller.isApiKeyValid( - controller.apiKey.text, - )) { - // Add the key to the storage - await controller.addKey( - ApiKeys.openWeatherMap, - controller.apiKey.text, - ); - - // If it is added for the first time - if (controller - .weatherKeyState.value == - WeatherKeyState.add) { - controller.weatherKeyState.value = - WeatherKeyState.saveAdded; - controller - .addWeatherState('saveAdded'); - } else { - // If it is updated - controller.weatherKeyState.value = - WeatherKeyState.saveUpdated; - controller.addWeatherState( - 'saveUpdated', - ); - } - } else { - // If the API key is not valid - controller.didWeatherKeyError - .value = true; - } - controller - .showingCircularProgressIndicator - .value = false; - }, - ), - OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide( - color: kprimaryColor, - width: 1, - ), - ), - child: Text( - 'Get Key', - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: kprimaryColor, - ), - ), - onPressed: () async { - Utils.hapticFeedback(); - const url = - 'https://home.openweathermap.org/api_keys'; - if (await canLaunchUrlString(url)) { - await launchUrlString(url); - } else { - throw 'Could not launch $url'; - } - }, - ), - ], - ), - ), - ], - ) - : Column( - children: [ - const Icon( - Icons.close, - size: 50, - color: Colors.red, - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 15.0, - ), - child: Text( - 'Error adding key!', - style: Theme.of(context) - .textTheme - .displaySmall, - ), - ), - TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - kprimaryColor, - ), - ), - child: Text( - 'Retry', - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: - themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () { - Utils.hapticFeedback(); - controller.didWeatherKeyError.value = false; - }, - ), - ], - ) - : Column( - children: [ - const Icon( - Icons.done, - size: 50, - color: Colors.green, - ), - Padding( - padding: - const EdgeInsets.symmetric(vertical: 15.0), - child: Text( - // If the user clicked on the 'Save' button, then - controller.weatherKeyState.value == - WeatherKeyState.saveAdded - ? 'Your API Key is added!' // show this message - : 'Your API Key is updated!', - // else this message - style: Theme.of(context).textTheme.displaySmall, - ), - ), - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(kprimaryColor), - ), - child: Text( - 'Okay', - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightSecondaryTextColor - : ksecondaryTextColor, - ), - ), - onPressed: () { - Utils.hapticFeedback(); - - // Assign the weather state to update, and save - // it in the local storage - controller.weatherKeyState.value = - WeatherKeyState.update; - controller.addWeatherState('update'); - Get.back(); - }, - ), - ], - ), - ), - if (controller.showingCircularProgressIndicator.value) - Center( - child: CircularProgressIndicator.adaptive( - backgroundColor: kprimaryColor.withOpacity(0.5), - valueColor: const AlwaysStoppedAnimation( - kprimaryColor, - ), - ), - ), - ], - ), - ), - ); - }, - child: Container( - width: width * 0.91, - height: height * 0.1, - decoration: Utils.getCustomTileBoxDecoration( - isLightMode: themeController.isLightMode.value, - ), - child: Padding( - padding: const EdgeInsets.only(left: 30, right: 30), - child: Row( - children: [ - Text( - 'Open Weather Map API', - style: Theme.of(context).textTheme.bodyLarge, - ), - IconButton( - icon: Icon( - Icons.info_sharp, - size: 21, - color: themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.3) - : kprimaryTextColor.withOpacity(0.3), - ), - onPressed: () => { - Utils.hapticFeedback(), - showBottomSheet( - context: context, - backgroundColor: themeController.isLightMode.value - ? kLightSecondaryBackgroundColor - : ksecondaryBackgroundColor, - builder: (context) { - return Padding( - padding: EdgeInsets.symmetric( - horizontal: width * 0.05, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Column( - children: [ - Text( - 'onenweathermap_title1.1'.tr, - style: - Theme.of(context).textTheme.displayMedium, - textAlign: TextAlign.center, - ), - Text( - 'onenweathermap_title1.2'.tr, - style: - Theme.of(context).textTheme.displayMedium, - textAlign: TextAlign.center, - ), - ], - ), - SizedBox( - height: height * 0.6, - child: ListView( - children: [ - RichText( - textAlign: TextAlign.justify, - text: TextSpan( - style: const TextStyle( - fontSize: 16, - ), - children: [ - TextSpan( - text: 'step1.1'.tr, - ), - TextSpan( - text: 'step1.2'.tr, - style: const TextStyle( - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'step1.3'.tr, - ), - TextSpan( - text: 'step1.4'.tr, - style: const TextStyle( - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'step1.5'.tr, - ), - ], - ), - ), - const SizedBox( - height: 15, - ), - RichText( - textAlign: TextAlign.justify, - text: TextSpan( - style: const TextStyle( - fontSize: 16, - ), - children: [ - TextSpan( - text: 'step2.1'.tr, - ), - TextSpan( - text: 'step2.2'.tr, - style: const TextStyle( - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'step2.3'.tr, - ), - ], - ), - ), - const SizedBox( - height: 15, - ), - RichText( - textAlign: TextAlign.justify, - text: TextSpan( - style: const TextStyle( - fontSize: 16, - ), - children: [ - TextSpan( - text: 'step3'.tr, - ), - ], - ), - ), - const SizedBox( - height: 15, - ), - RichText( - textAlign: TextAlign.justify, - text: TextSpan( - style: const TextStyle( - fontSize: 16, - ), - children: [ - TextSpan( - text: 'step4.1'.tr, - ), - TextSpan( - text: 'step4.2'.tr, - style: const TextStyle( - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'step4.3'.tr, - ), - TextSpan( - text: 'step4.4'.tr, - style: const TextStyle( - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'step4.5'.tr, - ), - ], - ), - ), - const SizedBox( - height: 15, - ), - RichText( - textAlign: TextAlign.justify, - text: TextSpan( - style: const TextStyle( - fontSize: 16, - ), - children: [ - TextSpan( - text: 'step5'.tr, - ), - ], - ), - ), - ], - ), - ), - SizedBox( - width: width, - child: TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - kprimaryColor, - ), - ), - onPressed: () { - Utils.hapticFeedback(); - Get.back(); - }, - child: Text( - 'Understood'.tr, - style: Theme.of(context) - .textTheme - .displaySmall! - .copyWith( - color: themeController.isLightMode.value - ? kLightPrimaryTextColor - : ksecondaryTextColor, - ), - ), - ), - ), - ], - ), - ); - }, - ), - }, - ), - const Spacer(), - Icon( - Icons.arrow_forward_ios_sharp, - color: themeController.isLightMode.value - ? kLightPrimaryTextColor.withOpacity(0.4) - : kprimaryTextColor.withOpacity(0.2), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/app/modules/splashScreen/bindings/splash_screen_binding.dart b/lib/app/modules/splashScreen/bindings/splash_screen_binding.dart index b94f9226..a7b1ccb9 100644 --- a/lib/app/modules/splashScreen/bindings/splash_screen_binding.dart +++ b/lib/app/modules/splashScreen/bindings/splash_screen_binding.dart @@ -3,14 +3,22 @@ import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; import 'package:ultimate_alarm_clock/app/modules/splashScreen/controllers/splash_screen_controller.dart'; +import '../../home/controllers/home_controller.dart'; +import '../../timer/controllers/timer_controller.dart'; + class SplashScreenBinding extends Bindings { @override void dependencies() { + Get.put( + ThemeController(), + permanent: true, + ); + Get.put(HomeController(), permanent: true); Get.put( SplashScreenController(), ); - Get.put( - ThemeController(), + Get.put( + TimerController(), permanent: true, ); } diff --git a/lib/app/modules/splashScreen/controllers/splash_screen_controller.dart b/lib/app/modules/splashScreen/controllers/splash_screen_controller.dart index 4b36f560..440b4b63 100644 --- a/lib/app/modules/splashScreen/controllers/splash_screen_controller.dart +++ b/lib/app/modules/splashScreen/controllers/splash_screen_controller.dart @@ -8,19 +8,21 @@ import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; +import '../../home/controllers/home_controller.dart'; + class SplashScreenController extends GetxController { MethodChannel alarmChannel = const MethodChannel('ulticlock'); MethodChannel timerChannel = const MethodChannel('timer'); bool shouldAlarmRing = true; bool shouldNavigate = true; - - final Rx currentlyRingingAlarm = Utils.genFakeAlarmModel().obs; - + HomeController homeController = Get.find(); + late Rx currentlyRingingAlarm = + homeController.genFakeAlarmModel().obs; getCurrentlyRingingAlarm() async { UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); - AlarmModel _alarmRecord = Utils.genFakeAlarmModel(); + AlarmModel _alarmRecord = homeController.genFakeAlarmModel(); AlarmModel isarLatestAlarm = await IsarDb.getLatestAlarm(_alarmRecord, false); AlarmModel firestoreLatestAlarm = @@ -28,13 +30,12 @@ class SplashScreenController extends GetxController { AlarmModel latestAlarm = Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm); debugPrint('CURRENT RINGING : ${latestAlarm.alarmTime}'); - return latestAlarm; } getNextAlarm() async { UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); - AlarmModel _alarmRecord = Utils.genFakeAlarmModel(); + AlarmModel _alarmRecord = homeController.genFakeAlarmModel(); AlarmModel isarLatestAlarm = await IsarDb.getLatestAlarm(_alarmRecord, true); AlarmModel firestoreLatestAlarm = @@ -103,6 +104,7 @@ class SplashScreenController extends GetxController { @override void onInit() async { super.onInit(); + currentlyRingingAlarm.value = homeController.genFakeAlarmModel(); alarmChannel.setMethodCallHandler((call) async { if (call.method == 'appStartup') { bool shouldAlarmRing = call.arguments['shouldAlarmRing']; @@ -152,7 +154,8 @@ class SplashScreenController extends GetxController { // } if (shouldAlarmRing) { - Get.offNamed('/alarm-ring'); + currentlyRingingAlarm.value = await getCurrentlyRingingAlarm(); + Get.offNamed('/alarm-ring',arguments: currentlyRingingAlarm.value); } else { currentlyRingingAlarm.value = await getCurrentlyRingingAlarm(); // If the alarm is set to NEVER repeat, then it will be chosen as diff --git a/lib/app/modules/timer/bindings/timer_binding.dart b/lib/app/modules/timer/bindings/timer_binding.dart index 541d2dd8..42556969 100644 --- a/lib/app/modules/timer/bindings/timer_binding.dart +++ b/lib/app/modules/timer/bindings/timer_binding.dart @@ -10,12 +10,10 @@ import 'package:ultimate_alarm_clock/app/modules/timer/controllers/timer_control class TimerBinding extends Bindings { @override void dependencies() { - Get.lazyPut( - () => TimerController(), + Get.put( + TimerController(), ); - Get.lazyPut(() => HomeController(), fenix: true); - Get.lazyPut(() => SettingsController(), fenix: true); } } diff --git a/lib/app/routes/app_pages.dart b/lib/app/routes/app_pages.dart index fede9d4e..cb092b13 100644 --- a/lib/app/routes/app_pages.dart +++ b/lib/app/routes/app_pages.dart @@ -1,25 +1,27 @@ import 'package:get/get.dart'; -import 'package:ultimate_alarm_clock/app/modules/about/bindings/about_binding.dart'; -import 'package:ultimate_alarm_clock/app/modules/about/views/about_view.dart'; -import 'package:ultimate_alarm_clock/app/modules/bottomNavigationBar/bindings/bottom_navigation_bar_binding.dart'; -import 'package:ultimate_alarm_clock/app/modules/bottomNavigationBar/views/bottom_navigation_bar_view.dart'; -import 'package:ultimate_alarm_clock/app/modules/splashScreen/bindings/splash_screen_binding.dart'; -import 'package:ultimate_alarm_clock/app/modules/splashScreen/views/splash_screen_view.dart'; -import 'package:ultimate_alarm_clock/app/modules/stopwatch/bindings/stopwatch_bindings.dart'; -import 'package:ultimate_alarm_clock/app/modules/stopwatch/views/stopwatch_view.dart'; -import 'package:ultimate_alarm_clock/app/modules/timerRing/bindings/timer_ring_binding.dart'; -import 'package:ultimate_alarm_clock/app/modules/timerRing/views/timer_ring_view.dart'; +import '../modules/about/bindings/about_binding.dart'; +import '../modules/about/views/about_view.dart'; import '../modules/addOrUpdateAlarm/bindings/add_or_update_alarm_binding.dart'; import '../modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart'; import '../modules/alarmChallenge/bindings/alarm_challenge_binding.dart'; import '../modules/alarmChallenge/views/alarm_challenge_view.dart'; import '../modules/alarmRing/bindings/alarm_ring_binding.dart'; import '../modules/alarmRing/views/alarm_ring_view.dart'; +import '../modules/bottomNavigationBar/bindings/bottom_navigation_bar_binding.dart'; +import '../modules/bottomNavigationBar/views/bottom_navigation_bar_view.dart'; import '../modules/home/bindings/home_binding.dart'; import '../modules/home/views/home_view.dart'; +import '../modules/notifications/bindings/notifications_binding.dart'; +import '../modules/notifications/views/notifications_view.dart'; import '../modules/settings/bindings/settings_binding.dart'; import '../modules/settings/views/settings_view.dart'; +import '../modules/splashScreen/bindings/splash_screen_binding.dart'; +import '../modules/splashScreen/views/splash_screen_view.dart'; +import '../modules/stopwatch/bindings/stopwatch_bindings.dart'; +import '../modules/stopwatch/views/stopwatch_view.dart'; +import '../modules/timerRing/bindings/timer_ring_binding.dart'; +import '../modules/timerRing/views/timer_ring_view.dart'; part 'app_routes.dart'; @@ -75,10 +77,16 @@ class AppPages { page: () => TimerRingView(), binding: TimerRingBinding(), ), + GetPage( name: _Paths.STOPWATCH, page: () => StopwatchView(), binding: StopwatchBinding(), ), + GetPage( + name: _Paths.NOTIFICATIONS, + page: () => const NotificationsView(), + binding: NotificationsBinding(), + ), ]; } diff --git a/lib/app/routes/app_routes.dart b/lib/app/routes/app_routes.dart index cd7434f3..b245c308 100644 --- a/lib/app/routes/app_routes.dart +++ b/lib/app/routes/app_routes.dart @@ -13,6 +13,8 @@ abstract class Routes { static const BOTTOM_NAVIGATION_BAR = _Paths.BOTTOM_NAVIGATION_BAR; static const TIMER_RING = _Paths.TIMER_RING; static const STOPWATCH = _Paths.STOPWATCH; + static const ADD_OR_UPDATE_PROFILE = _Paths.ADD_OR_UPDATE_PROFILE; + static const NOTIFICATIONS = _Paths.NOTIFICATIONS; } abstract class _Paths { @@ -27,4 +29,6 @@ abstract class _Paths { static const BOTTOM_NAVIGATION_BAR = '/bottom-navigation-bar'; static const TIMER_RING = '/timer-ring'; static const STOPWATCH = '/stopwatch'; + static const ADD_OR_UPDATE_PROFILE = '/add-or-update-profile'; + static const NOTIFICATIONS = '/notifications'; } diff --git a/lib/app/utils/GoogleHttpClient.dart b/lib/app/utils/GoogleHttpClient.dart new file mode 100644 index 00000000..9a126b0c --- /dev/null +++ b/lib/app/utils/GoogleHttpClient.dart @@ -0,0 +1,16 @@ +import 'package:http/io_client.dart'; +import 'package:http/http.dart'; +class GoogleHttpClient extends IOClient { + Map _headers; + + GoogleHttpClient(this._headers) : super(); + + @override + Future send(BaseRequest request) => + super.send(request..headers.addAll(_headers)); + + @override + Future head(Uri url, {Map? headers}) => + super.head(url, headers: headers?..addAll(_headers)); + +} \ No newline at end of file diff --git a/lib/app/utils/constants.dart b/lib/app/utils/constants.dart index 2ad851ff..587a6a18 100644 --- a/lib/app/utils/constants.dart +++ b/lib/app/utils/constants.dart @@ -36,6 +36,7 @@ const Color kLightPrimaryDisabledTextColor = Color(0xffACACAB); // Dark ThemeData ThemeData kThemeData = ThemeData( + canvasColor: kprimaryBackgroundColor, useMaterial3: false, textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom(foregroundColor: ksecondaryColor), @@ -121,11 +122,27 @@ ThemeData kThemeData = ThemeData( selectedLabelStyle: TextStyle( color: kprimaryColor, shadows: [ - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(1, -1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(-1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(-1, -1), blurRadius: 10.0), - ], + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(1, -1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(-1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(-1, -1), + blurRadius: 10.0, + ), + ], ), unselectedLabelStyle: TextStyle( color: kprimaryTextColor, @@ -133,22 +150,37 @@ ThemeData kThemeData = ThemeData( selectedIconTheme: IconThemeData( color: kprimaryColor, shadows: [ - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(1, -1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(-1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(90, 255, 255, 255), offset: Offset(-1, -1), blurRadius: 10.0), - ], + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(1, -1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(-1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(90, 255, 255, 255), + offset: Offset(-1, -1), + blurRadius: 10.0, + ), + ], ), unselectedIconTheme: IconThemeData( color: kprimaryTextColor, ), ), - ); // Light ThemeData ThemeData kLightThemeData = ThemeData( - useMaterial3: false, + useMaterial3: true, textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom(foregroundColor: kprimaryColor), ), @@ -233,11 +265,27 @@ ThemeData kLightThemeData = ThemeData( selectedLabelStyle: TextStyle( color: kprimaryColor, shadows: [ - Shadow(color: Color.fromARGB(120, 0, 0, 0), offset: Offset(1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(120, 0, 0, 0), offset: Offset(1, -1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(120, 0, 0, 0), offset: Offset(-1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(120, 0, 0, 0), offset: Offset(-1, -1), blurRadius: 10.0), - ], + Shadow( + color: Color.fromARGB(120, 0, 0, 0), + offset: Offset(1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(120, 0, 0, 0), + offset: Offset(1, -1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(120, 0, 0, 0), + offset: Offset(-1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(120, 0, 0, 0), + offset: Offset(-1, -1), + blurRadius: 10.0, + ), + ], ), unselectedLabelStyle: TextStyle( color: kLightPrimaryTextColor, @@ -245,14 +293,272 @@ ThemeData kLightThemeData = ThemeData( selectedIconTheme: IconThemeData( color: kprimaryColor, shadows: [ - Shadow(color: Color.fromARGB(100, 0, 0, 0), offset: Offset(1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(100, 0, 0, 0), offset: Offset(1, -1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(100, 0, 0, 0), offset: Offset(-1, 1), blurRadius: 10.0), - Shadow(color: Color.fromARGB(100, 0, 0, 0), offset: Offset(-1, -1), blurRadius: 10.0), - ], + Shadow( + color: Color.fromARGB(100, 0, 0, 0), + offset: Offset(1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(100, 0, 0, 0), + offset: Offset(1, -1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(100, 0, 0, 0), + offset: Offset(-1, 1), + blurRadius: 10.0, + ), + Shadow( + color: Color.fromARGB(100, 0, 0, 0), + offset: Offset(-1, -1), + blurRadius: 10.0, + ), + ], ), unselectedIconTheme: IconThemeData( color: kLightPrimaryTextColor, ), ), ); + +const Map Holidays = { + 'Christian Holidays': 'en.christian#holiday@group.v.calendar.google.com', + 'Hindu Holidays': 'en.hinduism#holiday@group.v.calendar.google.com', + 'Jewish Holidays': 'en.judaism#holiday@group.v.calendar.google.com', + 'Muslim Holidays': 'en.islamic#holiday@group.v.calendar.google.com', + 'Afghanistan': 'en.af#holiday@group.v.calendar.google.com', + 'Albania': 'en.al#holiday@group.v.calendar.google.com', + 'Algeria': 'en.dz#holiday@group.v.calendar.google.com', + 'American Samoa': 'en.as#holiday@group.v.calendar.google.com', + 'Andorra': 'en.ad#holiday@group.v.calendar.google.com', + 'Angola': 'en.ao#holiday@group.v.calendar.google.com', + 'Anguilla': 'en.ai#holiday@group.v.calendar.google.com', + 'Antigua and Barbuda': 'en.ag#holiday@group.v.calendar.google.com', + 'Argentina': 'en.ar#holiday@group.v.calendar.google.com', + 'Armenia': 'en.am#holiday@group.v.calendar.google.com', + 'Aruba': 'en.aw#holiday@group.v.calendar.google.com', + 'Australia': 'en.australian#holiday@group.v.calendar.google.com', + 'Austria': 'en.austrian#holiday@group.v.calendar.google.com', + 'Azerbaijan': 'en.az#holiday@group.v.calendar.google.com', + 'Bahamas': 'en.bs#holiday@group.v.calendar.google.com', + 'Bahrain': 'en.bh#holiday@group.v.calendar.google.com', + 'Bangladesh': 'en.bd#holiday@group.v.calendar.google.com', + 'Barbados': 'en.bb#holiday@group.v.calendar.google.com', + 'Belarus': 'en.by#holiday@group.v.calendar.google.com', + 'Belgium': 'en.be#holiday@group.v.calendar.google.com', + 'Belize': 'en.bz#holiday@group.v.calendar.google.com', + 'Benin': 'en.bj#holiday@group.v.calendar.google.com', + 'Bermuda': 'en.bm#holiday@group.v.calendar.google.com', + 'Bhutan': 'en.bt#holiday@group.v.calendar.google.com', + 'Bolivia': 'en.bo#holiday@group.v.calendar.google.com', + 'Bosnia and Herzegovina': 'en.ba#holiday@group.v.calendar.google.com', + 'Botswana': 'en.bw#holiday@group.v.calendar.google.com', + 'Brazil': 'en.brazilian#holiday@group.v.calendar.google.com', + 'British Virgin Islands': 'en.vg#holiday@group.v.calendar.google.com', + 'Brunei Darussalam': 'en.bn#holiday@group.v.calendar.google.com', + 'Bulgaria': 'en.bulgarian#holiday@group.v.calendar.google.com', + 'Burkina Faso': 'en.bf#holiday@group.v.calendar.google.com', + 'Burundi': 'en.bi#holiday@group.v.calendar.google.com', + 'Cambodia': 'en.kh#holiday@group.v.calendar.google.com', + 'Cameroon': 'en.cm#holiday@group.v.calendar.google.com', + 'Canada': 'en.canadian#holiday@group.v.calendar.google.com', + 'Cape Verde': 'en.cv#holiday@group.v.calendar.google.com', + 'Cayman Islands': 'en.ky#holiday@group.v.calendar.google.com', + 'Central African Republic': 'en.cf#holiday@group.v.calendar.google.com', + 'Chad': 'en.td#holiday@group.v.calendar.google.com', + 'Chile': 'en.cl#holiday@group.v.calendar.google.com', + 'China': 'en.china#holiday@group.v.calendar.google.com', + 'Colombia': 'en.co#holiday@group.v.calendar.google.com', + 'Comoros': 'en.km#holiday@group.v.calendar.google.com', + 'Congo': 'en.cg#holiday@group.v.calendar.google.com', + 'Cook Islands': 'en.ck#holiday@group.v.calendar.google.com', + 'Costa Rica': 'en.cr#holiday@group.v.calendar.google.com', + "Côte d'Ivoire": 'en.ci#holiday@group.v.calendar.google.com', + 'Croatia': 'en.croatian#holiday@group.v.calendar.google.com', + 'Cuba': 'en.cu#holiday@group.v.calendar.google.com', + 'Curaçao': 'en.cw#holiday@group.v.calendar.google.com', + 'Cyprus': 'en.cy#holiday@group.v.calendar.google.com', + 'Czechia': 'en.czech#holiday@group.v.calendar.google.com', + "Democratic People's Republic of Korea": + 'en.kp#holiday@group.v.calendar.google.com', + 'Denmark': 'en.danish#holiday@group.v.calendar.google.com', + 'Djibouti': 'en.dj#holiday@group.v.calendar.google.com', + 'Dominica': 'en.dm#holiday@group.v.calendar.google.com', + 'Dominican Republic': 'en.do#holiday@group.v.calendar.google.com', + 'Ecuador': 'en.ec#holiday@group.v.calendar.google.com', + 'Egypt': 'en.eg#holiday@group.v.calendar.google.com', + 'El Salvador': 'en.sv#holiday@group.v.calendar.google.com', + 'Equatorial Guinea': 'en.gq#holiday@group.v.calendar.google.com', + 'Eritrea': 'en.er#holiday@group.v.calendar.google.com', + 'Estonia': 'en.ee#holiday@group.v.calendar.google.com', + 'Ethiopia': 'en.et#holiday@group.v.calendar.google.com', + 'Falkland Islands (Malvinas)': 'en.fk#holiday@group.v.calendar.google.com', + 'Faroe Islands': 'en.fo#holiday@group.v.calendar.google.com', + 'Federated States of Micronesia': 'en.fm#holiday@group.v.calendar.google.com', + 'Fiji': 'en.fj#holiday@group.v.calendar.google.com', + 'Finland': 'en.finnish#holiday@group.v.calendar.google.com', + 'France': 'en.french#holiday@group.v.calendar.google.com', + 'French Guiana': 'en.gf#holiday@group.v.calendar.google.com', + 'French Polynesia': 'en.pf#holiday@group.v.calendar.google.com', + 'Gabon': 'en.ga#holiday@group.v.calendar.google.com', + 'Gambia': 'en.gm#holiday@group.v.calendar.google.com', + 'Georgia': 'en.ge#holiday@group.v.calendar.google.com', + 'Germany': 'en.german#holiday@group.v.calendar.google.com', + 'Ghana': 'en.gh#holiday@group.v.calendar.google.com', + 'Gibraltar': 'en.gi#holiday@group.v.calendar.google.com', + 'Greece': 'en.greek#holiday@group.v.calendar.google.com', + 'Greenland': 'en.gl#holiday@group.v.calendar.google.com', + 'Grenada': 'en.gd#holiday@group.v.calendar.google.com', + 'Guam': 'en.gu#holiday@group.v.calendar.google.com', + 'Guatemala': 'en.gt#holiday@group.v.calendar.google.com', + 'Guernsey': 'en.gg#holiday@group.v.calendar.google.com', + 'Guinea': 'en.gn#holiday@group.v.calendar.google.com', + 'Guinea-Bissau': 'en.gw#holiday@group.v.calendar.google.com', + 'Guyana': 'en.gy#holiday@group.v.calendar.google.com', + 'Haiti': 'en.ht#holiday@group.v.calendar.google.com', + 'Holy See (Vatican City State)': 'en.va#holiday@group.v.calendar.google.com', + 'Honduras': 'en.hn#holiday@group.v.calendar.google.com', + 'Hong Kong': 'en.hong_kong#holiday@group.v.calendar.google.com', + 'Hungary': 'en.hungarian#holiday@group.v.calendar.google.com', + 'Iceland': 'en.is#holiday@group.v.calendar.google.com', + 'India': 'en.indian#holiday@group.v.calendar.google.com', + 'Indonesia': 'en.indonesian#holiday@group.v.calendar.google.com', + 'Iraq': 'en.iq#holiday@group.v.calendar.google.com', + 'Ireland': 'en.irish#holiday@group.v.calendar.google.com', + 'Islamic Republic of Iran': 'en.ir#holiday@group.v.calendar.google.com', + 'Isle of Man': 'en.im#holiday@group.v.calendar.google.com', + 'Israel': 'en.jewish#holiday@group.v.calendar.google.com', + 'Italy': 'en.italian#holiday@group.v.calendar.google.com', + 'Jamaica': 'en.jm#holiday@group.v.calendar.google.com', + 'Japan': 'en.japanese#holiday@group.v.calendar.google.com', + 'Jersey': 'en.je#holiday@group.v.calendar.google.com', + 'Jordan': 'en.jo#holiday@group.v.calendar.google.com', + 'Kazakhstan': 'en.kz#holiday@group.v.calendar.google.com', + 'Kenya': 'en.ke#holiday@group.v.calendar.google.com', + 'Kiribati': 'en.ki#holiday@group.v.calendar.google.com', + 'Kuwait': 'en.kw#holiday@group.v.calendar.google.com', + 'Kyrgyzstan': 'en.kg#holiday@group.v.calendar.google.com', + "Lao People's Democratic Republic": + 'en.la#holiday@group.v.calendar.google.com', + 'Latvia': 'en.latvian#holiday@group.v.calendar.google.com', + 'Lebanon': 'en.lb#holiday@group.v.calendar.google.com', + 'Lesotho': 'en.ls#holiday@group.v.calendar.google.com', + 'Liberia': 'en.lr#holiday@group.v.calendar.google.com', + 'Libya': 'en.ly#holiday@group.v.calendar.google.com', + 'Liechtenstein': 'en.li#holiday@group.v.calendar.google.com', + 'Lithuania': 'en.lithuanian#holiday@group.v.calendar.google.com', + 'Luxembourg': 'en.lu#holiday@group.v.calendar.google.com', + 'Macao': 'en.mo#holiday@group.v.calendar.google.com', + 'Madagascar': 'en.mg#holiday@group.v.calendar.google.com', + 'Malawi': 'en.mw#holiday@group.v.calendar.google.com', + 'Malaysia': 'en.malaysia#holiday@group.v.calendar.google.com', + 'Maldives': 'en.mv#holiday@group.v.calendar.google.com', + 'Mali': 'en.ml#holiday@group.v.calendar.google.com', + 'Malta': 'en.mt#holiday@group.v.calendar.google.com', + 'Marshall Islands': 'en.mh#holiday@group.v.calendar.google.com', + 'Martinique': 'en.mq#holiday@group.v.calendar.google.com', + 'Mauritania': 'en.mr#holiday@group.v.calendar.google.com', + 'Mauritius': 'en.mu#holiday@group.v.calendar.google.com', + 'Mayotte': 'en.yt#holiday@group.v.calendar.google.com', + 'Mexico': 'en.mexican#holiday@group.v.calendar.google.com', + 'Moldova': 'en.md#holiday@group.v.calendar.google.com', + 'Monaco': 'en.mc#holiday@group.v.calendar.google.com', + 'Mongolia': 'en.mn#holiday@group.v.calendar.google.com', + 'Montenegro': 'en.me#holiday@group.v.calendar.google.com', + 'Montserrat': 'en.ms#holiday@group.v.calendar.google.com', + 'Morocco': 'en.ma#holiday@group.v.calendar.google.com', + 'Mozambique': 'en.mz#holiday@group.v.calendar.google.com', + 'Myanmar': 'en.mm#holiday@group.v.calendar.google.com', + 'Namibia': 'en.na#holiday@group.v.calendar.google.com', + 'Nauru': 'en.nr#holiday@group.v.calendar.google.com', + 'Nepal': 'en.np#holiday@group.v.calendar.google.com', + 'Netherlands': 'en.dutch#holiday@group.v.calendar.google.com', + 'New Caledonia': 'en.nc#holiday@group.v.calendar.google.com', + 'New Zealand': 'en.new_zealand#holiday@group.v.calendar.google.com', + 'Nicaragua': 'en.ni#holiday@group.v.calendar.google.com', + 'Niger': 'en.ne#holiday@group.v.calendar.google.com', + 'Nigeria': 'en.ng#holiday@group.v.calendar.google.com', + 'Northern Mariana Islands': 'en.mp#holiday@group.v.calendar.google.com', + 'Norway': 'en.norwegian#holiday@group.v.calendar.google.com', + 'Oman': 'en.om#holiday@group.v.calendar.google.com', + 'Pakistan': 'en.pk#holiday@group.v.calendar.google.com', + 'Palau': 'en.pw#holiday@group.v.calendar.google.com', + 'Panama': 'en.pa#holiday@group.v.calendar.google.com', + 'Papua New Guinea': 'en.pg#holiday@group.v.calendar.google.com', + 'Paraguay': 'en.py#holiday@group.v.calendar.google.com', + 'Peru': 'en.pe#holiday@group.v.calendar.google.com', + 'Philippines': 'en.philippines#holiday@group.v.calendar.google.com', + 'Poland': 'en.polish#holiday@group.v.calendar.google.com', + 'Portugal': 'en.portuguese#holiday@group.v.calendar.google.com', + 'Puerto Rico': 'en.pr#holiday@group.v.calendar.google.com', + 'Qatar': 'en.qa#holiday@group.v.calendar.google.com', + 'Republic of Korea': 'en.south_korea#holiday@group.v.calendar.google.com', + 'Réunion': 'en.re#holiday@group.v.calendar.google.com', + 'Romania': 'en.romanian#holiday@group.v.calendar.google.com', + 'Russian Federation': 'en.russian#holiday@group.v.calendar.google.com', + 'Rwanda': 'en.rw#holiday@group.v.calendar.google.com', + 'Saint Barthélemy': 'en.bl#holiday@group.v.calendar.google.com', + 'Saint Helena': 'en.sh#holiday@group.v.calendar.google.com', + 'Saint Kitts and Nevis': 'en.kn#holiday@group.v.calendar.google.com', + 'Saint Lucia': 'en.lc#holiday@group.v.calendar.google.com', + 'Saint Martin (French part)': 'en.mf#holiday@group.v.calendar.google.com', + 'Saint Pierre and Miquelon': 'en.pm#holiday@group.v.calendar.google.com', + 'Saint Vincent and the Grenadines': + 'en.vc#holiday@group.v.calendar.google.com', + 'Samoa': 'en.ws#holiday@group.v.calendar.google.com', + 'San Marino': 'en.sm#holiday@group.v.calendar.google.com', + 'Sao Tome and Principe': 'en.st#holiday@group.v.calendar.google.com', + 'Saudi Arabia': 'en.saudiarabian#holiday@group.v.calendar.google.com', + 'Senegal': 'en.sn#holiday@group.v.calendar.google.com', + 'Serbia': 'en.rs#holiday@group.v.calendar.google.com', + 'Seychelles': 'en.sc#holiday@group.v.calendar.google.com', + 'Sierra Leone': 'en.sl#holiday@group.v.calendar.google.com', + 'Singapore': 'en.singapore#holiday@group.v.calendar.google.com', + 'Sint Maarten (Dutch part)': 'en.sx#holiday@group.v.calendar.google.com', + 'Slovakia': 'en.slovak#holiday@group.v.calendar.google.com', + 'Slovenia': 'en.slovenian#holiday@group.v.calendar.google.com', + 'Solomon Islands': 'en.sb#holiday@group.v.calendar.google.com', + 'Somalia': 'en.so#holiday@group.v.calendar.google.com', + 'South Africa': 'en.sa#holiday@group.v.calendar.google.com', + 'South Sudan': 'en.ss#holiday@group.v.calendar.google.com', + 'Spain': 'en.spain#holiday@group.v.calendar.google.com', + 'Sri Lanka': 'en.lk#holiday@group.v.calendar.google.com', + 'Sudan': 'en.sd#holiday@group.v.calendar.google.com', + 'Suriname': 'en.sr#holiday@group.v.calendar.google.com', + 'Swaziland': 'en.sz#holiday@group.v.calendar.google.com', + 'Sweden': 'en.swedish#holiday@group.v.calendar.google.com', + 'Switzerland': 'en.ch#holiday@group.v.calendar.google.com', + 'Syrian Arab Republic': 'en.sy#holiday@group.v.calendar.google.com', + 'Taiwan': 'en.taiwan#holiday@group.v.calendar.google.com', + 'Tajikistan': 'en.tj#holiday@group.v.calendar.google.com', + 'Thailand': 'en.th#holiday@group.v.calendar.google.com', + 'The Democratic Republic of the Congo': + 'en.cd#holiday@group.v.calendar.google.com', + 'The Former Yugoslav Republic of Macedonia': + 'en.mk#holiday@group.v.calendar.google.com', + 'Timor-Leste': 'en.tl#holiday@group.v.calendar.google.com', + 'Togo': 'en.tg#holiday@group.v.calendar.google.com', + 'Tonga': 'en.to#holiday@group.v.calendar.google.com', + 'Trinidad and Tobago': 'en.tt#holiday@group.v.calendar.google.com', + 'Tunisia': 'en.tn#holiday@group.v.calendar.google.com', + 'Turkey': 'en.turkish#holiday@group.v.calendar.google.com', + 'Turkmenistan': 'en.tm#holiday@group.v.calendar.google.com', + 'Turks and Caicos Islands': 'en.tc#holiday@group.v.calendar.google.com', + 'Tuvalu': 'en.tv#holiday@group.v.calendar.google.com', + 'U.S. Virgin Islands': 'en.vi#holiday@group.v.calendar.google.com', + 'Uganda': 'en.ug#holiday@group.v.calendar.google.com', + 'Ukraine': 'en.ukrainian#holiday@group.v.calendar.google.com', + 'United Arab Emirates': 'en.ae#holiday@group.v.calendar.google.com', + 'United Kingdom': 'en.uk#holiday@group.v.calendar.google.com', + 'United Republic of Tanzania': 'en.tz#holiday@group.v.calendar.google.com', + 'United States': 'en.usa#holiday@group.v.calendar.google.com', + 'Uruguay': 'en.uy#holiday@group.v.calendar.google.com', + 'Uzbekistan': 'en.uz#holiday@group.v.calendar.google.com', + 'Vanuatu': 'en.vu#holiday@group.v.calendar.google.com', + 'Venezuela': 'en.ve#holiday@group.v.calendar.google.com', + 'Vietnam': 'en.vietnamese#holiday@group.v.calendar.google.com', + 'Wallis and Futuna': 'en.wf#holiday@group.v.calendar.google.com', + 'Yemen': 'en.ye#holiday@group.v.calendar.google.com', + 'Zambia': 'en.zm#holiday@group.v.calendar.google.com', + 'Zimbabwe': 'en.zw#holiday@group.v.calendar.google.com', +}; diff --git a/lib/app/utils/end_drawer.dart b/lib/app/utils/end_drawer.dart index 7ddfddc7..b202ca30 100644 --- a/lib/app/utils/end_drawer.dart +++ b/lib/app/utils/end_drawer.dart @@ -61,7 +61,7 @@ Widget buildEndDrawer(BuildContext context) { SizedBox( width: Get.width * 0.5, child: Text( - 'v0.1.0'.tr, + 'v0.2.0'.tr, softWrap: true, style: Theme.of(context) .textTheme diff --git a/lib/app/utils/language.dart b/lib/app/utils/language.dart index bcb2d39e..eb1b4388 100644 --- a/lib/app/utils/language.dart +++ b/lib/app/utils/language.dart @@ -48,7 +48,7 @@ class AppTranslations extends Translations { 'Next alarm': 'Next alarm', 'About': 'About', 'Settings': 'Settings', - 'v0.1.0': 'v0.1.0', + 'v0.2.0': 'v0.2.0', 'Ultimate Alarm Clock': 'Ultimate Alarm Clock', 'Create alarm': 'Create alarm', 'Join alarm': 'Join alarm', diff --git a/lib/app/utils/languages/french_translations.dart b/lib/app/utils/languages/french_translations.dart index 4bd12231..0dbcece2 100644 --- a/lib/app/utils/languages/french_translations.dart +++ b/lib/app/utils/languages/french_translations.dart @@ -47,7 +47,7 @@ class FrenchTranslations extends Translations { //home_view.dart 'About': 'À propos', 'Settings': 'Paramètres', - 'v0.1.0': 'v0.1.0', + 'v0.2.0': 'v0.2.0', 'Ultimate Alarm Clock': 'Réveil Ultime', 'Create alarm': 'Créer un réveil', 'Join alarm': 'Rejoindre un réveil', diff --git a/lib/app/utils/languages/german_translations.dart b/lib/app/utils/languages/german_translations.dart index d27febdf..22eeff23 100644 --- a/lib/app/utils/languages/german_translations.dart +++ b/lib/app/utils/languages/german_translations.dart @@ -40,7 +40,7 @@ class GermanTranslations extends Translations { //home_view.dart 'About': 'Um', 'Settings': 'Einstellungen', - 'v0.1.0': 'v0.1.0', + 'v0.2.0': 'v0.2.0', 'Ultimate Alarm Clock': 'Ultimativer Wecker', 'Create alarm': 'Alarm erstellen', 'Join alarm': 'Alarm beitreten', diff --git a/lib/app/utils/languages/russian_translations.dart b/lib/app/utils/languages/russian_translations.dart index 87b60009..9e076155 100644 --- a/lib/app/utils/languages/russian_translations.dart +++ b/lib/app/utils/languages/russian_translations.dart @@ -46,7 +46,7 @@ class RussianTranslations extends Translations { //home_view.dart 'About': 'О', 'Settings': 'Настройки', - 'v0.1.0': 'v0.1.0', + 'v0.2.0': 'v0.2.0', 'Ultimate Alarm Clock': 'Лучший будильник', 'Create alarm': 'Создать будильник', 'Join alarm': 'Присоединиться к будильнику', diff --git a/lib/app/utils/languages/spanish_translations.dart b/lib/app/utils/languages/spanish_translations.dart index e22fa128..a295a6b7 100644 --- a/lib/app/utils/languages/spanish_translations.dart +++ b/lib/app/utils/languages/spanish_translations.dart @@ -1,3 +1,5 @@ +// ignore_for_file: lines_longer_than_80_chars + import 'package:get/get.dart'; class SpanishTranslations extends Translations { @@ -47,7 +49,7 @@ class SpanishTranslations extends Translations { //home_view.dart 'About': 'Acerca de', 'Settings': 'Configuración', - 'v0.1.0': 'v0.1.0', + 'v0.2.0': 'v0.2.0', 'Ultimate Alarm Clock': 'Reloj Despertador Definitivo', 'Create alarm': 'Crear alarma', 'Join alarm': 'Unirse a alarma', diff --git a/lib/app/utils/share_dialog.dart b/lib/app/utils/share_dialog.dart new file mode 100644 index 00000000..2867eddb --- /dev/null +++ b/lib/app/utils/share_dialog.dart @@ -0,0 +1,335 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/data/models/saved_emails.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; +import 'package:ultimate_alarm_clock/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/home/controllers/home_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/constants.dart'; +import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + +class ShareDialog extends StatelessWidget { + const ShareDialog({ + super.key, + required this.homeController, + required this.controller, + required this.themeController, + }); + final HomeController homeController; + final AddOrUpdateAlarmController controller; + final ThemeController themeController; + @override + Widget build(BuildContext context) { + return Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)), + backgroundColor: ksecondaryBackgroundColor, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: kprimaryBackgroundColor, + borderRadius: BorderRadius.circular(18), + ), + child: Column( + children: [ + toShare(), + Obx( + () => Padding( + padding: const EdgeInsets.all(8.0), + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: controller.selectedEmails.isNotEmpty + ? MaterialStateProperty.all( + ksecondaryColor, + ) + : MaterialStateProperty.all( + kprimaryDisabledTextColor, + ), + ), + onPressed: () async { + if (controller.selectedEmails.isNotEmpty) { + if (homeController.isProfile.value) { + await FirestoreDb.shareProfile( + controller.selectedEmails, + ); + } else { + await FirestoreDb.shareAlarm( + controller.selectedEmails, + controller.alarmRecord.value, + ); + } + } else { + Get.snackbar('Error', 'Select an User'); + } + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.share, + color: controller.selectedEmails.isNotEmpty + ? kprimaryBackgroundColor + : kprimaryColor, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Share', + style: TextStyle( + color: controller.selectedEmails.isNotEmpty + ? kprimaryBackgroundColor + : Colors.white, + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + ListTile( + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)), + title: Row( + children: [ + const Icon( + Icons.person, + color: ksecondaryColor, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Select Users', + style: TextStyle( + fontSize: homeController.scalingFactor * 16, + fontWeight: FontWeight.w600, + ), + ), + ), + IconButton( + splashRadius: homeController.scalingFactor * 16, + color: kprimaryColor, + onPressed: () { + controller.isAddUser.value = !controller.isAddUser.value; + }, + icon: const Icon(Icons.add), + ), + ], + ), + ), + Obx( + () => controller.isAddUser.value + ? Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + keyboardType: TextInputType.emailAddress, + controller: controller.emailTextEditingController, + decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () async { + if (RegExp( + r"^[a-zA-Z0-9.a-zA-Z0-9!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+", + ).hasMatch( + controller.emailTextEditingController.text, + )) { + IsarDb.addEmail( + controller.emailTextEditingController.text, + ); + } else { + Get.snackbar('Error', 'Invalid email'); + } + }, + icon: const Icon( + Icons.add_circle_outlined, + color: kprimaryColor, + ), + ), + prefixIcon: const Icon(Icons.alternate_email), + prefixIconColor: kprimaryDisabledTextColor, + hintText: 'Enter e-mail', + ), + ), + ) + : const SizedBox(), + ), + StreamBuilder( + stream: IsarDb.getEmails(), + builder: (context, snapshot) { + if (snapshot.hasData) { + final userList = snapshot.data; + return SizedBox( + height: Get.height * 0.3, + child: ListView.builder( + itemCount: userList!.length, + itemBuilder: (context, index) { + return emailTile(userList[index]); + }, + ), + ); + } + + return const CircularProgressIndicator(); + }, + ), + ], + ), + ); + } + + Widget emailTile(Saved_Emails email) { + return ListTile( + onTap: () { + if (controller.selectedEmails.contains(email.email)) { + controller.selectedEmails.remove(email.email); + } else { + controller.selectedEmails.add(email.email); + } + }, + tileColor: kprimaryBackgroundColor, + title: Padding( + padding: + EdgeInsets.symmetric(vertical: homeController.scalingFactor * 16), + child: SingleChildScrollView(scrollDirection: Axis.horizontal, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Obx( + () => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + color: controller.selectedEmails.contains(email.email) + ? kprimaryColor + : ksecondaryBackgroundColor, + ), + child: Padding( + padding: EdgeInsets.all(homeController.scalingFactor * 16), + child: controller.selectedEmails.contains(email.email) + ? const Icon(Icons.check) + : Text( + Utils.getInitials(email.username), + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: homeController.scalingFactor * 15, + color: ksecondaryColor, + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox( + width: Get.width * 0.5, + child: Text( + email.username, + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: homeController.scalingFactor * 20, + ), + ), + ), + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox( + width: Get.width * 0.5, + child: Text( + email.email, + style: TextStyle( + fontSize: homeController.scalingFactor * 14, + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Widget toShare() { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + color: ksecondaryBackgroundColor, + borderRadius: BorderRadius.circular(18), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + child: Padding( + padding: EdgeInsets.all(homeController.scalingFactor * 25), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: homeController.isProfile.value + ? Text( + homeController.selectedProfile.value + .substring(0, 2) + .toUpperCase(), + style: TextStyle( + color: ksecondaryColor, + fontSize: homeController.scalingFactor * 30, + fontWeight: FontWeight.w700, + ), + ) + : Icon( + Icons.alarm, + size: homeController.scalingFactor * 45, + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + homeController.isProfile.value + ? const Text('Sharing Profile') + : const Text('Sharing Alarm'), + homeController.isProfile.value + ? Text( + homeController.selectedProfile.value, + style: TextStyle( + color: kprimaryColor, + fontSize: homeController.scalingFactor * 30, + fontWeight: FontWeight.w700, + ), + ) + : Text( + Utils.timeOfDayToString( + TimeOfDay.fromDateTime( + controller.selectedTime.value, + ), + ), + style: TextStyle( + color: kprimaryColor, + fontSize: homeController.scalingFactor * 30, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/app/utils/utils.dart b/lib/app/utils/utils.dart index 00421119..7454f7c1 100644 --- a/lib/app/utils/utils.dart +++ b/lib/app/utils/utils.dart @@ -1,19 +1,23 @@ +import 'package:android_intent_plus/android_intent.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - +import 'package:permission_handler/permission_handler.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:latlong2/latlong.dart'; import 'dart:math'; +import 'package:telephony/telephony.dart'; + import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/quote_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/timer_model.dart'; -import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/utils/quote_list.dart'; +import '../data/models/profile_model.dart'; +import '../data/providers/get_storage_provider.dart'; import 'constants.dart'; class Utils { @@ -23,6 +27,57 @@ class Utils { return '$hours:$minutes'; } + static final storage = Get.find(); + + static AlarmModel alarmModelInit = AlarmModel( + volMax: 1.0, + volMin: 0.0, + snoozeDuration: 0, + gradient: 1, + label: '', + isOneTime: true, + deleteAfterGoesOff: false, + offsetDetails: {}, + lastEditedUserId: '', + mutexLock: false, + ownerName: '', + ownerId: '', + activityInterval: 0, + isMathsEnabled: false, + numMathsQuestions: 0, + mathsDifficulty: 0, + qrValue: '', + isQrEnabled: false, + isShakeEnabled: false, + shakeTimes: 0, + isPedometerEnabled: false, + numberOfSteps: 0, + days: [false, false, false, false, false, false, false], + weatherTypes: [], + isWeatherEnabled: false, + isEnabled: false, + isActivityEnabled: false, + isLocationEnabled: false, + isSharedAlarmEnabled: false, + intervalToAlarm: 0, + location: '0.0,0.0', + minutesSinceMidnight: Utils.timeOfDayToInt(TimeOfDay.now()), + ringtoneName: 'Default', + note: '', + showMotivationalQuote: false, + activityMonitor: 0, + profile: 'Default', + alarmDate: DateTime.now().toString().substring(0, 11), + alarmTime: '', + alarmID: '', + mainAlarmTime: '', + isGuardian: false, + guardianTimer: 0, + guardian: '', + isCall: false, + ringOn: false, + ); + static String formatDateTimeToHHMMSS(DateTime dateTime) { // Extract hours, minutes, and seconds from the DateTime int hours = dateTime.hour; @@ -45,6 +100,14 @@ class Utils { return TimeOfDay(hour: hour, minute: minute); } + static DateTime stringToDate(String date){ + final parts = date.split('-'); + final day = int.parse(parts[2]); + final month = int.parse(parts[1]); + final year = int.parse(parts[0]); + return DateTime(year,month,day); + } + static DateTime? stringToDateTime(String timeString) { try { final parts = timeString.split(':'); @@ -109,17 +172,17 @@ class Utils { final int hours = duration.inHours; if (seconds < 10) { - return "${seconds}"; + return '$seconds'; } else if (seconds < 60) { - return "${seconds}"; + return '$seconds'; } else if (minutes < 10) { - return "${minutes}:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; + return "$minutes:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; } else if (minutes < 60) { - return "${minutes}:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; + return "$minutes:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; } else if (hours < 10) { - return "${hours}:${minutes % 60 < 10 ? '0' : ''}${minutes % 60}:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; + return "$hours:${minutes % 60 < 10 ? '0' : ''}${minutes % 60}:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; } else { - return "${hours}:${minutes % 60 < 10 ? '0' : ''}${minutes % 60}:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; + return "$hours:${minutes % 60 < 10 ? '0' : ''}${minutes % 60}:${seconds % 60 < 10 ? '0' : ''}${seconds % 60}"; } } @@ -289,7 +352,7 @@ class Utils { 'Thur'.tr, 'Fri'.tr, 'Sat'.tr, - 'Sun'.tr + 'Sun'.tr, ]; int weekdayCount = 0; int weekendCount = 0; @@ -380,29 +443,27 @@ class Utils { static Future genFakeTimerModel() async { return TimerModel( timerValue: 0, - timeElapsed :0, + timeElapsed: 0, startedOn: '', ringtoneName: '', timerName: '', ); } - static AlarmModel genFakeAlarmModel() { - return AlarmModel( + static ProfileModel genDefaultProfileModel() { + return ProfileModel( volMax: 1.0, volMin: 0.0, snoozeDuration: 0, gradient: 1, label: '', - isOneTime: false, + isOneTime: true, deleteAfterGoesOff: false, offsetDetails: {}, - mainAlarmTime: Utils.timeOfDayToString(TimeOfDay.now()), lastEditedUserId: '', mutexLock: false, ownerName: '', ownerId: '', - alarmID: '', activityInterval: 0, isMathsEnabled: false, numMathsQuestions: 0, @@ -421,13 +482,19 @@ class Utils { isLocationEnabled: false, isSharedAlarmEnabled: false, intervalToAlarm: 0, - location: '', - alarmTime: Utils.timeOfDayToString(TimeOfDay.now()), + location: '0.0,0.0', minutesSinceMidnight: Utils.timeOfDayToInt(TimeOfDay.now()), ringtoneName: 'Default', note: '', showMotivationalQuote: false, - activityMonitor: 0 + activityMonitor: 0, + profileName: 'Default', + alarmDate: DateTime.now().toString().substring(0, 11), + isGuardian: false, + guardianTimer: 0, + guardian: '', + isCall: false, + ringOn: false, ); } @@ -667,10 +734,31 @@ class Utils { ); } } - static int getDifferenceMillisFromNow(String datetimeString, int milliseconds) { + + static int calculateTimeDifference(DateTime targetDateTime) { + targetDateTime = targetDateTime.toLocal(); + var currentTime = DateTime.now(); + currentTime = currentTime.subtract( + Duration( + milliseconds: currentTime.millisecond, + microseconds: currentTime.microsecond, + ), + ); + final difference = targetDateTime.difference(currentTime); + final milliseconds = difference.inHours * 60 * 60 * 1000 + + difference.inMinutes * 60 * 1000 + + difference.inSeconds * 1000; + return milliseconds; + } + + static int getDifferenceMillisFromNow( + String datetimeString, + int milliseconds, + ) { try { final providedDatetime = DateTime.parse(datetimeString); - final updatedDatetime = providedDatetime.add(Duration(milliseconds: milliseconds)); + final updatedDatetime = + providedDatetime.add(Duration(milliseconds: milliseconds)); final currentDatetime = DateTime.now(); final difference = updatedDatetime.difference(currentDatetime); return difference.inMilliseconds; @@ -678,4 +766,64 @@ class Utils { return 0; } } + + static String formatDateTimeToStandard(DateTime dateTime) { + dateTime = dateTime.toLocal(); + final formattedDate = + '${dateTime.year}-${_twoDigits(dateTime.month)}-${_twoDigits(dateTime.day)}'; + final formattedTime = + '${_twoDigits(dateTime.hour)}:${_twoDigits(dateTime.minute)}'; + return '$formattedDate ($formattedTime)'; + } + + static dialNumber(String phoneNo) async { + await Permission.phone.isDenied.then((value) async { + if (value) { + Permission.phone.request(); + } else { + AndroidIntent intent = AndroidIntent( + action: 'android.intent.action.CALL', + data: 'tel:$phoneNo', + ); + await intent.launch(); + } + }); + } + + static spotifyPlay(String url) async { + AndroidIntent intent = const AndroidIntent( + action: 'android.intent.action.VIEW', + data: 'spotify:track:3Pzh926pXggbMe2ZpXyMV7', + ); + await intent.launch(); + } + + static sendSMS(String phoneNo, String text) async { + final Telephony telephony = Telephony.instance; + await telephony.requestPhoneAndSmsPermissions.then((value) { + if (value == true) { + telephony.sendSms(to: phoneNo, message: text); + } + }); + } + + static String _twoDigits(int n) => n.toString().padLeft(2, '0'); + + static String getInitials(String username) { + // Split the username into parts + List parts = username.split(' '); + + // Get the first two letters of the first name + String firstNameInitials = parts[0].substring(0, 1); + + // Check if there is a last name + if (parts.length > 1) { + // Get the first two letters of the last name + String lastNameInitials = parts[1].substring(0, 1); + return firstNameInitials + lastNameInitials; + } else { + // Return only the first two letters of the first name + return parts[0].substring(0, 2); + } + } } diff --git a/lib/main.dart b/lib/main.dart index 96ad2c54..f7f5c18e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,14 +1,17 @@ import 'package:audioplayers/audioplayers.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:ultimate_alarm_clock/app/data/providers/get_storage_provider.dart'; +import 'package:ultimate_alarm_clock/app/data/providers/push_notifications.dart'; import 'package:ultimate_alarm_clock/app/utils/language.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/custom_error_screen.dart'; +import 'package:ultimate_alarm_clock/firebase_options.dart'; import 'app/routes/app_pages.dart'; Locale? loc; @@ -20,7 +23,9 @@ void main() async { Permission.notification.request(); } }); + await Firebase.initializeApp(); + await Get.putAsync(() => GetStorageProvider().init()); final storage = Get.find(); @@ -49,6 +54,12 @@ void main() async { ); } +Future _firebaseBackgroundMessage(RemoteMessage message) async { + if (message.notification != null) { + print("recieved noti"); + } +} + class UltimateAlarmClockApp extends StatelessWidget { UltimateAlarmClockApp({super.key}); @override diff --git a/pubspec.lock b/pubspec.lock index 07bc0843..85f351d2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _discoveryapis_commons: + dependency: transitive + description: + name: _discoveryapis_commons + sha256: f8bb1fdbd77f3d5c1d62b5b0eca75fbf1e41bf4f6c62628f880582e2182ae45d + url: "https://pub.dev" + source: hosted + version: "1.0.6" _fe_analyzer_shared: dependency: transitive description: @@ -25,6 +33,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.13.0" + android_intent_plus: + dependency: "direct main" + description: + name: android_intent_plus + sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074" + url: "https://pub.dev" + source: hosted + version: "5.0.2" ansicolor: dependency: transitive description: @@ -321,6 +337,22 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + equatable: + dependency: transitive + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + extension_google_sign_in_as_googleapis_auth: + dependency: "direct main" + description: + name: extension_google_sign_in_as_googleapis_auth + sha256: bcf4f8dedcc1e66ce5fe98fbd98cc86ed25ad7fce0511e8d6cdc46ccbf421e8e + url: "https://pub.dev" + source: hosted + version: "2.0.12" fake_async: dependency: transitive description: @@ -353,6 +385,30 @@ packages: url: "https://pub.dev" source: hosted version: "6.2.1" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: "17b841e1b000c3441b8ffceca88f468e078d0443db9643e77541bdfb7a3fd16b" + url: "https://pub.dev" + source: hosted + version: "4.17.8" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: f294ceef40409a36c819a14280ca864fe487b44033e5276443377c66cb448310 + url: "https://pub.dev" + source: hosted + version: "7.1.8" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "1f231da900fe7ff9f2974f8adcbdb3363c410c24725978afa5dc33e1e7e62e06" + url: "https://pub.dev" + source: hosted + version: "5.9.8" firebase_core: dependency: "direct main" description: @@ -377,6 +433,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.5" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: e41586e0fd04fe9a40424f8b0053d0832e6d04f49e020cdaf9919209a28497e9 + url: "https://pub.dev" + source: hosted + version: "14.7.19" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: f7a9d74ff7fc588a924f6b2eaeaa148b0db521b13a9db55f6ad45864fa98c06e + url: "https://pub.dev" + source: hosted + version: "4.5.27" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: fc21e771166860c55b103701c5ac7cdb2eec28897b97c42e6e5703cbedf9e02e + url: "https://pub.dev" + source: hosted + version: "3.6.8" fixnum: dependency: transitive description: @@ -632,6 +712,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.12.3+2" + googleapis: + dependency: "direct main" + description: + name: googleapis + sha256: "4eefba93b5f714d6c2bcc1695ff6fb09d36684d2a06912285d3981069796da10" + url: "https://pub.dev" + source: hosted + version: "13.1.0" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + sha256: af7c3a3edf9d0de2e1e0a77e994fae0a581c525fa7012af4fa0d4a52ed9484da + url: "https://pub.dev" + source: hosted + version: "1.4.1" graphs: dependency: transitive description: @@ -696,6 +792,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.18.1" + intl_phone_number_input: + dependency: "direct main" + description: + name: intl_phone_number_input + sha256: "1c4328713a9503ab26a1fdbb6b00b4cada68c18aac922b35bedbc72eff1297c3" + url: "https://pub.dev" + source: hosted + version: "0.7.4" io: dependency: transitive description: @@ -752,6 +856,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.8.2" + libphonenumber_platform_interface: + dependency: transitive + description: + name: libphonenumber_platform_interface + sha256: f801f6c65523f56504b83f0890e6dad584ab3a7507dca65fec0eed640afea40f + url: "https://pub.dev" + source: hosted + version: "0.4.2" + libphonenumber_plugin: + dependency: transitive + description: + name: libphonenumber_plugin + sha256: c615021d9816fbda2b2587881019ed595ecdf54d999652d7e4cce0e1f026368c + url: "https://pub.dev" + source: hosted + version: "0.3.3" + libphonenumber_web: + dependency: transitive + description: + name: libphonenumber_web + sha256: "8186f420dbe97c3132283e52819daff1e55d60d6db46f7ea5ac42f42a28cc2ef" + url: "https://pub.dev" + source: hosted + version: "0.3.2" lints: dependency: transitive description: @@ -1080,6 +1208,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "671e7a931f55a08aa45be2a13fe7247f2a41237897df434b30d2012388191833" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "2ba0510d3017f91655b7543e9ee46d48619de2a2af38e5c790423f7007c7ccc1" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "398084b47b7f92110683cac45c6dc4aae853db47e470e5ddcd52cab7f7196ab2" + url: "https://pub.dev" + source: hosted + version: "2.4.0" shelf: dependency: transitive description: @@ -1181,6 +1365,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0+1" + telephony: + dependency: "direct main" + description: + name: telephony + sha256: "821e074acec3c611e48edadd50a6d9fef864943771a545da7924adcc8509ada9" + url: "https://pub.dev" + source: hosted + version: "0.2.0" term_glyph: dependency: transitive description: @@ -1249,10 +1441,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.0" url_launcher_android: dependency: transitive description: @@ -1446,5 +1638,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.2.3 <4.0.0" + flutter: ">=3.16.6" diff --git a/pubspec.yaml b/pubspec.yaml index db19b33e..90f32dda 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: ultimate_alarm_clock -version: 0.1.0 +version: 0.2.0 publish_to: none description: A new Flutter project. environment: @@ -7,7 +7,7 @@ environment: flutter: 3.16.0 dependencies: - firebase_core: ^2.8.0 + firebase_core: ^2.27.0 screen_state: ^2.0.0 cupertino_icons: ^1.0.8 get: 4.6.6 @@ -29,8 +29,8 @@ dependencies: numberpicker: ^2.1.2 mobile_scanner: 3.5.5 permission_handler: ^11.0.1 - google_sign_in: ^6.0.2 - url_launcher: ^6.1.11 + google_sign_in: ^6.2.1 + url_launcher: ^6.3.0 flutter_expandable_fab: ^1.8.1 vibration: ^1.8.1 file_picker: ^6.1.1 @@ -46,6 +46,15 @@ dependencies: pedometer: ^4.0.1 flutter_volume_controller: ^1.3.1 sqflite: ^2.3.2 + googleapis: ^13.1.0 + googleapis_auth: ^1.4.1 + firebase_auth: ^4.17.8 + extension_google_sign_in_as_googleapis_auth: ^2.0.12 + android_intent_plus: ^5.0.2 + telephony: ^0.2.0 + intl_phone_number_input: ^0.7.4 + firebase_messaging: ^14.7.19 + shared_preferences: ^2.2.3 dev_dependencies: flutter_lints: ^2.0.3