diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index bfb2507..50bea74 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -1,39 +1,39 @@
plugins {
id("com.android.application")
id("kotlin-android")
- // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
android {
- namespace = "com.hoshomandsazan.rasadyar_app"
+ namespace = "ir.mnpc.rasadyar"
compileSdk = flutter.compileSdkVersion
- ndkVersion = flutter.ndkVersion
+ ndkVersion = "27.0.12077973"
compileOptions {
- sourceCompatibility = JavaVersion.VERSION_11
- targetCompatibility = JavaVersion.VERSION_11
+ sourceCompatibility = JavaVersion.VERSION_21
+ targetCompatibility = JavaVersion.VERSION_21
}
kotlinOptions {
- jvmTarget = JavaVersion.VERSION_11.toString()
+ jvmTarget = "21"
}
defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId = "com.hoshomandsazan.rasadyar_app"
- // You can update the following values to match your application needs.
- // For more information, see: https://flutter.dev/to/review-gradle-config.
+ applicationId = "ir.mnpc.rasadyar"
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
+ packaging {
+ resources {
+ excludes += "META-INF/DEPENDENCIES"
+ }
+ }
+
buildTypes {
release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.getByName("debug")
}
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index f5c459f..96504e7 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,28 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:icon="@mipmap/launcher_icon"
+ android:label="رصــدیـار">
+ android:name="io.flutter.embedding.android.NormalTheme"
+ android:resource="@style/NormalTheme" />
-
-
+
+
-
-
+
+
diff --git a/android/app/src/main/kotlin/com/hoshomandsazan/rasadyar_app/MainActivity.kt b/android/app/src/main/kotlin/com/hoshomandsazan/rasadyar_app/MainActivity.kt
deleted file mode 100644
index dd83dfa..0000000
--- a/android/app/src/main/kotlin/com/hoshomandsazan/rasadyar_app/MainActivity.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.hoshomandsazan.rasadyar_app
-
-import io.flutter.embedding.android.FlutterActivity
-
-class MainActivity : FlutterActivity()
diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt
new file mode 100644
index 0000000..aa64136
--- /dev/null
+++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt
@@ -0,0 +1,274 @@
+package ir.mnpc.rasadyar
+
+import android.app.Activity
+import android.app.PendingIntent
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageInstaller
+import android.content.pm.PackageManager
+import android.net.Uri
+import android.os.Build
+import android.provider.Settings
+import android.util.Log
+import android.widget.Toast
+import androidx.core.content.FileProvider
+import java.io.File
+import androidx.core.net.toUri
+
+
+class ApkInstaller(private val context: Context) {
+
+ var pendingApkFile: File? = null
+
+ companion object {
+ const val INSTALL_REQUEST_CODE = 1001
+ const val INSTALL_PERMISSION_REQUEST_CODE =2001
+
+ }
+
+ /**
+ * Install APK with compatibility for Android 5-15
+ */
+ fun installApk(apkFile: File) {
+ when {
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
+ // Android 8+ (API 26+) - Use PackageInstaller API
+ installWithFileProvider(apkFile)
+ }
+
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
+ // Android 7+ (API 24+) - Use FileProvider with Intent
+ installWithFileProvider(apkFile)
+ }
+
+ else -> {
+ // Android 5-6 (API 21-23) - Use file URI with Intent
+ installWithFileUri(apkFile)
+ }
+ }
+ }
+
+ /**
+ * Android 8+ (API 26+) - PackageInstaller API
+ */
+ private fun installWithPackageInstaller(apkFile: File) {
+ try {
+ val packageInstaller = context.packageManager.packageInstaller
+ val params = PackageInstaller.SessionParams(
+ PackageInstaller.SessionParams.MODE_FULL_INSTALL
+ )
+
+ // Set installer package name for better tracking
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
+ params.setInstallReason(PackageManager.INSTALL_REASON_USER)
+ }
+
+ val sessionId = packageInstaller.createSession(params)
+ val session = packageInstaller.openSession(sessionId)
+
+ session.use { activeSession ->
+ apkFile.inputStream().use { inputStream ->
+ activeSession.openWrite("package", 0, apkFile.length()).use { outputStream ->
+ inputStream.copyTo(outputStream)
+ activeSession.fsync(outputStream)
+ }
+ }
+
+ val intent = Intent(context, InstallResultReceiver::class.java).apply {
+ action = "${context.packageName}.INSTALL_RESULT"
+ }
+
+ val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
+ } else {
+ PendingIntent.FLAG_UPDATE_CURRENT
+ }
+
+ val pendingIntent = PendingIntent.getBroadcast(
+ context, 0, intent, flags
+ )
+
+ activeSession.commit(pendingIntent.intentSender)
+ }
+ } catch (e: Exception) {
+ // Fallback to intent method
+ installWithFileProvider(apkFile)
+ }
+ }
+
+ /**
+ * Android 7+ (API 24+) - FileProvider with Intent
+ */
+ private fun installWithFileProvider(apkFile: File) {
+ try {
+ val apkUri = FileProvider.getUriForFile(
+ context,
+ "${context.packageName}.fileprovider",
+ apkFile
+ )
+
+ val intent = createInstallIntent(apkUri).apply {
+ flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK
+
+ // Additional flags for better compatibility
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
+ putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, context.packageName)
+ }
+ }
+
+ if (context is Activity) {
+ context.startActivityForResult(intent, INSTALL_REQUEST_CODE)
+ } else {
+ context.startActivity(intent)
+ }
+ } catch (e: Exception) {
+
+ // Final fallback for Android 7+
+ installWithFileUri(apkFile)
+ }
+ }
+
+ /**
+ * Android 5-6 (API 21-23) - File URI with Intent
+ */
+ private fun installWithFileUri(apkFile: File) {
+ try {
+ val apkUri = Uri.fromFile(apkFile)
+ val intent = createInstallIntent(apkUri).apply {
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ }
+
+ if (context is Activity) {
+ context.startActivityForResult(intent, INSTALL_REQUEST_CODE)
+ } else {
+ context.startActivity(intent)
+ }
+ } catch (e: Exception) {
+
+ }
+ }
+
+ /**
+ * Create appropriate install intent based on Android version
+ */
+ private fun createInstallIntent(uri: Uri): Intent {
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ Intent(Intent.ACTION_INSTALL_PACKAGE).apply {
+ data = uri
+ }
+ } else {
+ Intent(Intent.ACTION_VIEW).apply {
+ setDataAndType(uri, "application/vnd.android.package-archive")
+ }
+ }
+ }
+
+ /**
+ * Check if installation from unknown sources is allowed
+ */
+ fun canInstallPackages(): Boolean {
+ return when {
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
+ context.packageManager.canRequestPackageInstalls()
+ }
+
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
+ try {
+ Settings.Secure.getInt(
+ context.contentResolver,
+ Settings.Secure.INSTALL_NON_MARKET_APPS
+ ) == 1
+ } catch (e: Settings.SettingNotFoundException) {
+ false
+ }
+ }
+
+ else -> {
+ // For older versions, assume it's allowed
+ true
+ }
+ }
+ }
+
+ /**
+ * Request permission to install packages
+ */
+ fun requestInstallPermission(activity: Activity) {
+ when {
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
+ if (!activity.packageManager.canRequestPackageInstalls()) {
+ val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply {
+ data = "package:${activity.packageName}".toUri()
+ }
+ activity.startActivityForResult(intent, INSTALL_PERMISSION_REQUEST_CODE)
+ }
+ }
+
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
+ val intent = Intent(Settings.ACTION_SECURITY_SETTINGS)
+ activity.startActivityForResult(intent, INSTALL_PERMISSION_REQUEST_CODE)
+ }
+ }
+ }
+
+
+
+}
+
+class InstallResultReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ when (val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1)) {
+ PackageInstaller.STATUS_SUCCESS -> {
+ Log.d("InstallResult", "Installation successful")
+ // Handle successful installation
+ Toast.makeText(context, "Installation successful", Toast.LENGTH_SHORT).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE -> {
+ val message = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)
+ Log.e("InstallResult", "Installation failed: $message")
+ Toast.makeText(context, "Installation failed: $message", Toast.LENGTH_LONG).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE_BLOCKED -> {
+ Log.e("InstallResult", "Installation blocked")
+ Toast.makeText(context, "Installation blocked by system", Toast.LENGTH_LONG).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE_ABORTED -> {
+ Log.e("InstallResult", "Installation aborted")
+ Toast.makeText(context, "Installation was cancelled", Toast.LENGTH_SHORT).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE_INVALID -> {
+ Log.e("InstallResult", "Invalid APK")
+ Toast.makeText(context, "Invalid APK file", Toast.LENGTH_LONG).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE_CONFLICT -> {
+ Log.e("InstallResult", "Installation conflict")
+ Toast.makeText(
+ context,
+ "Installation conflict with existing app",
+ Toast.LENGTH_LONG
+ ).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE_STORAGE -> {
+ Log.e("InstallResult", "Insufficient storage")
+ Toast.makeText(context, "Insufficient storage space", Toast.LENGTH_LONG).show()
+ }
+
+ PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> {
+ Log.e("InstallResult", "Incompatible app")
+ Toast.makeText(context, "App is incompatible with device", Toast.LENGTH_LONG).show()
+ }
+
+ else -> {
+ Log.w("InstallResult", "Unknown status: $status")
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt
new file mode 100644
index 0000000..dc675dc
--- /dev/null
+++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt
@@ -0,0 +1,58 @@
+package ir.mnpc.rasadyar
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
+import android.provider.Settings
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.core.content.FileProvider
+import io.flutter.embedding.android.FlutterActivity
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.plugin.common.MethodChannel
+import java.io.File
+import androidx.core.net.toUri
+
+class MainActivity : FlutterActivity() {
+
+ private val CHANNEL = "apk_installer"
+ private val INSTALL_PACKAGES_REQUEST_CODE = 1001
+ private val installer = ApkInstaller(this)
+ private val TAG = "cj"
+
+ override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
+ super.configureFlutterEngine(flutterEngine)
+
+ MethodChannel(
+ flutterEngine.dartExecutor.binaryMessenger,
+ CHANNEL
+ ).setMethodCallHandler { call, result ->
+ if (call.method == "apk_installer") {
+ val internalFile = File(context.filesDir.parentFile, "app_flutter/rasadyar.apk")
+ val externalFile = File(context.getExternalFilesDir(null), "rasadyar.apk")
+
+ internalFile.copyTo(externalFile, overwrite = true)
+ if (!installer.canInstallPackages()) {
+ installer.pendingApkFile = externalFile
+ installer.requestInstallPermission(activity)
+ } else {
+ installer.installApk(externalFile)
+ }
+ result.success(null)
+ }
+ }
+
+
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+
+ if (requestCode == ApkInstaller.INSTALL_PERMISSION_REQUEST_CODE) {
+ if (installer.canInstallPackages() && installer.pendingApkFile != null) {
+ installer.installApk(installer.pendingApkFile!!)
+ installer.pendingApkFile = null
+ }
+ }
+ }
+}
diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png
new file mode 100644
index 0000000..8e82f3a
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png
new file mode 100644
index 0000000..4a71c78
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png
new file mode 100644
index 0000000..c2b3df6
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png
new file mode 100644
index 0000000..2efdd5c
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png
new file mode 100644
index 0000000..d286a0a
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ
diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..ad6701e
--- /dev/null
+++ b/android/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
index a439442..a0fa520 100644
--- a/android/settings.gradle.kts
+++ b/android/settings.gradle.kts
@@ -19,7 +19,7 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.0" apply false
- id("org.jetbrains.kotlin.android") version "1.8.22" apply false
+ id("org.jetbrains.kotlin.android") version "1.9.25" apply false
}
include(":app")
diff --git a/assets/anim/error.json b/assets/anim/error.json
new file mode 100644
index 0000000..6bd95b9
--- /dev/null
+++ b/assets/anim/error.json
@@ -0,0 +1 @@
+{"nm":"Main Scene","ddd":0,"h":1200,"w":1200,"meta":{"g":"@lottiefiles/creator 1.46.1"},"layers":[{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-274,234,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[314,839,0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[326,839,0],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[326,839,0],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[326,839,0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[326,839,0],"t":91},{"s":[314,839,0],"t":100}],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[17],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[-21],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[-11],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[-11],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-21],"t":91},{"s":[17],"t":100}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":2,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[4.586,-3.25],[62.789,88.617],[-4.586,3.25],[-62.789,-88.617]],"o":[[-4.586,3.25],[-62.789,-88.617],[4.586,-3.25],[62.789,88.617]],"v":[[169.344,65.194],[8.747,-150.147],[-102.42,-316.472],[20.512,-159.004]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[281.289,45.92],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.9372549019607843,0.9568627450980393,1,0.504,0.9568627450980393,0.9686274509803922,1,1,1,1,1,0.004,0.21,0.504,0.52,1,0.27],"ix":9}},"t":2,"a":{"a":0,"k":0,"ix":8},"h":{"a":0,"k":0,"ix":7},"s":{"a":0,"k":[160.851,-124.073],"ix":5},"r":1,"o":{"a":0,"k":50,"ix":10}},{"ty":"tr","a":{"a":0,"k":[33.46199798583979,-125.63899230957031],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[33.46199798583979,-125.63899230957031],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[133.057,-8.913],[-198.831,95.234],[-197.466,11.653],[84.183,-76.728]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9686,0.9725,0.9765],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[19.826,-166.017],[-195.662,-98.397],[-194.297,-181.978],[-29.047,-233.833]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9686,0.9725,0.9765],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 5","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[12.717,-17.874],[29.925,-13.292],[48.218,-16.591],[66.945,-14.638],[0,0],[2.743,8.742],[0,0],[-8.742,2.743],[0,0],[-2.743,-8.742],[0,0]],"o":[[0,0],[-25.281,11.229],[-35.02,12.05],[-67.866,14.84],[-14.228,-12.346],[0,0],[-2.743,-8.742],[0,0],[8.742,-2.743],[0,0],[2.743,8.742]],"v":[[271.661,97.892],[173.478,149.96],[48.094,196.401],[-101.344,237.839],[-263.195,269.353],[-281.046,235.631],[-281.046,235.631],[-270.184,214.836],[259.958,48.476],[280.753,59.338],[280.753,59.338]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","c":{"a":0,"k":[0.8706,0.3216,0.298]},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0.2967071533201988,158.53305053710932],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0.2967071533201988,158.53305053710932],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 6","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.545,2.367],[0,0],[-4.617,-6.409],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.127,-7.898],[0,0],[7.545,-2.367],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[190.512,70.795],[-200.445,193.478],[-198.829,95.239],[-197.836,34.101],[-197.464,11.658],[-195.66,-98.392],[-194.295,-181.973],[-192.623,-283.875],[-179.781,-301.07],[-109.003,-323.281],[-88.639,-316.505],[-29.046,-233.829],[19.828,-166.013],[84.185,-76.724],[97.312,-58.517],[133.058,-8.908]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","c":{"a":0,"k":[0.8706,0.3216,0.298]},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[-4.9665069580078125,-65.31124877929693],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-4.9665069580078125,-65.31124877929693],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"mask","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[600,600,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Rectangle 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[-36.641,-4.311],[-80,0],[-55.359,7.689]],"o":[[0,0],[0,0],[0,0],[0,0],[25.5,3],[55.891,0],[54,-7.5]],"v":[[272,-188],[282,158],[-282,158],[-281.5,-189],[-177,-155],[17,-145],[184,-158]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[4,442],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":0,"nm":"Creature","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"tt":2,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[600,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,730,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,566,0],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600,600,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,600,0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,566,0],"t":85},{"s":[600,730,0],"t":100}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"w":1200,"h":1200,"refId":"comp_0_332d3c06-a209-499e-9dfc-aa05a140aa13","ind":3,"tp":2},{"ty":4,"nm":"Layer 10","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-1.833,259.407,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[91.095,91.095,100],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[119.095,119.095,100],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[119.095,119.095,100],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[119.095,119.095,100],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[119.095,119.095,100],"t":91},{"s":[91.095,91.095,100],"t":100}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[598,866,0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[655,866,0],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[655,866,0],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[655,866,0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[655,866,0],"t":91},{"s":[598,866,0],"t":100}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":26,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.403],[89.265,-7.376],[44.738,0],[37.326,3.096],[0,17.403],[-89.265,7.376],[-44.738,0],[-37.326,-3.096]],"o":[[0,17.403],[-37.326,3.096],[-44.738,0],[-89.265,-7.376],[0,-17.403],[37.326,-3.096],[44.738,0],[89.265,7.376]],"v":[[274.724,252.177],[124.304,292.037],[0,296.868],[-124.304,292.037],[-274.724,252.177],[-124.304,212.306],[0,207.475],[124.304,212.306]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[0,169.35],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.18823529411764706,0.18823529411764706,0.18823529411764706,0.535,0.38823529411764707,0.38823529411764707,0.38823529411764707,0.996,0.5882352941176471,0.5882352941176471,0.5882352941176471],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[0,305],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":1,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"it":[{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"Layer 5","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[1,258,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[601,858,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.403],[89.265,-7.376],[44.738,0],[37.326,3.096],[0,17.403],[-89.265,7.376],[-44.738,0],[-37.326,-3.096]],"o":[[0,17.403],[-37.326,3.096],[-44.738,0],[-89.265,-7.376],[0,-17.403],[37.326,-3.096],[44.738,0],[89.265,7.376]],"v":[[274.724,252.177],[124.304,292.037],[0,296.868],[-124.304,292.037],[-274.724,252.177],[-124.304,212.306],[0,207.475],[124.304,212.306]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[0,169.35],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[0,305],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5}],"v":"5.7.0","fr":30,"op":130,"ip":0,"assets":[{"nm":"Scene","id":"comp_0_332d3c06-a209-499e-9dfc-aa05a140aa13","layers":[{"ty":0,"nm":"Eyelids_01","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[104,51.5,0],"ix":1},"s":{"a":0,"k":[110.68,110.68,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[608,776.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"w":208,"h":103,"refId":"comp_1_1948dd07-9d2c-4edc-bd2c-fabe7777f75a","ind":1},{"ty":4,"nm":"Layer 3","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[600,600,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.411],[4.411,0],[0,4.411],[-4.411,0]],"o":[[0,4.411],[-4.411,0],[0,-4.411],[4.411,0]],"v":[[-45.792,186.953],[-53.778,194.939],[-61.764,186.953],[-53.778,178.967]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[-46.028,186],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-62,186],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"EYE_01","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.745],[15.745,0],[0,15.745],[-15.745,0]],"o":[[0,15.745],[-15.745,0],[0,-15.745],[15.745,0]],"v":[[-25.27,178.967],[-53.778,207.475],[-82.286,178.967],[-53.778,150.459]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[-9.124,171],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.9215686274509803,0.9215686274509803,0.9215686274509803,0.833,0.7764705882352941,0.7843137254901961,0.8117647058823529,1,0.6352941176470588,0.6509803921568628,0.7019607843137254],"ix":9}},"t":2,"a":{"a":0,"k":0,"ix":8},"h":{"a":0,"k":0,"ix":7},"s":{"a":0,"k":[-51,171],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.411],[4.411,0],[0,4.411],[-4.411,0]],"o":[[0,4.411],[-4.411,0],[0,-4.411],[4.411,0]],"v":[[61.764,182.708],[53.778,190.694],[45.792,182.708],[53.778,174.722]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[60.972,182],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[45,182],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"EYE_02","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.745],[15.745,0],[0,15.745],[-15.745,0]],"o":[[0,15.745],[-15.745,0],[0,-15.745],[15.745,0]],"v":[[82.286,178.967],[53.778,207.475],[25.27,178.967],[53.778,150.459]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[97.876,171],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.9215686274509803,0.9215686274509803,0.9215686274509803,0.833,0.7764705882352941,0.7843137254901961,0.8117647058823529,1,0.6352941176470588,0.6509803921568628,0.7019607843137254],"ix":9}},"t":2,"a":{"a":0,"k":0,"ix":8},"h":{"a":0,"k":0,"ix":7},"s":{"a":0,"k":[56,171],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2,"tp":1},{"ty":4,"nm":"Layer 4","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[600,600,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-34.336],[0,0],[44.738,0],[37.327,3.096],[0,0],[-68.649,0],[-22.492,-22.492]],"o":[[0,0],[-37.327,3.096],[-44.738,0],[0,0],[0,-68.66],[34.324,0],[22.504,22.492]],"v":[[124.304,149.333],[120.806,350.947],[0,360.868],[-124.216,352.037],[-124.304,149.333],[0,25.029],[87.892,61.429]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[132.072,70.816],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-92,277],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3}]},{"nm":"Scene_1","id":"comp_1_1948dd07-9d2c-4edc-bd2c-fabe7777f75a","layers":[{"ty":4,"nm":"Shape Layer 2","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-54.25,180,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":26},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":32.285},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":38.571},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":44.857},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":49},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":55.286},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":61.572},{"s":[100,100,100],"t":67.857421875}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[145.75,54,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-14.221,0],[0,-14.221],[14.221,0],[0,14.221]],"o":[[14.221,0],[0,14.221],[-14.221,0],[0,-14.221]],"v":[[0,-25.75],[25.75,0],[0,25.75],[-25.75,0]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.583,114.583],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-54.25,180],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-54.25,180,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":26},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":32.285},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":38.571},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":44.857},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":49},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":55.286},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":61.572},{"s":[100,100,100],"t":67.857421875}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[48.25,54,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-14.221,0],[0,-14.221],[14.221,0],[0,14.221]],"o":[[14.221,0],[0,14.221],[-14.221,0],[0,-14.221]],"v":[[0,-25.75],[25.75,0],[0,25.75],[-25.75,0]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.583,114.583],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-54.25,180],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2}]}]}
\ No newline at end of file
diff --git a/assets/anim/loading.json b/assets/anim/loading.json
new file mode 100644
index 0000000..03f2643
--- /dev/null
+++ b/assets/anim/loading.json
@@ -0,0 +1,5755 @@
+{
+ "v": "5.5.7",
+ "meta": {
+ "g": "LottieFiles AE 0.1.20",
+ "a": "",
+ "k": "",
+ "d": "",
+ "tc": ""
+ },
+ "fr": 25,
+ "ip": 0,
+ "op": 50,
+ "w": 1000,
+ "h": 1000,
+ "nm": "Go Up 4",
+ "ddd": 0,
+ "assets": [],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": "Ball",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 2,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 5,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 25,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 28,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 0,
+ "s": [
+ 1134,
+ -86,
+ 0
+ ],
+ "to": [
+ -78.833,
+ 112.333,
+ 0
+ ],
+ "ti": [
+ 69,
+ -554,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 10,
+ "s": [
+ 661,
+ 588,
+ 0
+ ],
+ "to": [
+ -41,
+ -194,
+ 0
+ ],
+ "ti": [
+ -13,
+ -191,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 20,
+ "s": [
+ 431,
+ 731,
+ 0
+ ],
+ "to": [
+ -453,
+ -205,
+ 0
+ ],
+ "ti": [
+ 98.5,
+ 6.333,
+ 0
+ ]
+ },
+ {
+ "t": 35,
+ "s": [
+ -160,
+ 693,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 206,
+ -442,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": {
+ "a": 0,
+ "k": [
+ 68,
+ 68
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 3
+ },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "t": 0,
+ "s": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ],
+ "h": 1
+ },
+ {
+ "t": 10,
+ "s": [
+ 0.208,
+ 0.6392,
+ 0.992,
+ 1
+ ],
+ "h": 1
+ },
+ {
+ "t": 14,
+ "s": [
+ 0.96,
+ 0.9813,
+ 1,
+ 1
+ ],
+ "h": 1
+ },
+ {
+ "t": 20,
+ "s": [
+ 0.208,
+ 0.6392,
+ 0.992,
+ 1
+ ],
+ "h": 1
+ },
+ {
+ "t": 35,
+ "s": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ],
+ "h": 1
+ }
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ -442
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 3,
+ "nm": "Ch Female",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 430.49,
+ 518.068,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -353.776,
+ 54.159,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 60,
+ 60,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 4,
+ "nm": "Stairs",
+ "parent": 2,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ -257.327,
+ 448.499,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 501.5,
+ 768.4,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 135.823,
+ 135.823,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 75,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 340,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 80,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 184,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 100,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 160,
+ 208
+ ],
+ [
+ 4,
+ 208
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 125,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -16,
+ 338.4
+ ],
+ [
+ -172,
+ 338.4
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "t": 130,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -162,
+ 336
+ ],
+ [
+ -166,
+ 336
+ ]
+ ],
+ "c": false
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 75,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 80,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 125,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "t": 140,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 500,
+ 500
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "5",
+ "np": 1,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 49,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 340,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 55,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 184,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 75,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 160,
+ 208
+ ],
+ [
+ 4,
+ 208
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 100,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -16,
+ 338.4
+ ],
+ [
+ -172,
+ 338.4
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "t": 105,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -162,
+ 336
+ ],
+ [
+ -166,
+ 336
+ ]
+ ],
+ "c": false
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 49,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 55,
+ "s": [
+ 50
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 500,
+ 500
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "4",
+ "np": 1,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 25,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 340,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 30,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 184,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 49,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 160,
+ 208
+ ],
+ [
+ 4,
+ 208
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 75,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -16,
+ 338.4
+ ],
+ [
+ -172,
+ 338.4
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "t": 80,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -162,
+ 336
+ ],
+ [
+ -166,
+ 336
+ ]
+ ],
+ "c": false
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 30,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 75,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "t": 88,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 500,
+ 500
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "3",
+ "np": 1,
+ "cix": 2,
+ "bm": 0,
+ "ix": 3,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 0,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 340,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 5,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 184,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 25,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 160,
+ 208
+ ],
+ [
+ 4,
+ 208
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 49,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -16,
+ 338.4
+ ],
+ [
+ -172,
+ 338.4
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "t": 55,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -162,
+ 336
+ ],
+ [
+ -166,
+ 336
+ ]
+ ],
+ "c": false
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 2
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 5,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 49,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "t": 62,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 500,
+ 500
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "2",
+ "np": 1,
+ "cix": 2,
+ "bm": 0,
+ "ix": 4,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": -25,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 340,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": -20,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 340,
+ 64
+ ],
+ [
+ 184,
+ 64
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 0,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 160,
+ 208
+ ],
+ [
+ 4,
+ 208
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "t": 25,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -16,
+ 338.4
+ ],
+ [
+ -172,
+ 338.4
+ ]
+ ],
+ "c": false
+ }
+ ]
+ },
+ {
+ "t": 30,
+ "s": [
+ {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -162,
+ 336
+ ],
+ [
+ -166,
+ 336
+ ]
+ ],
+ "c": false
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ },
+ {
+ "t": 25,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 25,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "t": 40,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 500,
+ 500
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "1",
+ "np": 1,
+ "cix": 2,
+ "bm": 0,
+ "ix": 5,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 4,
+ "nm": "Arrow",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 572.227,
+ 624.662,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 74,
+ 74,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 289.773,
+ -122.662
+ ],
+ [
+ 337.773,
+ -212.662
+ ],
+ [
+ 389.773,
+ -126.662
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.724
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1.276
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 40,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 2,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 70
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -70,
+ 0
+ ],
+ [
+ 0,
+ 312
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 210,
+ 0
+ ],
+ [
+ 0,
+ -312
+ ]
+ ],
+ "v": [
+ [
+ -533.515,
+ 362.835
+ ],
+ [
+ 208,
+ 362
+ ],
+ [
+ 385.795,
+ -103.615
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.724
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1.276
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 20,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ -40
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 87.603,
+ 87.603
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": "Plants R",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 686.095,
+ 830.468,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -105.912,
+ 311.223,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ -50,
+ 50,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.75,
+ "y": 1
+ },
+ "o": {
+ "x": 0.05,
+ "y": 0
+ },
+ "t": 0,
+ "s": [
+ {
+ "i": [
+ [
+ 41,
+ -28
+ ],
+ [
+ 10,
+ 18
+ ],
+ [
+ 20,
+ -32
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -28.194,
+ 10.252
+ ],
+ [
+ 12,
+ 56
+ ]
+ ],
+ "o": [
+ [
+ -31.031,
+ 21.192
+ ],
+ [
+ -10,
+ -18
+ ],
+ [
+ -42.36,
+ 67.776
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 22,
+ -8
+ ],
+ [
+ -10.476,
+ -48.89
+ ]
+ ],
+ "v": [
+ [
+ -294,
+ 64
+ ],
+ [
+ -286,
+ 190
+ ],
+ [
+ -358,
+ 176
+ ],
+ [
+ -260,
+ 332
+ ],
+ [
+ -226,
+ 332
+ ],
+ [
+ -225,
+ 161
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.75,
+ "y": 1
+ },
+ "o": {
+ "x": 0.05,
+ "y": 0
+ },
+ "t": 25,
+ "s": [
+ {
+ "i": [
+ [
+ 41,
+ -28
+ ],
+ [
+ 9.634,
+ 18.198
+ ],
+ [
+ 40,
+ -26
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -28.194,
+ 10.252
+ ],
+ [
+ 12,
+ 56
+ ]
+ ],
+ "o": [
+ [
+ -31.031,
+ 21.192
+ ],
+ [
+ -18,
+ -34
+ ],
+ [
+ -58.691,
+ 38.149
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 22,
+ -8
+ ],
+ [
+ -10.476,
+ -48.89
+ ]
+ ],
+ "v": [
+ [
+ -256,
+ 62
+ ],
+ [
+ -276,
+ 186
+ ],
+ [
+ -330,
+ 132
+ ],
+ [
+ -260,
+ 332
+ ],
+ [
+ -226,
+ 332
+ ],
+ [
+ -189,
+ 159
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ {
+ "i": [
+ [
+ 41,
+ -28
+ ],
+ [
+ 10,
+ 18
+ ],
+ [
+ 20,
+ -32
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -28.194,
+ 10.252
+ ],
+ [
+ 12,
+ 56
+ ]
+ ],
+ "o": [
+ [
+ -31.031,
+ 21.192
+ ],
+ [
+ -10,
+ -18
+ ],
+ [
+ -42.36,
+ 67.776
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 22,
+ -8
+ ],
+ [
+ -10.476,
+ -48.89
+ ]
+ ],
+ "v": [
+ [
+ -294,
+ 64
+ ],
+ [
+ -286,
+ 190
+ ],
+ [
+ -358,
+ 176
+ ],
+ [
+ -260,
+ 332
+ ],
+ [
+ -226,
+ 332
+ ],
+ [
+ -225,
+ 161
+ ]
+ ],
+ "c": true
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1.173
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.827
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0,
+ 0.8667,
+ 0.702,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ]
+ }
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 106.667,
+ -25.333
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 4,
+ "nm": "Plants L",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 295.905,
+ 834.468,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -105.912,
+ 311.223,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 80,
+ 80,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.75,
+ "y": 1
+ },
+ "o": {
+ "x": 0.05,
+ "y": 0
+ },
+ "t": 0,
+ "s": [
+ {
+ "i": [
+ [
+ 41,
+ -28
+ ],
+ [
+ 10,
+ 18
+ ],
+ [
+ 20,
+ -32
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -28.194,
+ 10.252
+ ],
+ [
+ 12,
+ 56
+ ]
+ ],
+ "o": [
+ [
+ -31.031,
+ 21.192
+ ],
+ [
+ -10,
+ -18
+ ],
+ [
+ -42.36,
+ 67.776
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 22,
+ -8
+ ],
+ [
+ -10.476,
+ -48.89
+ ]
+ ],
+ "v": [
+ [
+ -294,
+ 64
+ ],
+ [
+ -286,
+ 190
+ ],
+ [
+ -358,
+ 176
+ ],
+ [
+ -260,
+ 332
+ ],
+ [
+ -226,
+ 332
+ ],
+ [
+ -225,
+ 161
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.75,
+ "y": 1
+ },
+ "o": {
+ "x": 0.05,
+ "y": 0
+ },
+ "t": 25,
+ "s": [
+ {
+ "i": [
+ [
+ 41,
+ -28
+ ],
+ [
+ 9.634,
+ 18.198
+ ],
+ [
+ 40,
+ -26
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -28.194,
+ 10.252
+ ],
+ [
+ 12,
+ 56
+ ]
+ ],
+ "o": [
+ [
+ -31.031,
+ 21.192
+ ],
+ [
+ -18,
+ -34
+ ],
+ [
+ -58.691,
+ 38.149
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 22,
+ -8
+ ],
+ [
+ -10.476,
+ -48.89
+ ]
+ ],
+ "v": [
+ [
+ -256,
+ 62
+ ],
+ [
+ -276,
+ 186
+ ],
+ [
+ -330,
+ 132
+ ],
+ [
+ -260,
+ 332
+ ],
+ [
+ -226,
+ 332
+ ],
+ [
+ -189,
+ 159
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ {
+ "i": [
+ [
+ 41,
+ -28
+ ],
+ [
+ 10,
+ 18
+ ],
+ [
+ 20,
+ -32
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -28.194,
+ 10.252
+ ],
+ [
+ 12,
+ 56
+ ]
+ ],
+ "o": [
+ [
+ -31.031,
+ 21.192
+ ],
+ [
+ -10,
+ -18
+ ],
+ [
+ -42.36,
+ 67.776
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 22,
+ -8
+ ],
+ [
+ -10.476,
+ -48.89
+ ]
+ ],
+ "v": [
+ [
+ -294,
+ 64
+ ],
+ [
+ -286,
+ 190
+ ],
+ [
+ -358,
+ 176
+ ],
+ [
+ -260,
+ 332
+ ],
+ [
+ -226,
+ 332
+ ],
+ [
+ -225,
+ 161
+ ]
+ ],
+ "c": true
+ }
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.827
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0,
+ 0.8667,
+ 0.702,
+ 1
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1.173
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0.28,
+ 0.676,
+ 1,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0,
+ 0.8667,
+ 0.702,
+ 1
+ ]
+ }
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 106.667,
+ -25.333
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 4,
+ "nm": "Clock",
+ "parent": 8,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 134,
+ -131.9,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -2,
+ -95.9,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -276,
+ 2
+ ],
+ [
+ -236,
+ 2
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.851,
+ 0.8784,
+ 0.902,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 10,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 508,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -276,
+ 2
+ ],
+ [
+ -236,
+ 2
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.851,
+ 0.8784,
+ 0.902,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 10,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 3",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -2,
+ 2
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -2,
+ 2
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 90,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -276,
+ 2
+ ],
+ [
+ -236,
+ 2
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.851,
+ 0.8784,
+ 0.902,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 10,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 508,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -276,
+ 2
+ ],
+ [
+ -236,
+ 2
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.851,
+ 0.8784,
+ 0.902,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 10,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 3",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -2,
+ 2
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -2,
+ 2
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -243
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.851,
+ 0.8784,
+ 0.902,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 40,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 720
+ ]
+ }
+ ],
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -127
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 60,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 360
+ ]
+ }
+ ],
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Shape 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ -97
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ -122
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 80,
+ 80
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 3,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 8,
+ "ty": 4,
+ "nm": "Ellipse BG",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.05,
+ "y": 0
+ },
+ "t": 0,
+ "s": [
+ 364,
+ 536,
+ 0
+ ],
+ "to": [
+ 0,
+ -8.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.05,
+ "y": 0
+ },
+ "t": 25,
+ "s": [
+ 364,
+ 483,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ -8.833,
+ 0
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 364,
+ 536,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": {
+ "a": 0,
+ "k": [
+ 712,
+ 712
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 3
+ },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1.276
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 0,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.724
+ ]
+ },
+ "o": {
+ "x": [
+ 0.05
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 25,
+ "s": [
+ 0.6314,
+ 0.6784,
+ 0.7176,
+ 1
+ ]
+ },
+ {
+ "t": 49,
+ "s": [
+ 0.2,
+ 0.64,
+ 1,
+ 1
+ ]
+ }
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 136,
+ -36
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 80.317,
+ 80.317
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 9,
+ "ty": 4,
+ "nm": "Bottom Shadow",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 10,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 524,
+ 832.149,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 381.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 153.865,
+ -608.36,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": {
+ "a": 0,
+ "k": [
+ 400,
+ 12.5
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 3
+ },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.1804,
+ 0.0118,
+ 0.898,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 381.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 50,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": []
+}
\ No newline at end of file
diff --git a/assets/icons/3d_cube_square.svg b/assets/icons/3d_cube_square.svg
new file mode 100644
index 0000000..4eb620a
--- /dev/null
+++ b/assets/icons/3d_cube_square.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/add.svg b/assets/icons/add.svg
new file mode 100644
index 0000000..2d74577
--- /dev/null
+++ b/assets/icons/add.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/app_bar_inspection.svg b/assets/icons/app_bar_inspection.svg
new file mode 100644
index 0000000..ea72d5f
--- /dev/null
+++ b/assets/icons/app_bar_inspection.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/arrow_left.svg b/assets/icons/arrow_left.svg
new file mode 100644
index 0000000..2db56f6
--- /dev/null
+++ b/assets/icons/arrow_left.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/arrow_right.svg b/assets/icons/arrow_right.svg
new file mode 100644
index 0000000..dfc8100
--- /dev/null
+++ b/assets/icons/arrow_right.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/bg_auth.svg b/assets/icons/bg_auth.svg
new file mode 100644
index 0000000..3863899
--- /dev/null
+++ b/assets/icons/bg_auth.svg
@@ -0,0 +1,57 @@
+
diff --git a/assets/icons/bg_header_user_profile.svg b/assets/icons/bg_header_user_profile.svg
new file mode 100644
index 0000000..3fdb2f5
--- /dev/null
+++ b/assets/icons/bg_header_user_profile.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/buy.svg b/assets/icons/buy.svg
new file mode 100644
index 0000000..ce540e4
--- /dev/null
+++ b/assets/icons/buy.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/calendar.svg b/assets/icons/calendar.svg
new file mode 100644
index 0000000..2b55ed8
--- /dev/null
+++ b/assets/icons/calendar.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/calendar_search.svg b/assets/icons/calendar_search.svg
new file mode 100644
index 0000000..59ed538
--- /dev/null
+++ b/assets/icons/calendar_search.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/calendar_search_outline.svg b/assets/icons/calendar_search_outline.svg
new file mode 100644
index 0000000..854cf73
--- /dev/null
+++ b/assets/icons/calendar_search_outline.svg
@@ -0,0 +1,20 @@
+
diff --git a/assets/icons/call.svg b/assets/icons/call.svg
new file mode 100644
index 0000000..e7d1c11
--- /dev/null
+++ b/assets/icons/call.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/check.svg b/assets/icons/check.svg
new file mode 100644
index 0000000..d314ce4
--- /dev/null
+++ b/assets/icons/check.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/check_square.svg b/assets/icons/check_square.svg
new file mode 100644
index 0000000..316aeb2
--- /dev/null
+++ b/assets/icons/check_square.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/chicken.svg b/assets/icons/chicken.svg
new file mode 100644
index 0000000..dbf0757
--- /dev/null
+++ b/assets/icons/chicken.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/chicken_map_marker.svg b/assets/icons/chicken_map_marker.svg
new file mode 100644
index 0000000..2099322
--- /dev/null
+++ b/assets/icons/chicken_map_marker.svg
@@ -0,0 +1,36 @@
+
diff --git a/assets/icons/clipboard_eye.svg b/assets/icons/clipboard_eye.svg
new file mode 100644
index 0000000..99bc1ad
--- /dev/null
+++ b/assets/icons/clipboard_eye.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/clipboard_task.svg b/assets/icons/clipboard_task.svg
new file mode 100644
index 0000000..b0d2d3e
--- /dev/null
+++ b/assets/icons/clipboard_task.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/clock.svg b/assets/icons/clock.svg
new file mode 100644
index 0000000..11bff2c
--- /dev/null
+++ b/assets/icons/clock.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/close_circle.svg b/assets/icons/close_circle.svg
new file mode 100644
index 0000000..ed5da34
--- /dev/null
+++ b/assets/icons/close_circle.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/close_square.svg b/assets/icons/close_square.svg
new file mode 100644
index 0000000..3f7c554
--- /dev/null
+++ b/assets/icons/close_square.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/convert_cube.svg b/assets/icons/convert_cube.svg
new file mode 100644
index 0000000..5ada319
--- /dev/null
+++ b/assets/icons/convert_cube.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/cow.svg b/assets/icons/cow.svg
new file mode 100644
index 0000000..ad8320d
--- /dev/null
+++ b/assets/icons/cow.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/cube.svg b/assets/icons/cube.svg
new file mode 100644
index 0000000..c44cba3
--- /dev/null
+++ b/assets/icons/cube.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/cube_bottom_rotation.svg b/assets/icons/cube_bottom_rotation.svg
new file mode 100644
index 0000000..94089f8
--- /dev/null
+++ b/assets/icons/cube_bottom_rotation.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/cube_card.svg b/assets/icons/cube_card.svg
new file mode 100644
index 0000000..d20d965
--- /dev/null
+++ b/assets/icons/cube_card.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/cube_rotate.svg b/assets/icons/cube_rotate.svg
new file mode 100644
index 0000000..e5280c5
--- /dev/null
+++ b/assets/icons/cube_rotate.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/cube_scan.svg b/assets/icons/cube_scan.svg
new file mode 100644
index 0000000..5d088f4
--- /dev/null
+++ b/assets/icons/cube_scan.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/cube_search.svg b/assets/icons/cube_search.svg
new file mode 100644
index 0000000..e9308ea
--- /dev/null
+++ b/assets/icons/cube_search.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/cube_top_rotation.svg b/assets/icons/cube_top_rotation.svg
new file mode 100644
index 0000000..828ec46
--- /dev/null
+++ b/assets/icons/cube_top_rotation.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/cube_watting.svg b/assets/icons/cube_watting.svg
new file mode 100644
index 0000000..29cbdc8
--- /dev/null
+++ b/assets/icons/cube_watting.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/diagram.svg b/assets/icons/diagram.svg
new file mode 100644
index 0000000..7e505bd
--- /dev/null
+++ b/assets/icons/diagram.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/download.svg b/assets/icons/download.svg
new file mode 100644
index 0000000..0e8dd4d
--- /dev/null
+++ b/assets/icons/download.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/edit.svg b/assets/icons/edit.svg
new file mode 100644
index 0000000..632a118
--- /dev/null
+++ b/assets/icons/edit.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg
new file mode 100644
index 0000000..9d67b54
--- /dev/null
+++ b/assets/icons/empty.svg
@@ -0,0 +1,55 @@
+
diff --git a/assets/icons/excel_download.svg b/assets/icons/excel_download.svg
new file mode 100644
index 0000000..b2597c5
--- /dev/null
+++ b/assets/icons/excel_download.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/filter.svg b/assets/icons/filter.svg
new file mode 100644
index 0000000..25636f2
--- /dev/null
+++ b/assets/icons/filter.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/filter_outline.svg b/assets/icons/filter_outline.svg
new file mode 100644
index 0000000..cd9d913
--- /dev/null
+++ b/assets/icons/filter_outline.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/gps.svg b/assets/icons/gps.svg
new file mode 100644
index 0000000..de896a0
--- /dev/null
+++ b/assets/icons/gps.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/home.svg b/assets/icons/home.svg
new file mode 100644
index 0000000..a2a952c
--- /dev/null
+++ b/assets/icons/home.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/hot_chicken.svg b/assets/icons/hot_chicken.svg
new file mode 100644
index 0000000..17b35aa
--- /dev/null
+++ b/assets/icons/hot_chicken.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/information.svg b/assets/icons/information.svg
new file mode 100644
index 0000000..1ae3840
--- /dev/null
+++ b/assets/icons/information.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/inside.svg b/assets/icons/inside.svg
new file mode 100644
index 0000000..88704db
--- /dev/null
+++ b/assets/icons/inside.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/inspection.svg b/assets/icons/inspection.svg
new file mode 100644
index 0000000..3e49ae8
--- /dev/null
+++ b/assets/icons/inspection.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/key.svg b/assets/icons/key.svg
new file mode 100644
index 0000000..fe524b4
--- /dev/null
+++ b/assets/icons/key.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/liveStock.svg b/assets/icons/liveStock.svg
new file mode 100644
index 0000000..24b6c5e
--- /dev/null
+++ b/assets/icons/liveStock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/lock.svg b/assets/icons/lock.svg
new file mode 100644
index 0000000..4a64667
--- /dev/null
+++ b/assets/icons/lock.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/logout.svg b/assets/icons/logout.svg
new file mode 100644
index 0000000..5fdbcf7
--- /dev/null
+++ b/assets/icons/logout.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/map.svg b/assets/icons/map.svg
new file mode 100644
index 0000000..1d3b6f5
--- /dev/null
+++ b/assets/icons/map.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/map_marker.svg b/assets/icons/map_marker.svg
new file mode 100644
index 0000000..bc4a843
--- /dev/null
+++ b/assets/icons/map_marker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/message_add.svg b/assets/icons/message_add.svg
new file mode 100644
index 0000000..9d83a3f
--- /dev/null
+++ b/assets/icons/message_add.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/outside.svg b/assets/icons/outside.svg
new file mode 100644
index 0000000..72b6978
--- /dev/null
+++ b/assets/icons/outside.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/assets/icons/pdf_download.svg b/assets/icons/pdf_download.svg
new file mode 100644
index 0000000..fb17107
--- /dev/null
+++ b/assets/icons/pdf_download.svg
@@ -0,0 +1,15 @@
+
diff --git a/assets/icons/people.svg b/assets/icons/people.svg
new file mode 100644
index 0000000..9c1edd3
--- /dev/null
+++ b/assets/icons/people.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/picture_frame.svg b/assets/icons/picture_frame.svg
new file mode 100644
index 0000000..1aa2bc8
--- /dev/null
+++ b/assets/icons/picture_frame.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/place_holder.svg b/assets/icons/place_holder.svg
new file mode 100644
index 0000000..5a0c1d4
--- /dev/null
+++ b/assets/icons/place_holder.svg
@@ -0,0 +1,33 @@
+ث
diff --git a/assets/icons/profile2.svg b/assets/icons/profile2.svg
new file mode 100644
index 0000000..a164e84
--- /dev/null
+++ b/assets/icons/profile2.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/profile2_outline.svg b/assets/icons/profile2_outline.svg
new file mode 100644
index 0000000..87c10f9
--- /dev/null
+++ b/assets/icons/profile2_outline.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/profile_circle.svg b/assets/icons/profile_circle.svg
new file mode 100644
index 0000000..0b32445
--- /dev/null
+++ b/assets/icons/profile_circle.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/profile_user.svg b/assets/icons/profile_user.svg
new file mode 100644
index 0000000..c9218f9
--- /dev/null
+++ b/assets/icons/profile_user.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/receipt_discount.svg b/assets/icons/receipt_discount.svg
new file mode 100644
index 0000000..1f41ab6
--- /dev/null
+++ b/assets/icons/receipt_discount.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/sale.svg b/assets/icons/sale.svg
new file mode 100644
index 0000000..9b2775c
--- /dev/null
+++ b/assets/icons/sale.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/scan.svg b/assets/icons/scan.svg
new file mode 100644
index 0000000..071b59b
--- /dev/null
+++ b/assets/icons/scan.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/scan_barcode.svg b/assets/icons/scan_barcode.svg
new file mode 100644
index 0000000..cd387e0
--- /dev/null
+++ b/assets/icons/scan_barcode.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/icons/search.svg b/assets/icons/search.svg
new file mode 100644
index 0000000..e12b6da
--- /dev/null
+++ b/assets/icons/search.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/security_time.svg b/assets/icons/security_time.svg
new file mode 100644
index 0000000..1fab0fe
--- /dev/null
+++ b/assets/icons/security_time.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/setting.svg b/assets/icons/setting.svg
new file mode 100644
index 0000000..622cf10
--- /dev/null
+++ b/assets/icons/setting.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/shop.svg b/assets/icons/shop.svg
new file mode 100644
index 0000000..1c5dde5
--- /dev/null
+++ b/assets/icons/shop.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/shopping_basket.svg b/assets/icons/shopping_basket.svg
new file mode 100644
index 0000000..76d34a5
--- /dev/null
+++ b/assets/icons/shopping_basket.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/tag_label.svg b/assets/icons/tag_label.svg
new file mode 100644
index 0000000..7db9b38
--- /dev/null
+++ b/assets/icons/tag_label.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/tag_user.svg b/assets/icons/tag_user.svg
new file mode 100644
index 0000000..a7e464a
--- /dev/null
+++ b/assets/icons/tag_user.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/task.svg b/assets/icons/task.svg
new file mode 100644
index 0000000..a9595ba
--- /dev/null
+++ b/assets/icons/task.svg
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/assets/icons/timer.svg b/assets/icons/timer.svg
new file mode 100644
index 0000000..cffe360
--- /dev/null
+++ b/assets/icons/timer.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/trash.svg b/assets/icons/trash.svg
new file mode 100644
index 0000000..6c9b5a1
--- /dev/null
+++ b/assets/icons/trash.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/icons/truck.svg b/assets/icons/truck.svg
new file mode 100644
index 0000000..9a40d42
--- /dev/null
+++ b/assets/icons/truck.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/truck_fast.svg b/assets/icons/truck_fast.svg
new file mode 100644
index 0000000..7c05346
--- /dev/null
+++ b/assets/icons/truck_fast.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/truck_fast_outlined.svg b/assets/icons/truck_fast_outlined.svg
new file mode 100644
index 0000000..bb3b4c4
--- /dev/null
+++ b/assets/icons/truck_fast_outlined.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/user.svg b/assets/icons/user.svg
new file mode 100644
index 0000000..b60b7b7
--- /dev/null
+++ b/assets/icons/user.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/user_raduis.svg b/assets/icons/user_raduis.svg
new file mode 100644
index 0000000..d52d9b2
--- /dev/null
+++ b/assets/icons/user_raduis.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/user_square.svg b/assets/icons/user_square.svg
new file mode 100644
index 0000000..c2de783
--- /dev/null
+++ b/assets/icons/user_square.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/virtual.svg b/assets/icons/virtual.svg
new file mode 100644
index 0000000..b3563c1
--- /dev/null
+++ b/assets/icons/virtual.svg
@@ -0,0 +1,24 @@
+
diff --git a/assets/icons/whare_house.svg b/assets/icons/whare_house.svg
new file mode 100644
index 0000000..5033d61
--- /dev/null
+++ b/assets/icons/whare_house.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/chicken.png b/assets/images/chicken.png
new file mode 100644
index 0000000..20f7ab3
Binary files /dev/null and b/assets/images/chicken.png differ
diff --git a/assets/images/inner_splash.webp b/assets/images/inner_splash.webp
new file mode 100644
index 0000000..2744801
Binary files /dev/null and b/assets/images/inner_splash.webp differ
diff --git a/assets/images/outter_splash.webp b/assets/images/outter_splash.webp
new file mode 100644
index 0000000..214227c
Binary files /dev/null and b/assets/images/outter_splash.webp differ
diff --git a/assets/images/place_holder.png b/assets/images/place_holder.png
new file mode 100644
index 0000000..48c509e
Binary files /dev/null and b/assets/images/place_holder.png differ
diff --git a/assets/logos/final_logo.png b/assets/logos/final_logo.png
new file mode 100644
index 0000000..9884195
Binary files /dev/null and b/assets/logos/final_logo.png differ
diff --git a/assets/vec/3d_cube_square.svg.vec b/assets/vec/3d_cube_square.svg.vec
new file mode 100644
index 0000000..a5b5704
Binary files /dev/null and b/assets/vec/3d_cube_square.svg.vec differ
diff --git a/assets/vec/add.svg.vec b/assets/vec/add.svg.vec
new file mode 100644
index 0000000..0e0727a
Binary files /dev/null and b/assets/vec/add.svg.vec differ
diff --git a/assets/vec/app_bar_inspection.svg.vec b/assets/vec/app_bar_inspection.svg.vec
new file mode 100644
index 0000000..eaa08e3
Binary files /dev/null and b/assets/vec/app_bar_inspection.svg.vec differ
diff --git a/assets/vec/arrow_left.svg.vec b/assets/vec/arrow_left.svg.vec
new file mode 100644
index 0000000..010f8fd
Binary files /dev/null and b/assets/vec/arrow_left.svg.vec differ
diff --git a/assets/vec/arrow_right.svg.vec b/assets/vec/arrow_right.svg.vec
new file mode 100644
index 0000000..432f905
Binary files /dev/null and b/assets/vec/arrow_right.svg.vec differ
diff --git a/assets/vec/bg_auth.svg.vec b/assets/vec/bg_auth.svg.vec
new file mode 100644
index 0000000..a5c1c29
Binary files /dev/null and b/assets/vec/bg_auth.svg.vec differ
diff --git a/assets/vec/bg_header_user_profile.svg.vec b/assets/vec/bg_header_user_profile.svg.vec
new file mode 100644
index 0000000..c58f58c
Binary files /dev/null and b/assets/vec/bg_header_user_profile.svg.vec differ
diff --git a/assets/vec/buy.svg.vec b/assets/vec/buy.svg.vec
new file mode 100644
index 0000000..9b7f886
Binary files /dev/null and b/assets/vec/buy.svg.vec differ
diff --git a/assets/vec/calendar.svg.vec b/assets/vec/calendar.svg.vec
new file mode 100644
index 0000000..17a6d46
Binary files /dev/null and b/assets/vec/calendar.svg.vec differ
diff --git a/assets/vec/calendar_search.svg.vec b/assets/vec/calendar_search.svg.vec
new file mode 100644
index 0000000..199ea1a
Binary files /dev/null and b/assets/vec/calendar_search.svg.vec differ
diff --git a/assets/vec/calendar_search_outline.svg.vec b/assets/vec/calendar_search_outline.svg.vec
new file mode 100644
index 0000000..63a41df
Binary files /dev/null and b/assets/vec/calendar_search_outline.svg.vec differ
diff --git a/assets/vec/call.svg.vec b/assets/vec/call.svg.vec
new file mode 100644
index 0000000..d9b7763
Binary files /dev/null and b/assets/vec/call.svg.vec differ
diff --git a/assets/vec/check.svg.vec b/assets/vec/check.svg.vec
new file mode 100644
index 0000000..b190008
Binary files /dev/null and b/assets/vec/check.svg.vec differ
diff --git a/assets/vec/check_square.svg.vec b/assets/vec/check_square.svg.vec
new file mode 100644
index 0000000..fd0c6e7
Binary files /dev/null and b/assets/vec/check_square.svg.vec differ
diff --git a/assets/vec/chicken.svg.vec b/assets/vec/chicken.svg.vec
new file mode 100644
index 0000000..3424ea7
Binary files /dev/null and b/assets/vec/chicken.svg.vec differ
diff --git a/assets/vec/chicken_map_marker.svg.vec b/assets/vec/chicken_map_marker.svg.vec
new file mode 100644
index 0000000..4ea6f27
Binary files /dev/null and b/assets/vec/chicken_map_marker.svg.vec differ
diff --git a/assets/vec/clipboard_eye.svg.vec b/assets/vec/clipboard_eye.svg.vec
new file mode 100644
index 0000000..e0db39f
Binary files /dev/null and b/assets/vec/clipboard_eye.svg.vec differ
diff --git a/assets/vec/clipboard_task.svg.vec b/assets/vec/clipboard_task.svg.vec
new file mode 100644
index 0000000..5b272b6
Binary files /dev/null and b/assets/vec/clipboard_task.svg.vec differ
diff --git a/assets/vec/clock.svg.vec b/assets/vec/clock.svg.vec
new file mode 100644
index 0000000..a78d0a5
Binary files /dev/null and b/assets/vec/clock.svg.vec differ
diff --git a/assets/vec/close_circle.svg.vec b/assets/vec/close_circle.svg.vec
new file mode 100644
index 0000000..59e1d5b
Binary files /dev/null and b/assets/vec/close_circle.svg.vec differ
diff --git a/assets/vec/close_square.svg.vec b/assets/vec/close_square.svg.vec
new file mode 100644
index 0000000..57db0a0
Binary files /dev/null and b/assets/vec/close_square.svg.vec differ
diff --git a/assets/vec/convert_cube.svg.vec b/assets/vec/convert_cube.svg.vec
new file mode 100644
index 0000000..bd3185f
Binary files /dev/null and b/assets/vec/convert_cube.svg.vec differ
diff --git a/assets/vec/cow.svg.vec b/assets/vec/cow.svg.vec
new file mode 100644
index 0000000..a459c94
Binary files /dev/null and b/assets/vec/cow.svg.vec differ
diff --git a/assets/vec/cube.svg.vec b/assets/vec/cube.svg.vec
new file mode 100644
index 0000000..a5b5704
Binary files /dev/null and b/assets/vec/cube.svg.vec differ
diff --git a/assets/vec/cube_bottom_rotation.svg.vec b/assets/vec/cube_bottom_rotation.svg.vec
new file mode 100644
index 0000000..17ce852
Binary files /dev/null and b/assets/vec/cube_bottom_rotation.svg.vec differ
diff --git a/assets/vec/cube_card.svg.vec b/assets/vec/cube_card.svg.vec
new file mode 100644
index 0000000..786a6e3
Binary files /dev/null and b/assets/vec/cube_card.svg.vec differ
diff --git a/assets/vec/cube_rotate.svg.vec b/assets/vec/cube_rotate.svg.vec
new file mode 100644
index 0000000..7e7db01
Binary files /dev/null and b/assets/vec/cube_rotate.svg.vec differ
diff --git a/assets/vec/cube_scan.svg.vec b/assets/vec/cube_scan.svg.vec
new file mode 100644
index 0000000..4c5c41d
Binary files /dev/null and b/assets/vec/cube_scan.svg.vec differ
diff --git a/assets/vec/cube_search.svg.vec b/assets/vec/cube_search.svg.vec
new file mode 100644
index 0000000..da0dc56
Binary files /dev/null and b/assets/vec/cube_search.svg.vec differ
diff --git a/assets/vec/cube_top_rotation.svg.vec b/assets/vec/cube_top_rotation.svg.vec
new file mode 100644
index 0000000..aed0a34
Binary files /dev/null and b/assets/vec/cube_top_rotation.svg.vec differ
diff --git a/assets/vec/cube_watting.svg.vec b/assets/vec/cube_watting.svg.vec
new file mode 100644
index 0000000..8f06121
Binary files /dev/null and b/assets/vec/cube_watting.svg.vec differ
diff --git a/assets/vec/diagram.svg.vec b/assets/vec/diagram.svg.vec
new file mode 100644
index 0000000..74ab003
Binary files /dev/null and b/assets/vec/diagram.svg.vec differ
diff --git a/assets/vec/download.svg.vec b/assets/vec/download.svg.vec
new file mode 100644
index 0000000..cf531fa
Binary files /dev/null and b/assets/vec/download.svg.vec differ
diff --git a/assets/vec/edit.svg.vec b/assets/vec/edit.svg.vec
new file mode 100644
index 0000000..e22f172
Binary files /dev/null and b/assets/vec/edit.svg.vec differ
diff --git a/assets/vec/empty.svg.vec b/assets/vec/empty.svg.vec
new file mode 100644
index 0000000..b60778f
Binary files /dev/null and b/assets/vec/empty.svg.vec differ
diff --git a/assets/vec/excel_download.svg.vec b/assets/vec/excel_download.svg.vec
new file mode 100644
index 0000000..9d5ec2e
Binary files /dev/null and b/assets/vec/excel_download.svg.vec differ
diff --git a/assets/vec/filter.svg.vec b/assets/vec/filter.svg.vec
new file mode 100644
index 0000000..6d6d5ba
Binary files /dev/null and b/assets/vec/filter.svg.vec differ
diff --git a/assets/vec/filter_outline.svg.vec b/assets/vec/filter_outline.svg.vec
new file mode 100644
index 0000000..0c4ac2d
Binary files /dev/null and b/assets/vec/filter_outline.svg.vec differ
diff --git a/assets/vec/gps.svg.vec b/assets/vec/gps.svg.vec
new file mode 100644
index 0000000..4508f5d
Binary files /dev/null and b/assets/vec/gps.svg.vec differ
diff --git a/assets/vec/home.svg.vec b/assets/vec/home.svg.vec
new file mode 100644
index 0000000..7918796
Binary files /dev/null and b/assets/vec/home.svg.vec differ
diff --git a/assets/vec/hot_chicken.svg.vec b/assets/vec/hot_chicken.svg.vec
new file mode 100644
index 0000000..71668a9
Binary files /dev/null and b/assets/vec/hot_chicken.svg.vec differ
diff --git a/assets/vec/information.svg.vec b/assets/vec/information.svg.vec
new file mode 100644
index 0000000..80fe416
Binary files /dev/null and b/assets/vec/information.svg.vec differ
diff --git a/assets/vec/inside.svg.vec b/assets/vec/inside.svg.vec
new file mode 100644
index 0000000..b43a512
Binary files /dev/null and b/assets/vec/inside.svg.vec differ
diff --git a/assets/vec/inspection.svg.vec b/assets/vec/inspection.svg.vec
new file mode 100644
index 0000000..ed9d937
Binary files /dev/null and b/assets/vec/inspection.svg.vec differ
diff --git a/assets/vec/key.svg.vec b/assets/vec/key.svg.vec
new file mode 100644
index 0000000..3252fd9
Binary files /dev/null and b/assets/vec/key.svg.vec differ
diff --git a/assets/vec/liveStock.svg.vec b/assets/vec/liveStock.svg.vec
new file mode 100644
index 0000000..469f5a1
Binary files /dev/null and b/assets/vec/liveStock.svg.vec differ
diff --git a/assets/vec/lock.svg.vec b/assets/vec/lock.svg.vec
new file mode 100644
index 0000000..f257a46
Binary files /dev/null and b/assets/vec/lock.svg.vec differ
diff --git a/assets/vec/logout.svg.vec b/assets/vec/logout.svg.vec
new file mode 100644
index 0000000..a8a9e2b
Binary files /dev/null and b/assets/vec/logout.svg.vec differ
diff --git a/assets/vec/map.svg.vec b/assets/vec/map.svg.vec
new file mode 100644
index 0000000..adc2bc2
Binary files /dev/null and b/assets/vec/map.svg.vec differ
diff --git a/assets/vec/map_marker.svg.vec b/assets/vec/map_marker.svg.vec
new file mode 100644
index 0000000..218eba7
Binary files /dev/null and b/assets/vec/map_marker.svg.vec differ
diff --git a/assets/vec/message_add.svg.vec b/assets/vec/message_add.svg.vec
new file mode 100644
index 0000000..f740dd5
Binary files /dev/null and b/assets/vec/message_add.svg.vec differ
diff --git a/assets/vec/outside.svg.vec b/assets/vec/outside.svg.vec
new file mode 100644
index 0000000..b38f61d
Binary files /dev/null and b/assets/vec/outside.svg.vec differ
diff --git a/assets/vec/pdf_download.svg.vec b/assets/vec/pdf_download.svg.vec
new file mode 100644
index 0000000..50636b5
Binary files /dev/null and b/assets/vec/pdf_download.svg.vec differ
diff --git a/assets/vec/people.svg.vec b/assets/vec/people.svg.vec
new file mode 100644
index 0000000..acf8c0b
Binary files /dev/null and b/assets/vec/people.svg.vec differ
diff --git a/assets/vec/picture_frame.svg.vec b/assets/vec/picture_frame.svg.vec
new file mode 100644
index 0000000..1a0551d
Binary files /dev/null and b/assets/vec/picture_frame.svg.vec differ
diff --git a/assets/vec/place_holder.svg.vec b/assets/vec/place_holder.svg.vec
new file mode 100644
index 0000000..caefba3
Binary files /dev/null and b/assets/vec/place_holder.svg.vec differ
diff --git a/assets/vec/profile2.svg.vec b/assets/vec/profile2.svg.vec
new file mode 100644
index 0000000..d9f7baa
Binary files /dev/null and b/assets/vec/profile2.svg.vec differ
diff --git a/assets/vec/profile2_outline.svg.vec b/assets/vec/profile2_outline.svg.vec
new file mode 100644
index 0000000..47e117e
Binary files /dev/null and b/assets/vec/profile2_outline.svg.vec differ
diff --git a/assets/vec/profile_circle.svg.vec b/assets/vec/profile_circle.svg.vec
new file mode 100644
index 0000000..7abbf35
Binary files /dev/null and b/assets/vec/profile_circle.svg.vec differ
diff --git a/assets/vec/profile_user.svg.vec b/assets/vec/profile_user.svg.vec
new file mode 100644
index 0000000..4d9a07d
Binary files /dev/null and b/assets/vec/profile_user.svg.vec differ
diff --git a/assets/vec/receipt_discount.svg.vec b/assets/vec/receipt_discount.svg.vec
new file mode 100644
index 0000000..851be37
Binary files /dev/null and b/assets/vec/receipt_discount.svg.vec differ
diff --git a/assets/vec/sale.svg.vec b/assets/vec/sale.svg.vec
new file mode 100644
index 0000000..4935a7d
Binary files /dev/null and b/assets/vec/sale.svg.vec differ
diff --git a/assets/vec/scan.svg.vec b/assets/vec/scan.svg.vec
new file mode 100644
index 0000000..e8a6953
Binary files /dev/null and b/assets/vec/scan.svg.vec differ
diff --git a/assets/vec/scan_barcode.svg.vec b/assets/vec/scan_barcode.svg.vec
new file mode 100644
index 0000000..2456035
Binary files /dev/null and b/assets/vec/scan_barcode.svg.vec differ
diff --git a/assets/vec/search.svg.vec b/assets/vec/search.svg.vec
new file mode 100644
index 0000000..2e7b5e0
Binary files /dev/null and b/assets/vec/search.svg.vec differ
diff --git a/assets/vec/security_time.svg.vec b/assets/vec/security_time.svg.vec
new file mode 100644
index 0000000..72e5dee
Binary files /dev/null and b/assets/vec/security_time.svg.vec differ
diff --git a/assets/vec/setting.svg.vec b/assets/vec/setting.svg.vec
new file mode 100644
index 0000000..5b88635
Binary files /dev/null and b/assets/vec/setting.svg.vec differ
diff --git a/assets/vec/shop.svg.vec b/assets/vec/shop.svg.vec
new file mode 100644
index 0000000..f02a218
Binary files /dev/null and b/assets/vec/shop.svg.vec differ
diff --git a/assets/vec/shopping_basket.svg.vec b/assets/vec/shopping_basket.svg.vec
new file mode 100644
index 0000000..c19c21e
Binary files /dev/null and b/assets/vec/shopping_basket.svg.vec differ
diff --git a/assets/vec/tag_label.svg.vec b/assets/vec/tag_label.svg.vec
new file mode 100644
index 0000000..7afb4cd
Binary files /dev/null and b/assets/vec/tag_label.svg.vec differ
diff --git a/assets/vec/tag_user.svg.vec b/assets/vec/tag_user.svg.vec
new file mode 100644
index 0000000..e90f06b
Binary files /dev/null and b/assets/vec/tag_user.svg.vec differ
diff --git a/assets/vec/task.svg.vec b/assets/vec/task.svg.vec
new file mode 100644
index 0000000..b364eb1
Binary files /dev/null and b/assets/vec/task.svg.vec differ
diff --git a/assets/vec/timer.svg.vec b/assets/vec/timer.svg.vec
new file mode 100644
index 0000000..9f849a0
Binary files /dev/null and b/assets/vec/timer.svg.vec differ
diff --git a/assets/vec/trash.svg.vec b/assets/vec/trash.svg.vec
new file mode 100644
index 0000000..7d8c954
Binary files /dev/null and b/assets/vec/trash.svg.vec differ
diff --git a/assets/vec/truck.svg.vec b/assets/vec/truck.svg.vec
new file mode 100644
index 0000000..6cd1b6f
Binary files /dev/null and b/assets/vec/truck.svg.vec differ
diff --git a/assets/vec/truck_fast.svg.vec b/assets/vec/truck_fast.svg.vec
new file mode 100644
index 0000000..f8a24c1
Binary files /dev/null and b/assets/vec/truck_fast.svg.vec differ
diff --git a/assets/vec/truck_fast_outlined.svg.vec b/assets/vec/truck_fast_outlined.svg.vec
new file mode 100644
index 0000000..996ae7c
Binary files /dev/null and b/assets/vec/truck_fast_outlined.svg.vec differ
diff --git a/assets/vec/user.svg.vec b/assets/vec/user.svg.vec
new file mode 100644
index 0000000..cdbe8af
Binary files /dev/null and b/assets/vec/user.svg.vec differ
diff --git a/assets/vec/user_raduis.svg.vec b/assets/vec/user_raduis.svg.vec
new file mode 100644
index 0000000..06d5bda
Binary files /dev/null and b/assets/vec/user_raduis.svg.vec differ
diff --git a/assets/vec/user_square.svg.vec b/assets/vec/user_square.svg.vec
new file mode 100644
index 0000000..85abcce
Binary files /dev/null and b/assets/vec/user_square.svg.vec differ
diff --git a/assets/vec/virtual.svg.vec b/assets/vec/virtual.svg.vec
new file mode 100644
index 0000000..13b9ec3
Binary files /dev/null and b/assets/vec/virtual.svg.vec differ
diff --git a/assets/vec/whare_house.svg.vec b/assets/vec/whare_house.svg.vec
new file mode 100644
index 0000000..1f58987
Binary files /dev/null and b/assets/vec/whare_house.svg.vec differ
diff --git a/devtools_options.yaml b/devtools_options.yaml
new file mode 100644
index 0000000..fa0b357
--- /dev/null
+++ b/devtools_options.yaml
@@ -0,0 +1,3 @@
+description: This file stores settings for Dart & Flutter DevTools.
+documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
+extensions:
diff --git a/flutter_launcher_icons.yaml b/flutter_launcher_icons.yaml
new file mode 100644
index 0000000..add0a56
--- /dev/null
+++ b/flutter_launcher_icons.yaml
@@ -0,0 +1,16 @@
+# flutter pub run flutter_launcher_icons
+flutter_launcher_icons:
+ image_path: "assets/logos/final_logo.png"
+
+ android: "launcher_icon"
+ min_sdk_android: 21 # android min sdk min:16, default 21
+ # adaptive_icon_background: "assets/icon/background.png"
+ # adaptive_icon_foreground: "assets/icon/foreground.png"
+ # adaptive_icon_monochrome: "assets/icon/monochrome.png"
+
+ ios: true
+ remove_alpha_channel_ios: true
+ # image_path_ios_dark_transparent: "assets/icon/icon_dark.png"
+ # image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png"
+ # desaturate_tinted_to_grayscale_ios: true
+
diff --git a/fonts/iranyekanregularfanum.ttf b/fonts/iranyekanregularfanum.ttf
new file mode 100644
index 0000000..72d5808
Binary files /dev/null and b/fonts/iranyekanregularfanum.ttf differ
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index 592ceee..ec97fc6 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 592ceee..c4855bf 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 0000000..e549ee2
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,43 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 504fdc3..b4221fe 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -368,7 +368,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp;
+ PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -384,7 +384,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -401,7 +401,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -416,7 +416,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -427,7 +427,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -484,7 +484,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -547,7 +547,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp;
+ PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -569,7 +569,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp;
+ PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index d36b1fa..d0d98aa 100644
--- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,122 +1 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "83.5x83.5",
- "idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
+{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
index dc9ada4..923275e 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
index 7353c41..af58e3c 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
index 797d452..88b21ad 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
index 6ed2d93..7a965d1 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
index 4cd7b00..0f491ad 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
index fe73094..236a95d 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
index 321773c..990c5bc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
index 797d452..88b21ad 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
index 502f463..36e9bad 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
index 0ec3034..8447632 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
new file mode 100644
index 0000000..e3a1019
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
new file mode 100644
index 0000000..c40c83f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
new file mode 100644
index 0000000..9d100ec
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
new file mode 100644
index 0000000..5fed9a2
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
index 0ec3034..8447632 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
index e9f5fea..c6fe7ad 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
new file mode 100644
index 0000000..8e82f3a
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
new file mode 100644
index 0000000..2efdd5c
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
index 84ac32a..dc49aba 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
index 8953cba..ac4802e 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
index 0467bf1..22e98d6 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 8479f72..14e47df 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -45,5 +45,7 @@
UIApplicationSupportsIndirectInputEvents
+NSLocationWhenInUseUsageDescription
+This app needs access to your location.
diff --git a/lib/data/model/app_info_model.dart b/lib/data/model/app_info_model.dart
new file mode 100644
index 0000000..e6eb9f9
--- /dev/null
+++ b/lib/data/model/app_info_model.dart
@@ -0,0 +1,18 @@
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'app_info_model.freezed.dart';
+part 'app_info_model.g.dart';
+
+@freezed
+abstract class AppInfoModel with _$AppInfoModel {
+ const factory AppInfoModel({String? key, String? download_link, Info? info}) = _AppInfoModel;
+
+ factory AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json);
+}
+
+@freezed
+abstract class Info with _$Info {
+ const factory Info({String? version, String? module, bool? required}) = _Info;
+
+ factory Info.fromJson(Map json) => _$InfoFromJson(json);
+}
diff --git a/lib/data/model/app_info_model.freezed.dart b/lib/data/model/app_info_model.freezed.dart
new file mode 100644
index 0000000..dc05818
--- /dev/null
+++ b/lib/data/model/app_info_model.freezed.dart
@@ -0,0 +1,576 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// coverage:ignore-file
+// ignore_for_file: type=lint
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
+
+part of 'app_info_model.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+// dart format off
+T _$identity(T value) => value;
+
+/// @nodoc
+mixin _$AppInfoModel {
+
+ String? get key; String? get download_link; Info? get info;
+/// Create a copy of AppInfoModel
+/// with the given fields replaced by the non-null parameter values.
+@JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+$AppInfoModelCopyWith get copyWith => _$AppInfoModelCopyWithImpl(this as AppInfoModel, _$identity);
+
+ /// Serializes this AppInfoModel to a JSON map.
+ Map toJson();
+
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.download_link, download_link) || other.download_link == download_link)&&(identical(other.info, info) || other.info == info));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,key,download_link,info);
+
+@override
+String toString() {
+ return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class $AppInfoModelCopyWith<$Res> {
+ factory $AppInfoModelCopyWith(AppInfoModel value, $Res Function(AppInfoModel) _then) = _$AppInfoModelCopyWithImpl;
+@useResult
+$Res call({
+ String? key, String? download_link, Info? info
+});
+
+
+$InfoCopyWith<$Res>? get info;
+
+}
+/// @nodoc
+class _$AppInfoModelCopyWithImpl<$Res>
+ implements $AppInfoModelCopyWith<$Res> {
+ _$AppInfoModelCopyWithImpl(this._self, this._then);
+
+ final AppInfoModel _self;
+ final $Res Function(AppInfoModel) _then;
+
+/// Create a copy of AppInfoModel
+/// with the given fields replaced by the non-null parameter values.
+@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) {
+ return _then(_self.copyWith(
+key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable
+as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable
+as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable
+as Info?,
+ ));
+}
+/// Create a copy of AppInfoModel
+/// with the given fields replaced by the non-null parameter values.
+@override
+@pragma('vm:prefer-inline')
+$InfoCopyWith<$Res>? get info {
+ if (_self.info == null) {
+ return null;
+ }
+
+ return $InfoCopyWith<$Res>(_self.info!, (value) {
+ return _then(_self.copyWith(info: value));
+ });
+}
+}
+
+
+/// Adds pattern-matching-related methods to [AppInfoModel].
+extension AppInfoModelPatterns on AppInfoModel {
+/// A variant of `map` that fallback to returning `orElse`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeMap(TResult Function( _AppInfoModel value)? $default,{required TResult orElse(),}){
+final _that = this;
+switch (_that) {
+case _AppInfoModel() when $default != null:
+return $default(_that);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// Callbacks receives the raw object, upcasted.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case final Subclass2 value:
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult map(TResult Function( _AppInfoModel value) $default,){
+final _that = this;
+switch (_that) {
+case _AppInfoModel():
+return $default(_that);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `map` that fallback to returning `null`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AppInfoModel value)? $default,){
+final _that = this;
+switch (_that) {
+case _AppInfoModel() when $default != null:
+return $default(_that);case _:
+ return null;
+
+}
+}
+/// A variant of `when` that fallback to an `orElse` callback.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? download_link, Info? info)? $default,{required TResult orElse(),}) {final _that = this;
+switch (_that) {
+case _AppInfoModel() when $default != null:
+return $default(_that.key,_that.download_link,_that.info);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// As opposed to `map`, this offers destructuring.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case Subclass2(:final field2):
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult when(TResult Function( String? key, String? download_link, Info? info) $default,) {final _that = this;
+switch (_that) {
+case _AppInfoModel():
+return $default(_that.key,_that.download_link,_that.info);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `when` that fallback to returning `null`
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? download_link, Info? info)? $default,) {final _that = this;
+switch (_that) {
+case _AppInfoModel() when $default != null:
+return $default(_that.key,_that.download_link,_that.info);case _:
+ return null;
+
+}
+}
+
+}
+
+/// @nodoc
+@JsonSerializable()
+
+class _AppInfoModel implements AppInfoModel {
+ const _AppInfoModel({this.key, this.download_link, this.info});
+ factory _AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json);
+
+@override final String? key;
+@override final String? download_link;
+@override final Info? info;
+
+/// Create a copy of AppInfoModel
+/// with the given fields replaced by the non-null parameter values.
+@override @JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+_$AppInfoModelCopyWith<_AppInfoModel> get copyWith => __$AppInfoModelCopyWithImpl<_AppInfoModel>(this, _$identity);
+
+@override
+Map toJson() {
+ return _$AppInfoModelToJson(this, );
+}
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.download_link, download_link) || other.download_link == download_link)&&(identical(other.info, info) || other.info == info));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,key,download_link,info);
+
+@override
+String toString() {
+ return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class _$AppInfoModelCopyWith<$Res> implements $AppInfoModelCopyWith<$Res> {
+ factory _$AppInfoModelCopyWith(_AppInfoModel value, $Res Function(_AppInfoModel) _then) = __$AppInfoModelCopyWithImpl;
+@override @useResult
+$Res call({
+ String? key, String? download_link, Info? info
+});
+
+
+@override $InfoCopyWith<$Res>? get info;
+
+}
+/// @nodoc
+class __$AppInfoModelCopyWithImpl<$Res>
+ implements _$AppInfoModelCopyWith<$Res> {
+ __$AppInfoModelCopyWithImpl(this._self, this._then);
+
+ final _AppInfoModel _self;
+ final $Res Function(_AppInfoModel) _then;
+
+/// Create a copy of AppInfoModel
+/// with the given fields replaced by the non-null parameter values.
+@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) {
+ return _then(_AppInfoModel(
+key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable
+as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable
+as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable
+as Info?,
+ ));
+}
+
+/// Create a copy of AppInfoModel
+/// with the given fields replaced by the non-null parameter values.
+@override
+@pragma('vm:prefer-inline')
+$InfoCopyWith<$Res>? get info {
+ if (_self.info == null) {
+ return null;
+ }
+
+ return $InfoCopyWith<$Res>(_self.info!, (value) {
+ return _then(_self.copyWith(info: value));
+ });
+}
+}
+
+
+/// @nodoc
+mixin _$Info {
+
+ String? get version; String? get module; bool? get required;
+/// Create a copy of Info
+/// with the given fields replaced by the non-null parameter values.
+@JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+$InfoCopyWith get copyWith => _$InfoCopyWithImpl(this as Info, _$identity);
+
+ /// Serializes this Info to a JSON map.
+ Map toJson();
+
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,version,module,required);
+
+@override
+String toString() {
+ return 'Info(version: $version, module: $module, required: $required)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class $InfoCopyWith<$Res> {
+ factory $InfoCopyWith(Info value, $Res Function(Info) _then) = _$InfoCopyWithImpl;
+@useResult
+$Res call({
+ String? version, String? module, bool? required
+});
+
+
+
+
+}
+/// @nodoc
+class _$InfoCopyWithImpl<$Res>
+ implements $InfoCopyWith<$Res> {
+ _$InfoCopyWithImpl(this._self, this._then);
+
+ final Info _self;
+ final $Res Function(Info) _then;
+
+/// Create a copy of Info
+/// with the given fields replaced by the non-null parameter values.
+@pragma('vm:prefer-inline') @override $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) {
+ return _then(_self.copyWith(
+version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable
+as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable
+as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable
+as bool?,
+ ));
+}
+
+}
+
+
+/// Adds pattern-matching-related methods to [Info].
+extension InfoPatterns on Info {
+/// A variant of `map` that fallback to returning `orElse`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeMap(TResult Function( _Info value)? $default,{required TResult orElse(),}){
+final _that = this;
+switch (_that) {
+case _Info() when $default != null:
+return $default(_that);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// Callbacks receives the raw object, upcasted.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case final Subclass2 value:
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult map(TResult Function( _Info value) $default,){
+final _that = this;
+switch (_that) {
+case _Info():
+return $default(_that);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `map` that fallback to returning `null`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Info value)? $default,){
+final _that = this;
+switch (_that) {
+case _Info() when $default != null:
+return $default(_that);case _:
+ return null;
+
+}
+}
+/// A variant of `when` that fallback to an `orElse` callback.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeWhen(TResult Function( String? version, String? module, bool? required)? $default,{required TResult orElse(),}) {final _that = this;
+switch (_that) {
+case _Info() when $default != null:
+return $default(_that.version,_that.module,_that.required);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// As opposed to `map`, this offers destructuring.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case Subclass2(:final field2):
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult when(TResult Function( String? version, String? module, bool? required) $default,) {final _that = this;
+switch (_that) {
+case _Info():
+return $default(_that.version,_that.module,_that.required);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `when` that fallback to returning `null`
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? version, String? module, bool? required)? $default,) {final _that = this;
+switch (_that) {
+case _Info() when $default != null:
+return $default(_that.version,_that.module,_that.required);case _:
+ return null;
+
+}
+}
+
+}
+
+/// @nodoc
+@JsonSerializable()
+
+class _Info implements Info {
+ const _Info({this.version, this.module, this.required});
+ factory _Info.fromJson(Map json) => _$InfoFromJson(json);
+
+@override final String? version;
+@override final String? module;
+@override final bool? required;
+
+/// Create a copy of Info
+/// with the given fields replaced by the non-null parameter values.
+@override @JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+_$InfoCopyWith<_Info> get copyWith => __$InfoCopyWithImpl<_Info>(this, _$identity);
+
+@override
+Map toJson() {
+ return _$InfoToJson(this, );
+}
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,version,module,required);
+
+@override
+String toString() {
+ return 'Info(version: $version, module: $module, required: $required)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class _$InfoCopyWith<$Res> implements $InfoCopyWith<$Res> {
+ factory _$InfoCopyWith(_Info value, $Res Function(_Info) _then) = __$InfoCopyWithImpl;
+@override @useResult
+$Res call({
+ String? version, String? module, bool? required
+});
+
+
+
+
+}
+/// @nodoc
+class __$InfoCopyWithImpl<$Res>
+ implements _$InfoCopyWith<$Res> {
+ __$InfoCopyWithImpl(this._self, this._then);
+
+ final _Info _self;
+ final $Res Function(_Info) _then;
+
+/// Create a copy of Info
+/// with the given fields replaced by the non-null parameter values.
+@override @pragma('vm:prefer-inline') $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) {
+ return _then(_Info(
+version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable
+as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable
+as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable
+as bool?,
+ ));
+}
+
+
+}
+
+// dart format on
diff --git a/lib/data/model/app_info_model.g.dart b/lib/data/model/app_info_model.g.dart
new file mode 100644
index 0000000..90cd6a5
--- /dev/null
+++ b/lib/data/model/app_info_model.g.dart
@@ -0,0 +1,35 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'app_info_model.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+_AppInfoModel _$AppInfoModelFromJson(Map json) =>
+ _AppInfoModel(
+ key: json['key'] as String?,
+ download_link: json['download_link'] as String?,
+ info: json['info'] == null
+ ? null
+ : Info.fromJson(json['info'] as Map),
+ );
+
+Map _$AppInfoModelToJson(_AppInfoModel instance) =>
+ {
+ 'key': instance.key,
+ 'download_link': instance.download_link,
+ 'info': instance.info,
+ };
+
+_Info _$InfoFromJson(Map json) => _Info(
+ version: json['version'] as String?,
+ module: json['module'] as String?,
+ required: json['required'] as bool?,
+);
+
+Map _$InfoToJson(_Info instance) => {
+ 'version': instance.version,
+ 'module': instance.module,
+ 'required': instance.required,
+};
diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart
new file mode 100644
index 0000000..9a5a287
--- /dev/null
+++ b/lib/infrastructure/di/di.dart
@@ -0,0 +1,7 @@
+import 'package:rasadyar_core/core.dart';
+
+final di = GetIt.instance;
+
+Future setupPreInjection() async {
+ await setupAllCoreProvider();
+}
diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart
new file mode 100644
index 0000000..6438add
--- /dev/null
+++ b/lib/infrastructure/service/app_navigation_observer.dart
@@ -0,0 +1,48 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_chicken/chicken.dart';
+import 'package:rasadyar_chicken/data/di/chicken_di.dart';
+import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_inspection/injection/inspection_di.dart';
+import 'package:rasadyar_inspection/inspection.dart';
+
+class CustomNavigationObserver extends NavigatorObserver {
+ bool _isWorkDone = false;
+
+ void setInjectionDone() {
+ _isWorkDone = true;
+ }
+
+ @override
+ void didPush(Route route, Route? previousRoute) async {
+ super.didPush(route, previousRoute);
+ final routeName = route.settings.name;
+ if (!_isWorkDone &&( routeName == ChickenRoutes.init || routeName == ChickenRoutes.auth)) {
+ _isWorkDone = true;
+ await setupChickenDI();
+ } else if (!_isWorkDone &&
+ (routeName == InspectionRoutes.init || routeName == InspectionRoutes.auth)) {
+ _isWorkDone = true;
+
+ await setupInspectionDI();
+ }
+ tLog('CustomNavigationObserver: didPush - $routeName');
+ }
+
+ @override
+ void didReplace({Route? newRoute, Route? oldRoute}) {
+ super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
+ tLog('CustomNavigationObserver: didReplace - ${newRoute?.settings.name}');
+ }
+
+ @override
+ void didPop(Route route, Route? previousRoute) {
+ super.didPop(route, previousRoute);
+ tLog('CustomNavigationObserver: didPop - ${route.settings.name}');
+ }
+
+ @override
+ void didRemove(Route route, Route? previousRoute) {
+ super.didRemove(route, previousRoute);
+ tLog('CustomNavigationObserver: didRemove - ${route.settings.name}');
+ }
+}
diff --git a/lib/infrastructure/service/token_storage_service.dart b/lib/infrastructure/service/token_storage_service.dart
new file mode 100644
index 0000000..e69de29
diff --git a/lib/main.dart b/lib/main.dart
index 7b7f5b6..09db360 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,122 +1,73 @@
import 'package:flutter/material.dart';
+import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart';
+import 'package:rasadyar_app/presentation/routes/app_pages.dart';
+import 'package:rasadyar_core/core.dart';
+import 'infrastructure/di/di.dart';
+import 'presentation/routes/auth_route_resolver_impl.dart';
-void main() {
- runApp(const MyApp());
+
+Future main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+
+ await setupPreInjection();
+ Get.put(TokenStorageService());
+ await Get.find().init();
+ Get.put(AppAuthRouteResolver());
+ Get.put(AuthMiddleware());
+
+ runApp(MyApp());
+
+ // runApp(DevicePreview(builder: (context) => ForDevicePreview(),));
}
+/*class ForDevicePreview extends StatelessWidget {
+ const ForDevicePreview({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return GetMaterialApp(
+ useInheritedMediaQuery: true,
+ locale: DevicePreview.locale(context),
+ builder: DevicePreview.appBuilder,
+ title: 'رصدیار',
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal),
+ ),
+ initialRoute: AppPages.initRoutes,
+ initialBinding: BindingsBuilder.put(() => UserService()),
+ getPages: AppPages.pages,
+ );
+ }
+}*/
+
class MyApp extends StatelessWidget {
const MyApp({super.key});
- // This widget is the root of your application.
@override
Widget build(BuildContext context) {
- return MaterialApp(
- title: 'Flutter Demo',
- theme: ThemeData(
- // This is the theme of your application.
- //
- // TRY THIS: Try running your application with "flutter run". You'll see
- // the application has a purple toolbar. Then, without quitting the app,
- // try changing the seedColor in the colorScheme below to Colors.green
- // and then invoke "hot reload" (save your changes or press the "hot
- // reload" button in a Flutter-supported IDE, or press "r" if you used
- // the command line to start the app).
- //
- // Notice that the counter didn't reset back to zero; the application
- // state is not lost during the reload. To reset the state, use hot
- // restart instead.
- //
- // This works for code too, not just values: Most code changes can be
- // tested with just a hot reload.
- colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
- ),
- home: const MyHomePage(title: 'Flutter Demo Home Page'),
- );
- }
-}
-
-class MyHomePage extends StatefulWidget {
- const MyHomePage({super.key, required this.title});
-
- // This widget is the home page of your application. It is stateful, meaning
- // that it has a State object (defined below) that contains fields that affect
- // how it looks.
-
- // This class is the configuration for the state. It holds the values (in this
- // case the title) provided by the parent (in this case the App widget) and
- // used by the build method of the State. Fields in a Widget subclass are
- // always marked "final".
-
- final String title;
-
- @override
- State createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State {
- int _counter = 0;
-
- void _incrementCounter() {
- setState(() {
- // This call to setState tells the Flutter framework that something has
- // changed in this State, which causes it to rerun the build method below
- // so that the display can reflect the updated values. If we changed
- // _counter without calling setState(), then the build method would not be
- // called again, and so nothing would appear to happen.
- _counter++;
- });
- }
-
- @override
- Widget build(BuildContext context) {
- // This method is rerun every time setState is called, for instance as done
- // by the _incrementCounter method above.
- //
- // The Flutter framework has been optimized to make rerunning build methods
- // fast, so that you can just rebuild anything that needs updating rather
- // than having to individually change instances of widgets.
- return Scaffold(
- appBar: AppBar(
- // TRY THIS: Try changing the color here to a specific color (to
- // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
- // change color while the other colors stay the same.
- backgroundColor: Theme.of(context).colorScheme.inversePrimary,
- // Here we take the value from the MyHomePage object that was created by
- // the App.build method, and use it to set our appbar title.
- title: Text(widget.title),
- ),
- body: Center(
- // Center is a layout widget. It takes a single child and positions it
- // in the middle of the parent.
- child: Column(
- // Column is also a layout widget. It takes a list of children and
- // arranges them vertically. By default, it sizes itself to fit its
- // children horizontally, and tries to be as tall as its parent.
- //
- // Column has various properties to control how it sizes itself and
- // how it positions its children. Here we use mainAxisAlignment to
- // center the children vertically; the main axis here is the vertical
- // axis because Columns are vertical (the cross axis would be
- // horizontal).
- //
- // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint"
- // action in the IDE, or press "p" in the console), to see the
- // wireframe for each widget.
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- const Text('You have pushed the button this many times:'),
- Text(
- '$_counter',
- style: Theme.of(context).textTheme.headlineMedium,
- ),
- ],
+ return ScreenUtilInit(
+ designSize: const Size(412, 917),
+ minTextAdapt: true,
+ splitScreenMode: true,
+ child: GetMaterialApp(
+ title: 'رصدیار',
+ theme: ThemeData(
+ fontFamily: 'yekan',
+ colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal),
),
+ initialRoute: AppPages.initRoutes,
+ getPages: AppPages.pages,
+ locale: const Locale("fa", "IR"),
+ supportedLocales: const [Locale("fa", "IR")],
+ navigatorObservers: [CustomNavigationObserver()],
+ localizationsDelegates: [
+ PersianMaterialLocalizations.delegate,
+ PersianCupertinoLocalizations.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ],
),
- floatingActionButton: FloatingActionButton(
- onPressed: _incrementCounter,
- tooltip: 'Increment',
- child: const Icon(Icons.add),
- ), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
diff --git a/lib/presentation/pages/modules/logic.dart b/lib/presentation/pages/modules/logic.dart
new file mode 100644
index 0000000..e73eefe
--- /dev/null
+++ b/lib/presentation/pages/modules/logic.dart
@@ -0,0 +1,28 @@
+import 'package:rasadyar_core/core.dart';
+
+class ModulesLogic extends GetxController {
+ TokenStorageService tokenService = Get.find();
+
+ List moduleList = [
+ ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection),
+// ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks),
+ ModuleModel(title: 'مرغ', icon: Assets.icons.liveStock.path, module: Module.chicken),
+ ];
+
+ RxnInt selectedIndex = RxnInt(null);
+
+ @override
+ void onReady() {
+ super.onReady();
+ }
+
+ @override
+ void onClose() {
+ super.onClose();
+ }
+
+ void saveModule(Module module) {
+ tokenService.saveModule(module);
+ tokenService.appModule.value = module;
+ }
+}
diff --git a/lib/presentation/pages/modules/view.dart b/lib/presentation/pages/modules/view.dart
new file mode 100644
index 0000000..880050a
--- /dev/null
+++ b/lib/presentation/pages/modules/view.dart
@@ -0,0 +1,55 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_chicken/chicken.dart';
+import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_inspection/inspection.dart';
+
+import 'logic.dart';
+
+class ModulesPage extends GetView {
+ const ModulesPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text('انتخاب سامانه', style: AppFonts.yekan18.copyWith(color: Colors.white)),
+ centerTitle: true,
+ backgroundColor: AppColor.blueNormal,
+ ),
+ body: GridView.builder(
+ padding: EdgeInsets.symmetric(horizontal: 10, vertical: 20),
+
+ itemBuilder: (context, index) {
+ final module = controller.moduleList[index];
+ return CardIcon(
+ title: module.title,
+ icon: module.icon,
+ onTap: () {
+ controller.selectedIndex.value = index;
+ controller.saveModule(module.module);
+
+ // Navigate to the appropriate route based on the selected module
+ switch (module.module) {
+ case Module.inspection:
+ Get.toNamed(InspectionRoutes.init);
+ break;
+ case Module.liveStocks:
+ //TODO: Implement liveStocks module navigation
+ case Module.chicken:
+ Get.toNamed(ChickenRoutes.init);
+ break;
+ }
+ },
+ );
+ },
+ gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 3,
+ mainAxisSpacing: 10,
+ crossAxisSpacing: 10,
+ ),
+ physics: BouncingScrollPhysics(),
+ itemCount: controller.moduleList.length,
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart
new file mode 100644
index 0000000..a9f1a8d
--- /dev/null
+++ b/lib/presentation/pages/splash/logic.dart
@@ -0,0 +1,242 @@
+import 'dart:io';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:rasadyar_app/data/model/app_info_model.dart';
+import 'package:rasadyar_app/presentation/routes/app_pages.dart';
+import 'package:rasadyar_core/core.dart';
+
+class SplashLogic extends GetxController with GetTickerProviderStateMixin {
+ late final AnimationController scaleController;
+ late final AnimationController rotateController;
+ Rxn> scaleAnimation = Rxn();
+ Rxn> rotationAnimation = Rxn();
+ RxBool hasUpdated = false.obs;
+ RxBool onUpdateDownload = false.obs;
+ RxDouble percent = 0.0.obs;
+ final RxnString _updateFilePath = RxnString();
+ final platform = MethodChannel('apk_installer');
+ final Dio _dio = Dio();
+ var tokenService = Get.find();
+ AppInfoModel? appInfoModel;
+
+ @override
+ void onInit() {
+ super.onInit();
+ scaleController = AnimationController(
+ vsync: this,
+ duration: const Duration(milliseconds: 1500),
+ );
+
+ rotateController = AnimationController(
+ vsync: this,
+ duration: const Duration(milliseconds: 8000),
+ );
+
+ scaleAnimation.value = Tween(begin: 0.8, end: 1.2).animate(scaleController);
+
+ rotationAnimation.value = Tween(begin: 0.0, end: 1).animate(rotateController);
+
+ rotateController.forward();
+ rotateController.addStatusListener((status) {
+ if (status == AnimationStatus.completed) {
+ rotateController.repeat();
+ } else if (status == AnimationStatus.dismissed) {
+ rotateController.forward();
+ }
+ });
+
+ scaleController.forward();
+ scaleController.addStatusListener((status) {
+ if (status == AnimationStatus.completed) {
+ scaleController.reverse();
+ } else if (status == AnimationStatus.dismissed) {
+ scaleController.forward();
+ }
+ });
+
+ hasUpdated.listen((data) {
+ if (data) {
+ requiredUpdateDialog(
+ onConfirm: () async {
+ await fileDownload();
+ },
+ );
+ } else if (!data && Get.isDialogOpen == true) {
+ Get.back();
+ }
+ });
+ onUpdateDownload.listen((data) {
+ hasUpdated.value = false;
+ if (data) {
+ Get.bottomSheet(
+ isDismissible: false,
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ Container(
+ height: 170,
+ decoration: const BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)),
+ ),
+ padding: const EdgeInsets.all(16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ spacing: 8,
+ children: [
+ const Text('در حال دانلود بروزرسانی برنامه...'),
+ Obx(
+ () => Row(
+ spacing: 8,
+ children: [
+ Expanded(
+ child: LinearProgressIndicator(
+ value: percent.value,
+ color: AppColor.greenNormal,
+ minHeight: 4,
+ ),
+ ),
+ SizedBox(
+ width: 55.w,
+ child: Text(
+ '${(percent.value * 100).toStringAsFixed(2)}%',
+ textAlign: TextAlign.center,
+ ),
+ ),
+ ],
+ ),
+ ),
+
+ Row(
+ spacing: 8,
+ children: [
+ Expanded(
+ child: ObxValue((data) {
+ return RElevated(
+ backgroundColor: AppColor.greenNormal,
+ height: 40.h,
+ onPressed: data.value != null
+ ? () {
+ installApk();
+ Get.back();
+ }
+ : null,
+ text: 'نصب',
+ );
+ }, _updateFilePath),
+ ),
+ Expanded(
+ child: ROutlinedElevated(
+ borderColor: AppColor.error,
+ text: 'خروج',
+ onPressed: () async {
+ exit(0);
+ },
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+ });
+ }
+
+ @override
+ void onReady() {
+ super.onReady();
+
+ Future.delayed(const Duration(milliseconds: 250), () async {
+ try {
+ final isUpdateNeeded = await checkVersion();
+ if (isUpdateNeeded) return;
+ tokenService.getModule();
+ final module = tokenService.appModule.value;
+ final target = getTargetPage(module);
+ Get.offAndToNamed(target);
+ } catch (e, st) {
+ debugPrint("onReady error: $e\n$st");
+ }
+ });
+ }
+
+ @override
+ void onClose() {
+ rotateController.dispose();
+ scaleController.dispose();
+ super.onClose();
+ }
+
+ Future checkVersion() async {
+ try {
+ final info = await PackageInfo.fromPlatform();
+ int version = info.version.versionNumber;
+ var res = await _dio.get("https://rsibackend.rasadyaar.ir/app/apk-info/");
+
+ appInfoModel = AppInfoModel.fromJson(res.data);
+
+ if ((appInfoModel?.info?.version?.versionNumber ?? 0) > version) {
+ hasUpdated.value = !hasUpdated.value;
+ return true;
+ }
+ return false;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ Future fileDownload() async {
+ onUpdateDownload.value = true;
+ final dir = await getApplicationDocumentsDirectory();
+ final filePath = "${dir.path}/rasadyar.apk";
+ final file = File(filePath);
+ if (await file.exists()) {
+ await file.delete();
+ }
+ int attempts = 0;
+ int retryCount = 4;
+ bool success = false;
+
+ while (attempts < retryCount && !success) {
+ try {
+ await _dio.download(
+ appInfoModel?.download_link ?? '',
+ filePath,
+ onReceiveProgress: (count, total) {
+ if (total != -1 && total > 0) {
+ percent.value = count / total;
+ }
+ },
+ );
+ success = true;
+ } on DioException catch (e) {
+ attempts++;
+ percent.value = 0.0;
+ if (attempts >= retryCount) {
+ eLog("Download failed after $attempts attempts: ${e.message}");
+ } else {
+ await Future.delayed(const Duration(milliseconds: 1200));
+ }
+ }
+ }
+
+ if (success) {
+ _updateFilePath.value = filePath;
+ }
+
+ onUpdateDownload.value = false;
+ }
+
+ Future installApk() async {
+ try {
+ eLog(_updateFilePath.value);
+
+ final dir = await getApplicationDocumentsDirectory();
+ await platform.invokeMethod('apk_installer', {'appPath': _updateFilePath.value});
+ } catch (e) {
+ print("خطا در نصب: $e");
+ }
+ }
+}
diff --git a/lib/presentation/pages/splash/view.dart b/lib/presentation/pages/splash/view.dart
new file mode 100644
index 0000000..140ed32
--- /dev/null
+++ b/lib/presentation/pages/splash/view.dart
@@ -0,0 +1,47 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_core/core.dart';
+
+
+import 'logic.dart';
+
+class SplashPage extends GetView {
+ const SplashPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: AppColor.blueDarker,
+ body: Center(
+ child: Stack(
+ alignment: Alignment.center,
+ children: [
+
+ ObxValue((data) {
+ return ScaleTransition(
+ scale: data.value!,
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 1),
+ child: Assets.images.innerSplash.image(
+ width: 190,
+ height: 190,
+ )
+ ),
+ );
+ }, controller.scaleAnimation),
+
+ ObxValue((data) {
+ return RotationTransition(
+ turns: data.value!,
+
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 1),
+ child: Assets.images.outterSplash.image()
+ ),
+ );
+ }, controller.rotationAnimation),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart
new file mode 100644
index 0000000..bacf390
--- /dev/null
+++ b/lib/presentation/pages/system_design/system_design.dart
@@ -0,0 +1,257 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_core/core.dart';
+
+
+class SystemDesignPage extends StatefulWidget {
+ const SystemDesignPage({super.key});
+
+ @override
+ State createState() => _SystemDesignPageState();
+}
+
+class _SystemDesignPageState extends State {
+ List _isOpen = [false, false, false, false, false, false];
+
+ void _handleAdd() {
+ print("Add FAB pressed");
+ }
+
+ void _handleEdit() {
+ print("Edit FAB pressed");
+ }
+
+ void _handleDelete() {
+ print("Delete FAB pressed");
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: Text("System design"), centerTitle: true),
+ body: SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: ExpansionPanelList(
+ expansionCallback: (panelIndex, isExpanded) {
+ setState(() {
+ _isOpen[panelIndex] = isExpanded;
+ });
+ },
+ children: [
+ buttonWidget(),
+ fabWidget(),
+ outlinedFabWidget(),
+ paginationWidget(),
+ tabWidget(),
+ inputsWidget(),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+
+ ExpansionPanel inputsWidget() {
+ return ExpansionPanel(
+ isExpanded: _isOpen[5],
+ headerBuilder: (context, isExpanded) {
+ return ListTile(
+ title: Text(
+ "inputs",
+ style: AppFonts.yekan20.copyWith(color: Colors.red),
+ ),
+ );
+ },
+ body: Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: Column(
+ spacing: 14,
+ children: [
+ RTextField(
+ controller: TextEditingController(),
+ hintText: 'حجم کشتار را در روز به قطعه وارد کنید',
+ hintStyle: AppFonts.yekan13,
+ ),
+ RTextField(
+ controller: TextEditingController(),
+ label: 'تلفن مرغداری',
+ labelStyle: AppFonts.yekan10,
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+
+ ExpansionPanel tabWidget() {
+ return ExpansionPanel(
+ isExpanded: _isOpen[4],
+ headerBuilder: (context, isExpanded) {
+ return ListTile(
+ title: Text(
+ "tab",
+ style: AppFonts.yekan20.copyWith(color: Colors.red),
+ ),
+ );
+ },
+ body: Column(
+ spacing: 14,
+ children: [
+ CupertinoSegmentedControlDemo(),
+ CupertinoSegmentedControlDemo2(),
+ ],
+ ),
+ );
+ }
+
+ ExpansionPanel paginationWidget() {
+ return ExpansionPanel(
+ isExpanded: _isOpen[3],
+ headerBuilder: (context, isExpanded) {
+ return ListTile(
+ title: Text(
+ "پیجینیشن",
+ style: AppFonts.yekan20.copyWith(color: Colors.red),
+ ),
+ );
+ },
+ body: Column(spacing: 14, children: [RShowMore(), PaginationFromUntil()]),
+ );
+ }
+
+ ExpansionPanel outlinedFabWidget() {
+ return ExpansionPanel(
+ isExpanded: _isOpen[2],
+ headerBuilder: (context, isExpanded) {
+ return ListTile(
+ title: Text(
+ "Outlined Fab ",
+ style: AppFonts.yekan20.copyWith(color: Colors.green),
+ ),
+ );
+ },
+ body: Column(
+ spacing: 14,
+ children: [
+ Row(),
+/*
+ RFabOutlined.smallAdd(onPressed: () {}),
+ RFabOutlined.smallAdd(onPressed: null),
+
+ RFabOutlined.smallAddNoBorder(onPressed: () {}),
+ RFabOutlined.smallAddNoBorder(onPressed: null),
+
+ RFabOutlined.add(onPressed: () {}),
+ RFabOutlined.add(onPressed: null),
+
+ RFabOutlined.addNoBorder(onPressed: () {}),
+ RFabOutlined.addNoBorder(onPressed: null),*/
+ ],
+ ),
+ );
+ }
+
+ ExpansionPanel fabWidget() {
+ return ExpansionPanel(
+ isExpanded: _isOpen[1],
+ headerBuilder: (context, isExpanded) {
+ return ListTile(
+ title: Text(
+ "Fab",
+ style: AppFonts.yekan20.copyWith(color: Colors.green),
+ ),
+ );
+ },
+ body: Column(
+ spacing: 14,
+ children: [
+ Row(),
+
+ /* RFab.smallAdd(onPressed: () {}),
+ RFab.smallAdd(onPressed: null),
+
+ RFab.add(onPressed: () {}),
+ RFab.add(onPressed: null),
+
+ RFab.smallEdit(onPressed: null),
+ RFab.smallEdit(onPressed: () {}),
+
+ RFab.edit(onPressed: () {}),
+ RFab.edit(onPressed: null),
+
+ RFab.smallDelete(onPressed: () {}),
+ RFab.smallDelete(onPressed: null),
+
+ RFab.delete(onPressed: () {}),
+ RFab.delete(onPressed: null),
+
+ RFab.smallAction(onPressed: () {}),
+ RFab.smallAction(onPressed: null),
+
+ RFab.action(onPressed: () {}),
+ RFab.action(onPressed: null),
+
+ RFab.smallFilter(onPressed: () {}),
+ RFab.smallFilter(onPressed: null),
+
+ RFab.filter(onPressed: () {}),
+ RFab.filter(onPressed: null),
+
+ RFab.smallDownload(onPressed: () {}),
+ RFab.smallDownload(onPressed: null),
+
+ RFab.download(onPressed: () {}),
+ RFab.download(onPressed: null),
+
+ RFab.smallExcel(onPressed: () {}),
+ RFab.smallExcel(onPressed: null),
+
+ RFab.excel(onPressed: () {}),
+ RFab.excel(onPressed: null),
+
+ RFab.smallBack(onPressed: () {}),
+ RFab.smallBack(onPressed: null),
+
+ RFab.back(onPressed: () {}),
+ RFab.back(onPressed: null),*/
+ ],
+ ),
+ );
+ }
+
+ ExpansionPanel buttonWidget() {
+ return ExpansionPanel(
+ isExpanded: _isOpen[0],
+ headerBuilder: (context, isExpanded) {
+ return ListTile(
+ title: Text(
+ "دکمه ها",
+ style: AppFonts.yekan20.copyWith(color: Colors.green),
+ ),
+ );
+ },
+ body: Column(
+ spacing: 14,
+ children: [
+ Row(),
+
+ RElevated(text: 'ثبت', onPressed: () {}),
+
+ RElevated(text: 'ثبت', onPressed: null),
+
+ ROutlinedElevated(text: 'ثبت', onPressed: () {}),
+ ROutlinedElevated(
+ text: 'ثبتwwww',
+ onPressed: () {},
+ backgroundColor: AppColor.blueNormal.disabledColor,
+ pressedBackgroundColor: AppColor.blueNormal,
+ ),
+ ROutlinedElevated(text: 'ثبت', onPressed: null),
+
+ RTextButton(text: 'ثبت', onPressed: () {}),
+ RTextButton(text: 'ثبت', onPressed: null),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart
new file mode 100644
index 0000000..44675f4
--- /dev/null
+++ b/lib/presentation/routes/app_pages.dart
@@ -0,0 +1,52 @@
+import 'package:rasadyar_app/presentation/pages/modules/logic.dart';
+import 'package:rasadyar_app/presentation/pages/modules/view.dart';
+import 'package:rasadyar_app/presentation/pages/splash/logic.dart';
+import 'package:rasadyar_app/presentation/pages/splash/view.dart';
+import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart';
+import 'package:rasadyar_chicken/chicken.dart';
+import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_inspection/inspection.dart';
+import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
+
+part 'app_paths.dart';
+
+sealed class AppPages {
+ AppPages._();
+
+ static const String initRoutes = AppPaths.splash;
+ static const String initDesignSystem = AppPaths.systemDesignPage;
+
+ static List pages = [
+ GetPage(name: AppPaths.systemDesignPage, page: () => SystemDesignPage()),
+
+ GetPage(
+ name: AppPaths.moduleList,
+ page: () => ModulesPage(),
+ binding: BindingsBuilder.put(() => ModulesLogic()),
+ ),
+
+ GetPage(
+ name: AppPaths.splash,
+ page: () => SplashPage(),
+ binding: BindingsBuilder.put(() => SplashLogic()),
+ ),
+
+ ...InspectionPages.pages,
+
+ ...LiveStockPages.pages,
+ ...ChickenPages.pages,
+ ];
+}
+
+String getTargetPage(Module? value) {
+ switch (value) {
+ case Module.inspection:
+ return InspectionRoutes.init;
+ case Module.liveStocks:
+ return LiveStockRoutes.init;
+ case Module.chicken:
+ return ChickenRoutes.init;
+ default:
+ return AppPaths.moduleList;
+ }
+}
diff --git a/lib/presentation/routes/app_paths.dart b/lib/presentation/routes/app_paths.dart
new file mode 100644
index 0000000..2003dcd
--- /dev/null
+++ b/lib/presentation/routes/app_paths.dart
@@ -0,0 +1,9 @@
+part of 'app_pages.dart';
+
+sealed class AppPaths {
+ AppPaths._();
+
+ static const String splash = '/splash';
+ static const String moduleList = '/moduleList';
+ static const String systemDesignPage = '/systemDesignPage';
+}
diff --git a/lib/presentation/routes/auth_route_resolver_impl.dart b/lib/presentation/routes/auth_route_resolver_impl.dart
new file mode 100644
index 0000000..c932919
--- /dev/null
+++ b/lib/presentation/routes/auth_route_resolver_impl.dart
@@ -0,0 +1,24 @@
+import 'package:rasadyar_app/presentation/routes/app_pages.dart';
+import 'package:rasadyar_chicken/presentation/routes/routes.dart';
+import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_inspection/inspection.dart';
+import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
+
+class AppAuthRouteResolver implements AuthRouteResolver {
+ @override
+ String getAuthRouteForModule(Module module) {
+ switch (module) {
+ case Module.inspection:
+ return InspectionRoutes.auth;
+ case Module.liveStocks:
+ return LiveStockRoutes.auth;
+ case Module.chicken:
+ return ChickenRoutes.auth;
+ default:
+ throw UnimplementedError('No auth route for module: $module');
+ }
+ }
+
+ @override
+ String getFallbackRoute() => AppPaths.moduleList;
+}
diff --git a/packages/chicken/.gitignore b/packages/chicken/.gitignore
new file mode 100644
index 0000000..3cceda5
--- /dev/null
+++ b/packages/chicken/.gitignore
@@ -0,0 +1,7 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
+
+# Avoid committing pubspec.lock for library packages; see
+# https://dart.dev/guides/libraries/private-files#pubspeclock.
+pubspec.lock
diff --git a/packages/chicken/CHANGELOG.md b/packages/chicken/CHANGELOG.md
new file mode 100644
index 0000000..effe43c
--- /dev/null
+++ b/packages/chicken/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/packages/chicken/README.md b/packages/chicken/README.md
new file mode 100644
index 0000000..8831761
--- /dev/null
+++ b/packages/chicken/README.md
@@ -0,0 +1,39 @@
+
+
+TODO: Put a short description of the package here that helps potential users
+know whether this package might be useful for them.
+
+## Features
+
+TODO: List what your package can do. Maybe include images, gifs, or videos.
+
+## Getting started
+
+TODO: List prerequisites and provide or point to information on how to
+start using the package.
+
+## Usage
+
+TODO: Include short and useful examples for package users. Add longer examples
+to `/example` folder.
+
+```dart
+const like = 'sample';
+```
+
+## Additional information
+
+TODO: Tell users more about the package: where to find more information, how to
+contribute to the package, how to file issues, what response they can expect
+from the package authors, and more.
diff --git a/packages/chicken/analysis_options.yaml b/packages/chicken/analysis_options.yaml
new file mode 100644
index 0000000..dee8927
--- /dev/null
+++ b/packages/chicken/analysis_options.yaml
@@ -0,0 +1,30 @@
+# This file configures the static analysis results for your project (errors,
+# warnings, and lints).
+#
+# This enables the 'recommended' set of lints from `package:lints`.
+# This set helps identify many issues that may lead to problems when running
+# or consuming Dart code, and enforces writing Dart using a single, idiomatic
+# style and format.
+#
+# If you want a smaller set of lints you can change this to specify
+# 'package:lints/core.yaml'. These are just the most critical lints
+# (the recommended set includes the core lints).
+# The core lints are also what is used by pub.dev for scoring packages.
+
+include: package:lints/recommended.yaml
+
+# Uncomment the following section to specify additional rules.
+
+# linter:
+# rules:
+# - camel_case_types
+
+# analyzer:
+# exclude:
+# - path/to/excluded/files/**
+
+# For more information about the core and recommended set of lints, see
+# https://dart.dev/go/core-lints
+
+# For additional information about configuring this file, see
+# https://dart.dev/guides/language/analysis-options
diff --git a/packages/chicken/build.yaml b/packages/chicken/build.yaml
new file mode 100644
index 0000000..840029b
--- /dev/null
+++ b/packages/chicken/build.yaml
@@ -0,0 +1,6 @@
+targets:
+ $default:
+ builders:
+ json_serializable:
+ options:
+ field_rename: snake
\ No newline at end of file
diff --git a/packages/chicken/lib/chicken.dart b/packages/chicken/lib/chicken.dart
new file mode 100644
index 0000000..7f7bfe9
--- /dev/null
+++ b/packages/chicken/lib/chicken.dart
@@ -0,0 +1,9 @@
+/// Support for doing something awesome.
+///
+/// More dartdocs go here.
+library;
+
+export 'presentation/routes/pages.dart';
+export 'presentation/routes/routes.dart';
+export 'presentation/pages/root/view.dart';
+export 'presentation/pages/root/logic.dart';
diff --git a/packages/chicken/lib/data/common/constant.dart b/packages/chicken/lib/data/common/constant.dart
new file mode 100644
index 0000000..c0b0982
--- /dev/null
+++ b/packages/chicken/lib/data/common/constant.dart
@@ -0,0 +1,14 @@
+enum ApiEnvironment {
+ dam(url: 'https://api.dam.rasadyar.net/');
+
+ const ApiEnvironment({required this.url});
+
+ final String url;
+
+ String get baseUrl {
+ switch (this) {
+ case ApiEnvironment.dam:
+ return url;
+ }
+ }
+}
diff --git a/packages/chicken/lib/data/common/dio_error_handler.dart b/packages/chicken/lib/data/common/dio_error_handler.dart
new file mode 100644
index 0000000..57f29bc
--- /dev/null
+++ b/packages/chicken/lib/data/common/dio_error_handler.dart
@@ -0,0 +1,58 @@
+import 'package:flutter/material.dart';
+import 'package:rasadyar_core/core.dart';
+
+class DioErrorHandler {
+ void handle(DioException error) {
+ switch (error.response?.statusCode) {
+ case 401:
+ _handleGeneric(error);
+ break;
+ case 403:
+ _handleGeneric(error);
+ break;
+
+ case 410:
+ _handle410();
+ break;
+ default:
+ _handleGeneric(error);
+ }
+ }
+
+ //wrong password/user name => "detail": "No active account found with the given credentials" - 401
+ void _handle410() {
+ Get.showSnackbar(_errorSnackBar('نام کاربری یا رمز عبور اشتباه است'));
+ }
+
+ //wrong captcha => "detail": "Captcha code is incorrect" - 403
+ void _handle403() {}
+
+ void _handleGeneric(DioException error) {
+ Get.showSnackbar(
+ _errorSnackBar(
+ error.response?.data.keys.first == 'is_user'
+ ? 'کاربر با این شماره تلفن وجود ندارد'
+ : error.response?.data[error.response?.data.keys.first] ??
+ 'خطا در برقراری ارتباط با سرور',
+ ),
+ );
+ }
+
+ GetSnackBar _errorSnackBar(String message) {
+ return GetSnackBar(
+ titleText: Text(
+ 'خطا',
+ style: AppFonts.yekan14.copyWith(color: Colors.white),
+ ),
+ messageText: Text(
+ message,
+ style: AppFonts.yekan12.copyWith(color: Colors.white),
+ ),
+ backgroundColor: AppColor.error,
+ margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
+ borderRadius: 12,
+ duration: Duration(milliseconds: 3500),
+ snackPosition: SnackPosition.TOP,
+ );
+ }
+}
diff --git a/packages/chicken/lib/data/data_source/local/chicken_local.dart b/packages/chicken/lib/data/data_source/local/chicken_local.dart
new file mode 100644
index 0000000..e02478a
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/local/chicken_local.dart
@@ -0,0 +1,8 @@
+import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart';
+
+abstract class ChickenLocalDataSource {
+ Future openBox();
+ Future initWidleyUsed();
+
+ WidelyUsedLocalModel? getAllWidely();
+}
diff --git a/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart b/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart
new file mode 100644
index 0000000..a8f2055
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart
@@ -0,0 +1,58 @@
+import 'package:rasadyar_chicken/chicken.dart';
+import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart';
+import 'package:rasadyar_core/core.dart';
+
+import 'chicken_local.dart';
+
+class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
+ HiveLocalStorage local = diCore.get();
+ final String boxName = 'Chicken_Widley_Box';
+
+ @override
+ Future openBox() async {
+ await local.openBox(boxName);
+ }
+
+ @override
+ Future initWidleyUsed() async {
+ List tmpList = [
+ WidelyUsedLocalItem(
+ index: 0,
+ pathId: 0,
+ title: 'خرید داخل استان',
+ color: AppColor.greenLightActive.toARGB32(),
+ iconColor: AppColor.greenNormal.toARGB32(),
+ iconPath: Assets.vec.cubeSearchSvg.path,
+ path: ChickenRoutes.buysInProvince,
+ ),
+ WidelyUsedLocalItem(
+ index: 1,
+ pathId: 1,
+ title: 'فروش داخل استان',
+ color: AppColor.blueLightActive.toARGB32(),
+ iconColor: AppColor.blueNormal.toARGB32(),
+ iconPath: Assets.vec.cubeSvg.path,
+ path: ChickenRoutes.salesInProvince,
+ ),
+
+ WidelyUsedLocalItem(
+ index: 2,
+ title: 'قطعهبندی',
+ color: AppColor.blueLightActive.toARGB32(),
+ iconColor: AppColor.blueNormal.toARGB32(),
+ iconPath: Assets.vec.cubeRotateSvg.path,
+ path: ChickenRoutes.buysInProvince,
+ ),
+ ];
+ await local.add(
+ boxName: boxName,
+ value: WidelyUsedLocalModel(hasInit: true, items: tmpList),
+ );
+ }
+
+ @override
+ WidelyUsedLocalModel? getAllWidely() {
+ var res = local.readBox(boxName: boxName);
+ return res?.first;
+ }
+}
diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart
new file mode 100644
index 0000000..1705dcf
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart
@@ -0,0 +1,13 @@
+import 'package:rasadyar_chicken/data/models/response/captcha/captcha_response_model.dart';
+import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart';
+import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart';
+
+abstract class AuthRemoteDataSource {
+ Future login({required Map authRequest});
+
+ Future logout();
+
+ Future hasAuthenticated();
+
+ Future getUserInfo(String phoneNumber);
+}
diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart
new file mode 100644
index 0000000..f25e8c2
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart
@@ -0,0 +1,50 @@
+import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart';
+import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart';
+import 'package:rasadyar_core/core.dart';
+
+import 'auth_remote.dart';
+
+class AuthRemoteDataSourceImp extends AuthRemoteDataSource {
+ final DioRemote _httpClient;
+ final String _BASE_URL = 'auth/api/v1/';
+
+ AuthRemoteDataSourceImp(this._httpClient);
+
+ @override
+ Future login({required Map authRequest}) async {
+ var res = await _httpClient.post(
+ '/api/login/',
+ data: authRequest,
+ fromJson: UserProfileModel.fromJson,
+ headers: {'Content-Type': 'application/json'},
+ );
+ return res.data;
+ }
+
+ @override
+ Future logout() {
+ // TODO: implement logout
+ throw UnimplementedError();
+ }
+
+ @override
+ Future hasAuthenticated() async {
+ final response = await _httpClient.get(
+ '$_BASE_URL/login/',
+ headers: {'Content-Type': 'application/json'},
+ );
+
+ return response.data ?? false;
+ }
+
+ @override
+ Future getUserInfo(String phoneNumber) async {
+ var res = await _httpClient.post(
+ 'https://userbackend.rasadyaar.ir/api/send_otp/',
+ data: {"mobile": phoneNumber, "state": ""},
+ fromJson: UserInfoModel.fromJson,
+ headers: {'Content-Type': 'application/json'},
+ );
+ return res.data;
+ }
+}
diff --git a/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart
new file mode 100644
index 0000000..e6f04b8
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart
@@ -0,0 +1,155 @@
+import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart';
+import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart';
+import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart';
+import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart';
+import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart';
+import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart';
+import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart';
+import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart';
+import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart';
+import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart';
+import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart';
+import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
+import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart';
+import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart';
+import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart';
+import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart';
+import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'
+ hide ProductModel;
+import 'package:rasadyar_core/core.dart';
+
+abstract class ChickenRemoteDatasource {
+ Future?> getInventory({required String token, CancelToken? cancelToken});
+
+ Future getKillHouseDistributionInfo({required String token});
+
+ Future getGeneralBarInformation({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future?> getWaitingArrivals({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future setSateForArrivals({required String token, required Map request});
+
+ Future?> getImportedLoadsModel({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future?> getAllocatedMade({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future confirmAllocation({required String token, required Map allocation});
+
+ Future denyAllocation({required String token, required String allocationToken});
+
+ Future confirmAllAllocation({
+ required String token,
+ required List allocationTokens,
+ });
+
+ Future?> getRolesProducts({required String token});
+
+ Future?> getGuilds({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future getProfile({required String token});
+
+ Future postSubmitStewardAllocation({
+ required String token,
+ required SubmitStewardAllocation request,
+ });
+
+ Future deleteStewardAllocation({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future updateStewardAllocation({required String token, required ConformAllocation request});
+
+ Future getStewardDashboard({
+ required String token,
+ required String stratDate,
+ required String endDate,
+ });
+
+ Future getDashboardKillHouseFreeBar({
+ required String token,
+ required String stratDate,
+ required String endDate,
+ });
+
+ Future?> getStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future createStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ required CreateStewardFreeBar body,
+ });
+
+ Future deleteStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ required String stewardFreeBarKey,
+ });
+
+ Future?> getOutProvinceCarcassesBuyer({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future createOutProvinceCarcassesBuyer({
+ required String token,
+ required OutProvinceCarcassesBuyer body,
+ });
+
+ Future?> getProvince({CancelToken? cancelToken});
+
+ Future?> getCity({required String provinceName});
+
+ Future?> getStewardFreeSaleBar({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future createOutProvinceStewardFreeBar({
+ required String token,
+ required StewardFreeSaleBarRequest body,
+ });
+
+ Future updateOutProvinceStewardFreeBar({
+ required String token,
+ required StewardFreeSaleBarRequest body,
+ });
+
+ Future getUserProfile({required String token});
+
+ Future updateUserProfile({required String token, required UserProfile userProfile});
+
+ Future updatePassword({required String token, required ChangePasswordRequestModel model});
+
+ Future?> getSegmentation({
+ required String token,
+ Map? queryParameters,
+ });
+
+ Future createSegmentation({required String token, required SegmentationModel model});
+
+ Future editSegmentation({required String token, required SegmentationModel model});
+
+ Future deleteSegmentation({required String token, required String key});
+}
diff --git a/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart
new file mode 100644
index 0000000..57df1fa
--- /dev/null
+++ b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart
@@ -0,0 +1,486 @@
+
+import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart';
+import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart';
+import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart';
+import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart';
+import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart';
+import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart';
+import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart';
+import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart';
+import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart';
+import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart';
+import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart';
+import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
+import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart';
+import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart';
+import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart';
+import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart';
+import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart';
+import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart';
+import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'
+ hide ProductModel;
+import 'package:rasadyar_core/core.dart';
+
+import 'chicken_remote.dart';
+
+class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource {
+ final DioRemote _httpClient;
+
+ ChickenRemoteDatasourceImp(this._httpClient);
+
+ @override
+ Future?> getInventory({
+ required String token,
+ CancelToken? cancelToken,
+ }) async {
+ eLog(_httpClient.baseUrl);
+ var res = await _httpClient.get(
+ '/roles-products/?role=Steward',
+ headers: {'Authorization': 'Bearer $token'},
+
+ fromJsonList: (json) =>
+ (json).map((item) => InventoryModel.fromJson(item as Map)).toList(),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future getKillHouseDistributionInfo({required String token}) async {
+ var res = await _httpClient.get(
+ '/kill-house-distribution-info/?role=Steward',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: KillHouseDistributionInfo.fromJson,
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future getGeneralBarInformation({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/bars_for_kill_house_dashboard/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: BarInformation.fromJson,
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getWaitingArrivals({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward-allocation/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => WaitingArrivalModel.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future setSateForArrivals({
+ required String token,
+ required Map request,
+ }) async {
+ await _httpClient.put(
+ '/steward-allocation/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: request,
+ );
+ }
+
+ @override
+ Future?> getImportedLoadsModel({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward-allocation/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (data) => ImportedLoadsModel.fromJson(data as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getAllocatedMade({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward-allocation/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => AllocatedMadeModel.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future confirmAllocation({
+ required String token,
+ required Map allocation,
+ }) async {
+ var res = await _httpClient.put(
+ '/steward-allocation/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: allocation,
+ );
+ }
+
+ @override
+ Future denyAllocation({required String token, required String allocationToken}) async {
+ await _httpClient.delete(
+ '/steward-allocation/0/?steward_allocation_key=$allocationToken',
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ @override
+ Future confirmAllAllocation({
+ required String token,
+ required List allocationTokens,
+ }) async {
+ await _httpClient.put(
+ '/steward-allocation/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: {'steward_allocation_list': allocationTokens},
+ );
+ }
+
+ @override
+ Future?> getRolesProducts({required String token}) async {
+ var res = await _httpClient.get(
+ '/roles-products/?role=Steward',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJsonList: (json) =>
+ json.map((item) => ProductModel.fromJson(item as Map)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getGuilds({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/guilds/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJsonList: (json) =>
+ json.map((item) => GuildModel.fromJson(item as Map)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future getProfile({required String token}) async {
+ var res = await _httpClient.get(
+ '/guilds/0/?profile',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: GuildProfile.fromJson,
+ );
+ return res.data;
+ }
+
+ @override
+ Future postSubmitStewardAllocation({
+ required String token,
+ required SubmitStewardAllocation request,
+ }) async {
+ await _httpClient.post(
+ '/steward-allocation/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: request.toJson(),
+ );
+ }
+
+ @override
+ Future deleteStewardAllocation({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ await _httpClient.delete(
+ '/steward-allocation/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: queryParameters,
+ );
+ }
+
+ @override
+ Future updateStewardAllocation({
+ required String token,
+ required ConformAllocation request,
+ }) async {
+ await _httpClient.put(
+ '/steward-allocation/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: request.toJson(),
+ );
+ }
+
+ @override
+ Future getStewardDashboard({
+ required String token,
+ required String stratDate,
+ required String endDate,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward_free_bar_dashboard/?date1=$stratDate&date2=$endDate&search=filter',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: StewardFreeBarDashboard.fromJson,
+ );
+ return res.data;
+ }
+
+ @override
+ Future getDashboardKillHouseFreeBar({
+ required String token,
+ required String stratDate,
+ required String endDate,
+ }) async {
+ var res = await _httpClient.get(
+ '/dashboard_kill_house_free_bar/?date1=$stratDate&date2=$endDate&search=filter',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: DashboardKillHouseFreeBar.fromJson,
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward_free_bar/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => StewardFreeBar.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getCity({required String provinceName}) async {
+ var res = await _httpClient.get(
+ '/iran_city/',
+ queryParameters: {'name': provinceName},
+ fromJsonList: (json) =>
+ json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future?> getProvince({CancelToken? cancelToken}) async {
+ var res = await _httpClient.get(
+ '/iran_province/',
+ fromJsonList: (json) =>
+ json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(),
+ );
+ return res.data;
+ }
+
+ @override
+ Future createStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ required CreateStewardFreeBar body,
+ }) async {
+ var res = await _httpClient.post(
+ '/steward_free_bar/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: body.toJson(),
+ );
+ }
+
+ @override
+ Future deleteStewardPurchasesOutSideOfTheProvince({
+ required String token,
+ required String stewardFreeBarKey,
+ }) async {
+ await _httpClient.delete(
+ '/steward_free_bar/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ queryParameters: {'key': stewardFreeBarKey},
+ );
+ }
+
+ @override
+ Future?> getOutProvinceCarcassesBuyer({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/out-province-carcasses-buyer/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => OutProvinceCarcassesBuyer.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future createOutProvinceCarcassesBuyer({
+ required String token,
+ required OutProvinceCarcassesBuyer body,
+ }) async {
+ await _httpClient.post(
+ '/out-province-carcasses-buyer/',
+ data: body.toJson()..removeWhere((key, value) => value == null),
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ @override
+ Future?> getStewardFreeSaleBar({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/steward_free_sale_bar/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => StewardFreeSaleBar.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future createOutProvinceStewardFreeBar({
+ required String token,
+ required StewardFreeSaleBarRequest body,
+ }) async {
+ await _httpClient.post(
+ '/steward_free_sale_bar/',
+ data: body.toJson()..removeWhere((key, value) => value == null),
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ @override
+ Future updateOutProvinceStewardFreeBar({
+ required String token,
+ required StewardFreeSaleBarRequest body,
+ }) async {
+ await _httpClient.put(
+ '/steward_free_sale_bar/0/',
+ data: body.toJson()
+ ..removeWhere((key, value) => value == null)
+ ..addAll({'carcassWeight': body.weightOfCarcasses, 'carcassCount': body.numberOfCarcasses}),
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ @override
+ Future getUserProfile({required String token}) async {
+ var res = await _httpClient.get(
+ '/system_user_profile/?self-profile',
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => UserProfile.fromJson(json),
+ );
+
+ return res.data;
+ }
+
+ @override
+ Future updateUserProfile({required String token, required UserProfile userProfile}) async {
+ await _httpClient.put(
+ '/system_user_profile/0/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: userProfile.toJson()..removeWhere((key, value) => value == null),
+ );
+ }
+
+ @override
+ Future updatePassword({
+ required String token,
+ required ChangePasswordRequestModel model,
+ }) async {
+ await _httpClient.post(
+ '/api/change_password/',
+ headers: {'Authorization': 'Bearer $token'},
+ data: model.toJson()..removeWhere((key, value) => value == null),
+ );
+ }
+
+ @override
+ Future?> getSegmentation({
+ required String token,
+ Map? queryParameters,
+ }) async {
+ var res = await _httpClient.get(
+ '/app-segmentation/',
+ queryParameters: queryParameters,
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => PaginationModel.fromJson(
+ json,
+ (json) => SegmentationModel.fromJson(json as Map),
+ ),
+ );
+ return res.data;
+ }
+
+ @override
+ Future createSegmentation({required String token, required SegmentationModel model}) async {
+ await _httpClient.post(
+ '/app-segmentation/',
+ data: model.toJson()..removeWhere((key, value) => value == null),
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ @override
+ Future editSegmentation({required String token, required SegmentationModel model}) async {
+ await _httpClient.put(
+ '/app-segmentation/0/',
+ data: model.toJson()..removeWhere((key, value) => value == null),
+ headers: {'Authorization': 'Bearer $token'},
+ );
+ }
+
+ @override
+ Future deleteSegmentation({
+ required String token,
+ required String key,
+ }) async {
+ var res = await _httpClient.delete(
+ '/app-segmentation/0/',
+ queryParameters: {'key': key},
+ headers: {'Authorization': 'Bearer $token'},
+ fromJson: (json) => SegmentationModel.fromJson(json),
+ );
+
+ return res.data;
+ }
+}
diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart
new file mode 100644
index 0000000..d85f410
--- /dev/null
+++ b/packages/chicken/lib/data/di/chicken_di.dart
@@ -0,0 +1,74 @@
+import 'package:rasadyar_chicken/chicken.dart';
+import 'package:rasadyar_chicken/data/common/dio_error_handler.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart';
+import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote_imp.dart';
+import 'package:rasadyar_chicken/data/repositories/auth/auth_repository_imp.dart';
+import 'package:rasadyar_core/core.dart';
+
+GetIt diChicken = GetIt.instance;
+
+Future setupChickenDI() async {
+ diChicken.registerSingleton(DioErrorHandler());
+ var tokenService = Get.find();
+
+ diChicken.registerLazySingleton(
+ () => AppInterceptor(
+ //فعلا سامانه مرغ برای رفرش توکن چیزی ندارد
+ refreshTokenCallback: () async => null,
+ saveTokenCallback: (String newToken) async {
+ await tokenService.saveAccessToken(newToken);
+ },
+ clearTokenCallback: () async {
+ await tokenService.deleteTokens();
+ Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken);
+ },
+ ),
+ instanceName: 'chickenInterceptor',
+ );
+
+ diChicken.registerLazySingleton(
+ () =>
+ DioRemote(interceptors: diChicken.get(instanceName: 'chickenInterceptor')),
+ );
+
+ final dioRemote = diChicken.get();
+ await dioRemote.init();
+
+ diChicken.registerLazySingleton(
+ () => AuthRemoteDataSourceImp(diChicken.get()),
+ );
+
+ diChicken.registerLazySingleton(
+ () => AuthRepositoryImpl(diChicken.get()),
+ );
+}
+
+Future newSetupAuthDI(String newUrl) async {
+ var tokenService = Get.find();
+ if (tokenService.baseurl.value == null) {
+ await tokenService.saveBaseUrl(newUrl);
+ }
+
+ if (diChicken.isRegistered()) {
+ await diChicken.unregister();
+ diChicken.registerLazySingleton(
+ () => DioRemote(baseUrl: newUrl, interceptors: diChicken.get()),
+ );
+ final dioRemote = diChicken.get();
+ await dioRemote.init();
+ }
+
+ if (diChicken.isRegistered()) {
+ await diChicken.unregister();
+ diChicken.registerLazySingleton(
+ () => AuthRemoteDataSourceImp(diChicken.get()),
+ );
+ }
+
+ if (diChicken.isRegistered()) {
+ await diChicken.unregister();
+ diChicken.registerLazySingleton(
+ () => AuthRepositoryImpl(diChicken.get()),
+ );
+ }
+}
diff --git a/packages/chicken/lib/data/models/local/widely_used_local_model.dart b/packages/chicken/lib/data/models/local/widely_used_local_model.dart
new file mode 100644
index 0000000..02d89c7
--- /dev/null
+++ b/packages/chicken/lib/data/models/local/widely_used_local_model.dart
@@ -0,0 +1,73 @@
+import 'package:rasadyar_core/core.dart';
+import 'package:rasadyar_core/utils/utils.dart';
+
+part 'widely_used_local_model.g.dart';
+
+@HiveType(typeId: chickenWidelyUsedLocalModelTypeId)
+class WidelyUsedLocalModel extends HiveObject {
+ @HiveField(0)
+ bool? hasInit;
+
+ @HiveField(1)
+ List? items;
+
+ WidelyUsedLocalModel({this.hasInit, this.items});
+
+ WidelyUsedLocalModel copyWith({bool? hasInit, List? items}) {
+ return WidelyUsedLocalModel(hasInit: hasInit ?? this.hasInit, items: items ?? this.items);
+ }
+}
+
+@HiveType(typeId: chickenWidelyUsedLocalItemTypeId)
+class WidelyUsedLocalItem extends HiveObject {
+ @HiveField(0)
+ String? title;
+
+ @HiveField(1)
+ String? iconPath;
+
+ @HiveField(2)
+ int? iconColor;
+
+ @HiveField(3)
+ int? color;
+
+ @HiveField(4)
+ String? path;
+
+ @HiveField(5)
+ int? pathId;
+
+ @HiveField(6)
+ int? index;
+
+ WidelyUsedLocalItem({
+ this.title,
+ this.iconPath,
+ this.iconColor,
+ this.color,
+ this.path,
+ this.pathId,
+ this.index,
+ });
+
+ WidelyUsedLocalItem copyWith({
+ String? title,
+ String? iconPath,
+ int? iconColor,
+ int? color,
+ int? pathId,
+ int? index,
+ String? path,
+ }) {
+ return WidelyUsedLocalItem(
+ title: title ?? this.title,
+ iconPath: iconPath ?? this.iconPath,
+ iconColor: iconColor ?? this.iconColor,
+ color: color ?? this.color,
+ path: path ?? this.path,
+ pathId: pathId ?? this.pathId,
+ index: index ?? this.index,
+ );
+ }
+}
diff --git a/packages/chicken/lib/data/models/local/widely_used_local_model.g.dart b/packages/chicken/lib/data/models/local/widely_used_local_model.g.dart
new file mode 100644
index 0000000..271c009
--- /dev/null
+++ b/packages/chicken/lib/data/models/local/widely_used_local_model.g.dart
@@ -0,0 +1,96 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'widely_used_local_model.dart';
+
+// **************************************************************************
+// TypeAdapterGenerator
+// **************************************************************************
+
+class WidelyUsedLocalModelAdapter extends TypeAdapter {
+ @override
+ final typeId = 2;
+
+ @override
+ WidelyUsedLocalModel read(BinaryReader reader) {
+ final numOfFields = reader.readByte();
+ final fields = {
+ for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
+ };
+ return WidelyUsedLocalModel(
+ hasInit: fields[0] as bool?,
+ items: (fields[1] as List?)?.cast(),
+ );
+ }
+
+ @override
+ void write(BinaryWriter writer, WidelyUsedLocalModel obj) {
+ writer
+ ..writeByte(2)
+ ..writeByte(0)
+ ..write(obj.hasInit)
+ ..writeByte(1)
+ ..write(obj.items);
+ }
+
+ @override
+ int get hashCode => typeId.hashCode;
+
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ other is WidelyUsedLocalModelAdapter &&
+ runtimeType == other.runtimeType &&
+ typeId == other.typeId;
+}
+
+class WidelyUsedLocalItemAdapter extends TypeAdapter {
+ @override
+ final typeId = 3;
+
+ @override
+ WidelyUsedLocalItem read(BinaryReader reader) {
+ final numOfFields = reader.readByte();
+ final fields = {
+ for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
+ };
+ return WidelyUsedLocalItem(
+ title: fields[0] as String?,
+ iconPath: fields[1] as String?,
+ iconColor: (fields[2] as num?)?.toInt(),
+ color: (fields[3] as num?)?.toInt(),
+ path: fields[4] as String?,
+ pathId: (fields[5] as num?)?.toInt(),
+ index: (fields[6] as num?)?.toInt(),
+ );
+ }
+
+ @override
+ void write(BinaryWriter writer, WidelyUsedLocalItem obj) {
+ writer
+ ..writeByte(7)
+ ..writeByte(0)
+ ..write(obj.title)
+ ..writeByte(1)
+ ..write(obj.iconPath)
+ ..writeByte(2)
+ ..write(obj.iconColor)
+ ..writeByte(3)
+ ..write(obj.color)
+ ..writeByte(4)
+ ..write(obj.path)
+ ..writeByte(5)
+ ..write(obj.pathId)
+ ..writeByte(6)
+ ..write(obj.index);
+ }
+
+ @override
+ int get hashCode => typeId.hashCode;
+
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ other is WidelyUsedLocalItemAdapter &&
+ runtimeType == other.runtimeType &&
+ typeId == other.typeId;
+}
diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart
new file mode 100644
index 0000000..b5a94a2
--- /dev/null
+++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart
@@ -0,0 +1,18 @@
+
+import 'package:rasadyar_core/core.dart';
+
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'change_password_request_model.freezed.dart';
+part 'change_password_request_model.g.dart';
+
+@freezed
+abstract class ChangePasswordRequestModel with _$ChangePasswordRequestModel {
+ const factory ChangePasswordRequestModel({
+ String? username,
+ String? password,
+ }) = _ChangePasswordRequestModel;
+
+ factory ChangePasswordRequestModel.fromJson(Map json) =>
+ _$ChangePasswordRequestModelFromJson(json);
+}
diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart
new file mode 100644
index 0000000..b9f8687
--- /dev/null
+++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart
@@ -0,0 +1,280 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// coverage:ignore-file
+// ignore_for_file: type=lint
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
+
+part of 'change_password_request_model.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+// dart format off
+T _$identity(T value) => value;
+
+/// @nodoc
+mixin _$ChangePasswordRequestModel {
+
+ String? get username; String? get password;
+/// Create a copy of ChangePasswordRequestModel
+/// with the given fields replaced by the non-null parameter values.
+@JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+$ChangePasswordRequestModelCopyWith get copyWith => _$ChangePasswordRequestModelCopyWithImpl(this as ChangePasswordRequestModel, _$identity);
+
+ /// Serializes this ChangePasswordRequestModel to a JSON map.
+ Map toJson();
+
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is ChangePasswordRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,username,password);
+
+@override
+String toString() {
+ return 'ChangePasswordRequestModel(username: $username, password: $password)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class $ChangePasswordRequestModelCopyWith<$Res> {
+ factory $ChangePasswordRequestModelCopyWith(ChangePasswordRequestModel value, $Res Function(ChangePasswordRequestModel) _then) = _$ChangePasswordRequestModelCopyWithImpl;
+@useResult
+$Res call({
+ String? username, String? password
+});
+
+
+
+
+}
+/// @nodoc
+class _$ChangePasswordRequestModelCopyWithImpl<$Res>
+ implements $ChangePasswordRequestModelCopyWith<$Res> {
+ _$ChangePasswordRequestModelCopyWithImpl(this._self, this._then);
+
+ final ChangePasswordRequestModel _self;
+ final $Res Function(ChangePasswordRequestModel) _then;
+
+/// Create a copy of ChangePasswordRequestModel
+/// with the given fields replaced by the non-null parameter values.
+@pragma('vm:prefer-inline') @override $Res call({Object? username = freezed,Object? password = freezed,}) {
+ return _then(_self.copyWith(
+username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable
+as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
+as String?,
+ ));
+}
+
+}
+
+
+/// Adds pattern-matching-related methods to [ChangePasswordRequestModel].
+extension ChangePasswordRequestModelPatterns on ChangePasswordRequestModel {
+/// A variant of `map` that fallback to returning `orElse`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeMap(TResult Function( _ChangePasswordRequestModel value)? $default,{required TResult orElse(),}){
+final _that = this;
+switch (_that) {
+case _ChangePasswordRequestModel() when $default != null:
+return $default(_that);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// Callbacks receives the raw object, upcasted.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case final Subclass2 value:
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult map(TResult Function( _ChangePasswordRequestModel value) $default,){
+final _that = this;
+switch (_that) {
+case _ChangePasswordRequestModel():
+return $default(_that);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `map` that fallback to returning `null`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ChangePasswordRequestModel value)? $default,){
+final _that = this;
+switch (_that) {
+case _ChangePasswordRequestModel() when $default != null:
+return $default(_that);case _:
+ return null;
+
+}
+}
+/// A variant of `when` that fallback to an `orElse` callback.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeWhen(TResult Function( String? username, String? password)? $default,{required TResult orElse(),}) {final _that = this;
+switch (_that) {
+case _ChangePasswordRequestModel() when $default != null:
+return $default(_that.username,_that.password);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// As opposed to `map`, this offers destructuring.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case Subclass2(:final field2):
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult when(TResult Function( String? username, String? password) $default,) {final _that = this;
+switch (_that) {
+case _ChangePasswordRequestModel():
+return $default(_that.username,_that.password);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `when` that fallback to returning `null`
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? username, String? password)? $default,) {final _that = this;
+switch (_that) {
+case _ChangePasswordRequestModel() when $default != null:
+return $default(_that.username,_that.password);case _:
+ return null;
+
+}
+}
+
+}
+
+/// @nodoc
+@JsonSerializable()
+
+class _ChangePasswordRequestModel implements ChangePasswordRequestModel {
+ const _ChangePasswordRequestModel({this.username, this.password});
+ factory _ChangePasswordRequestModel.fromJson(Map json) => _$ChangePasswordRequestModelFromJson(json);
+
+@override final String? username;
+@override final String? password;
+
+/// Create a copy of ChangePasswordRequestModel
+/// with the given fields replaced by the non-null parameter values.
+@override @JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+_$ChangePasswordRequestModelCopyWith<_ChangePasswordRequestModel> get copyWith => __$ChangePasswordRequestModelCopyWithImpl<_ChangePasswordRequestModel>(this, _$identity);
+
+@override
+Map toJson() {
+ return _$ChangePasswordRequestModelToJson(this, );
+}
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _ChangePasswordRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,username,password);
+
+@override
+String toString() {
+ return 'ChangePasswordRequestModel(username: $username, password: $password)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class _$ChangePasswordRequestModelCopyWith<$Res> implements $ChangePasswordRequestModelCopyWith<$Res> {
+ factory _$ChangePasswordRequestModelCopyWith(_ChangePasswordRequestModel value, $Res Function(_ChangePasswordRequestModel) _then) = __$ChangePasswordRequestModelCopyWithImpl;
+@override @useResult
+$Res call({
+ String? username, String? password
+});
+
+
+
+
+}
+/// @nodoc
+class __$ChangePasswordRequestModelCopyWithImpl<$Res>
+ implements _$ChangePasswordRequestModelCopyWith<$Res> {
+ __$ChangePasswordRequestModelCopyWithImpl(this._self, this._then);
+
+ final _ChangePasswordRequestModel _self;
+ final $Res Function(_ChangePasswordRequestModel) _then;
+
+/// Create a copy of ChangePasswordRequestModel
+/// with the given fields replaced by the non-null parameter values.
+@override @pragma('vm:prefer-inline') $Res call({Object? username = freezed,Object? password = freezed,}) {
+ return _then(_ChangePasswordRequestModel(
+username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable
+as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
+as String?,
+ ));
+}
+
+
+}
+
+// dart format on
diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart
new file mode 100644
index 0000000..ca0cf6b
--- /dev/null
+++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart
@@ -0,0 +1,21 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'change_password_request_model.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+_ChangePasswordRequestModel _$ChangePasswordRequestModelFromJson(
+ Map json,
+) => _ChangePasswordRequestModel(
+ username: json['username'] as String?,
+ password: json['password'] as String?,
+);
+
+Map _$ChangePasswordRequestModelToJson(
+ _ChangePasswordRequestModel instance,
+) => {
+ 'username': instance.username,
+ 'password': instance.password,
+};
diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart
new file mode 100644
index 0000000..34cb139
--- /dev/null
+++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart
@@ -0,0 +1,18 @@
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'conform_allocation.freezed.dart';
+part 'conform_allocation.g.dart';
+
+@freezed
+abstract class ConformAllocation with _$ConformAllocation {
+ factory ConformAllocation({
+ String? allocation_key,
+ int? number_of_carcasses,
+ int? weight_of_carcasses,
+ int? amount,
+ int? total_amount,
+ }) = _ConformAllocation;
+
+ factory ConformAllocation.fromJson(Map json) =>
+ _$ConformAllocationFromJson(json);
+}
diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart
new file mode 100644
index 0000000..bfa3fe6
--- /dev/null
+++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart
@@ -0,0 +1,289 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// coverage:ignore-file
+// ignore_for_file: type=lint
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
+
+part of 'conform_allocation.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+// dart format off
+T _$identity(T value) => value;
+
+/// @nodoc
+mixin _$ConformAllocation {
+
+ String? get allocation_key; int? get number_of_carcasses; int? get weight_of_carcasses; int? get amount; int? get total_amount;
+/// Create a copy of ConformAllocation
+/// with the given fields replaced by the non-null parameter values.
+@JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+$ConformAllocationCopyWith get copyWith => _$ConformAllocationCopyWithImpl(this as ConformAllocation, _$identity);
+
+ /// Serializes this ConformAllocation to a JSON map.
+ Map toJson();
+
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is ConformAllocation&&(identical(other.allocation_key, allocation_key) || other.allocation_key == allocation_key)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,allocation_key,number_of_carcasses,weight_of_carcasses,amount,total_amount);
+
+@override
+String toString() {
+ return 'ConformAllocation(allocation_key: $allocation_key, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, amount: $amount, total_amount: $total_amount)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class $ConformAllocationCopyWith<$Res> {
+ factory $ConformAllocationCopyWith(ConformAllocation value, $Res Function(ConformAllocation) _then) = _$ConformAllocationCopyWithImpl;
+@useResult
+$Res call({
+ String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount
+});
+
+
+
+
+}
+/// @nodoc
+class _$ConformAllocationCopyWithImpl<$Res>
+ implements $ConformAllocationCopyWith<$Res> {
+ _$ConformAllocationCopyWithImpl(this._self, this._then);
+
+ final ConformAllocation _self;
+ final $Res Function(ConformAllocation) _then;
+
+/// Create a copy of ConformAllocation
+/// with the given fields replaced by the non-null parameter values.
+@pragma('vm:prefer-inline') @override $Res call({Object? allocation_key = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? amount = freezed,Object? total_amount = freezed,}) {
+ return _then(_self.copyWith(
+allocation_key: freezed == allocation_key ? _self.allocation_key : allocation_key // ignore: cast_nullable_to_non_nullable
+as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable
+as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable
+as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable
+as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable
+as int?,
+ ));
+}
+
+}
+
+
+/// Adds pattern-matching-related methods to [ConformAllocation].
+extension ConformAllocationPatterns on ConformAllocation {
+/// A variant of `map` that fallback to returning `orElse`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeMap(TResult Function( _ConformAllocation value)? $default,{required TResult orElse(),}){
+final _that = this;
+switch (_that) {
+case _ConformAllocation() when $default != null:
+return $default(_that);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// Callbacks receives the raw object, upcasted.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case final Subclass2 value:
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult map(TResult Function( _ConformAllocation value) $default,){
+final _that = this;
+switch (_that) {
+case _ConformAllocation():
+return $default(_that);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `map` that fallback to returning `null`.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case final Subclass value:
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ConformAllocation value)? $default,){
+final _that = this;
+switch (_that) {
+case _ConformAllocation() when $default != null:
+return $default(_that);case _:
+ return null;
+
+}
+}
+/// A variant of `when` that fallback to an `orElse` callback.
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return orElse();
+/// }
+/// ```
+
+@optionalTypeArgs TResult maybeWhen(TResult Function( String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount)? $default,{required TResult orElse(),}) {final _that = this;
+switch (_that) {
+case _ConformAllocation() when $default != null:
+return $default(_that.allocation_key,_that.number_of_carcasses,_that.weight_of_carcasses,_that.amount,_that.total_amount);case _:
+ return orElse();
+
+}
+}
+/// A `switch`-like method, using callbacks.
+///
+/// As opposed to `map`, this offers destructuring.
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case Subclass2(:final field2):
+/// return ...;
+/// }
+/// ```
+
+@optionalTypeArgs TResult when(TResult Function( String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount) $default,) {final _that = this;
+switch (_that) {
+case _ConformAllocation():
+return $default(_that.allocation_key,_that.number_of_carcasses,_that.weight_of_carcasses,_that.amount,_that.total_amount);case _:
+ throw StateError('Unexpected subclass');
+
+}
+}
+/// A variant of `when` that fallback to returning `null`
+///
+/// It is equivalent to doing:
+/// ```dart
+/// switch (sealedClass) {
+/// case Subclass(:final field):
+/// return ...;
+/// case _:
+/// return null;
+/// }
+/// ```
+
+@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount)? $default,) {final _that = this;
+switch (_that) {
+case _ConformAllocation() when $default != null:
+return $default(_that.allocation_key,_that.number_of_carcasses,_that.weight_of_carcasses,_that.amount,_that.total_amount);case _:
+ return null;
+
+}
+}
+
+}
+
+/// @nodoc
+@JsonSerializable()
+
+class _ConformAllocation implements ConformAllocation {
+ _ConformAllocation({this.allocation_key, this.number_of_carcasses, this.weight_of_carcasses, this.amount, this.total_amount});
+ factory _ConformAllocation.fromJson(Map json) => _$ConformAllocationFromJson(json);
+
+@override final String? allocation_key;
+@override final int? number_of_carcasses;
+@override final int? weight_of_carcasses;
+@override final int? amount;
+@override final int? total_amount;
+
+/// Create a copy of ConformAllocation
+/// with the given fields replaced by the non-null parameter values.
+@override @JsonKey(includeFromJson: false, includeToJson: false)
+@pragma('vm:prefer-inline')
+_$ConformAllocationCopyWith<_ConformAllocation> get copyWith => __$ConformAllocationCopyWithImpl<_ConformAllocation>(this, _$identity);
+
+@override
+Map toJson() {
+ return _$ConformAllocationToJson(this, );
+}
+
+@override
+bool operator ==(Object other) {
+ return identical(this, other) || (other.runtimeType == runtimeType&&other is _ConformAllocation&&(identical(other.allocation_key, allocation_key) || other.allocation_key == allocation_key)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount));
+}
+
+@JsonKey(includeFromJson: false, includeToJson: false)
+@override
+int get hashCode => Object.hash(runtimeType,allocation_key,number_of_carcasses,weight_of_carcasses,amount,total_amount);
+
+@override
+String toString() {
+ return 'ConformAllocation(allocation_key: $allocation_key, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, amount: $amount, total_amount: $total_amount)';
+}
+
+
+}
+
+/// @nodoc
+abstract mixin class _$ConformAllocationCopyWith<$Res> implements $ConformAllocationCopyWith<$Res> {
+ factory _$ConformAllocationCopyWith(_ConformAllocation value, $Res Function(_ConformAllocation) _then) = __$ConformAllocationCopyWithImpl;
+@override @useResult
+$Res call({
+ String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount
+});
+
+
+
+
+}
+/// @nodoc
+class __$ConformAllocationCopyWithImpl<$Res>
+ implements _$ConformAllocationCopyWith<$Res> {
+ __$ConformAllocationCopyWithImpl(this._self, this._then);
+
+ final _ConformAllocation _self;
+ final $Res Function(_ConformAllocation) _then;
+
+/// Create a copy of ConformAllocation
+/// with the given fields replaced by the non-null parameter values.
+@override @pragma('vm:prefer-inline') $Res call({Object? allocation_key = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? amount = freezed,Object? total_amount = freezed,}) {
+ return _then(_ConformAllocation(
+allocation_key: freezed == allocation_key ? _self.allocation_key : allocation_key // ignore: cast_nullable_to_non_nullable
+as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable
+as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable
+as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable
+as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable
+as int?,
+ ));
+}
+
+
+}
+
+// dart format on
diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart
new file mode 100644
index 0000000..a4a1b45
--- /dev/null
+++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart
@@ -0,0 +1,25 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'conform_allocation.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+_ConformAllocation _$ConformAllocationFromJson(Map json) =>
+ _ConformAllocation(
+ allocation_key: json['allocation_key'] as String?,
+ number_of_carcasses: (json['number_of_carcasses'] as num?)?.toInt(),
+ weight_of_carcasses: (json['weight_of_carcasses'] as num?)?.toInt(),
+ amount: (json['amount'] as num?)?.toInt(),
+ total_amount: (json['total_amount'] as num?)?.toInt(),
+ );
+
+Map _$ConformAllocationToJson(_ConformAllocation instance) =>
+