diff --git a/.gitignore b/.gitignore index 69af7f3..68fcf43 100644 --- a/.gitignore +++ b/.gitignore @@ -176,6 +176,7 @@ cython_debug/ # Custom added *.db -chromdb/* -model/* -models/* +chromadb/ +model/ +models/ +.gguf diff --git a/android/dai/dai/.gitignore b/android/dai/dai/.gitignore new file mode 100644 index 0000000..fb54fa1 --- /dev/null +++ b/android/dai/dai/.gitignore @@ -0,0 +1,48 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +# Never commit tokens! +config.json diff --git a/android/dai/dai/.metadata b/android/dai/dai/.metadata new file mode 100644 index 0000000..fdb4416 --- /dev/null +++ b/android/dai/dai/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "fcf2c11572af6f390246c056bc905eca609533a0" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + - platform: android + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + - platform: ios + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + - platform: linux + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + - platform: macos + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + - platform: web + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + - platform: windows + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/android/dai/dai/.vscode/settings.json b/android/dai/dai/.vscode/settings.json new file mode 100644 index 0000000..1fe5c38 --- /dev/null +++ b/android/dai/dai/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cmake.sourceDirectory": "/media/wikmgg/A49CB5969CB56408/Distributed-AI/Mobile/linux" +} \ No newline at end of file diff --git a/android/dai/dai/Deploy Commannd.txt b/android/dai/dai/Deploy Commannd.txt new file mode 100644 index 0000000..dcdb20e --- /dev/null +++ b/android/dai/dai/Deploy Commannd.txt @@ -0,0 +1,5 @@ +psql "postgresql://postgres:Mey%23Birth%40miN2004@localhost:5432" + +uvicorn app.main:app --reload --host 0.0.0.0 --port 8313 + +livekit-server --dev --bind 0.0.0.0 diff --git a/android/dai/dai/INSTRUCTIONS.md b/android/dai/dai/INSTRUCTIONS.md new file mode 100644 index 0000000..6559c38 --- /dev/null +++ b/android/dai/dai/INSTRUCTIONS.md @@ -0,0 +1,22 @@ +# برای اجرای پروژه با Socket.IO: + +## Backend + +```bash +cd backend +pip install -r requirements.txt + +# اجرا با asgi_app +uvicorn app.main:asgi_app --host 0.0.0.0 --port 8000 --reload +``` + +## Flutter + +```bash +flutter pub get +flutter run +``` + +## مهم: +- باید با `app.main:asgi_app` اجرا کنید نه `app.main:app` +- این باعث می‌شود Socket.IO درست کار کند diff --git a/android/dai/dai/RAG_DESKTOP_FIX_SUMMARY.md b/android/dai/dai/RAG_DESKTOP_FIX_SUMMARY.md new file mode 100644 index 0000000..0372d79 --- /dev/null +++ b/android/dai/dai/RAG_DESKTOP_FIX_SUMMARY.md @@ -0,0 +1,153 @@ +# 🔧 RAG Desktop FFI Isolate Fix - خلاصه تغییرات + +## 🎯 مشکل اصلی + +``` +error: Cannot invoke native callback from a different isolate +``` + +**علت**: LlamaCpp از FFI استفاده میکنه که نمیتونه از isolate‌های مختلف صدا زده بشه. + +## ✅ تغییرات انجام شده + +### 1. **embedding_service.dart** - حذف Isolate برای Desktop + +```dart +// خط 82-84: غیرفعال کردن Isolate برای LlamaCpp +if (AppConfig.aiBackend == AIBackendType.llamaCpp && PlatformHelper.isDesktop) { + _useIsolate = false; // ✅ اضافه شد +} +``` + +**تغییر در `generateEmbeddings`:** +- ✅ حذف کامل `Future.wait()` و parallelization +- ✅ پردازش SEQUENTIAL یکی یکی +- ✅ اضافه شدن لاگ‌های debug با emoji + +**تغییر در `generateEmbedding`:** +- ✅ اضافه شدن لاگ‌های مفصل برای trace کردن + +### 2. **llama_cpp_embedding_backend_io.dart** - لاگ‌های مفصل FFI + +```dart +// قبل از FFI call +Log.i('🔧 Calling _modelInstance.getEmbeddings()...', 'LlamaCppEmbedding'); + +// بعد از FFI call +Log.i('✅ FFI call complete, got embedding (dim: ${embedding.length})', 'LlamaCppEmbedding'); +``` + +### 3. **hierarchical_rag_manager.dart** - حذف Future.wait + +**PDF Import (خط 510-541):** +```dart +// قبل: await Future.wait(indexFutures); +// بعد: SEQUENTIAL indexing +for (int i = 0; i < allSecondWindows.length; i++) { + await _invertedIndex!.indexChunk(...); // یکی یکی + if ((i + 1) % 5 == 0) { + await Future.delayed(Duration.zero); // yield to UI + } +} +``` + +**Text Import (خط 834-865):** +- ✅ همین تغییر برای text files + +**Search Method (خط 922-955):** +- ✅ اضافه شدن لاگ‌های مفصل با separator + +**loadEmbeddingModel (خط 126-139):** +```dart +// Auto-detect: برای LlamaCpp همیشه useIsolate: false +final shouldUseIsolate = useIsolate ?? + (AppConfig.aiBackend == AIBackendType.llamaCpp ? false : true); +``` + +### 4. **hierarchical_retrieval_service.dart** - لاگ‌های مفصل + +**تمام Stage‌ها:** +```dart +// Stage 1, 2, 3: +Log.i('🔍 [Stage X] ...', 'HierarchicalRetrieval'); +Log.i('📊 Generating query embedding...', 'HierarchicalRetrieval'); +Log.i('✅ Query embedding ready', 'HierarchicalRetrieval'); +``` + +**retrieve method:** +```dart +Log.i('═══════════════════════════════════════════════', 'HierarchicalRetrieval'); +Log.i('🚀 Starting 3-Stage Hierarchical Retrieval', 'HierarchicalRetrieval'); +``` + +## 🔍 مسیر کامل لاگ‌ها (برای Debug) + +وقتی یک query در `public_lab_chat_screen` با RAG فعال میزنید، باید این لاگ‌ها رو ببینید: + +``` +1. [HierarchicalRAG] + ═══════════════════════════════════════════════ + 🔎 [HierarchicalRAG] Starting Hybrid Search + ═══════════════════════════════════════════════ + 📝 Query: "your query" + 🎯 Max results: 5 + +2. [HierarchicalRetrieval] + ═══════════════════════════════════════════════ + 🚀 Starting 3-Stage Hierarchical Retrieval + ═══════════════════════════════════════════════ + +3. [HierarchicalRetrieval] 🔍 [Stage 1] Document-level search (topK=3) + [HierarchicalRetrieval] 📊 Generating query embedding... + +4. [EmbeddingService] 🔍 [generateEmbedding] Starting for text (X chars) + [EmbeddingService] 🔧 Calling backend.generateEmbedding... + +5. [LlamaCppEmbedding] 🔍 [LlamaCppBackend] generateEmbedding called (text: X chars) + [LlamaCppEmbedding] ⏳ Yielding to event loop before FFI call... + [LlamaCppEmbedding] 🔧 Calling _modelInstance.getEmbeddings()... + [LlamaCppEmbedding] ✅ FFI call complete, got embedding (dim: 1024) + [LlamaCppEmbedding] ⏳ Yielding to event loop after FFI call... + +6. [EmbeddingService] ✅ Generated embedding (dim: 1024) + [HierarchicalRetrieval] ✅ Query embedding generated (dim: 1024) + +7. [HierarchicalRetrieval] 🔍 [Stage 2] First Window search... +8. [HierarchicalRetrieval] 🔍 [Stage 3] Second Window search... + +9. [HierarchicalRAG] ✅ Hybrid search complete: X results +``` + +## ❌ اگر ارور بدید، چک کنید: + +1. **"Backend not initialized"** + → embedding model لود نشده + → چک کنید: `AppConfig.llamaCppEmbeddingModelPath` + +2. **"Model not ready"** + → `_isReady` false است + → چک کنید: آیا `autoLoadEmbeddingModel()` اجرا شده؟ + +3. **"Cannot invoke native callback from different isolate"** + → هنوز جایی `_useIsolate=true` هست + → چک کنید: لاگ "Isolate mode disabled" رو ببینید + +## 🚀 نتیجه + +- ✅ هیچ isolate spawning برای Desktop +- ✅ هیچ Future.wait() parallelization +- ✅ همه چیز SEQUENTIAL +- ✅ لاگ‌های کامل برای debug +- ✅ Yield to event loop برای responsive UI + +## 📝 تست + +برای تست کردن: +1. برنامه رو اجرا کنید +2. به `public_lab_chat_screen` برید +3. RAG و Bot رو فعال کنید +4. یک پیام بفرستید +5. لاگ‌ها رو چک کنید + +اگر تمام لاگ‌های بالا رو دیدید و ارور نداد → ✅ موفق! +اگر ارور داد → لاگ آخر قبل از ارور رو پیدا کنید و بررسی کنید diff --git a/android/dai/dai/RAG_ISOLATE_FIX_FINAL.md b/android/dai/dai/RAG_ISOLATE_FIX_FINAL.md new file mode 100644 index 0000000..24b469c --- /dev/null +++ b/android/dai/dai/RAG_ISOLATE_FIX_FINAL.md @@ -0,0 +1,220 @@ +# 🔧 RAG Desktop FFI Isolate Fix - نسخه نهایی + +## 🎯 ریشه مشکل (Root Cause) + +### مشکل اصلی کشف شد! ✅ + +**مشاهده کاربر:** +- ✅ Import از `lab_backpack_screen` → موفق +- ❌ Search از `public_lab_chat_screen` → ناموفق + +**تحلیل Stack Trace:** +``` +[Unoptimized] EditableTextState._finalizeEditing +[Unoptimized] TextInput._handleTextInputInvocation +``` + +**ریشه مشکل:** +``` +┌─────────────────────────────────────────────┐ +│ Main Isolate │ +│ └─ App Startup │ +│ └─ LlamaCpp Model Initialized ✅ │ +│ (FFI bindings created HERE) │ +└─────────────────────────────────────────────┘ + +┌─────────────────────────────────────────────┐ +│ TextField Event Isolate (DIFFERENT!) │ +│ └─ User presses Enter │ +│ └─ _sendMessage() called │ +│ └─ hierarchicalRag.search() ❌ │ +│ └─ generateEmbedding() ❌ │ +│ └─ FFI call FAILS! │ +│ "Cannot invoke native │ +│ callback from different │ +│ isolate" │ +└─────────────────────────────────────────────┘ +``` + +**چرا Import موفق بود؟** +- Import از Button → همان isolate اصلی → FFI موفق ✅ + +**چرا Search ناموفق بود؟** +- Search از TextField onSubmitted → isolate متفاوت → FFI ناموفق ❌ + +--- + +## ✅ راه‌حل نهایی (Final Solution) + +### تغییر در `public_lab_chat_screen.dart` (خطوط 232-245) + +```dart +// CRITICAL FIX: Force execution on MAIN isolate +List ragResults = []; + +await Future(() async { + // این Future تضمین می‌کنه که کد در main event loop اجرا بشه + // همون جایی که LlamaCpp model initialize شده + ragResults = await hierarchicalRag.search( + query: messageToSend, + maxResults: 5, + useRRF: true, + allowedSources: labSources.toSet(), + ); +}); +``` + +### چرا این کار می‌کنه؟ + +`Future(() async { ... })` یک microtask در main event loop ایجاد می‌کنه و اجرای کد رو به همون isolate که app شروع شده برمی‌گردونه. + +--- + +## 🧪 تست کردن + +### مراحل تست: + +1. **Clean Build:** +```bash +flutter clean +flutter pub get +``` + +2. **Run Application:** +```bash +flutter run -d linux # or your desktop platform +``` + +3. **بررسی Logs در Startup:** +``` +[EmbeddingService] Using LlamaCpp embedding model from config: /path/to/model.gguf +[EmbeddingService] Isolate mode disabled for LlamaCpp FFI backend +[LlamaCppEmbedding] LlamaCpp embedding model loaded successfully (sync mode) +``` + +4. **برو به `public_lab_chat_screen`** + - Bot toggle را روشن کن + - RAG toggle را روشن کن + +5. **یک پیام بفرست و Logs را بررسی کن:** + +### ✅ Logs موفق (اگه کار کنه): + +``` +[PublicLabChatScreen] 🚀 Starting RAG search with query: "your query" +[HierarchicalRAG] 🔎 Starting Hybrid Search +[HierarchicalRetrieval] 🚀 Starting 3-Stage Hierarchical Retrieval +[HierarchicalRetrieval] 🔍 [Stage 1] Document-level search +[EmbeddingService] 🔍 [generateEmbedding] Starting for text (X chars) +[EmbeddingService] 🔧 Calling backend.generateEmbedding (NO YIELD)... +[LlamaCppEmbedding] 🔍 [LlamaCppBackend] generateEmbedding async wrapper called +[LlamaCppEmbedding] 🔧 [SYNC] Calling FFI getEmbeddings()... +[LlamaCppEmbedding] ✅ [SYNC] FFI call success (dim: 1024) +[EmbeddingService] ✅ Generated embedding (dim: 1024) +[HierarchicalRetrieval] ✅ Query embedding generated +[HierarchicalRetrieval] 🔍 [Stage 2] First Window search +[HierarchicalRetrieval] 🔍 [Stage 3] Second Window search +[HierarchicalRAG] ✅ Hybrid search complete: X results +[PublicLabChatScreen] ✅ RAG search returned X results +``` + +### ❌ Logs ناموفق (اگه باز ارور بده): + +اگر باز این ارور رو دیدی: +``` +error: Cannot invoke native callback from a different isolate +``` + +یعنی `Future(() async { ... })` کافی نبود و باید از یکی از این روش‌های جایگزین استفاده کنیم: + +--- + +## 🔄 راه‌حل‌های جایگزین (اگر Fix فعلی کار نکرد) + +### گزینه 1: استفاده از SchedulerBinding + +```dart +import 'package:flutter/scheduler.dart'; + +SchedulerBinding.instance.addPostFrameCallback((_) async { + final ragResults = await hierarchicalRag.search(...); + // Handle results +}); +``` + +### گزینه 2: استفاده از Button به جای TextField onSubmitted + +```dart +// Replace TextField onSubmitted with IconButton +IconButton( + icon: Icon(Icons.send), + onPressed: () async { + // This runs in main isolate + await _sendMessage(); + }, +) +``` + +### گزینه 3: استفاده از Compute با Model Re-initialization + +```dart +// Create isolated function +Future> _searchInIsolate(String query) async { + // Re-initialize LlamaCpp in THIS isolate + final backend = LlamaCppEmbeddingBackend(); + await backend.initialize(modelPath: AppConfig.llamaCppEmbeddingModelPath); + + // Perform search + final results = await hierarchicalRag.search(query: query, ...); + + await backend.dispose(); + return results; +} + +// Call with compute +final results = await compute(_searchInIsolate, messageToSend); +``` + +--- + +## 📊 خلاصه تمام تغییرات انجام شده + +### 1. `embedding_service.dart` +- ✅ غیرفعال کردن Isolate برای Desktop (خط 84) +- ✅ پردازش Sequential (خطوط 286-343) +- ✅ لاگ‌های مفصل + +### 2. `llama_cpp_embedding_backend_io.dart` +- ✅ متد `_generateEmbeddingSync()` برای FFI خالص (خطوط 25-46) +- ✅ لاگ‌های مفصل برای FFI calls + +### 3. `hierarchical_rag_manager.dart` +- ✅ پارامتر `useIsolate` با auto-detection (خطوط 126-139) +- ✅ Sequential indexing بدون `Future.wait()` (خطوط 510-541, 834-865) +- ✅ لاگ‌های مفصل در `search()` + +### 4. `hierarchical_retrieval_service.dart` +- ✅ لاگ‌های مفصل برای هر 3 Stage +- ✅ Separator logs برای خوانایی بهتر + +### 5. **`public_lab_chat_screen.dart` (FIX اصلی)** +- ✅ Import برای `HybridSearchResult` (خط 5) +- ✅ **Wrapping RAG search در `Future(() async { ... })`** (خطوط 232-245) +- ✅ لاگ‌های مفصل قبل و بعد از RAG search + +### 6. `RAG_DESKTOP_FIX_SUMMARY.md` +- ✅ مستندات کامل تغییرات قبلی + +--- + +## 🎯 نتیجه‌گیری + +این آخرین تلاش برای حل مشکل isolate است. اگر این fix کار کرد: +- ✅ مشکل حل شد، RAG search از TextField کار می‌کنه + +اگر کار نکرد: +- باید از یکی از راه‌حل‌های جایگزین استفاده کنیم +- احتمالاً باید Button استفاده کنیم به جای TextField onSubmitted +- یا باید LlamaCpp رو در Isolate جداگانه initialize کنیم + +**لطفاً برنامه رو اجرا کن و نتیجه رو بهم بگو! 🙏** diff --git a/android/dai/dai/README.md b/android/dai/dai/README.md new file mode 100644 index 0000000..ce0bf4f --- /dev/null +++ b/android/dai/dai/README.md @@ -0,0 +1,185 @@ +# Distributed AI Chat (DAI) + +A research project implementing a distributed AI chat system with RAG (Retrieval-Augmented Generation) capabilities, supporting multiple AI models and edge computing. + +## ⚠️ License Notice + +**This is a proprietary research project. All rights reserved.** + +This software is protected by copyright and is made available under a proprietary research license. Unauthorized copying, distribution, or commercial use is strictly prohibited. + +**Key License Terms:** +- ✅ **Research & Education**: Free to use for research and educational purposes +- ✅ **Contributions Welcome**: You can contribute improvements via pull requests +- ❌ **Commercial Use**: Prohibited without explicit written permission +- ❌ **Distribution**: You may not distribute or publish this software +- ❌ **Standalone Copies**: You may not create independent forks for distribution + +For complete license terms, please see [LICENSE](LICENSE) file. + +## 📋 Table of Contents + +- [Features](#features) +- [Architecture](#architecture) +- [Installation](#installation) +- [Usage](#usage) +- [Contributing](#contributing) +- [License](#license) +- [Contact](#contact) + +## ✨ Features + +- **Multiple AI Models**: Support for Gemma, DeepSeek, Llama, and other models +- **Distributed Computing**: Local and distributed processing modes +- **RAG System**: Retrieval-Augmented Generation with document management +- **Edge AI**: On-device AI processing with Flutter Gemma +- **Modern UI**: Optimized, fast, and user-friendly interface +- **Document Management**: Import and manage documents for RAG queries + +## 🏗️ Architecture + +``` +├── 🎨 frontend/ # UI Layer +│ ├── screens/ # Application screens +│ ├── widgets/ # Reusable UI components +│ └── controllers/ # UI controllers +├── 🔧 backend/ # AI Engine Layer +│ ├── ai_engine.dart # Base AI engine interface +│ ├── gemma_engine.dart # Flutter Gemma implementation +│ └── llama_engine.dart # LlamaCpp implementation +├── 🌐 network/ # Distributed System +│ ├── distributed_manager.dart +│ ├── rag_worker.dart +│ └── routing_client.dart +├── 📚 rag/ # RAG System +│ ├── rag_manager.dart +│ ├── embedding_service.dart +│ └── text_chunker.dart +└── 📦 shared/ # Shared utilities + ├── models.dart + └── logger.dart +``` + +## 🚀 Installation + +### Prerequisites + +- Flutter SDK (>=3.24.0) +- Dart SDK (>=3.5.0) + +### Setup + +1. Clone the repository: +```bash +git clone [repository-url] +cd distributed-ai +``` + +2. Install dependencies: +```bash +flutter pub get +``` + +3. Run the application: +```bash +flutter run +``` + +## 📖 Usage + +### Running the Application + +```bash +# Mobile (Android/iOS) +flutter run + +# Desktop +flutter run -d windows +flutter run -d macos +flutter run -d linux + +# Web +flutter run -d web +``` + +### Key Features Usage + +1. **Model Selection**: Browse and select AI models from the home screen +2. **Download Models**: Download required models before use +3. **Chat Interface**: Start conversations with selected models +4. **Document Management**: Import documents in the Backpack screen +5. **RAG Queries**: Use RAG system for context-aware responses +6. **Distributed Mode**: Toggle between local and distributed processing + +## 🤝 Contributing + +We welcome contributions to this research project! + +**Important**: By contributing, you acknowledge that: +- Your contributions become the property of the project owner +- You grant a perpetual license to use your contributions +- This is a research project, not traditional open-source + +### How to Contribute + +1. Fork the repository (for contribution purposes only) +2. Create a feature branch +3. Make your changes +4. Submit a pull request + +For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md). + +### Contribution Areas + +- 🐛 Bug fixes +- ⚡ Performance improvements +- 🎨 UI/UX enhancements +- 📝 Documentation +- 🔧 Code quality improvements +- ✨ New features aligned with research goals + +## 📄 License + +This project is licensed under a **Proprietary Research License**. + +**Copyright (c) 2024 [Your Name/Organization]. All rights reserved.** + +### License Summary + +- **Research & Education**: ✅ Allowed +- **Contributions**: ✅ Welcome via pull requests +- **Commercial Use**: ❌ Prohibited +- **Distribution**: ❌ Prohibited +- **Standalone Copies**: ❌ Prohibited + +For complete license terms and conditions, please read the [LICENSE](LICENSE) file. + +### Research Use + +If you use this project in your research: +- Please cite the project appropriately +- Acknowledge the project in your publications +- Share your findings and improvements back to the project + +## 📧 Contact + +For questions, licensing inquiries, or collaboration opportunities: + +- **Email**: [mshafie575@gmail.com] +- **Repository**: [https://github.com/wikm360/Distributed-AI] +- **Issues**: [https://github.com/wikm360/Distributed-AI/issues] + +## 🙏 Acknowledgments + +- Flutter Gemma team for edge AI capabilities +- All contributors who have helped improve this project +- Research community for feedback and suggestions + +## ⚠️ Disclaimer + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + +--- + +**Note**: This is a research project. For commercial licensing or special use cases, please contact the project owner. + diff --git a/android/dai/dai/analysis.txt b/android/dai/dai/analysis.txt new file mode 100644 index 0000000..1889cac --- /dev/null +++ b/android/dai/dai/analysis.txt @@ -0,0 +1,154 @@ +Analyzing Mobile... + + info • Don't invoke 'print' in production code • lib/core/utils/logger.dart:9:5 • avoid_print + info • Don't invoke 'print' in production code • lib/core/utils/logger.dart:16:5 • avoid_print + info • Don't invoke 'print' in production code • lib/core/utils/logger.dart:23:5 • avoid_print + info • Don't invoke 'print' in production code • lib/core/utils/logger.dart:30:5 • avoid_print + info • Use interpolation to compose strings and values • lib/features/chat/data/chat_repository.dart:85:19 • prefer_interpolation_to_compose_strings + info • Use interpolation to compose strings and values • lib/features/chat/data/websocket_service.dart:16:19 • prefer_interpolation_to_compose_strings + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/bot_generating_bubble.dart:38:60 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/chat_header.dart:43:51 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/chat_header.dart:63:48 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/chat_header.dart:64:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/chat_input.dart:58:41 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/chat_input.dart:130:14 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/chat_input.dart:138:18 • deprecated_member_use + info • Don't use 'BuildContext's across async gaps • lib/features/chat/screens/components/chat_input.dart:176:28 • use_build_context_synchronously + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/file_download_view.dart:260:31 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/message_bubble.dart:57:60 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/unread_separator.dart:16:46 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/unread_separator.dart:19:61 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/unread_separator.dart:42:47 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/unread_separator.dart:45:47 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/warning_banner.dart:14:32 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/components/warning_banner.dart:16:51 • deprecated_member_use + info • Statements in an if should be enclosed in a block • lib/features/chat/screens/lab_chat_screen.dart:111:9 • curly_braces_in_flow_control_structures + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_chat_screen.dart:898:22 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_chat_screen.dart:902:24 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_chat_screen.dart:922:28 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_rooms_screen.dart:182:63 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_rooms_screen.dart:513:61 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_rooms_screen.dart:523:52 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_rooms_screen.dart:605:22 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/lab_rooms_screen.dart:607:41 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:176:55 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:182:57 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:193:57 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:998:33 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1004:35 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1036:38 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1101:45 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1135:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1157:22 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1195:35 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1213:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1214:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1252:45 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1265:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1278:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/chat/screens/labs_screen.dart:1305:33 • deprecated_member_use + info • The private field _strokeWidth could be 'final' • lib/features/chat/screens/room_pdf_viewer_screen.dart:106:10 • prefer_final_fields + info • 'value' is deprecated and shouldn't be used. Use component accessors like .r or .g, or toARGB32 for an explicit conversion • lib/features/chat/screens/room_pdf_viewer_screen.dart:623:31 • deprecated_member_use + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_pdf_service.dart:147:13 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_pdf_service.dart:151:11 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_pdf_service.dart:154:11 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_pdf_service.dart:158:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_room_service.dart:240:13 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_room_service.dart:244:11 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_room_service.dart:247:11 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/lab_room_service.dart:251:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/websocket_service.dart:54:13 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/websocket_service.dart:58:11 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/websocket_service.dart:62:11 • avoid_print + info • Don't invoke 'print' in production code • lib/features/chat/services/websocket_service.dart:67:7 • avoid_print + info • Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check • lib/features/note/screens/note_screen.dart:917:31 • use_build_context_synchronously + info • Don't invoke 'print' in production code • lib/features/note/services/note_service.dart:32:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/note/services/note_service.dart:78:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/note/services/note_service.dart:93:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/note/services/note_service.dart:104:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/note/services/note_service.dart:131:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/note/services/note_service.dart:162:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/rag/services/file_manager.dart:36:7 • avoid_print + info • Don't invoke 'print' in production code • lib/features/rag/services/file_manager.dart:133:7 • avoid_print + info • Missing a deprecation message • lib/features/rag/services/hierarchical_chunker.dart:168:3 • provide_deprecation_message + info • Unnecessary braces in a string interpolation • lib/features/rag/services/pdf_page_selector.dart:133:34 • unnecessary_brace_in_string_interps + info • Unnecessary braces in a string interpolation • lib/features/rag/services/text_preprocessor.dart:149:29 • unnecessary_brace_in_string_interps + info • String literals shouldn't be concatenated by the '+' operator • lib/features/rag/services/text_preprocessor.dart:231:40 • prefer_adjacent_string_concatenation + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:297:33 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:298:35 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:299:30 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:304:32 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:316:34 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:324:36 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:367:37 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:368:35 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:369:37 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:383:48 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:412:45 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:433:45 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:456:55 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:462:62 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:524:37 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:525:33 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:526:31 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:545:48 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:598:41 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:648:33 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:695:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:700:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:709:40 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:715:35 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:746:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:822:48 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:841:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:887:47 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:903:53 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:905:60 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:920:51 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:922:60 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:940:46 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:962:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1003:43 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1005:52 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1023:29 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1042:35 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1074:39 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1076:58 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1086:58 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1107:52 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1131:48 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1141:52 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1192:36 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1197:38 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1211:37 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1226:46 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1271:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1296:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1297:49 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1302:62 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1306:47 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1307:46 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1345:55 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1346:55 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1352:58 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1422:62 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1429:64 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1443:54 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1448:56 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1486:58 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1489:60 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1503:60 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1516:59 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1521:59 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1592:47 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1625:43 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1633:43 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1650:58 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1753:52 • deprecated_member_use + info • 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss • lib/features/settings/screens/settings_screen.dart:1763:56 • deprecated_member_use + info • Don't invoke 'print' in production code • lib/main.dart:164:5 • avoid_print + info • Don't invoke 'print' in production code • lib/main.dart:166:5 • avoid_print + info • The constant name 'qwen25_1_5B_Instruct' isn't a lowerCamelCase identifier • lib/shared/models/models.dart:165:3 • constant_identifier_names + info • The constant name 'qwen25_0_5B_instruct' isn't a lowerCamelCase identifier • lib/shared/models/models.dart:181:3 • constant_identifier_names + +150 issues found. (ran in 78.4s) diff --git a/android/dai/dai/analysis_options.yaml b/android/dai/dai/analysis_options.yaml new file mode 100644 index 0000000..f9b3034 --- /dev/null +++ b/android/dai/dai/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml diff --git a/coordinator_frontend/android/.gitignore b/android/dai/dai/android/.gitignore similarity index 100% rename from coordinator_frontend/android/.gitignore rename to android/dai/dai/android/.gitignore diff --git a/android/dai/dai/android/app/build.gradle.kts b/android/dai/dai/android/app/build.gradle.kts new file mode 100644 index 0000000..df557b9 --- /dev/null +++ b/android/dai/dai/android/app/build.gradle.kts @@ -0,0 +1,72 @@ +import java.util.Properties +import java.io.FileInputStream + +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") +} + +// خواندن key.properties +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +android { + namespace = "com.example.chatbot" + compileSdk = 36 + ndkVersion = "27.0.12077973" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + applicationId = "com.example.chatbot" + minSdk = 24 + targetSdk = 36 + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String? + } + } + + buildTypes { + // getByName("release") { + // isMinifyEnabled = false + // isShrinkResources = false + // signingConfig = signingConfigs.getByName("release") + // } + getByName("release") { + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android.txt"), + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("release") + } + getByName("debug") { + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/android/dai/dai/android/app/proguard-rules.pro b/android/dai/dai/android/app/proguard-rules.pro new file mode 100644 index 0000000..63f6e82 --- /dev/null +++ b/android/dai/dai/android/app/proguard-rules.pro @@ -0,0 +1,19 @@ +# Mediapipe +-keep class com.google.mediapipe.** { *; } +-dontwarn com.google.mediapipe.** + +# Protobuf +-keep class com.google.protobuf.** { *; } +-dontwarn com.google.protobuf.** + +# AutoValue / JavaPoet +-keep class com.google.auto.value.** { *; } +-dontwarn com.google.auto.value.** + +# javax.lang.model +-dontwarn javax.lang.model.** + +# OkHttp & BouncyCastle & Conscrypt +-dontwarn org.bouncycastle.** +-dontwarn org.conscrypt.** +-dontwarn org.openjsse.** diff --git a/coordinator_frontend/android/app/src/debug/AndroidManifest.xml b/android/dai/dai/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from coordinator_frontend/android/app/src/debug/AndroidManifest.xml rename to android/dai/dai/android/app/src/debug/AndroidManifest.xml diff --git a/android/dai/dai/android/app/src/main/AndroidManifest.xml b/android/dai/dai/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a296d87 --- /dev/null +++ b/android/dai/dai/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/dai/dai/android/app/src/main/kotlin/com/example/chatbot/MainActivity.kt b/android/dai/dai/android/app/src/main/kotlin/com/example/chatbot/MainActivity.kt new file mode 100644 index 0000000..70c6bc8 --- /dev/null +++ b/android/dai/dai/android/app/src/main/kotlin/com/example/chatbot/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.chatbot + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/android/dai/dai/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-hdpi/android12splash.png new file mode 100644 index 0000000..dbeffc8 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-hdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/dai/dai/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5b8b6ce Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-hdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-hdpi/splash.png new file mode 100644 index 0000000..dbeffc8 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-hdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-mdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-mdpi/android12splash.png new file mode 100644 index 0000000..9cf188c Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-mdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/dai/dai/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7b62615 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-mdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-mdpi/splash.png new file mode 100644 index 0000000..9cf188c Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-mdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-hdpi/android12splash.png new file mode 100644 index 0000000..ac33f88 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-hdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-hdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-hdpi/splash.png new file mode 100644 index 0000000..ac33f88 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-hdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-mdpi/android12splash.png new file mode 100644 index 0000000..8134d8f Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-mdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-mdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-mdpi/splash.png new file mode 100644 index 0000000..8134d8f Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-mdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-v21/background.png b/android/dai/dai/android/app/src/main/res/drawable-night-v21/background.png new file mode 100644 index 0000000..e815fd6 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-v21/background.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-v21/launch_background.xml b/android/dai/dai/android/app/src/main/res/drawable-night-v21/launch_background.xml new file mode 100644 index 0000000..3cc4948 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/drawable-night-v21/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-xhdpi/android12splash.png new file mode 100644 index 0000000..a99e783 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-xhdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-xhdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-xhdpi/splash.png new file mode 100644 index 0000000..a99e783 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-xhdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png new file mode 100644 index 0000000..05650fb Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-xxhdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-xxhdpi/splash.png new file mode 100644 index 0000000..05650fb Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-xxhdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png new file mode 100644 index 0000000..816651a Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night-xxxhdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-night-xxxhdpi/splash.png new file mode 100644 index 0000000..816651a Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night-xxxhdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night/background.png b/android/dai/dai/android/app/src/main/res/drawable-night/background.png new file mode 100644 index 0000000..e815fd6 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-night/background.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-night/launch_background.xml b/android/dai/dai/android/app/src/main/res/drawable-night/launch_background.xml new file mode 100644 index 0000000..3cc4948 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/drawable-night/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/drawable-v21/background.png b/android/dai/dai/android/app/src/main/res/drawable-v21/background.png new file mode 100644 index 0000000..8e21404 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-v21/background.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-v21/launch_background.xml b/android/dai/dai/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..3cc4948 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/drawable-xhdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-xhdpi/android12splash.png new file mode 100644 index 0000000..0b99c81 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xhdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/dai/dai/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c19b32e Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xhdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-xhdpi/splash.png new file mode 100644 index 0000000..0b99c81 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xhdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/android12splash.png new file mode 100644 index 0000000..19d8a27 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..1cee360 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/splash.png new file mode 100644 index 0000000..19d8a27 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xxhdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/android12splash.png new file mode 100644 index 0000000..fbccc67 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/android12splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..927d30c Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/splash.png new file mode 100644 index 0000000..fbccc67 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable-xxxhdpi/splash.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable/background.png b/android/dai/dai/android/app/src/main/res/drawable/background.png new file mode 100644 index 0000000..8e21404 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/drawable/background.png differ diff --git a/android/dai/dai/android/app/src/main/res/drawable/launch_background.xml b/android/dai/dai/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..3cc4948 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/dai/dai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c79c58a --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/dai/dai/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db41a6e Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/dai/dai/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/dai/dai/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..a4f301e Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/dai/dai/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/dai/dai/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..b57f09a Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/dai/dai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/dai/dai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8e1d5c1 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/dai/dai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/dai/dai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..39c6e84 Binary files /dev/null and b/android/dai/dai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/dai/dai/android/app/src/main/res/values-night-v31/styles.xml b/android/dai/dai/android/app/src/main/res/values-night-v31/styles.xml new file mode 100644 index 0000000..2ddcec1 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/values-night/styles.xml b/android/dai/dai/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..dbc9ea9 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/values-v31/styles.xml b/android/dai/dai/android/app/src/main/res/values-v31/styles.xml new file mode 100644 index 0000000..e437c38 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/values/colors.xml b/android/dai/dai/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..8446d5e --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + #ffffff + #FFFFFF + \ No newline at end of file diff --git a/android/dai/dai/android/app/src/main/res/values/styles.xml b/android/dai/dai/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..0d1fa8f --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/dai/dai/android/app/src/main/res/xml/network_security_config.xml b/android/dai/dai/android/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..f35b0a3 --- /dev/null +++ b/android/dai/dai/android/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,16 @@ + + + + dai.wikm.ir + + + + + + + + + + + + \ No newline at end of file diff --git a/coordinator_frontend/android/app/src/profile/AndroidManifest.xml b/android/dai/dai/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from coordinator_frontend/android/app/src/profile/AndroidManifest.xml rename to android/dai/dai/android/app/src/profile/AndroidManifest.xml diff --git a/android/dai/dai/android/build.gradle.kts b/android/dai/dai/android/build.gradle.kts new file mode 100644 index 0000000..2f947c2 --- /dev/null +++ b/android/dai/dai/android/build.gradle.kts @@ -0,0 +1,26 @@ +allprojects { + repositories { + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/central") } + maven { url = uri("https://maven.aliyun.com/repository/public") } + // Flutter mirror for engine artifacts + maven { url = uri("https://storage.flutter-io.cn/download.flutter.io") } + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/dai/dai/android/gradle.properties b/android/dai/dai/android/gradle.properties new file mode 100644 index 0000000..bcfd51b --- /dev/null +++ b/android/dai/dai/android/gradle.properties @@ -0,0 +1,17 @@ +# org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true + +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.daemon=true +org.gradle.parallel=true + +# systemProp.http.proxyHost=127.0.0.1 +# systemProp.http.proxyPort=12334 +# systemProp.https.proxyHost=127.0.0.1 +# systemProp.https.proxyPort=12334 +# systemProp.http.nonProxyHosts=localhost|127.*|[::1] + +org.gradle.offline=true + +org.gradle.caching=true \ No newline at end of file diff --git a/android/dai/dai/android/gradle/wrapper/gradle-wrapper.properties b/android/dai/dai/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ac3b479 --- /dev/null +++ b/android/dai/dai/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/android/dai/dai/android/settings.gradle.kts b/android/dai/dai/android/settings.gradle.kts new file mode 100644 index 0000000..35b9f32 --- /dev/null +++ b/android/dai/dai/android/settings.gradle.kts @@ -0,0 +1,30 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/central") } + maven { url = uri("https://maven.aliyun.com/repository/public") } + // Flutter mirror for plugin artifacts + maven { url = uri("https://storage.flutter-io.cn/download.flutter.io") } + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.9.1" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/android/dai/dai/assets/earth.png b/android/dai/dai/assets/earth.png new file mode 100644 index 0000000..d09b4af Binary files /dev/null and b/android/dai/dai/assets/earth.png differ diff --git a/android/dai/dai/assets/icon.png b/android/dai/dai/assets/icon.png new file mode 100644 index 0000000..2c34b00 Binary files /dev/null and b/android/dai/dai/assets/icon.png differ diff --git a/android/dai/dai/assets/logo.png b/android/dai/dai/assets/logo.png new file mode 100644 index 0000000..c72e334 Binary files /dev/null and b/android/dai/dai/assets/logo.png differ diff --git a/android/dai/dai/assets/logo.svg b/android/dai/dai/assets/logo.svg new file mode 100644 index 0000000..27d327c --- /dev/null +++ b/android/dai/dai/assets/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/android/dai/dai/assets/logo.xcf b/android/dai/dai/assets/logo.xcf new file mode 100644 index 0000000..5c819b7 Binary files /dev/null and b/android/dai/dai/assets/logo.xcf differ diff --git a/android/dai/dai/assets/logo_dark.png b/android/dai/dai/assets/logo_dark.png new file mode 100644 index 0000000..a62402e Binary files /dev/null and b/android/dai/dai/assets/logo_dark.png differ diff --git a/android/dai/dai/assets/logo_white.png b/android/dai/dai/assets/logo_white.png new file mode 100644 index 0000000..1bd72b3 Binary files /dev/null and b/android/dai/dai/assets/logo_white.png differ diff --git a/android/dai/dai/assets/whiteboard_room.txt b/android/dai/dai/assets/whiteboard_room.txt new file mode 100644 index 0000000..39738b6 --- /dev/null +++ b/android/dai/dai/assets/whiteboard_room.txt @@ -0,0 +1 @@ +whiteboard-room diff --git a/android/dai/dai/backend/.env.example b/android/dai/dai/backend/.env.example new file mode 100644 index 0000000..8bc9c01 --- /dev/null +++ b/android/dai/dai/backend/.env.example @@ -0,0 +1,42 @@ +# Environment Variables Template for Backend + +# Database +DATABASE_URL=postgresql+asyncpg://postgres:Mey#Birth@miN2004@localhost:5432/dai_db + +# Redis +REDIS_URL=redis://localhost:6379/0 + +# JWT Settings +SECRET_KEY=supersecretkeychangeinproduction +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=100 + +# LiveKit Settings +LIVEKIT_URL=ws://94.183.170.121:7880 +LIVEKIT_API_KEY=devkey +LIVEKIT_API_SECRET=secret + +# LibreTranslate Settings +# Set to true to enable translation feature +ENABLE_TRANSLATION=false + +# LibreTranslate URL (only needed if ENABLE_TRANSLATION=true) +# For local Docker Compose deployment +LIBRETRANSLATE_URL=http://localhost:5000 + +# For Docker Compose with service name +# LIBRETRANSLATE_URL=http://libretranslate:5000 + +# For remote server +# LIBRETRANSLATE_URL=http://YOUR_SERVER_IP:5000 + +# News Settings +NEWS_FETCH_INTERVAL_HOURS=4 +NEWS_MAX_ITEMS_PER_CATEGORY=50 + +# Gitea Settings +GITEA_API_URL=http://localhost:3000/api/v1 +GITEA_ADMIN_TOKEN= +GITEA_ADMIN_USERNAME= +GITEA_WEBHOOK_SECRET= +GIT_REPOS_BASE_DIR=/tmp/git_repos diff --git a/android/dai/dai/backend/Dockerfile b/android/dai/dai/backend/Dockerfile new file mode 100644 index 0000000..52f2acb --- /dev/null +++ b/android/dai/dai/backend/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.11-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/android/dai/dai/backend/app/ai/router.py b/android/dai/dai/backend/app/ai/router.py new file mode 100644 index 0000000..5a7cffa --- /dev/null +++ b/android/dai/dai/backend/app/ai/router.py @@ -0,0 +1,30 @@ +from fastapi import APIRouter, HTTPException +from app.ai.service import AIService +from pydantic import BaseModel +from fastapi.responses import StreamingResponse + +router = APIRouter() + +class ChatRequest(BaseModel): + messages: list # لیست پیام‌ها (مثل [{"role": "user", "content": "سلام"}]) + +ai_service = AIService() + +@router.post("/chat/stream") +async def chat_stream(request: ChatRequest): + """ + پاسخ‌ها را به صورت استریم (تکه‌تکه) برای فرانت‌اند ارسال می‌کند + """ + try: + # ایجاد استریم و ارسال تکه‌های پاسخ + return StreamingResponse( + ai_service.generate_stream(request.messages), + media_type="text/event-stream", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "X-Accel-Buffering": "no", + }, + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/android/dai/dai/backend/app/ai/service.py b/android/dai/dai/backend/app/ai/service.py new file mode 100644 index 0000000..b559b0b --- /dev/null +++ b/android/dai/dai/backend/app/ai/service.py @@ -0,0 +1,34 @@ +import json + +from openai import AsyncOpenAI +from app.core.config import settings + +class AIService: + def __init__(self): + self.client = AsyncOpenAI( + api_key=settings.AI_API_KEY, + base_url=settings.AI_BASE_URL + ) + + async def generate_stream(self, messages: list): + """ + پاسخ‌ها را به صورت استریم دریافت می‌کند (با بررسی امنیتی) + """ + stream = await self.client.chat.completions.create( + model=settings.AI_MODEL, + messages=messages, + stream=True, + temperature=0.9, + max_tokens=10000 + ) + + async for chunk in stream: + if chunk.choices and chunk.choices[0].delta.content is not None: + token = chunk.choices[0].delta.content + payload = json.dumps({"token": token}, ensure_ascii=False) + yield f"data: {payload}\n\n" + elif chunk.choices and chunk.choices[0].delta.content is None: + continue + else: + print(f"Empty choices in chunk: {chunk}") + yield "data: [DONE]\n\n" diff --git a/android/dai/dai/backend/app/auth/router.py b/android/dai/dai/backend/app/auth/router.py new file mode 100644 index 0000000..77bb714 --- /dev/null +++ b/android/dai/dai/backend/app/auth/router.py @@ -0,0 +1,32 @@ +from datetime import timedelta +from fastapi import APIRouter, Depends, HTTPException, status +from fastapi.security import OAuth2PasswordRequestForm +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.database import get_db +from app.core.security import create_access_token +from app.core.config import settings +from app.auth.service import authenticate_user, register_new_user +from app.auth.schemas import Token, UserLogin +from app.users.schemas import UserCreate, UserResponse + +router = APIRouter() + +@router.post("/login", response_model=Token) +async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db)): + user = await authenticate_user(db, form_data.username, form_data.password) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + subject=user.username, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + +@router.post("/register", response_model=UserResponse) +async def register(user_in: UserCreate, db: AsyncSession = Depends(get_db)): + user = await register_new_user(db, user_in) + return user diff --git a/android/dai/dai/backend/app/auth/schemas.py b/android/dai/dai/backend/app/auth/schemas.py new file mode 100644 index 0000000..56c759b --- /dev/null +++ b/android/dai/dai/backend/app/auth/schemas.py @@ -0,0 +1,13 @@ +from pydantic import BaseModel, EmailStr +from typing import Optional + +class Token(BaseModel): + access_token: str + token_type: str + +class TokenData(BaseModel): + username: Optional[str] = None + +class UserLogin(BaseModel): + username: str + password: str diff --git a/android/dai/dai/backend/app/auth/service.py b/android/dai/dai/backend/app/auth/service.py new file mode 100644 index 0000000..020abd6 --- /dev/null +++ b/android/dai/dai/backend/app/auth/service.py @@ -0,0 +1,35 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from fastapi import HTTPException, status +from app.users.service import get_user_by_username, create_user +from app.users.schemas import UserCreate +from app.core.security import verify_password, create_access_token +from app.auth.schemas import UserLogin + +async def authenticate_user(db: AsyncSession, username: str, password: str): + user = await get_user_by_username(db, username) + if not user: + return False + if not verify_password(password, user.hashed_password): + return False + return user + +async def register_new_user(db: AsyncSession, user_in: UserCreate): + # Check if username already exists + user = await get_user_by_username(db, user_in.username) + if user: + raise HTTPException( + status_code=400, + detail="Username already registered", + ) + + # Check if email already exists + from app.users.service import get_user_by_email + existing_email = await get_user_by_email(db, user_in.email) + if existing_email: + raise HTTPException( + status_code=400, + detail="Email already registered", + ) + + user = await create_user(db, user_in) + return user diff --git a/android/dai/dai/backend/app/bot/router.py b/android/dai/dai/backend/app/bot/router.py new file mode 100644 index 0000000..d840c9b --- /dev/null +++ b/android/dai/dai/backend/app/bot/router.py @@ -0,0 +1,24 @@ +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from tavily import TavilyClient + +router = APIRouter() + +class SearchRequest(BaseModel): + query: str + +@router.post("/search") +async def search_web(request: SearchRequest): + try: + client = TavilyClient("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") + response = client.search( + query=request.query, + include_answer="basic" + ) + return response + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/process") +async def process_bot_message(message: dict): + return {"status": "received", "message": "Bot is under construction"} diff --git a/android/dai/dai/backend/app/chat/models.py b/android/dai/dai/backend/app/chat/models.py new file mode 100644 index 0000000..1d7b26a --- /dev/null +++ b/android/dai/dai/backend/app/chat/models.py @@ -0,0 +1,64 @@ +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func +from app.core.database import Base + +class Chat(Base): + __tablename__ = "chats" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + title = Column(String, nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + lab = relationship("Lab", back_populates="chats") + messages = relationship("ChatMessage", back_populates="chat", cascade="all, delete-orphan") + members = relationship("ChatMember", back_populates="chat", cascade="all, delete-orphan") + +class ChatMember(Base): + __tablename__ = "chat_members" + + id = Column(Integer, primary_key=True, index=True) + chat_id = Column(Integer, ForeignKey("chats.id"), nullable=False) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + joined_at = Column(DateTime(timezone=True), server_default=func.now()) + last_read_message_id = Column(Integer, ForeignKey("chat_messages.id"), nullable=True) + + chat = relationship("Chat", back_populates="members") + user = relationship("User") + +class ChatMessage(Base): + __tablename__ = "chat_messages" + + id = Column(Integer, primary_key=True, index=True) + chat_id = Column(Integer, ForeignKey("chats.id"), nullable=False) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + content = Column(String, nullable=False) + is_bot_message = Column(Boolean, default=False) + timestamp = Column(DateTime(timezone=True), server_default=func.now()) + + # File attachment fields + file_url = Column(String, nullable=True) + file_name = Column(String, nullable=True) + file_type = Column(String, nullable=True) + file_size = Column(Integer, nullable=True) + + # Reply-to field (self-referential) + reply_to_id = Column(Integer, ForeignKey("chat_messages.id"), nullable=True) + + chat = relationship("Chat", back_populates="messages") + lab = relationship("Lab") + user = relationship("User") + reply_to = relationship( + "ChatMessage", + foreign_keys=[reply_to_id], + remote_side="ChatMessage.id", + uselist=False, + lazy="selectin", + ) + + @property + def sender_name(self) -> str: + return self.user.username if self.user else "Unknown" diff --git a/android/dai/dai/backend/app/chat/redis_manager.py b/android/dai/dai/backend/app/chat/redis_manager.py new file mode 100644 index 0000000..a25b52c --- /dev/null +++ b/android/dai/dai/backend/app/chat/redis_manager.py @@ -0,0 +1,24 @@ +import json +import asyncio +from app.core.redis import get_redis + +class RedisManager: + def __init__(self): + self.redis = None + + async def connect(self): + self.redis = await get_redis() + + async def publish(self, channel: str, message: str): + if not self.redis: + await self.connect() + await self.redis.publish(channel, message) + + async def subscribe(self, channel: str): + if not self.redis: + await self.connect() + pubsub = self.redis.pubsub() + await pubsub.subscribe(channel) + return pubsub + +redis_manager = RedisManager() diff --git a/android/dai/dai/backend/app/chat/router.py b/android/dai/dai/backend/app/chat/router.py new file mode 100644 index 0000000..33ac054 --- /dev/null +++ b/android/dai/dai/backend/app/chat/router.py @@ -0,0 +1,295 @@ +from typing import List +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.database import get_db +from app.core.deps import get_current_user +from app.chat.models import ChatMessage +from app.chat.schemas import MessageResponse, ChatCreate, ChatResponse, ChatMemberResponse +from app.chat.redis_manager import redis_manager +from app.chat import service as chat_service +from app.labs import service as labs_service +from app.users.models import User +from pydantic import BaseModel +from typing import Optional +import json +import os +import uuid +from fastapi import UploadFile, File +from app.core.config import settings + +router = APIRouter() + +class BotMessageRequest(BaseModel): + chat_id: int + lab_id: int + bot_response: str + original_sender: str + bot_username: str + +# Chat management endpoints +@router.post("/{lab_id}/chats", response_model=ChatResponse) +async def create_chat( + lab_id: int, + chat_in: ChatCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Create a new chat in a lab""" + # Check if user is lab member + is_member = await labs_service.is_lab_member(db, lab_id, current_user.id) + if not is_member: + raise HTTPException(status_code=403, detail="Must be a lab member to create chats") + + chat = await chat_service.create_chat(db, lab_id, chat_in, current_user.id) + + # Format response + members = [ChatMemberResponse.from_orm(member) for member in chat.members] + return ChatResponse( + id=chat.id, + title=chat.title, + lab_id=chat.lab_id, + created_at=chat.created_at, + updated_at=chat.updated_at, + members=members + ) + +@router.get("/{lab_id}/chats", response_model=List[ChatResponse]) +async def get_lab_chats( + lab_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get all chats for a lab""" + chat_data = await chat_service.get_lab_chats(db, lab_id) + + # Format response + responses = [] + for chat in chat_data: + # Get unread count for the current user + unread_count = await chat_service.get_unread_count(db, chat['id'], current_user.id) + members = [ChatMemberResponse.from_orm(member) for member in chat['members']] + responses.append(ChatResponse( + id=chat['id'], + title=chat['title'], + lab_id=chat['lab_id'], + created_at=chat['created_at'], + updated_at=chat['updated_at'], + last_message=chat['last_message'], + unread_count=unread_count, + members=members + )) + return responses + +@router.post("/{lab_id}/chats/{chat_id}/join") +async def join_chat( + lab_id: int, + chat_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Join a chat""" + # Check if user is lab member + is_member = await labs_service.is_lab_member(db, lab_id, current_user.id) + if not is_member: + raise HTTPException(status_code=403, detail="Must be a lab member to join chats") + + # Add user to chat + member = await chat_service.add_chat_member(db, chat_id, current_user.id) + if member is None: + raise HTTPException(status_code=400, detail="Already a chat member") + + return {"status": "success", "message": "Joined chat successfully"} + +@router.get("/{lab_id}/chats/{chat_id}/history", response_model=List[MessageResponse]) +async def get_chat_history( + lab_id: int, + chat_id: int, + limit: int = 50, + before_id: Optional[int] = None, + after_id: Optional[int] = None, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get chat message history with pagination""" + # Check if user is chat member + is_member = await chat_service.is_chat_member(db, chat_id, current_user.id) + if not is_member: + raise HTTPException(status_code=403, detail="Must be a chat member to see history") + + messages = await chat_service.get_chat_history(db, chat_id, limit=limit, before_id=before_id, after_id=after_id) + return messages + +@router.delete("/{lab_id}/chats/{chat_id}") +async def delete_chat_endpoint( + lab_id: int, + chat_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a chat entirely""" + # Verify owner of lab or just require them to be lab owner / chat owner? + # For now, let's verify if they are lab owner (or you can verify chat membership) + is_owner = await labs_service.is_lab_owner(db, lab_id, current_user.id) + if not is_owner: + raise HTTPException(status_code=403, detail="Only lab owner can delete a chat") + + success = await chat_service.delete_chat_full(db, chat_id, current_user.id) + if not success: + raise HTTPException(status_code=404, detail="Chat not found") + + return {"status": "success", "message": "Chat deleted successfully"} + +@router.post("/{lab_id}/chats/{chat_id}/read") +async def mark_as_read( + lab_id: int, + chat_id: int, + message_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Mark chat messages as read up to message_id""" + await chat_service.mark_chat_read(db, chat_id, current_user.id, message_id) + + await db.refresh(current_user) + + # Publish read event to Redis for real-time updates + event = { + "type": "read_event", + "chat_id": chat_id, + "user_id": current_user.id, + "last_read_message_id": message_id + } + await redis_manager.publish(f"chat_{chat_id}", json.dumps(event)) + + return {"status": "success"} + +@router.get("/{lab_id}/chats/{chat_id}/first-unread") +async def get_first_unread( + lab_id: int, + chat_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get the ID of the first unread message in the chat""" + message_id = await chat_service.get_first_unread_message_id(db, chat_id, current_user.id) + return {"message_id": message_id} + +@router.post("/{lab_id}/chats/{chat_id}/bot-response") +async def send_bot_response( + lab_id: int, + chat_id: int, + bot_message: BotMessageRequest, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Send bot response to chat""" + # Check if user is chat member + is_member = await chat_service.is_chat_member(db, chat_id, current_user.id) + if not is_member: + raise HTTPException(status_code=403, detail="Must be a chat member to send messages") + + # Save bot message to DB + content = f"@{bot_message.bot_username}: {bot_message.bot_response}" + db_message = await chat_service.save_message(db, chat_id, lab_id, current_user.id, content, is_bot=True) + + # Publish to Redis for other users + response = { + "type": "bot_message", + "sender": bot_message.bot_username, + "sender_id": current_user.id, + "content": bot_message.bot_response, + "lab_id": lab_id, + "chat_id": chat_id, + "timestamp": db_message.timestamp.isoformat(), + "sender_avatar_url": None + } + await redis_manager.publish(f"chat_{chat_id}", json.dumps(response)) + + return {"status": "success", "message": "Bot response sent"} + +@router.post("/{lab_id}/chats/{chat_id}/upload", response_model=MessageResponse) +async def upload_chat_file( + lab_id: int, + chat_id: int, + file: UploadFile = File(...), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Upload a file to chat""" + # Check if user is chat member + is_member = await chat_service.is_chat_member(db, chat_id, current_user.id) + if not is_member: + raise HTTPException(status_code=403, detail="Must be a chat member to upload files") + + # Create directory if it doesn't exist + upload_dir = "app/static/chat_files" + os.makedirs(upload_dir, exist_ok=True) + + # Generate unique filename + file_extension = os.path.splitext(file.filename)[1] + unique_filename = f"{uuid.uuid4()}{file_extension}" + file_path = os.path.join(upload_dir, unique_filename) + + # Save file + content = await file.read() + with open(file_path, "wb") as f: + f.write(content) + + file_size = len(content) + file_url = f"/static/chat_files/{unique_filename}" + + # Save message to DB + db_message = await chat_service.save_message_with_file( + db, + chat_id, + lab_id, + current_user.id, + f"Sent a file: {file.filename}", + file_url=file_url, + file_name=file.filename, + file_type=file.content_type, + file_size=file_size + ) + + # Publish to Redis for real-time updates + response = { + "type": "user_message", + "id": db_message.id, + "sender": current_user.username, + "sender_id": current_user.id, + "content": db_message.content, + "lab_id": lab_id, + "chat_id": chat_id, + "timestamp": db_message.timestamp.isoformat(), + "file_url": file_url, + "file_name": file.filename, + "file_type": file.content_type, + "file_size": file_size, + "sender_avatar_url": current_user.avatar_url + } + await redis_manager.publish(f"chat_{chat_id}", json.dumps(response)) + + return db_message + +@router.delete("/{lab_id}/chats/{chat_id}/messages/{message_id}") +async def delete_chat_message( + lab_id: int, + chat_id: int, + message_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a chat message""" + success = await chat_service.delete_message(db, message_id, current_user.id) + if not success: + raise HTTPException(status_code=403, detail="Could not delete message (not yours or already deleted)") + + # Publish delete event to Redis + event = { + "type": "delete_message", + "chat_id": chat_id, + "message_id": message_id + } + await redis_manager.publish(f"chat_{chat_id}", json.dumps(event)) + + return {"status": "success"} diff --git a/android/dai/dai/backend/app/chat/schemas.py b/android/dai/dai/backend/app/chat/schemas.py new file mode 100644 index 0000000..c52cafc --- /dev/null +++ b/android/dai/dai/backend/app/chat/schemas.py @@ -0,0 +1,69 @@ +from pydantic import BaseModel +from datetime import datetime +from typing import List, Optional +from app.users.schemas import UserResponse + +class ChatCreate(BaseModel): + title: str + +class ChatMemberResponse(BaseModel): + id: int + username: str + joined_at: datetime + last_read_message_id: Optional[int] = None + + class Config: + from_attributes = True + + @classmethod + def from_orm(cls, chat_member): + return cls( + id=chat_member.user.id, + username=chat_member.user.username, + joined_at=chat_member.joined_at, + last_read_message_id=chat_member.last_read_message_id + ) + +class ChatResponse(BaseModel): + id: int + title: str + lab_id: int + created_at: datetime + updated_at: Optional[datetime] = None + last_message: Optional[str] = None + unread_count: int = 0 + members: List[ChatMemberResponse] = [] + + class Config: + from_attributes = True + +class MessageCreate(BaseModel): + content: str + bot_enabled: bool = False + reply_to_id: Optional[int] = None + +class ReplyPreviewResponse(BaseModel): + id: int + sender_name: str + content: str + + class Config: + from_attributes = True + +class MessageResponse(BaseModel): + id: int + content: str + timestamp: datetime + user: UserResponse + lab_id: int + chat_id: int + is_bot_message: bool = False + reply_to_id: Optional[int] = None + reply_to: Optional[ReplyPreviewResponse] = None + file_url: Optional[str] = None + file_name: Optional[str] = None + file_type: Optional[str] = None + file_size: Optional[int] = None + + class Config: + from_attributes = True diff --git a/android/dai/dai/backend/app/chat/service.py b/android/dai/dai/backend/app/chat/service.py new file mode 100644 index 0000000..5caca90 --- /dev/null +++ b/android/dai/dai/backend/app/chat/service.py @@ -0,0 +1,340 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy.orm import selectinload +from sqlalchemy import desc, func, and_, update +from app.chat.models import Chat, ChatMember, ChatMessage +from app.chat.schemas import ChatCreate +from typing import Optional + +async def create_chat(db: AsyncSession, lab_id: int, chat_in: ChatCreate, user_id: int): + db_chat = Chat( + lab_id=lab_id, + title=chat_in.title + ) + + db.add(db_chat) + await db.commit() + await db.refresh(db_chat) + + # Save ID BEFORE second commit (important!) + chat_id = db_chat.id + + member = ChatMember(chat_id=chat_id, user_id=user_id) + db.add(member) + await db.commit() + + # Reload with members safely + result = await db.execute( + select(Chat) + .options(selectinload(Chat.members).selectinload(ChatMember.user)) + .filter(Chat.id == chat_id) + ) + return result.scalar_one() + + +async def get_lab_chats(db: AsyncSession, lab_id: int): + """Get all chats for a lab with last message""" + result = await db.execute( + select(Chat) + .options( + selectinload(Chat.members).selectinload(ChatMember.user), + selectinload(Chat.messages) + ) + .filter(Chat.lab_id == lab_id) + .order_by(Chat.updated_at.desc()) + ) + chats = result.scalars().all() + + # Add last message to each chat + chat_responses = [] + for chat in chats: + last_msg = None + if chat.messages: + sorted_msgs = sorted(chat.messages, key=lambda m: (m.timestamp, m.id), reverse=True) + if sorted_msgs: + last_msg = sorted_msgs[0].content[:50] + "..." if len(sorted_msgs[0].content) > 50 else sorted_msgs[0].content + + # Calculate unread count if user_id is provided + # This part might need further refinement depending on how many chats are loaded + chat_data = { + 'id': chat.id, + 'title': chat.title, + 'lab_id': chat.lab_id, + 'created_at': chat.created_at, + 'updated_at': chat.updated_at, + 'last_message': last_msg, + 'unread_count': 0, # Placeholder, will be updated in router if needed or here + 'members': chat.members + } + chat_responses.append(chat_data) + + return chat_responses + +async def get_unread_count(db: AsyncSession, chat_id: int, user_id: int) -> int: + """Get unread message count for a user in a chat""" + # Get last read message id + member_result = await db.execute( + select(ChatMember).filter( + ChatMember.chat_id == chat_id, + ChatMember.user_id == user_id + ) + ) + member = member_result.scalars().first() + if not member: + return 0 + + query = select(func.count(ChatMessage.id)).filter(ChatMessage.chat_id == chat_id) + if member.last_read_message_id: + query = query.filter(ChatMessage.id > member.last_read_message_id) + + result = await db.execute(query) + return result.scalar() or 0 + +async def get_chat(db: AsyncSession, chat_id: int): + """Get a specific chat with members""" + result = await db.execute( + select(Chat) + .options(selectinload(Chat.members).selectinload(ChatMember.user)) + .filter(Chat.id == chat_id) + ) + return result.scalars().first() + +async def delete_chat_full(db: AsyncSession, chat_id: int, user_id: int): + """Delete a chat and all its contents""" + # Verify chat exists + chat = await get_chat(db, chat_id) + if not chat: + return False + + # Clear last_read_message_id and reply_to_id to avoid FK violations during cascade delete + from app.chat.models import ChatMember, ChatMessage + from sqlalchemy import update + + await db.execute( + update(ChatMember) + .where(ChatMember.chat_id == chat_id) + .values(last_read_message_id=None) + ) + await db.execute( + update(ChatMessage) + .where(ChatMessage.chat_id == chat_id) + .values(reply_to_id=None) + ) + + await db.delete(chat) + await db.commit() + return True + +async def add_chat_member(db: AsyncSession, chat_id: int, user_id: int): + """Add a member to a chat""" + # Check if already a member + result = await db.execute( + select(ChatMember).filter( + ChatMember.chat_id == chat_id, + ChatMember.user_id == user_id + ) + ) + if result.scalars().first(): + return None # Already a member + + member = ChatMember(chat_id=chat_id, user_id=user_id) + db.add(member) + await db.commit() + await db.refresh(member) + return member + +async def is_chat_member(db: AsyncSession, chat_id: int, user_id: int) -> bool: + """Check if user is a member of a chat""" + result = await db.execute( + select(ChatMember).filter( + ChatMember.chat_id == chat_id, + ChatMember.user_id == user_id + ) + ) + return result.scalars().first() is not None + +async def get_chat_history(db: AsyncSession, chat_id: int, limit: int = 50, before_id: Optional[int] = None, after_id: Optional[int] = None): + """Get messages for a chat with pagination""" + query = select(ChatMessage).options( + selectinload(ChatMessage.user), + selectinload(ChatMessage.reply_to).selectinload(ChatMessage.user), + ).filter(ChatMessage.chat_id == chat_id) + + if before_id: + query = query.filter(ChatMessage.id < before_id) + query = query.order_by(ChatMessage.timestamp.desc(), ChatMessage.id.desc()) + elif after_id: + query = query.filter(ChatMessage.id > after_id) + query = query.order_by(ChatMessage.timestamp.asc(), ChatMessage.id.asc()) + else: + query = query.order_by(ChatMessage.timestamp.desc(), ChatMessage.id.desc()) + + query = query.limit(limit) + + result = await db.execute(query) + messages = result.scalars().all() + + # Always return in ascending order for the UI + if before_id or not after_id: + return sorted(messages, key=lambda m: (m.timestamp, m.id)) + return messages + +async def mark_chat_read(db: AsyncSession, chat_id: int, user_id: int, last_message_id: int): + """Update last read message ID for a user in a chat""" + result = await db.execute( + select(ChatMember).filter( + ChatMember.chat_id == chat_id, + ChatMember.user_id == user_id + ) + ) + member = result.scalars().first() + if member: + # Only update if the new message ID is greater than the current one + if not member.last_read_message_id or last_message_id > member.last_read_message_id: + member.last_read_message_id = last_message_id + await db.commit() + return member + +async def get_first_unread_message_id(db: AsyncSession, chat_id: int, user_id: int) -> Optional[int]: + """Get the ID of the first unread message""" + member_result = await db.execute( + select(ChatMember).filter( + ChatMember.chat_id == chat_id, + ChatMember.user_id == user_id + ) + ) + member = member_result.scalars().first() + if not member or not member.last_read_message_id: + # If never read, get the oldest message or None + query = select(ChatMessage.id).filter(ChatMessage.chat_id == chat_id).order_by(ChatMessage.timestamp.asc(), ChatMessage.id.asc()).limit(1) + result = await db.execute(query) + return result.scalar() + + query = select(ChatMessage.id).filter( + ChatMessage.chat_id == chat_id, + ChatMessage.id > member.last_read_message_id + ).order_by(ChatMessage.timestamp.asc(), ChatMessage.id.asc()).limit(1) + + result = await db.execute(query) + return result.scalar() + +async def save_message(db: AsyncSession, chat_id: int, lab_id: int, user_id: int, content: str, is_bot: bool = False, reply_to_id: Optional[int] = None): + """Save a message to database""" + message = ChatMessage( + chat_id=chat_id, + lab_id=lab_id, + user_id=user_id, + content=content, + is_bot_message=is_bot, + reply_to_id=reply_to_id, + ) + db.add(message) + + # Update chat's updated_at timestamp + chat_result = await db.execute(select(Chat).filter(Chat.id == chat_id)) + chat = chat_result.scalars().first() + if chat: + chat.updated_at = message.timestamp + + await db.commit() + await db.refresh(message) + + # Load user and reply_to relationships + result = await db.execute( + select(ChatMessage) + .options( + selectinload(ChatMessage.user), + selectinload(ChatMessage.reply_to).selectinload(ChatMessage.user), + ) + .filter(ChatMessage.id == message.id) + ) + return result.scalar_one() + +async def save_message_with_file( + db: AsyncSession, + chat_id: int, + lab_id: int, + user_id: int, + content: str, + file_url: str, + file_name: str, + file_type: str, + file_size: int, + reply_to_id: Optional[int] = None, +): + """Save a message with a file attachment to database""" + message = ChatMessage( + chat_id=chat_id, + lab_id=lab_id, + user_id=user_id, + content=content, + file_url=file_url, + file_name=file_name, + file_type=file_type, + file_size=file_size, + is_bot_message=False, + reply_to_id=reply_to_id, + ) + db.add(message) + + # Update chat's updated_at timestamp + chat_result = await db.execute(select(Chat).filter(Chat.id == chat_id)) + chat = chat_result.scalars().first() + if chat: + chat.updated_at = message.timestamp + + await db.commit() + await db.refresh(message) + + # Load user and reply_to relationships + result = await db.execute( + select(ChatMessage) + .options( + selectinload(ChatMessage.user), + selectinload(ChatMessage.reply_to).selectinload(ChatMessage.user), + ) + .filter(ChatMessage.id == message.id) + ) + return result.scalar_one() + +async def delete_message(db: AsyncSession, message_id: int, user_id: int): + """Delete a chat message if it belongs to the user""" + result = await db.execute( + select(ChatMessage).filter( + ChatMessage.id == message_id, + ChatMessage.user_id == user_id + ) + ) + message = result.scalars().first() + if not message: + return False + + chat_id = message.chat_id + + # 1. Handle replies: set reply_to_id to NULL for messages replying to this one + await db.execute( + update(ChatMessage) + .where(ChatMessage.reply_to_id == message_id) + .values(reply_to_id=None) + ) + + # 2. Handle last_read_message_id in ChatMember + # Find the previous message in this chat to point to + prev_msg_result = await db.execute( + select(ChatMessage.id) + .where(ChatMessage.chat_id == chat_id, ChatMessage.id < message_id) + .order_by(desc(ChatMessage.id)) + .limit(1) + ) + prev_msg_id = prev_msg_result.scalar() + + await db.execute( + update(ChatMember) + .where(ChatMember.last_read_message_id == message_id) + .values(last_read_message_id=prev_msg_id) + ) + + # 3. Delete the message + await db.delete(message) + await db.commit() + return True diff --git a/android/dai/dai/backend/app/chat/socketio_namespace.py b/android/dai/dai/backend/app/chat/socketio_namespace.py new file mode 100644 index 0000000..2b6010f --- /dev/null +++ b/android/dai/dai/backend/app/chat/socketio_namespace.py @@ -0,0 +1,251 @@ +import json +import asyncio +from fastapi import APIRouter, Depends, Query +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy.orm import selectinload +from socketio import AsyncNamespace, AsyncServer +from app.core.database import SessionLocal +from app.chat.redis_manager import redis_manager +from app.chat import service as chat_service +from app.users.service import get_user_by_username +from app.chat.models import ChatMessage +from app.core.security import settings +from jose import jwt, JWTError + +sio = AsyncServer( + async_mode='asgi', + cors_allowed_origins="*", + logger=True, + engineio_logger=False, + ping_timeout=30, + ping_interval=10 +) + +class ChatNamespace(AsyncNamespace): + def __init__(self, namespace='/chat'): + super().__init__(namespace) + self._session_rooms = {} + self._redis_tasks = {} + self._redis_pubsubs = {} + self._chat_refcounts = {} + self._redis_lock = asyncio.Lock() + + async def _ensure_redis_listener(self, chat_id: int): + async with self._redis_lock: + if chat_id in self._redis_tasks: + self._chat_refcounts[chat_id] += 1 + return + + channel_name = f"chat_{chat_id}" + pubsub = await redis_manager.subscribe(channel_name) + self._redis_pubsubs[chat_id] = pubsub + self._chat_refcounts[chat_id] = 1 + + async def listen_to_redis(): + try: + async for message in pubsub.listen(): + if message.get("type") != "message": + continue + try: + payload = json.loads(message.get("data", "{}")) + except Exception: + continue + + event_type = payload.get("type") + if event_type == "read_event": + await self.emit("read_event", payload, room=channel_name) + elif event_type == "delete_message": + await self.emit("delete_message", payload, room=channel_name) + else: + await self.emit("message", payload, room=channel_name) + except Exception as e: + print(f"Socket.IO Redis listener error for chat {chat_id}: {e}") + + self._redis_tasks[chat_id] = asyncio.create_task(listen_to_redis()) + + async def _release_redis_listener(self, chat_id: int): + async with self._redis_lock: + if chat_id not in self._chat_refcounts: + return + self._chat_refcounts[chat_id] -= 1 + if self._chat_refcounts[chat_id] > 0: + return + + channel_name = f"chat_{chat_id}" + task = self._redis_tasks.pop(chat_id, None) + pubsub = self._redis_pubsubs.pop(chat_id, None) + self._chat_refcounts.pop(chat_id, None) + + if task: + task.cancel() + if pubsub: + try: + await pubsub.unsubscribe(channel_name) + except Exception: + pass + + async def on_connect(self, sid, environ, auth): + data = auth or {} + lab_id = data.get('lab_id') + chat_id = data.get('chat_id') + token = data.get('token') + + if not all([lab_id, chat_id, token]): + return False + + try: + async with SessionLocal() as db: + user = await self._get_user_from_token(token, db) + if not user: + return False + + is_member = await chat_service.is_chat_member(db, chat_id, user.id) + if not is_member: + return False + + self._session_rooms[sid] = { + 'lab_id': lab_id, + 'chat_id': chat_id, + 'user_id': user.id, + 'username': user.username, + 'bot_username': user.bot_username if user.bot_username else None, + 'avatar_url': user.avatar_url, + } + + room_name = f"chat_{chat_id}" + await self.enter_room(sid, room_name) + await self._ensure_redis_listener(chat_id) + print(f"Socket.IO: User {user.username} connected to chat {chat_id}") + + except Exception as e: + print(f"Socket.IO connection error: {e}") + return False + + return True + + async def _get_user_from_token(self, token: str, db: AsyncSession): + try: + payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + username: str = payload.get("sub") + if username is None: + return None + except JWTError: + return None + return await get_user_by_username(db, username) + + async def on_disconnect(self, sid): + room_info = self._session_rooms.get(sid) + if room_info: + room_name = f"chat_{room_info['chat_id']}" + await self.leave_room(sid, room_name) + await self._release_redis_listener(room_info['chat_id']) + print(f"Socket.IO: User {room_info['username']} disconnected from chat {room_info['chat_id']}") + del self._session_rooms[sid] + + async def on_message(self, sid, data): + room_info = self._session_rooms.get(sid) + if not room_info: + return + + lab_id = room_info['lab_id'] + chat_id = room_info['chat_id'] + user_id = room_info['user_id'] + username = room_info['username'] + bot_username = room_info['bot_username'] + avatar_url = room_info['avatar_url'] + + if not isinstance(data, dict): + data = {} + + is_bot_response = data.get("is_bot_response", False) + + try: + async with SessionLocal() as db: + if is_bot_response: + if not bot_username: + return + + content = data.get("content", "") + db_message = await chat_service.save_message( + db, chat_id, lab_id, user_id, content, is_bot=True + ) + + response = { + "type": "bot_message", + "sender": bot_username, + "sender_id": user_id, + "content": content, + "lab_id": lab_id, + "chat_id": chat_id, + "timestamp": db_message.timestamp.isoformat(), + "is_bot_message": True, + "sender_avatar_url": None, + } + await self.emit('message', response, room=f"chat_{chat_id}") + return + + bot_enabled = data.get("bot_enabled", False) + reply_to_id = data.get("reply_to_id") + if reply_to_id is not None: + try: + reply_to_id = int(reply_to_id) + except (ValueError, TypeError): + reply_to_id = None + + has_bot_mention = False + clean_message = data.get("content", "") + + if bot_enabled and bot_username: + bot_mention_pattern = f"@{bot_username}" + has_bot_mention = bot_mention_pattern in clean_message + if has_bot_mention: + clean_message = clean_message.replace(bot_mention_pattern, "").strip() + + db_message = await chat_service.save_message( + db, chat_id, lab_id, user_id, data.get("content", ""), + is_bot=False, reply_to_id=reply_to_id + ) + + reply_to_preview = None + if db_message.reply_to is not None: + reply_sender = db_message.reply_to.user.username if db_message.reply_to.user else "Unknown" + reply_to_preview = { + "id": db_message.reply_to.id, + "sender_name": reply_sender, + "content": db_message.reply_to.content[:200], + } + + response = { + "type": "user_message", + "id": db_message.id, + "sender": username, + "sender_id": user_id, + "content": data.get("content", ""), + "lab_id": lab_id, + "chat_id": chat_id, + "timestamp": db_message.timestamp.isoformat(), + "reply_to_id": reply_to_id, + "reply_to": reply_to_preview, + "sender_avatar_url": avatar_url, + } + await self.emit('message', response, room=f"chat_{chat_id}") + + if has_bot_mention: + bot_request = { + "type": "bot_request", + "sender": username, + "sender_id": user_id, + "bot_username": bot_username, + "original_message": data.get("content", ""), + "clean_message": clean_message, + "lab_id": lab_id, + "chat_id": chat_id + } + await self.emit('message', bot_request, to=sid) + + except Exception as e: + print(f"Socket.IO message error: {e}") + +chat_namespace = ChatNamespace('/chat') +sio.register_namespace(chat_namespace) diff --git a/android/dai/dai/backend/app/chat/websocket.py b/android/dai/dai/backend/app/chat/websocket.py new file mode 100644 index 0000000..96d00e9 --- /dev/null +++ b/android/dai/dai/backend/app/chat/websocket.py @@ -0,0 +1,248 @@ +import json +import asyncio +from fastapi import APIRouter, WebSocket, WebSocketDisconnect, Depends, Query +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import update +from datetime import datetime, timezone +from app.core.database import get_db +from app.chat.redis_manager import redis_manager +from app.chat import service as chat_service +from app.users.service import get_user_by_username +from app.users.models import User +from app.core.security import settings +from jose import jwt, JWTError + +router = APIRouter() + +# Store active WebSocket connections per user +active_connections = {} # user_id -> list of websockets + +def get_active_websockets(user_id: int): + """Get all active WebSocket connections for a user""" + return active_connections.get(user_id, []) + +def add_active_connection(user_id: int, websocket: WebSocket): + """Add a WebSocket connection for a user""" + if user_id not in active_connections: + active_connections[user_id] = [] + active_connections[user_id].append(websocket) + +def remove_active_connection(user_id: int, websocket: WebSocket): + """Remove a WebSocket connection for a user""" + if user_id in active_connections: + if websocket in active_connections[user_id]: + active_connections[user_id].remove(websocket) + if not active_connections[user_id]: + del active_connections[user_id] + +async def broadcast_user_online_status(user_id: int, lab_id: int, is_online: bool): + """Broadcast user online/offline status to lab members""" + status_update = { + "type": "user_status", + "user_id": user_id, + "lab_id": lab_id, + "is_online": is_online, + "timestamp": datetime.now(timezone.utc).isoformat() + } + await redis_manager.publish(f"lab_{lab_id}_status", json.dumps(status_update)) + +async def get_user_from_token(token: str, db: AsyncSession): + try: + payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + username: str = payload.get("sub") + if username is None: + return None + except JWTError: + return None + + user = await get_user_by_username(db, username) + return user + +@router.websocket("/ws/{lab_id}/{chat_id}") +async def websocket_endpoint( + websocket: WebSocket, + lab_id: int, + chat_id: int, + token: str, + db: AsyncSession = Depends(get_db) +): + user = await get_user_from_token(token, db) + if not user: + await websocket.close(code=1008) + return + + await websocket.accept() + user_id = user.id + + # Set user as online and add connection + await db.execute( + update(User) + .where(User.id == user_id) + .values(is_online=True, last_seen=datetime.now(timezone.utc)) + ) + await db.commit() + add_active_connection(user_id, websocket) + + # Broadcast user came online + await broadcast_user_online_status(user_id, lab_id, True) + + redis_task = asyncio.create_task( + redis_manager.subscribe(f"chat_{chat_id}", redis_handler) + ) + + # Subscribe to lab status updates + status_task = asyncio.create_task( + redis_manager.subscribe(f"lab_{lab_id}_status", status_handler) + ) + + def status_handler(message): + if not websocket.client_connected: + return + try: + import asyncio + asyncio.run_coroutine_threadsafe( + websocket.send_text(message), + asyncio.get_event_loop() + ) + except: + pass + + def redis_handler(message): + if not websocket.client_connected: + return + + try: + import asyncio + asyncio.run_coroutine_threadsafe( + websocket.send_text(message), + asyncio.get_event_loop() + ) + except: + pass + + # Initialize bot user + bot_enabled = user.bot_username is not None and user.bot_username != "" + + # Send connection confirmation + await websocket.send_text(json.dumps({"type": "connected"})) + + try: + while True: + data = await websocket.receive_json() + message_type = data.get("type") + + if message_type == "ping": + await websocket.send_text(json.dumps({"type": "pong"})) + + elif message_type == "join": + pass + + elif message_type == "bot_request": + pass + + elif message_type == "message": + # Check if user is lab member + is_member = await chat_service.is_lab_member(db, lab_id, user_id) + if not is_member: + await websocket.send_text(json.dumps({"type": "error", "message": "Not a lab member"})) + continue + + # Parse message + message_data = data.get("message", {}) + content = message_data.get("content", "") + reply_to_id = message_data.get("reply_to_id") + + if reply_to_id is not None: + try: + reply_to_id = int(reply_to_id) + except (ValueError, TypeError): + reply_to_id = None + + # Check if bot is enabled and message mentions user's bot + has_bot_mention = False + clean_message = message_data["content"] + + if bot_enabled and user.bot_username: + bot_mention_pattern = f"@{user.bot_username}" + has_bot_mention = bot_mention_pattern in message_data["content"] + if has_bot_mention: + # Remove bot mention from message + clean_message = message_data["content"].replace(bot_mention_pattern, "").strip() + + # Save to DB + db_message = await chat_service.save_message( + db, chat_id, lab_id, user.id, message_data["content"], + is_bot=False, reply_to_id=reply_to_id + ) + + # Build reply preview if available + reply_to_preview = None + if db_message.reply_to is not None: + reply_sender = db_message.reply_to.user.username if db_message.reply_to.user else "Unknown" + reply_to_preview = { + "id": db_message.reply_to.id, + "sender_name": reply_sender, + "content": db_message.reply_to.content[:200], + } + + # Construct response + response = { + "type": "user_message", + "id": db_message.id, + "sender": user.username, + "sender_id": user.id, + "content": message_data["content"], + "lab_id": lab_id, + "chat_id": chat_id, + "timestamp": db_message.timestamp.isoformat(), + "reply_to_id": reply_to_id, + "reply_to": reply_to_preview, + "sender_avatar_url": user.avatar_url, + } + + # Publish to Redis for other users + await redis_manager.publish(f"chat_{chat_id}", json.dumps(response)) + + # If bot is enabled and mentioned, process bot message + if has_bot_mention: + # Send bot request back to the sender for local processing + bot_request = { + "type": "bot_request", + "sender": user.username, + "sender_id": user.id, + "bot_username": user.bot_username, + "original_message": message_data["content"], + "clean_message": clean_message, + "lab_id": lab_id, + "chat_id": chat_id + } + await websocket.send_text(json.dumps(bot_request)) + + except WebSocketDisconnect: + redis_task.cancel() + status_task.cancel() + + # Set user as offline and remove connection + await db.execute( + update(User) + .where(User.id == user_id) + .values(is_online=False, last_seen=datetime.now(timezone.utc)) + ) + await db.commit() + remove_active_connection(user_id, websocket) + + # Broadcast user went offline + await broadcast_user_online_status(user_id, lab_id, False) + + except Exception as e: + redis_task.cancel() + status_task.cancel() + + # Set user as offline and remove connection + await db.execute( + update(User) + .where(User.id == user_id) + .values(is_online=False, last_seen=datetime.now(timezone.utc)) + ) + await db.commit() + remove_active_connection(user_id, websocket) diff --git a/android/dai/dai/backend/app/core/config.py b/android/dai/dai/backend/app/core/config.py new file mode 100644 index 0000000..667e61c --- /dev/null +++ b/android/dai/dai/backend/app/core/config.py @@ -0,0 +1,64 @@ +from pydantic_settings import BaseSettings +from typing import Optional +from functools import lru_cache + +class Settings(BaseSettings): + PROJECT_NAME: str = "Distributed AI Chat" + API_V1_STR: str = "/api/v1" + SECRET_KEY: str = "supersecretkeychangeinproduction" + ALGORITHM: str = "HS256" + ACCESS_TOKEN_EXPIRE_MINUTES: int = 43200 # 30 days + + DATABASE_URL: str = "postgresql+asyncpg://postgres:Mey%23Birth%40miN2004@localhost:5432/dai_db" + REDIS_URL: str = "redis://localhost:6379/0" + + # LiveKit Settings + LIVEKIT_URL: str = "ws://94.183.170.121:7880" + LIVEKIT_API_KEY: str = "devkey" + LIVEKIT_API_SECRET: str = "secret" + + # News Settings + NEWS_FETCH_INTERVAL_HOURS: int = 4 + NEWS_MAX_ITEMS_PER_CATEGORY: int = 50 + NEWS_FEED_URLS: dict = { + "Computer Science": "https://sciencedaily.com/rss/computers_math/computer_science.xml", + "AI": "https://www.sciencedaily.com/rss/computers_math/artificial_intelligence.xml", + "Technology": "https://www.sciencedaily.com/rss/matter_energy/technology.xml", + "Quantum Physics":"https://sciencedaily.com/rss/matter_energy/quantum_physics.xml", + "Quantum Computing":"https://sciencedaily.com/rss/matter_energy/quantum_computing.xml", + "Mathematics":"https://sciencedaily.com/rss/computers_math/mathematics.xml" + } + + # LibreTranslate Settings + ENABLE_TRANSLATION: bool = False # Set to True to enable translation feature + LIBRETRANSLATE_URL: str = "http://localhost:5000" + + # Cloud AI Config + AI_API_KEY: str = "17356777-475f-5060-abb8-0f0ca04df768" # کلید API ارائه‌شده + + AI_BASE_URL: str = "https://arvancloudai.ir/gateway/models/Qwen3-30B-A3B/JXMbt0YuGgdXs2emO40IIqCQswz7IwuUbLmX1uW-4m6wqb_OBQPYUj9tbBYoEViHY0w_UHYv7-ykcN3pM7lqFRqvvlXY4chS8JXWTOw4qULKkd2Jw98ILSGJPbSLrmQBHIYkPErjc8AMCE2eQF94vGbZu5PEKaYtGONxbpZJ_BQhSr-By79PCADPP3wMaGAugY4W1j7NvNgp4U2Db9G_MlnfaVBrKJUTmTwBQyrMgNJOpPlpEycsyYtwXMSqmh-V/v1" + AI_MODEL: str = "Qwen3-30B-A3B" + + # AI_BASE_URL: str = "https://arvancloudai.ir/gateway/models/Xerxes-1/t6tYSSaxEeUypQzkFQgozwlCd34729chHZKFs13eBKJsZymUkkLsBqVuMOPGZV2rAGI21B9JvKDQS_oDierPWTLBvp3SHTnknGZ0DzPZl28-Qv7ianVwZ_lUWrn8NQlL_yYjyAHQ4QKfgYA0I52BsCZB94H-klrsXso8BjTXRYc2sPnXDmPVoosepHYu5Vp4tB6nzVWs-dvr6iwUDz_pPX8HfRK6fENs_-awsN86XpjUJMa_ADQ/v1" + # AI_MODEL: str ="Xerxes-1" + + # Gitea Configuration + GITEA_API_URL: str = "http://localhost:3000/api/v1" + GITEA_ADMIN_TOKEN: str = "11e7888696c99a980dac2e74e5422feaf4da10ba" + GITEA_ADMIN_USERNAME: str = "wikm" + GITEA_WEBHOOK_SECRET: str = "" + GIT_REPOS_BASE_DIR: str = "/tmp/git_repos" # Local directory for Git repositories + + # AI_API_KEY: str = "sk-nn1BTh3sxtrg3ouyor8zil2vpmFatYX41HKhorofAj2EK9w9" # کلید API ارائه‌شده + # AI_BASE_URL: str = "https://api.gapgpt.app/v1" + # AI_MODEL: str = "gapgpt-qwen-3.5" + + class Config: + env_file = ".env" + +@lru_cache +def get_settings() -> Settings: + return Settings() + + +settings = get_settings() diff --git a/android/dai/dai/backend/app/core/database.py b/android/dai/dai/backend/app/core/database.py new file mode 100644 index 0000000..b88f342 --- /dev/null +++ b/android/dai/dai/backend/app/core/database.py @@ -0,0 +1,18 @@ +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker, declarative_base +from app.core.config import settings + +engine = create_async_engine(settings.DATABASE_URL, echo=True) +SessionLocal = sessionmaker( + autocommit=False, + autoflush=False, + bind=engine, + class_=AsyncSession, + expire_on_commit=False, +) + +Base = declarative_base() + +async def get_db(): + async with SessionLocal() as session: + yield session diff --git a/android/dai/dai/backend/app/core/deps.py b/android/dai/dai/backend/app/core/deps.py new file mode 100644 index 0000000..82a0576 --- /dev/null +++ b/android/dai/dai/backend/app/core/deps.py @@ -0,0 +1,31 @@ +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer +from jose import jwt, JWTError +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.config import settings +from app.core.database import get_db +from app.users.service import get_user_by_username +from app.auth.schemas import TokenData + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl=f"{settings.API_V1_STR}/auth/login") + +async def get_current_user(token: str = Depends(oauth2_scheme), db: AsyncSession = Depends(get_db)): + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + print(payload) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = TokenData(username=username) + except JWTError: + raise credentials_exception + + user = await get_user_by_username(db, username=token_data.username) + if user is None: + raise credentials_exception + return user diff --git a/android/dai/dai/backend/app/core/redis.py b/android/dai/dai/backend/app/core/redis.py new file mode 100644 index 0000000..ac4c803 --- /dev/null +++ b/android/dai/dai/backend/app/core/redis.py @@ -0,0 +1,7 @@ +import redis.asyncio as redis +from app.core.config import settings + +redis_client = redis.from_url(settings.REDIS_URL, encoding="utf-8", decode_responses=True) + +async def get_redis(): + return redis_client diff --git a/android/dai/dai/backend/app/core/scheduler.py b/android/dai/dai/backend/app/core/scheduler.py new file mode 100644 index 0000000..e49be78 --- /dev/null +++ b/android/dai/dai/backend/app/core/scheduler.py @@ -0,0 +1,34 @@ +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from app.core.config import settings +from app.core.database import SessionLocal +from app.news.service import NewsService +import logging + +logger = logging.getLogger(__name__) + +scheduler = AsyncIOScheduler() + +async def scheduled_news_fetch(): + logger.info("Running scheduled news fetch") + async with SessionLocal() as db: + await NewsService.fetch_and_store_news(db) + +def start_scheduler(): + if not scheduler.running: + scheduler.add_job( + scheduled_news_fetch, + 'interval', + hours=settings.NEWS_FETCH_INTERVAL_HOURS, + id='news_fetch_job', + replace_existing=True + ) + scheduler.start() + logger.info("Scheduler started") + + # Trigger immediate fetch on startup + scheduler.add_job(scheduled_news_fetch, 'date', run_date=None, id='news_fetch_startup') + +def shutdown_scheduler(): + if scheduler.running: + scheduler.shutdown() + logger.info("Scheduler shutdown") diff --git a/android/dai/dai/backend/app/core/security.py b/android/dai/dai/backend/app/core/security.py new file mode 100644 index 0000000..894db73 --- /dev/null +++ b/android/dai/dai/backend/app/core/security.py @@ -0,0 +1,34 @@ +from datetime import datetime, timedelta +from typing import Optional, Union, Any +import hashlib +from jose import jwt +from passlib.context import CryptContext +from app.core.config import settings + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + +def verify_password(plain_password: str, hashed_password: str) -> bool: + # Try verifying with the new SHA256 pre-hashing method first + sha256_password = hashlib.sha256(plain_password.encode("utf-8")).hexdigest() + if pwd_context.verify(sha256_password, hashed_password): + return True + + # Fallback: Try verifying with the legacy truncation method + # This ensures existing users can still login + legacy_password = plain_password.encode("utf-8")[:72].decode("utf-8", errors="ignore") + return pwd_context.verify(legacy_password, hashed_password) + +def get_password_hash(password: str) -> str: + # Pre-hash with SHA256 to handle long passwords and avoid bcrypt 72-byte limit + password = hashlib.sha256(password.encode("utf-8")).hexdigest() + return pwd_context.hash(password) + +def create_access_token(subject: Union[str, Any], expires_delta: Optional[timedelta] = None) -> str: + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + + to_encode = {"exp": expire, "sub": str(subject)} + encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) + return encoded_jwt diff --git a/android/dai/dai/backend/app/gitea/__init__.py b/android/dai/dai/backend/app/gitea/__init__.py new file mode 100644 index 0000000..fa53fe2 --- /dev/null +++ b/android/dai/dai/backend/app/gitea/__init__.py @@ -0,0 +1,4 @@ +""" +Gitea Integration Module +Handles Git repository management and version control for labs +""" diff --git a/android/dai/dai/backend/app/gitea/models.py b/android/dai/dai/backend/app/gitea/models.py new file mode 100644 index 0000000..a36d037 --- /dev/null +++ b/android/dai/dai/backend/app/gitea/models.py @@ -0,0 +1,38 @@ +""" +Git-related database models +""" +from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, DateTime +from sqlalchemy.orm import relationship +from app.core.database import Base +from datetime import datetime + + +class GitRepository(Base): + """Git repository mapping for labs""" + __tablename__ = 'git_repositories' + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey('labs.id'), unique=True, nullable=False) + gitea_repo_id = Column(Integer, nullable=False) + gitea_repo_name = Column(String(255), nullable=False) + gitea_clone_url = Column(String(512), nullable=False) + last_sync_at = Column(DateTime, default=datetime.utcnow) + is_active = Column(Boolean, default=True) + created_at = Column(DateTime, default=datetime.utcnow) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) + + # Relationship + lab = relationship("Lab", back_populates="git_repository") + + +class GitCommit(Base): + """Track commits made by users""" + __tablename__ = 'git_commits' + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey('labs.id'), nullable=False) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + commit_hash = Column(String(40), nullable=False) + commit_message = Column(String(1000), nullable=False) + branch = Column(String(100), default='main') + created_at = Column(DateTime, default=datetime.utcnow) diff --git a/android/dai/dai/backend/app/gitea/router.py b/android/dai/dai/backend/app/gitea/router.py new file mode 100644 index 0000000..ebddcec --- /dev/null +++ b/android/dai/dai/backend/app/gitea/router.py @@ -0,0 +1,357 @@ +""" +Git API Router - Endpoints for Git operations +""" +from fastapi import APIRouter, Depends, HTTPException, status +from pydantic import BaseModel +from typing import List, Optional +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.core.deps import get_current_user, get_db +from app.gitea.service import GiteaService +from app.gitea.models import GitRepository, GitCommit +from app.labs.models import Lab, LabMember +from app.core.config import get_settings, Settings +from datetime import datetime +import logging + +logger = logging.getLogger(__name__) + +router = APIRouter() + + +class CommitRequest(BaseModel): + message: str + files: List[str] = [] + branch: str = "main" + + +@router.post("/{lab_id}/repository") +async def create_lab_repository( + lab_id: int, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Create Git repository for lab""" + # Check if lab exists and user is owner + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + owner_result = await db.execute( + select(LabMember).where( + LabMember.lab_id == lab_id, + LabMember.user_id == current_user.id, + LabMember.role == "owner", + ) + ) + owner_member = owner_result.scalar_one_or_none() + if not owner_member: + raise HTTPException(status_code=403, detail="Not authorized") + + # Check if repository already exists + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + existing_repo = result.scalar_one_or_none() + if existing_repo: + return {"status": "exists", "repository": existing_repo.gitea_repo_name} + + # Create repository in Gitea + try: + gitea_service = GiteaService(settings) + repo_info = await gitea_service.create_repository(lab_id, lab.name, current_user.username) + + # Store repository mapping in database + git_repo = GitRepository( + lab_id=lab_id, + gitea_repo_id=repo_info["id"], + gitea_repo_name=repo_info["name"], + gitea_clone_url=repo_info["clone_url"] + ) + db.add(git_repo) + await db.commit() + + return {"status": "success", "repository": repo_info} + except Exception as e: + logger.error(f"Failed to create repository for lab {lab_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/{lab_id}/repository") +async def get_lab_repository( + lab_id: int, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get lab repository information""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = result.scalar_one_or_none() + if not git_repo: + return {"status": "not_initialized"} + + return { + "status": "success", + "repository": { + "id": git_repo.gitea_repo_id, + "name": git_repo.gitea_repo_name, + "clone_url": git_repo.gitea_clone_url, + "last_sync": git_repo.last_sync_at.isoformat() if git_repo.last_sync_at else None + } + } + + +@router.get("/{lab_id}/commits") +async def get_commit_history( + lab_id: int, + limit: int = 50, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Get commit history for lab""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + gitea_service = GiteaService(settings) + commits = await gitea_service.get_commit_history(lab_id, limit) + return {"status": "success", "commits": commits} + + +@router.post("/{lab_id}/commit") +async def create_commit( + lab_id: int, + commit_data: CommitRequest, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Create commit with file changes""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + if not commit_data.message.strip(): + raise HTTPException(status_code=400, detail="Commit message is required") + + try: + gitea_service = GiteaService(settings) + commit_hash = await gitea_service.create_commit( + lab_id, current_user.id, commit_data.message, commit_data.files + ) + + # Store commit record in database + commit = GitCommit( + lab_id=lab_id, + user_id=current_user.id, + commit_hash=commit_hash, + commit_message=commit_data.message, + branch=commit_data.branch + ) + db.add(commit) + await db.commit() + + return {"status": "success", "commit_hash": commit_hash} + except Exception as e: + logger.error(f"Failed to create commit for lab {lab_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/{lab_id}/push") +async def push_changes( + lab_id: int, + branch: str = "main", + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Push local commits to Gitea""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + try: + gitea_service = GiteaService(settings) + await gitea_service.push_to_gitea(db, lab_id, branch) + + # Update last sync time + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = result.scalar_one_or_none() + if git_repo: + git_repo.last_sync_at = datetime.utcnow() + await db.commit() + + return {"status": "success", "message": "Pushed to Gitea"} + except Exception as e: + logger.error(f"Failed to push lab {lab_id} to Gitea: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/{lab_id}/pull") +async def pull_changes( + lab_id: int, + branch: str = "main", + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Pull changes from Gitea""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + try: + gitea_service = GiteaService(settings) + await gitea_service.pull_from_gitea(db, lab_id, branch) + + # Update last sync time + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = result.scalar_one_or_none() + if git_repo: + git_repo.last_sync_at = datetime.utcnow() + await db.commit() + + return {"status": "success", "message": "Pulled from Gitea"} + except Exception as e: + logger.error(f"Failed to pull lab {lab_id} from Gitea: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/{lab_id}/diff/{commit_hash}") +async def get_file_diff( + lab_id: int, + commit_hash: str, + path: Optional[str] = None, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Get diff for a commit (optionally scoped to a file)""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + try: + gitea_service = GiteaService(settings) + diff = await gitea_service.get_file_diff(lab_id, commit_hash, path) + return {"status": "success", "diff": diff} + except Exception as e: + logger.error(f"Failed to get diff for lab {lab_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/{lab_id}/checkout/{commit_hash}") +async def checkout_commit( + lab_id: int, + commit_hash: str, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Checkout a commit and rebuild backpack files""" + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + try: + gitea_service = GiteaService(settings) + await gitea_service.checkout_commit(db, lab_id, current_user.id, commit_hash) + return {"status": "success"} + except Exception as e: + logger.error(f"Failed to checkout commit for lab {lab_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/{lab_id}/status") +async def get_git_status( + lab_id: int, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Get git status for a lab repository""" + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + try: + gitea_service = GiteaService(settings) + status_info = await gitea_service.get_status(lab_id) + return {"status": "success", **status_info} + except Exception as e: + logger.error(f"Failed to get status for lab {lab_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/{lab_id}/file/{commit_hash}/{file_path:path}") +async def get_file_content( + lab_id: int, + commit_hash: str, + file_path: str, + current_user = Depends(get_current_user), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Get file content at specific commit""" + # Check if lab exists and user has access + lab = await db.get(Lab, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + try: + gitea_service = GiteaService(settings) + content = await gitea_service.get_file_content_at_commit(lab_id, commit_hash, file_path) + return {"status": "success", "content": content} + except Exception as e: + logger.error(f"Failed to get file content for lab {lab_id}: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/test/{lab_id}") +async def test_git_integration( + lab_id: int, + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(get_settings) +): + """Test Git integration for a lab""" + try: + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = result.scalar_one_or_none() + if not git_repo: + return {"status": "error", "message": "No Git repository found"} + + # Check if local repository exists + import os + repo_dir = os.path.join(settings.GIT_REPOS_BASE_DIR, f"lab_{lab_id}") + repo_exists = os.path.exists(os.path.join(repo_dir, '.git')) + + return { + "status": "success", + "lab_id": lab_id, + "gitea_repo_id": git_repo.gitea_repo_id, + "repo_name": git_repo.gitea_repo_name, + "local_repo_exists": repo_exists, + "last_sync": git_repo.last_sync_at.isoformat() if git_repo.last_sync_at else None + } + except Exception as e: + logger.error(f"Error testing Git integration for lab {lab_id}: {e}") + return {"status": "error", "message": str(e)} diff --git a/android/dai/dai/backend/app/gitea/service.py b/android/dai/dai/backend/app/gitea/service.py new file mode 100644 index 0000000..32949bd --- /dev/null +++ b/android/dai/dai/backend/app/gitea/service.py @@ -0,0 +1,478 @@ +""" +Gitea Service - Handles Git operations and Gitea API integration +""" +import os +import typing +import httpx +import git # GitPython library +import shutil +import uuid +from urllib.parse import urlparse, urlunparse +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.gitea.models import GitRepository, GitCommit +from app.labs.models import Lab, LabBackpackFile, LabBackpackFolder +from app.core.config import get_settings, Settings +import logging + +logger = logging.getLogger(__name__) + + +class GiteaService: + """Service for Gitea API and local Git operations""" + + def __init__(self, settings: Settings): + self.settings = settings + self.base_url = settings.GITEA_API_URL.rstrip("/") + self.api_base = ( + self.base_url + if self.base_url.endswith("/api/v1") + else f"{self.base_url}/api/v1" + ) + self.admin_token = settings.GITEA_ADMIN_TOKEN + + def _get_repo_dir(self, lab_id: int) -> str: + """Get local directory for lab's Git repository""" + return os.path.join(self.settings.GIT_REPOS_BASE_DIR, f"lab_{lab_id}") + + def _init_local_repo(self, lab_id: int, clone_url: str) -> git.Repo: + """Initialize or clone local Git repository""" + repo_dir = self._get_repo_dir(lab_id) + os.makedirs(repo_dir, exist_ok=True) + + if not os.path.exists(os.path.join(repo_dir, '.git')): + # Clone from Gitea + logger.info(f"Cloning repository for lab {lab_id} from {clone_url}") + repo = git.Repo.clone_from(clone_url, repo_dir) + else: + # Open existing repository + logger.info(f"Opening existing repository for lab {lab_id}") + repo = git.Repo(repo_dir) + + return repo + + def _build_auth_clone_url(self, clone_url: str) -> str: + if not self.admin_token: + return clone_url + + parsed = urlparse(clone_url) + if parsed.scheme not in ("http", "https"): + return clone_url + + username = self.settings.GITEA_ADMIN_USERNAME.strip() + if username: + netloc = f"{username}:{self.admin_token}@{parsed.hostname}" + else: + # Fallback: use token as username for HTTP basic auth + netloc = f"{self.admin_token}@{parsed.hostname}" + + if parsed.port: + netloc = f"{netloc}:{parsed.port}" + + return urlunparse( + (parsed.scheme, netloc, parsed.path, parsed.params, parsed.query, parsed.fragment) + ) + + def ensure_local_repo(self, lab_id: int, clone_url: str) -> str: + """Ensure local repository exists and return its path""" + self._init_local_repo(lab_id, clone_url) + return self._get_repo_dir(lab_id) + + async def create_repository(self, lab_id: int, lab_name: str, owner_username: str) -> dict: + """Create new repository in Gitea and initialize local repo""" + async with httpx.AsyncClient() as client: + response = await client.post( + f"{self.api_base}/user/repos", + json={ + "name": f"lab_{lab_id}", + "description": f"Repository for Lab: {lab_name}", + "private": False, + "auto_init": True + }, + headers={ + "Authorization": f"token {self.admin_token}", + "Content-Type": "application/json" + } + ) + response.raise_for_status() + repo_info = response.json() + + # Initialize local repository + clone_url = repo_info["clone_url"] + self._init_local_repo(lab_id, clone_url) + + logger.info(f"Created repository for lab {lab_id}: {repo_info['name']}") + return repo_info + + async def get_repository_info(self, repo_id: int) -> typing.Optional[dict]: + """Get repository information from Gitea""" + async with httpx.AsyncClient() as client: + response = await client.get( + f"{self.api_base}/repos/{repo_id}", + headers={"Authorization": f"token {self.admin_token}"} + ) + if response.status_code == 200: + return response.json() + return None + + async def get_commit_history(self, lab_id: int, limit: int = 50) -> list: + """Get commit history from local Git repository""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + logger.warning(f"Repository directory not found for lab {lab_id}") + return [] + + try: + repo = git.Repo(repo_dir) + commits = [] + for commit in repo.iter_commits(max_count=limit): + commits.append({ + 'hash': commit.hexsha, + 'message': commit.message.strip(), + 'author': commit.author.name, + 'date': commit.committed_datetime.isoformat(), + }) + logger.info(f"Retrieved {len(commits)} commits for lab {lab_id}") + return commits + except Exception as e: + logger.error(f"Error getting commit history for lab {lab_id}: {e}") + return [] + + async def create_commit(self, lab_id: int, user_id: int, message: str, file_paths: typing.List[str]) -> str: + """Create commit with file changes""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + + staged_files = [] + if file_paths: + for file_path in file_paths: + normalized_path = self._normalize_repo_path(file_path) + if not normalized_path: + continue + + full_path = os.path.join(repo_dir, normalized_path) + if os.path.exists(full_path): + repo.git.add("--", normalized_path) + staged_files.append(normalized_path) + logger.info(f"Added file to index: {normalized_path}") + else: + repo.git.rm("--cached", "--ignore-unmatch", "--", normalized_path) + staged_files.append(normalized_path) + logger.info(f"Removed file from index: {normalized_path}") + else: + repo.git.add(A=True) + staged_files = repo.git.diff("--cached", "--name-only").splitlines() + + if not staged_files: + logger.warning(f"No files to commit for lab {lab_id}") + raise Exception("No files to commit") + + # Create commit + commit = repo.index.commit(message) + commit_hash = commit.hexsha + + logger.info(f"Created commit {commit_hash} for lab {lab_id} with {len(staged_files)} files") + return commit_hash + except Exception as e: + logger.error(f"Error creating commit for lab {lab_id}: {e}") + raise + + async def push_to_gitea( + self, + db: AsyncSession, + lab_id: int, + branch: str = 'main', + ) -> None: + """Push local commits to Gitea""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + + # Get repository info for remote URL + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = result.scalar_one_or_none() + if not git_repo: + raise Exception(f"No Git repository found for lab {lab_id}") + + clone_url = git_repo.gitea_clone_url + + # Push to remote + try: + origin = repo.remote(name='origin') + except ValueError: + origin = repo.create_remote('origin', clone_url) + + auth_url = self._build_auth_clone_url(clone_url) + if auth_url != clone_url: + origin.set_url(auth_url) + + branch_name = self._resolve_branch(repo, branch) + logger.info(f"Pushing lab {lab_id} to Gitea on branch {branch_name}") + push_info = origin.push(branch_name) + logger.info(f"Push completed for lab {lab_id}: {push_info}") + + except Exception as e: + logger.error(f"Error pushing lab {lab_id} to Gitea: {e}") + raise + + async def pull_from_gitea( + self, + db: AsyncSession, + lab_id: int, + branch: str = 'main', + ) -> None: + """Pull changes from Gitea""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + + # Get repository info for remote URL + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = result.scalar_one_or_none() + if not git_repo: + raise Exception(f"No Git repository found for lab {lab_id}") + + clone_url = git_repo.gitea_clone_url + + # Setup remote if not exists + try: + origin = repo.remote(name='origin') + except ValueError: + origin = repo.create_remote('origin', clone_url) + + auth_url = self._build_auth_clone_url(clone_url) + if auth_url != clone_url: + origin.set_url(auth_url) + + # Pull from remote + branch_name = self._resolve_branch(repo, branch) + logger.info(f"Pulling lab {lab_id} from Gitea on branch {branch_name}") + pull_info = origin.pull(branch_name) + logger.info(f"Pull completed for lab {lab_id}: {pull_info}") + + except Exception as e: + logger.error(f"Error pulling lab {lab_id} from Gitea: {e}") + raise + + async def get_file_diff( + self, + lab_id: int, + commit_hash: str, + file_path: typing.Optional[str] = None + ) -> str: + """Get diff for a commit (optionally scoped to a file)""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + if file_path: + normalized_path = self._normalize_repo_path(file_path) + if not normalized_path: + raise Exception("Invalid file path") + diff_output = repo.git.show(commit_hash, "--format=", "--", normalized_path) + logger.info(f"Generated diff for {normalized_path} in lab {lab_id}") + else: + diff_output = repo.git.show(commit_hash, "--format=") + logger.info(f"Generated diff for commit {commit_hash} in lab {lab_id}") + return diff_output + except Exception as e: + logger.error(f"Error getting diff for lab {lab_id}: {e}") + raise + + async def get_status(self, lab_id: int) -> dict: + """Get git status for a repository""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + status_output = repo.git.status("--porcelain") + files = [] + for line in status_output.splitlines(): + if not line.strip(): + continue + status_code = line[:2] + path = line[3:].strip() + if " -> " in path: + path = path.split(" -> ")[-1].strip() + files.append({ + "path": path, + "status": status_code.strip() or status_code, + }) + + return { + "dirty": repo.is_dirty(untracked_files=True), + "files": files, + } + except Exception as e: + logger.error(f"Error getting status for lab {lab_id}: {e}") + raise + + def _resolve_branch(self, repo: git.Repo, branch: str) -> str: + """Resolve branch name if requested branch does not exist locally.""" + if branch and branch in [head.name for head in repo.heads]: + return branch + try: + return repo.active_branch.name + except Exception: + return branch or "main" + + def _normalize_repo_path(self, file_path: str) -> str: + normalized = os.path.normpath(file_path).lstrip(os.sep) + if normalized.startswith("..") or os.path.isabs(normalized): + return "" + return normalized.replace("\\", "/") + + async def get_file_content_at_commit(self, lab_id: int, commit_hash: str, file_path: str) -> str: + """Get file content at specific commit""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + commit = repo.commit(commit_hash) + + # Get file tree at commit + tree = commit.tree + for item in tree.traverse(): + if item.path == file_path: + if isinstance(item, git.Blob): + return item.data_stream.read().decode('utf-8') + + raise Exception(f"File {file_path} not found in commit {commit_hash}") + except Exception as e: + logger.error(f"Error getting file content for lab {lab_id}: {e}") + raise + + async def checkout_commit( + self, + db: AsyncSession, + lab_id: int, + user_id: int, + commit_hash: str, + ) -> None: + """Checkout a specific commit and rebuild backpack from repository state.""" + repo_dir = self._get_repo_dir(lab_id) + if not os.path.exists(repo_dir): + raise Exception(f"Repository not initialized for lab {lab_id}") + + try: + repo = git.Repo(repo_dir) + repo.git.reset("--hard", commit_hash) + await self._rebuild_backpack_from_repo(db, lab_id, user_id, repo_dir) + logger.info(f"Checked out commit {commit_hash} for lab {lab_id}") + except Exception as e: + logger.error(f"Error checking out commit for lab {lab_id}: {e}") + raise + + async def _rebuild_backpack_from_repo( + self, + db: AsyncSession, + lab_id: int, + user_id: int, + repo_dir: str, + ) -> None: + # Remove existing files (and physical files) + file_result = await db.execute( + select(LabBackpackFile).where(LabBackpackFile.lab_id == lab_id) + ) + files = file_result.scalars().all() + for file in files: + if os.path.exists(file.file_path): + os.remove(file.file_path) + await db.delete(file) + + # Remove folders (children first) + folder_result = await db.execute( + select(LabBackpackFolder).where(LabBackpackFolder.lab_id == lab_id) + ) + folders = folder_result.scalars().all() + if folders: + depth_map: dict[int, int] = {} + folder_by_id = {f.id: f for f in folders} + + def _depth(folder_id: int) -> int: + if folder_id in depth_map: + return depth_map[folder_id] + folder = folder_by_id[folder_id] + if folder.parent_id is None: + depth_map[folder_id] = 0 + else: + depth_map[folder_id] = _depth(folder.parent_id) + 1 + return depth_map[folder_id] + + folders.sort(key=lambda f: _depth(f.id), reverse=True) + for folder in folders: + await db.delete(folder) + + await db.commit() + + upload_dir = os.path.join("uploads", "lab_backpacks", str(lab_id)) + os.makedirs(upload_dir, exist_ok=True) + + folder_map: dict[str, int] = {} + for root, dirs, files in os.walk(repo_dir): + if ".git" in root: + continue + + rel_root = os.path.relpath(root, repo_dir) + if rel_root == ".": + rel_root = "" + + parent_path = os.path.dirname(rel_root) if rel_root else "" + parent_id = folder_map.get(parent_path) if parent_path else None + + if rel_root: + folder_name = os.path.basename(rel_root) + folder = LabBackpackFolder( + lab_id=lab_id, + name=folder_name, + parent_id=parent_id, + ) + db.add(folder) + await db.flush() + folder_map[rel_root] = folder.id + + for file_name in files: + source_path = os.path.join(root, file_name) + if not os.path.isfile(source_path): + continue + + ext = os.path.splitext(file_name)[1] + unique_filename = f"{uuid.uuid4()}{ext}" + target_path = os.path.join(upload_dir, unique_filename) + shutil.copy2(source_path, target_path) + + file_size = os.path.getsize(target_path) + folder_id = folder_map.get(rel_root) if rel_root else None + + db_file = LabBackpackFile( + lab_id=lab_id, + folder_id=folder_id, + name=file_name, + file_path=target_path, + file_size=file_size, + extension=ext.lstrip('.') if ext else None, + uploaded_by=user_id, + ) + db.add(db_file) + + await db.commit() diff --git a/android/dai/dai/backend/app/labs/livekit_utils.py b/android/dai/dai/backend/app/labs/livekit_utils.py new file mode 100644 index 0000000..2d82003 --- /dev/null +++ b/android/dai/dai/backend/app/labs/livekit_utils.py @@ -0,0 +1,33 @@ +from livekit import api +from app.core.config import settings +import datetime + +def generate_token(room_name: str, participant_identity: str, participant_name: str) -> str: + """ + Generate a LiveKit access token for a participant in a room. + """ + if not settings.LIVEKIT_API_KEY or not settings.LIVEKIT_API_SECRET: + raise ValueError("LiveKit API key and secret are not configured") + + token = api.AccessToken( + settings.LIVEKIT_API_KEY, + settings.LIVEKIT_API_SECRET + ) + + token.with_identity(participant_identity) + token.with_name(participant_name) + + # Grant permissions + grant = api.VideoGrants( + room_join=True, + room=room_name, + can_publish=True, + can_subscribe=True, + can_publish_data=True, + ) + token.with_grants(grant) + + # Set validity (e.g., 6 hours) + # The library handles expiration defaults, but we can be explicit if needed. + + return token.to_jwt() diff --git a/android/dai/dai/backend/app/labs/models.py b/android/dai/dai/backend/app/labs/models.py new file mode 100644 index 0000000..38b4ee5 --- /dev/null +++ b/android/dai/dai/backend/app/labs/models.py @@ -0,0 +1,201 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Enum, Float +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func +import enum +from app.core.database import Base + +class LabRole(str, enum.Enum): + OWNER = "owner" + ADMIN = "admin" + MEMBER = "member" + +class MembershipRequestStatus(str, enum.Enum): + PENDING = "pending" + APPROVED = "approved" + REJECTED = "rejected" + +class Lab(Base): + __tablename__ = "labs" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, index=True, nullable=False) + description = Column(String, nullable=True) + topic = Column(String, nullable=True) + is_private = Column(Boolean, default=False) + is_hidden = Column(Boolean, default=False) # Hidden from public list but accessible via key + share_key = Column(String, unique=True, nullable=True, index=True) + planet_image = Column(String, nullable=True) # Planet image filename + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + members = relationship("LabMember", back_populates="lab", cascade="all, delete-orphan") + membership_requests = relationship("MembershipRequest", back_populates="lab", cascade="all, delete-orphan") + chats = relationship("Chat", back_populates="lab", cascade="all, delete-orphan") + pdfs = relationship("LabPDF", back_populates="lab", cascade="all, delete-orphan") + backpack_folders = relationship("LabBackpackFolder", back_populates="lab", cascade="all, delete-orphan") + backpack_files = relationship("LabBackpackFile", back_populates="lab", cascade="all, delete-orphan") + rooms = relationship("LabRoom", back_populates="lab", cascade="all, delete-orphan") + git_repository = relationship("GitRepository", back_populates="lab", uselist=False) + projects = relationship("Project", back_populates="lab", cascade="all, delete-orphan") + +class LabMember(Base): + __tablename__ = "lab_members" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + role = Column(Enum(LabRole), default=LabRole.MEMBER) + joined_at = Column(DateTime(timezone=True), server_default=func.now()) + + lab = relationship("Lab", back_populates="members") + user = relationship("User") + +class MembershipRequest(Base): + __tablename__ = "membership_requests" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + status = Column(Enum(MembershipRequestStatus), default=MembershipRequestStatus.PENDING) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + lab = relationship("Lab", back_populates="membership_requests") + user = relationship("User") + +class LabPDF(Base): + __tablename__ = "lab_pdfs" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + filename = Column(String, nullable=False) + original_filename = Column(String, nullable=False) + file_path = Column(String, nullable=False) + file_size = Column(Integer, nullable=False) + uploaded_by = Column(Integer, ForeignKey("users.id"), nullable=False) + uploaded_at = Column(DateTime(timezone=True), server_default=func.now()) + + lab = relationship("Lab", back_populates="pdfs") + uploader = relationship("User") + +class LabBackpackFolder(Base): + __tablename__ = "lab_backpack_folders" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + name = Column(String, nullable=False) + parent_id = Column(Integer, ForeignKey("lab_backpack_folders.id"), nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + lab = relationship("Lab", back_populates="backpack_folders") + parent = relationship("LabBackpackFolder", remote_side=[id], backref="subfolders") + files = relationship("LabBackpackFile", back_populates="folder", cascade="all, delete-orphan") + +class LabBackpackFile(Base): + __tablename__ = "lab_backpack_files" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + folder_id = Column(Integer, ForeignKey("lab_backpack_folders.id"), nullable=True) + name = Column(String, nullable=False) + file_path = Column(String, nullable=False) + file_size = Column(Integer, nullable=False) + extension = Column(String, nullable=True) + uploaded_by = Column(Integer, ForeignKey("users.id"), nullable=False) + uploaded_at = Column(DateTime(timezone=True), server_default=func.now()) + + lab = relationship("Lab", back_populates="backpack_files") + folder = relationship("LabBackpackFolder", back_populates="files") + uploader = relationship("User") + embeddings = relationship("LabEmbedding", back_populates="file", cascade="all, delete-orphan") + +class LabEmbedding(Base): + """Stores embeddings for lab files (documents, first windows, second windows)""" + __tablename__ = "lab_embeddings" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + file_id = Column(Integer, ForeignKey("lab_backpack_files.id"), nullable=True) + + # Embedding type: 'document', 'first_window', 'second_window' + embedding_type = Column(String, nullable=False, index=True) + + # Document source/filename + document_source = Column(String, nullable=False, index=True) + + # Window indices (null for document-level embeddings) + window_index = Column(Integer, nullable=True) + first_window_index = Column(Integer, nullable=True) + + # Text content + content = Column(String, nullable=True) + + # Embedding vector stored as JSON (since PostgreSQL doesn't have built-in vector type by default) + # Format: {"vector": [0.1, 0.2, ...], "dimension": 512} + embedding_json = Column(String, nullable=False) + + # Metadata (JSON string) + metadata_json = Column(String, nullable=True) + + # Stats + token_count = Column(Integer, default=0) + page_count = Column(Integer, nullable=True) + chunk_count = Column(Integer, nullable=True) + + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + lab = relationship("Lab") + file = relationship("LabBackpackFile", back_populates="embeddings") + +class LabRoom(Base): + """Collaborative reading rooms for lab backpack files""" + __tablename__ = "lab_rooms" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False) + backpack_file_id = Column(Integer, ForeignKey("lab_backpack_files.id"), nullable=True) + name = Column(String, nullable=False) + is_active = Column(Boolean, default=True) + created_by = Column(Integer, ForeignKey("users.id"), nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + closed_at = Column(DateTime(timezone=True), nullable=True) + + lab = relationship("Lab", back_populates="rooms") + backpack_file = relationship("LabBackpackFile") + creator = relationship("User") + participants = relationship("RoomParticipant", back_populates="room", cascade="all, delete-orphan") + +class RoomParticipant(Base): + """Tracks users in collaborative reading rooms""" + __tablename__ = "room_participants" + + id = Column(Integer, primary_key=True, index=True) + room_id = Column(Integer, ForeignKey("lab_rooms.id"), nullable=False) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + current_page = Column(Integer, default=1) + joined_at = Column(DateTime(timezone=True), server_default=func.now()) + last_active = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) + + room = relationship("LabRoom", back_populates="participants") + user = relationship("User") + + +class WhiteboardStroke(Base): + """Persists whiteboard strokes for collaborative rooms (infinite canvas)""" + __tablename__ = "whiteboard_strokes" + + id = Column(Integer, primary_key=True, index=True) + room_id = Column(Integer, ForeignKey("lab_rooms.id"), nullable=False) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) + # JSON array of {"x": float, "y": float} objects in canvas coordinates + points_json = Column(String, nullable=False) + # ARGB color as integer + color = Column(Integer, nullable=False) + stroke_width = Column(Float, nullable=False) + is_eraser = Column(Boolean, default=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + room = relationship("LabRoom") + user = relationship("User") diff --git a/android/dai/dai/backend/app/labs/pdf_websocket.py b/android/dai/dai/backend/app/labs/pdf_websocket.py new file mode 100644 index 0000000..2f96636 --- /dev/null +++ b/android/dai/dai/backend/app/labs/pdf_websocket.py @@ -0,0 +1,132 @@ +import json +import asyncio +from fastapi import APIRouter, WebSocket, WebSocketDisconnect, Depends, Query +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.database import get_db +from app.chat.redis_manager import redis_manager +from app.labs.service import get_pdf, is_lab_member +from app.users.service import get_user_by_username +from app.core.security import settings +from jose import jwt, JWTError + +router = APIRouter() + +async def get_user_from_token(token: str, db: AsyncSession): + try: + payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + username: str = payload.get("sub") + if username is None: + return None + except JWTError: + return None + return await get_user_by_username(db, username) + +@router.websocket("/{lab_id}/pdfs/{pdf_id}/ws") +async def pdf_websocket_endpoint( + websocket: WebSocket, + lab_id: int, + pdf_id: int, + token: str = Query(...), + db: AsyncSession = Depends(get_db) +): + user = await get_user_from_token(token, db) + if not user: + await websocket.close(code=1008) + return + + # Check if user is lab member + is_member = await is_lab_member(db, lab_id, user.id) + if not is_member: + await websocket.close(code=1003) # Forbidden + return + + # Check if PDF exists and belongs to the lab + pdf = await get_pdf(db, pdf_id) + if not pdf or pdf.lab_id != lab_id: + await websocket.close(code=1008) + return + + await websocket.accept() + + # Subscribe to Redis channel for this PDF + channel_name = f"pdf_{pdf_id}" + pubsub = await redis_manager.subscribe(channel_name) + + async def listen_to_redis(): + try: + async for message in pubsub.listen(): + if message["type"] == "message": + await websocket.send_text(message["data"]) + except Exception: + pass + + # Start listening to Redis in background + redis_task = asyncio.create_task(listen_to_redis()) + + # Notify others that user joined + join_message = { + "type": "user_joined", + "user_id": user.id, + "username": user.username, + "pdf_id": pdf_id, + "lab_id": lab_id + } + await redis_manager.publish(channel_name, json.dumps(join_message)) + + try: + while True: + data = await websocket.receive_text() + message_data = json.loads(data) + + message_type = message_data.get("type") + + if message_type == "page_change": + # User changed page + response = { + "type": "page_change", + "user_id": user.id, + "username": user.username, + "page": message_data.get("page"), + "pdf_id": pdf_id, + "lab_id": lab_id + } + await redis_manager.publish(channel_name, json.dumps(response)) + + elif message_type == "text_selection": + # User selected text + response = { + "type": "text_selection", + "user_id": user.id, + "username": user.username, + "page": message_data.get("page"), + "selection": message_data.get("selection"), # {startX, startY, endX, endY} + "text": message_data.get("text"), + "pdf_id": pdf_id, + "lab_id": lab_id + } + await redis_manager.publish(channel_name, json.dumps(response)) + + elif message_type == "clear_selection": + # User cleared selection + response = { + "type": "clear_selection", + "user_id": user.id, + "username": user.username, + "pdf_id": pdf_id, + "lab_id": lab_id + } + await redis_manager.publish(channel_name, json.dumps(response)) + + except WebSocketDisconnect: + # Notify others that user left + leave_message = { + "type": "user_left", + "user_id": user.id, + "username": user.username, + "pdf_id": pdf_id, + "lab_id": lab_id + } + await redis_manager.publish(channel_name, json.dumps(leave_message)) + + redis_task.cancel() + await pubsub.unsubscribe(channel_name) diff --git a/android/dai/dai/backend/app/labs/project_models.py b/android/dai/dai/backend/app/labs/project_models.py new file mode 100644 index 0000000..80a823c --- /dev/null +++ b/android/dai/dai/backend/app/labs/project_models.py @@ -0,0 +1,171 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Enum, Float, Text, JSON +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func +import enum +from app.core.database import Base + +class ProjectStatus(str, enum.Enum): + ACTIVE = "active" + PAUSED = "paused" + COMPLETED = "completed" + ARCHIVED = "archived" + +class TaskPriority(str, enum.Enum): + LOW = "low" + MEDIUM = "medium" + HIGH = "high" + CRITICAL = "critical" + +class TaskAssignmentType(str, enum.Enum): + ADMIN_ASSIGNED = "admin_assigned" # Assigned by lab owner/admin + SELF_ASSIGNED = "self_assigned" # User assigned to themselves + +class ProjectTemplateType(str, enum.Enum): + SOFTWARE_DEVELOPMENT = "software_development" + RESEARCH_PROJECT = "research_project" + MARKETING_CAMPAIGN = "marketing_campaign" + EVENT_PLANNING = "event_planning" + CUSTOM = "custom" + +class ProjectColumn(Base): + """Dynamic columns for a project (Kanban lanes)""" + __tablename__ = "project_columns" + + id = Column(Integer, primary_key=True, index=True) + project_id = Column(Integer, ForeignKey("lab_projects.id"), nullable=False, index=True) + name = Column(String, nullable=False) + color = Column(String, nullable=True) + sort_order = Column(Integer, default=0, index=True) + is_done = Column(Boolean, default=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + project = relationship("Project", back_populates="columns") + tasks = relationship("ProjectTask", back_populates="column", cascade="all, delete-orphan") + +class Project(Base): + """Projects within a lab for task and progress management""" + __tablename__ = "lab_projects" + + id = Column(Integer, primary_key=True, index=True) + lab_id = Column(Integer, ForeignKey("labs.id"), nullable=False, index=True) + name = Column(String, nullable=False, index=True) + description = Column(Text, nullable=True) + status = Column(Enum(ProjectStatus), default=ProjectStatus.ACTIVE, index=True) + + # Template and theme + template_type = Column(Enum(ProjectTemplateType), default=ProjectTemplateType.CUSTOM) + template_config = Column(JSON, nullable=True) # Stores template structure + theme_color = Column(String, nullable=True) # Hex color for UI + + # Progress tracking + progress_percentage = Column(Float, default=0.0) # 0-100 + total_tasks = Column(Integer, default=0) + completed_tasks = Column(Integer, default=0) + + # Metadata + created_by = Column(Integer, ForeignKey("users.id"), nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + completed_at = Column(DateTime(timezone=True), nullable=True) + + # Relationships + lab = relationship("Lab") + creator = relationship("User") + columns = relationship("ProjectColumn", back_populates="project", cascade="all, delete-orphan") + tasks = relationship("ProjectTask", back_populates="project", cascade="all, delete-orphan") + assignments = relationship("ProjectTaskAssignment", back_populates="project", cascade="all, delete-orphan") + +class ProjectTask(Base): + """Individual tasks within a project""" + __tablename__ = "project_tasks" + + id = Column(Integer, primary_key=True, index=True) + project_id = Column(Integer, ForeignKey("lab_projects.id"), nullable=False, index=True) + + # Task details + title = Column(String, nullable=False) + description = Column(Text, nullable=True) + column_id = Column(Integer, ForeignKey("project_columns.id"), nullable=False, index=True) + priority = Column(Enum(TaskPriority), default=TaskPriority.MEDIUM) + + # Categorization + category = Column(String, nullable=True) # e.g., "Frontend", "Backend", "Documentation" + tags = Column(JSON, nullable=True) # List of tags + + # Progress and effort + progress_percentage = Column(Float, default=0.0) + estimated_hours = Column(Float, nullable=True) + actual_hours = Column(Float, default=0.0) + + # Dependencies + depends_on_task_ids = Column(JSON, nullable=True) # List of task IDs this task depends on + + # Metadata + created_by = Column(Integer, ForeignKey("users.id"), nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + completed_at = Column(DateTime(timezone=True), nullable=True) + due_date = Column(DateTime(timezone=True), nullable=True) + + # Relationships + project = relationship("Project", back_populates="tasks") + column = relationship("ProjectColumn", back_populates="tasks") + creator = relationship("User") + assignments = relationship("ProjectTaskAssignment", back_populates="task", cascade="all, delete-orphan") + +class ProjectTaskAssignment(Base): + """Assignments of users to tasks""" + __tablename__ = "project_task_assignments" + + id = Column(Integer, primary_key=True, index=True) + project_id = Column(Integer, ForeignKey("lab_projects.id"), nullable=False, index=True) + task_id = Column(Integer, ForeignKey("project_tasks.id"), nullable=False, index=True) + assigned_to = Column(Integer, ForeignKey("users.id"), nullable=False) + + # Assignment type + assignment_type = Column(Enum(TaskAssignmentType), default=TaskAssignmentType.ADMIN_ASSIGNED) + + # Assignment details + assigned_by = Column(Integer, ForeignKey("users.id"), nullable=False) # Who made the assignment + assigned_at = Column(DateTime(timezone=True), server_default=func.now()) + completed = Column(Boolean, default=False) + completed_at = Column(DateTime(timezone=True), nullable=True) + + # Relationships + project = relationship("Project", back_populates="assignments") + task = relationship("ProjectTask", back_populates="assignments") + assigned_user = relationship("User", foreign_keys=[assigned_to]) + assigner = relationship("User", foreign_keys=[assigned_by]) + +class ProjectTemplate(Base): + """Reusable project templates""" + __tablename__ = "project_templates" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False, unique=True, index=True) + description = Column(Text, nullable=True) + template_type = Column(Enum(ProjectTemplateType), nullable=False) + + # Template structure (JSON) + # { + # "phases": [ + # { + # "name": "Planning", + # "color": "#FF5722", + # "tasks": [ + # {"title": "Define scope", "priority": "high"}, + # {"title": "Create timeline", "priority": "medium"} + # ] + # } + # ] + # } + template_config = Column(JSON, nullable=False) + + # Metadata + is_system_template = Column(Boolean, default=True) # System templates vs user-created + created_by = Column(Integer, ForeignKey("users.id"), nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + # Relationships + creator = relationship("User") diff --git a/android/dai/dai/backend/app/labs/project_router.py b/android/dai/dai/backend/app/labs/project_router.py new file mode 100644 index 0000000..9677ce8 --- /dev/null +++ b/android/dai/dai/backend/app/labs/project_router.py @@ -0,0 +1,405 @@ +from typing import List +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.database import get_db +from app.core.deps import get_current_user +from app.labs.project_schemas import ( + ProjectCreate, ProjectUpdate, ProjectResponse, ProjectDetailResponse, + TaskCreate, TaskUpdate, TaskMoveRequest, TaskAssignmentCreate, TaskAssignmentUpdate, + ProjectApplyTemplateRequest, BulkTaskStatusUpdate, BulkTaskAssignment, + ProjectTemplateCreate, ProjectTemplateUpdate, ProjectTemplateResponse, + ProjectStatistics +) +from app.labs.project_service import ( + create_project, get_projects, get_project, update_project, delete_project, + create_task, update_task, move_task, delete_task, bulk_update_task_status, + assign_task, update_assignment, unassign_task, bulk_assign_tasks, + get_template_by_id, get_all_templates, create_template, apply_template_to_existing_project, + get_lab_project_statistics +) +from app.labs.project_templates import get_all_templates as get_default_templates, get_template_by_type +from app.users.models import User + +router = APIRouter() + + +# ==================== Project Endpoints ==================== + +@router.post("/{lab_id}/projects", response_model=ProjectDetailResponse, status_code=status.HTTP_201_CREATED) +async def create_new_project( + lab_id: int, + project_in: ProjectCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Create a new project in a lab""" + try: + project = await create_project(db, lab_id, project_in, current_user.id) + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.get("/{lab_id}/projects", response_model=List[ProjectResponse]) +async def read_projects( + lab_id: int, + include_archived: bool = False, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get all projects in a lab""" + try: + projects = await get_projects(db, lab_id, current_user.id, include_archived) + return projects + except ValueError as e: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.get("/{lab_id}/projects/statistics", response_model=ProjectStatistics) +async def read_lab_statistics( + lab_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get statistics for all projects in a lab""" + try: + stats = await get_lab_project_statistics(db, lab_id, current_user.id) + return stats + except ValueError as e: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.get("/{lab_id}/projects/{project_id}", response_model=ProjectDetailResponse) +async def read_project( + lab_id: int, + project_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get a specific project with all tasks""" + try: + project = await get_project(db, project_id, current_user.id) + # Verify project belongs to the specified lab + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.put("/{lab_id}/projects/{project_id}", response_model=ProjectResponse) +async def update_project_endpoint( + lab_id: int, + project_id: int, + project_in: ProjectUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Update a project""" + try: + project = await update_project(db, project_id, project_in, current_user.id) + # Verify project belongs to the specified lab + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.delete("/{lab_id}/projects/{project_id}", status_code=status.HTTP_200_OK) +async def delete_project_endpoint( + lab_id: int, + project_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a project""" + try: + success = await delete_project(db, project_id, current_user.id) + return {"message": "Project deleted successfully"} + except ValueError as e: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.post("/{lab_id}/projects/{project_id}/apply-template", response_model=ProjectDetailResponse) +async def apply_template_endpoint( + lab_id: int, + project_id: int, + apply_in: ProjectApplyTemplateRequest, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Apply a template to an existing project""" + try: + project = await apply_template_to_existing_project(db, project_id, apply_in, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +# ==================== Task Endpoints ==================== + +@router.post("/{lab_id}/projects/{project_id}/tasks", response_model=ProjectDetailResponse) +async def create_new_task( + lab_id: int, + project_id: int, + task_in: TaskCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Create a new task in a project""" + try: + await create_task(db, project_id, task_in, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.put("/{lab_id}/projects/{project_id}/tasks/{task_id}", response_model=ProjectDetailResponse) +async def update_task_endpoint( + lab_id: int, + project_id: int, + task_id: int, + task_in: TaskUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Update a task""" + try: + await update_task(db, task_id, task_in, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.put("/{lab_id}/projects/{project_id}/tasks/{task_id}/move", response_model=ProjectDetailResponse) +async def move_task_endpoint( + lab_id: int, + project_id: int, + task_id: int, + move_in: TaskMoveRequest, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Move a task to a different status (Kanban-style)""" + try: + await move_task(db, task_id, move_in, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.delete("/{lab_id}/projects/{project_id}/tasks/{task_id}", response_model=ProjectDetailResponse) +async def delete_task_endpoint( + lab_id: int, + project_id: int, + task_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a task""" + try: + await delete_task(db, task_id, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.post("/{lab_id}/projects/{project_id}/tasks/bulk-update", response_model=ProjectDetailResponse) +async def bulk_update_tasks_endpoint( + lab_id: int, + project_id: int, + bulk_in: BulkTaskStatusUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Bulk update task status""" + try: + await bulk_update_task_status(db, bulk_in.task_ids, bulk_in.column_id, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +# ==================== Task Assignment Endpoints ==================== + +@router.post("/{lab_id}/projects/{project_id}/tasks/{task_id}/assign", response_model=ProjectDetailResponse) +async def assign_task_endpoint( + lab_id: int, + project_id: int, + task_id: int, + assignment_in: TaskAssignmentCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Assign a task to a user""" + try: + await assign_task(db, task_id, assignment_in, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.put("/{lab_id}/projects/{project_id}/assignments/{assignment_id}", response_model=ProjectDetailResponse) +async def update_assignment_endpoint( + lab_id: int, + project_id: int, + assignment_id: int, + update_in: TaskAssignmentUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Update task assignment (mark as completed)""" + try: + await update_assignment(db, assignment_id, update_in, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.delete("/{lab_id}/projects/{project_id}/tasks/{task_id}/assignments/{assigned_to}", response_model=ProjectDetailResponse) +async def unassign_task_endpoint( + lab_id: int, + project_id: int, + task_id: int, + assigned_to: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Remove task assignment""" + try: + await unassign_task(db, task_id, current_user.id, assigned_to) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.post("/{lab_id}/projects/{project_id}/tasks/bulk-assign", response_model=ProjectDetailResponse) +async def bulk_assign_tasks_endpoint( + lab_id: int, + project_id: int, + bulk_in: BulkTaskAssignment, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Bulk assign tasks to a user""" + try: + await bulk_assign_tasks(db, bulk_in.task_ids, bulk_in.assigned_to, + bulk_in.assignment_type, current_user.id) + project = await get_project(db, project_id, current_user.id) + if project.lab_id != lab_id: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found in this lab") + return project + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +# ==================== Template Endpoints ==================== + +@router.get("/templates", response_model=List[ProjectTemplateResponse]) +async def read_templates( + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get all available project templates (system + user-created)""" + try: + # Get database templates + db_templates = await get_all_templates(db, current_user.id) + + # Combine with default templates + default_templates = get_default_templates() + + # Convert default templates to response format + template_responses = [] + for dt in default_templates: + template_responses.append({ + "id": -1, # Negative ID for default templates + "name": dt["name"], + "description": dt["description"], + "template_type": dt["template_type"], + "template_config": dt, + "is_system_template": True, + "created_by": None, + "created_at": None, + "updated_at": None + }) + + # Add database templates + for dt in db_templates: + template_responses.append(dt) + + return template_responses + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) + + +@router.post("/templates", response_model=ProjectTemplateResponse, status_code=status.HTTP_201_CREATED) +async def create_template_endpoint( + template_in: ProjectTemplateCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Create a custom project template""" + try: + template = await create_template(db, template_in.dict(), current_user.id) + return template + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)) diff --git a/android/dai/dai/backend/app/labs/project_schemas.py b/android/dai/dai/backend/app/labs/project_schemas.py new file mode 100644 index 0000000..8b68051 --- /dev/null +++ b/android/dai/dai/backend/app/labs/project_schemas.py @@ -0,0 +1,218 @@ +from pydantic import BaseModel, Field +from typing import Optional, List, Dict, Any +from datetime import datetime +from app.users.schemas import UserResponse +from app.labs.project_models import ( + ProjectStatus, TaskPriority, + TaskAssignmentType, ProjectTemplateType +) + +# ==================== Project Schemas ==================== + +class ProjectColumnCreate(BaseModel): + name: str = Field(..., min_length=1, max_length=100) + color: Optional[str] = None + sort_order: int = 0 + is_done: bool = False + +class ProjectColumnUpdate(BaseModel): + name: Optional[str] = None + color: Optional[str] = None + sort_order: Optional[int] = None + is_done: Optional[bool] = None + +class ProjectColumnResponse(ProjectColumnCreate): + id: int + + class Config: + from_attributes = True + +class ProjectBase(BaseModel): + name: str = Field(..., min_length=1, max_length=200) + description: Optional[str] = None + status: ProjectStatus = ProjectStatus.ACTIVE + theme_color: Optional[str] = None + +class ProjectCreate(ProjectBase): + columns: Optional[List[ProjectColumnCreate]] = None + +class ProjectUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + status: Optional[ProjectStatus] = None + theme_color: Optional[str] = None + +class ProjectTaskAssignmentResponse(BaseModel): + id: int + assigned_to: UserResponse = Field(..., alias="assigned_user") + assigned_by: UserResponse = Field(..., alias="assigner") + assignment_type: TaskAssignmentType + assigned_at: datetime + completed: bool + completed_at: Optional[datetime] = None + + class Config: + from_attributes = True + populate_by_name = True + allow_population_by_field_name = True + +class ProjectTaskResponse(BaseModel): + id: int + title: str + description: Optional[str] = None + column_id: int + priority: TaskPriority + category: Optional[str] = None + tags: Optional[List[str]] = None + progress_percentage: float + estimated_hours: Optional[float] = None + actual_hours: Optional[float] = None + depends_on_task_ids: Optional[List[int]] = None + created_by: UserResponse = Field(..., alias="creator") + created_at: datetime + updated_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + due_date: Optional[datetime] = None + assignments: List[ProjectTaskAssignmentResponse] = [] + + class Config: + from_attributes = True + populate_by_name = True + allow_population_by_field_name = True + +class ProjectResponse(BaseModel): + id: int + lab_id: int + name: str + description: Optional[str] = None + status: ProjectStatus + theme_color: Optional[str] = None + progress_percentage: float + total_tasks: int + completed_tasks: int + created_by: UserResponse = Field(..., alias="creator") + created_at: datetime + updated_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + + class Config: + from_attributes = True + populate_by_name = True + allow_population_by_field_name = True + +class ProjectDetailResponse(ProjectResponse): + columns: List[ProjectColumnResponse] = [] + tasks: List[ProjectTaskResponse] = [] + + class Config: + from_attributes = True + populate_by_name = True + allow_population_by_field_name = True + +class ProjectStatistics(BaseModel): + total_projects: int + active_projects: int + completed_projects: int + total_tasks: int + completed_tasks: int + tasks_by_status: Dict[str, int] + tasks_by_priority: Dict[str, int] + +# ==================== Task Schemas ==================== + +class TaskBase(BaseModel): + title: str = Field(..., min_length=1, max_length=500) + description: Optional[str] = None + column_id: Optional[int] = None + priority: TaskPriority = TaskPriority.MEDIUM + category: Optional[str] = None + tags: Optional[List[str]] = None + estimated_hours: Optional[float] = None + due_date: Optional[datetime] = None + depends_on_task_ids: Optional[List[int]] = None + +class TaskCreate(TaskBase): + assignees: Optional[List[int]] = None + +class TaskUpdate(BaseModel): + title: Optional[str] = None + description: Optional[str] = None + column_id: Optional[int] = None + priority: Optional[TaskPriority] = None + category: Optional[str] = None + tags: Optional[List[str]] = None + progress_percentage: Optional[float] = None + estimated_hours: Optional[float] = None + actual_hours: Optional[float] = None + due_date: Optional[datetime] = None + depends_on_task_ids: Optional[List[int]] = None + +class TaskMoveRequest(BaseModel): + """Move task to different status""" + column_id: int + actual_hours: Optional[float] = None + +class TaskAssignmentCreate(BaseModel): + assigned_to: int # User ID + assignment_type: TaskAssignmentType = TaskAssignmentType.ADMIN_ASSIGNED + +class TaskAssignmentUpdate(BaseModel): + completed: bool + +# ==================== Template Schemas ==================== + +class TemplateTaskConfig(BaseModel): + title: str + priority: TaskPriority = TaskPriority.MEDIUM + category: Optional[str] = None + description: Optional[str] = None + +class TemplatePhaseConfig(BaseModel): + name: str + color: str + tasks: List[TemplateTaskConfig] + +class TemplateConfig(BaseModel): + phases: List[TemplatePhaseConfig] + +class ProjectTemplateBase(BaseModel): + name: str + description: Optional[str] = None + template_type: ProjectTemplateType + +class ProjectTemplateCreate(ProjectTemplateBase): + template_config: TemplateConfig + +class ProjectTemplateUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + template_config: Optional[TemplateConfig] = None + +class ProjectTemplateResponse(BaseModel): + id: int + name: str + description: Optional[str] = None + template_type: ProjectTemplateType + template_config: TemplateConfig + is_system_template: bool + created_by: Optional[UserResponse] = Field(None, alias="creator") + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + class Config: + from_attributes = True + populate_by_name = True + allow_population_by_field_name = True + +class ProjectApplyTemplateRequest(BaseModel): + template_id: Optional[int] = None # Apply existing template + template_config: Optional[TemplateConfig] = None # Or apply custom config + +class BulkTaskStatusUpdate(BaseModel): + task_ids: List[int] + column_id: int + +class BulkTaskAssignment(BaseModel): + task_ids: List[int] + assigned_to: int + assignment_type: TaskAssignmentType = TaskAssignmentType.ADMIN_ASSIGNED diff --git a/android/dai/dai/backend/app/labs/project_service.py b/android/dai/dai/backend/app/labs/project_service.py new file mode 100644 index 0000000..a0d111f --- /dev/null +++ b/android/dai/dai/backend/app/labs/project_service.py @@ -0,0 +1,665 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy.orm import selectinload +from sqlalchemy import or_, and_, delete +from app.labs.project_models import ( + Project, ProjectTask, ProjectTaskAssignment, ProjectTemplate, ProjectColumn, + ProjectStatus, TaskPriority, TaskAssignmentType, ProjectTemplateType +) +from app.labs.project_schemas import ( + ProjectCreate, ProjectUpdate, TaskCreate, TaskUpdate, + TaskMoveRequest, TaskAssignmentCreate, TaskAssignmentUpdate, + ProjectApplyTemplateRequest, BulkTaskStatusUpdate, BulkTaskAssignment +) +from app.users.models import User +from app.labs.models import Lab, LabMember, LabRole +from typing import Optional, List +import logging +from datetime import datetime + +logger = logging.getLogger(__name__) + + +# ==================== Project Functions ==================== + +async def create_project(db: AsyncSession, lab_id: int, project_in: ProjectCreate, user_id: int): + """Create a new project in a lab""" + # Check if user is a lab member + if not await is_lab_owner(db, lab_id, user_id): + raise ValueError("Only lab owner can create projects") + + db_project = Project( + lab_id=lab_id, + name=project_in.name, + description=project_in.description, + status=project_in.status, + theme_color=project_in.theme_color, + created_by=user_id + ) + db.add(db_project) + await db.commit() + await db.refresh(db_project, ["creator"]) + + # Create dynamic columns + columns_in = project_in.columns or [ + {"name": "Backlog", "color": "#9E9E9E", "sort_order": 0, "is_done": False}, + {"name": "In Progress", "color": "#2196F3", "sort_order": 1, "is_done": False}, + {"name": "Done", "color": "#4CAF50", "sort_order": 2, "is_done": True}, + ] + for col in columns_in: + db.add(ProjectColumn( + project_id=db_project.id, + name=col["name"] if isinstance(col, dict) else col.name, + color=col.get("color") if isinstance(col, dict) else col.color, + sort_order=col.get("sort_order", 0) if isinstance(col, dict) else col.sort_order, + is_done=col.get("is_done", False) if isinstance(col, dict) else col.is_done, + )) + await db.commit() + + await db.refresh(db_project, ["tasks", "creator", "columns"]) + return db_project + + +async def get_projects(db: AsyncSession, lab_id: int, user_id: int, include_archived: bool = False): + """Get all projects in a lab (for lab members only)""" + if not await is_lab_member(db, lab_id, user_id): + raise ValueError("User must be a lab member to view projects") + + query = select(Project).options(selectinload(Project.creator)).where(Project.lab_id == lab_id) + if not include_archived: + query = query.where(Project.status != ProjectStatus.ARCHIVED) + + result = await db.execute(query) + return result.scalars().all() + + +async def get_project(db: AsyncSession, project_id: int, user_id: int): + """Get a specific project with all tasks""" + query = ( + select(Project) + .options( + selectinload(Project.creator), + selectinload(Project.columns), + selectinload(Project.tasks) + .selectinload(ProjectTask.assignments) + .selectinload(ProjectTaskAssignment.assigned_user), + selectinload(Project.tasks) + .selectinload(ProjectTask.assignments) + .selectinload(ProjectTaskAssignment.assigner), + selectinload(Project.tasks).selectinload(ProjectTask.creator), + selectinload(Project.tasks).selectinload(ProjectTask.column), + ) + .where(Project.id == project_id) + .execution_options(populate_existing=True) + ) + result = await db.execute(query) + project = result.unique().scalar_one_or_none() + + if not project: + raise ValueError("Project not found") + + if not await is_lab_member(db, project.lab_id, user_id): + raise ValueError("User must be a lab member to view project") + + return project + + +async def update_project(db: AsyncSession, project_id: int, project_in: ProjectUpdate, user_id: int): + """Update a project""" + project = await get_project(db, project_id, user_id) + + # Check if user is owner/admin + if not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only lab owner can update projects") + + for field, value in project_in.dict(exclude_unset=True).items(): + setattr(project, field, value) + + project.updated_at = datetime.utcnow() + await db.commit() + await db.refresh(project) + return project + + +async def delete_project(db: AsyncSession, project_id: int, user_id: int): + """Delete a project""" + project = await get_project(db, project_id, user_id) + + if not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only lab owner can delete projects") + + await db.delete(project) + await db.commit() + return True + + +async def calculate_project_progress(db: AsyncSession, project_id: int): + """Calculate and update project progress based on tasks""" + tasks_result = await db.execute( + select(ProjectTask).where(ProjectTask.project_id == project_id) + ) + tasks = tasks_result.scalars().all() + columns_result = await db.execute( + select(ProjectColumn).where(ProjectColumn.project_id == project_id) + ) + columns = columns_result.scalars().all() + done_column_ids = {c.id for c in columns if c.is_done} + + total_tasks = len(tasks) + completed_tasks = sum(1 for task in tasks if task.column_id in done_column_ids) + progress_percentage = (completed_tasks / total_tasks * 100) if total_tasks > 0 else 0.0 + + # Update project + query = select(Project).where(Project.id == project_id) + result = await db.execute(query) + project = result.scalar_one_or_none() + + if project: + project.progress_percentage = progress_percentage + project.total_tasks = total_tasks + project.completed_tasks = completed_tasks + project.updated_at = datetime.utcnow() + + # Mark as completed if all tasks are done + if completed_tasks > 0 and completed_tasks == total_tasks: + project.status = ProjectStatus.COMPLETED + project.completed_at = datetime.utcnow() + + await db.commit() + + return progress_percentage + + +# ==================== Task Functions ==================== + +async def create_task(db: AsyncSession, project_id: int, task_in: TaskCreate, user_id: int): + """Create a new task in a project""" + project = await db.get(Project, project_id) + if not project: + raise ValueError("Project not found") + + if not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only lab owner can create tasks") + + # Resolve column + column_id = task_in.column_id + if column_id: + column = await db.get(ProjectColumn, column_id) + if not column or column.project_id != project_id: + raise ValueError("Column not found in project") + else: + result = await db.execute( + select(ProjectColumn) + .where(ProjectColumn.project_id == project_id) + .order_by(ProjectColumn.sort_order.asc()) + ) + column = result.scalars().first() + if not column: + raise ValueError("Project has no columns") + column_id = column.id + + # Check dependencies exist + if task_in.depends_on_task_ids: + for dep_id in task_in.depends_on_task_ids: + dep_task = await db.get(ProjectTask, dep_id) + if not dep_task or dep_task.project_id != project_id: + raise ValueError(f"Dependency task {dep_id} not found in project") + + db_task = ProjectTask( + project_id=project_id, + title=task_in.title, + description=task_in.description, + column_id=column_id, + priority=task_in.priority, + category=task_in.category, + tags=task_in.tags, + estimated_hours=task_in.estimated_hours, + due_date=task_in.due_date, + depends_on_task_ids=task_in.depends_on_task_ids, + created_by=user_id, + created_at=datetime.utcnow() + ) + db.add(db_task) + await db.commit() + await db.refresh(db_task) + + # Assign users if provided + if task_in.assignees: + for assignee_id in task_in.assignees: + if await is_lab_member(db, project.lab_id, assignee_id): + db.add(ProjectTaskAssignment( + project_id=project_id, + task_id=db_task.id, + assigned_to=assignee_id, + assignment_type=TaskAssignmentType.ADMIN_ASSIGNED, + assigned_by=user_id + )) + await db.commit() + + # Recalculate project progress + await calculate_project_progress(db, project_id) + + return db_task + + +async def update_task(db: AsyncSession, task_id: int, task_in: TaskUpdate, user_id: int): + """Update a task""" + query = select(ProjectTask).where(ProjectTask.id == task_id) + result = await db.execute(query) + task = result.scalar_one_or_none() + + if not task: + raise ValueError("Task not found") + + # Only lab owner/admin can edit tasks + project = await db.get(Project, task.project_id) + if not project or not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only lab owner can update tasks") + + for field, value in task_in.dict(exclude_unset=True).items(): + if field == "column_id": + column = await db.get(ProjectColumn, value) + if not column or column.project_id != task.project_id: + raise ValueError("Column not found in project") + setattr(task, field, value) + + task.updated_at = datetime.utcnow() + if task_in.column_id is not None: + task.completed_at = datetime.utcnow() if column.is_done else None + + await db.commit() + await db.refresh(task) + + # Recalculate project progress + await calculate_project_progress(db, task.project_id) + + return task + + +async def move_task(db: AsyncSession, task_id: int, move_in: TaskMoveRequest, user_id: int): + """Move task to a different status (Kanban-style)""" + query = ( + select(ProjectTask) + .options(selectinload(ProjectTask.assignments)) + .where(ProjectTask.id == task_id) + ) + result = await db.execute(query) + task = result.scalar_one_or_none() + + if not task: + raise ValueError("Task not found") + + project = await db.get(Project, task.project_id) + if not project: + raise ValueError("Project not found") + + is_owner = await is_lab_owner(db, project.lab_id, user_id) + is_assignee = any(a.assigned_to == user_id for a in task.assignments) + if not (is_owner or is_assignee): + raise ValueError("Only lab owner or assignees can move tasks") + + column = await db.get(ProjectColumn, move_in.column_id) + if not column or column.project_id != task.project_id: + raise ValueError("Column not found in project") + + task.column_id = move_in.column_id + task.updated_at = datetime.utcnow() + + if move_in.actual_hours is not None: + task.actual_hours = move_in.actual_hours + + task.completed_at = datetime.utcnow() if column.is_done else None + + await db.commit() + await db.refresh(task) + + # Recalculate project progress + await calculate_project_progress(db, task.project_id) + + return task + + +async def delete_task(db: AsyncSession, task_id: int, user_id: int): + """Delete a task""" + query = select(ProjectTask).where(ProjectTask.id == task_id) + result = await db.execute(query) + task = result.scalar_one_or_none() + + if not task: + raise ValueError("Task not found") + + project_id = task.project_id + + project = await db.get(Project, project_id) + if not project or not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only lab owner can delete tasks") + + await db.delete(task) + await db.commit() + + # Recalculate project progress + await calculate_project_progress(db, project_id) + + return True + + +async def bulk_update_task_status(db: AsyncSession, task_ids: List[int], column_id: int, user_id: int): + """Bulk update task column""" + if not task_ids: + return 0 + + query = select(ProjectTask).where(ProjectTask.id.in_(task_ids)) + result = await db.execute(query) + tasks = result.scalars().all() + + project_ids = set() + + for task in tasks: + project = await db.get(Project, task.project_id) + if not project or not await is_lab_owner(db, project.lab_id, user_id): + continue + + column = await db.get(ProjectColumn, column_id) + if not column or column.project_id != task.project_id: + continue + + task.column_id = column_id + task.updated_at = datetime.utcnow() + + project_ids.add(task.project_id) + + await db.commit() + + # Recalculate progress for all affected projects + for pid in project_ids: + await calculate_project_progress(db, pid) + + return len(tasks) + + +# ==================== Task Assignment Functions ==================== + +async def assign_task(db: AsyncSession, task_id: int, assignment_in: TaskAssignmentCreate, user_id: int): + """Assign a task to a user""" + query = select(ProjectTask).where(ProjectTask.id == task_id) + result = await db.execute(query) + task = result.scalar_one_or_none() + + if not task: + raise ValueError("Task not found") + + project = await db.get(Project, task.project_id) + if not project: + raise ValueError("Project not found") + + # Only lab owner/admin can assign tasks + if not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only lab owner can assign tasks to others") + + # Check if assignee is lab member + if not await is_lab_member(db, project.lab_id, assignment_in.assigned_to): + raise ValueError("Assignee must be a lab member") + + # Check if already assigned + existing = await db.execute( + select(ProjectTaskAssignment).where( + and_( + ProjectTaskAssignment.task_id == task_id, + ProjectTaskAssignment.assigned_to == assignment_in.assigned_to + ) + ) + ) + if existing.scalar_one_or_none(): + raise ValueError("User already assigned to this task") + + db_assignment = ProjectTaskAssignment( + project_id=task.project_id, + task_id=task_id, + assigned_to=assignment_in.assigned_to, + assignment_type=assignment_in.assignment_type, + assigned_by=user_id + ) + db.add(db_assignment) + await db.commit() + await db.refresh(db_assignment) + + return db_assignment + + +async def update_assignment(db: AsyncSession, assignment_id: int, update_in: TaskAssignmentUpdate, user_id: int): + """Update task assignment (mark as completed)""" + query = select(ProjectTaskAssignment).where(ProjectTaskAssignment.id == assignment_id) + result = await db.execute(query) + assignment = result.scalar_one_or_none() + + if not assignment: + raise ValueError("Assignment not found") + + project = await db.get(Project, assignment.project_id) + if not project or not await is_lab_member(db, project.lab_id, user_id): + raise ValueError("User must be a lab member to update assignments") + + # Only assignee or admin can mark as completed + if update_in.completed: + if assignment.assigned_to != user_id: + if not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only assignee or owner can mark assignment as completed") + + assignment.completed = update_in.completed + if update_in.completed: + assignment.completed_at = datetime.utcnow() + + await db.commit() + await db.refresh(assignment) + return assignment + + +async def unassign_task(db: AsyncSession, task_id: int, user_id: int, assigned_to: int): + """Remove task assignment""" + query = select(ProjectTaskAssignment).where( + and_( + ProjectTaskAssignment.task_id == task_id, + ProjectTaskAssignment.assigned_to == assigned_to + ) + ) + result = await db.execute(query) + assignment = result.scalar_one_or_none() + + if not assignment: + raise ValueError("Assignment not found") + + project = await db.get(Project, assignment.project_id) + if not project or not await is_lab_member(db, project.lab_id, user_id): + raise ValueError("User must be a lab member to remove assignments") + + # Only assignee or admin can unassign + if assigned_to != user_id: + if not await is_lab_owner(db, project.lab_id, user_id): + raise ValueError("Only assignee or owner can remove assignments") + + await db.delete(assignment) + await db.commit() + return True + + +async def bulk_assign_tasks(db: AsyncSession, task_ids: List[int], assigned_to: int, + assignment_type: TaskAssignmentType, user_id: int): + """Bulk assign tasks to a user""" + if not task_ids: + return 0 + + assignments = [] + for task_id in task_ids: + try: + assignment = await assign_task( + db, task_id, + TaskAssignmentCreate(assigned_to=assigned_to, assignment_type=assignment_type), + user_id + ) + assignments.append(assignment) + except Exception as e: + logger.error(f"Failed to assign task {task_id}: {e}") + + return len(assignments) + + +# ==================== Template Functions ==================== + +async def get_template_by_id(db: AsyncSession, template_id: int): + """Get template by ID""" + query = select(ProjectTemplate).where(ProjectTemplate.id == template_id) + result = await db.execute(query) + return result.scalar_one_or_none() + + +async def get_all_templates(db: AsyncSession, user_id: int = None): + """Get all templates (system + user-created)""" + query = select(ProjectTemplate) + result = await db.execute(query) + return result.scalars().all() + + +async def create_template(db: AsyncSession, template_in: dict, user_id: int): + """Create a custom project template""" + db_template = ProjectTemplate( + name=template_in["name"], + description=template_in.get("description"), + template_type=template_in["template_type"], + template_config=template_in["template_config"], + is_system_template=False, + created_by=user_id + ) + db.add(db_template) + await db.commit() + await db.refresh(db_template) + return db_template + + +async def apply_template_to_project(db: AsyncSession, project_id: int, template_config: dict): + """Apply template configuration to a project (create tasks from template)""" + phases = template_config.get("phases", []) + result = await db.execute( + select(ProjectColumn) + .where(ProjectColumn.project_id == project_id) + .order_by(ProjectColumn.sort_order.asc()) + ) + default_column = result.scalars().first() + if not default_column: + raise ValueError("Project has no columns") + + for phase in phases: + phase_name = phase.get("name", "") + phase_color = phase.get("color", "#000000") + tasks = phase.get("tasks", []) + + for task_config in tasks: + db_task = ProjectTask( + project_id=project_id, + column_id=default_column.id, + title=task_config.get("title", ""), + description=task_config.get("description"), + priority=task_config.get("priority", TaskPriority.MEDIUM), + category=task_config.get("category", phase_name), + tags=[phase_name] # Tag with phase name for filtering + ) + db.add(db_task) + + await db.commit() + + +async def apply_template_to_existing_project(db: AsyncSession, project_id: int, + apply_in: ProjectApplyTemplateRequest, user_id: int): + """Apply template to an existing project""" + project = await get_project(db, project_id, user_id) + + template_config = None + if apply_in.template_id: + template = await get_template_by_id(db, apply_in.template_id) + if template: + template_config = template.template_config + elif apply_in.template_config: + template_config = apply_in.template_config.dict() + + if template_config: + await apply_template_to_project(db, project_id, template_config) + await calculate_project_progress(db, project_id) + await db.refresh(project) + + return project + + +# ==================== Statistics Functions ==================== + +async def get_lab_project_statistics(db: AsyncSession, lab_id: int, user_id: int): + """Get statistics for all projects in a lab""" + if not await is_lab_member(db, lab_id, user_id): + raise ValueError("User must be a lab member to view statistics") + + projects = await get_projects(db, lab_id, user_id, include_archived=True) + + total_projects = len(projects) + active_projects = sum(1 for p in projects if p.status == ProjectStatus.ACTIVE) + completed_projects = sum(1 for p in projects if p.status == ProjectStatus.COMPLETED) + + # Get all tasks + all_tasks = [] + all_columns = {} + for project in projects: + query = select(ProjectTask).where(ProjectTask.project_id == project.id) + result = await db.execute(query) + tasks = result.scalars().all() + all_tasks.extend(tasks) + cols_result = await db.execute( + select(ProjectColumn).where(ProjectColumn.project_id == project.id) + ) + for col in cols_result.scalars().all(): + all_columns[col.id] = col + + total_tasks = len(all_tasks) + completed_tasks = sum(1 for t in all_tasks if all_columns.get(t.column_id, None) and all_columns[t.column_id].is_done) + + # Tasks by column + tasks_by_status = {} + for task in all_tasks: + col = all_columns.get(task.column_id) + if not col: + continue + tasks_by_status[col.name] = tasks_by_status.get(col.name, 0) + 1 + + # Tasks by priority + tasks_by_priority = {priority.value: 0 for priority in TaskPriority} + for task in all_tasks: + tasks_by_priority[task.priority.value] += 1 + + return { + "total_projects": total_projects, + "active_projects": active_projects, + "completed_projects": completed_projects, + "total_tasks": total_tasks, + "completed_tasks": completed_tasks, + "tasks_by_status": tasks_by_status, + "tasks_by_priority": tasks_by_priority + } + + +# ==================== Helper Functions ==================== + +async def is_lab_member(db: AsyncSession, lab_id: int, user_id: int) -> bool: + """Check if user is a lab member""" + query = select(LabMember).where( + and_(LabMember.lab_id == lab_id, LabMember.user_id == user_id) + ) + result = await db.execute(query) + return result.scalar_one_or_none() is not None + +async def is_lab_owner(db: AsyncSession, lab_id: int, user_id: int) -> bool: + """Check if user is the lab owner""" + query = select(LabMember).where( + and_( + LabMember.lab_id == lab_id, + LabMember.user_id == user_id, + LabMember.role == LabRole.OWNER, + ) + ) + result = await db.execute(query) + return result.scalar_one_or_none() is not None diff --git a/android/dai/dai/backend/app/labs/project_templates.py b/android/dai/dai/backend/app/labs/project_templates.py new file mode 100644 index 0000000..b322403 --- /dev/null +++ b/android/dai/dai/backend/app/labs/project_templates.py @@ -0,0 +1,609 @@ +""" +Default project templates for lab projects. +These templates provide a starting point for different types of projects. +""" + +DEFAULT_TEMPLATES = { + "software_development": { + "name": "Software Development", + "description": "Template for software development projects with phases from planning to deployment", + "template_type": "software_development", + "phases": [ + { + "name": "Planning & Requirements", + "color": "#FF5722", + "tasks": [ + { + "title": "Define project scope and goals", + "priority": "high", + "category": "Planning", + "description": "Clearly define what the project aims to achieve and what's out of scope" + }, + { + "title": "Create requirements document", + "priority": "high", + "category": "Planning", + "description": "Document functional and non-functional requirements" + }, + { + "title": "Set up development environment", + "priority": "medium", + "category": "Setup", + "description": "Configure development tools, IDE, and local environment" + }, + { + "title": "Create project architecture", + "priority": "high", + "category": "Planning", + "description": "Design system architecture and technology stack" + } + ] + }, + { + "name": "Design", + "color": "#2196F3", + "tasks": [ + { + "title": "Create UI/UX mockups", + "priority": "medium", + "category": "Design", + "description": "Design user interfaces and user experience flows" + }, + { + "title": "Design database schema", + "priority": "high", + "category": "Backend", + "description": "Design database structure and relationships" + }, + { + "title": "Create API specification", + "priority": "high", + "category": "Backend", + "description": "Define API endpoints, request/response formats" + }, + { + "title": "Design system components", + "priority": "medium", + "category": "Frontend", + "description": "Create reusable UI components and design system" + } + ] + }, + { + "name": "Development", + "color": "#4CAF50", + "tasks": [ + { + "title": "Implement backend API", + "priority": "high", + "category": "Backend", + "description": "Build REST API endpoints with proper validation" + }, + { + "title": "Implement frontend features", + "priority": "high", + "category": "Frontend", + "description": "Build user interface components and pages" + }, + { + "title": "Database implementation", + "priority": "high", + "category": "Backend", + "description": "Implement database migrations and seed data" + }, + { + "title": "Authentication & authorization", + "priority": "high", + "category": "Security", + "description": "Implement user authentication and role-based access" + } + ] + }, + { + "name": "Testing", + "color": "#FFC107", + "tasks": [ + { + "title": "Write unit tests", + "priority": "medium", + "category": "Testing", + "description": "Create unit tests for critical components" + }, + { + "title": "Write integration tests", + "priority": "medium", + "category": "Testing", + "description": "Test integration between different components" + }, + { + "title": "Performance testing", + "priority": "low", + "category": "Testing", + "description": "Test application performance under load" + }, + { + "title": "Security testing", + "priority": "high", + "category": "Security", + "description": "Test for common security vulnerabilities" + } + ] + }, + { + "name": "Deployment", + "color": "#9C27B0", + "tasks": [ + { + "title": "Set up CI/CD pipeline", + "priority": "medium", + "category": "DevOps", + "description": "Configure automated build and deployment" + }, + { + "title": "Deploy to staging", + "priority": "high", + "category": "DevOps", + "description": "Deploy application to staging environment" + }, + { + "title": "Deploy to production", + "priority": "high", + "category": "DevOps", + "description": "Deploy to production environment" + }, + { + "title": "Monitor and optimize", + "priority": "medium", + "category": "Maintenance", + "description": "Set up monitoring and optimize performance" + } + ] + } + ] + }, + "research_project": { + "name": "Research Project", + "description": "Template for academic or industry research projects", + "template_type": "research_project", + "phases": [ + { + "name": "Research Planning", + "color": "#E91E63", + "tasks": [ + { + "title": "Define research question", + "priority": "high", + "category": "Planning", + "description": "Formulate clear research questions and hypotheses" + }, + { + "title": "Literature review", + "priority": "high", + "category": "Research", + "description": "Review existing literature and state of the art" + }, + { + "title": "Define methodology", + "priority": "high", + "category": "Planning", + "description": "Choose appropriate research methods and tools" + }, + { + "title": "Create timeline and milestones", + "priority": "medium", + "category": "Planning", + "description": "Set realistic timeline with key milestones" + } + ] + }, + { + "name": "Data Collection", + "color": "#00BCD4", + "tasks": [ + { + "title": "Set up data collection tools", + "priority": "high", + "category": "Data", + "description": "Prepare tools for gathering research data" + }, + { + "title": "Collect primary data", + "priority": "high", + "category": "Data", + "description": "Gather primary research data" + }, + { + "title": "Collect secondary data", + "priority": "medium", + "category": "Data", + "description": "Gather relevant secondary data sources" + }, + { + "title": "Data cleaning and preprocessing", + "priority": "high", + "category": "Data", + "description": "Clean and prepare data for analysis" + } + ] + }, + { + "name": "Analysis", + "color": "#FF9800", + "tasks": [ + { + "title": "Perform exploratory analysis", + "priority": "medium", + "category": "Analysis", + "description": "Explore data patterns and initial insights" + }, + { + "title": "Apply analytical methods", + "priority": "high", + "category": "Analysis", + "description": "Apply chosen research methods and analysis techniques" + }, + { + "title": "Validate findings", + "priority": "high", + "category": "Analysis", + "description": "Validate results through cross-checking or peer review" + }, + { + "title": "Document analysis process", + "priority": "medium", + "category": "Documentation", + "description": "Document analytical methods and procedures" + } + ] + }, + { + "name": "Writing & Publication", + "color": "#4CAF50", + "tasks": [ + { + "title": "Create outline", + "priority": "medium", + "category": "Writing", + "description": "Structure research paper or report" + }, + { + "title": "Write introduction and background", + "priority": "medium", + "category": "Writing", + "description": "Write introduction section with background context" + }, + { + "title": "Write methods section", + "priority": "medium", + "category": "Writing", + "description": "Detail research methodology" + }, + { + "title": "Write results section", + "priority": "medium", + "category": "Writing", + "description": "Present research findings" + }, + { + "title": "Write discussion and conclusion", + "priority": "medium", + "category": "Writing", + "description": "Interpret results and draw conclusions" + }, + { + "title": "Create figures and tables", + "priority": "medium", + "category": "Visualization", + "description": "Create visual representations of data" + } + ] + } + ] + }, + "marketing_campaign": { + "name": "Marketing Campaign", + "description": "Template for planning and executing marketing campaigns", + "template_type": "marketing_campaign", + "phases": [ + { + "name": "Strategy & Planning", + "color": "#E91E63", + "tasks": [ + { + "title": "Define campaign objectives", + "priority": "high", + "category": "Strategy", + "description": "Set clear, measurable campaign goals" + }, + { + "title": "Identify target audience", + "priority": "high", + "category": "Strategy", + "description": "Define and understand target audience segments" + }, + { + "title": "Set budget and timeline", + "priority": "high", + "category": "Planning", + "description": "Determine budget allocation and campaign duration" + }, + { + "title": "Choose marketing channels", + "priority": "high", + "category": "Strategy", + "description": "Select appropriate channels for reaching audience" + } + ] + }, + { + "name": "Content Creation", + "color": "#2196F3", + "tasks": [ + { + "title": "Create content calendar", + "priority": "high", + "category": "Content", + "description": "Plan content publishing schedule" + }, + { + "title": "Design marketing materials", + "priority": "high", + "category": "Design", + "description": "Create visuals, graphics, and marketing assets" + }, + { + "title": "Write copy and messaging", + "priority": "high", + "category": "Content", + "description": "Develop compelling marketing copy" + }, + { + "title": "Create landing pages", + "priority": "medium", + "category": "Web", + "description": "Build dedicated landing pages for campaign" + } + ] + }, + { + "name": "Campaign Launch", + "color": "#4CAF50", + "tasks": [ + { + "title": "Set up tracking and analytics", + "priority": "high", + "category": "Analytics", + "description": "Configure tracking for all campaign activities" + }, + { + "title": "Launch on all channels", + "priority": "high", + "category": "Launch", + "description": "Begin campaign across selected channels" + }, + { + "title": "Monitor initial performance", + "priority": "high", + "category": "Monitoring", + "description": "Track early campaign performance indicators" + } + ] + }, + { + "name": "Optimization & Analysis", + "color": "#FFC107", + "tasks": [ + { + "title": "Analyze campaign metrics", + "priority": "high", + "category": "Analytics", + "description": "Review performance against objectives" + }, + { + "title": "A/B test variations", + "priority": "medium", + "category": "Optimization", + "description": "Test different versions to improve performance" + }, + { + "title": "Optimize underperforming content", + "priority": "medium", + "category": "Optimization", + "description": "Improve content that's not performing well" + } + ] + }, + { + "name": "Reporting & Learnings", + "color": "#9C27B0", + "tasks": [ + { + "title": "Compile campaign report", + "priority": "high", + "category": "Reporting", + "description": "Create comprehensive campaign performance report" + }, + { + "title": "Document learnings", + "priority": "medium", + "category": "Learning", + "description": "Record insights and lessons learned" + }, + { + "title": "Present results to stakeholders", + "priority": "high", + "category": "Presentation", + "description": "Share campaign results with team" + } + ] + } + ] + }, + "event_planning": { + "name": "Event Planning", + "description": "Template for organizing and managing events", + "template_type": "event_planning", + "phases": [ + { + "name": "Event Concept & Budgeting", + "color": "#9C27B0", + "tasks": [ + { + "title": "Define event purpose and objectives", + "priority": "high", + "category": "Planning", + "description": "Clearly define event goals and target outcomes" + }, + { + "title": "Set event budget", + "priority": "high", + "category": "Planning", + "description": "Determine budget allocation for all event components" + }, + { + "title": "Select event date and venue", + "priority": "high", + "category": "Planning", + "description": "Choose appropriate timing and location" + }, + { + "title": "Identify target audience size", + "priority": "medium", + "category": "Planning", + "description": "Estimate expected attendance" + } + ] + }, + { + "name": "Event Logistics", + "color": "#673AB7", + "tasks": [ + { + "title": "Book venue and vendors", + "priority": "high", + "category": "Logistics", + "description": "Reserve location and secure necessary services" + }, + { + "title": "Arrange catering and refreshments", + "priority": "medium", + "category": "Logistics", + "description": "Coordinate food and beverage services" + }, + { + "title": "Set up audio-visual equipment", + "priority": "medium", + "category": "Logistics", + "description": "Configure sound, lighting, and presentation systems" + }, + { + "title": "Coordinate transportation", + "priority": "medium", + "category": "Logistics", + "description": "Arrange attendee transport and parking" + } + ] + }, + { + "name": "Marketing & Promotion", + "color": "#E91E63", + "tasks": [ + { + "title": "Create event marketing materials", + "priority": "medium", + "category": "Marketing", + "description": "Design promotional graphics and content" + }, + { + "title": "Set up event website or landing page", + "priority": "medium", + "category": "Web", + "description": "Create registration and information page" + }, + { + "title": "Launch promotional campaign", + "priority": "high", + "category": "Marketing", + "description": "Execute multi-channel marketing campaign" + }, + { + "title": "Manage event registration", + "priority": "high", + "category": "Operations", + "description": "Handle attendee sign-ups and confirmations" + } + ] + }, + { + "name": "Event Day Management", + "color": "#FF9800", + "tasks": [ + { + "title": "Set up event check-in system", + "priority": "high", + "category": "Operations", + "description": "Implement efficient attendee check-in process" + }, + { + "title": "Coordinate volunteer team", + "priority": "medium", + "category": "Operations", + "description": "Assign roles and responsibilities to volunteers" + }, + { + "title": "Manage event timeline", + "priority": "high", + "category": "Operations", + "description": "Keep event schedule on track during execution" + }, + { + "title": "Handle attendee inquiries", + "priority": "medium", + "category": "Customer Service", + "description": "Respond to questions and provide assistance" + } + ] + }, + { + "name": "Post-Event Activities", + "color": "#4CAF50", + "tasks": [ + { + "title": "Gather feedback from attendees", + "priority": "medium", + "category": "Analysis", + "description": "Collect surveys and post-event evaluations" + }, + { + "title": "Analyze event metrics", + "priority": "high", + "category": "Analytics", + "description": "Review attendance, engagement, and ROI" + }, + { + "title": "Send thank-you communications", + "priority": "medium", + "category": "Follow-up", + "description": "Express gratitude to participants and sponsors" + }, + { + "title": "Create post-event report", + "priority": "high", + "category": "Reporting", + "description": "Document outcomes and lessons learned" + } + ] + } + ] + } +} + + +def get_template_by_type(template_type: str) -> dict: + """Get template configuration by type""" + return DEFAULT_TEMPLATES.get(template_type) + + +def get_all_templates() -> list: + """Get all available templates""" + return list(DEFAULT_TEMPLATES.values()) \ No newline at end of file diff --git a/android/dai/dai/backend/app/labs/room_websocket.py b/android/dai/dai/backend/app/labs/room_websocket.py new file mode 100644 index 0000000..2f9c1df --- /dev/null +++ b/android/dai/dai/backend/app/labs/room_websocket.py @@ -0,0 +1,192 @@ +import json +import asyncio +from fastapi import APIRouter, WebSocket, WebSocketDisconnect, Depends, Query +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.database import get_db +from app.chat.redis_manager import redis_manager +from app.labs.service import ( + get_room, is_lab_member, update_participant_page, + save_whiteboard_stroke, get_whiteboard_strokes, clear_whiteboard, +) +from app.users.service import get_user_by_username +from app.core.security import settings +from jose import jwt, JWTError + +router = APIRouter() + + +async def get_user_from_token(token: str, db: AsyncSession): + try: + payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + username: str = payload.get("sub") + if username is None: + return None + except JWTError: + return None + return await get_user_by_username(db, username) + + +def _stroke_to_dict(stroke) -> dict: + """Serialize a WhiteboardStroke ORM object to a dict.""" + return { + "user_id": stroke.user_id, + "stroke": { + "points": json.loads(stroke.points_json), + "color": stroke.color, + "width": stroke.stroke_width, + "is_eraser": stroke.is_eraser, + }, + } + + +@router.websocket("/{lab_id}/rooms/{room_id}/ws") +async def room_websocket_endpoint( + websocket: WebSocket, + lab_id: int, + room_id: int, + token: str = Query(...), + db: AsyncSession = Depends(get_db) +): + user = await get_user_from_token(token, db) + if not user: + await websocket.close(code=1008) + return + + user_id = user.id + username = user.username + + is_member = await is_lab_member(db, lab_id, user_id) + if not is_member: + await websocket.close(code=1003) + return + + room = await get_room(db, room_id) + if not room or room.lab_id != lab_id: + await websocket.close(code=1008) + return + + await websocket.accept() + + # Send existing whiteboard strokes to the newly connected user only + existing_strokes = await get_whiteboard_strokes(db, room_id) + init_message = { + "type": "whiteboard_init", + "strokes": [_stroke_to_dict(s) for s in existing_strokes], + } + await websocket.send_text(json.dumps(init_message)) + + # Subscribe to Redis channel for this room + channel_name = f"room_{room_id}" + pubsub = await redis_manager.subscribe(channel_name) + + async def listen_to_redis(): + try: + async for message in pubsub.listen(): + if message["type"] == "message": + await websocket.send_text(message["data"]) + except Exception: + pass + + redis_task = asyncio.create_task(listen_to_redis()) + + # Notify others that user joined + join_message = { + "type": "user_joined", + "user_id": user_id, + "username": username, + "room_id": room_id, + "lab_id": lab_id, + } + await redis_manager.publish(channel_name, json.dumps(join_message)) + + try: + while True: + data = await websocket.receive_text() + message_data = json.loads(data) + message_type = message_data.get("type") + + if message_type == "page_change": + page = message_data.get("page") + await update_participant_page(db, room_id, user_id, page) + response = { + "type": "page_change", + "user_id": user_id, + "username": username, + "page": page, + "room_id": room_id, + "lab_id": lab_id, + } + await redis_manager.publish(channel_name, json.dumps(response)) + + elif message_type == "annotation": + response = { + "type": "annotation", + "user_id": user_id, + "username": username, + "page": message_data.get("page"), + "annotation": message_data.get("annotation"), + "room_id": room_id, + "lab_id": lab_id, + } + await redis_manager.publish(channel_name, json.dumps(response)) + + elif message_type == "drawing": + # Legacy drawing event (screen-space, not persisted) + response = { + "type": "drawing", + "user_id": user_id, + "username": username, + "page": message_data.get("page"), + "drawing": message_data.get("drawing"), + "room_id": room_id, + "lab_id": lab_id, + } + await redis_manager.publish(channel_name, json.dumps(response)) + + elif message_type == "whiteboard_stroke": + # Infinite-canvas stroke: save to DB then broadcast + stroke_data = message_data.get("stroke", {}) + points = stroke_data.get("points", []) + # Flutter sends color as signed int32 (e.g. -1 for white 0xFFFFFFFF) + color = int(stroke_data.get("color", -1)) + width = float(stroke_data.get("width", 4.0)) + is_eraser = bool(stroke_data.get("is_eraser", False)) + + await save_whiteboard_stroke( + db, room_id, user_id, points, color, width, is_eraser + ) + + response = { + "type": "whiteboard_stroke", + "user_id": user_id, + "username": username, + "stroke": { + "points": points, + "color": color, + "width": width, + "is_eraser": is_eraser, + }, + } + await redis_manager.publish(channel_name, json.dumps(response)) + + elif message_type == "whiteboard_clear": + # Clear all strokes from DB then broadcast + await clear_whiteboard(db, room_id) + response = { + "type": "whiteboard_clear", + "user_id": user_id, + "username": username, + } + await redis_manager.publish(channel_name, json.dumps(response)) + + except WebSocketDisconnect: + leave_message = { + "type": "user_left", + "user_id": user_id, + "username": username, + "room_id": room_id, + "lab_id": lab_id, + } + await redis_manager.publish(channel_name, json.dumps(leave_message)) + redis_task.cancel() + await pubsub.unsubscribe(channel_name) diff --git a/android/dai/dai/backend/app/labs/router.py b/android/dai/dai/backend/app/labs/router.py new file mode 100644 index 0000000..1e46aab --- /dev/null +++ b/android/dai/dai/backend/app/labs/router.py @@ -0,0 +1,691 @@ +from typing import List +from fastapi import APIRouter, Depends, HTTPException, status, UploadFile, File +from fastapi.responses import FileResponse +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.database import get_db +from app.core.deps import get_current_user +from app.core.config import settings +from app.labs.schemas import ( + LabCreate, LabResponse, LabUpdate, LabDetailResponse, + MembershipRequestResponse, LabPDFResponse, + LabBackpackFolderCreate, LabBackpackFolderResponse, + LabBackpackFileResponse, LabBackpackContentResponse, + LabEmbeddingBulkCreate, LabEmbeddingResponse, + LabRoomCreate, LabRoomResponse +) +from app.labs.service import ( + create_lab, get_labs, get_lab, get_lab_with_requests, add_member, + create_membership_request, get_membership_requests, + approve_membership_request, reject_membership_request, + is_lab_member, is_lab_owner, update_lab, remove_lab_member, get_planet_images, + upload_pdf, get_lab_pdfs, get_pdf, delete_pdf, + create_backpack_folder, get_backpack_content, upload_backpack_file, + delete_backpack_folder, delete_backpack_file, move_backpack_file, + create_lab_embeddings_bulk, get_lab_embeddings, + delete_lab_embeddings_by_file, delete_lab_embeddings_by_source, + create_room, get_lab_rooms, get_room, join_room, leave_room, close_room, delete_room, + get_whiteboard_strokes, clear_whiteboard, +) +from app.users.models import User + +router = APIRouter() + +@router.post("/", response_model=LabResponse) +async def create_new_lab(lab_in: LabCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + lab = await create_lab(db, lab_in, current_user.id) + return lab + +@router.get("/", response_model=List[LabResponse]) +async def read_labs( + sort_by: str = "trending", # trending, popular, recent, active, name + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + from app.labs.service import get_lab_message_count_today, get_lab_last_activity, is_lab_trending + from datetime import datetime + + labs = await get_labs(db, current_user.id) + + # Enrich labs with metrics + enriched_labs = [] + for lab in labs: + message_count = await get_lab_message_count_today(db, lab.id) + last_activity = await get_lab_last_activity(db, lab.id) + + # Get creator username (owner) + creator_username = "Unknown" + for member in lab.members: + if member.role.value == "owner": # LabRole.OWNER + creator_username = member.user.username + break + + # Create enriched lab dict + lab_dict = { + "id": lab.id, + "name": lab.name, + "description": lab.description, + "topic": lab.topic, + "is_private": lab.is_private, + "is_hidden": lab.is_hidden, + "share_key": lab.share_key, + "planet_image": lab.planet_image, + "created_at": lab.created_at, + "updated_at": lab.updated_at, + "members": lab.members, + "member_count": len(lab.members), + "message_count_today": message_count, + "last_activity_at": last_activity, + "is_trending": is_lab_trending(message_count), + "creator_username": creator_username, + } + enriched_labs.append(lab_dict) + + # Sort based on query parameter + if sort_by == "trending": + enriched_labs.sort(key=lambda x: x['message_count_today'], reverse=True) + elif sort_by == "popular": + enriched_labs.sort(key=lambda x: x['member_count'], reverse=True) + elif sort_by == "recent": + enriched_labs.sort(key=lambda x: x['created_at'], reverse=True) + elif sort_by == "active": + enriched_labs.sort(key=lambda x: x['last_activity_at'] or datetime.min, reverse=True) + elif sort_by == "name": + enriched_labs.sort(key=lambda x: x['name']) + + return enriched_labs + +@router.get("/planet-images", response_model=List[str]) +async def list_planet_images(current_user: User = Depends(get_current_user)): + return get_planet_images() + +@router.get("/{lab_id}", response_model=LabDetailResponse) +async def read_lab(lab_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + lab = await get_lab_with_requests(db, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + return lab + +@router.delete("/{lab_id}", status_code=status.HTTP_200_OK) +async def delete_lab_endpoint(lab_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + from app.labs.service import delete_lab_full + success = await delete_lab_full(db, lab_id, current_user.id) + if not success: + raise HTTPException(status_code=403, detail="Lab not found or you are not the owner") + return {"message": "Lab deleted successfully"} + +@router.patch("/{lab_id}", response_model=LabResponse) +async def update_lab_endpoint( + lab_id: int, + lab_in: LabUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + lab = await update_lab(db, lab_id, lab_in, current_user.id) + if not lab: + raise HTTPException(status_code=403, detail="Lab not found or you are not the owner") + return lab + +@router.delete("/{lab_id}/members/{user_id_to_remove}") +async def remove_member_endpoint( + lab_id: int, + user_id_to_remove: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + success = await remove_lab_member(db, lab_id, user_id_to_remove, current_user.id) + if not success: + raise HTTPException(status_code=403, detail="Failed to remove member. You must be the owner and cannot remove yourself.") + return {"message": "Member removed successfully"} + +@router.get("/key/{share_key}", response_model=LabResponse) +async def get_lab_by_key_endpoint(share_key: str, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + """ + Get lab details by share key. + Used for joining hidden public labs. + """ + from app.labs.service import get_lab_by_share_key + lab = await get_lab_by_share_key(db, share_key) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + return lab + +@router.post("/{lab_id}/join") +async def join_lab(lab_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + # Check if lab exists + lab = await get_lab(db, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + # Check if already member + if await is_lab_member(db, lab_id, current_user.id): + return {"message": "Already a member"} + + # Create membership request + request = await create_membership_request(db, lab_id, current_user.id) + if request is None: + return {"message": "Request already exists"} + + return {"message": "Membership request sent successfully"} + +@router.get("/{lab_id}/membership-requests", response_model=List[MembershipRequestResponse]) +async def get_lab_membership_requests(lab_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + # Check if user is owner + if not await is_lab_owner(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab owner can view membership requests") + + requests = await get_membership_requests(db, lab_id) + return requests + +@router.post("/{lab_id}/membership-requests/{request_id}/approve") +async def approve_request(lab_id: int, request_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + # Check if user is owner + if not await is_lab_owner(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab owner can approve requests") + + request = await approve_membership_request(db, request_id, lab_id) + if request is None: + raise HTTPException(status_code=404, detail="Request not found or already processed") + + return {"message": "Request approved successfully"} + +@router.post("/{lab_id}/membership-requests/{request_id}/reject") +async def reject_request(lab_id: int, request_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + # Check if user is owner + if not await is_lab_owner(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab owner can reject requests") + + request = await reject_membership_request(db, request_id, lab_id) + if request is None: + raise HTTPException(status_code=404, detail="Request not found or already processed") + + return {"message": "Request rejected successfully"} + +# PDF Endpoints + +@router.post("/{lab_id}/pdfs", response_model=LabPDFResponse) +async def upload_lab_pdf( + lab_id: int, + file: UploadFile = File(...), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + # Check if lab exists + lab = await get_lab(db, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can upload PDFs") + + # Validate file is PDF + if not file.filename.lower().endswith('.pdf'): + raise HTTPException(status_code=400, detail="Only PDF files are allowed") + + # Read file content + file_content = await file.read() + + # Upload PDF + pdf = await upload_pdf(db, lab_id, current_user.id, file_content, file.filename) + return pdf + +@router.get("/{lab_id}/pdfs", response_model=List[LabPDFResponse]) +async def get_lab_pdfs_endpoint( + lab_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + # Check if lab exists + lab = await get_lab(db, lab_id) + if not lab: + raise HTTPException(status_code=404, detail="Lab not found") + + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can view PDFs") + + pdfs = await get_lab_pdfs(db, lab_id) + return pdfs + +@router.get("/{lab_id}/pdfs/{pdf_id}/download") +async def download_pdf( + lab_id: int, + pdf_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can download PDFs") + + pdf = await get_pdf(db, pdf_id) + if not pdf or pdf.lab_id != lab_id: + raise HTTPException(status_code=404, detail="PDF not found") + + return FileResponse( + path=pdf.file_path, + filename=pdf.original_filename, + media_type="application/pdf" + ) + +@router.delete("/{lab_id}/pdfs/{pdf_id}") +async def delete_lab_pdf( + lab_id: int, + pdf_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can delete PDFs") + + success = await delete_pdf(db, pdf_id, current_user.id) + if not success: + raise HTTPException(status_code=404, detail="PDF not found or you don't have permission") + + return {"message": "PDF deleted successfully"} + +# Lab Backpack Endpoints + +@router.post("/{lab_id}/backpack/folders", response_model=LabBackpackFolderResponse) +async def create_folder( + lab_id: int, + folder_in: LabBackpackFolderCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Create a new folder in lab backpack""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can create folders") + + folder = await create_backpack_folder(db, lab_id, folder_in.name, folder_in.parent_id, current_user) + return folder + +@router.get("/{lab_id}/backpack/content", response_model=LabBackpackContentResponse) +async def get_content( + lab_id: int, + folder_id: int = None, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get folders and files in a specific folder""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can access backpack") + + folders, files = await get_backpack_content(db, lab_id, folder_id) + return {"folders": folders, "files": files} + +@router.post("/{lab_id}/backpack/files", response_model=LabBackpackFileResponse) +async def upload_file( + lab_id: int, + file: UploadFile = File(...), + folder_id: int = None, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Upload a file to lab backpack""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can upload files") + + uploaded_file = await upload_backpack_file(db, lab_id, folder_id, file, current_user) + return uploaded_file + +@router.delete("/{lab_id}/backpack/folders/{folder_id}") +async def delete_folder( + lab_id: int, + folder_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a folder and all its contents""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can delete folders") + + success = await delete_backpack_folder(db, lab_id, folder_id, current_user) + if not success: + raise HTTPException(status_code=404, detail="Folder not found") + + return {"message": "Folder deleted successfully"} + +@router.delete("/{lab_id}/backpack/files/{file_id}") +async def delete_file( + lab_id: int, + file_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a file from lab backpack""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can delete files") + + success = await delete_backpack_file(db, lab_id, file_id, current_user) + if not success: + raise HTTPException(status_code=404, detail="File not found") + + return {"message": "File deleted successfully"} + +@router.put("/{lab_id}/backpack/files/{file_id}/move", response_model=LabBackpackFileResponse) +async def move_file( + lab_id: int, + file_id: int, + new_folder_id: int = None, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Move a file to a different folder""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can move files") + + file = await move_backpack_file(db, lab_id, file_id, new_folder_id, current_user) + if not file: + raise HTTPException(status_code=404, detail="File or folder not found") + + return file + +@router.get("/{lab_id}/backpack/files/{file_id}/download") +async def download_file( + lab_id: int, + file_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Download a file from lab backpack""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can download files") + + from sqlalchemy import select + from app.labs import models + + query = select(models.LabBackpackFile).where( + models.LabBackpackFile.id == file_id, + models.LabBackpackFile.lab_id == lab_id + ) + result = await db.execute(query) + file = result.scalar_one_or_none() + + if not file: + raise HTTPException(status_code=404, detail="File not found") + + import os + if not os.path.exists(file.file_path): + raise HTTPException(status_code=404, detail="File not found on server") + + return FileResponse( + path=file.file_path, + filename=file.name, + media_type='application/octet-stream' + ) + +# Lab Embeddings Endpoints + +@router.post("/{lab_id}/embeddings/bulk", response_model=List[LabEmbeddingResponse]) +async def upload_embeddings_bulk( + lab_id: int, + embeddings_in: LabEmbeddingBulkCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Upload multiple embeddings at once for a lab file""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can upload embeddings") + + embeddings = await create_lab_embeddings_bulk(db, lab_id, embeddings_in.embeddings, current_user) + return embeddings + +@router.get("/{lab_id}/embeddings", response_model=List[LabEmbeddingResponse]) +async def get_embeddings( + lab_id: int, + file_id: int = None, + embedding_type: str = None, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get embeddings for a lab, optionally filtered by file_id or embedding_type""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can access embeddings") + + embeddings = await get_lab_embeddings(db, lab_id, file_id, embedding_type) + return embeddings + +@router.delete("/{lab_id}/embeddings/file/{file_id}") +async def delete_embeddings_by_file( + lab_id: int, + file_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete all embeddings associated with a file""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can delete embeddings") + + success = await delete_lab_embeddings_by_file(db, lab_id, file_id) + if not success: + raise HTTPException(status_code=404, detail="Embeddings not found") + + return {"message": "Embeddings deleted successfully"} + +@router.delete("/{lab_id}/embeddings/source/{document_source}") +async def delete_embeddings_by_source( + lab_id: int, + document_source: str, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete all embeddings associated with a document source""" + # Check if user is a member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can delete embeddings") + + success = await delete_lab_embeddings_by_source(db, lab_id, document_source) + if not success: + raise HTTPException(status_code=404, detail="Embeddings not found") + + return {"message": "Embeddings deleted successfully"} + + +# Room Endpoints +@router.post("/{lab_id}/rooms", response_model=LabRoomResponse) +async def create_lab_room( + lab_id: int, + room_in: LabRoomCreate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Create a new collaborative reading room""" + # Check if user is a lab member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can create rooms") + + room = await create_room(db, lab_id, room_in, current_user.id) + if not room: + raise HTTPException(status_code=404, detail="Backpack file not found") + + return room + +@router.get("/{lab_id}/rooms", response_model=List[LabRoomResponse]) +async def get_rooms( + lab_id: int, + active_only: bool = True, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get all rooms for a lab""" + # Check if user is a lab member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can view rooms") + + rooms = await get_lab_rooms(db, lab_id, active_only) + return rooms + +@router.get("/{lab_id}/rooms/{room_id}", response_model=LabRoomResponse) +async def get_room_detail( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get a specific room""" + # Check if user is a lab member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can view rooms") + + room = await get_room(db, room_id) + if not room or room.lab_id != lab_id: + raise HTTPException(status_code=404, detail="Room not found") + + return room + +@router.post("/{lab_id}/rooms/{room_id}/join") +async def join_lab_room( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Join a room""" + # Check if user is a lab member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can join rooms") + + # Verify room belongs to lab + room = await get_room(db, room_id) + if not room or room.lab_id != lab_id: + raise HTTPException(status_code=404, detail="Room not found") + + participant = await join_room(db, room_id, current_user.id) + return {"message": "Joined room successfully"} + +@router.post("/{lab_id}/rooms/{room_id}/leave") +async def leave_lab_room( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Leave a room""" + success = await leave_room(db, room_id, current_user.id) + if not success: + raise HTTPException(status_code=404, detail="Not in this room") + + return {"message": "Left room successfully"} + +@router.post("/{lab_id}/rooms/{room_id}/close") +async def close_lab_room( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Close a room (only creator can close)""" + room = await close_room(db, room_id, current_user.id) + if not room: + raise HTTPException(status_code=403, detail="Only room creator can close the room") + + return {"message": "Room closed successfully"} + +from app.labs.livekit_utils import generate_token + +@router.post("/{lab_id}/rooms/{room_id}/token") +async def get_room_token( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get LiveKit token for a room""" + # Check if user is a lab member + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can join rooms") + + # Verify room belongs to lab + room = await get_room(db, room_id) + if not room or room.lab_id != lab_id: + raise HTTPException(status_code=404, detail="Room not found") + + try: + token = generate_token( + room_name=f"room_{room_id}", + participant_identity=str(current_user.id), + participant_name=current_user.username + ) + return {"token": token, "url": settings.LIVEKIT_URL} + except ValueError as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.delete("/{lab_id}/rooms/{room_id}") +async def delete_lab_room( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete a room (only creator can delete)""" + success = await delete_room(db, room_id, current_user.id) + if not success: + raise HTTPException(status_code=403, detail="Only room creator can delete the room") + + return {"message": "Room deleted successfully"} + + +# Whiteboard Endpoints + +@router.get("/{lab_id}/rooms/{room_id}/whiteboard") +async def get_room_whiteboard( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get all persisted whiteboard strokes for a room.""" + import json as _json + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can access the whiteboard") + + room = await get_room(db, room_id) + if not room or room.lab_id != lab_id: + raise HTTPException(status_code=404, detail="Room not found") + + strokes = await get_whiteboard_strokes(db, room_id) + return { + "strokes": [ + { + "user_id": s.user_id, + "stroke": { + "points": _json.loads(s.points_json), + "color": s.color, + "width": s.stroke_width, + "is_eraser": s.is_eraser, + }, + } + for s in strokes + ] + } + + +@router.delete("/{lab_id}/rooms/{room_id}/whiteboard") +async def clear_room_whiteboard( + lab_id: int, + room_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Clear all whiteboard strokes for a room (any member can clear).""" + if not await is_lab_member(db, lab_id, current_user.id): + raise HTTPException(status_code=403, detail="Only lab members can clear the whiteboard") + + room = await get_room(db, room_id) + if not room or room.lab_id != lab_id: + raise HTTPException(status_code=404, detail="Room not found") + + await clear_whiteboard(db, room_id) + return {"message": "Whiteboard cleared"} diff --git a/android/dai/dai/backend/app/labs/schemas.py b/android/dai/dai/backend/app/labs/schemas.py new file mode 100644 index 0000000..1da6e8c --- /dev/null +++ b/android/dai/dai/backend/app/labs/schemas.py @@ -0,0 +1,181 @@ +from pydantic import BaseModel +from typing import Optional, List +from datetime import datetime +from app.users.schemas import UserResponse +from app.labs.models import LabRole, MembershipRequestStatus + +class LabBase(BaseModel): + name: str + description: Optional[str] = None + topic: Optional[str] = None + is_private: bool = False + is_hidden: bool = False + planet_image: Optional[str] = None + +class LabCreate(LabBase): + pass + +class LabUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + topic: Optional[str] = None + is_private: Optional[bool] = None + is_hidden: Optional[bool] = None + planet_image: Optional[str] = None + +class LabMemberResponse(BaseModel): + id: int + user: UserResponse + role: LabRole + joined_at: datetime + + class Config: + from_attributes = True + +class MembershipRequestResponse(BaseModel): + id: int + user: UserResponse + status: MembershipRequestStatus + created_at: datetime + updated_at: Optional[datetime] = None + + class Config: + from_attributes = True + +class LabResponse(LabBase): + id: int + created_at: datetime + updated_at: Optional[datetime] = None + share_key: Optional[str] = None + members: List[LabMemberResponse] = [] + + # Activity metrics + member_count: int = 0 + message_count_today: int = 0 + last_activity_at: Optional[datetime] = None + is_trending: bool = False + creator_username: str = "Unknown" + + class Config: + from_attributes = True + +class LabDetailResponse(LabResponse): + membership_requests: List[MembershipRequestResponse] = [] + + class Config: + from_attributes = True + +class LabPDFResponse(BaseModel): + id: int + lab_id: int + filename: str + original_filename: str + file_path: str + file_size: int + uploaded_by: int + uploaded_at: datetime + uploader: UserResponse + + class Config: + from_attributes = True + +# Lab Backpack Schemas +class LabBackpackFolderCreate(BaseModel): + name: str + parent_id: Optional[int] = None + +class LabBackpackFolderResponse(BaseModel): + id: int + lab_id: int + name: str + parent_id: Optional[int] = None + created_at: datetime + updated_at: Optional[datetime] = None + + class Config: + from_attributes = True + +class LabBackpackFileResponse(BaseModel): + id: int + lab_id: int + folder_id: Optional[int] = None + name: str + file_path: str + file_size: int + extension: Optional[str] = None + uploaded_by: int + uploaded_at: datetime + uploader: UserResponse + + class Config: + from_attributes = True + +class LabBackpackContentResponse(BaseModel): + folders: List[LabBackpackFolderResponse] = [] + files: List[LabBackpackFileResponse] = [] + +# Lab Embeddings Schemas +class LabEmbeddingCreate(BaseModel): + file_id: Optional[int] = None + embedding_type: str # 'document', 'first_window', 'second_window' + document_source: str + window_index: Optional[int] = None + first_window_index: Optional[int] = None + content: Optional[str] = None + embedding_vector: List[float] # The actual embedding vector + metadata: Optional[dict] = None + token_count: int = 0 + page_count: Optional[int] = None + chunk_count: Optional[int] = None + +class LabEmbeddingBulkCreate(BaseModel): + """For uploading multiple embeddings at once""" + embeddings: List[LabEmbeddingCreate] + +class LabEmbeddingResponse(BaseModel): + id: int + lab_id: int + file_id: Optional[int] = None + embedding_type: str + document_source: str + window_index: Optional[int] = None + first_window_index: Optional[int] = None + token_count: int + page_count: Optional[int] = None + chunk_count: Optional[int] = None + created_at: datetime + updated_at: Optional[datetime] = None + + class Config: + from_attributes = True + +# Lab Room Schemas +class RoomParticipantResponse(BaseModel): + id: int + user: UserResponse + current_page: int + joined_at: datetime + last_active: datetime + + class Config: + from_attributes = True + +class LabRoomCreate(BaseModel): + name: str + backpack_file_id: Optional[int] = None + +class LabRoomResponse(BaseModel): + id: int + lab_id: int + backpack_file_id: Optional[int] = None + name: str + is_active: bool + created_by: int + created_at: datetime + closed_at: Optional[datetime] = None + creator: UserResponse + backpack_file: Optional[LabBackpackFileResponse] = None + participants: List[RoomParticipantResponse] = [] + + class Config: + from_attributes = True diff --git a/android/dai/dai/backend/app/labs/service.py b/android/dai/dai/backend/app/labs/service.py new file mode 100644 index 0000000..ceb72ec --- /dev/null +++ b/android/dai/dai/backend/app/labs/service.py @@ -0,0 +1,1101 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy.orm import selectinload +from sqlalchemy import or_, and_, delete +from app.labs.models import Lab, LabMember, LabRole, MembershipRequest, MembershipRequestStatus, LabPDF, LabBackpackFolder, LabBackpackFile, LabEmbedding, LabRoom, RoomParticipant, WhiteboardStroke +from app.labs.schemas import LabCreate, LabUpdate, LabEmbeddingCreate, LabRoomCreate +from app.users.models import User +from app.gitea.models import GitRepository +from app.gitea.service import GiteaService +from app.core.config import get_settings +from fastapi import UploadFile +import os +import shutil +import uuid +import json +import random +from datetime import datetime +from typing import Optional, List +import logging + +logger = logging.getLogger(__name__) + +# Planet images directory +PLANET_IMAGES_DIR = "app/static/planet_images" + +def get_random_planet_image() -> str: + """Get a random planet image filename from the planet_images directory""" + if not os.path.exists(PLANET_IMAGES_DIR): + os.makedirs(PLANET_IMAGES_DIR, exist_ok=True) + return None + + # Get all image files from the directory + image_files = [f for f in os.listdir(PLANET_IMAGES_DIR) + if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))] + + if not image_files: + return None + + return random.choice(image_files) + +def get_planet_images() -> List[str]: + """Get all planet image filenames from the planet_images directory""" + if not os.path.exists(PLANET_IMAGES_DIR): + os.makedirs(PLANET_IMAGES_DIR, exist_ok=True) + return [] + + image_files = [f for f in os.listdir(PLANET_IMAGES_DIR) + if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))] + return sorted(image_files) + +async def create_lab(db: AsyncSession, lab_in: LabCreate, user_id: int): + # Assign random planet image if not provided + planet_image = lab_in.planet_image or get_random_planet_image() + + share_key = None + if lab_in.is_hidden: + # Generate a unique share key (8 characters hex) + # In production, check for collision loop, but 8 hex chars is 4 billion combinations + share_key = uuid.uuid4().hex[:8] + + db_lab = Lab( + name=lab_in.name, + description=lab_in.description, + topic=lab_in.topic, + is_private=lab_in.is_private, + is_hidden=lab_in.is_hidden, + share_key=share_key, + planet_image=planet_image + ) + db.add(db_lab) + await db.commit() + await db.refresh(db_lab) + + # Add creator as owner + member = LabMember(lab_id=db_lab.id, user_id=user_id, role=LabRole.OWNER) + db.add(member) + await db.commit() + + # VERY IMPORTANT: refresh Lab.members after commit! + await db.refresh(db_lab, ["members"]) + + # Automatically create Git repository for public labs + if not lab_in.is_private: + try: + settings = get_settings() + gitea_service = GiteaService(settings) + + # Get owner username + owner_result = await db.execute(select(User).filter(User.id == user_id)) + owner = owner_result.scalar_one_or_none() + owner_username = owner.username if owner else f"user_{user_id}" + + # Create repository in Gitea and initialize local repo + repo_info = await gitea_service.create_repository( + db_lab.id, db_lab.name, owner_username + ) + + # Store repository mapping in database + git_repo = GitRepository( + lab_id=db_lab.id, + gitea_repo_id=repo_info["id"], + gitea_repo_name=repo_info["name"], + gitea_clone_url=repo_info["clone_url"] + ) + db.add(git_repo) + await db.commit() + + logger.info(f"Created Git repository for lab {db_lab.id}") + except Exception as e: + # Log error but don't fail lab creation + logger.error(f"Failed to create Git repository for lab {db_lab.id}: {e}") + + # Reload with relations (safe) + result = await db.execute( + select(Lab) + .options(selectinload(Lab.members).selectinload(LabMember.user)) + .filter(Lab.id == db_lab.id) + ) + + return result.scalar_one() + +async def get_labs(db: AsyncSession, user_id: int): + # Return public labs and private labs where user is a member + # For simplicity now returning all public labs + private labs where user is member + # This query might need optimization + # Logic: Show if (Public AND Not Hidden) OR (User is Member) + stmt = select(Lab).options(selectinload(Lab.members).selectinload(LabMember.user)).distinct() + + stmt = stmt.filter( + or_( + and_(Lab.is_private == False, Lab.is_hidden == False), + Lab.members.any(LabMember.user_id == user_id) + ) + ) + + result = await db.execute(stmt) + return result.scalars().all() + +async def get_lab_by_share_key(db: AsyncSession, share_key: str): + stmt = select(Lab).options(selectinload(Lab.members).selectinload(LabMember.user)).filter(Lab.share_key == share_key) + result = await db.execute(stmt) + return result.scalars().first() + +async def get_lab(db: AsyncSession, lab_id: int): + result = await db.execute( + select(Lab).options(selectinload(Lab.members).selectinload(LabMember.user)).filter(Lab.id == lab_id) + ) + return result.scalars().first() + +async def delete_lab_full(db: AsyncSession, lab_id: int, user_id: int): + # Check if user is owner + is_owner = await is_lab_owner(db, lab_id, user_id) + if not is_owner: + return False + + lab = await get_lab(db, lab_id) + if not lab: + return False + + # Clear last_read_message_id and reply_to_id in all chats of this lab to avoid FK violations + from app.chat.models import Chat, ChatMember, ChatMessage + from sqlalchemy import update + + chat_ids_result = await db.execute(select(Chat.id).filter(Chat.lab_id == lab_id)) + chat_ids = chat_ids_result.scalars().all() + + if chat_ids: + await db.execute( + update(ChatMember) + .where(ChatMember.chat_id.in_(chat_ids)) + .values(last_read_message_id=None) + ) + await db.execute( + update(ChatMessage) + .where(ChatMessage.chat_id.in_(chat_ids)) + .values(reply_to_id=None) + ) + + # Delete Git commits first (FK) + from app.gitea.models import GitCommit + await db.execute(delete(GitCommit).where(GitCommit.lab_id == lab_id)) + + # Delete Git repository mapping first to avoid FK issues + git_repo_result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + git_repo = git_repo_result.scalar_one_or_none() + if git_repo: + await db.delete(git_repo) + + await db.delete(lab) + await db.commit() + return True + +async def update_lab(db: AsyncSession, lab_id: int, lab_in: LabUpdate, user_id: int): + # Check if user is owner + is_owner = await is_lab_owner(db, lab_id, user_id) + if not is_owner: + return None + + lab = await get_lab(db, lab_id) + if not lab: + return None + + # Update fields + update_data = lab_in.model_dump(exclude_unset=True) + for field, value in update_data.items(): + setattr(lab, field, value) + + await db.commit() + await db.refresh(lab, ["members"]) + + # Reload with relations + result = await db.execute( + select(Lab) + .options(selectinload(Lab.members).selectinload(LabMember.user)) + .filter(Lab.id == lab.id) + ) + return result.scalar_one() + +async def remove_lab_member(db: AsyncSession, lab_id: int, user_id_to_remove: int, current_user_id: int): + # Check if current user is owner + is_owner = await is_lab_owner(db, lab_id, current_user_id) + if not is_owner: + return False + + # Cannot remove the owner (yourself) + if user_id_to_remove == current_user_id: + return False + + stmt = delete(LabMember).where( + and_( + LabMember.lab_id == lab_id, + LabMember.user_id == user_id_to_remove, + LabMember.role != LabRole.OWNER # Safety check + ) + ) + result = await db.execute(stmt) + await db.commit() + + return result.rowcount > 0 + +async def get_lab_with_requests(db: AsyncSession, lab_id: int): + result = await db.execute( + select(Lab) + .options( + selectinload(Lab.members).selectinload(LabMember.user), + selectinload(Lab.membership_requests).selectinload(MembershipRequest.user) + ) + .filter(Lab.id == lab_id) + ) + return result.scalars().first() + +async def add_member(db: AsyncSession, lab_id: int, user_id: int, role: LabRole = LabRole.MEMBER): + member = LabMember(lab_id=lab_id, user_id=user_id, role=role) + db.add(member) + await db.commit() + return member + +async def create_membership_request(db: AsyncSession, lab_id: int, user_id: int): + # Check if already a member + result = await db.execute( + select(LabMember).filter(LabMember.lab_id == lab_id, LabMember.user_id == user_id) + ) + if result.scalars().first(): + return None # Already a member + + # Check if already has a pending request + result = await db.execute( + select(MembershipRequest).filter( + MembershipRequest.lab_id == lab_id, + MembershipRequest.user_id == user_id, + MembershipRequest.status == MembershipRequestStatus.PENDING + ) + ) + if result.scalars().first(): + return None # Already has pending request + + # Create new request + request = MembershipRequest(lab_id=lab_id, user_id=user_id) + db.add(request) + await db.commit() + await db.refresh(request) + return request + +async def get_membership_requests(db: AsyncSession, lab_id: int): + result = await db.execute( + select(MembershipRequest) + .options(selectinload(MembershipRequest.user)) + .filter( + MembershipRequest.lab_id == lab_id, + MembershipRequest.status == MembershipRequestStatus.PENDING + ) + .order_by(MembershipRequest.created_at.desc()) + ) + return result.scalars().all() + +async def approve_membership_request(db: AsyncSession, request_id: int, lab_id: int): + result = await db.execute( + select(MembershipRequest).filter( + MembershipRequest.id == request_id, + MembershipRequest.lab_id == lab_id + ) + ) + request = result.scalars().first() + if not request or request.status != MembershipRequestStatus.PENDING: + return None + + # Update request status + request.status = MembershipRequestStatus.APPROVED + + # Add user as member + member = LabMember(lab_id=lab_id, user_id=request.user_id, role=LabRole.MEMBER) + db.add(member) + + await db.commit() + await db.refresh(request) + return request + +async def reject_membership_request(db: AsyncSession, request_id: int, lab_id: int): + result = await db.execute( + select(MembershipRequest).filter( + MembershipRequest.id == request_id, + MembershipRequest.lab_id == lab_id + ) + ) + request = result.scalars().first() + if not request or request.status != MembershipRequestStatus.PENDING: + return None + + request.status = MembershipRequestStatus.REJECTED + await db.commit() + await db.refresh(request) + return request + +async def is_lab_member(db: AsyncSession, lab_id: int, user_id: int) -> bool: + result = await db.execute( + select(LabMember).filter(LabMember.lab_id == lab_id, LabMember.user_id == user_id) + ) + return result.scalars().first() is not None + +async def is_lab_owner(db: AsyncSession, lab_id: int, user_id: int) -> bool: + result = await db.execute( + select(LabMember).filter( + LabMember.lab_id == lab_id, + LabMember.user_id == user_id, + LabMember.role == LabRole.OWNER + ) + ) + return result.scalars().first() is not None + +# PDF Management Functions + +async def upload_pdf(db: AsyncSession, lab_id: int, user_id: int, file_content: bytes, original_filename: str): + """Upload a PDF file to a lab""" + # Create uploads directory if it doesn't exist + upload_dir = "uploads/pdfs" + os.makedirs(upload_dir, exist_ok=True) + + # Generate unique filename + file_extension = os.path.splitext(original_filename)[1] + unique_filename = f"{uuid.uuid4()}{file_extension}" + file_path = os.path.join(upload_dir, unique_filename) + + # Save file + with open(file_path, "wb") as f: + f.write(file_content) + + # Get file size + file_size = len(file_content) + + # Create database record + db_pdf = LabPDF( + lab_id=lab_id, + filename=unique_filename, + original_filename=original_filename, + file_path=file_path, + file_size=file_size, + uploaded_by=user_id + ) + db.add(db_pdf) + await db.commit() + await db.refresh(db_pdf, ["uploader"]) + + return db_pdf + +async def get_lab_pdfs(db: AsyncSession, lab_id: int): + """Get all PDFs for a lab""" + result = await db.execute( + select(LabPDF) + .options(selectinload(LabPDF.uploader)) + .filter(LabPDF.lab_id == lab_id) + .order_by(LabPDF.uploaded_at.desc()) + ) + return result.scalars().all() + +async def get_pdf(db: AsyncSession, pdf_id: int): + """Get a specific PDF""" + result = await db.execute( + select(LabPDF) + .options(selectinload(LabPDF.uploader)) + .filter(LabPDF.id == pdf_id) + ) + return result.scalars().first() + +async def delete_pdf(db: AsyncSession, pdf_id: int, user_id: int): + """Delete a PDF (only uploader or lab owner can delete)""" + pdf = await get_pdf(db, pdf_id) + if not pdf: + return False + + # Check if user is the uploader or lab owner + if pdf.uploaded_by != user_id: + is_owner = await is_lab_owner(db, pdf.lab_id, user_id) + if not is_owner: + return False + + # Delete file from filesystem + if os.path.exists(pdf.file_path): + os.remove(pdf.file_path) + + # Delete from database + await db.delete(pdf) + await db.commit() + return True + +# Lab Backpack Service Functions + +async def create_backpack_folder( + db: AsyncSession, + lab_id: int, + name: str, + parent_id: Optional[int], + user: User +) -> LabBackpackFolder: + """Create a new folder in lab backpack""" + folder = LabBackpackFolder( + lab_id=lab_id, + name=name, + parent_id=parent_id + ) + db.add(folder) + await db.commit() + await db.refresh(folder) + return folder + +async def get_backpack_content( + db: AsyncSession, + lab_id: int, + folder_id: Optional[int] = None +) -> tuple[list[LabBackpackFolder], list[LabBackpackFile]]: + """Get folders and files in a specific folder (or root if folder_id is None)""" + # Get folders + folder_query = select(LabBackpackFolder).where( + LabBackpackFolder.lab_id == lab_id, + LabBackpackFolder.parent_id == folder_id + ) + folders_result = await db.execute(folder_query) + folders = folders_result.scalars().all() + + # Get files + file_query = select(LabBackpackFile).where( + LabBackpackFile.lab_id == lab_id, + LabBackpackFile.folder_id == folder_id + ).options(selectinload(LabBackpackFile.uploader)) + files_result = await db.execute(file_query) + files = files_result.scalars().all() + + return folders, files + +async def upload_backpack_file( + db: AsyncSession, + lab_id: int, + folder_id: Optional[int], + file: UploadFile, + user: User +) -> LabBackpackFile: + """Upload a file to lab backpack""" + # Create uploads directory if it doesn't exist + upload_dir = os.path.join("uploads", "lab_backpacks", str(lab_id)) + os.makedirs(upload_dir, exist_ok=True) + + # Generate unique filename + file_extension = os.path.splitext(file.filename)[1] + unique_filename = f"{uuid.uuid4()}{file_extension}" + file_path = os.path.join(upload_dir, unique_filename) + + # Save file + with open(file_path, "wb") as f: + content = await file.read() + f.write(content) + + # Get file size + file_size = os.path.getsize(file_path) + + # Create database entry + db_file = LabBackpackFile( + lab_id=lab_id, + folder_id=folder_id, + name=file.filename, + file_path=file_path, + file_size=file_size, + extension=file_extension.lstrip('.') if file_extension else None, + uploaded_by=user.id + ) + db.add(db_file) + await db.commit() + await db.refresh(db_file) + + # Load uploader relationship + await db.refresh(db_file, ['uploader']) + + # Sync file into Git repo for public labs + await _sync_file_to_git_repo(db, lab_id, db_file) + + return db_file + +async def delete_backpack_folder( + db: AsyncSession, + lab_id: int, + folder_id: int, + user: User +) -> bool: + """Delete a folder and all its contents""" + query = select(LabBackpackFolder).where( + LabBackpackFolder.id == folder_id, + LabBackpackFolder.lab_id == lab_id + ) + result = await db.execute(query) + folder = result.scalar_one_or_none() + + if not folder: + return False + + # Delete all files in this folder and subfolders recursively + await _delete_folder_contents(db, lab_id, folder_id) + + # Delete folder + await db.delete(folder) + await db.commit() + return True + +async def _delete_folder_contents(db: AsyncSession, lab_id: int, folder_id: int): + """Recursively delete all contents of a folder""" + # Get all subfolders + subfolder_query = select(LabBackpackFolder).where( + LabBackpackFolder.parent_id == folder_id + ) + subfolders_result = await db.execute(subfolder_query) + subfolders = subfolders_result.scalars().all() + + # Recursively delete subfolders + for subfolder in subfolders: + await _delete_folder_contents(db, lab_id, subfolder.id) + await db.delete(subfolder) + + # Delete all files in this folder + file_query = select(LabBackpackFile).where( + LabBackpackFile.folder_id == folder_id + ) + files_result = await db.execute(file_query) + files = files_result.scalars().all() + + for file in files: + if os.path.exists(file.file_path): + os.remove(file.file_path) + await _remove_file_from_git_repo(db, lab_id, file) + await db.delete(file) + +async def delete_backpack_file( + db: AsyncSession, + lab_id: int, + file_id: int, + user: User +) -> bool: + """Delete a file from lab backpack""" + query = select(LabBackpackFile).where( + LabBackpackFile.id == file_id, + LabBackpackFile.lab_id == lab_id + ) + result = await db.execute(query) + file = result.scalar_one_or_none() + + if not file: + return False + + # Delete file from filesystem + if os.path.exists(file.file_path): + os.remove(file.file_path) + + # Remove file from Git repo for public labs + await _remove_file_from_git_repo(db, lab_id, file) + + # Delete from database + await db.delete(file) + await db.commit() + return True + +async def move_backpack_file( + db: AsyncSession, + lab_id: int, + file_id: int, + new_folder_id: Optional[int], + user: User +) -> Optional[LabBackpackFile]: + """Move a file to a different folder""" + query = select(LabBackpackFile).where( + LabBackpackFile.id == file_id, + LabBackpackFile.lab_id == lab_id + ) + result = await db.execute(query) + file = result.scalar_one_or_none() + + if not file: + return None + + # Verify new folder exists if provided + if new_folder_id is not None: + folder_query = select(LabBackpackFolder).where( + LabBackpackFolder.id == new_folder_id, + LabBackpackFolder.lab_id == lab_id + ) + folder_result = await db.execute(folder_query) + folder = folder_result.scalar_one_or_none() + if not folder: + return None + + old_folder_id = file.folder_id + file.folder_id = new_folder_id + await db.commit() + await db.refresh(file) + await db.refresh(file, ['uploader']) + + # Move file in Git repo for public labs + await _move_file_in_git_repo(db, lab_id, file, old_folder_id) + return file + + +async def _get_git_repo(db: AsyncSession, lab_id: int) -> Optional[GitRepository]: + result = await db.execute( + select(GitRepository).where(GitRepository.lab_id == lab_id) + ) + return result.scalar_one_or_none() + + +async def _build_folder_path(db: AsyncSession, folder_id: Optional[int]) -> str: + if folder_id is None: + return "" + + segments: List[str] = [] + current_id = folder_id + while current_id is not None: + folder = await db.get(LabBackpackFolder, current_id) + if not folder: + break + segments.append(_sanitize_path_part(folder.name)) + current_id = folder.parent_id + + segments.reverse() + return "/".join([seg for seg in segments if seg]) + + +def _sanitize_path_part(name: str) -> str: + clean = name.replace("\\", "/").strip() + clean = clean.replace("/", "_") + return clean + + +async def _sync_file_to_git_repo( + db: AsyncSession, + lab_id: int, + file: LabBackpackFile, +) -> None: + git_repo = await _get_git_repo(db, lab_id) + if not git_repo: + return + + settings = get_settings() + gitea_service = GiteaService(settings) + repo_dir = gitea_service.ensure_local_repo(lab_id, git_repo.gitea_clone_url) + + folder_path = await _build_folder_path(db, file.folder_id) + target_dir = os.path.join(repo_dir, folder_path) if folder_path else repo_dir + os.makedirs(target_dir, exist_ok=True) + + target_path = os.path.join(target_dir, _sanitize_path_part(file.name)) + if os.path.exists(file.file_path): + shutil.copy2(file.file_path, target_path) + + +async def _remove_file_from_git_repo( + db: AsyncSession, + lab_id: int, + file: LabBackpackFile, +) -> None: + git_repo = await _get_git_repo(db, lab_id) + if not git_repo: + return + + settings = get_settings() + gitea_service = GiteaService(settings) + repo_dir = gitea_service.ensure_local_repo(lab_id, git_repo.gitea_clone_url) + + folder_path = await _build_folder_path(db, file.folder_id) + target_dir = os.path.join(repo_dir, folder_path) if folder_path else repo_dir + target_path = os.path.join(target_dir, _sanitize_path_part(file.name)) + if os.path.exists(target_path): + os.remove(target_path) + + +async def _move_file_in_git_repo( + db: AsyncSession, + lab_id: int, + file: LabBackpackFile, + old_folder_id: Optional[int], +) -> None: + git_repo = await _get_git_repo(db, lab_id) + if not git_repo: + return + + settings = get_settings() + gitea_service = GiteaService(settings) + repo_dir = gitea_service.ensure_local_repo(lab_id, git_repo.gitea_clone_url) + + old_folder_path = await _build_folder_path(db, old_folder_id) + new_folder_path = await _build_folder_path(db, file.folder_id) + + old_dir = os.path.join(repo_dir, old_folder_path) if old_folder_path else repo_dir + new_dir = os.path.join(repo_dir, new_folder_path) if new_folder_path else repo_dir + os.makedirs(new_dir, exist_ok=True) + + file_name = _sanitize_path_part(file.name) + old_path = os.path.join(old_dir, file_name) + new_path = os.path.join(new_dir, file_name) + + if os.path.exists(old_path): + shutil.move(old_path, new_path) + elif os.path.exists(file.file_path): + shutil.copy2(file.file_path, new_path) + +# Lab Embeddings Service Functions + +async def create_lab_embeddings_bulk( + db: AsyncSession, + lab_id: int, + embeddings_data: List[LabEmbeddingCreate], + user: User +) -> List[LabEmbedding]: + """Create multiple embeddings for a lab file at once""" + db_embeddings = [] + + for emb_data in embeddings_data: + # Convert embedding vector to JSON + embedding_json = json.dumps({ + "vector": emb_data.embedding_vector, + "dimension": len(emb_data.embedding_vector) + }) + + # Convert metadata to JSON if exists + metadata_json = json.dumps(emb_data.metadata) if emb_data.metadata else None + + db_embedding = LabEmbedding( + lab_id=lab_id, + file_id=emb_data.file_id, + embedding_type=emb_data.embedding_type, + document_source=emb_data.document_source, + window_index=emb_data.window_index, + first_window_index=emb_data.first_window_index, + content=emb_data.content, + embedding_json=embedding_json, + metadata_json=metadata_json, + token_count=emb_data.token_count, + page_count=emb_data.page_count, + chunk_count=emb_data.chunk_count + ) + db_embeddings.append(db_embedding) + + db.add_all(db_embeddings) + await db.commit() + + # Refresh all embeddings + for emb in db_embeddings: + await db.refresh(emb) + + return db_embeddings + +async def get_lab_embeddings( + db: AsyncSession, + lab_id: int, + file_id: Optional[int] = None, + embedding_type: Optional[str] = None +) -> List[LabEmbedding]: + """Get embeddings for a lab, optionally filtered by file_id or embedding_type""" + query = select(LabEmbedding).where(LabEmbedding.lab_id == lab_id) + + if file_id is not None: + query = query.where(LabEmbedding.file_id == file_id) + + if embedding_type is not None: + query = query.where(LabEmbedding.embedding_type == embedding_type) + + result = await db.execute(query) + return result.scalars().all() + +async def delete_lab_embeddings_by_file( + db: AsyncSession, + lab_id: int, + file_id: int +) -> bool: + """Delete all embeddings associated with a file""" + query = select(LabEmbedding).where( + LabEmbedding.lab_id == lab_id, + LabEmbedding.file_id == file_id + ) + result = await db.execute(query) + embeddings = result.scalars().all() + + for emb in embeddings: + await db.delete(emb) + + await db.commit() + return True + +async def delete_lab_embeddings_by_source( + db: AsyncSession, + lab_id: int, + document_source: str +) -> bool: + """Delete all embeddings associated with a document source""" + query = select(LabEmbedding).where( + LabEmbedding.lab_id == lab_id, + LabEmbedding.document_source == document_source + ) + result = await db.execute(query) + embeddings = result.scalars().all() + + for emb in embeddings: + await db.delete(emb) + + await db.commit() + return True + + +# Room functions +async def create_room(db: AsyncSession, lab_id: int, room_in: LabRoomCreate, user_id: int): + """Create a new collaborative room""" + # Optionally validate backpack file only if provided + if room_in.backpack_file_id is not None: + result = await db.execute( + select(LabBackpackFile).filter( + LabBackpackFile.id == room_in.backpack_file_id, + LabBackpackFile.lab_id == lab_id + ) + ) + backpack_file = result.scalars().first() + if not backpack_file: + return None + + room = LabRoom( + lab_id=lab_id, + backpack_file_id=room_in.backpack_file_id, + name=room_in.name, + created_by=user_id, + is_active=True + ) + db.add(room) + await db.commit() + await db.refresh(room) + + # Reload with relations + result = await db.execute( + select(LabRoom) + .options( + selectinload(LabRoom.creator), + selectinload(LabRoom.backpack_file).selectinload(LabBackpackFile.uploader), + selectinload(LabRoom.participants).selectinload(RoomParticipant.user) + ) + .filter(LabRoom.id == room.id) + ) + return result.scalars().first() + +async def get_lab_rooms(db: AsyncSession, lab_id: int, active_only: bool = True): + """Get all rooms for a lab""" + query = select(LabRoom).options( + selectinload(LabRoom.creator), + selectinload(LabRoom.backpack_file).selectinload(LabBackpackFile.uploader), + selectinload(LabRoom.participants).selectinload(RoomParticipant.user) + ).filter(LabRoom.lab_id == lab_id) + + if active_only: + query = query.filter(LabRoom.is_active == True) + + result = await db.execute(query.order_by(LabRoom.created_at.desc())) + return result.scalars().all() + +async def get_room(db: AsyncSession, room_id: int): + """Get a specific room""" + result = await db.execute( + select(LabRoom) + .options( + selectinload(LabRoom.creator), + selectinload(LabRoom.backpack_file).selectinload(LabBackpackFile.uploader), + selectinload(LabRoom.participants).selectinload(RoomParticipant.user) + ) + .filter(LabRoom.id == room_id) + ) + return result.scalars().first() + +async def join_room(db: AsyncSession, room_id: int, user_id: int): + """Add a user to a room""" + # Check if already in room + result = await db.execute( + select(RoomParticipant).filter( + RoomParticipant.room_id == room_id, + RoomParticipant.user_id == user_id + ) + ) + existing = result.scalars().first() + if existing: + return existing + + # Add participant + participant = RoomParticipant( + room_id=room_id, + user_id=user_id, + current_page=1 + ) + db.add(participant) + await db.commit() + await db.refresh(participant) + + # Reload with user + result = await db.execute( + select(RoomParticipant) + .options(selectinload(RoomParticipant.user)) + .filter(RoomParticipant.id == participant.id) + ) + return result.scalars().first() + +async def leave_room(db: AsyncSession, room_id: int, user_id: int): + """Remove a user from a room""" + result = await db.execute( + select(RoomParticipant).filter( + RoomParticipant.room_id == room_id, + RoomParticipant.user_id == user_id + ) + ) + participant = result.scalars().first() + if participant: + await db.delete(participant) + await db.commit() + return True + return False + +async def close_room(db: AsyncSession, room_id: int, user_id: int): + """Close a room (only creator can close)""" + room = await get_room(db, room_id) + if not room or room.created_by != user_id: + return None + + room.is_active = False + room.closed_at = datetime.utcnow() + await db.commit() + await db.refresh(room) + return room + +async def delete_room(db: AsyncSession, room_id: int, user_id: int): + """Delete a room (only creator can delete)""" + room = await get_room(db, room_id) + if not room or room.created_by != user_id: + return None + + # Delete all participants first (cascade should handle this, but being explicit) + await db.execute( + select(RoomParticipant).filter(RoomParticipant.room_id == room_id) + ) + + await db.delete(room) + await db.commit() + return True + +async def update_participant_page(db: AsyncSession, room_id: int, user_id: int, page: int): + """Update the current page for a participant""" + result = await db.execute( + select(RoomParticipant).filter( + RoomParticipant.room_id == room_id, + RoomParticipant.user_id == user_id + ) + ) + participant = result.scalars().first() + if participant: + participant.current_page = page + participant.last_active = datetime.utcnow() + await db.commit() + await db.refresh(participant) + return participant + return None + + +# Lab Activity Metrics Functions +async def get_lab_message_count_today(db: AsyncSession, lab_id: int) -> int: + """Get count of messages in all chats of this lab from last 24h""" + from app.chat.models import Chat, ChatMessage + from datetime import timedelta + from sqlalchemy import func + + today = datetime.utcnow() - timedelta(hours=24) + + # Get all chats for this lab + chats_result = await db.execute( + select(Chat.id).filter(Chat.lab_id == lab_id) + ) + chat_ids = [row[0] for row in chats_result.fetchall()] + + if not chat_ids: + return 0 + + # Count messages in these chats from last 24h + result = await db.execute( + select(func.count(ChatMessage.id)).filter( + and_( + ChatMessage.chat_id.in_(chat_ids), + ChatMessage.timestamp >= today + ) + ) + ) + return result.scalar() or 0 + + +async def get_lab_last_activity(db: AsyncSession, lab_id: int) -> Optional[datetime]: + """Get timestamp of last message in any chat of this lab""" + from app.chat.models import Chat, ChatMessage + from sqlalchemy import func + + chats_result = await db.execute( + select(Chat.id).filter(Chat.lab_id == lab_id) + ) + chat_ids = [row[0] for row in chats_result.fetchall()] + + if not chat_ids: + return None + + result = await db.execute( + select(func.max(ChatMessage.timestamp)).filter( + ChatMessage.chat_id.in_(chat_ids) + ) + ) + return result.scalar() + + +def is_lab_trending(message_count_today: int) -> bool: + """Determine if lab is trending based on activity""" + return message_count_today >= 10 # Threshold: 10+ messages in 24h + + +# ── Whiteboard Functions ────────────────────────────────────────────────────── + +async def save_whiteboard_stroke( + db: AsyncSession, + room_id: int, + user_id: int, + points: list, + color: int, + stroke_width: float, + is_eraser: bool = False, +) -> WhiteboardStroke: + """Persist a whiteboard stroke to the database.""" + stroke = WhiteboardStroke( + room_id=room_id, + user_id=user_id, + points_json=json.dumps(points), + color=color, + stroke_width=stroke_width, + is_eraser=is_eraser, + ) + db.add(stroke) + await db.commit() + await db.refresh(stroke) + return stroke + + +async def get_whiteboard_strokes(db: AsyncSession, room_id: int) -> List[WhiteboardStroke]: + """Retrieve all whiteboard strokes for a room ordered by creation time.""" + result = await db.execute( + select(WhiteboardStroke) + .filter(WhiteboardStroke.room_id == room_id) + .order_by(WhiteboardStroke.created_at) + ) + return result.scalars().all() + + +async def clear_whiteboard(db: AsyncSession, room_id: int) -> bool: + """Delete all whiteboard strokes for a room.""" + result = await db.execute( + select(WhiteboardStroke).filter(WhiteboardStroke.room_id == room_id) + ) + strokes = result.scalars().all() + for stroke in strokes: + await db.delete(stroke) + await db.commit() + return True diff --git a/android/dai/dai/backend/app/main.py b/android/dai/dai/backend/app/main.py new file mode 100644 index 0000000..58944c4 --- /dev/null +++ b/android/dai/dai/backend/app/main.py @@ -0,0 +1,115 @@ +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from sqlalchemy import text +from app.core.config import settings +from app.auth import router as auth_router +from app.users import router as users_router +from app.labs import router as labs_router +from app.labs import pdf_websocket as pdf_ws_router +from app.labs import room_websocket as room_ws_router +from app.labs import project_router as project_router +from app.chat import router as chat_router +from app.chat import websocket as chat_websocket +from app.chat import socketio_namespace +from app.bot import router as bot_router +from app.translation import router as translation_router +from app.news import router as news_router +from app.scholar import router as scholar_router +from app.core.database import engine, Base +from app.labs.project_models import * +from app.core.scheduler import start_scheduler, shutdown_scheduler +from app.ai import router as ai_router +import os +import socketio + +app = FastAPI(title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json") + +# Setup Socket.IO +socketio_app = socketio.ASGIApp( + socketio_server=socketio_namespace.sio, + socketio_path='/socket.io' +) + +# Mount static files for planet images +PLANET_IMAGES_PATH = "app/static/planet_images" +os.makedirs(PLANET_IMAGES_PATH, exist_ok=True) +app.mount("/static/planet_images", StaticFiles(directory=PLANET_IMAGES_PATH), name="planet_images") + +# Mount static files for chat attachments +CHAT_FILES_PATH = "app/static/chat_files" +os.makedirs(CHAT_FILES_PATH, exist_ok=True) +app.mount("/static/chat_files", StaticFiles(directory=CHAT_FILES_PATH), name="chat_files") + +# Mount static files for user avatars +AVATARS_PATH = "app/static/avatars" +os.makedirs(AVATARS_PATH, exist_ok=True) +app.mount("/static/avatars", StaticFiles(directory=AVATARS_PATH), name="avatars") + +# CORS +origins = ["*"] +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# Routers +app.include_router(auth_router.router, prefix=f"{settings.API_V1_STR}/auth", tags=["auth"]) +app.include_router(users_router.router, prefix=f"{settings.API_V1_STR}/users", tags=["users"]) +app.include_router(project_router.router, prefix=f"{settings.API_V1_STR}/labs", tags=["projects"]) +app.include_router(labs_router.router, prefix=f"{settings.API_V1_STR}/labs", tags=["labs"]) +app.include_router(pdf_ws_router.router, prefix=f"{settings.API_V1_STR}/labs", tags=["pdf"]) +app.include_router(room_ws_router.router, prefix=f"{settings.API_V1_STR}/labs", tags=["rooms"]) +app.include_router(chat_router.router, prefix=f"{settings.API_V1_STR}/labs", tags=["chat"]) +app.include_router(chat_websocket.router, prefix=f"{settings.API_V1_STR}/labs", tags=["chat"]) +app.include_router(bot_router.router, prefix=f"{settings.API_V1_STR}/bot", tags=["bot"]) +app.include_router(translation_router, prefix=f"{settings.API_V1_STR}/translation", tags=["translation"]) +app.include_router(news_router.router, prefix=f"{settings.API_V1_STR}/news", tags=["news"]) +app.include_router(scholar_router.router, prefix=f"{settings.API_V1_STR}/scholar", tags=["scholar"]) +app.include_router(ai_router.router, prefix=f"{settings.API_V1_STR}/ai", tags=["ai"]) + +# Git Router +from app.gitea import router as gitea_router +app.include_router(gitea_router.router, prefix=f"{settings.API_V1_STR}/git", tags=["git"]) + +@app.on_event("startup") +async def startup(): + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + # Migration: add reply_to_id column to existing chat_messages table + try: + await conn.execute(text( + "ALTER TABLE chat_messages ADD COLUMN IF NOT EXISTS " + "reply_to_id INTEGER REFERENCES chat_messages(id) ON DELETE SET NULL" + )) + except Exception: + pass + # Migration: make lab_rooms.backpack_file_id nullable + try: + await conn.execute(text( + "ALTER TABLE lab_rooms ALTER COLUMN backpack_file_id DROP NOT NULL" + )) + except Exception: + pass + start_scheduler() + +@app.on_event("shutdown") +async def shutdown(): + shutdown_scheduler() + +@app.get("/") +async def root(): + return {"message": "Welcome to Distributed AI Chat API"} + +# Create combined ASGI app for Socket.IO and FastAPI +# Use this as: uvicorn app.main:asgi_app --host 0.0.0.0 --port 8313 --reload +from app.chat import socketio_namespace + +asgi_app = socketio.ASGIApp( + socketio_server=socketio_namespace.sio, + other_asgi_app=app, + socketio_path='/socket.io' +) diff --git a/android/dai/dai/backend/app/news/models.py b/android/dai/dai/backend/app/news/models.py new file mode 100644 index 0000000..2513b10 --- /dev/null +++ b/android/dai/dai/backend/app/news/models.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Integer, String, DateTime, Text +from app.core.database import Base +from datetime import datetime + +class News(Base): + __tablename__ = "news" + + id = Column(Integer, primary_key=True, index=True) + title = Column(String, index=True) + link = Column(String, unique=True, index=True) + description = Column(Text) + pub_date = Column(DateTime, default=datetime.utcnow) + category = Column(String, index=True) + image_url = Column(String, nullable=True) + created_at = Column(DateTime, default=datetime.utcnow) diff --git a/android/dai/dai/backend/app/news/router.py b/android/dai/dai/backend/app/news/router.py new file mode 100644 index 0000000..f3f5ac2 --- /dev/null +++ b/android/dai/dai/backend/app/news/router.py @@ -0,0 +1,28 @@ +from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List, Optional +from app.core.database import get_db +from app.news import schemas, service +from app.news.service import NewsService + +router = APIRouter() + +@router.get("/", response_model=List[schemas.News]) +async def read_news( + category: Optional[str] = None, + skip: int = 0, + limit: int = 50, + db: AsyncSession = Depends(get_db) +): + return await NewsService.get_news(db, category, limit, skip) + +@router.post("/fetch", status_code=202) +async def trigger_fetch_news( + background_tasks: BackgroundTasks, + db: AsyncSession = Depends(get_db) +): + """ + Manually trigger news fetching in the background. + """ + background_tasks.add_task(NewsService.fetch_and_store_news, db) + return {"message": "News fetch triggered in background"} diff --git a/android/dai/dai/backend/app/news/schemas.py b/android/dai/dai/backend/app/news/schemas.py new file mode 100644 index 0000000..dae4648 --- /dev/null +++ b/android/dai/dai/backend/app/news/schemas.py @@ -0,0 +1,21 @@ +from pydantic import BaseModel +from datetime import datetime +from typing import Optional + +class NewsBase(BaseModel): + title: str + link: str + description: str + pub_date: datetime + category: str + image_url: Optional[str] = None + +class NewsCreate(NewsBase): + pass + +class News(NewsBase): + id: int + created_at: datetime + + class Config: + from_attributes = True diff --git a/android/dai/dai/backend/app/news/service.py b/android/dai/dai/backend/app/news/service.py new file mode 100644 index 0000000..1d924a0 --- /dev/null +++ b/android/dai/dai/backend/app/news/service.py @@ -0,0 +1,93 @@ +import feedparser +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, delete, func +from app.news.models import News +from app.core.config import settings +from datetime import datetime +from time import mktime +import logging + +logger = logging.getLogger(__name__) + +class NewsService: + @staticmethod + async def fetch_and_store_news(db: AsyncSession): + # TEMPORARY: Disable News fetch due to no internet connection + return + + logger.info("Starting news fetch...") + for category, url in settings.NEWS_FEED_URLS.items(): + try: + feed = feedparser.parse(url) + logger.info(f"Fetched {len(feed.entries)} entries for category: {category}") + + new_items_count = 0 + for entry in feed.entries: + # Check if link already exists + result = await db.execute(select(News).where(News.link == entry.link)) + existing_news = result.scalars().first() + + if not existing_news: + # Parse date + published_parsed = entry.get("published_parsed") or entry.get("updated_parsed") + pub_date = datetime.fromtimestamp(mktime(published_parsed)) if published_parsed else datetime.utcnow() + + # Extract image if available (Media RSS or Enclosure) + image_url = None + if "media_content" in entry: + image_url = entry.media_content[0]["url"] + elif "enclosures" in entry and entry.enclosures: + image_url = entry.enclosures[0]["href"] + elif "image" in entry and "url" in entry.image: + image_url = entry.image["url"] + + news_item = News( + title=entry.title, + link=entry.link, + description=entry.description, + pub_date=pub_date, + category=category, + image_url=image_url + ) + db.add(news_item) + new_items_count += 1 + + await db.commit() + logger.info(f"Added {new_items_count} new items for {category}") + + # Cleanup old items + await NewsService.cleanup_old_news(db, category) + + except Exception as e: + logger.error(f"Error fetching news for {category}: {e}") + await db.rollback() + + @staticmethod + async def cleanup_old_news(db: AsyncSession, category: str): + # Count items in category + result = await db.execute(select(func.count(News.id)).where(News.category == category)) + count = result.scalar() + + if count > settings.NEWS_MAX_ITEMS_PER_CATEGORY: + excess = count - settings.NEWS_MAX_ITEMS_PER_CATEGORY + logger.info(f"Cleaning up {excess} old items for {category}") + + # Find IDs to delete (oldest first) + subquery = select(News.id).where(News.category == category).order_by(News.pub_date.asc()).limit(excess) + result = await db.execute(subquery) + ids_to_delete = result.scalars().all() + + if ids_to_delete: + await db.execute(delete(News).where(News.id.in_(ids_to_delete))) + await db.commit() + + @staticmethod + async def get_news(db: AsyncSession, category: str = None, limit: int = 50, skip: int = 0): + # TEMPORARY: Disable News retrieval + return [] + + query = select(News).order_by(News.pub_date.desc()).offset(skip).limit(limit) + if category: + query = query.where(News.category == category) + result = await db.execute(query) + return result.scalars().all() diff --git a/coordinator_frontend/lib/widgets/loading_overlay.dart b/android/dai/dai/backend/app/scholar/__init__.py similarity index 100% rename from coordinator_frontend/lib/widgets/loading_overlay.dart rename to android/dai/dai/backend/app/scholar/__init__.py diff --git a/android/dai/dai/backend/app/scholar/router.py b/android/dai/dai/backend/app/scholar/router.py new file mode 100644 index 0000000..1c6cbb0 --- /dev/null +++ b/android/dai/dai/backend/app/scholar/router.py @@ -0,0 +1,37 @@ +from fastapi import APIRouter, HTTPException, Query +from typing import List +from app.scholar import schemas +from app.scholar.service import ArxivService + +router = APIRouter() + +@router.get("/search", response_model=List[schemas.ScholarArticle]) +async def search_articles( + query: str, + limit: int = Query(20, le=100), + offset: int = 0 +): + """ + Search for articles on Arxiv. + """ + return ArxivService.search_articles(query, limit, offset) + +@router.get("/recent", response_model=List[schemas.ScholarArticle]) +async def get_recent_articles( + limit: int = Query(20, le=50), + category: str = "cs.AI" +): + """ + Get recent articles from Arxiv. Default category is cs.AI. + """ + return ArxivService.get_recent_articles(limit, category) + +@router.get("/{article_id}", response_model=schemas.ScholarArticle) +async def get_article_details(article_id: str): + """ + Get details of a specific article by ID. + """ + article = ArxivService.get_article_details(article_id) + if not article: + raise HTTPException(status_code=404, detail="Article not found") + return article diff --git a/android/dai/dai/backend/app/scholar/schemas.py b/android/dai/dai/backend/app/scholar/schemas.py new file mode 100644 index 0000000..2aa9963 --- /dev/null +++ b/android/dai/dai/backend/app/scholar/schemas.py @@ -0,0 +1,20 @@ +from pydantic import BaseModel +from typing import List, Optional +from datetime import datetime + +class ScholarArticle(BaseModel): + id: str + title: str + summary: str + authors: List[str] + published: datetime + updated: datetime + pdf_url: Optional[str] = None + categories: List[str] + comment: Optional[str] = None + journal_ref: Optional[str] = None + doi: Optional[str] = None + +class ScholarSearchResponse(BaseModel): + articles: List[ScholarArticle] + total_results: Optional[int] = None diff --git a/android/dai/dai/backend/app/scholar/service.py b/android/dai/dai/backend/app/scholar/service.py new file mode 100644 index 0000000..66dfdc1 --- /dev/null +++ b/android/dai/dai/backend/app/scholar/service.py @@ -0,0 +1,100 @@ +import arxiv +from typing import List, Optional +from app.scholar.schemas import ScholarArticle + +class ArxivService: + @staticmethod + def _convert_result_to_schema(result: arxiv.Result) -> ScholarArticle: + return ScholarArticle( + id=result.entry_id, + title=result.title, + summary=result.summary, + authors=[author.name for author in result.authors], + published=result.published, + updated=result.updated, + pdf_url=result.pdf_url, + categories=result.categories, + comment=result.comment, + journal_ref=result.journal_ref, + doi=result.doi + ) + + @staticmethod + def search_articles(query: str, max_results: int = 20, offset: int = 0) -> List[ScholarArticle]: + # TEMPORARY: Disable Arxiv fetch due to no internet connection + return [] + + # client = arxiv.Client() + # Set num_retries=0 to fail immediately if no internet connection + client = arxiv.Client(num_retries=0, page_size=10, delay_seconds=1) + search = arxiv.Search( + query=query, + max_results=max_results, + sort_by=arxiv.SortCriterion.Relevance + ) + + # Note: arxiv.Search doesn't support offset directly in the same way as pagination + # We might need to fetch more and slice, or use the generator carefully. + # For simplicity in this implementation, we'll fetch max_results. + # If offset is needed, we would need to iterate and skip. + + results = [] + # We can't easily skip with the client generator without iterating + # So for now we will just return the top results. + # If we really need offset, we'd have to consume the iterator. + + try: + for result in client.results(search): + results.append(ArxivService._convert_result_to_schema(result)) + except Exception as e: + print(f"Error searching articles: {e}") + return [] + + return results + + @staticmethod + def get_recent_articles(max_results: int = 20, category: str = "cs.AI") -> List[ScholarArticle]: + # TEMPORARY: Disable Arxiv fetch due to no internet connection + return [] + + # Set num_retries=0 to fail immediately if no internet connection + client = arxiv.Client(num_retries=0, page_size=10, delay_seconds=1) + search = arxiv.Search( + query=f"cat:{category}", + max_results=max_results, + sort_by=arxiv.SortCriterion.SubmittedDate, + sort_order=arxiv.SortOrder.Descending + ) + + results = [] + try: + for result in client.results(search): + results.append(ArxivService._convert_result_to_schema(result)) + except Exception as e: + print(f"Error fetching recent articles: {e}") + return [] + + return results + + @staticmethod + def get_article_details(article_id: str) -> Optional[ScholarArticle]: + # TEMPORARY: Disable Arxiv fetch due to no internet connection + return None + + # Set num_retries=0 to fail immediately if no internet connection + client = arxiv.Client(num_retries=0, delay_seconds=1) + # article_id in arxiv often looks like 'http://arxiv.org/abs/2101.12345' or just '2101.12345' + # The search by id_list expects the ID part. + + # Helper to extract ID if it's a URL + clean_id = article_id.split('/')[-1] + + search = arxiv.Search(id_list=[clean_id]) + try: + result = next(client.results(search)) + return ArxivService._convert_result_to_schema(result) + except StopIteration: + return None + except Exception as e: + print(f"Error getting article details: {e}") + return None diff --git a/android/dai/dai/backend/app/socketio_app.py b/android/dai/dai/backend/app/socketio_app.py new file mode 100644 index 0000000..a1be5d2 --- /dev/null +++ b/android/dai/dai/backend/app/socketio_app.py @@ -0,0 +1,16 @@ +import socketio +from fastapi import FastAPI + +# Create Socket.IO server +sio = socketio.AsyncServer( + async_mode='asgi', + cors_allowed_origins="*", + logger=True, + engineio_logger=False +) + +# Create FastAPI app +app = FastAPI() + +# Mount Socket.IO +app.mount("/socket.io", socketio.ASGIApp(sio)) diff --git a/android/dai/dai/backend/app/socketio_server.py b/android/dai/dai/backend/app/socketio_server.py new file mode 100644 index 0000000..7ff78a6 --- /dev/null +++ b/android/dai/dai/backend/app/socketio_server.py @@ -0,0 +1,19 @@ +from fastapi import FastAPI +import socketio +from app.chat.socketio_namespace import chat_namespace + +# Create Socket.IO server with ASGI mode +sio = socketio.AsyncServer( + async_mode='asgi', + cors_allowed_origins="*", + logger=True, + engineio_logger=False, + ping_timeout=30, + ping_interval=10 +) + +# Register namespace +sio.register_namespace(chat_namespace) + +# This will be used in uvicorn to serve both HTTP and Socket.IO +# Usage: uvicorn app.socketio_server:sio_app --host 0.0.0.0 --port 8000 --reload diff --git a/android/dai/dai/backend/app/static/planet_images/1.png b/android/dai/dai/backend/app/static/planet_images/1.png new file mode 100644 index 0000000..6f706b0 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/1.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/10.png b/android/dai/dai/backend/app/static/planet_images/10.png new file mode 100644 index 0000000..3ffb0a0 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/10.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/11.png b/android/dai/dai/backend/app/static/planet_images/11.png new file mode 100644 index 0000000..18eb6b2 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/11.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/12.png b/android/dai/dai/backend/app/static/planet_images/12.png new file mode 100644 index 0000000..7f0df43 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/12.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/13.png b/android/dai/dai/backend/app/static/planet_images/13.png new file mode 100644 index 0000000..e11ab1c Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/13.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/14.png b/android/dai/dai/backend/app/static/planet_images/14.png new file mode 100644 index 0000000..3ab00c1 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/14.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/2.png b/android/dai/dai/backend/app/static/planet_images/2.png new file mode 100644 index 0000000..e598726 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/2.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/3.png b/android/dai/dai/backend/app/static/planet_images/3.png new file mode 100644 index 0000000..53fd81c Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/3.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/4.png b/android/dai/dai/backend/app/static/planet_images/4.png new file mode 100644 index 0000000..f6d078f Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/4.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/5.png b/android/dai/dai/backend/app/static/planet_images/5.png new file mode 100644 index 0000000..1ba87a1 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/5.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/6.png b/android/dai/dai/backend/app/static/planet_images/6.png new file mode 100644 index 0000000..64b4587 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/6.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/7.png b/android/dai/dai/backend/app/static/planet_images/7.png new file mode 100644 index 0000000..36c0605 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/7.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/8.png b/android/dai/dai/backend/app/static/planet_images/8.png new file mode 100644 index 0000000..fb1906f Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/8.png differ diff --git a/android/dai/dai/backend/app/static/planet_images/9.png b/android/dai/dai/backend/app/static/planet_images/9.png new file mode 100644 index 0000000..5416563 Binary files /dev/null and b/android/dai/dai/backend/app/static/planet_images/9.png differ diff --git a/android/dai/dai/backend/app/translation/__init__.py b/android/dai/dai/backend/app/translation/__init__.py new file mode 100644 index 0000000..5bc0c2e --- /dev/null +++ b/android/dai/dai/backend/app/translation/__init__.py @@ -0,0 +1,3 @@ +from .router import router + +__all__ = ["router"] diff --git a/android/dai/dai/backend/app/translation/models.py b/android/dai/dai/backend/app/translation/models.py new file mode 100644 index 0000000..1832574 --- /dev/null +++ b/android/dai/dai/backend/app/translation/models.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel +from typing import Optional + + +class TranslationRequest(BaseModel): + """Request model for text translation""" + text: str + source: str = "en" # Source language code (ISO 639-1) + target: str = "fa" # Target language code (ISO 639-1) + + +class TranslationResponse(BaseModel): + """Response model for text translation""" + translatedText: str + detectedLanguage: Optional[str] = None diff --git a/android/dai/dai/backend/app/translation/router.py b/android/dai/dai/backend/app/translation/router.py new file mode 100644 index 0000000..95e4850 --- /dev/null +++ b/android/dai/dai/backend/app/translation/router.py @@ -0,0 +1,92 @@ +from fastapi import APIRouter, HTTPException +from .models import TranslationRequest, TranslationResponse +from app.core.config import settings + +router = APIRouter() + +# Initialize LibreTranslate client only if enabled +lt = None +if settings.ENABLE_TRANSLATION: + try: + from libretranslate import LibreTranslateAPI + lt = LibreTranslateAPI(settings.LIBRETRANSLATE_URL) + except ImportError: + print("Warning: libretranslate package not installed. Translation feature disabled.") + lt = None + + +@router.post("/translate", response_model=TranslationResponse) +async def translate_text(request: TranslationRequest): + """ + Translate text from source language to target language using LibreTranslate + + Args: + request: TranslationRequest containing text and language codes + + Returns: + TranslationResponse with translated text + + Raises: + HTTPException: If translation fails or feature is disabled + """ + if not settings.ENABLE_TRANSLATION: + raise HTTPException( + status_code=503, + detail="Translation feature is disabled. Set ENABLE_TRANSLATION=true in config to enable." + ) + + if lt is None: + raise HTTPException( + status_code=503, + detail="Translation service not available. LibreTranslate package not installed or service not running." + ) + + try: + result = lt.translate( + q=request.text, + source=request.source, + target=request.target + ) + + return TranslationResponse( + translatedText=result, + detectedLanguage=request.source + ) + except Exception as e: + raise HTTPException( + status_code=500, + detail=f"Translation failed: {str(e)}" + ) + + +@router.get("/languages") +async def get_supported_languages(): + """ + Get list of supported languages from LibreTranslate + + Returns: + Dictionary containing list of supported languages + + Raises: + HTTPException: If fetching languages fails or feature is disabled + """ + if not settings.ENABLE_TRANSLATION: + raise HTTPException( + status_code=503, + detail="Translation feature is disabled. Set ENABLE_TRANSLATION=true in config to enable." + ) + + if lt is None: + raise HTTPException( + status_code=503, + detail="Translation service not available. LibreTranslate package not installed or service not running." + ) + + try: + languages = lt.languages() + return {"languages": languages} + except Exception as e: + raise HTTPException( + status_code=500, + detail=f"Failed to fetch languages: {str(e)}" + ) diff --git a/android/dai/dai/backend/app/users/models.py b/android/dai/dai/backend/app/users/models.py new file mode 100644 index 0000000..02b6d89 --- /dev/null +++ b/android/dai/dai/backend/app/users/models.py @@ -0,0 +1,20 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime +from sqlalchemy.sql import func +from app.core.database import Base + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + email = Column(String, unique=True, index=True, nullable=False) + username = Column(String, unique=True, index=True, nullable=False) + bot_username = Column(String, unique=True, index=True, nullable=False) + hashed_password = Column(String, nullable=False) + full_name = Column(String, nullable=True) + bio = Column(String, nullable=True) + avatar_url = Column(String, nullable=True) + is_active = Column(Boolean, default=True) + is_online = Column(Boolean, default=False) + last_seen = Column(DateTime(timezone=True), nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) diff --git a/android/dai/dai/backend/app/users/router.py b/android/dai/dai/backend/app/users/router.py new file mode 100644 index 0000000..b11ace1 --- /dev/null +++ b/android/dai/dai/backend/app/users/router.py @@ -0,0 +1,163 @@ +from fastapi import APIRouter, Depends, UploadFile, File, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, update +from datetime import datetime, timezone +from app.core.database import get_db +from app.core.deps import get_current_user +from app.users.schemas import UserResponse, UserUpdate +from app.users.models import User +from app.users.service import update_user +import os +import uuid +import shutil + +router = APIRouter() + +@router.get("/me", response_model=UserResponse) +async def read_users_me(current_user: User = Depends(get_current_user)): + return current_user + +@router.put("/me", response_model=UserResponse) +async def update_user_me(user_update: UserUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)): + updated_user = await update_user(db, current_user.id, user_update) + return updated_user + +@router.post("/me/online") +async def set_online_status( + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Set current user as online""" + from sqlalchemy.orm import selectinload + await db.execute( + update(User) + .where(User.id == current_user.id) + .values( + is_online=True, + last_seen=datetime.now(timezone.utc) + ) + ) + await db.commit() + return {"status": "online"} + +@router.post("/me/offline") +async def set_offline_status( + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Set current user as offline""" + from sqlalchemy.orm import selectinload + await db.execute( + update(User) + .where(User.id == current_user.id) + .values( + is_online=False, + last_seen=datetime.now(timezone.utc) + ) + ) + await db.commit() + return {"status": "offline"} + +@router.get("/{user_id}", response_model=UserResponse) +async def get_user_by_id( + user_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get user profile by ID""" + result = await db.execute(select(User).where(User.id == user_id)) + user = result.scalar_one_or_none() + if not user: + raise HTTPException(status_code=404, detail="User not found") + return user + +@router.get("/lab/{lab_id}/online-status") +async def get_lab_online_users( + lab_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Get online status of users in a lab""" + from app.labs.models import LabMember + from sqlalchemy import and_ + + # Get all lab members with their online status + result = await db.execute( + select(User, LabMember) + .join(LabMember, User.id == LabMember.user_id) + .where(LabMember.lab_id == lab_id) + ) + + members = [] + for user, member in result.all(): + members.append({ + "user_id": user.id, + "username": user.username, + "full_name": user.full_name, + "avatar_url": user.avatar_url, + "is_online": user.is_online, + "last_seen": user.last_seen.isoformat() if user.last_seen else None, + "role": member.role + }) + + return {"members": members} + +@router.post("/me/avatar", response_model=UserResponse) +async def upload_avatar( + file: UploadFile = File(...), + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Upload user avatar""" + # Create directory if it doesn't exist + upload_dir = "app/static/avatars" + os.makedirs(upload_dir, exist_ok=True) + + # Generate unique filename + file_extension = os.path.splitext(file.filename)[1] + if file_extension.lower() not in [".jpg", ".jpeg", ".png", ".gif"]: + raise HTTPException(status_code=400, detail="Only image files are allowed") + + unique_filename = f"{uuid.uuid4()}{file_extension}" + file_path = os.path.join(upload_dir, unique_filename) + + # Save file + try: + with open(file_path, "wb") as buffer: + shutil.copyfileobj(file.file, buffer) + finally: + await file.close() + + avatar_url = f"/static/avatars/{unique_filename}" + + # Delete old avatar if exists + if current_user.avatar_url: + old_avatar_path = os.path.join("app", current_user.avatar_url.lstrip("/")) + if os.path.exists(old_avatar_path): + try: + os.remove(old_avatar_path) + except Exception: + pass + + # Update user in DB + user_update = UserUpdate(avatar_url=avatar_url) + updated_user = await update_user(db, current_user.id, user_update) + return updated_user + +@router.delete("/me/avatar", response_model=UserResponse) +async def delete_avatar( + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db) +): + """Delete user avatar""" + if current_user.avatar_url: + avatar_path = os.path.join("app", current_user.avatar_url.lstrip("/")) + if os.path.exists(avatar_path): + try: + os.remove(avatar_path) + except Exception: + pass + + user_update = UserUpdate(avatar_url=None) + updated_user = await update_user(db, current_user.id, user_update) + return updated_user diff --git a/android/dai/dai/backend/app/users/schemas.py b/android/dai/dai/backend/app/users/schemas.py new file mode 100644 index 0000000..0e84814 --- /dev/null +++ b/android/dai/dai/backend/app/users/schemas.py @@ -0,0 +1,30 @@ +from pydantic import BaseModel, EmailStr +from typing import Optional +from datetime import datetime + +class UserBase(BaseModel): + email: EmailStr + username: str + bot_username: str + full_name: Optional[str] = None + bio: Optional[str] = None + avatar_url: Optional[str] = None + +class UserCreate(UserBase): + password: str + +class UserUpdate(BaseModel): + full_name: Optional[str] = None + bio: Optional[str] = None + avatar_url: Optional[str] = None + email: Optional[EmailStr] = None + +class UserResponse(UserBase): + id: int + is_active: bool + is_online: bool = False + last_seen: Optional[datetime] = None + created_at: datetime + + class Config: + from_attributes = True diff --git a/android/dai/dai/backend/app/users/service.py b/android/dai/dai/backend/app/users/service.py new file mode 100644 index 0000000..77117ce --- /dev/null +++ b/android/dai/dai/backend/app/users/service.py @@ -0,0 +1,40 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from app.users.models import User +from app.users.schemas import UserCreate, UserUpdate +from app.core.security import get_password_hash + +async def get_user_by_username(db: AsyncSession, username: str): + result = await db.execute(select(User).filter(User.username == username)) + return result.scalars().first() + +async def get_user_by_email(db: AsyncSession, email: str): + result = await db.execute(select(User).filter(User.email == email)) + return result.scalars().first() + +async def create_user(db: AsyncSession, user: UserCreate): + hashed_password = get_password_hash(user.password) + db_user = User( + email=user.email, + username=user.username, + bot_username=user.bot_username, + hashed_password=hashed_password, + full_name=user.full_name, + bio=user.bio, + avatar_url=user.avatar_url + ) + db.add(db_user) + await db.commit() + await db.refresh(db_user) + return db_user + +async def update_user(db: AsyncSession, user_id: int, user_update: UserUpdate): + result = await db.execute(select(User).filter(User.id == user_id)) + db_user = result.scalars().first() + if db_user: + update_data = user_update.dict(exclude_unset=True) + for key, value in update_data.items(): + setattr(db_user, key, value) + await db.commit() + await db.refresh(db_user) + return db_user diff --git a/android/dai/dai/backend/assign_planet_images.py b/android/dai/dai/backend/assign_planet_images.py new file mode 100644 index 0000000..f15ca4a --- /dev/null +++ b/android/dai/dai/backend/assign_planet_images.py @@ -0,0 +1,51 @@ +""" +Script to assign random planet images to existing labs in the database. +Run this once after adding planet images to the planet_images folder. +""" +import asyncio +import sys +from pathlib import Path + +# Add the backend directory to the path +sys.path.insert(0, str(Path(__file__).parent)) + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from app.core.database import AsyncSessionLocal +from app.labs.models import Lab +from app.labs.service import get_random_planet_image + + +async def assign_planet_images(): + """Assign random planet images to all existing labs that don't have one""" + async with AsyncSessionLocal() as db: + # Get all labs without planet images + result = await db.execute( + select(Lab).where( + (Lab.planet_image == None) | (Lab.planet_image == "") + ) + ) + labs = result.scalars().all() + + if not labs: + print("No labs found without planet images.") + return + + print(f"Found {len(labs)} labs without planet images.") + + # Assign random planet images + for lab in labs: + planet_image = get_random_planet_image() + if planet_image: + lab.planet_image = planet_image + print(f"Assigned {planet_image} to lab: {lab.name}") + else: + print(f"Warning: No planet images available for lab: {lab.name}") + + await db.commit() + print(f"\nSuccessfully assigned planet images to {len(labs)} labs!") + + +if __name__ == "__main__": + print("Starting planet image assignment...") + asyncio.run(assign_planet_images()) diff --git a/android/dai/dai/backend/docker-compose.yml b/android/dai/dai/backend/docker-compose.yml new file mode 100644 index 0000000..00c2ef7 --- /dev/null +++ b/android/dai/dai/backend/docker-compose.yml @@ -0,0 +1,81 @@ +version: '3.8' + +services: + # PostgreSQL Database + postgres: + image: postgres:15-alpine + container_name: dai_postgres + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: Mey#Birth@miN2004 + POSTGRES_DB: dai_db + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - dai_network + restart: unless-stopped + + # Redis Cache + redis: + image: redis:7-alpine + container_name: dai_redis + ports: + - "6379:6379" + networks: + - dai_network + restart: unless-stopped + + # LibreTranslate Service + libretranslate: + image: libretranslate/libretranslate:latest + container_name: dai_libretranslate + ports: + - "5000:5000" + environment: + LT_HOST: "0.0.0.0" + LT_PORT: "5000" + # Disable API keys for internal use (optional) + LT_DISABLE_WEB_UI: "false" + # Limit languages to reduce memory usage (optional) + LT_LOAD_ONLY: "en,fa" + volumes: + - libretranslate_data:/home/libretranslate/.local + networks: + - dai_network + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/languages"] + interval: 30s + timeout: 10s + retries: 3 + + # FastAPI Backend + backend: + build: + context: . + dockerfile: Dockerfile + container_name: dai_backend + ports: + - "8313:8313" + environment: + DATABASE_URL: "postgresql+asyncpg://postgres:Mey#Birth@miN2004@postgres:5432/dai_db" + REDIS_URL: "redis://redis:6379/0" + LIBRETRANSLATE_URL: "http://libretranslate:5000" + depends_on: + - postgres + - redis + - libretranslate + networks: + - dai_network + restart: unless-stopped + command: uvicorn app.main:app --host 0.0.0.0 --port 8313 + +networks: + dai_network: + driver: bridge + +volumes: + postgres_data: + libretranslate_data: diff --git a/android/dai/dai/backend/requirements.txt b/android/dai/dai/backend/requirements.txt new file mode 100644 index 0000000..3c9ec7f --- /dev/null +++ b/android/dai/dai/backend/requirements.txt @@ -0,0 +1,20 @@ +fastapi +uvicorn[standard] +sqlalchemy[asyncio] +asyncpg +redis +python-jose[cryptography] +passlib[bcrypt] +python-multipart +pydantic-settings +websockets +alembic +feedparser +apscheduler +livekit-api +tavily-python +libretranslate +arxiv +pydantic[email] +python-socketio +GitPython diff --git a/android/dai/dai/backend/scripts/backup_database.py b/android/dai/dai/backend/scripts/backup_database.py new file mode 100644 index 0000000..01e1355 --- /dev/null +++ b/android/dai/dai/backend/scripts/backup_database.py @@ -0,0 +1,122 @@ +import os +import subprocess +from datetime import datetime +import sys +from urllib.parse import unquote + +# Add parent directory to sys.path to import 'app' +current_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(current_dir) +if parent_dir not in sys.path: + sys.path.append(parent_dir) + +from app.core.config import settings + +def backup_database(): + """ + Creates a full backup of the PostgreSQL database using pg_dump. + Saves the backup into the 'backups' directory with a timestamped filename. + """ + print("Initializing database backup process...") + + # 1. Prepare backup directory + backup_dir = os.path.join(parent_dir, "backups") + if not os.path.exists(backup_dir): + os.makedirs(backup_dir) + print(f"- Created backup directory: {backup_dir}") + + # 2. Create timestamped filename + timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + backup_filename = f"backup_{timestamp}.sql" + backup_path = os.path.join(backup_dir, backup_filename) + + # 3. Parse DATABASE_URL manually to extract credentials + # Format: postgresql+asyncpg://user:password@host:port/dbname + try: + db_url = settings.DATABASE_URL + + # Strip the driver part + if "://" not in db_url: + raise ValueError("Invalid DATABASE_URL format") + + url_body = db_url.split("://")[1] + + # Split by the last / to separate the database name + auth_netloc, dbname = url_body.rsplit("/", 1) + + # Split by @ to separate credentials from host + if "@" in auth_netloc: + auth, netloc = auth_netloc.rsplit("@", 1) + # Split auth into user and password + if ":" in auth: + user, password = auth.split(":", 1) + else: + user = auth + password = "" + else: + user = "postgres" + password = "" + netloc = auth_netloc + + # Split netloc into host and port + if ":" in netloc: + host, port = netloc.split(":", 1) + else: + host = netloc + port = "5432" + + # Decode URL-encoded characters (like %23 for #) + user = unquote(user) + password = unquote(password) + host = unquote(host) + dbname = unquote(dbname) + + except Exception as e: + print(f"Error parsing database configuration: {e}") + sys.exit(1) + + print(f"- Target Database: {dbname}") + print(f"- Host: {host}:{port}") + print(f"- Destination: {backup_path}") + + # 4. Construct and run pg_dump command + # We use PGPASSWORD env variable to handle authentication non-interactively + env = os.environ.copy() + env["PGPASSWORD"] = password + + command = [ + "pg_dump", + "-h", host, + "-p", str(port), + "-U", user, + "-f", backup_path, + dbname + ] + + try: + print("\nUploading to SQL file... Please wait.") + result = subprocess.run(command, env=env, check=True, capture_output=True, text=True) + + # Verify if file was created and has size + if os.path.exists(backup_path): + file_size_mb = os.path.getsize(backup_path) / (1024 * 1024) + print(f"SUCCESS: Backup completed successfully!") + print(f"File: {backup_filename}") + print(f"Size: {file_size_mb:.2f} MB") + else: + print("ERROR: pg_dump finished but backup file was not found.") + + except subprocess.CalledProcessError as e: + print(f"\nERROR during backup process:") + print(f"Exit code: {e.returncode}") + print(f"Error details: {e.stderr.strip()}") + sys.exit(1) + except Exception as e: + print(f"\nAN UNEXPECTED ERROR OCCURRED: {e}") + sys.exit(1) + +if __name__ == "__main__": + try: + backup_database() + except KeyboardInterrupt: + print("\nBackup process cancelled.") diff --git a/android/dai/dai/backend/scripts/migrate_existing_labs.py b/android/dai/dai/backend/scripts/migrate_existing_labs.py new file mode 100644 index 0000000..77c73e4 --- /dev/null +++ b/android/dai/dai/backend/scripts/migrate_existing_labs.py @@ -0,0 +1,190 @@ +""" +Migration script to create Git repositories for all existing public labs. +This script should be run after the Git integration is first deployed. +""" + +import asyncio +import os +import sys +from pathlib import Path + +# Add parent directory to path for imports +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from sqlalchemy import select +from app.core.database import async_session_maker +from app.labs.models import Lab, LabBackpackFile, LabBackpackFolder +from app.gitea.models import GitRepository +from app.gitea.service import GiteaService +from app.core.config import get_settings +import logging +import shutil +from typing import Optional + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + + +async def migrate_existing_labs(): + """Create Gitea repositories for all existing public labs that don't have one""" + settings = get_settings() + gitea_service = GiteaService(settings) + + # Ensure Git repos directory exists + os.makedirs(settings.GIT_REPOS_BASE_DIR, exist_ok=True) + logger.info(f"Git repositories base directory: {settings.GIT_REPOS_BASE_DIR}") + + async with async_session_maker() as db: + # Get all public labs + result = await db.execute( + select(Lab).where(Lab.is_private == False) + ) + labs = result.scalars().all() + + logger.info(f"Found {len(labs)} public labs to process") + + # Get labs that already have Git repositories + git_repos_result = await db.execute( + select(GitRepository) + ) + existing_git_repos = git_repos_result.scalars().all() + existing_repos_by_lab = {repo.lab_id: repo for repo in existing_git_repos} + existing_lab_ids = set(existing_repos_by_lab.keys()) + + logger.info(f"Found {len(existing_git_repos)} labs with existing Git repositories") + + # Process labs without Git repositories + migrated_count = 0 + synced_count = 0 + failed_count = 0 + + for lab in labs: + if lab.id in existing_lab_ids: + logger.info(f"Skipping lab {lab.id} ({lab.name}) - already has Git repository") + continue + + try: + logger.info(f"Creating repository for lab {lab.id}: {lab.name}") + + # Get owner username + owner_result = await db.execute( + select(Lab).where(Lab.id == lab.id) + ) + owner_lab = owner_result.scalar_one_or_none() + + if not owner_lab or not owner_lab.members: + logger.warning(f"No members found for lab {lab.id}, using default username") + owner_username = f"user_{lab.id}" + else: + # Find owner member + owner = None + for member in owner_lab.members: + if member.role.value == 'owner': + owner = member.user + break + owner_username = owner.username if owner else f"user_{lab.id}" + + # Create repository in Gitea and initialize local repo + repo_info = await gitea_service.create_repository( + lab.id, lab.name, owner_username + ) + + # Store repository mapping in database + git_repo = GitRepository( + lab_id=lab.id, + gitea_repo_id=repo_info["id"], + gitea_repo_name=repo_info["name"], + gitea_clone_url=repo_info["clone_url"] + ) + db.add(git_repo) + await db.commit() + + logger.info(f"✓ Created repository for lab {lab.id}: {repo_info['name']}") + migrated_count += 1 + await _sync_lab_backpack_files(db, gitea_service, lab.id, git_repo.gitea_clone_url) + synced_count += 1 + + except Exception as e: + logger.error(f"✗ Failed to create repository for lab {lab.id}: {e}") + failed_count += 1 + continue + + # Sync files for labs that already had repos + for lab_id, git_repo in existing_repos_by_lab.items(): + try: + await _sync_lab_backpack_files(db, gitea_service, lab_id, git_repo.gitea_clone_url) + synced_count += 1 + except Exception as e: + logger.error(f"✗ Failed to sync files for lab {lab_id}: {e}") + + logger.info(f"\nMigration complete!") + logger.info(f"Successfully migrated: {migrated_count} labs") + logger.info(f"Backpack synced: {synced_count} labs") + logger.info(f"Failed: {failed_count} labs") + logger.info(f"Skipped (already has repo): {len(existing_lab_ids)} labs") + + +def _sanitize_path_part(name: str) -> str: + clean = name.replace("\\", "/").strip() + clean = clean.replace("/", "_") + return clean + + +async def _build_folder_path(db: AsyncSession, folder_id: Optional[int]) -> str: + if folder_id is None: + return "" + + segments = [] + current_id = folder_id + while current_id is not None: + folder = await db.get(LabBackpackFolder, current_id) + if not folder: + break + segments.append(_sanitize_path_part(folder.name)) + current_id = folder.parent_id + + segments.reverse() + return "/".join([seg for seg in segments if seg]) + + +async def _sync_lab_backpack_files( + db: AsyncSession, + gitea_service: GiteaService, + lab_id: int, + clone_url: str, +) -> None: + repo_dir = gitea_service.ensure_local_repo(lab_id, clone_url) + result = await db.execute( + select(LabBackpackFile).where(LabBackpackFile.lab_id == lab_id) + ) + files = result.scalars().all() + + logger.info(f"Syncing {len(files)} files for lab {lab_id}") + for file in files: + if not os.path.exists(file.file_path): + logger.warning(f"File missing on disk: {file.file_path}") + continue + + folder_path = await _build_folder_path(db, file.folder_id) + target_dir = os.path.join(repo_dir, folder_path) if folder_path else repo_dir + os.makedirs(target_dir, exist_ok=True) + + target_path = os.path.join(target_dir, _sanitize_path_part(file.name)) + shutil.copy2(file.file_path, target_path) + + +if __name__ == "__main__": + print("Starting Git repository migration for existing labs...") + print("This will create Git repositories for all public labs that don't have one.") + print("Press Enter to continue or Ctrl+C to cancel...") + try: + input() + except KeyboardInterrupt: + print("\nMigration cancelled.") + sys.exit(0) + + asyncio.run(migrate_existing_labs()) diff --git a/android/dai/dai/backend/scripts/migrate_user_online_status.py b/android/dai/dai/backend/scripts/migrate_user_online_status.py new file mode 100644 index 0000000..ddb3838 --- /dev/null +++ b/android/dai/dai/backend/scripts/migrate_user_online_status.py @@ -0,0 +1,46 @@ +import asyncio +import sys +import os + +# Add the parent directory to sys.path to allow importing from 'app' +# This ensures that 'app' module can be found even when running the script from outside +current_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(current_dir) +if parent_dir not in sys.path: + sys.path.append(parent_dir) + +from sqlalchemy import text +from app.core.database import engine + +async def migrate_users_table(): + """ + Adds is_online and last_seen columns to the users table. + """ + print("Starting migration: Adding online status columns to 'users' table...") + + async with engine.begin() as conn: + # PostgreSQL supports ADD COLUMN IF NOT EXISTS since version 9.6 + try: + # Add is_online column + await conn.execute(text("ALTER TABLE users ADD COLUMN IF NOT EXISTS is_online BOOLEAN DEFAULT FALSE;")) + print("- 'is_online' column added (or already exists).") + + # Add last_seen column + await conn.execute(text("ALTER TABLE users ADD COLUMN IF NOT EXISTS last_seen TIMESTAMP WITH TIME ZONE;")) + print("- 'last_seen' column added (or already exists).") + + await conn.commit() + print("\nMigration completed successfully!") + + except Exception as e: + print(f"\nOops! Something went wrong during the migration: {e}") + sys.exit(1) + +if __name__ == "__main__": + try: + asyncio.run(migrate_users_table()) + except KeyboardInterrupt: + print("\nMigration cancelled by user.") + except Exception as e: + print(f"\nAn error occurred while running the migration: {e}") + sys.exit(1) diff --git a/android/dai/dai/backend/scripts/reset_project_tables.py b/android/dai/dai/backend/scripts/reset_project_tables.py new file mode 100644 index 0000000..ca486cb --- /dev/null +++ b/android/dai/dai/backend/scripts/reset_project_tables.py @@ -0,0 +1,21 @@ +import asyncio +from sqlalchemy import text +from app.core.database import engine +from app.core.database import Base + +PROJECT_TABLES = [ + "project_task_assignments", + "project_tasks", + "project_columns", + "project_templates", + "lab_projects", +] + +async def reset_project_tables(): + async with engine.begin() as conn: + for table in PROJECT_TABLES: + await conn.execute(text(f"DROP TABLE IF EXISTS {table} CASCADE")) + await conn.run_sync(Base.metadata.create_all) + +if __name__ == "__main__": + asyncio.run(reset_project_tables()) diff --git a/android/dai/dai/backend/scripts/test_git_integration.py b/android/dai/dai/backend/scripts/test_git_integration.py new file mode 100644 index 0000000..045d7a7 --- /dev/null +++ b/android/dai/dai/backend/scripts/test_git_integration.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 +import argparse +import json +import os +import sys +import time +import uuid +from typing import Any, Dict, Tuple, Optional +from urllib import request, parse, error + + +def _log(message: str) -> None: + print(message, flush=True) + + +def _build_url(base: str, path: str, params: Optional[Dict[str, Any]] = None) -> str: + url = base.rstrip("/") + "/" + path.lstrip("/") + if params: + query = parse.urlencode({k: v for k, v in params.items() if v is not None}) + if query: + url = f"{url}?{query}" + return url + + +def _request( + method: str, + url: str, + headers: Optional[Dict[str, str]] = None, + data: Optional[bytes] = None, +) -> Tuple[int, Dict[str, Any]]: + req = request.Request(url, data=data, method=method) + for key, value in (headers or {}).items(): + req.add_header(key, value) + + try: + with request.urlopen(req) as resp: + status = resp.getcode() + body = resp.read().decode("utf-8") + except error.HTTPError as e: + status = e.code + body = e.read().decode("utf-8") + except Exception as e: + raise RuntimeError(f"Request failed: {e}") from e + + if not body: + return status, {} + + try: + return status, json.loads(body) + except json.JSONDecodeError: + return status, {"raw": body} + + +def _post_form(url: str, form: Dict[str, Any]) -> Tuple[int, Dict[str, Any]]: + data = parse.urlencode(form).encode("utf-8") + headers = {"Content-Type": "application/x-www-form-urlencoded"} + return _request("POST", url, headers=headers, data=data) + + +def _post_json( + url: str, + payload: Dict[str, Any], + token: Optional[str] = None, +) -> Tuple[int, Dict[str, Any]]: + data = json.dumps(payload).encode("utf-8") + headers = {"Content-Type": "application/json"} + if token: + headers["Authorization"] = f"Bearer {token}" + return _request("POST", url, headers=headers, data=data) + + +def _get_json( + url: str, + token: Optional[str] = None, +) -> Tuple[int, Dict[str, Any]]: + headers = {} + if token: + headers["Authorization"] = f"Bearer {token}" + return _request("GET", url, headers=headers) + + +def _delete( + url: str, + token: Optional[str] = None, +) -> Tuple[int, Dict[str, Any]]: + headers = {} + if token: + headers["Authorization"] = f"Bearer {token}" + return _request("DELETE", url, headers=headers) + + +def _post_no_body( + url: str, + token: Optional[str] = None, +) -> Tuple[int, Dict[str, Any]]: + headers = {} + if token: + headers["Authorization"] = f"Bearer {token}" + return _request("POST", url, headers=headers) + + +def _encode_multipart( + file_field: str, + file_name: str, + file_bytes: bytes, + content_type: str = "application/octet-stream", +) -> Tuple[bytes, str]: + boundary = f"----Boundary{uuid.uuid4().hex}" + lines = [] + lines.append(f"--{boundary}".encode("utf-8")) + lines.append( + f'Content-Disposition: form-data; name="{file_field}"; filename="{file_name}"'.encode( + "utf-8" + ) + ) + lines.append(f"Content-Type: {content_type}".encode("utf-8")) + lines.append(b"") + lines.append(file_bytes) + lines.append(f"--{boundary}--".encode("utf-8")) + lines.append(b"") + body = b"\r\n".join(lines) + return body, f"multipart/form-data; boundary={boundary}" + + +def main() -> int: + parser = argparse.ArgumentParser(description="Test Git/Gitea integration APIs") + parser.add_argument("--base-url", default="https://dai.wikm.ir/api/v1") + parser.add_argument("--username", default="mmd") + parser.add_argument("--password", default="mmd12345") + parser.add_argument("--keep-lab", action="store_true") + args = parser.parse_args() + + base_url = args.base_url.rstrip("/") + + _log("1) Login") + status, data = _post_form( + _build_url(base_url, "/auth/login"), + {"username": args.username, "password": args.password}, + ) + if status != 200 or "access_token" not in data: + _log(f"Login failed: {status} {data}") + return 1 + token = data["access_token"] + _log(" Login OK") + + _log("2) Create public lab (auto Git repo)") + lab_name = f"git-test-{uuid.uuid4().hex[:8]}" + status, data = _post_json( + _build_url(base_url, "/labs/"), + { + "name": lab_name, + "description": "Git integration test", + "topic": "git", + "is_private": False, + "is_hidden": False, + }, + token=token, + ) + if status != 200 or "id" not in data: + _log(f"Lab create failed: {status} {data}") + return 1 + lab_id = data["id"] + _log(f" Lab created: id={lab_id}") + + _log("3) Check Git repository info") + status, data = _get_json( + _build_url(base_url, f"/git/{lab_id}/repository"), + token=token, + ) + if status != 200: + _log(f"Git repo info failed: {status} {data}") + return 1 + if data.get("status") != "success": + _log(" Repo not initialized yet, trying to create...") + status, data = _post_no_body( + _build_url(base_url, f"/git/{lab_id}/repository"), + token=token, + ) + if status != 200: + _log(f"Repo create failed: {status} {data}") + return 1 + _log(" Repo created") + else: + _log(" Repo exists") + + time.sleep(1) + + _log("4) Upload a file to Backpack") + file_name = "hello.txt" + file_bytes = b"hello from git integration test\n" + body, content_type = _encode_multipart("file", file_name, file_bytes, "text/plain") + headers = { + "Content-Type": content_type, + "Authorization": f"Bearer {token}", + } + status, data = _request( + "POST", + _build_url(base_url, f"/labs/{lab_id}/backpack/files"), + headers=headers, + data=body, + ) + if status != 200 or "id" not in data: + _log(f"Upload failed: {status} {data}") + return 1 + file_id = data["id"] + _log(f" File uploaded: id={file_id}") + + _log("5) Git status (should be dirty)") + status, data = _get_json( + _build_url(base_url, f"/git/{lab_id}/status"), + token=token, + ) + if status != 200: + _log(f"Status failed: {status} {data}") + return 1 + _log(f" dirty={data.get('dirty')} files={len(data.get('files', []))}") + + _log("6) Create commit") + status, data = _post_json( + _build_url(base_url, f"/git/{lab_id}/commit"), + {"message": "test commit", "files": [file_name]}, + token=token, + ) + if status != 200 or "commit_hash" not in data: + _log(f"Commit failed: {status} {data}") + return 1 + commit_hash = data["commit_hash"] + _log(f" Commit created: {commit_hash}") + + _log("7) Commit history") + status, data = _get_json( + _build_url(base_url, f"/git/{lab_id}/commits"), + token=token, + ) + if status != 200: + _log(f"History failed: {status} {data}") + return 1 + _log(f" commits={len(data.get('commits', []))}") + + _log("8) Commit diff") + status, data = _get_json( + _build_url(base_url, f"/git/{lab_id}/diff/{commit_hash}"), + token=token, + ) + if status != 200: + _log(f"Diff failed: {status} {data}") + return 1 + diff_preview = (data.get("diff") or "")[:200].replace("\n", "\\n") + _log(f" diff preview: {diff_preview}") + + _log("9) Push & Pull") + status, data = _post_no_body( + _build_url(base_url, f"/git/{lab_id}/push"), + token=token, + ) + if status != 200: + _log(f"Push failed: {status} {data}") + return 1 + status, data = _post_no_body( + _build_url(base_url, f"/git/{lab_id}/pull"), + token=token, + ) + if status != 200: + _log(f"Pull failed: {status} {data}") + return 1 + _log(" Push & Pull OK") + + if not args.keep_lab: + _log("10) Cleanup: delete lab") + status, data = _delete( + _build_url(base_url, f"/labs/{lab_id}"), + token=token, + ) + if status != 200: + _log(f"Delete lab failed: {status} {data}") + return 1 + _log(" Lab deleted") + + _log("All tests passed.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/android/dai/dai/config.json.example b/android/dai/dai/config.json.example new file mode 100644 index 0000000..45e2053 --- /dev/null +++ b/android/dai/dai/config.json.example @@ -0,0 +1,3 @@ +{ + "HUGGINGFACE_TOKEN": "" +} diff --git a/android/dai/dai/dai-landing-page/.gitignore b/android/dai/dai/dai-landing-page/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/android/dai/dai/dai-landing-page/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/android/dai/dai/dai-landing-page/README.md b/android/dai/dai/dai-landing-page/README.md new file mode 100644 index 0000000..d22b803 --- /dev/null +++ b/android/dai/dai/dai-landing-page/README.md @@ -0,0 +1,118 @@ +# DAI Landing Page - Distributed AI Labs Edition + +A modern, interactive landing page built with Next.js, showcasing the DAI (Distributed AI) mobile application features with smooth scroll animations and stunning visual effects. + +## 🌟 Features + +- **Smooth Scroll Animations**: Powered by Framer Motion +- **Starfield Background**: Animated 3D starfield with moving stars +- **Interactive Sections**: + - Hero section with animated logo + - Feature introduction + - Labs showcase with colorful cards + - AI chat demonstration + - Scholar paper search + - PDF viewer with translation + - News feed + - Settings & model management +- **App Screenshot Placeholders**: Ready-to-replace placeholders for actual app screenshots +- **Responsive Design**: Mobile-first approach, works on all screen sizes +- **Modern UI**: Glassmorphism effects, gradient backgrounds, and smooth transitions + +## 🚀 Getting Started + +### Prerequisites + +- Node.js 18+ installed +- npm or yarn package manager + +### Installation + +1. **Install Dependencies** + ```bash + npm install + ``` + +2. **Run Development Server** + ```bash + npm run dev + ``` + + Open [http://localhost:3000](http://localhost:3000) in your browser + +3. **Build for Production** + ```bash + npm run build + npm start + ``` + +## 📁 Project Structure + +``` +dai-landing-page/ +├── src/ +│ ├── app/ +│ │ ├── layout.tsx # Root layout with fonts +│ │ ├── page.tsx # Main page +│ │ └── globals.css # Global styles +│ ├── components/ +│ │ ├── HeroSection.tsx # Landing hero +│ │ ├── LabsSection.tsx # Labs showcase +│ │ ├── ChatSection.tsx # AI chat demo +│ │ ├── Starfield.tsx # Animated stars +│ │ ├── AppScreenshot.tsx # Screenshot placeholder +│ │ └── ui/ # Reusable UI components +│ └── lib/ +│ └── utils.ts # Utility functions +``` + +## 🎨 Customization + +### Adding App Screenshots + +Replace the `AppScreenshot` placeholders with real screenshots: + +```tsx +// Replace in components + +// with actual images from your app +``` + +### Customizing Colors + +Edit `src/app/globals.css`: + +```css +:root { + --primary: #2196F3; /* Change primary color */ + --card: #1E1E1E; +} +``` + +## 🔧 Tech Stack + +- **Framework**: Next.js 14 (App Router) +- **Language**: TypeScript +- **Styling**: Tailwind CSS 4 +- **Animations**: Framer Motion +- **Icons**: Lucide React +- **UI Components**: Radix UI + +## 📦 Deployment + +### Vercel (Recommended) + +1. Push code to GitHub +2. Import in [Vercel](https://vercel.com) +3. Auto-deploys! + +## 🎯 Next Steps + +1. Replace placeholder screenshots with real app images +2. Add your own content and descriptions +3. Customize colors to match your brand +4. Deploy to production + +--- + +Made with ❤️ for DAI - Distributed AI Labs Edition diff --git a/android/dai/dai/dai-landing-page/eslint.config.mjs b/android/dai/dai/dai-landing-page/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/android/dai/dai/dai-landing-page/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/android/dai/dai/dai-landing-page/next.config.js b/android/dai/dai/dai-landing-page/next.config.js new file mode 100644 index 0000000..b108e1a --- /dev/null +++ b/android/dai/dai/dai-landing-page/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/android/dai/dai/dai-landing-page/package-lock.json b/android/dai/dai/dai-landing-page/package-lock.json new file mode 100644 index 0000000..d2ea363 --- /dev/null +++ b/android/dai/dai/dai-landing-page/package-lock.json @@ -0,0 +1,5675 @@ +{ + "name": "dai-landing-page", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dai-landing-page", + "version": "0.1.0", + "dependencies": { + "@radix-ui/react-slot": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "framer-motion": "^12.23.25", + "lucide-react": "^0.555.0", + "next": "^14.2.33", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^18.3.27", + "@types/react-dom": "^18.3.7", + "eslint": "^8.57.1", + "eslint-config-next": "^14.2.33", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz", + "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.33.tgz", + "integrity": "sha512-DQTJFSvlB+9JilwqMKJ3VPByBNGxAGFTfJ7BuFj25cVcbBy7jm88KfUN+dngM4D3+UxZ8ER2ft+WH9JccMvxyg==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.15.0.tgz", + "integrity": "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==", + "dev": true + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "dev": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-x64": "4.1.17", + "@tailwindcss/oxide-freebsd-x64": "4.1.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.6.0", + "@emnapi/runtime": "^1.6.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", + "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.17", + "@tailwindcss/oxide": "4.1.17", + "postcss": "^8.4.41", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "devOptional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.0.tgz", + "integrity": "sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.48.0", + "@typescript-eslint/type-utils": "8.48.0", + "@typescript-eslint/utils": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.48.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.0.tgz", + "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.48.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.0.tgz", + "integrity": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.48.0", + "@typescript-eslint/types": "^8.48.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.0.tgz", + "integrity": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.0.tgz", + "integrity": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.0.tgz", + "integrity": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0", + "@typescript-eslint/utils": "8.48.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz", + "integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.0.tgz", + "integrity": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.48.0", + "@typescript-eslint/tsconfig-utils": "8.48.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/visitor-keys": "8.48.0", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.0.tgz", + "integrity": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.48.0", + "@typescript-eslint/types": "8.48.0", + "@typescript-eslint/typescript-estree": "8.48.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.0.tgz", + "integrity": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.48.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.33.tgz", + "integrity": "sha512-e2W+waB+I5KuoALAtKZl3WVDU4Q1MS6gF/gdcwHh0WOAkHf4TZI6dPjd25wKhlZFAsFrVKy24Z7/IwOhn8dHBw==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.2.33", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "peer": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/framer-motion": { + "version": "12.23.25", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", + "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==", + "dependencies": { + "motion-dom": "^12.23.23", + "motion-utils": "^12.23.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/lucide-react": { + "version": "0.555.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.555.0.tgz", + "integrity": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/motion-dom": { + "version": "12.23.23", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", + "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz", + "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==", + "dependencies": { + "@next/env": "14.2.33", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/android/dai/dai/dai-landing-page/package.json b/android/dai/dai/dai-landing-page/package.json new file mode 100644 index 0000000..13e26e5 --- /dev/null +++ b/android/dai/dai/dai-landing-page/package.json @@ -0,0 +1,32 @@ +{ + "name": "dai-landing-page", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "@radix-ui/react-slot": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "framer-motion": "^12.23.25", + "lucide-react": "^0.555.0", + "next": "^14.2.33", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^18.3.27", + "@types/react-dom": "^18.3.7", + "eslint": "^8.57.1", + "eslint-config-next": "^14.2.33", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/android/dai/dai/dai-landing-page/postcss.config.mjs b/android/dai/dai/dai-landing-page/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/android/dai/dai/dai-landing-page/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/android/dai/dai/dai-landing-page/public/earth.png b/android/dai/dai/dai-landing-page/public/earth.png new file mode 100644 index 0000000..d09b4af Binary files /dev/null and b/android/dai/dai/dai-landing-page/public/earth.png differ diff --git a/android/dai/dai/dai-landing-page/public/file.svg b/android/dai/dai/dai-landing-page/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/android/dai/dai/dai-landing-page/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/dai/dai/dai-landing-page/public/globe.svg b/android/dai/dai/dai-landing-page/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/android/dai/dai/dai-landing-page/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/dai/dai/dai-landing-page/public/logo_white.png b/android/dai/dai/dai-landing-page/public/logo_white.png new file mode 100644 index 0000000..1bd72b3 Binary files /dev/null and b/android/dai/dai/dai-landing-page/public/logo_white.png differ diff --git a/android/dai/dai/dai-landing-page/public/next.svg b/android/dai/dai/dai-landing-page/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/android/dai/dai/dai-landing-page/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/dai/dai/dai-landing-page/public/vercel.svg b/android/dai/dai/dai-landing-page/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/android/dai/dai/dai-landing-page/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/dai/dai/dai-landing-page/public/window.svg b/android/dai/dai/dai-landing-page/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/android/dai/dai/dai-landing-page/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/dai/dai/dai-landing-page/src/app/favicon.ico b/android/dai/dai/dai-landing-page/src/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/android/dai/dai/dai-landing-page/src/app/favicon.ico differ diff --git a/android/dai/dai/dai-landing-page/src/app/globals.css b/android/dai/dai/dai-landing-page/src/app/globals.css new file mode 100644 index 0000000..c27202a --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/app/globals.css @@ -0,0 +1,44 @@ +@import "tailwindcss"; + +:root { + --background: #000000; + --foreground: #ededed; + --primary: #2196F3; + --card: #1E1E1E; + --surface: #2D2D2D; + --starfield: #0F0F0F; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-primary: var(--primary); + --color-card: var(--card); + --color-surface: var(--surface); + --color-starfield: var(--starfield); + + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + + --animate-spin-slow: spin 20s linear infinite; + --animate-float: float 6s ease-in-out infinite; +} + +@keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-20px); } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: var(--font-sans), Arial, Helvetica, sans-serif; + overflow-x: hidden; +} + +.glass-panel { + background: rgba(30, 30, 30, 0.6); + backdrop-filter: blur(12px); + border: 1px solid rgba(255, 255, 255, 0.1); +} + diff --git a/android/dai/dai/dai-landing-page/src/app/layout.tsx b/android/dai/dai/dai-landing-page/src/app/layout.tsx new file mode 100644 index 0000000..060f93e --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Inter, Space_Grotesk } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ + variable: "--font-sans", + subsets: ["latin"], +}); + +const spaceGrotesk = Space_Grotesk({ + variable: "--font-heading", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "DAI - Distributed AI Labs Edition", + description: "A revolutionary distributed AI platform enabling collaborative research, on-device machine learning, and intelligent document processing with real-time translation.", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/android/dai/dai/dai-landing-page/src/app/page.tsx b/android/dai/dai/dai-landing-page/src/app/page.tsx new file mode 100644 index 0000000..c2550bb --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/app/page.tsx @@ -0,0 +1,25 @@ +import { HeroSection } from "@/components/HeroSection" +import { IntroSection } from "@/components/IntroSection" +import { LabsSection } from "@/components/LabsSection" +import { ChatSection } from "@/components/ChatSection" +import { ScholarSection } from "@/components/ScholarSection" +import { PdfViewerSection } from "@/components/PdfViewerSection" +import { NewsSection } from "@/components/NewsSection" +import { SettingsSection } from "@/components/SettingsSection" +import { Footer } from "@/components/Footer" + +export default function Home() { + return ( +
+ + + + + + + + +
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/AppScreenshot.tsx b/android/dai/dai/dai-landing-page/src/components/AppScreenshot.tsx new file mode 100644 index 0000000..e1f1791 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/AppScreenshot.tsx @@ -0,0 +1,44 @@ +"use client" + +import { Camera } from "lucide-react" +import { motion } from "framer-motion" + +interface AppScreenshotProps { + title: string + className?: string +} + +export function AppScreenshot({ title, className = "" }: AppScreenshotProps) { + return ( + +
+ {/* Phone Notch */} +
+ + {/* Placeholder Content */} +
+
+ +
+
+

App Screenshot

+

{title}

+
+
+ + {/* Decorative Elements */} +
+
+
+ +
+
+
+ + ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/ChatSection.tsx b/android/dai/dai/dai-landing-page/src/components/ChatSection.tsx new file mode 100644 index 0000000..5f0cb55 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/ChatSection.tsx @@ -0,0 +1,48 @@ +"use client" + +import { motion } from "framer-motion" +import { Bot, User } from "lucide-react" + +const messages = [ + { role: "user", content: "Explain quantum entanglement simply." }, + { role: "ai", content: "Quantum entanglement is a phenomenon where two particles become connected..." }, + { role: "user", content: "How does it relate to computing?" }, + { role: "ai", content: "In quantum computing, entangled qubits can perform complex calculations..." }, +] + +export function ChatSection() { + return ( +
+
+
+

Intelligent AI Conversations

+

Powered by Gemma, Qwen, LLaMA, and DeepSeek

+
+ +
+ {messages.map((msg, index) => ( + +
+ {msg.role === "ai" ? : } +
+
+

{msg.content}

+
+
+ ))} +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/Footer.tsx b/android/dai/dai/dai-landing-page/src/components/Footer.tsx new file mode 100644 index 0000000..e395f34 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/Footer.tsx @@ -0,0 +1,38 @@ +"use client" + +import { Github, Twitter, Linkedin } from "lucide-react" +import { Button } from "@/components/ui/button" + +export function Footer() { + return ( +
+
+
+

+ DAI Labs +

+

+ © 2025 Distributed AI Labs. All rights reserved. +

+
+ +
+ + + +
+ +
+ + +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/HeroSection.tsx b/android/dai/dai/dai-landing-page/src/components/HeroSection.tsx new file mode 100644 index 0000000..2adb8b1 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/HeroSection.tsx @@ -0,0 +1,85 @@ +"use client" + +import { motion, useScroll, useTransform } from "framer-motion" +import { Starfield } from "@/components/Starfield" +import Image from "next/image" + +export function HeroSection() { + const { scrollY } = useScroll() + + // Logo animations - similar to Flutter app + // Logo starts at 1.5x scale and goes to 0.75x (smaller) + const logoScale = useTransform(scrollY, [0, 400], [1.5, 0.75]) + // Logo moves from center (0) to top (-30vh) + const logoY = useTransform(scrollY, [0, 400], [0, -30]) + + // Title animations - appears as logo moves up + const titleOpacity = useTransform(scrollY, [200, 350], [0, 1]) + const titleScale = useTransform(scrollY, [200, 400], [0.8, 1]) + const titleY = useTransform(scrollY, [200, 400], [20, 0]) + + // Earth background - rotates slowly + const earthOpacity = useTransform(scrollY, [0, 200], [0.3, 0.1]) + const earthRotate = useTransform(scrollY, [0, 2000], [0, 360]) + + return ( +
+ {/* Background gradient - similar to Flutter app */} +
+ +
+ + {/* Rotating Earth Background */} + + + {/* Main content container */} +
+
+ {/* Logo - animated with scroll */} + +
+ DAI Logo +
+
+ + {/* App Name - appears below logo as it moves up */} + +

+ DAI +

+

+ Labs Edition +

+
+
+ + {/* Scroll indicator */} + +
+
+
+ +
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/IntroSection.tsx b/android/dai/dai/dai-landing-page/src/components/IntroSection.tsx new file mode 100644 index 0000000..b888755 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/IntroSection.tsx @@ -0,0 +1,67 @@ +"use client" + +import { motion } from "framer-motion" +import { Cpu, MessageSquare, Users } from "lucide-react" +import { Card, CardContent } from "@/components/ui/card" + +const features = [ + { + icon: Cpu, + title: "On-Device AI", + description: "Run powerful models locally without cloud dependency", + }, + { + icon: MessageSquare, + title: "RAG-Powered Chat", + description: "Chat with your documents using advanced retrieval", + }, + { + icon: Users, + title: "Collaborative Labs", + description: "Join researchers worldwide in shared workspaces", + }, +] + +export function IntroSection() { + return ( +
+
+ +

+ Distributed AI Platform +

+

+ A revolutionary platform for collaborative AI research, powered by on-device machine learning and distributed computing +

+
+ +
+ {features.map((feature, index) => ( + + + +
+ +
+

{feature.title}

+

{feature.description}

+
+
+
+ ))} +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/LabsSection.tsx b/android/dai/dai/dai-landing-page/src/components/LabsSection.tsx new file mode 100644 index 0000000..64caa9e --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/LabsSection.tsx @@ -0,0 +1,85 @@ +"use client" + +import { motion } from "framer-motion" +import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card" +import { Users, Lock, Globe } from "lucide-react" +import { AppScreenshot } from "./AppScreenshot" + +const labs = [ + { title: "Quantum Research", members: 128, color: "bg-[#FFA8A8]", tag: "Physics", description: "Exploring quantum mechanics and its applications in modern computing" }, + { title: "Neural Networks", members: 256, color: "bg-[#FFD588]", tag: "AI", description: "Deep learning architectures and neural network optimization" }, + { title: "Bioinformatics", members: 64, color: "bg-[#B5FF8C]", tag: "Biology", description: "Computational biology and genomic data analysis" }, + { title: "Space Exploration", members: 512, color: "bg-[#99E6FF]", tag: "Space", description: "Satellite data processing and astronomical research" }, + { title: "Robotics Lab", members: 1024, color: "bg-[#E0C3FC]", tag: "Robotics", description: "Autonomous systems and robot control algorithms" }, + { title: "Green Energy", members: 32, color: "bg-[#FFB3D0]", tag: "Energy", description: "Renewable energy optimization and smart grid systems" }, +] + +export function LabsSection() { + return ( +
+
+
+ +

+ Create & Join Labs +

+

+ Collaborate with researchers worldwide in public or private labs. + Share documents, chat in real-time, and work together on cutting-edge projects. +

+
+
+ + Public Labs +
+
+ + Private Labs +
+
+
+ + +
+ +
+ {labs.map((lab, index) => ( + + +
+ +
+ + {lab.tag} + +
+ + {lab.members} +
+
+ {lab.title} +
+ +

+ {lab.description} +

+
+ + + ))} +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/NewsSection.tsx b/android/dai/dai/dai-landing-page/src/components/NewsSection.tsx new file mode 100644 index 0000000..f6e1b4f --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/NewsSection.tsx @@ -0,0 +1,43 @@ +"use client" + +import { motion } from "framer-motion" +import { Card, CardContent } from "@/components/ui/card" + +const news = [ + { title: "New AI Model Released", category: "Technology", date: "2h ago" }, + { title: "Quantum Breakthrough", category: "Science", date: "5h ago" }, + { title: "Distributed Computing Update", category: "Engineering", date: "1d ago" }, +] + +export function NewsSection() { + return ( +
+
+

Stay Updated

+ +
+ {news.map((item, index) => ( + + +
+ +
+ {item.category} + {item.date} +
+

{item.title}

+
+ + + ))} +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/PdfViewerSection.tsx b/android/dai/dai/dai-landing-page/src/components/PdfViewerSection.tsx new file mode 100644 index 0000000..302c5b3 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/PdfViewerSection.tsx @@ -0,0 +1,61 @@ +"use client" + +import { motion } from "framer-motion" +import { FileText, Languages, Mic } from "lucide-react" + +export function PdfViewerSection() { + return ( +
+
+
+

Smart PDF Reading Experience

+
    +
  • + + Real-time Translation (English ↔ Farsi) +
  • +
  • + + Text Selection & Highlighting +
  • +
  • + + Voice Chat Integration +
  • +
+
+ + +
+
+
+
+
+
+
+ + +
+ Translation + English → Farsi +
+

+ هوش مصنوعی توزیع شده یک رویکرد نوین در یادگیری ماشین است... +

+
+
+ +
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/ScholarSection.tsx b/android/dai/dai/dai-landing-page/src/components/ScholarSection.tsx new file mode 100644 index 0000000..433739e --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/ScholarSection.tsx @@ -0,0 +1,60 @@ +"use client" + +import { motion } from "framer-motion" +import { Search, BookOpen } from "lucide-react" +import { Card, CardContent } from "@/components/ui/card" + +const papers = [ + { title: "Attention Is All You Need", authors: "Vaswani et al.", category: "AI" }, + { title: "BERT: Pre-training of Deep Bidirectional Transformers", authors: "Devlin et al.", category: "NLP" }, + { title: "Deep Residual Learning for Image Recognition", authors: "He et al.", category: "CV" }, +] + +export function ScholarSection() { + return ( +
+
+
+

Academic Paper Discovery

+

Search and explore papers from Arxiv

+
+ +
+
+ +
+ +
+ +
+ {papers.map((paper, index) => ( + + + +
+ +
+
+

{paper.title}

+

{paper.authors} • {paper.category}

+
+
+
+
+ ))} +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/SettingsSection.tsx b/android/dai/dai/dai-landing-page/src/components/SettingsSection.tsx new file mode 100644 index 0000000..9bd2865 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/SettingsSection.tsx @@ -0,0 +1,65 @@ +"use client" + +import { motion } from "framer-motion" +import { Download, Check } from "lucide-react" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" + +const models = [ + { name: "Gemma 2B", size: "1.4 GB", status: "Downloaded" }, + { name: "Llama 3 8B", size: "4.2 GB", status: "Downloading" }, + { name: "Mistral 7B", size: "3.8 GB", status: "Available" }, +] + +export function SettingsSection() { + return ( +
+
+

Customize Your Experience

+ +
+ {models.map((model, index) => ( + + + +
+

{model.name}

+

{model.size}

+
+ + {model.status === "Downloaded" ? ( + + ) : model.status === "Downloading" ? ( +
+
+ +
+ 60% +
+ ) : ( + + )} +
+
+
+ ))} +
+
+
+ ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/Starfield.tsx b/android/dai/dai/dai-landing-page/src/components/Starfield.tsx new file mode 100644 index 0000000..506d912 --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/Starfield.tsx @@ -0,0 +1,86 @@ +"use client" + +import React, { useEffect, useRef } from "react" + +interface Star { + x: number + y: number + z: number + size: number +} + +export function Starfield() { + const canvasRef = useRef(null) + + useEffect(() => { + const canvas = canvasRef.current + if (!canvas) return + + const ctx = canvas.getContext("2d") + if (!ctx) return + + let animationFrameId: number + let stars: Star[] = [] + const numStars = 200 + const speed = 0.5 + + const resizeCanvas = () => { + canvas.width = window.innerWidth + canvas.height = window.innerHeight + initStars() + } + + const initStars = () => { + stars = [] + for (let i = 0; i < numStars; i++) { + stars.push({ + x: Math.random() * canvas.width, + y: Math.random() * canvas.height, + z: Math.random() * canvas.width, + size: Math.random() * 2, + }) + } + } + + const drawStars = () => { + ctx.fillStyle = "#0F0F0F" + ctx.fillRect(0, 0, canvas.width, canvas.height) + + ctx.fillStyle = "#FFFFFF" + stars.forEach((star) => { + star.z -= speed + if (star.z <= 0) { + star.z = canvas.width + star.x = Math.random() * canvas.width + star.y = Math.random() * canvas.height + } + + const x = (star.x - canvas.width / 2) * (canvas.width / star.z) + canvas.width / 2 + const y = (star.y - canvas.height / 2) * (canvas.width / star.z) + canvas.height / 2 + const size = (1 - star.z / canvas.width) * star.size * 2 + + ctx.beginPath() + ctx.arc(x, y, size, 0, Math.PI * 2) + ctx.fill() + }) + + animationFrameId = requestAnimationFrame(drawStars) + } + + window.addEventListener("resize", resizeCanvas) + resizeCanvas() + drawStars() + + return () => { + window.removeEventListener("resize", resizeCanvas) + cancelAnimationFrame(animationFrameId) + } + }, []) + + return ( + + ) +} diff --git a/android/dai/dai/dai-landing-page/src/components/ui/button.tsx b/android/dai/dai/dai-landing-page/src/components/ui/button.tsx new file mode 100644 index 0000000..e0a21fe --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + gradient: "bg-gradient-to-r from-blue-600 to-purple-600 text-white hover:opacity-90 shadow-lg shadow-blue-500/20", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/android/dai/dai/dai-landing-page/src/components/ui/card.tsx b/android/dai/dai/dai-landing-page/src/components/ui/card.tsx new file mode 100644 index 0000000..7c92b8b --- /dev/null +++ b/android/dai/dai/dai-landing-page/src/components/ui/card.tsx @@ -0,0 +1,78 @@ +import * as React from "react" +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/android/dai/dai/dai-landing-page/tsconfig.json b/android/dai/dai/dai-landing-page/tsconfig.json new file mode 100644 index 0000000..34939b2 --- /dev/null +++ b/android/dai/dai/dai-landing-page/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/android/dai/dai/devtools_options.yaml b/android/dai/dai/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/android/dai/dai/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/android/dai/dai/docker-compose.yml b/android/dai/dai/docker-compose.yml new file mode 100644 index 0000000..24ff5fc --- /dev/null +++ b/android/dai/dai/docker-compose.yml @@ -0,0 +1,43 @@ +version: '3.8' + +services: + backend: + build: ./backend + ports: + - "8000:8000" + environment: + - DATABASE_URL=postgresql+asyncpg://postgres:postgres@postgres:5432/dai_db + - REDIS_URL=redis://redis:6379/0 + - SECRET_KEY=supersecretkeychangeinproduction + depends_on: + - postgres + - redis + volumes: + - ./backend:/app + + postgres: + image: postgres:15 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=dai_db + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + + redis: + image: redis:7 + ports: + - "6379:6379" + + livekit: + image: livekit/livekit-server:latest + command: --dev + ports: + - "7880:7880" + - "7881:7881" + - "7882:7882/udp" + +volumes: + postgres_data: diff --git a/android/dai/dai/flutter_launcher_icons.yaml b/android/dai/dai/flutter_launcher_icons.yaml new file mode 100644 index 0000000..41e6f58 --- /dev/null +++ b/android/dai/dai/flutter_launcher_icons.yaml @@ -0,0 +1,11 @@ +flutter_launcher_icons: + android: true + ios: true + + image_path: "assets/icon.png" + + adaptive_icon_background: "#ffffff" + adaptive_icon_foreground: "assets/icon.png" + + image_path_ios: "assets/icon.png" + remove_alpha_ios: true \ No newline at end of file diff --git a/android/dai/dai/flutter_native_splash.yaml b/android/dai/dai/flutter_native_splash.yaml new file mode 100644 index 0000000..58d86eb --- /dev/null +++ b/android/dai/dai/flutter_native_splash.yaml @@ -0,0 +1,29 @@ +flutter_native_splash: + # رنگ پس‌زمینه در حالت لایت + color: "#ffffff" + + # لوگو (اندروید < 12 و iOS) + image: assets/logo_dark.png + + # نسخه دارک مود (اندروید < 12 و iOS) + color_dark: "#000000" + image_dark: assets/logo_white.png + + android: true + ios: true + + ios_content_mode: center + + android_12: + # پس‌زمینه اندروید 12 + color: "#ffffff" + color_dark: "#000000" + + # مرکز-لوگو (سایز 1152×1152) + image: assets/logo_dark.png + image_dark: assets/logo_white.png + + # اگر پشت لوگو دایره یا shape می‌خوای، این رو فعال کن + # وگرنه خالی بگذار که از خود PNG استفاده کند + # icon_background_color: "#ffffff" + # icon_background_color_dark: "#000000" diff --git a/coordinator_frontend/ios/.gitignore b/android/dai/dai/ios/.gitignore similarity index 100% rename from coordinator_frontend/ios/.gitignore rename to android/dai/dai/ios/.gitignore diff --git a/android/dai/dai/ios/Flutter/AppFrameworkInfo.plist b/android/dai/dai/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/android/dai/dai/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/coordinator_frontend/ios/Flutter/Debug.xcconfig b/android/dai/dai/ios/Flutter/Debug.xcconfig similarity index 100% rename from coordinator_frontend/ios/Flutter/Debug.xcconfig rename to android/dai/dai/ios/Flutter/Debug.xcconfig diff --git a/coordinator_frontend/ios/Flutter/Release.xcconfig b/android/dai/dai/ios/Flutter/Release.xcconfig similarity index 100% rename from coordinator_frontend/ios/Flutter/Release.xcconfig rename to android/dai/dai/ios/Flutter/Release.xcconfig diff --git a/android/dai/dai/ios/Runner.xcodeproj/project.pbxproj b/android/dai/dai/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c079287 --- /dev/null +++ b/android/dai/dai/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,616 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/android/dai/dai/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to android/dai/dai/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android/dai/dai/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android/dai/dai/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/android/dai/dai/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to android/dai/dai/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/coordinator_frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/android/dai/dai/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from coordinator_frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to android/dai/dai/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/coordinator_frontend/ios/Runner.xcworkspace/contents.xcworkspacedata b/android/dai/dai/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from coordinator_frontend/ios/Runner.xcworkspace/contents.xcworkspacedata rename to android/dai/dai/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android/dai/dai/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android/dai/dai/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/android/dai/dai/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to android/dai/dai/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/android/dai/dai/ios/Runner/AppDelegate.swift b/android/dai/dai/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/android/dai/dai/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d0d98aa --- /dev/null +++ b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +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":"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/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..e56cb26 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..7566590 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..646042d Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..6b42175 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..283ff7a Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..d3f46fe Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..2d3fd39 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..646042d Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..68f4a10 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..0affb0a Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..259ef0e Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..cf482b2 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..9b9a522 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..1863192 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..0affb0a Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..4772298 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..04df48e Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..2a9d678 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..fda480d Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..b22bd76 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..2e9c457 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json new file mode 100644 index 0000000..8bb185b --- /dev/null +++ b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "background.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "darkbackground.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png new file mode 100644 index 0000000..8e21404 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png new file mode 100644 index 0000000..e815fd6 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..f3387d4 --- /dev/null +++ b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "filename" : "LaunchImage.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LaunchImageDark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LaunchImage@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LaunchImageDark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LaunchImage@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LaunchImageDark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9cf188c Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..0b99c81 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..19d8a27 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png new file mode 100644 index 0000000..8134d8f Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png new file mode 100644 index 0000000..a99e783 Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png differ diff --git a/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png new file mode 100644 index 0000000..05650fb Binary files /dev/null and b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png differ diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to android/dai/dai/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/android/dai/dai/ios/Runner/Base.lproj/LaunchScreen.storyboard b/android/dai/dai/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..5a37630 --- /dev/null +++ b/android/dai/dai/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coordinator_frontend/ios/Runner/Base.lproj/Main.storyboard b/android/dai/dai/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from coordinator_frontend/ios/Runner/Base.lproj/Main.storyboard rename to android/dai/dai/ios/Runner/Base.lproj/Main.storyboard diff --git a/android/dai/dai/ios/Runner/Info.plist b/android/dai/dai/ios/Runner/Info.plist new file mode 100644 index 0000000..3dfd14a --- /dev/null +++ b/android/dai/dai/ios/Runner/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + DAI + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + DAI + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + UIStatusBarHidden + + + diff --git a/coordinator_frontend/ios/Runner/Runner-Bridging-Header.h b/android/dai/dai/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from coordinator_frontend/ios/Runner/Runner-Bridging-Header.h rename to android/dai/dai/ios/Runner/Runner-Bridging-Header.h diff --git a/coordinator_frontend/ios/RunnerTests/RunnerTests.swift b/android/dai/dai/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from coordinator_frontend/ios/RunnerTests/RunnerTests.swift rename to android/dai/dai/ios/RunnerTests/RunnerTests.swift diff --git a/android/dai/dai/key.jks b/android/dai/dai/key.jks new file mode 100644 index 0000000..e69de29 diff --git a/coordinator_frontend/linux/.gitignore b/android/dai/dai/linux/.gitignore similarity index 100% rename from coordinator_frontend/linux/.gitignore rename to android/dai/dai/linux/.gitignore diff --git a/android/dai/dai/linux/CMakeLists.txt b/android/dai/dai/linux/CMakeLists.txt new file mode 100644 index 0000000..421942c --- /dev/null +++ b/android/dai/dai/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "chatbot") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.chatbot") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/coordinator_frontend/linux/flutter/CMakeLists.txt b/android/dai/dai/linux/flutter/CMakeLists.txt similarity index 100% rename from coordinator_frontend/linux/flutter/CMakeLists.txt rename to android/dai/dai/linux/flutter/CMakeLists.txt diff --git a/android/dai/dai/linux/flutter/generated_plugin_registrant.cc b/android/dai/dai/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..27acb12 --- /dev/null +++ b/android/dai/dai/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,43 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); + flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); + g_autoptr(FlPluginRegistrar) livekit_client_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "LiveKitPlugin"); + live_kit_plugin_register_with_registrar(livekit_client_registrar); + g_autoptr(FlPluginRegistrar) objectbox_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ObjectboxFlutterLibsPlugin"); + objectbox_flutter_libs_plugin_register_with_registrar(objectbox_flutter_libs_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/coordinator_frontend/linux/flutter/generated_plugin_registrant.h b/android/dai/dai/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from coordinator_frontend/linux/flutter/generated_plugin_registrant.h rename to android/dai/dai/linux/flutter/generated_plugin_registrant.h diff --git a/android/dai/dai/linux/flutter/generated_plugins.cmake b/android/dai/dai/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..34e0847 --- /dev/null +++ b/android/dai/dai/linux/flutter/generated_plugins.cmake @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux + file_selector_linux + flutter_secure_storage_linux + flutter_webrtc + livekit_client + objectbox_flutter_libs + record_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + pdfium_flutter +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/coordinator_frontend/linux/runner/CMakeLists.txt b/android/dai/dai/linux/runner/CMakeLists.txt similarity index 100% rename from coordinator_frontend/linux/runner/CMakeLists.txt rename to android/dai/dai/linux/runner/CMakeLists.txt diff --git a/coordinator_frontend/linux/runner/main.cc b/android/dai/dai/linux/runner/main.cc similarity index 100% rename from coordinator_frontend/linux/runner/main.cc rename to android/dai/dai/linux/runner/main.cc diff --git a/android/dai/dai/linux/runner/my_application.cc b/android/dai/dai/linux/runner/my_application.cc new file mode 100644 index 0000000..cded1a5 --- /dev/null +++ b/android/dai/dai/linux/runner/my_application.cc @@ -0,0 +1,130 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "chatbot"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "chatbot"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/android/dai/dai/linux/runner/my_application.h b/android/dai/dai/linux/runner/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/android/dai/dai/linux/runner/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/coordinator_frontend/macos/.gitignore b/android/dai/dai/macos/.gitignore similarity index 100% rename from coordinator_frontend/macos/.gitignore rename to android/dai/dai/macos/.gitignore diff --git a/coordinator_frontend/macos/Flutter/Flutter-Debug.xcconfig b/android/dai/dai/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from coordinator_frontend/macos/Flutter/Flutter-Debug.xcconfig rename to android/dai/dai/macos/Flutter/Flutter-Debug.xcconfig diff --git a/coordinator_frontend/macos/Flutter/Flutter-Release.xcconfig b/android/dai/dai/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from coordinator_frontend/macos/Flutter/Flutter-Release.xcconfig rename to android/dai/dai/macos/Flutter/Flutter-Release.xcconfig diff --git a/android/dai/dai/macos/Flutter/GeneratedPluginRegistrant.swift b/android/dai/dai/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..7d5ff44 --- /dev/null +++ b/android/dai/dai/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,38 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import audioplayers_darwin +import connectivity_plus +import device_info_plus +import file_picker +import file_selector_macos +import flutter_secure_storage_macos +import flutter_webrtc +import livekit_client +import objectbox_flutter_libs +import quill_native_bridge_macos +import record_macos +import shared_preferences_foundation +import url_launcher_macos +import video_player_avfoundation + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) + LiveKitPlugin.register(with: registry.registrar(forPlugin: "LiveKitPlugin")) + ObjectboxFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "ObjectboxFlutterLibsPlugin")) + QuillNativeBridgePlugin.register(with: registry.registrar(forPlugin: "QuillNativeBridgePlugin")) + RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) +} diff --git a/android/dai/dai/macos/Runner.xcodeproj/project.pbxproj b/android/dai/dai/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2c344fb --- /dev/null +++ b/android/dai/dai/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* chatbot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "chatbot.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* chatbot.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* chatbot.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatbot.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/chatbot"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatbot.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/chatbot"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatbot.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/chatbot"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/coordinator_frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android/dai/dai/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from coordinator_frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android/dai/dai/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/android/dai/dai/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/android/dai/dai/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..38c1751 --- /dev/null +++ b/android/dai/dai/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coordinator_frontend/macos/Runner.xcworkspace/contents.xcworkspacedata b/android/dai/dai/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from coordinator_frontend/macos/Runner.xcworkspace/contents.xcworkspacedata rename to android/dai/dai/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/coordinator_frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android/dai/dai/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from coordinator_frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android/dai/dai/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/coordinator_frontend/macos/Runner/AppDelegate.swift b/android/dai/dai/macos/Runner/AppDelegate.swift similarity index 100% rename from coordinator_frontend/macos/Runner/AppDelegate.swift rename to android/dai/dai/macos/Runner/AppDelegate.swift diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to android/dai/dai/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/coordinator_frontend/macos/Runner/Base.lproj/MainMenu.xib b/android/dai/dai/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from coordinator_frontend/macos/Runner/Base.lproj/MainMenu.xib rename to android/dai/dai/macos/Runner/Base.lproj/MainMenu.xib diff --git a/android/dai/dai/macos/Runner/Configs/AppInfo.xcconfig b/android/dai/dai/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..e9d5504 --- /dev/null +++ b/android/dai/dai/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = chatbot + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbot + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/coordinator_frontend/macos/Runner/Configs/Debug.xcconfig b/android/dai/dai/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from coordinator_frontend/macos/Runner/Configs/Debug.xcconfig rename to android/dai/dai/macos/Runner/Configs/Debug.xcconfig diff --git a/coordinator_frontend/macos/Runner/Configs/Release.xcconfig b/android/dai/dai/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from coordinator_frontend/macos/Runner/Configs/Release.xcconfig rename to android/dai/dai/macos/Runner/Configs/Release.xcconfig diff --git a/coordinator_frontend/macos/Runner/Configs/Warnings.xcconfig b/android/dai/dai/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from coordinator_frontend/macos/Runner/Configs/Warnings.xcconfig rename to android/dai/dai/macos/Runner/Configs/Warnings.xcconfig diff --git a/coordinator_frontend/macos/Runner/DebugProfile.entitlements b/android/dai/dai/macos/Runner/DebugProfile.entitlements similarity index 100% rename from coordinator_frontend/macos/Runner/DebugProfile.entitlements rename to android/dai/dai/macos/Runner/DebugProfile.entitlements diff --git a/coordinator_frontend/macos/Runner/Info.plist b/android/dai/dai/macos/Runner/Info.plist similarity index 100% rename from coordinator_frontend/macos/Runner/Info.plist rename to android/dai/dai/macos/Runner/Info.plist diff --git a/coordinator_frontend/macos/Runner/MainFlutterWindow.swift b/android/dai/dai/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from coordinator_frontend/macos/Runner/MainFlutterWindow.swift rename to android/dai/dai/macos/Runner/MainFlutterWindow.swift diff --git a/coordinator_frontend/macos/Runner/Release.entitlements b/android/dai/dai/macos/Runner/Release.entitlements similarity index 100% rename from coordinator_frontend/macos/Runner/Release.entitlements rename to android/dai/dai/macos/Runner/Release.entitlements diff --git a/coordinator_frontend/macos/RunnerTests/RunnerTests.swift b/android/dai/dai/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from coordinator_frontend/macos/RunnerTests/RunnerTests.swift rename to android/dai/dai/macos/RunnerTests/RunnerTests.swift diff --git a/android/dai/dai/pubspec.lock b/android/dai/dai/pubspec.lock new file mode 100644 index 0000000..0cc3731 --- /dev/null +++ b/android/dai/dai/pubspec.lock @@ -0,0 +1,1823 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d + url: "https://pub.dev" + source: hosted + version: "91.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: f51c8499b35f9b26820cfe914828a6a98a94efd5cc78b37bb7d03debae3a1d08 + url: "https://pub.dev" + source: hosted + version: "8.4.1" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: a72dd459d1a48f61a6fb9c0134dba26597c9236af40639ff0eb70eb4e0baab70 + url: "https://pub.dev" + source: hosted + version: "6.6.0" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605" + url: "https://pub.dev" + source: hosted + version: "5.2.1" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: c994b3bb3a921e4904ac40e013fbc94488e824fd7c1de6326f549943b0b44a91 + url: "https://pub.dev" + source: hosted + version: "6.4.0" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001 + url: "https://pub.dev" + source: hosted + version: "4.2.1" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656" + url: "https://pub.dev" + source: hosted + version: "7.1.1" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: faa8fa6587f996a6f604433b53af44c57a1407d4fe8dff5766cf63d6875e8de9 + url: "https://pub.dev" + source: hosted + version: "5.2.0" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: bafff2b38b6f6d331887558ba6e0a01c9c208d9dbb3ad0005234db065122a734 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + background_downloader: + dependency: "direct main" + description: + name: background_downloader + sha256: "4cb23d9ad4f5060944f38164e7b90d4bf99b57b2472a3bd4676e59b2db4afd06" + url: "https://pub.dev" + source: hosted + version: "9.5.4" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: ce76b1d48875e3233fde17717c23d1f60a91cc631597e49a400c89b475395b1d + url: "https://pub.dev" + source: hosted + version: "3.1.0" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: d1d57f7807debd7349b4726a19fd32ec8bc177c71ad0febf91a20f84cd2d4b46 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: b24597fceb695969d47025c958f3837f9f0122e237c6a22cb082a5ac66c3ca30 + url: "https://pub.dev" + source: hosted + version: "2.7.1" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "066dda7f73d8eb48ba630a55acb50c4a84a2e6b453b1cb4567f581729e794f7b" + url: "https://pub.dev" + source: hosted + version: "9.3.1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "0730c18c770d05636a8f945c32a4d7d81cb6e0f0148c8db4ad12e7748f7e49af" + url: "https://pub.dev" + source: hosted + version: "8.12.5" + characters: + dependency: "direct main" + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" + source: hosted + version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec + url: "https://pub.dev" + source: hosted + version: "6.1.5" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + dart_quill_delta: + dependency: transitive + description: + name: dart_quill_delta + sha256: bddb0b2948bd5b5a328f1651764486d162c59a8ccffd4c63e8b2c5e44be1dac4 + url: "https://pub.dev" + source: hosted + version: "10.8.3" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b + url: "https://pub.dev" + source: hosted + version: "3.1.3" + dart_webrtc: + dependency: transitive + description: + name: dart_webrtc + sha256: f6d615bddea5e458ce180a914f3055c234ffb52fb7397a51b3491e76d6d7edb2 + url: "https://pub.dev" + source: hosted + version: "1.8.1" + dbus: + dependency: transitive + description: + name: dbus + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + url: "https://pub.dev" + source: hosted + version: "0.7.12" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://pub.dev" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev" + source: hosted + version: "0.4.1" + dio: + dependency: "direct main" + description: + name: dio + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + url: "https://pub.dev" + source: hosted + version: "5.9.2" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" + url: "https://pub.dev" + source: hosted + version: "10.3.10" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.dev" + source: hosted + version: "0.9.5" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.dev" + source: hosted + version: "0.9.3+5" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flat_buffers: + dependency: transitive + description: + name: flat_buffers + sha256: "380bdcba5664a718bfd4ea20a45d39e13684f5318fcd8883066a55e21f37f4c3" + url: "https://pub.dev" + source: hosted + version: "23.5.26" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_background: + dependency: "direct main" + description: + name: flutter_background + sha256: ee47be26beddc59875158a93eeaaad0c0b5f3b21afbdad3de73a2903be824f0e + url: "https://pub.dev" + source: hosted + version: "1.3.1" + flutter_colorpicker: + dependency: transitive + description: + name: flutter_colorpicker + sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter_gemma: + dependency: "direct main" + description: + name: flutter_gemma + sha256: cb16272874da09efe9389fa27206a4a476dff1b542a4362ab5b3b24bad22f2d5 + url: "https://pub.dev" + source: hosted + version: "0.11.16" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_temp_fork: + dependency: transitive + description: + name: flutter_keyboard_visibility_temp_fork + sha256: e3d02900640fbc1129245540db16944a0898b8be81694f4bf04b6c985bed9048 + url: "https://pub.dev" + source: hosted + version: "0.1.5" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_markdown: + dependency: "direct main" + description: + name: flutter_markdown + sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" + url: "https://pub.dev" + source: hosted + version: "0.7.7+1" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" + url: "https://pub.dev" + source: hosted + version: "2.4.7" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0" + url: "https://pub.dev" + source: hosted + version: "2.0.34" + flutter_quill: + dependency: "direct main" + description: + name: flutter_quill + sha256: b96bb8525afdeaaea52f5d02f525e05cc34acd176467ab6d6f35d434cf14fde2 + url: "https://pub.dev" + source: hosted + version: "11.5.0" + flutter_quill_delta_from_html: + dependency: transitive + description: + name: flutter_quill_delta_from_html + sha256: "0eb801ea8dd498cadc057507af5da794d4c9599ce58b2569cb3d4bb53ba8bed2" + url: "https://pub.dev" + source: hosted + version: "1.5.3" + flutter_riverpod: + dependency: "direct main" + description: + name: flutter_riverpod + sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" + url: "https://pub.dev" + source: hosted + version: "2.6.1" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "1ded017b39c8e15c8948ea855070a5ff8ff8b3d5e83f3446e02d6bb12add7ad9" + url: "https://pub.dev" + source: hosted + version: "2.2.4" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_webrtc: + dependency: "direct main" + description: + name: flutter_webrtc + sha256: c7b0a67ca2c878575fc5c146d801cd874f58f5f1ef5fa6e8eb0c93d413beb948 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 + url: "https://pub.dev" + source: hosted + version: "7.7.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hooks: + dependency: transitive + description: + name: hooks + sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + url: "https://pub.dev" + source: hosted + version: "1.0.2" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "66810af8e99b2657ee98e5c6f02064f69bb63f7a70e343937f70946c5f8c6622" + url: "https://pub.dev" + source: hosted + version: "0.8.13+16" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + url: "https://pub.dev" + source: hosted + version: "0.8.13+6" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" + url: "https://pub.dev" + source: hosted + version: "0.2.2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae + url: "https://pub.dev" + source: hosted + version: "0.2.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 + url: "https://pub.dev" + source: hosted + version: "4.11.0" + large_file_handler: + dependency: transitive + description: + name: large_file_handler + sha256: c2ecaf552e8039119bbe3a094d15aecbafe833899f30b2dcfbb513eddf76b36f + url: "https://pub.dev" + source: hosted + version: "0.3.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + livekit_client: + dependency: "direct main" + description: + name: livekit_client + sha256: "011affc0fca22b2f9b0e8827219dad9948f84f2bf057980693de13039de904c7" + url: "https://pub.dev" + source: hosted + version: "2.5.0+hotfix.3" + llama_cpp_dart: + dependency: "direct main" + description: + name: llama_cpp_dart + sha256: "26671b778b7617f0ca46239c11f7e11f29b39d4026ab99938950df986ebf9df7" + url: "https://pub.dev" + source: hosted + version: "0.1.2+1" + logger: + dependency: transitive + description: + name: logger + sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + markdown: + dependency: "direct main" + description: + name: markdown + sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 + url: "https://pub.dev" + source: hosted + version: "7.3.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + url: "https://pub.dev" + source: hosted + version: "0.12.19" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mime_type: + dependency: transitive + description: + name: mime_type + sha256: d652b613e84dac1af28030a9fba82c0999be05b98163f9e18a0849c6e63838bb + url: "https://pub.dev" + source: hosted + version: "1.0.1" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" + url: "https://pub.dev" + source: hosted + version: "0.17.6" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + objectbox: + dependency: "direct main" + description: + name: objectbox + sha256: "3cc186749178a3556e1020c9082d0897d0f9ecbdefcc27320e65c5bc650f0e57" + url: "https://pub.dev" + source: hosted + version: "4.3.1" + objectbox_flutter_libs: + dependency: "direct main" + description: + name: objectbox_flutter_libs + sha256: cd754766e04229a4f51250f121813d9a3c1a74fc21cd68e48b3c6085cbcd6c85 + url: "https://pub.dev" + source: hosted + version: "4.3.1" + objectbox_generator: + dependency: "direct dev" + description: + name: objectbox_generator + sha256: "71a3f6948e631be5c7160d512ad2a8cb7471cdbcf1731ec6baf2a794b82386d7" + url: "https://pub.dev" + source: hosted + version: "4.3.1" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" + open_filex: + dependency: "direct main" + description: + name: open_filex + sha256: "9976da61b6a72302cf3b1efbce259200cd40232643a467aac7370addf94d6900" + url: "https://pub.dev" + source: hosted + version: "4.7.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "149441ca6e4f38193b2e004c0ca6376a3d11f51fa5a77552d8bd4d2b0c0912ba" + url: "https://pub.dev" + source: hosted + version: "2.2.23" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + pdfium_dart: + dependency: transitive + description: + name: pdfium_dart + sha256: f1683b9070ddc5c9189c6ee008c285791da66328ce1b882c7162d3393f3a4a74 + url: "https://pub.dev" + source: hosted + version: "0.1.3" + pdfium_flutter: + dependency: transitive + description: + name: pdfium_flutter + sha256: "0c8b7d5d11d20a1486eade599648e907067568955bd14a1b06de076a968b60a1" + url: "https://pub.dev" + source: hosted + version: "0.1.9" + pdfrx: + dependency: "direct main" + description: + name: pdfrx + sha256: e32e0c786528eec2b3c56b43f59ef1debce3a27c7accd862b95413f949afcfa9 + url: "https://pub.dev" + source: hosted + version: "2.2.24" + pdfrx_engine: + dependency: transitive + description: + name: pdfrx_engine + sha256: a8914433d1f6188b903c53d36b9d7dc908bfa89131591a9db22f1a22470d3a48 + url: "https://pub.dev" + source: hosted + version: "0.3.9" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: de9c9eb2c33f8e933a42932fe1dc504800ca45ebc3d673e6ed7f39754ee4053e + url: "https://pub.dev" + source: hosted + version: "4.2.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + quill_native_bridge: + dependency: transitive + description: + name: quill_native_bridge + sha256: "76a16512e398e84216f3f659f7cb18a89ec1e141ea908e954652b4ce6cf15b18" + url: "https://pub.dev" + source: hosted + version: "11.1.0" + quill_native_bridge_android: + dependency: transitive + description: + name: quill_native_bridge_android + sha256: b75c7e6ede362a7007f545118e756b1f19053994144ec9eda932ce5e54a57569 + url: "https://pub.dev" + source: hosted + version: "0.0.1+2" + quill_native_bridge_ios: + dependency: transitive + description: + name: quill_native_bridge_ios + sha256: d23de3cd7724d482fe2b514617f8eedc8f296e120fb297368917ac3b59d8099f + url: "https://pub.dev" + source: hosted + version: "0.0.1" + quill_native_bridge_macos: + dependency: transitive + description: + name: quill_native_bridge_macos + sha256: "1c0631bd1e2eee765a8b06017c5286a4e829778f4585736e048eb67c97af8a77" + url: "https://pub.dev" + source: hosted + version: "0.0.1" + quill_native_bridge_platform_interface: + dependency: transitive + description: + name: quill_native_bridge_platform_interface + sha256: "8264a2bdb8a294c31377a27b46c0f8717fa9f968cf113f7dc52d332ed9c84526" + url: "https://pub.dev" + source: hosted + version: "0.0.2+1" + quill_native_bridge_web: + dependency: transitive + description: + name: quill_native_bridge_web + sha256: "7c723f6824b0250d7f33e8b6c23f2f8eb0103fe48ee7ebf47ab6786b64d5c05d" + url: "https://pub.dev" + source: hosted + version: "0.0.2" + quill_native_bridge_windows: + dependency: transitive + description: + name: quill_native_bridge_windows + sha256: "3f96ced19e3206ddf4f6f7dde3eb16bdd05e10294964009ea3a806d995aa7caa" + url: "https://pub.dev" + source: hosted + version: "0.0.2" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + record: + dependency: "direct main" + description: + name: record + sha256: d5b6b334f3ab02460db6544e08583c942dbf23e3504bf1e14fd4cbe3d9409277 + url: "https://pub.dev" + source: hosted + version: "6.2.0" + record_android: + dependency: transitive + description: + name: record_android + sha256: "94783f08403aed33ffb68797bf0715b0812eb852f3c7985644c945faea462ba1" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + record_ios: + dependency: transitive + description: + name: record_ios + sha256: "8df7c136131bd05efc19256af29b2ba6ccc000ccc2c80d4b6b6d7a8d21a3b5a9" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: c31a35cc158cd666fc6395f7f56fc054f31685571684be6b97670a27649ce5c7 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + record_macos: + dependency: transitive + description: + name: record_macos + sha256: "084902e63fc9c0c224c29203d6c75f0bdf9b6a40536c9d916393c8f4c4256488" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "8a81dbc4e14e1272a285bbfef6c9136d070a47d9b0d1f40aa6193516253ee2f6" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "7e9846981c1f2d111d86f0ae3309071f5bba8b624d1c977316706f08fc31d16d" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + record_windows: + dependency: transitive + description: + name: record_windows + sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + riverpod: + dependency: transitive + description: + name: riverpod + sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" + url: "https://pub.dev" + source: hosted + version: "2.6.1" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + sdp_transform: + dependency: transitive + description: + name: sdp_transform + sha256: "73e412a5279a5c2de74001535208e20fff88f225c9a4571af0f7146202755e45" + url: "https://pub.dev" + source: hosted + version: "0.3.2" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf + url: "https://pub.dev" + source: hosted + version: "2.5.5" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 + url: "https://pub.dev" + source: hosted + version: "2.4.23" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + socket_io_client: + dependency: "direct main" + description: + name: socket_io_client + sha256: ede469f3e4c55e8528b4e023bdedbc20832e8811ab9b61679d1ba3ed5f01f23b + url: "https://pub.dev" + source: hosted + version: "2.0.3+1" + socket_io_common: + dependency: transitive + description: + name: socket_io_common + sha256: "2ab92f8ff3ebbd4b353bf4a98bee45cc157e3255464b2f90f66e09c4472047eb" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "7b19d6ba131c6eb98bfcbf8d56c1a7002eba438af2e7ae6f8398b2b0f4f381e3" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + state_notifier: + dependency: transitive + description: + name: state_notifier + sha256: b8677376aa54f2d7c58280d5a007f9e8774f1968d1fb1c096adcb4792fba29bb + url: "https://pub.dev" + source: hosted + version: "1.0.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + typed_isolate: + dependency: transitive + description: + name: typed_isolate + sha256: e245b87368104f9da13a75268e0bce16a2a8d4c9a4194a5eb50bb569be680c65 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "3bb000251e55d4a209aa0e2e563309dc9bb2befea2295fd0cec1f51760aac572" + url: "https://pub.dev" + source: hosted + version: "6.3.29" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + url: "https://pub.dev" + source: hosted + version: "2.4.2" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" + source: hosted + version: "4.5.3" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "81da85e9ca8885ade47f9685b953cb098970d11be4821ac765580a6607ea4373" + url: "https://pub.dev" + source: hosted + version: "1.1.21" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0" + url: "https://pub.dev" + source: hosted + version: "2.9.5" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: af0e5b8a7a4876fb37e7cc8cb2a011e82bb3ecfa45844ef672e32cb14a1f259e + url: "https://pub.dev" + source: hosted + version: "2.9.4" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec" + url: "https://pub.dev" + source: hosted + version: "6.6.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket_channel: + dependency: "direct main" + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + webrtc_interface: + dependency: transitive + description: + name: webrtc_interface + sha256: c6f100eac5057d9a817a60473126f9828c796d42884d498af4f339c97b21014f + url: "https://pub.dev" + source: hosted + version: "1.5.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/android/dai/dai/pubspec.yaml b/android/dai/dai/pubspec.yaml new file mode 100644 index 0000000..3949fd6 --- /dev/null +++ b/android/dai/dai/pubspec.yaml @@ -0,0 +1,94 @@ +name: dai +description: "Distributed AI Chat" +publish_to: 'none' + +version: 1.0.1+0 + +environment: + sdk: ^3.5.0 + flutter: ">=3.24.0" + +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + + # LlamaCpp for Desktop AI + llama_cpp_dart: ^0.1.2+1 + + # Flutter Gemma for Edge AI + flutter_gemma: ^0.11.12 + background_downloader: ^9.3.0 + + # State Management & DI + flutter_riverpod: ^2.5.1 + get_it: ^7.7.0 + + # Core dependencies + http: ^1.5.0 + shared_preferences: ^2.5.3 + path_provider: ^2.1.5 + + # Networking & Storage + dio: ^5.4.0 + flutter_secure_storage: ^9.0.0 + web_socket_channel: ^2.4.0 + socket_io_client: ^2.0.3+1 + connectivity_plus: ^6.1.4 + + # File operations + file_picker: ^10.3.3 + + # PDF processing + pdfrx: ^2.2.3 + + # UI enhancements + flutter_markdown: ^0.7.7+1 + markdown: ^7.3.0 + flutter_svg: ^2.2.2 + flutter_quill: ^11.5.0 + + # Utils + url_launcher: ^6.3.2 + open_filex: ^4.7.0 + video_player: ^2.9.2 + + # LiveKit + livekit_client: ^2.2.1 + permission_handler: ^11.3.1 + flutter_background: ^1.1.0 + flutter_webrtc: ^1.2.1 + + # RAG & Vector Database + objectbox: ^4.0.3 + objectbox_flutter_libs: any + + # Text processing for chunking + characters: ^1.3.0 + + flutter_native_splash: ^2.4.7 + flutter_launcher_icons: ^0.14.4 + intl: ^0.20.2 + image_picker: ^1.2.1 + record: ^6.2.0 + audioplayers: ^6.6.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + objectbox_generator: any + build_runner: ^2.4.0 + + +flutter: + uses-material-design: true + + # Add assets if you have local models or images + assets: + - assets/ + +flutter_gemma: + # Configuration for Flutter Gemma plugin + # This will be automatically configured by the plugin diff --git a/android/dai/dai/run_backend.sh b/android/dai/dai/run_backend.sh new file mode 100755 index 0000000..8711a12 --- /dev/null +++ b/android/dai/dai/run_backend.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +echo "Starting backend with Socket.IO support..." +cd backend +uvicorn app.main:asgi_app --host 0.0.0.0 --port 8000 --reload diff --git a/coordinator_frontend/web/favicon.png b/android/dai/dai/web/favicon.png similarity index 100% rename from coordinator_frontend/web/favicon.png rename to android/dai/dai/web/favicon.png diff --git a/coordinator_frontend/web/icons/Icon-192.png b/android/dai/dai/web/icons/Icon-192.png similarity index 100% rename from coordinator_frontend/web/icons/Icon-192.png rename to android/dai/dai/web/icons/Icon-192.png diff --git a/coordinator_frontend/web/icons/Icon-512.png b/android/dai/dai/web/icons/Icon-512.png similarity index 100% rename from coordinator_frontend/web/icons/Icon-512.png rename to android/dai/dai/web/icons/Icon-512.png diff --git a/coordinator_frontend/web/icons/Icon-maskable-192.png b/android/dai/dai/web/icons/Icon-maskable-192.png similarity index 100% rename from coordinator_frontend/web/icons/Icon-maskable-192.png rename to android/dai/dai/web/icons/Icon-maskable-192.png diff --git a/coordinator_frontend/web/icons/Icon-maskable-512.png b/android/dai/dai/web/icons/Icon-maskable-512.png similarity index 100% rename from coordinator_frontend/web/icons/Icon-maskable-512.png rename to android/dai/dai/web/icons/Icon-maskable-512.png diff --git a/android/dai/dai/web/index.html b/android/dai/dai/web/index.html new file mode 100644 index 0000000..9295950 --- /dev/null +++ b/android/dai/dai/web/index.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + chatbot + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/dai/dai/web/manifest.json b/android/dai/dai/web/manifest.json new file mode 100644 index 0000000..d6a6893 --- /dev/null +++ b/android/dai/dai/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "chatbot", + "short_name": "chatbot", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/android/dai/dai/web/splash/img/dark-1x.png b/android/dai/dai/web/splash/img/dark-1x.png new file mode 100644 index 0000000..8134d8f Binary files /dev/null and b/android/dai/dai/web/splash/img/dark-1x.png differ diff --git a/android/dai/dai/web/splash/img/dark-2x.png b/android/dai/dai/web/splash/img/dark-2x.png new file mode 100644 index 0000000..a99e783 Binary files /dev/null and b/android/dai/dai/web/splash/img/dark-2x.png differ diff --git a/android/dai/dai/web/splash/img/dark-3x.png b/android/dai/dai/web/splash/img/dark-3x.png new file mode 100644 index 0000000..05650fb Binary files /dev/null and b/android/dai/dai/web/splash/img/dark-3x.png differ diff --git a/android/dai/dai/web/splash/img/dark-4x.png b/android/dai/dai/web/splash/img/dark-4x.png new file mode 100644 index 0000000..816651a Binary files /dev/null and b/android/dai/dai/web/splash/img/dark-4x.png differ diff --git a/android/dai/dai/web/splash/img/light-1x.png b/android/dai/dai/web/splash/img/light-1x.png new file mode 100644 index 0000000..9cf188c Binary files /dev/null and b/android/dai/dai/web/splash/img/light-1x.png differ diff --git a/android/dai/dai/web/splash/img/light-2x.png b/android/dai/dai/web/splash/img/light-2x.png new file mode 100644 index 0000000..0b99c81 Binary files /dev/null and b/android/dai/dai/web/splash/img/light-2x.png differ diff --git a/android/dai/dai/web/splash/img/light-3x.png b/android/dai/dai/web/splash/img/light-3x.png new file mode 100644 index 0000000..19d8a27 Binary files /dev/null and b/android/dai/dai/web/splash/img/light-3x.png differ diff --git a/android/dai/dai/web/splash/img/light-4x.png b/android/dai/dai/web/splash/img/light-4x.png new file mode 100644 index 0000000..fbccc67 Binary files /dev/null and b/android/dai/dai/web/splash/img/light-4x.png differ diff --git a/coordinator_frontend/windows/.gitignore b/android/dai/dai/windows/.gitignore similarity index 100% rename from coordinator_frontend/windows/.gitignore rename to android/dai/dai/windows/.gitignore diff --git a/android/dai/dai/windows/CMakeLists.txt b/android/dai/dai/windows/CMakeLists.txt new file mode 100644 index 0000000..4b69bb7 --- /dev/null +++ b/android/dai/dai/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(chatbot LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "chatbot") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/coordinator_frontend/windows/flutter/CMakeLists.txt b/android/dai/dai/windows/flutter/CMakeLists.txt similarity index 100% rename from coordinator_frontend/windows/flutter/CMakeLists.txt rename to android/dai/dai/windows/flutter/CMakeLists.txt diff --git a/android/dai/dai/windows/flutter/generated_plugin_registrant.cc b/android/dai/dai/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..05969af --- /dev/null +++ b/android/dai/dai/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,41 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + FlutterWebRTCPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); + LiveKitPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LiveKitPlugin")); + ObjectboxFlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ObjectboxFlutterLibsPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/coordinator_frontend/windows/flutter/generated_plugin_registrant.h b/android/dai/dai/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from coordinator_frontend/windows/flutter/generated_plugin_registrant.h rename to android/dai/dai/windows/flutter/generated_plugin_registrant.h diff --git a/android/dai/dai/windows/flutter/generated_plugins.cmake b/android/dai/dai/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..07a76a1 --- /dev/null +++ b/android/dai/dai/windows/flutter/generated_plugins.cmake @@ -0,0 +1,34 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows + connectivity_plus + file_selector_windows + flutter_secure_storage_windows + flutter_webrtc + livekit_client + objectbox_flutter_libs + permission_handler_windows + record_windows + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + pdfium_flutter +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/coordinator_frontend/windows/runner/CMakeLists.txt b/android/dai/dai/windows/runner/CMakeLists.txt similarity index 100% rename from coordinator_frontend/windows/runner/CMakeLists.txt rename to android/dai/dai/windows/runner/CMakeLists.txt diff --git a/android/dai/dai/windows/runner/Runner.rc b/android/dai/dai/windows/runner/Runner.rc new file mode 100644 index 0000000..70c53a6 --- /dev/null +++ b/android/dai/dai/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "chatbot" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "chatbot" "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "chatbot.exe" "\0" + VALUE "ProductName", "chatbot" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/coordinator_frontend/windows/runner/flutter_window.cpp b/android/dai/dai/windows/runner/flutter_window.cpp similarity index 100% rename from coordinator_frontend/windows/runner/flutter_window.cpp rename to android/dai/dai/windows/runner/flutter_window.cpp diff --git a/coordinator_frontend/windows/runner/flutter_window.h b/android/dai/dai/windows/runner/flutter_window.h similarity index 100% rename from coordinator_frontend/windows/runner/flutter_window.h rename to android/dai/dai/windows/runner/flutter_window.h diff --git a/android/dai/dai/windows/runner/main.cpp b/android/dai/dai/windows/runner/main.cpp new file mode 100644 index 0000000..c0b33c0 --- /dev/null +++ b/android/dai/dai/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"chatbot", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/coordinator_frontend/windows/runner/resource.h b/android/dai/dai/windows/runner/resource.h similarity index 100% rename from coordinator_frontend/windows/runner/resource.h rename to android/dai/dai/windows/runner/resource.h diff --git a/coordinator_frontend/windows/runner/resources/app_icon.ico b/android/dai/dai/windows/runner/resources/app_icon.ico similarity index 100% rename from coordinator_frontend/windows/runner/resources/app_icon.ico rename to android/dai/dai/windows/runner/resources/app_icon.ico diff --git a/coordinator_frontend/windows/runner/utils.cpp b/android/dai/dai/windows/runner/utils.cpp similarity index 100% rename from coordinator_frontend/windows/runner/utils.cpp rename to android/dai/dai/windows/runner/utils.cpp diff --git a/coordinator_frontend/windows/runner/utils.h b/android/dai/dai/windows/runner/utils.h similarity index 100% rename from coordinator_frontend/windows/runner/utils.h rename to android/dai/dai/windows/runner/utils.h diff --git a/coordinator_frontend/windows/runner/win32_window.cpp b/android/dai/dai/windows/runner/win32_window.cpp similarity index 100% rename from coordinator_frontend/windows/runner/win32_window.cpp rename to android/dai/dai/windows/runner/win32_window.cpp diff --git a/coordinator_frontend/windows/runner/win32_window.h b/android/dai/dai/windows/runner/win32_window.h similarity index 100% rename from coordinator_frontend/windows/runner/win32_window.h rename to android/dai/dai/windows/runner/win32_window.h diff --git a/coordinator_frontend/lib/main.dart b/coordinator_frontend/lib/main.dart deleted file mode 100644 index 94a707e..0000000 --- a/coordinator_frontend/lib/main.dart +++ /dev/null @@ -1,156 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'screens/devices_screen.dart'; -import 'screens/documents_screen.dart'; -import 'screens/upload_screen.dart'; -import 'screens/chat_screen.dart'; -import 'providers/app_state.dart'; - -void main() { - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (_) => AppState()..loadDevices(), - child: MaterialApp( - title: 'هم هوش', - debugShowCheckedModeBanner: false, - theme: ThemeData( - useMaterial3: true, - fontFamily: 'Vazirmatn', // 👈 Set the Persian font globally - brightness: Brightness.light, - primarySwatch: Colors.teal, - scaffoldBackgroundColor: Colors.transparent, - cardTheme: CardThemeData( - elevation: 4, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), - clipBehavior: Clip.antiAlias, - color: Colors.white.withOpacity(0.85), - ), - appBarTheme: const AppBarTheme( - backgroundColor: Colors.transparent, - elevation: 0, - centerTitle: true, - iconTheme: IconThemeData(color: Colors.teal), - titleTextStyle: TextStyle(color: Colors.teal, fontSize: 22, fontWeight: FontWeight.bold), - ), - elevatedButtonTheme: ElevatedButtonThemeData( - style: ElevatedButton.styleFrom( - elevation: 2, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), - padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 14), - backgroundColor: const Color(0xFF8BC34A), - foregroundColor: Colors.white, - ), - ), - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: Colors.white, - border: OutlineInputBorder(borderRadius: BorderRadius.circular(30), borderSide: BorderSide.none), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(30), borderSide: BorderSide.none), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(30), - borderSide: const BorderSide(color: Color(0xFF8BC34A), width: 2), - ), - ), - ), - home: MainScreen(), - ), - ); - } -} - -class MainScreen extends StatefulWidget { - @override - State createState() => _MainScreenState(); -} - -class _MainScreenState extends State with SingleTickerProviderStateMixin { - int _selectedIndex = 0; - late AnimationController _animationController; - late Animation _fadeAnimation; - - final List _pages = [ - DevicesScreen(), - DocumentsScreen(), - UploadScreen(), - ChatScreen(), - ]; - - final List _navItems = [ - const BottomNavigationBarItem(icon: Icon(Icons.devices), label: 'دستگاه‌ها'), - const BottomNavigationBarItem(icon: Icon(Icons.folder_open), label: 'اسناد'), - const BottomNavigationBarItem(icon: Icon(Icons.cloud_upload), label: 'بارگذاری'), - const BottomNavigationBarItem(icon: Icon(Icons.chat), label: 'گفتگو'), - ]; - - @override - void initState() { - super.initState(); - _animationController = AnimationController(vsync: this, duration: const Duration(milliseconds: 300)); - _fadeAnimation = CurvedAnimation(parent: _animationController, curve: Curves.easeInOut); - _animationController.forward(); - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); - } - - void _onTabTapped(int index) { - setState(() { - _selectedIndex = index; - }); - _animationController.reset(); - _animationController.forward(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - extendBody: true, - body: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - colors: [Color(0xFF1B5E20), Color(0xFF43A047), Color(0xFF0288D1)], - stops: [0.0, 0.4, 1.0], - ), - ), - child: SafeArea( - child: FadeTransition( - opacity: _fadeAnimation, - child: _pages[_selectedIndex], - ), - ), - ), - bottomNavigationBar: ClipRRect( - borderRadius: const BorderRadius.vertical(top: Radius.circular(30)), - child: Container( - decoration: BoxDecoration( - boxShadow: [BoxShadow(color: Colors.black12, blurRadius: 10, offset: const Offset(0, -3))], - ), - child: BottomNavigationBar( - currentIndex: _selectedIndex, - onTap: _onTabTapped, - items: _navItems, - type: BottomNavigationBarType.fixed, - backgroundColor: Colors.white.withOpacity(0.96), - selectedItemColor: const Color(0xFF0288D1), - unselectedItemColor: Colors.grey[500], - showSelectedLabels: true, - showUnselectedLabels: true, - elevation: 0, - selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold, fontSize: 12), - unselectedLabelStyle: const TextStyle(fontSize: 12), - ), - ), - ), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/models/chat_response.dart b/coordinator_frontend/lib/models/chat_response.dart deleted file mode 100644 index 071ecf7..0000000 --- a/coordinator_frontend/lib/models/chat_response.dart +++ /dev/null @@ -1,13 +0,0 @@ -class ChatResponse { - final String finalAnswer; - final Map rawResponses; - - ChatResponse({required this.finalAnswer, required this.rawResponses}); - - factory ChatResponse.fromJson(Map json) { - return ChatResponse( - finalAnswer: json['final_answer'], - rawResponses: Map.from(json['raw_responses']), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/models/device.dart b/coordinator_frontend/lib/models/device.dart deleted file mode 100644 index 9a1de5b..0000000 --- a/coordinator_frontend/lib/models/device.dart +++ /dev/null @@ -1,15 +0,0 @@ -class Device { - final String ip; - final int port; - - Device({required this.ip, required this.port}); - - factory Device.fromJson(Map json) { - return Device( - ip: json['ip'], - port: json['port'], - ); - } - - String get address => '$ip:$port'; -} \ No newline at end of file diff --git a/coordinator_frontend/lib/models/document.dart b/coordinator_frontend/lib/models/document.dart deleted file mode 100644 index 48239ca..0000000 --- a/coordinator_frontend/lib/models/document.dart +++ /dev/null @@ -1,13 +0,0 @@ -class DocumentInfo { - final String docId; - final int chunks; - - DocumentInfo({required this.docId, required this.chunks}); - - factory DocumentInfo.fromJson(Map json) { - return DocumentInfo( - docId: json['doc_id'], - chunks: json['chunks'], - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/models/upload_response.dart b/coordinator_frontend/lib/models/upload_response.dart deleted file mode 100644 index 64f8641..0000000 --- a/coordinator_frontend/lib/models/upload_response.dart +++ /dev/null @@ -1,15 +0,0 @@ -class UploadResponse { - final String message; - final String docId; - final int chunksIndexed; - - UploadResponse({required this.message, required this.docId, required this.chunksIndexed}); - - factory UploadResponse.fromJson(Map json) { - return UploadResponse( - message: json['message'], - docId: json['doc_id'], - chunksIndexed: json['chunks_indexed'], - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/providers/app_state.dart b/coordinator_frontend/lib/providers/app_state.dart deleted file mode 100644 index e291d03..0000000 --- a/coordinator_frontend/lib/providers/app_state.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'dart:io'; -import 'package:flutter/material.dart'; -import '../services/api_service.dart'; -import '../models/device.dart'; -import '../models/document.dart'; -import '../models/chat_response.dart'; - -class AppState extends ChangeNotifier { - final ApiService _api = ApiService(); - - List _devices = []; - Map> _documentsByDevice = {}; - bool _isLoading = false; - String? _errorMessage; - - List get devices => _devices; - Map> get documentsByDevice => _documentsByDevice; - bool get isLoading => _isLoading; - String? get errorMessage => _errorMessage; - - // Load devices - Future loadDevices() async { - _setLoading(true); - _errorMessage = null; - try { - _devices = await _api.getDevices(); - notifyListeners(); - } catch (e) { - _errorMessage = e.toString(); - notifyListeners(); - } finally { - _setLoading(false); - } - } - - // Register a new device - Future registerDevice(String ip, int port) async { - _setLoading(true); - try { - await _api.registerDevice(ip, port); - await loadDevices(); - return true; - } catch (e) { - _errorMessage = e.toString(); - notifyListeners(); - return false; - } finally { - _setLoading(false); - } - } - - // Remove a device - Future removeDevice(String ip) async { - _setLoading(true); - try { - await _api.removeDevice(ip); - await loadDevices(); - return true; - } catch (e) { - _errorMessage = e.toString(); - notifyListeners(); - return false; - } finally { - _setLoading(false); - } - } - - // Load all documents (for all devices) - Future loadAllDocuments() async { - _setLoading(true); - try { - _documentsByDevice = await _api.getAllDocuments(); - notifyListeners(); - } catch (e) { - _errorMessage = e.toString(); - notifyListeners(); - } finally { - _setLoading(false); - } - } - - // Upload PDF to a specific device - Future uploadPdf(String deviceIp, File pdfFile) async { - _setLoading(true); - try { - await _api.uploadPdf(deviceIp, pdfFile); - await loadAllDocuments(); // refresh doc list - return true; - } catch (e) { - _errorMessage = e.toString(); - notifyListeners(); - return false; - } finally { - _setLoading(false); - } - } - - // Ask a question (chat) - Future askQuestion(String question) async { - _setLoading(true); - try { - return await _api.askQuestion(question); - } catch (e) { - _errorMessage = e.toString(); - rethrow; - } finally { - _setLoading(false); - } - } - - void _setLoading(bool loading) { - _isLoading = loading; - notifyListeners(); - } - - void clearError() { - _errorMessage = null; - notifyListeners(); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/screens/chat_screen.dart b/coordinator_frontend/lib/screens/chat_screen.dart deleted file mode 100644 index f1d856f..0000000 --- a/coordinator_frontend/lib/screens/chat_screen.dart +++ /dev/null @@ -1,283 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../providers/app_state.dart'; -import '../models/chat_response.dart'; - -class ChatScreen extends StatefulWidget { - @override - State createState() => _ChatScreenState(); -} - -class _ChatScreenState extends State { - final TextEditingController _questionController = TextEditingController(); - final ScrollController _scrollController = ScrollController(); - final List> _messages = []; - bool _isAsking = false; - - @override - void dispose() { - _questionController.dispose(); - _scrollController.dispose(); - super.dispose(); - } - - void _scrollToBottom() { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (_scrollController.hasClients) { - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - duration: const Duration(milliseconds: 300), - curve: Curves.easeOut, - ); - } - }); - } - - void _clearChat() { - setState(() { - _messages.clear(); - }); - } - - Future _sendMessage(AppState appState) async { - final question = _questionController.text.trim(); - if (question.isEmpty) return; - - print('Sending question: $question'); - - setState(() { - _messages.add({'role': 'user', 'content': question}); - _questionController.clear(); - _isAsking = true; - }); - _scrollToBottom(); - - try { - final response = await appState.askQuestion(question); - print('Received response: ${response.finalAnswer}'); - if (mounted) { - setState(() { - _messages.add({'role': 'assistant', 'content': response.finalAnswer}); - _isAsking = false; - }); - _scrollToBottom(); - } - } catch (e) { - print('Error: $e'); - if (mounted) { - setState(() { - _messages.add({'role': 'assistant', 'content': 'خطا: ${e.toString()}'}); - _isAsking = false; - }); - _scrollToBottom(); - } - } - } - - @override - Widget build(BuildContext context) { - final appState = Provider.of(context); - - return Directionality( - textDirection: TextDirection.rtl, - child: Scaffold( - backgroundColor: Colors.transparent, - body: Column( - children: [ - // Simple title (no AppBar) - Container( - padding: const EdgeInsets.symmetric(vertical: 12), - child: const Text( - '💬 گفتگو باهم هوش', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Colors.white), - ), - ), - const Divider(color: Colors.white30, thickness: 1), - // Messages list - Expanded( - child: _messages.isEmpty && !_isAsking - ? _buildEmptyState() - : ListView.builder( - controller: _scrollController, - padding: const EdgeInsets.all(16), - itemCount: _messages.length + (_isAsking ? 1 : 0), - itemBuilder: (context, index) { - if (index == _messages.length && _isAsking) { - return _buildTypingIndicator(); - } - final message = _messages[index]; - return _buildMessageBubble( - message['content']!, - isUser: message['role'] == 'user', - ); - }, - ), - ), - // Input area - _buildInputArea(appState), - ], - ), - ), - ); - } - - Widget _buildEmptyState() { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.2), - shape: BoxShape.circle, - ), - child: const Icon(Icons.question_answer, size: 80, color: Colors.white70), - ), - const SizedBox(height: 24), - const Text( - 'از هم هوش هر سوالی دارید بپرسید', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500, color: Colors.white70), - ), - const SizedBox(height: 8), - ], - ), - ); - } - - Widget _buildTypingIndicator() { - return Align( - alignment: Alignment.centerRight, - child: Container( - margin: const EdgeInsets.symmetric(vertical: 8), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.9), - borderRadius: BorderRadius.circular(24), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: const [ - SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2, color: Color(0xFF0288D1)), - ), - SizedBox(width: 12), - Text('در حال تفکر...', style: TextStyle(color: Color(0xFF0288D1))), - ], - ), - ), - ); - } - - Widget _buildMessageBubble(String text, {required bool isUser}) { - return Align( - alignment: isUser ? Alignment.centerLeft : Alignment.centerRight, - child: Container( - margin: const EdgeInsets.only(bottom: 12), - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width * 0.75, - ), - decoration: BoxDecoration( - gradient: isUser - ? const LinearGradient( - colors: [Color(0xFF43A047), Color(0xFF0288D1)], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ) - : null, - color: isUser ? null : Colors.white, - borderRadius: BorderRadius.only( - topLeft: const Radius.circular(20), - topRight: const Radius.circular(20), - bottomLeft: isUser ? const Radius.circular(8) : const Radius.circular(20), - bottomRight: isUser ? const Radius.circular(20) : const Radius.circular(8), - ), - boxShadow: [ - BoxShadow( - color: Colors.black12, - blurRadius: 4, - offset: const Offset(0, 2), - ), - ], - ), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: Text( - text, - style: TextStyle( - color: isUser ? Colors.white : Colors.black87, - fontSize: 15, - ), - ), - ), - ); - } - - Widget _buildInputArea(AppState appState) { - return Container( - margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(32), - boxShadow: [ - BoxShadow(color: Colors.black12, blurRadius: 10, offset: const Offset(0, -2)), - ], - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(32), - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Expanded( - child: TextField( - controller: _questionController, - style: const TextStyle(color: Colors.black87, fontSize: 16), - maxLines: 5, - minLines: 1, - textDirection: TextDirection.rtl, - decoration: InputDecoration( - hintText: 'سوال خود را بنویسید...', - hintStyle: TextStyle(color: Colors.grey[500]), - filled: true, - fillColor: Colors.white, - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - contentPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), - ), - onSubmitted: (_) => _sendMessage(appState), - onChanged: (_) => setState(() {}), // rebuild when text changes - ), - ), - const SizedBox(width: 12), - // Reactive button: enabled only when text is not empty and not already asking - ValueListenableBuilder( - valueListenable: _questionController, - builder: (context, value, child) { - final isEnabled = value.text.trim().isNotEmpty && !_isAsking; - return ElevatedButton( - onPressed: isEnabled - ? () { - print('Send button pressed'); - _sendMessage(appState); - } - : null, - style: ElevatedButton.styleFrom( - shape: const CircleBorder(), - padding: const EdgeInsets.all(16), - backgroundColor: const Color(0xFF0288D1), - disabledBackgroundColor: Colors.grey, - ), - child: _isAsking - ? const SizedBox(width: 24, height: 24, child: CircularProgressIndicator(strokeWidth: 2, color: Colors.white)) - : const Icon(Icons.send_rounded, color: Colors.white, size: 24), - ); - }, - ), - ], - ), - ), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/screens/devices_screen.dart b/coordinator_frontend/lib/screens/devices_screen.dart deleted file mode 100644 index f9399f2..0000000 --- a/coordinator_frontend/lib/screens/devices_screen.dart +++ /dev/null @@ -1,180 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../providers/app_state.dart'; -import '../models/device.dart'; -import '../widgets/animated_button.dart'; -import '../widgets/device_card.dart'; - -class DevicesScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - final appState = Provider.of(context); - final devices = appState.devices; - final isLoading = appState.isLoading; - final error = appState.errorMessage; - - return Directionality( - textDirection: TextDirection.rtl, - child: Scaffold( - backgroundColor: Colors.transparent, - body: isLoading - ? const Center(child: CircularProgressIndicator(color: Colors.white)) - : error != null - ? Center( - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.2), - shape: BoxShape.circle, - ), - child: Icon(Icons.error_outline, size: 80, color: Colors.red[300]), - ), - const SizedBox(height: 24), - const Text( - 'خطا در دریافت دستگاه‌ها', - style: TextStyle(color: Colors.white70, fontSize: 18, fontWeight: FontWeight.w500), - ), - const SizedBox(height: 12), - Text( - error, - style: const TextStyle(color: Colors.white54, fontSize: 14), - textAlign: TextAlign.center, - ), - const SizedBox(height: 32), - AnimatedButton( - width: 200, - height: 56, - onPressed: () => appState.loadDevices(), - child: Row( - mainAxisSize: MainAxisSize.min, - children: const [ - Icon(Icons.refresh, color: Colors.white, size: 20), - SizedBox(width: 8), - Text('تلاش مجدد', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16)), - ], - ), - ), - ], - ), - ), - ) - : devices.isEmpty - ? const Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.devices_other, size: 80, color: Colors.white54), - SizedBox(height: 16), - Text('هیچ دستگاه ثبت‌شده‌ای وجود ندارد', style: TextStyle(color: Colors.white70, fontSize: 18)), - SizedBox(height: 8), - Text('برای افزودن، دکمه + را بزنید', style: TextStyle(color: Colors.white54)), - ], - ), - ) - : ListView.builder( - padding: const EdgeInsets.all(20), - itemCount: devices.length, - itemBuilder: (context, index) => DeviceCard( - device: devices[index], - onDelete: () => _confirmDelete(context, devices[index].ip, appState), - ), - ), - floatingActionButton: FloatingActionButton.extended( - onPressed: () => _showAddDeviceDialog(context), - icon: const Icon(Icons.add, color: Colors.white), - label: const Text('افزودن دستگاه', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), - backgroundColor: const Color(0xFF00B4DB), - elevation: 6, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), - ), - floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, - ), - ); - } - - void _showAddDeviceDialog(BuildContext context) { - final ipController = TextEditingController(); - final portController = TextEditingController(text: '8080'); - showDialog( - context: context, - builder: (_) => Dialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(32)), - child: Container( - padding: const EdgeInsets.all(24), - decoration: BoxDecoration( - gradient: const LinearGradient(colors: [Color(0xFFf5f7fa), Color(0xFFc3cfe2)]), - borderRadius: BorderRadius.circular(32), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Text('➕ افزودن Orange Pi جدید', style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), - const SizedBox(height: 24), - TextField( - controller: ipController, - decoration: const InputDecoration(labelText: 'آدرس IP', prefixIcon: Icon(Icons.dns)), - autofocus: true, - textDirection: TextDirection.ltr, - ), - const SizedBox(height: 16), - TextField( - controller: portController, - decoration: const InputDecoration(labelText: 'پورت', prefixIcon: Icon(Icons.settings_ethernet)), - keyboardType: TextInputType.number, - textDirection: TextDirection.ltr, - ), - const SizedBox(height: 24), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton(onPressed: () => Navigator.pop(context), child: const Text('انصراف', style: TextStyle(color: Colors.grey))), - const SizedBox(width: 12), - AnimatedButton( - onPressed: () async { - final ip = ipController.text.trim(); - final port = int.tryParse(portController.text.trim()) ?? 8080; - if (ip.isNotEmpty) { - final success = await Provider.of(context, listen: false).registerDevice(ip, port); - if (context.mounted) Navigator.pop(context); - if (!success && context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('ثبت‌نام ناموفق بود'))); - } - } - }, - child: const Text('ثبت', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), - ), - ], - ), - ], - ), - ), - ), - ); - } - - void _confirmDelete(BuildContext context, String ip, AppState appState) { - showDialog( - context: context, - builder: (_) => AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(28)), - title: const Text('حذف دستگاه', style: TextStyle(fontWeight: FontWeight.bold)), - content: Text('آیا $ip را برای همیشه حذف می‌کنید؟'), - actions: [ - TextButton(onPressed: () => Navigator.pop(context), child: const Text('انصراف', style: TextStyle(color: Colors.grey))), - AnimatedButton( - gradient: const LinearGradient(colors: [Color(0xFFE53935), Color(0xFFB71C1C)]), - onPressed: () async { - await appState.removeDevice(ip); - if (context.mounted) Navigator.pop(context); - }, - child: const Text('حذف', style: TextStyle(color: Colors.white)), - ), - ], - ), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/screens/documents_screen.dart b/coordinator_frontend/lib/screens/documents_screen.dart deleted file mode 100644 index c4d610f..0000000 --- a/coordinator_frontend/lib/screens/documents_screen.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../providers/app_state.dart'; -import '../widgets/document_card.dart'; - -class DocumentsScreen extends StatefulWidget { - @override - State createState() => _DocumentsScreenState(); -} - -class _DocumentsScreenState extends State { - String? _selectedDeviceIp; - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - Provider.of(context, listen: false).loadAllDocuments(); - }); - } - - @override - Widget build(BuildContext context) { - final appState = Provider.of(context); - final allDocs = appState.documentsByDevice; - - final deviceIps = allDocs.keys.toList(); - final selectedIp = - _selectedDeviceIp ?? (deviceIps.isNotEmpty ? deviceIps.first : null); - if (_selectedDeviceIp == null && selectedIp != null) - _selectedDeviceIp = selectedIp; - - final documentsForSelected = - (selectedIp != null && allDocs.containsKey(selectedIp)) - ? allDocs[selectedIp]! - : []; - - return Directionality( - textDirection: TextDirection.rtl, - child: Scaffold( - backgroundColor: Colors.transparent, - body: Column( - children: [ - if (deviceIps.isNotEmpty) - Padding( - padding: const EdgeInsets.all(16), - child: DropdownButtonFormField( - value: selectedIp, - decoration: const InputDecoration( - labelText: 'انتخاب Orange Pi', - border: OutlineInputBorder(), - ), - items: deviceIps - .map((ip) => DropdownMenuItem(value: ip, child: Text(ip))) - .toList(), - onChanged: (newIp) => - setState(() => _selectedDeviceIp = newIp), - ), - ), - Expanded( - child: Stack( - children: [ - if (appState.isLoading) - const Center(child: CircularProgressIndicator()) - else if (documentsForSelected.isEmpty) - const Center( - child: Text('هیچ سندی برای این دستگاه یافت نشد.'), - ) - else - ListView.builder( - padding: const EdgeInsets.all(16), - itemCount: documentsForSelected.length, - itemBuilder: (ctx, idx) => DocumentCard( - doc: documentsForSelected[idx], - deviceIp: selectedIp!, - ), - ), - Positioned( - bottom: 16, - right: 16, - child: FloatingActionButton.small( - onPressed: () => appState.loadAllDocuments(), - child: const Icon(Icons.refresh), - ), - ), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/coordinator_frontend/lib/screens/upload_screen.dart b/coordinator_frontend/lib/screens/upload_screen.dart deleted file mode 100644 index 79f4b6f..0000000 --- a/coordinator_frontend/lib/screens/upload_screen.dart +++ /dev/null @@ -1,206 +0,0 @@ -import 'dart:io'; -import 'package:flutter/material.dart'; -import 'package:file_picker/file_picker.dart'; -import 'package:provider/provider.dart'; -import '../providers/app_state.dart'; -import '../widgets/animated_button.dart'; - -class UploadScreen extends StatefulWidget { - @override - State createState() => _UploadScreenState(); -} - -class _UploadScreenState extends State { - String? _selectedDeviceIp; - File? _selectedFile; - bool _uploading = false; - - @override - Widget build(BuildContext context) { - final appState = Provider.of(context); - final devices = appState.devices; - - return Directionality( - textDirection: TextDirection.rtl, - child: Scaffold( - backgroundColor: Colors.transparent, - body: SafeArea( - child: SingleChildScrollView( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Card( - elevation: 8, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(32), - ), - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - children: [ - const Icon( - Icons.router, - size: 52, - color: Color(0xFF0288D1), - ), - const SizedBox(height: 12), - const Text( - 'انتخاب Orange Pi', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - ), - ), - const SizedBox(height: 20), - DropdownButtonFormField( - value: _selectedDeviceIp, - hint: const Text('انتخاب دستگاه'), - items: devices - .map( - (d) => DropdownMenuItem( - value: d.ip, - child: Text(d.ip), - ), - ) - .toList(), - onChanged: (ip) => - setState(() => _selectedDeviceIp = ip), - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(30), - ), - filled: true, - fillColor: Colors.white, - prefixIcon: const Icon(Icons.computer), - ), - ), - ], - ), - ), - ), - const SizedBox(height: 40), - GestureDetector( - onTap: () async { - final result = await FilePicker.platform.pickFiles( - type: FileType.custom, - allowedExtensions: ['pdf'], - ); - if (result != null && result.files.single.path != null) { - if (mounted) - setState( - () => _selectedFile = File(result.files.single.path!), - ); - } - }, - child: Container( - width: double.infinity, - padding: const EdgeInsets.symmetric(vertical: 20), - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.95), - borderRadius: BorderRadius.circular(28), - border: Border.all( - color: const Color(0xFF0288D1).withOpacity(0.5), - width: 2, - ), - boxShadow: [ - BoxShadow( - color: Colors.black12, - blurRadius: 6, - offset: const Offset(0, 3), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - _selectedFile == null - ? Icons.picture_as_pdf - : Icons.check_circle, - color: _selectedFile == null - ? const Color(0xFF2E7D32) - : const Color(0xFF43A047), - ), - const SizedBox(width: 12), - Text( - _selectedFile == null - ? 'برای انتخاب PDF ضربه بزنید' - : _selectedFile!.path.split('/').last, - style: TextStyle( - fontSize: 16, - fontWeight: _selectedFile == null - ? FontWeight.normal - : FontWeight.w500, - color: _selectedFile == null - ? Colors.grey[700] - : const Color(0xFF2E7D32), - ), - ), - ], - ), - ), - ), - const SizedBox(height: 32), - if (_selectedDeviceIp != null && _selectedFile != null) - AnimatedButton( - width: 200, - height: 56, - onPressed: _uploading - ? null - : () => _performUpload(appState), - isLoading: _uploading, - child: const Text( - '🚀 بارگذاری', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 18, - ), - ), - ) - else - Container( - width: 200, - padding: const EdgeInsets.symmetric(vertical: 16), - decoration: BoxDecoration( - color: Colors.grey[400], - borderRadius: BorderRadius.circular(40), - ), - child: const Center( - child: Text( - 'انتخاب دستگاه و PDF', - style: TextStyle(color: Colors.white70), - ), - ), - ), - const SizedBox(height: 20), - ], - ), - ), - ), - ), - ); - } - - void _performUpload(AppState appState) async { - if (!mounted) return; - setState(() => _uploading = true); - final success = await appState.uploadPdf( - _selectedDeviceIp!, - _selectedFile!, - ); - if (!mounted) return; - setState(() => _uploading = false); - if (success && mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('✅ بارگذاری موفق'))); - setState(() => _selectedFile = null); - } else if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(appState.errorMessage ?? 'بارگذاری ناموفق')), - ); - } - } -} diff --git a/coordinator_frontend/lib/services/api_service.dart b/coordinator_frontend/lib/services/api_service.dart deleted file mode 100644 index b3e7529..0000000 --- a/coordinator_frontend/lib/services/api_service.dart +++ /dev/null @@ -1,159 +0,0 @@ -import 'dart:io'; -import 'package:dio/dio.dart'; -import 'package:dio/io.dart'; -import '../models/device.dart'; -import '../models/document.dart'; -import '../models/chat_response.dart'; -import '../models/upload_response.dart'; - -class ApiService { - static const String baseUrl = - 'http://192.168.1.1:8000'; // CHANGE to your laptop's IP - final Dio _dio; - - ApiService() - : _dio = Dio( - BaseOptions( - baseUrl: baseUrl, - connectTimeout: const Duration(seconds: 30), - receiveTimeout: const Duration(seconds: 120), - headers: {'Content-Type': 'application/json'}, - ), - ) { - // Allow self-signed certificates if needed (for local dev) - (_dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = - (client) { - client.badCertificateCallback = (cert, host, port) => true; - return client; - }; - } - - // ========== Devices ========== - Future> getDevices() async { - try { - final response = await _dio.get('/devices/list'); - if (response.statusCode == 200) { - final List devicesJson = response.data['devices']; - return devicesJson.map((json) => Device.fromJson(json)).toList(); - } - throw Exception('Failed to load devices'); - } on DioException catch (e) { - throw Exception('Network error: ${e.message}'); - } - } - - Future registerDevice(String ip, int port) async { - try { - await _dio.post('/devices/register', data: {'ip': ip, 'port': port}); - } on DioException catch (e) { - throw Exception('Register failed: ${e.message}'); - } - } - - Future removeDevice(String ip) async { - try { - await _dio.post('/devices/remove', data: {'ip': ip}); - } on DioException catch (e) { - throw Exception('Remove failed: ${e.message}'); - } - } - - // ========== Documents ========== - Future>> getAllDocuments() async { - try { - final response = await _dio.get('/devices/documents'); - if (response.statusCode == 200) { - final Map byDevice = - response.data['documents_by_device']; - final result = >{}; - byDevice.forEach((ip, docs) { - if (docs is List) { - result[ip] = docs.map((d) => DocumentInfo.fromJson(d)).toList(); - } else { - result[ip] = []; - } - }); - return result; - } - throw Exception('Failed to load documents'); - } on DioException catch (e) { - throw Exception('Network error: ${e.message}'); - } - } - - Future>> getDocumentsForDevice( - String ip, - ) async { - try { - final response = await _dio.get( - '/devices/documents', - queryParameters: {'device_ip': ip}, - ); - if (response.statusCode == 200) { - final Map byDevice = - response.data['documents_by_device']; - final result = >{}; - byDevice.forEach((ip, docs) { - if (docs is List) { - result[ip] = docs.map((d) => DocumentInfo.fromJson(d)).toList(); - } - }); - return result; - } - throw Exception('Failed to load documents for device'); - } on DioException catch (e) { - throw Exception('Network error: ${e.message}'); - } - } - - // ========== Upload ========== - Future uploadPdf(String deviceIp, File pdfFile) async { - try { - final formData = FormData.fromMap({ - 'file': await MultipartFile.fromFile( - pdfFile.path, - filename: pdfFile.path.split('/').last, - ), - }); - final response = await _dio.post( - '/devices/$deviceIp/upload', - data: formData, - ); - if (response.statusCode == 200) { - return UploadResponse.fromJson(response.data); - } - throw Exception('Upload failed with status ${response.statusCode}'); - } on DioException catch (e) { - throw Exception('Upload error: ${e.message}'); - } - } - - // ========== Chat ========== - Future askQuestion(String question) async { - try { - final response = await _dio.post( - '/ask', - data: {'question': question}, - options: Options( - sendTimeout: const Duration(seconds: 120), - receiveTimeout: const Duration(seconds: 120), - ), - ); - if (response.statusCode == 200) { - return ChatResponse.fromJson(response.data); - } - throw Exception('Chat request failed'); - } on DioException catch (e) { - throw Exception('Network error: ${e.message}'); - } - } - - // In lib/services/api_service.dart - Future deleteDocument(String deviceIp, String docId) async { - try { - await _dio.delete('/devices/$deviceIp/documents/$docId'); - } on DioException catch (e) { - throw Exception('Delete failed: ${e.message}'); - } - } -} diff --git a/coordinator_frontend/lib/widgets/animated_button.dart b/coordinator_frontend/lib/widgets/animated_button.dart deleted file mode 100644 index 7cd5811..0000000 --- a/coordinator_frontend/lib/widgets/animated_button.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:flutter/material.dart'; - -class AnimatedButton extends StatefulWidget { - final VoidCallback? onPressed; - final Widget child; - final bool isLoading; - final double? width; - final double? height; - final Gradient? gradient; - - const AnimatedButton({ - this.onPressed, - required this.child, - this.isLoading = false, - this.width, - this.height, - this.gradient, - super.key, - }); - - @override - State createState() => _AnimatedButtonState(); -} - -class _AnimatedButtonState extends State with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _scaleAnimation; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 100)); - _scaleAnimation = Tween(begin: 1.0, end: 0.95).animate(_controller); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - void _handleTap() { - if (widget.onPressed != null && !widget.isLoading) { - widget.onPressed!(); - } - } - - @override - Widget build(BuildContext context) { - final gradient = widget.gradient ?? const LinearGradient( - colors: [Color(0xFF2E7D32), Color(0xFF0288D1)], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ); - - return GestureDetector( - onTapDown: (_) => _controller.forward(), - onTapUp: (_) => _controller.reverse(), - onTapCancel: () => _controller.reverse(), - onTap: _handleTap, - child: ScaleTransition( - scale: _scaleAnimation, - child: Container( - width: widget.width, - height: widget.height, - decoration: BoxDecoration( - gradient: gradient, - borderRadius: BorderRadius.circular(40), - boxShadow: [ - BoxShadow(color: Colors.black26, blurRadius: 4, offset: const Offset(0, 2)), - ], - ), - child: Center( - child: widget.isLoading - ? const SizedBox(width: 24, height: 24, child: CircularProgressIndicator(strokeWidth: 2.5, color: Colors.white)) - : widget.child, - ), - ), - ), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/widgets/device_card.dart b/coordinator_frontend/lib/widgets/device_card.dart deleted file mode 100644 index c3c5908..0000000 --- a/coordinator_frontend/lib/widgets/device_card.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; -import '../models/device.dart'; - -class DeviceCard extends StatelessWidget { - final Device device; - final VoidCallback onDelete; - - const DeviceCard({required this.device, required this.onDelete, super.key}); - - @override - Widget build(BuildContext context) { - return Card( - margin: const EdgeInsets.only(bottom: 12), - child: ListTile( - leading: const Icon(Icons.computer), - title: Text(device.ip), - subtitle: Text('Port: ${device.port}'), - trailing: IconButton(icon: const Icon(Icons.delete, color: Colors.red), onPressed: onDelete), - ), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/lib/widgets/document_card.dart b/coordinator_frontend/lib/widgets/document_card.dart deleted file mode 100644 index 05d8596..0000000 --- a/coordinator_frontend/lib/widgets/document_card.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import '../models/document.dart'; -import '../services/api_service.dart'; // to call the delete API - -class DocumentCard extends StatelessWidget { - final DocumentInfo doc; - final String deviceIp; // pass the device IP to know which Pi to delete from - - const DocumentCard({required this.doc, required this.deviceIp, super.key}); - - Future _deleteDocument(BuildContext context) async { - // Show confirmation dialog - final confirm = await showDialog( - context: context, - builder: (_) => AlertDialog( - title: const Text('حذف سند'), - content: Text('آیا از حذف سند "${doc.docId}" مطمئن هستید؟'), - actions: [ - TextButton(onPressed: () => Navigator.pop(context, false), child: const Text('انصراف')), - TextButton(onPressed: () => Navigator.pop(context, true), child: const Text('حذف', style: TextStyle(color: Colors.red))), - ], - ), - ); - if (confirm != true) return; - - try { - final api = ApiService(); - await api.deleteDocument(deviceIp, doc.docId); - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('سند با موفقیت حذف شد'))); - // Refresh the documents list (call parent callback) - // We'll need a callback to refresh the screen - } - } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('خطا در حذف: $e'))); - } - } - } - - @override - Widget build(BuildContext context) { - return Card( - margin: const EdgeInsets.only(bottom: 8), - child: ListTile( - leading: const Icon(Icons.description, color: Color(0xFF0288D1)), - title: Text(doc.docId, style: const TextStyle(fontWeight: FontWeight.w500)), - subtitle: Text('${doc.chunks} قطعه'), - trailing: IconButton( - icon: const Icon(Icons.delete_outline, color: Colors.redAccent), - onPressed: () => _deleteDocument(context), - ), - ), - ); - } -} \ No newline at end of file diff --git a/coordinator_frontend/windows/runner/runner.exe.manifest b/coordinator_frontend/windows/runner/runner.exe.manifest deleted file mode 100644 index 153653e..0000000 --- a/coordinator_frontend/windows/runner/runner.exe.manifest +++ /dev/null @@ -1,14 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - diff --git a/coordinator_backend/backend.py b/edge/coordinator_backend/backend.py similarity index 100% rename from coordinator_backend/backend.py rename to edge/coordinator_backend/backend.py diff --git a/edge/coordinator_frontend/.dart_tool/dartpad/web_plugin_registrant.dart b/edge/coordinator_frontend/.dart_tool/dartpad/web_plugin_registrant.dart new file mode 100644 index 0000000..75482db --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/dartpad/web_plugin_registrant.dart @@ -0,0 +1,16 @@ +// Flutter web plugin registrant file. +// +// Generated file. Do not edit. +// + +// @dart = 2.13 +// ignore_for_file: type=lint + +import 'package:file_picker/_internal/file_picker_web.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +void registerPlugins([final Registrar? pluginRegistrar]) { + final Registrar registrar = pluginRegistrar ?? webPluginRegistrar; + FilePickerWeb.registerWith(registrar); + registrar.registerMessageHandler(); +} diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/.filecache b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/.filecache new file mode 100644 index 0000000..9650a81 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/.filecache @@ -0,0 +1 @@ +{"version":2,"files":[{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionmanager2.dart","hash":"437b5795f5b9bf507b02ed5d44f9f572"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/cupertino_focus_halo.dart","hash":"5954c7f7b8ae8e68fbc52b67a5646390"},{"path":"/opt/flutter/packages/flutter/lib/src/material/toggle_buttons.dart","hash":"c14477724208e2df7d50e5340fb6118a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/multipart_file.dart","hash":"d96646e5f342c3ff58625f7edeb8808e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wtsapi32.g.dart","hash":"da654b6ae25dd581a1b5f1084d769c91"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelementarray.dart","hash":"e7ee3c364551618835ecb4e3afe065ff"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellingerror.dart","hash":"c8ff0e27e7c87256a90d8a3ef24be6ac"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/viewport_offset.dart","hash":"591d9867d3478bc6713e056de78d42af"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/icon_theme_data.dart","hash":"ae1f6fe977a287d316ee841eadf00c2b"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart","hash":"fc414288f67be55f5719ac9a73b0af80"},{"path":"/opt/flutter/packages/flutter/lib/src/services/debug.dart","hash":"17fec0de01669e6234ccb93fc1d171f2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jcharacter.dart","hash":"d8078d775520fa565079c39a3f62e075"},{"path":"/opt/flutter/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart","hash":"3405e08e614528c3c17afc561d056964"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationscrollpattern.dart","hash":"d5e0952742a6404c71b939292023e2cb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionpattern2.dart","hash":"8924d681363bacc7cd51c183b529f260"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/material_color_utilities.dart","hash":"fbd82bcbc9e665b8d098f0716297aa14"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/multidrag.dart","hash":"2b4d348540427e4d8e707c59de995235"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/text_painter.dart","hash":"4b6338b399e159aa302c4ddef07ed2b2"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/expansible.dart","hash":"751327ddf58d64b55d05187b54d30e6b"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/_web_image_info_io.dart","hash":"e4da90bb20b3980a03665a080c87a098"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemfilter.dart","hash":"a9a9ecd14dd90500d067ccb5c564cb22"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/basic_types.dart","hash":"785eedcc96fa6a4fcc7c81a8736a7427"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/provider.dart","hash":"7c0851720900806fa2a397a81c81875e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart","hash":"ef5fc00d685cd2a36c4de80e1c7e3a8f"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/tolerance.dart","hash":"43ef2382f5e86c859817da872279301e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/shadows.dart","hash":"36fc598c656490ab430ca1be5fb909e8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/magnification.g.dart","hash":"c63a357184bab34ab1e8522808a9cdf9"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/spring_simulation.dart","hash":"818229a8c8d058b85f06d9ab0cfadfde"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/framework.dart","hash":"6744dbf568879753ee30f45d1330c9ec"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture.h","hash":"d1894650bbfe9ba65c6f0b195645a9a5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_lints-6.0.0/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart","hash":"62f852a5f85345e608cdc7b62a689202"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/single_subscription_transformer.dart","hash":"f92bb9e85f7b089f96263b120561014f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_zip.dart","hash":"b296f400a068b70100fa570a6134860d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/top_level.dart","hash":"15439eaa12b927b0e9a42b9d168e3371"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/shifted_box.dart","hash":"7553168551b42127720cfbdf7faa4c35"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/LICENSE","hash":"2b36ca50262dc615e560c27654badb26"},{"path":"/opt/flutter/packages/flutter/lib/services.dart","hash":"29ae1507a6ec4c2ffae469a10e505bda"},{"path":"/opt/flutter/packages/flutter/lib/src/scheduler/ticker.dart","hash":"cee8e8ff3c7b3d84de71dacaa3001493"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/alignment.dart","hash":"92cb1c23b5121d8c0add7a3989e7646e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/button_bar_theme.dart","hash":"e8bf38f710bc41ffe65a4f07562f8739"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/queue_list.dart","hash":"02139a0e85c6b42bceaf3377d2aee3de"},{"path":"/opt/flutter/packages/flutter/lib/src/material/ink_well.dart","hash":"10aca63c2987c16b1d44923eb7a8f128"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart","hash":"4d099609a747833bf15dc3bee95a0fa0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_map.dart","hash":"9d273d5a3c1851b0313cd949e7f84355"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/editable_text.dart","hash":"b54b09ccce3598f78ba15af98dde5f4b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionpattern.dart","hash":"2ee116ca87b7e1c461de1462c3442ec6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_extensions.dart","hash":"5843b4750179f6099d443212b76f04a2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionitempattern.dart","hash":"dd15fe8e4901c3c57a40bed6b0079e80"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/util/transform_empty_to_null.dart","hash":"579bb0bd41c172690d80937bc1ce3b4c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextpattern2.dart","hash":"1dfa85bd16bf08ae91f9cceb02ef1563"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/eager_span_scanner.dart","hash":"bdc22e9e77382045196b5aafd42b5e55"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/velocity_tracker.dart","hash":"3165875f832ad10bed80f24a75dfe168"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/print.dart","hash":"6f9e3f7910ef145be8e5985ad9a5fa90"},{"path":"/opt/flutter/packages/flutter/lib/src/material/color_scheme.dart","hash":"3a46aa831e3808e20bcd83af0de2ee6e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/dropdown_menu_theme.dart","hash":"ad568d0e1e12e13ce5e3939559cdbe80"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iinspectable.dart","hash":"4a83689a30f6283c87f680b4c54bdd91"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/constants.dart","hash":"be94b8f65e9d89867287dabe5ea1dff1"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/device_card.dart","hash":"464843d7e3523b3a3784af507808d1e3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jvalues.dart","hash":"89d45e2e5a70ac054f030113ad19f26f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_constraint.dart","hash":"6367c3e098c4a3fdcad94aca0c0148c5"},{"path":"/opt/flutter/packages/flutter/lib/src/material/chip.dart","hash":"1f30fdd9cca1a7867a184762fe37cc95"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_physics.dart","hash":"dd918b96a422336ca9ba449bf212280f"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/icons.dart","hash":"790dc5e1e0b058d13efbd42a3f46498e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/capture_transformer.dart","hash":"e82a9b67ba33ae635b9b083ef147fb9b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/restartable_timer.dart","hash":"89cdb68e09dda63e2a16d00b994387c2"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/two_dimensional_scroll_view.dart","hash":"501bd57ff63cbebe25a2dca757644b23"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/vector_math_64.dart","hash":"95bedb83cd5b163e43b554086b016380"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio_mixin.dart","hash":"e103c51878b3741ffe4d81896876f3ef"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/listenable_provider.dart","hash":"fe16b487322631b50c3cbb09de987315"},{"path":"/opt/flutter/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart","hash":"3cffc57d9968f59182bfaed7877fa768"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/src/typed_buffer.dart","hash":"f64837679a1abb526e942b166db5c244"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/unpack_utf16.dart","hash":"cfab296797450689ec04e7984e7d80e3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/src/tone_delta_pair.dart","hash":"033b9ff4ea4c8fa3e9da4573a7d2edfb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatatables2.dart","hash":"f1f175eff474684786b1b6980f386aca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/irestrictederrorinfo.dart","hash":"a42121307a3d24f06691ab35f935206a"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/snapshot_widget.dart","hash":"f694ccbef3910a460e6a981fedec9253"},{"path":"/opt/flutter/packages/flutter/lib/src/material/dropdown_menu_form_field.dart","hash":"f11ea010781c687f1c0b8a32c04da5df"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/charcode.dart","hash":"b2015570257a2a6579f231937e7dea0e"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_codec.h","hash":"1593085ded6e4a14d8129a5d9a95edb8"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_string_codec.h","hash":"5edcd4ae8b7d3acb2e56bf8bfad75d4d"},{"path":"/opt/flutter/packages/flutter/lib/gestures.dart","hash":"ac772288a52f82606f20d68636327e34"},{"path":"/opt/flutter/packages/flutter/lib/src/material/slider_parts.dart","hash":"f5292e9c3c44e235c4f457e167485727"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/functions.dart","hash":"41f7bdb7d1eb3c86c21489902221b859"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_view.dart","hash":"b3e085602a5caa2ecdf5f089894d6a51"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/extensions.dart","hash":"38e17b28106d00f831c56d4e78ca7421"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationandcondition.dart","hash":"c3b42ddc5c69d20f4bbfb3ccb3f30ffc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/ascii_glyph_set.dart","hash":"7050c8c94b55eb51260ca54708b460fa"},{"path":"/opt/flutter/packages/flutter/lib/src/material/dropdown.dart","hash":"9a063b4afe22d09e115503875e07dcb3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/progress_stream/io_progress_stream.dart","hash":"6ea89c3bc6b0860bd7c16998d3950c3d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart","hash":"788f331d32ed0724fd8488d20217e0ff"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/fonts/MaterialIcons-Regular.otf","hash":"e7069dfd19b331be16bed984668fe080"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/_platform_io.dart","hash":"bf6d84f8802d83e64fe83477c83752b4"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/text_style.dart","hash":"0284a2c2c366d303d8704f29a938becc"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/events.dart","hash":"a72da2d07a84e68eb5c1d670662e8d88"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/shape_decoration.dart","hash":"e107b8ddd64013812cb9471a5cd99394"},{"path":"/opt/flutter/packages/flutter/lib/src/material/ink_splash.dart","hash":"0dcccde412e7fbbd3cc9c2f4200f0316"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/_timeline_io.dart","hash":"90f70ffdd26c85d735fbedd47d5ad80b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/string_utils.dart","hash":"603b7b0647b2f77517d6e5cf1d073e5a"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/slider.dart","hash":"062dfe963082ff670df169c6f5111886"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/qarma_and_zenity_handler.dart","hash":"2a56ecb8b3eae2ee4e5eaa20abed4f68"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/adapters/io_adapter.dart","hash":"21ceca6b2a9506768e08af4b33e9879f"},{"path":"/opt/flutter/packages/flutter/lib/src/material/bottom_sheet_theme.dart","hash":"be66f00d2c9bb816f4236dd0f92bff55"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwinhttprequest.dart","hash":"e9c0088ee89cdab9346358a1ab7d4f18"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/semantics_debugger.dart","hash":"faac62b3a2c566f92595aa2c37d30803"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement3.dart","hash":"ee2f81dc37bb6d1adb9570b7634eed77"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imoniker.dart","hash":"59c4492b4ff3d2e5424c1903bcb8a271"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wevtapi.g.dart","hash":"4fd8d39dff594e013e042c2896cb0bf0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality.dart","hash":"46e577ec532e21029e9cee153d7ca434"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/observer_list.dart","hash":"4c13b34211e2b17645a6a5cd8defbe0d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart","hash":"54a8ce9dcf41353bc939b72a771a79b7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio_web_adapter-2.1.2/LICENSE","hash":"3cc5c8282a1f382c0ea02231eacd2962"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/idispatch.dart","hash":"8ef246eaf180b7621f716282e295c950"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/box_shadow.dart","hash":"4bd35faa7907f81ad673753f51bb60b9"},{"path":"/opt/flutter/packages/flutter/lib/src/services/asset_manifest.dart","hash":"2cccaf9d071468ba44c86f001bc6ece0"},{"path":"/opt/flutter/packages/flutter/lib/src/material/refresh_indicator.dart","hash":"2115cad00e1d7ab948c939763b898ea9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/wrappers.dart","hash":"21e56afda1f096f0425a34987708ed56"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/image.dart","hash":"4eede9144b4c0e4b14bd426654183174"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_standard_message_codec.h","hash":"cde1b5d81be59769b872be4d62b4bae8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/layout_builder.dart","hash":"40ad3174c7f170adf08184383afb18c1"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scrollable_helpers.dart","hash":"d993a1b45cbc68994637753965211c9d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataassemblyimport.dart","hash":"dddc2f13e029b11ddffa36413341f1b1"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/linear_border.dart","hash":"10e146d475efc0550571815cf502688d"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/scale.dart","hash":"0918b5260a49208c2c4b52f17ffb9707"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/value.dart","hash":"bf3aeab9379cee97ddcc69d885a477f5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/color_filter.dart","hash":"bc3c12f9555c86aa11866996e60c0ec9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2/LICENSE","hash":"f721b495d225cd93026aaeb2f6e41bcc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdragpattern.dart","hash":"51d92d191bdfceacf4cc7381782d4e5e"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/resampler.dart","hash":"81656bc11e6f95708a2073fdbde00cd7"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart","hash":"3fa7a3bafbab98c305119475eb004a06"},{"path":"/opt/flutter/packages/flutter/lib/physics.dart","hash":"6e29d5e69c5745a45214fe14da377c1a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/release_transformer.dart","hash":"45a20da2b86984fa0b29030dd190c75d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants_metadata.dart","hash":"201005c585ce255343e625b1a5e49601"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_macos.dart","hash":"ca1320dc17434d65019cd79b0c0f45a6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/utils.dart","hash":"fe2489ea57393e2508d17e99b05f9c99"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/team.dart","hash":"f6c6b31745eec54a45d25ffe6e5d7816"},{"path":"/opt/flutter/packages/flutter/lib/src/material/drawer_theme.dart","hash":"04ad97adf4dc5676764aa8d7aad857f9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/powrprof.g.dart","hash":"bbfc82fc5cadc3b055adeaa481dfee0d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/raw_tooltip.dart","hash":"f8e86ffdb512b37f51d1498d38e5a739"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart","hash":"7018ea64a9aab18f27a10711285d7573"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/FontManifest.json","hash":"b45011f8a980ec22554511bdfd1f2775"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterator.dart","hash":"6c54f90e0db5f42a13be6b3efeb4a04d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/patterns.dart","hash":"9f58d6e1075d496f55361c6c4131d8cd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/characters.dart","hash":"43268fa3ac45f3c527c72fc3822b9cb2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jfloat.dart","hash":"8b403a286f7eadba8a7c7e6ce1a8016c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/intersection_result.dart","hash":"866257a42b6b721549b351382b365c47"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/picker.dart","hash":"ab51def555e76eb05f01e7c5c22ae901"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/_isolates_io.dart","hash":"f90beedee11a434d706e3152bfb2fd15"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/LICENSE","hash":"83228a1ae32476770262d4ff2ac6f984"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_neutral.dart","hash":"bc6418e88ab34ee846e3d4e32408b23f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/propsys.g.dart","hash":"c226787e49d4779d8fd575f9bf26e298"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatadispenser.dart","hash":"3fc24d3b43ff4a6b63811978cfb697e8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/LICENSE","hash":"753206f0b81e6116b384683823069537"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/ticker_provider.dart","hash":"69ead76daebf9d87643f6e3194d0e643"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/capabilities.dart","hash":"88ff058a0f5a94ae94cbec023d5838e7"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/pubspec.yaml","hash":"e3e30e24718e1f3e67d00cea0e895aba"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/stadium_border.dart","hash":"1a2f4082397de18f6192b58028dd83e2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwebauthenticationcoremanagerinterop.dart","hash":"aef722a64f462b84d30dad6278040fb4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta_meta.dart","hash":"fe7e235a7623f4d325eb05394e6306f0"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/flutter_logo.dart","hash":"98773b81ad24d48d592f9a3be13ca9f4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/carousel.dart","hash":"2066bb3aea0b10e8a2981f3a4e60be7a"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_padding.dart","hash":"0d0cb64023cdc51340309b29091ddc32"},{"path":"/opt/flutter/packages/flutter/lib/src/material/chip_theme.dart","hash":"4d8528ad77a655de150de76b818ffba2"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_window_io.dart","hash":"774920189f09b8d6cbe985dc31fb87c8"},{"path":"/opt/flutter/packages/flutter/lib/src/material/banner_theme.dart","hash":"d3ac4a3d093bab7e3c97e51db9e4218f"},{"path":"/opt/flutter/packages/flutter/lib/src/services/hardware_keyboard.dart","hash":"d72347722819a7bf585990ee73c58e8e"},{"path":"/opt/flutter/packages/flutter/lib/src/dart_plugin_registrant.dart","hash":"44b8efa69ec831d1a0ce74c20ecc27b4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winscard.g.dart","hash":"f0ffece0b01158318dbca4d043da78b3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/provider.dart","hash":"08fb5f27432143c416f473db763fa8c6"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart","hash":"ef0f392137dd07bc256c579a21e15e0d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/search_anchor.dart","hash":"ff182e186bc21d810392e9f44baaa737"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationrangevaluepattern.dart","hash":"32621d3d5949612fe2c614d37bfaf7e1"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/tap.dart","hash":"c0e4b04f30eb5d5ea43254a20dca949e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemarray.dart","hash":"bd08457ce7d378f126bea891f669b69b"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/text_editing_intents.dart","hash":"47ccb32c843b4075a001e612853b2a31"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/structs.dart","hash":"b51cea8017e3cbb294fe3b8066265c7e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/decorated_sliver.dart","hash":"3ce88fe27ca35ed2f5b7a333d43676e1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/decoder.dart","hash":"e6069a6342a49cdb410fbccfbe4e8557"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_json_message_codec.h","hash":"4f7385406239c0eb8b31855e75b9addc"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/gesture_detector.dart","hash":"f7c138c3c3755adb0e89e280cf518b3b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/bottom_sheet.dart","hash":"f3ef8d5a264250166cb389ea84049e3e"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/upload_screen.dart","hash":"2e86f13b1f5ae4e83312c64e3e7c91d3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/LICENSE","hash":"80ae6870ab712d32cc9dff7f6174b603"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/material_dynamic_colors.dart","hash":"9cc3bc193f4ba15acf07b6b1d46d879e"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/object.dart","hash":"daa0c9b859ed1959e6085188a703f387"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/media_query.dart","hash":"d6312b3a879afb7e1e3154f633ad1843"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/libflutter_linux_gtk.so","hash":"d56f9d39acd6536c7790644265e05259"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/utils.dart","hash":"fab8d6d1b0e81315a3d78131394d31e6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/src/enums.dart","hash":"f4b67c136a2189470329fd33ebe57cb3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/adapter.dart","hash":"724dc321d912dc0a668feb06b1372944"},{"path":"/opt/flutter/packages/flutter/lib/src/material/colors.dart","hash":"f59aed120736d81640750c612c8cfe5c"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/keyboard_listener.dart","hash":"bd3f0349089d88d3cd79ffed23e9163b"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/autocomplete.dart","hash":"801cc870f78ba48ec10a2affa151a519"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_field.dart","hash":"dfeed2dd3e6171935e8d6af4742b9b7f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/src/contrast_curve.dart","hash":"82e64569c28ce30a19726e5c108b98bd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange3.dart","hash":"4f4a2d291e23c96c7ae0d4dbc9598c54"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/_internal.dart","hash":"add6538f2b318e4a7cb7f3c17dc47ebd"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_basic_message_channel.h","hash":"8730d7034562b44bcab7c48c894ba862"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/file_picker_linux.dart","hash":"fdd54d489ffa1481f24f03670c648423"},{"path":"/opt/flutter/packages/flutter/lib/src/material/reorderable_list.dart","hash":"7e97b33f6fce77d61c4ef057e1744d84"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jinteger.dart","hash":"c99d4d9f1de256e9caa04dc2149e2663"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/enums.dart","hash":"fcf700e37a2ca8372a19ea695ac704c8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/path_provider_foundation.dart","hash":"f975cf0e4e06eabe6c8e6134cd33b269"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_multipart_transformer.dart","hash":"531d1d96bce7aa59a6109c02ac538cb0"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/platform_view.dart","hash":"785f4f6dc51f4e7616e8228b6414f7cf"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/algorithms.dart","hash":"0976264b99a1702a5d74e9acb841b775"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/comparators.dart","hash":"8ac28b43cbabd2954dafb72dc9a58f01"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation5.dart","hash":"d879c3156e19f2b290c4d6eed1de5e89"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_view.h","hash":"e27fc7ec7888b59ffac04a45e4461699"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/http_parser.dart","hash":"b76ebf453c4f7a78139f5c52af57fda3"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_button_theme.dart","hash":"efad3646c2aadca0c462ae31919205ad"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/app_lifecycle_listener.dart","hash":"f77f6a903d346f842a7fe474e427d6a9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dxva2.g.dart","hash":"9bbe69dd9a1b6e7cd87210c8fc19314e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jstring.dart","hash":"5b93f82cec5bee5a9d1fd45af7925f8e"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/persistent_hash_map.dart","hash":"bca1b26a6202c189006097cd6ad9d1d0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/dialog_handler.dart","hash":"5c44e33ae64d25992b7fbf2390070377"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/borders.dart","hash":"4b81cc49e13d6c619390c1d77bb990f4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/fade_in_image.dart","hash":"fc5d931b0e52f2fbd5ba118ca7f34467"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/date.dart","hash":"855e1ddb4997bb01590c0571a2a7053e"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scrollbar.dart","hash":"b80e476ac5ca40bd8ed90734c95dd2f6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ierrorinfo.dart","hash":"7ec176456b796d360121e28a6af41a2a"},{"path":"/opt/flutter/packages/flutter/lib/scheduler.dart","hash":"95d8d1f6a859205f5203384e2d38173a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/path.dart","hash":"157d1983388ff7abc75e862b5231aa28"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/single_child_scroll_view.dart","hash":"9f5e8439ef3cbfa84f76922ec3580363"},{"path":"/opt/flutter/packages/flutter/lib/src/material/back_button.dart","hash":"035b8d3642fa73c21eafbee7851cc85d"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard.dart","hash":"94ef09bcb749d3c004e7bd0e04b2c89c"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/tab_scaffold.dart","hash":"2320a2245e9d27663e2f2e8c4e216e61"},{"path":"/opt/flutter/packages/flutter/lib/src/semantics/binding.dart","hash":"fbd1c6d7b5ea6ffa891e762178ed60e0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/global_env_extensions.dart","hash":"b93b5973b10335f092cad29c56ba9c6c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/animated_icons.dart","hash":"345e559b99f1a25aad8492b902d34291"},{"path":"/opt/flutter/packages/flutter/lib/src/material/popup_menu.dart","hash":"8328ed1f4f2bbcd7634628050471110f"},{"path":"/opt/flutter/packages/flutter/lib/src/services/message_codec.dart","hash":"bf50f61746b9744a0e2d45a88815288f"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/interface_level.dart","hash":"af5377d18db2f18bd4ac0ec35ed7d308"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/ffi.dart","hash":"8797b9bb0c8239ab47601d92826a8cc2"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/list_body.dart","hash":"b2fc9d149d2c55a9b6c684274ce709b4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationnotcondition.dart","hash":"1fec236f729d3217c13d42295fe3faf5"},{"path":"/opt/flutter/packages/flutter/lib/src/services/browser_context_menu.dart","hash":"db4a14227247e2524e46f6b0dd9da267"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/iphlpapi.g.dart","hash":"90687597d058691ddabaa9819ebe2441"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_context.dart","hash":"98f725d06ba20a1032cb8770d00d7fca"},{"path":"/opt/flutter/packages/flutter/lib/src/material/calendar_date_picker.dart","hash":"42f9f9340f5a1b11a0c13ee15b345554"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix2.dart","hash":"945227f3863339e388d92c2b3bfbf673"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdockpattern.dart","hash":"dc025ebc977f56a895f49dc6d82a6d45"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/focus_manager.dart","hash":"bbe6b1dfae9fb14a4bab19d82e426ddb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange2.dart","hash":"6905ddd5343384c6898473c3d0a553a6"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart","hash":"a0816d2682f6a93a6bf602f6be7cebe1"},{"path":"/opt/flutter/packages/flutter/lib/src/material/theme.dart","hash":"4ccdd5e6210285f9baf09909e7d4f593"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/quaternion.dart","hash":"55675ef4bbddffa94d962bd52b3088ca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworklistmanager.dart","hash":"9915c7d7ab3c9994e77dc4abfba9418d"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/wrap.dart","hash":"8ca19276c67bd1f6d9356d0d12a81fba"},{"path":"/opt/flutter/packages/flutter/lib/src/material/radio_theme.dart","hash":"5e24f752fa5075066512e8ef995770b5"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_json_method_codec.h","hash":"c31254629784a8fd48a5ec671df85e64"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/version_check.dart","hash":"284d8cad5a6bbe6c7dfbc1ffd3871342"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/jni.dart","hash":"83dac2837d1d165e262ded0d509dad38"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/feedback.dart","hash":"c8f69577793923bfda707dcbb48a08b1"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_codec.h","hash":"5997440e26e079541337c498925226f1"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json","hash":"ea49ccd766ef9be1345aa9da7054d5c7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatadispenserex.dart","hash":"1a8913505e5275e2ead5a2e0752d1ac6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/unicode_glyph_set.dart","hash":"cdb411d670a094822c46ead81fc1c4f7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart","hash":"b9d74f9b99fed32e71f391bc43251c63"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/image_filter.dart","hash":"6c0e97a3b04c9819fe935659014f92e8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/debug.dart","hash":"f91c204772b990737d426aa342e5ce3b"},{"path":"/opt/flutter/packages/flutter/lib/src/services/keyboard_key.g.dart","hash":"0bb1765abb34abc2a47fe3b4ab7e952c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wlanapi.g.dart","hash":"30191f66ed437888e9e12cdc67d37c95"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/list_section.dart","hash":"66e664a7903e7ef16376d5da0990c24b"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/pop_scope.dart","hash":"0ff55be19444856c892e701c475b20f6"},{"path":"/opt/flutter/packages/flutter/lib/src/services/sensitive_content.dart","hash":"f0d920fb2a472e43514830b20d401806"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_tree.dart","hash":"3e7424af63611ddd2a2ee367b19cceaf"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/form_section.dart","hash":"9bc30281f42d8003b7f9d636ebc8bfc2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/LICENSE","hash":"80ae6870ab712d32cc9dff7f6174b603"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/setupapi.g.dart","hash":"9d0390331a2be3f7c018dab8bfa589de"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/capture_sink.dart","hash":"7c57a9163e2c905ac90a6616e117766f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jshort.dart","hash":"133db2e371d34eba2a099b23dac8123f"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Bold.ttf","hash":"4ac4426bc38f337534dfc45b3dbd9283"},{"path":"/opt/flutter/packages/flutter/lib/src/services/font_loader.dart","hash":"c143eccf02e75dce0fc0374a5324944d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart","hash":"defa8941435dbafe4929bee177080f2a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/util.dart","hash":"cf2b42c94ab97ce116e195500f147944"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechaudioformat.dart","hash":"f7b5a54fb6f6b69cc4234a97ce7977e8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/response/response_stream_handler.dart","hash":"87061e866d20d4a66d6990c36638681f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/objective_c_bindings_exported.dart","hash":"716937ebeb57a73eff86a6ac89e92e58"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/event_sink.dart","hash":"0907f33388d79d8891c360720626e13f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient.dart","hash":"983f9738507c43e2eee65120e25d0785"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Regular.ttf","hash":"e8e9648f5b8fc824da409750ff331221"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/lib/xdg_directories.dart","hash":"737107f1a98a5ff745dd4e3236c5bb7b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/circle_avatar.dart","hash":"cbbb174cb00bf954fdc9e2854517dbd9"},{"path":"/opt/flutter/packages/flutter/lib/src/material/slider_value_indicator_shape.dart","hash":"e18e561219f8b29210a94bf900b261fa"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart","hash":"ac08cb84358e3b08fc1edebf575d7f19"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/src/ffi_bindings.g.dart","hash":"2e4ed6d32990cc6890679bc3106091de"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/crypt32.g.dart","hash":"8898ba9f5064edff3e9fbc9889ba9dd0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptors/log.dart","hash":"eb60d218017b0432959e8445a36f4602"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dwmapi.g.dart","hash":"20290eb1c157dcb3947d9e5b420ea50e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/path_provider_linux.dart","hash":"b48ba72a2d5d084d297c3d78e351036e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/rotated_box.dart","hash":"46826fe180ac83f5855d6126ad250b81"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumnetworkconnections.dart","hash":"4e3b785e94de8470e198d0bda80e23bb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iunknown.dart","hash":"314ca45445509ac0635a48d2dacca294"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_pixel_buffer_texture.h","hash":"613a2389f2fda4d844e82e63b690a975"},{"path":"/opt/flutter/packages/flutter/lib/src/material/divider.dart","hash":"400da5c3ae6b8c8cf1ad20c796ce413b"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/proxy_sliver.dart","hash":"7fb663396d31aca31b7a334c16ef4392"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/devices_screen.dart","hash":"2267d435bbba85b69f2412f1f5abb603"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tooltip_visibility.dart","hash":"377fef989628d5fbcb306e46a03b7a12"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/inherited_provider.dart","hash":"dd618a65e1f3400d8224fedb42a1881b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/magnifier.dart","hash":"4d1ff14ea6d0400d5133c957327c6e7c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/types.dart","hash":"003f7e979253f87844d0f222365ef6e8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_content.dart","hash":"29d2a4744cad0979d4cfdcdc2c1a6ed4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/mergeable_material.dart","hash":"1f61ea833165dd95328fec8048e3748f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jboolean.dart","hash":"f3c87bba5ae0baea2e0768ad663e7e7f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/options.dart","hash":"2144f1538d27dd9b29dd135d74059120"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient3.dart","hash":"e65733ef6887a9505fca66a22d9e2887"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_extensions.dart","hash":"3a2d505268f5446e5f7694776b69b407"},{"path":"/opt/flutter/packages/flutter/lib/src/material/elevation_overlay.dart","hash":"850347f275e762abb4815331a90d704d"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/gravity_simulation.dart","hash":"44c1268c1ecafd3b4cd06ab573f6779a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iclassfactory.dart","hash":"adbacdd68acdd5e35ce91a3475a1be38"},{"path":"/opt/flutter/packages/flutter/lib/src/material/floating_action_button_location.dart","hash":"964f3ee4853c34a4695db0c7e063eaa3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement8.dart","hash":"befbfd864024e35cb6b7752f9b4ac4d7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation2.dart","hash":"c98cadb2fac8ead45ecaa10366da3ec9"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/magnifier.dart","hash":"628ba64f401791cd814866594f48638c"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/key.dart","hash":"111b2045668e10d749cc083dd245604b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/filter_chip.dart","hash":"8d61fc0dd67cdb21f5737b01fc9ad08d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/utils.dart","hash":"caf148b76c44a3f0f1bd6055ddbb8f5e"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_event_channel.h","hash":"f3234aba146e57eced1b9febac78a1ec"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_window_linux.dart","hash":"629277eb9d1322c02e50515c24f87796"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/selection.dart","hash":"cc4a516908b08edff4fade47d6945e5c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_subscription_transformer.dart","hash":"ca4cfb6538896636dc198e3b1c1c3ab4"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/consolidate_response.dart","hash":"48439fd6e1a77e0071c577162eb94b84"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/placeholder.dart","hash":"de70f8d5230b19a6392bc023daeab11b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement2.dart","hash":"4f061ba7ed2e408e218e0eb4375dddee"},{"path":"/opt/flutter/packages/flutter/lib/src/material/grid_tile.dart","hash":"9c169d41e4740bbc21d0ce33bc753119"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactory.dart","hash":"5d461db74d04d7e270d13a5a8a340796"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensordatareport.dart","hash":"d241941a5420f01b81ee47fc755f8123"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/win32.dart","hash":"018e93669d12c52b66204d139de58ef8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/multipart_file/io_multipart_file.dart","hash":"89d33d0234d19d3c731fd91e404d6a05"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechvoice.dart","hash":"38d7929920e46438585ed549abb3690a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/list_extensions.dart","hash":"9f8b50d98e75350b41d40fee06a9d7ed"},{"path":"/opt/flutter/packages/flutter/lib/src/services/text_boundary.dart","hash":"0da6092789967c98d5fab3dc750803cd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/aabb2.dart","hash":"f54f6b61b175b0a37d51ff3ac8b8c800"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/combase.dart","hash":"90ed8a12c97e362a162da690203df055"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/icon_theme.dart","hash":"1d8fa1cee64f2d791002749fabe23e2e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader4.dart","hash":"5a65f8839771af0fad5b2cf647703264"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/parameter.dart","hash":"08b1358e505b0414dc60489b750ba2b6"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/gesture_details.dart","hash":"eafe83db9186e4fbb802d857e4bb42ad"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_response.h","hash":"3373ee1d610372294796ae24f7b10b59"},{"path":"/opt/flutter/packages/flutter/lib/src/material/snack_bar_theme.dart","hash":"1ff0e15cf3e4acd3e21e2b6d06d5815e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_persistent_header.dart","hash":"a164d4a77d2efd34459161ef6fbc547e"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_html_element_view_io.dart","hash":"61d3c1705094ee0ea6c465e47b457198"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/magnifier.dart","hash":"9fac3c8d74250f84c6a7a9b977361526"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/os_version.dart","hash":"2598d2716efa8557be39441a6b1490db"},{"path":"/opt/flutter/packages/flutter/lib/src/material/dialog_theme.dart","hash":"4b929c56c22cb960d02d3ee518321a26"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jbyte.dart","hash":"d1a447c33fb026db3ec5e4b6ac445551"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/radio_group.dart","hash":"a4861b9dbdd74fa4b18e9612dcb67017"},{"path":"/opt/flutter/packages/flutter/lib/src/material/ink_highlight.dart","hash":"61b6c88f72d102ea23ea8f4980bf941c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/switch_theme.dart","hash":"bcc6b2f69e8bb1652c9c5e53d922a124"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iprovideclassinfo.dart","hash":"74801cb491652ec4ce96fe1f4646836a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/interface/platform.dart","hash":"d2bab4c7d26ccfe4608fe8b47dd3b75c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/async.dart","hash":"13c2765ada00f970312dd9680a866556"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/characters_impl.dart","hash":"c687544dd89d844861b88fe7d0fd095e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient2.dart","hash":"48f954e66b945620e43ce8e9a8891919"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/platform.dart","hash":"cbf041463d4a85115a79934eafe8e461"},{"path":"/opt/flutter/packages/flutter/lib/src/material/list_tile_theme.dart","hash":"94e111a116f1259b7b55b8164e696e08"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/curves.dart","hash":"a26946a98a8bfc9209bb398e12fa800c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechobjecttokens.dart","hash":"f87e5679793d9c81072018b428dadb8e"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/page_scaffold.dart","hash":"9f1933476583e3f4ec848d0eecdab927"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_selection.dart","hash":"43444d9cea3b1fb23702b78bdae3d126"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/scarddlg.g.dart","hash":"ff51e95e52fd4d789e71223942d5ae23"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/frustum.dart","hash":"fb2be6f27b32bb1ab12dd6aea8c5ecda"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/refresh.dart","hash":"028eb8497ffa66b6d051c09361dc19f3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/path_provider_platform_interface.dart","hash":"09b3f3b1ef14ce885c016f2eba98f3da"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dislike/dislike_analyzer.dart","hash":"052660a52f5ab94091182bccabab6f84"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_exception.dart","hash":"b062a8e2dade00779072d1c37846d161"},{"path":"/opt/flutter/packages/flutter/lib/src/material/constants.dart","hash":"2c6facdb1b63e687304c4b2852f6ef4c"},{"path":"/opt/flutter/packages/flutter/lib/src/services/undo_manager.dart","hash":"ab42b0e00d3e803c5eb7718da9102f68"},{"path":"/opt/flutter/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf","hash":"e7069dfd19b331be16bed984668fe080"},{"path":"/opt/flutter/packages/flutter/lib/src/material/search_view_theme.dart","hash":"1774b5cc51e5b3d7704fbe63c3cd1985"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/src/jni_flutter.dart","hash":"c60f0503c7dc9addd109be4c44197758"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/LICENSE","hash":"22aea0b7487320a5aeef22c3f2dfc977"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienummoniker.dart","hash":"3e2ba5ba60ae123aa45ccc5f07eb3ae8"},{"path":"/opt/flutter/packages/flutter/lib/src/material/icon_button_theme.dart","hash":"d74d8acd1490e1db907df61d756d2c71"},{"path":"/opt/flutter/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart","hash":"6b932fbee67279fdc28710c00c4251f5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/selectable_region.dart","hash":"8baa16f040a8c1e6050bdcbddec77bd1"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/localizations.dart","hash":"ad1b8863662e29dfcd8c46937a051e47"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/geometry.dart","hash":"25ab687c42ed09258bab05f1340c85a2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumwbemclassobject.dart","hash":"17399c5876a7f1c340f8814cbc903b10"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding.dart","hash":"5f5c07df31f7d37780708976065ac8d3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/future.dart","hash":"443fe4357544b85c13ef051cf37a602f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataimport.dart","hash":"754560d00f3c24825e656e9d7e03fd6a"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_window.dart","hash":"9dbf7549314e02e7c6d6a89518fd9da3"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/texture.dart","hash":"7c07d5cc739ae29abcfbf6343ae84fdf"},{"path":"/opt/flutter/packages/flutter/lib/src/material/drawer_header.dart","hash":"d857a3ae7f599cc71f41689ffcf1fc5b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/accessors.dart","hash":"359d022c7d5a59692d34bb2d5eed6736"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/stretch_effect.dart","hash":"3ffe97664671767f0684bca718f87933"},{"path":"/opt/flutter/packages/flutter/lib/src/material/stepper.dart","hash":"4e11c9897fbb75f22b4174714f1d3b5b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/jbyte_buffer.dart","hash":"3b16ecdd5d54828bc025cb734031d11a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/bthprops.g.dart","hash":"0b9138f9bd3068b518494cfee8627cec"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/container.dart","hash":"e312c10771b7db805d099bfd1b3b3a77"},{"path":"/opt/flutter/packages/flutter/lib/src/material/expansion_tile.dart","hash":"0f9160c918775918ca4125fb56a0745c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement6.dart","hash":"92985c94a9a966b97c156c06ab2d5195"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/context_menu_controller.dart","hash":"c3ccb5b6cd3df44e6587a4f04dd6a4e7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/opt/flutter/packages/flutter/lib/src/material/shaders/ink_sparkle.frag","hash":"a0e89676ccae6cf3669483d52fa61075"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_ro_typeresolution_l1_1_0.g.dart","hash":"873f842bb40bf6525129af58dab2e62d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllink.dart","hash":"7132bdf47eb7567294754da6caddbe14"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiostreamvolume.dart","hash":"a88c6c3bfbfabb9924b6b0c3475f45b4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/encoder.dart","hash":"dbf4f1e95289bc83e42f6b35d9f19ebe"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/two_dimensional_viewport.dart","hash":"66d70bd46691ffbdfdc1ef61c5d6e7eb"},{"path":"/opt/flutter/packages/flutter/lib/src/material/date.dart","hash":"7accd5863285ca277c480018afad3eb8"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/basic_types.dart","hash":"2346472ec1cfdb77f3b27d3b7af72d4c"},{"path":"/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart","hash":"276915f1b5ecce2bf8c85fb481b16ce4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/page_transitions_theme.dart","hash":"2d5e9b41577a40b16b9f1074559816f1"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/overflow_bar.dart","hash":"cfb61d270b5fd59883e78db473f61c63"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_error_l1_1_0.g.dart","hash":"ef5d77a8181065ceb0e93986c1a6f6ba"},{"path":"/opt/flutter/packages/flutter/lib/src/material/badge.dart","hash":"6557aef6a85e5d4654858519c444caaf"},{"path":"/opt/flutter/packages/flutter/lib/src/material/slider_theme.dart","hash":"197e0bdac864b608f8df9343bff42c56"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/path_provider_windows_real.dart","hash":"43f4676f21ce5a48daf4878201eb46bb"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/layout_helper.dart","hash":"1fd7c932679011d491315ff136d13822"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechbasestream.dart","hash":"1632b8b538a5115973c424adb5380d7c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiorenderclient.dart","hash":"64708122ad6cca0c23373706cdb72c03"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumstring.dart","hash":"68e28643e39694f628939978acdc52f5"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_fill.dart","hash":"c52118bfb808141cd29053111cb4d515"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_application.h","hash":"5774eb642609ea54649f5a74272b973f"},{"path":"/opt/flutter/packages/flutter/lib/src/material/navigation_bar_theme.dart","hash":"a1a359194e7620ad40fddc66cb85991f"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_persistent_header.dart","hash":"8a88537f4d76dd43cffcf701cf721684"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/stack.dart","hash":"72d1f208f4adde52814c8a5f5073e1d5"},{"path":"/opt/flutter/packages/flutter/lib/src/material/popup_menu_theme.dart","hash":"1ea83bab0c02287274cb6fa619276461"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Bold.ttf","hash":"4ac4426bc38f337534dfc45b3dbd9283"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_form_field.dart","hash":"0fef84aa40fa7151b16773c989436906"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme.dart","hash":"81cd0b075cd4d742a83ed1a6f4f801f7"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/binding.dart","hash":"62eccb12187c7568100082c2c68cc80e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jnumber.dart","hash":"46483f14160b780c8d1ae008588c50bb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/LICENSE","hash":"7b710a7321d046e0da399b64da662c0b"},{"path":"/opt/flutter/packages/flutter/lib/src/semantics/semantics_service.dart","hash":"0a47798d6fcb1f1405a41d411f8d3904"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/LICENSE","hash":"aca2926dd73b3e20037d949c2c374da2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialog2.dart","hash":"ef41b02d4257a466a4a68f493052b543"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/rounded_rectangle_border.dart","hash":"6a933aefd0d694655ccf581f3b6a10d9"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registry.h","hash":"9093dc992b7f0c62c899bb5ee75437bb"},{"path":"/opt/flutter/packages/flutter/lib/src/material/switch.dart","hash":"f290c1e0054f0f62b6f2f869eafa9832"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/protocol_builder.dart","hash":"c38ed97cbd3046f5121ed48013ee2de6"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/activity_indicator.dart","hash":"9d1dec6bb0fab1fb585b284602119921"},{"path":"/opt/flutter/packages/flutter/lib/src/services/predictive_back_event.dart","hash":"0f149fe7bdb5da4db890f754f0b61106"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/devtool.dart","hash":"2d7d80b5c908559a133f8729b6e755c0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtransformpattern2.dart","hash":"10ee0ac3bc045cf4344c623f4396d941"},{"path":"/opt/flutter/packages/flutter/lib/src/material/date_picker.dart","hash":"99d1f4cb706591fe7a31738812c0fe76"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/expansion_tile.dart","hash":"5509610a155be37996ee5799e5d90054"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_string.dart","hash":"097e09840cc00325fdbebaacd05f4827"},{"path":"/opt/flutter/packages/flutter/lib/src/material/drawer.dart","hash":"652a6288543f2bc08686d0a50a25c5a5"},{"path":"/opt/flutter/packages/flutter/lib/widgets.dart","hash":"96cee9b6626cdcbe0ad267ac132da66f"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/icudtl.dat","hash":"018361032ba13dfeab636138ab6b9831"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/typed/stream_subscription.dart","hash":"63190b810e77cfebf3de760baaf59832"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/sphere.dart","hash":"ff5d66c50ec833a263625d39f0c195b9"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture.h","hash":"d1894650bbfe9ba65c6f0b195645a9a5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/fused_transformer.dart","hash":"4cbacf46dc43afb0d059b0016010f45b"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/fractional_offset.dart","hash":"e7b2de136a99cf5253477d4fb4138394"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection.dart","hash":"ff565d45008178eb13b96938f28b4a6a"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_channel.h","hash":"de7b99c808de5c710ade00638cf7e484"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/util/consolidate_bytes.dart","hash":"b4446a7a4d053aaa35a7bc6968b4794a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/block.dart","hash":"ff12dd93989e4929d1f2e1bf36c45978"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/overlay.dart","hash":"d247a0c0b654da167455f82c698f33a9"},{"path":"/opt/flutter/packages/flutter/lib/src/material/ink_decoration.dart","hash":"a2ab6e0f334e5a28af29766b82f7f4b0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange.dart","hash":"46d014f5f4ff404b81098da9b003b770"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/span_scanner.dart","hash":"87bcefcfff19652ad296ec7005799840"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/dismissible.dart","hash":"374eaa57fc86cb64b404b2b0d58a29c1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumspellingerror.dart","hash":"4454497beed7948ccb9d6987d52ff3fd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/subscription_stream.dart","hash":"c23f15393091087663c2613f18f0e9a4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/error_helpers.dart","hash":"c83781cf0c38883486f707cddbb96773"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/inline_span.dart","hash":"726c0993a6dabdaa3fa45dedf0879ec2"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/lsq_solver.dart","hash":"b5de1f949ff3417a3431134e5d079501"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/win32_wrappers.dart","hash":"af7270fd3861278053b1c45a7b66ece3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location_mixin.dart","hash":"6326660aedecbaed7a342070ba74de13"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/chunked_stream_reader.dart","hash":"3f719070987790d062d9ec084da306a9"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver.dart","hash":"3bb7d9563c19a114b75692f523692c1f"},{"path":"/opt/flutter/packages/flutter/lib/src/services/system_navigator.dart","hash":"0db5f597f1cc6570937e6c88511af3a9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/LICENSE","hash":"3d853fa9263f8487dd82234ed6b56931"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/async_memoizer.dart","hash":"abcb2d6facc18b2af070cb86cbb1c764"},{"path":"/opt/flutter/packages/flutter/lib/src/material/material_state_mixin.dart","hash":"30d33b62cb130ee915b1ea00d4cc8770"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemrefresher.dart","hash":"5026f3bc8f63a10ffb208a35e304f40c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechvoicestatus.dart","hash":"5164e5af0ccfe7dbe777bb588e91c937"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver.dart","hash":"e9af17b4e411063ffb05ffc2957a03eb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellcheckerchangedeventhandler.dart","hash":"0e619c36f088b986b65eadb12698abb8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_window_positioner.dart","hash":"604e6af89d74eb168b774a7230c3e8ad"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/texture.dart","hash":"cd6b036d4e6b746161846a50d182c0b5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/primary_scroll_controller.dart","hash":"a47062dc6143c80c485bcfc7a06b9490"},{"path":"/opt/flutter/packages/flutter/lib/src/material/switch_list_tile.dart","hash":"63e70e1cd594d6a19cc73f96f6ce5106"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/shortcuts.dart","hash":"4ddaf31fe407d8638b1890232e13a25c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/ink_ripple.dart","hash":"e5df76e519cf2f875fd79e155c57bd06"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ichannelaudiovolume.dart","hash":"623a5dbc96b4107a93ef35eb90184bb9"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tooltip_theme.dart","hash":"7e538b36807ae78fc28f2bc05e12bc9f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/LICENSE","hash":"d26b134ce6925adbbb07c08b02583fb8"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_button.dart","hash":"0364167ab22e2111b4bffaade82a9a5d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/objective_c.dart","hash":"88ede24ef082c08a9ffec61af76d3fcb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdroptargetpattern.dart","hash":"45a4d78a037bdf56e5eb45d75298ff84"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationexpandcollapsepattern.dart","hash":"8d6e1950b64962d48ef050d9517791be"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isimpleaudiovolume.dart","hash":"a064bc8b49ee4e47fd7b996364a8469e"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/ink_sparkle.frag","hash":"0615f9d831d9b19a15b6926d9babee1e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jdouble.dart","hash":"8de389ed114ae56e2ca650fbbcd35f34"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_sysinfo_l1_2_3.g.dart","hash":"3d2b72757d0604ae307bd71ceb16f6c0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialogcustomize.dart","hash":"859de35a02fbe705941f97e7700a3147"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/version_check.dart","hash":"feb9d01ea95c554272c3263d1b5f840e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/cancelable_operation.dart","hash":"fd25090c21947bb10aa8adbffe5fd89c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iconnectionpoint.dart","hash":"96c9d801d1879091246f0b107ee4147e"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/eager.dart","hash":"07664903d8026f2514b29b786a27f318"},{"path":"/opt/flutter/packages/flutter/lib/src/material/menu_button_theme.dart","hash":"7b92ff089e3134f9e8faae3b59904d68"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessioncontrol.dart","hash":"405ff2b0c110ef10a33e496bf7db38a1"},{"path":"/opt/flutter/packages/flutter/lib/src/material/user_accounts_drawer_header.dart","hash":"2cab0fd3371eda12d245ae61520968b7"},{"path":"/opt/flutter/packages/flutter/lib/src/material/button.dart","hash":"8785ac87221ffbf5141f86f036485c83"},{"path":"/opt/flutter/packages/flutter/lib/src/material/card.dart","hash":"aa5c065cba8ec5bc2661a21dc2c2f993"},{"path":"/opt/flutter/packages/flutter/lib/src/material/ink_sparkle.dart","hash":"205f24685f1669261184020365b9bbf4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/autofill.dart","hash":"3623c605586d2e37af23d6b746721bd7"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/box_fit.dart","hash":"954effbd324f486a6948427c605454e8"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_group.dart","hash":"cd833d6eed509d1c14d211617711d1fe"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/form.dart","hash":"8c255d57790144e3a4b5b5f6745b2151"},{"path":"/opt/flutter/packages/flutter/lib/src/services/asset_bundle.dart","hash":"cfb91c94dfc4325fab4efadc1a015c41"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersistmemory.dart","hash":"cdc3ed60fc9f8d6e2fd72afef2012bda"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/switch.dart","hash":"c9261ab1d6e9b9e89db9833ddc5aa19f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxpackagereader.dart","hash":"59137da0b55aefe8a4074891792a55b4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/async_cache.dart","hash":"1f65c98a00f4c2151338f0d803b2d1c6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/result.dart","hash":"4b6bfd3301413140ecdae9fd2f3db0ac"},{"path":"/opt/flutter/packages/flutter/lib/src/material/choice_chip.dart","hash":"47975fe20ffb61d407334c0457193267"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/flutter_logo.dart","hash":"985cf5499dc6e521191985f55245a22c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/line_scanner.dart","hash":"168bedc5b96bb6fea46c5b5aa43addd1"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart","hash":"a2eb984b374f7375264ed4b139a0eb03"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/app.dart","hash":"dedf82956e9759fe82ab3f6feeda6e1f"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/stretch_effect.frag","hash":"5cd1085a16b9c9c707d90ef04d1d2eca"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/lookup_boundary.dart","hash":"289f29d29a1cd99e613fb2db28fd4c9c"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_gl.h","hash":"3a535810e25ecd4fd017a2eb197dab30"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/callbacks.dart","hash":"b020749262d0d602700cd21e6f41acdb"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/placeholder_span.dart","hash":"d2386b256656121d501a16234b008e2b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/jni_bindings_generated.dart","hash":"ae166113e6ff5a842f58d22d959a82f7"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_selection_toolbar.dart","hash":"047806e35e0477a74cffde49298053ac"},{"path":"/opt/flutter/packages/flutter/lib/src/services/platform_views.dart","hash":"439c7538ce74c42e42e467bf8ff98425"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/cancel_token.dart","hash":"254c9535d3cb04c28db0c51ada73e6fb"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/theme.dart","hash":"4b46d86d9fee45718ce7a32c8f86a78d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/platform_view.dart","hash":"b7129051af0bcfcc53ee81e85a32965b"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/animations.dart","hash":"0ba31d7bca2b02f2d402d0a32ba82fdb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_fruit_salad.dart","hash":"0663e41383137de0068cc7a8bd70f814"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/glyph_set.dart","hash":"62d88517fa4f29f5f3bcec07ba6e1b62"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatatables.dart","hash":"02b96169889bac260344fa44343235e2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/dynamic_scheme.dart","hash":"b7c07fdfc8aaa762f93fbaa316f728b7"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/page_storage.dart","hash":"9b656f8503d82485bb3f18a7955ec9ed"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/beveled_rectangle_border.dart","hash":"8c99d8b45f6168b37807bf3612dea2f5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/annotated_region.dart","hash":"3bc33c65fa44a57d13430fdedef82bc2"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/clip.dart","hash":"dc2cfe4408f094916cd5eb1d294d1f2f"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_method_codec.h","hash":"dd8da806243743ff943e6de062ddaa3d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/triangle.dart","hash":"2083695b7b9150b87307af446032ba45"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/variant.dart","hash":"8dea906a9b8773920b6d1ccea59807bf"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersist.dart","hash":"a1f73c43919636da8b8f9a657ca8cc14"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/strut_style.dart","hash":"c9b2ccb35693a25ba607af45095b9379"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/parsed_path.dart","hash":"cb454929d7810d3ee5aa5fc28283d3fd"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/listener_helpers.dart","hash":"4407eb682dc29df64ebb018882d6abd1"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/preferred_size.dart","hash":"dd518cb667f5a97b3456d53571512bba"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_resizing_header.dart","hash":"984ff1fd96c3f4a1abbfe74d1220aa2c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2/LICENSE","hash":"83228a1ae32476770262d4ff2ac6f984"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/macros.dart","hash":"8016baf49ccbce205455e3fc0bddbb17"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/decorated_sliver.dart","hash":"4b50828d394e7fe1a1198468175270d9"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/upload_response.dart","hash":"e4c75b2d0551a65805ca6e22754c1ce9"},{"path":"/opt/flutter/packages/flutter/lib/src/material/data_table.dart","hash":"4f34fa1132209ba8e3dbf36731258292"},{"path":"/opt/flutter/packages/flutter/lib/src/material/typography.dart","hash":"b2dafdeebf7eed3a1e8755cfbf0c686f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/primitive_jarrays.dart","hash":"a1552b07a3b92bad881c4ac6c55229e9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationboolcondition.dart","hash":"7d8e8a43fd286d637f95a0510b0d3c84"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/allocation.dart","hash":"9d62f4f58e8d63a8e106a1158eb13a02"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader7.dart","hash":"a60dd773b7d69b347521fb64257f9397"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/winrt_helpers.dart","hash":"8a032ca2b66b8be21ce8368f80406db7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/utf16.dart","hash":"10969c23d56bc924ded3adedeb13ecff"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/tap_and_drag.dart","hash":"0834095165faaf3159b7ad67491ecfa4"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_tree.dart","hash":"f7a9d7bb4762996384779d76157a1748"},{"path":"/opt/flutter/packages/flutter/lib/src/services/message_codecs.dart","hash":"05140f857239a46996c20c38f4dbef98"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/utils.dart","hash":"b072cbf89d933994e62e5dcd85904f89"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/folders.dart","hash":"4bd805daf5d0a52cb80a5ff67f37d1fd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/types/base.dart","hash":"4c5be09400366d46c996eda73c757b0c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart","hash":"21b24537307b0b75d64fab66a4b350af"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/pointer_router.dart","hash":"16a11ca4ee0e19c4e7cf6a836d60de2d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdeviceenumerator.dart","hash":"8a2e692d7adcf4c9e0bd0f85979ab7c5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_configuration.dart","hash":"5b98d0be4d89f1274c832a4c340ab315"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/constants.dart","hash":"fde764079e487d7b96f027bfdf61bb7d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationobjectmodelpattern.dart","hash":"93fd05191baf9bfae1ae604f67d953b5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style.dart","hash":"bfb39b98783e4013d9fe5006de40874d"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart","hash":"eff02fe00abad264a865c89da94e4005"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_list.dart","hash":"5b894ae18be3e2442a34288833184ca9"},{"path":"/opt/flutter/packages/flutter/lib/src/services/text_editing_delta.dart","hash":"826c2e0a5a8211c0f0d2a0d19803b4ed"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart","hash":"798989e92f7ba4de9f6d45808101f189"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/context.dart","hash":"daeb052f1089d4e84d8a22acf56c1da2"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart","hash":"a79a6f9bb06c7d6dc5fb74ac53dce31b"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/localizations.dart","hash":"f1d94030012592505145c628671861d4"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_response.h","hash":"3373ee1d610372294796ae24f7b10b59"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_event_channel.h","hash":"f3234aba146e57eced1b9febac78a1ec"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/exceptions.dart","hash":"0400c53ca2e9230b51a6f361146dee28"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestapplication.dart","hash":"bc01545a1cca050f2067c0b6163a4755"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumnetworks.dart","hash":"6e3924fcfcaa29ba9146915e7603139c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/types.dart","hash":"4a1d1bdbd4e9be4c8af1a6c656730a66"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/lang.dart","hash":"7e3f918d0bfe4e1806f1187481eda29c"},{"path":"/opt/flutter/packages/flutter/lib/src/scheduler/service_extensions.dart","hash":"f49291d1bc73b109df4c162db10003d2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/constants.dart","hash":"0672d853d5097a03eddc7dbe558eeabd"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_delegate.dart","hash":"e00aa922e9852c68ae0a3ab71b56b76a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/autorelease.dart","hash":"d2e52e362068fba5e3f86800ddf3cc91"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/colors.dart","hash":"91415e155a6a2c0ac6474ed39291981e"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/image_stream.dart","hash":"3e15bcf27cfff32359281a7f8a54793d"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/text_span.dart","hash":"5516e0e69ba934c2d98aa4b80313d3ee"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/src/typed_queue.dart","hash":"d6f045db9bd5b72180157d44fee9fbfc"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture_registrar.h","hash":"455c45888f33294a5054d8adacac5a2e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/error.dart","hash":"24f4c1f9d4faa90ec4fc8ffa787c765a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/byte_collector.dart","hash":"da767bceadf4951a2fd2ecc70270f6cb"},{"path":"/opt/flutter/bin/cache/dart-sdk/version","hash":"215923581f8fcce0029639f7ab16ccb6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/boollist.dart","hash":"206ef1a664f500f173416d5634d95c8b"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_engine.h","hash":"1b028c1fa72fa880b3f8ceb15c1c69df"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http-1.6.0/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/term_glyph.dart","hash":"1adcc56e3affffb23739c7c9d8a5fca0"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/drag_target.dart","hash":"830fbc0f28ce5a63aa25787561899965"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/netapi32.g.dart","hash":"242d63b96e4a26d3b557a32d0a008a4a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader.dart","hash":"0a9121d736af630bee92bd8372e06916"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_binary_codec.h","hash":"5997440e26e079541337c498925226f1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtableitempattern.dart","hash":"0c4386f8def5b3a82bf0b70090830314"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/objective_c_bindings_generated.dart","hash":"c6c6134ec784866fa9791b6949b84805"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/http_date.dart","hash":"fb76e9ed5173ac1ae6a6f43288581808"},{"path":"/opt/flutter/packages/flutter/lib/src/material/material_button.dart","hash":"23355f2294efaf61097a840be90b1601"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio/dio_for_native.dart","hash":"6f053637ded96c67b342e6a80e7372f3"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/bitfield.dart","hash":"b833268059d869425873716cd9d52c2e"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_call.h","hash":"1187bb4f46363e874137ce4f71356e8b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_io.dart","hash":"40151b26bf83a0a4591b78c88f9c6c8f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/palettes/core_palette.dart","hash":"5a11d4662fc61ed2bd835a4e6bb0f47f"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/tween_sequence.dart","hash":"101d2ab579994adec5b69ad673fb590c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/material_state.dart","hash":"1fd20eb0ca5f3a61e875f2ee00f67144"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_ansi.dart","hash":"d30eba29d046c1a8b7f029838de6e49f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestapplicationsenumerator.dart","hash":"a0c11bb2957ee28a1de2145cc233367d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/app.dart","hash":"c8a3c405dc9f4ba3731474612804e852"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/performance_overlay.dart","hash":"bfc62c88426d88b462e72fbfe7a708d0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/collection.dart","hash":"4ba0a4163d73b3df00db62013fb0604e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemconfigurerefresher.dart","hash":"0502dbd75b5b023cd08bf81003a77889"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/service_extensions.dart","hash":"7abc7e5212374d29bfe5372de563f53c"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/banner.dart","hash":"dcaec92dd6aef9e30b2953654f886174"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/advapi32.g.dart","hash":"e1c4eba9ccd9a12c58e4e531e73fcc32"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/text_selection.dart","hash":"c7d963cc4ee52d6c44c25b9284e56034"},{"path":"/opt/flutter/packages/flutter/lib/src/material/range_slider_parts.dart","hash":"ddb9aa377d0d4747f72a44151ecbeb4e"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/transitions.dart","hash":"89f81dc269f6a03913386c1bdfc5387e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/jbuffer.dart","hash":"1a1718d3591a292ec85b4c24e55ce2c7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/selector.dart","hash":"6a72a2ba15880cab1e1d9a28a94f1a2d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_expressive.dart","hash":"13b2049dce60861c73d20ad96c34da30"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tab_indicator.dart","hash":"5525aa2ecd8d1f60485dacb8fbe8a138"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/viewport.dart","hash":"b0787d1088dcdcd81c2e947ee55baeab"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcondition.dart","hash":"0469c2fefb6084f264cd0df8bce7263a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix4.dart","hash":"ae36c7cc9b21f98bedf401f2d67a0fd4"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NOTICES.Z","hash":"9b2ccc81f23f1981a644ac79809c9ac2"},{"path":"/opt/flutter/packages/flutter/lib/src/material/date_picker_theme.dart","hash":"cdebb0d2ea2f3cf1619df56f9eb04851"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/adapter.dart","hash":"0b4e4af3db577e11f801b762ea734d87"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imodalwindow.dart","hash":"3cafeafccdf2688fe36789f31e671cfa"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_ios.dart","hash":"1303bc77ad63625069f2d23afc73f523"},{"path":"/opt/flutter/packages/flutter/lib/cupertino.dart","hash":"67c56d37e569aa8cb27aa1bf7d7a822e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/src/path_provider_android_real.dart","hash":"7ec9fc4b8ff24efcfb105532f000156d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_queue.dart","hash":"fb5bf096bb76594eaceda019de6559b9"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/dual_transition_builder.dart","hash":"c06267b6c315a5e40f28feb6019de223"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_call.h","hash":"1187bb4f46363e874137ce4f71356e8b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/winmd_constants.dart","hash":"16115596ace5bc18b10c61743655c625"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_standard_method_codec.h","hash":"dd8da806243743ff943e6de062ddaa3d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_shared.dart","hash":"c2f30f0829e63ccf0449de5982e324b4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/dropdown_menu.dart","hash":"acfac5418c65480ee0feed3aa27aaed6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider-2.1.5/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/headers.dart","hash":"12ada90523ca5fc00e317c0a59889a1c"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/binding.dart","hash":"511182ead6f28a87578adc604db46062"},{"path":"/opt/flutter/packages/flutter/lib/src/material/bottom_app_bar.dart","hash":"0457707aca07f1036f0cba80b59ea642"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_map.dart","hash":"13c9680b76d03cbd8c23463259d8deb1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/comctl32.g.dart","hash":"f203522611d9d5ac9047af433e7f84f3"},{"path":"/opt/flutter/packages/flutter/lib/semantics.dart","hash":"4b784d6e4f290bd6d5a1f38bfb5701d8"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/notched_shapes.dart","hash":"f41f7bc60228c1f5e5f8396b109db45a"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/_capabilities_io.dart","hash":"faf4d014b3617ede3150f80eba25e3b4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/focus_traversal.dart","hash":"d9a9336b999b4a7a5c6a0d65c667cd25"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/src/path_provider_foundation_real.dart","hash":"ac01cea599146293f3f31bf7e74f20ba"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/restoration_properties.dart","hash":"a8fdf31698b305c9fdad63aa7a990766"},{"path":"/opt/flutter/packages/flutter/lib/src/services/system_chrome.dart","hash":"9ee412cbebde65f62b846747551353b0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/test_api-0.7.10/LICENSE","hash":"3323850953be5c35d320c2035aad1a87"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/relative_span_scanner.dart","hash":"b9c13cdd078c3b28c3392f0d6d5d647b"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_windows.dart","hash":"ca2e098cce59851623bf60c022a3bad1"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart","hash":"c92c32d099e6d1129d56651e60b3c970"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_grid.dart","hash":"f58b3c8d0d7f8f612d9652d5966e3d93"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationlegacyiaccessiblepattern.dart","hash":"15639b799e4dbb06ffd538d943964d19"},{"path":"/opt/flutter/packages/flutter/lib/src/services/system_channels.dart","hash":"933d80a874136d25f5800bf0e6ba1782"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/segmented_control.dart","hash":"5ff1193cb6a6365b16c4c6a2c95ddc0f"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_dart_project.h","hash":"1ddbe3c8a2821804ced450e37fa9701a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/input_date_picker_form_field.dart","hash":"080e8a3ae01f3eead32b1b4a8c1b802f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcacherequest.dart","hash":"15ee18405ccd7752c3035b2f3b86e49f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/typed_stream_transformer.dart","hash":"86e0f9e302f9ac959626122751b65361"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/irunningobjecttable.dart","hash":"dfa3a8605c6665c94b8ca2bd43827718"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader3.dart","hash":"e97932f0cef53e2c018203ac3cf1c7e4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispvoice.dart","hash":"a47b8729b72b77cd6b5716ed37807a11"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellchecker2.dart","hash":"03b20b9fede21601f0b3d0f7ef4ce25f"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart","hash":"efd151d7ab87c07643197b8e613f515f"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/flow.dart","hash":"191565a7addf3cba1da445c58705b009"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataimport2.dart","hash":"cb23738bdb6f2e8319ba8e9dac0072ab"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector.dart","hash":"1205ed5e14a59c237c712b8a495b1981"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/async_provider.dart","hash":"3a2d20718f772fbb710aec7dc5e0bf80"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterable.dart","hash":"67d16e841606c4e5355211fe15a2dbfd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclientduckingcontrol.dart","hash":"21ee375f5cb7acd3bec0129fba2839ca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/future.dart","hash":"18c04a8f8132af2c1b1de5af6909025c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/range_slider.dart","hash":"ef893c4a76c4ba417c3036fc04b1884d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/implicit_animations.dart","hash":"63d065a22a507aceefefd60a1a974702"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set.dart","hash":"0073f703be7f7ddbd7f04d1b740f35c6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation6.dart","hash":"a878c551495aae9f415d298f162fd19e"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart","hash":"c7f21a9a0e981a1a2f64967b88e7b9b6"},{"path":"/opt/flutter/packages/flutter/lib/src/services/scribe.dart","hash":"d195153a8c01a0392b38e3b9adc672d8"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/node.dart","hash":"3cc7ca2c5b351839e051a2081db1e518"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_result.dart","hash":"592fbd715117ae860b51b29d0be0bd50"},{"path":"/opt/flutter/packages/flutter/lib/src/material/filled_button.dart","hash":"b5239ed932a8e07cd9f8b88bbd657c34"},{"path":"/opt/flutter/packages/flutter/lib/src/material/outlined_button_theme.dart","hash":"b09ffd962fcbee7d3403b54155e33047"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector3.dart","hash":"d4252f423175e5c21fca23dc24154b84"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Light.ttf","hash":"e1718753611a1da034b7e80ecc1523be"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/animated_size.dart","hash":"d5b85bf5a80f6a558d35bc1e78b52969"},{"path":"/opt/flutter/packages/flutter/lib/animation.dart","hash":"29a29ed9169067da757990e05a1476ee"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/libflutter_linux_gtk.so","hash":"d56f9d39acd6536c7790644265e05259"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_pixel_buffer_texture.h","hash":"613a2389f2fda4d844e82e63b690a975"},{"path":"/opt/flutter/packages/flutter/lib/src/material/grid_tile_bar.dart","hash":"6e1e2b759eaa87782ffc095f63397f64"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfactory.dart","hash":"93d835e43f33ca5ed96e6e85a392c1e5"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/text_field.dart","hash":"c866f935afe5faebf5f7d0cd4917e19d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/widget_inspector.dart","hash":"509f2c25dc858782ef48cc429a29f7d9"},{"path":"/opt/flutter/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart","hash":"b1df02ed1e7f5c71fd279c16aa2a21ab"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/context_menu.dart","hash":"ef8371089f4cc1fbea6da74606c8e564"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/default_selection_style.dart","hash":"bbc9542eb5e3c4701c24bc1268b8165c"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/colors.dart","hash":"0b3ae865c8e82bcd0c94aa60cdd8237f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellservice.dart","hash":"b92ed7d96a5284441953017edb47f285"},{"path":"/opt/flutter/packages/flutter/lib/src/material/input_chip.dart","hash":"6d29878fbbbb34a803ced8225d4f2bed"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/hct.dart","hash":"d75fe23c75429021b8f7fe4e57ac5d49"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/version.json","hash":"8e97ac0cb0ec426b310c4c786d1c5b86"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/colors.dart","hash":"c517fb54b3d66b22988ad7c8d07c6f53"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart","hash":"900a13c9fcd73f4e8e3d069d76af6ffa"},{"path":"/opt/flutter/packages/flutter/lib/src/material/arc.dart","hash":"6b1954d3a1480a76571eb52afa41f199"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart","hash":"7bd8137185bc07516a1869d2065efe0d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitem.dart","hash":"6e25bd87f1ef3a06c65b27f722fff88b"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/page_view.dart","hash":"03dd25f473fa4b1980db9b597de670f6"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json","hash":"c19077b477619ef0e7d127e56e0d1007"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/nio.dart","hash":"dd4b0b0cda09094ced3081f462b2d422"},{"path":"/opt/flutter/packages/flutter/lib/src/material/desktop_text_selection.dart","hash":"85e913a1404f00fc89ee0b9773317d54"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/gradient.dart","hash":"32575e570d214364db925e4918a04500"},{"path":"/opt/flutter/packages/flutter/lib/src/material/scrollbar_theme.dart","hash":"8ecf58b48b40f7eb7a04ba10c81f353f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllinkdatalist.dart","hash":"a82741847c5177c47adfd428a1583744"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/page_transitions_builder.dart","hash":"039956723e2a465ee97b91a8cc3799b5"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_engine.h","hash":"1b028c1fa72fa880b3f8ceb15c1c69df"},{"path":"/opt/flutter/packages/flutter/lib/src/services/process_text.dart","hash":"598058bfec9b621a07d61d1419787c1f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/obb3.dart","hash":"54c7f23362a7e78be04b113d00022090"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_set.dart","hash":"9cb135b4df76771b089723184d1833f0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_l1_1_0.g.dart","hash":"5764fde6a5cfb0402dca339562afb9cb"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Regular.ttf","hash":"e8e9648f5b8fc824da409750ff331221"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_vibrant.dart","hash":"65e61fbb4fa10372b84edf9b3a226e3e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/dynamic_color.dart","hash":"e0469000d5e6f512d2fccfd97145c727"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer.dart","hash":"3ae05205e5843fd41cae41c823dd7679"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_view.h","hash":"e27fc7ec7888b59ffac04a45e4461699"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/rometadata.g.dart","hash":"87ac4b62f17065d7456bfb6f6ec0a624"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location.dart","hash":"fb2c02d4f540edce4651227e18a35d19"},{"path":"/opt/flutter/packages/flutter/lib/src/services/keyboard_inserted_content.dart","hash":"4c5df57cfe2a6a2bc0d7462330344982"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/path_provider_windows.dart","hash":"38dc31b8820f5fd36eedbf7d9c1bf8d9"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/recognizer.dart","hash":"c358d65ccb12065d232ee04407587093"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_message_codec.h","hash":"4e0c2c7002baf140a95f0067b781d498"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/core_bindings.dart","hash":"7f4803fefd76d9acc343598ff82f512a"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/stack_frame.dart","hash":"95c608f9528d0d3f36b8ff9cec35bbac"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/simulation.dart","hash":"0fbec63144acf1cb9e5d3a3d462e244b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtogglepattern.dart","hash":"3796ca959ef2c6e4bfd668640a318ad1"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/unique_widget.dart","hash":"b04a361a766520af113824c641fe0b43"},{"path":"/opt/flutter/packages/flutter/lib/src/material/carousel_theme.dart","hash":"8ff8cdd18abd75bc3cc1e610527a7147"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart","hash":"ba33c09d125e49b38bed2a07d832a376"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iinitializewithwindow.dart","hash":"0748bf03bcf37edd1d571959e45a5cc0"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/platform.dart","hash":"28ec22be01a2fd01108deacc1c9378b5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/status_transitions.dart","hash":"59b6b74779849bf5b836b84bb362b99b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuri.dart","hash":"ed8502a630b1e3004b3e0469816899d7"},{"path":"/opt/flutter/packages/flutter/lib/src/material/selection_area.dart","hash":"ed28f6ca17f72062078193cc8053f1bb"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart","hash":"2ad27cdee5e6fe69626594543bd0e7c4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/will_pop_scope.dart","hash":"777aca422776ac8e4455ccc7958f7972"},{"path":"/opt/flutter/packages/flutter/lib/src/material/material.dart","hash":"a959a773128402fbd1ba683716d44ddb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/_internal.dart","hash":"ef4618b5bf737a7625f62d841127c69d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/router.dart","hash":"008bfcc0c15657a88d59311c5086536f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/table.dart","hash":"bb012047379b362d408e5d0c8bc6ff55"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/palettes/tonal_palette.dart","hash":"cfeea6435b5871fb518238f65eff45c6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_shcore_scaling_l1_1_1.g.dart","hash":"00bfa437eaf641f6fdf0db2367135a29"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworkconnection.dart","hash":"21da671eb92823f3b4c91c47b2e9bac7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtexteditpattern.dart","hash":"77fe24649991a149ec3886147da46e40"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestospackagedependency.dart","hash":"30bad556275cf4f7a39d50f698375871"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/internal.dart","hash":"588a3af2aaa1c3d645ba03ee517a0a36"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/debug.dart","hash":"ed11d553b999afddfd85ca57540af7d0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/LICENSE","hash":"e2874f670fc80ccca43123509b557150"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/restoration.dart","hash":"61dd7991c06ba3bae351fee9a80c64e1"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/animated_button.dart","hash":"f33328d3e6b3090e0a7fcbcbe235d4f6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jset.dart","hash":"6638bd2385fd6ebb1a4f1cdbbb2f3969"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/binding.dart","hash":"bc70e853dbe465d35621acd729a881be"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/flex.dart","hash":"2575e4d918739657daefac64c926ef0e"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/document_card.dart","hash":"aa8e7fa19c93db98d9ca9a99ff547e79"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfile.dart","hash":"9147a0ebdb209d3da9ae7cab703710fe"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/LICENSE","hash":"39062f759b587cf2d49199959513204a"},{"path":"/opt/flutter/packages/flutter/lib/src/scheduler/binding.dart","hash":"27b520537055bdd97a5c4a40bb877b0d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/heroes.dart","hash":"224eb1d584e5805d9476ad8eaafd678e"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/disposable_build_context.dart","hash":"edd2f9cabffc7ea6a5a9497a1b1beccd"},{"path":"/opt/flutter/packages/flutter/lib/src/material/search_bar_theme.dart","hash":"3bf6e857bc21dae2181211ce34d1dbc8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/cam16.dart","hash":"7cb71fc5981509df77a8edc6f092f688"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/c_bindings_generated.dart","hash":"1f44a57b0f9b3dfc3992791c213b5df8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_web_browser_detection_io.dart","hash":"632d3c730c9b6e4f46d9c0459c53ca9c"},{"path":"/opt/flutter/packages/flutter/lib/src/services/clipboard.dart","hash":"61137458bbcab0dfb643d5d50a5ae80f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrangearray.dart","hash":"c81713fc58f35111f30b5ef09b79cef5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/colors.dart","hash":"f3747e025d835d0ff5cfd904d925dea2"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart","hash":"82604e7dbb83dc8f66f5ec9d0962378b"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_codec.h","hash":"1593085ded6e4a14d8129a5d9a95edb8"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/dialog.dart","hash":"b54872377d34b185e2f2d8a052027d0b"},{"path":"/opt/flutter/packages/flutter/lib/src/semantics/debug.dart","hash":"3fd33becc9141d8a690c4205c72c5d40"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/empty_unmodifiable_set.dart","hash":"0949b8197a6069783a78f4bb0a373fb0"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_macos.dart","hash":"0b75bd7311f9cedcf190a97c79867f32"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/stack_trace-1.12.1/LICENSE","hash":"3c68a7c20b2296875f67e431093dd99e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span.dart","hash":"b7c2cc8260bb9ff9a961390b92e93294"},{"path":"/opt/flutter/packages/flutter/LICENSE","hash":"1d84cf16c48e571923f837136633a265"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/LICENSE","hash":"d2e1c26363672670d1aa5cc58334a83b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemcontext.dart","hash":"ecca8d7a94b7a01ee70af109474706b4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/platform_menu_bar.dart","hash":"1fac5bc7668cb093aab432692e1630aa"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/src/generated_plugin.dart","hash":"e1c286fd5841539119a1c390cc1fe13a"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/hit_test.dart","hash":"51235aace2e147e256e4fc41799f9447"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/tween.dart","hash":"73f043194b9c158454e55b3cafbdb395"},{"path":"/opt/flutter/packages/flutter/lib/src/material/icon_button.dart","hash":"c4f01f181724a1f60621d83c64fd0c7a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemimagefactory.dart","hash":"d04edc39b6d3477197606ec9c969e738"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/dio.dart","hash":"3059dceae50124dbd966f136c80016fe"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/bound_multipart_stream.dart","hash":"6a792eed43130ef8c5b35bb12106f303"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_floating_header.dart","hash":"ce4bfd9659d667457cc3ada513fae71e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iconnectionpointcontainer.dart","hash":"21a6eaa35ec3367210a47a559f54c4a6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/converter.dart","hash":"0249369d780d894dfa75dfc2c6017a03"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationgriditempattern.dart","hash":"90879288f848e0c8bd3e17539633770a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_path_l1_1_0.g.dart","hash":"42efc7a615bdc348ad78098c1cdb79b7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/structs.g.dart","hash":"b248aab8f1807ae07bc22c26210f2def"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/arena.dart","hash":"fac59927a386d45fc1cdebc321fc007a"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/text_form_field_row.dart","hash":"29cf82c0868d62bee42ecccd6cdccae6"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/monodrag.dart","hash":"5df364b799badfda6335a69660dcadf5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winspool.g.dart","hash":"18e255eb54fef40d17b6f6abac4455aa"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/image.dart","hash":"d60d0d9fc260392343a46c002c73540a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/utils.dart","hash":"8986177ba204a808c603c35260601cce"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/circle_border.dart","hash":"a2aa815908f2e15493e374b9380e558a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/dispatcher.dart","hash":"9de140992b1876855e65cdffbefe8a40"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants.dart","hash":"95235ba0d55efc617c0d84893f46390b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/extension.dart","hash":"ef82a025843a9945bb252078a9754fa4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_fill.dart","hash":"42f46cea14d93c318ee000d7012192db"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextpattern.dart","hash":"8355566a31f02cb53e7f9b94d8c873ec"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_mutable_data.dart","hash":"ffb14682b9771918da24801f35264dbe"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/image_decoder.dart","hash":"eaf5aa7cf4fe19db30724f637b38257a"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NativeAssetsManifest.json","hash":"f3a664e105b4f792c6c7fe4e4d22c398"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/mime.dart","hash":"6438480f29034a2c6acd5817c656d94d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/utils.dart","hash":"8a7e3b181572ed50e923e5dc05a7533d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_data.dart","hash":"a8a7af5aadf8748e4bb6a28b08be67b4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/title.dart","hash":"89a5a9d8d10c6404eea48ac0295eb83e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/bottom_navigation_bar.dart","hash":"1c4b7cda983a494874f28626143a80d7"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/checkbox.dart","hash":"f5512cad78f3eef4c5cbb5fa172f0cdd"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/paragraph.dart","hash":"4c25d1e4920d408981da864ee489a7dc"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/animation_controller.dart","hash":"f73219c63d613e792d0f9221f43dbd6b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/lazy_stream.dart","hash":"1b3ff4e1a515487aa9ce23ae7fec0100"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/LICENSE","hash":"2b36ca50262dc615e560c27654badb26"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/animated_scroll_view.dart","hash":"4b5ab11d235a465c4a879dadef56e636"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechobjecttoken.dart","hash":"fb64eb7ccd3a66090cd698eaebe1d080"},{"path":"/opt/flutter/packages/flutter/lib/src/material/elevated_button.dart","hash":"b7c6ad5f4168643fe4bd098ad78c1ca8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemresources.dart","hash":"47eb0e2b093b486abe563cf677b04f31"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_window_win32.dart","hash":"9301d655a0ca688b8b3b10b03a889be8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scrollable.dart","hash":"2deee0506cc9f4d5463e83cfcbd8fbaa"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/bstr.dart","hash":"0ace55de06ef5d40b277ac8dae4d760d"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/text_selection.dart","hash":"4269d040023673ba217e7beaf0bd2cb0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/LICENSE","hash":"3cc5c8282a1f382c0ea02231eacd2962"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/deferred_inherited_provider.dart","hash":"59ae3a059b0ba1677002bed66f3b8c2d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/url.dart","hash":"13c8dcc201f970674db72fbbd0505581"},{"path":"/opt/flutter/packages/flutter/lib/src/material/checkbox.dart","hash":"81a08e7856838b8036b76fbf224da3e6"},{"path":"/opt/flutter/packages/flutter/lib/src/services/mouse_cursor.dart","hash":"b388439b612c8a98282b913cb54749fe"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/animation.dart","hash":"c8564aa311746f4047cd02e26ff4df75"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/view.dart","hash":"66379325c2d65c28b2e6c5c48f0e44aa"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/focus_scope.dart","hash":"01c60edd2f0cde40439b794511296602"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_string_array.dart","hash":"dce5e400c1f0958583196f9db05de7b9"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_string_codec.h","hash":"5edcd4ae8b7d3acb2e56bf8bfad75d4d"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/shader_warm_up.dart","hash":"6aad823b2beafa697be63269aed72605"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/viewing_conditions.dart","hash":"31e9eaae0175cc8b4184df6c89b454ca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_set.dart","hash":"4b5d82ddeb09bc46ae0e980616ce0109"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeventsource.dart","hash":"33ce76d75b24f6c7ed6ad95a422b76b3"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/drag.dart","hash":"43ba7557388f413902313df64e072389"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/memory_allocations.dart","hash":"791eefc473ec9cd414fbba6a3a57cc7d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/time.dart","hash":"0ecdc1efd97a68adad750e8deaf2a4f5"},{"path":"/opt/flutter/packages/flutter/lib/src/services/flutter_version.dart","hash":"597d897c972c255ade7307dfcc2e5524"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/media_type.dart","hash":"101ff6d49da9d3040faf0722153efee7"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/actions.dart","hash":"40f792886e98a54385d092003203411d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/safe_area.dart","hash":"7088cc45b21c93be6b42dc748fc3a29a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/background_transformer.dart","hash":"c3ab437aa0b03081adbfcdff7755b358"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immnotificationclient.dart","hash":"300a55743890abdcee4f6f0ac897a3d9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/globals.dart","hash":"c88223c7cd248b2bb8587f78e9530f64"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart","hash":"8a39bdc324d0ff25097784bd98333c08"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_wu.dart","hash":"ce049601b2dcdf418b7d80839ed87b7f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispnotifysource.dart","hash":"97fe81a282e612211e9648061d6d5dbb"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/spell_check.dart","hash":"3ea13613fda783152a2b815448e9360a"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/async.dart","hash":"38c8218f408405a3b0f006e1078fed60"},{"path":"/opt/flutter/packages/flutter/lib/src/material/curves.dart","hash":"4aeb4635d84df42e6f220aba366af7d9"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/oval_border.dart","hash":"c8a14f8ecb364849dcdd8c67e1299fb3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/path_provider_linux.dart","hash":"8ac537f4af05ad812e8cd29f077aee24"},{"path":"/opt/flutter/packages/flutter/lib/src/material/page.dart","hash":"c5bf16620e9021a14d7fdd8d605e611a"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/binding.dart","hash":"f35b6c2c15559613475104095d9df43c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/exceptions.dart","hash":"e3ef71f241dd9711d599fc18b59abdf2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationpropertycondition.dart","hash":"35abc3f166f0485c87a21f0fcecae69a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/progress_indicator.dart","hash":"9c3ed584e2374dbd83dc81620d4ce311"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/list_wheel_viewport.dart","hash":"98ee12375c3ad7ed08c157b8d3dc990a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdevicecollection.dart","hash":"a45b41e12ba5853543f707ce7dbab9d4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/toggle_buttons_theme.dart","hash":"989e64ec130878de031e86b4373f6ed9"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sensitive_content.dart","hash":"8bb5842ab79616954e268adb624dc6fb"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/routes.dart","hash":"cf2e654a150356d063488e889502d4a9"},{"path":"/opt/flutter/packages/flutter/lib/src/material/motion.dart","hash":"505f6c9750f9390c9e9e4d881092cef4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/navigation_rail.dart","hash":"60839e2e0a0ec8804ba631753d29d20a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/functions.dart","hash":"e999eca1c1c76717a74f50814d129d17"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_tonal_spot.dart","hash":"da57aefc2c06656b68f2bb2639e78d33"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/_features.dart","hash":"c80fe07476c80969660bac4b2e328f23"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_group.dart","hash":"56e7707f76c417845a2d4ace8af3b305"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/priority_queue.dart","hash":"34a4d340931147322eaddc77fdc65c22"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/services/api_service.dart","hash":"c11fb90e7908c0631097d5f0b60646bf"},{"path":"/opt/flutter/packages/flutter/lib/src/material/action_icons_theme.dart","hash":"a49a9bda7a9ba92713059f932c535502"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/visibility.dart","hash":"b372e2a5f5ec770c10809cc970de6fd3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jobject.dart","hash":"0db1803fcad172b512558bd1b03e4ff0"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/service_extensions.dart","hash":"920b63c794849c8a7a0f03f23314bbb1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vm_service-15.2.0/LICENSE","hash":"5bd4f0c87c75d94b51576389aeaef297"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclockadjustment.dart","hash":"dde1235f5cf091fe6d4a2938399afb4e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/LICENSE","hash":"3b954371d922e30c595d3f72f54bb6e4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtablepattern.dart","hash":"6a38c376b8edbead42348c54f9f12420"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/force_press.dart","hash":"3e0eaeb97804d1bc93e6c6088aa351b7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/LICENSE","hash":"23a7e2fab311012bc8f9fc2de0d1593a"},{"path":"/opt/flutter/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart","hash":"7ca9cdc58b74e40bf66f51beec668b7e"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture_gl.h","hash":"3a535810e25ecd4fd017a2eb197dab30"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/LICENSE","hash":"39062f759b587cf2d49199959513204a"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/flutter_linux.h","hash":"1dcce1af8eb3052e29d06a756f0535db"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/characters.dart","hash":"99b4d15f76889687c07a41b43911cc39"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/proxy_box.dart","hash":"af7a13b78c7d3f26912cd2954c6e32fa"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensor.dart","hash":"9d1c0eb5292b2112e1b43affe9a2cadc"},{"path":"/opt/flutter/packages/flutter/lib/src/material/menu_bar_theme.dart","hash":"a1186c224201e7d203404a4270938040"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/device.dart","hash":"42907536e17e46ac17dd8182d18856af"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/change_notifier.dart","hash":"439dfb5f1b1e9392c80bb84d728a4d20"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_consumer.dart","hash":"2cce8363d2a5751ae45bc5d4ec6685bf"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/navigation_toolbar.dart","hash":"ec5071edb88affa40f43f9753e38fa6f"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/image_icon.dart","hash":"1e2afd780c32baef8cedd0eb9c4dee6d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/interactive_viewer.dart","hash":"c79afeb6110c73f1a299ae443fbd6801"},{"path":"/opt/flutter/packages/flutter/lib/src/material/floating_action_button_theme.dart","hash":"ede3ea64c702929c61efc17ee946de16"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/LICENSE","hash":"f721b495d225cd93026aaeb2f6e41bcc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/redirect_record.dart","hash":"91794c215a8aa39b862cfa4c96b9a398"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/selection_container.dart","hash":"eb2124207d1c8d272f9c70186ea82432"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/xinput1_4.g.dart","hash":"08b6eae008bb8359796643eb1a639234"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetwork.dart","hash":"57adb1ac7ff40f2fd9512ebf09281433"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_range.dart","hash":"c54cfb081c273f7d29980b31987bf614"},{"path":"/opt/flutter/packages/flutter/lib/src/material/radio_list_tile.dart","hash":"195df835b5813920fb16a774181e24ca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationstylespattern.dart","hash":"a5c23bf569325f140ab7b7d88d3b683a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtransformpattern.dart","hash":"ff5c40ddc1501e3be7aa7efd4a269f04"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_value.h","hash":"0fad916a7405474cce0f6d85509a12ac"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_method_codec.h","hash":"c31254629784a8fd48a5ec671df85e64"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/shell32.g.dart","hash":"c1210af8f1663dc5959f1ec44acaa5a9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/breaks.dart","hash":"3dd13158e97d592fc8a1ca4a4109876f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionmanager.dart","hash":"53ef1e482a9021fe353d68c9f8a1affc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifilesavedialog.dart","hash":"de786aad9aba3c37b121a1f0238119a9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/arena.dart","hash":"9a357eba21f383f648a36404ef950aea"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/proxy_provider.dart","hash":"57b51f6f00c6bc3a29abbf83fbd804f8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_layout_builder.dart","hash":"0c520a6b1ab38e0f294c3ddbc2ec9737"},{"path":"/opt/flutter/packages/flutter/lib/src/scheduler/priority.dart","hash":"ac172606bd706d958c4fe83218c60125"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/blend/blend.dart","hash":"7594a28b48f672ffb4829ada9ea4018e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/aabb3.dart","hash":"b6a30b7ed48f83f446db37577b30e62e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/runtime_bindings_generated.dart","hash":"5cb54083abc3581b889d07f12df09608"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ibindctx.dart","hash":"82c3a291bffe63fdad7d6e4bd5b0a0e8"},{"path":"/opt/flutter/packages/flutter/lib/src/material/button_bar.dart","hash":"bb8957add3433d4ccec96c35738d00ca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/source_span.dart","hash":"9f2eb24284aeaa1bacc5629ddb55b287"},{"path":"/opt/flutter/packages/flutter/lib/src/material/search.dart","hash":"3798784648f57e129514c1cb6f534612"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextchildpattern.dart","hash":"3d63c4213a898f6e0eb52cb39fa282ec"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector4.dart","hash":"77900a31d721da1722fe34c455a00d3f"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/performance_overlay.dart","hash":"c5e44030289c2c25b26c5b3aa843b3cc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/get_application_id_real.dart","hash":"0e5b422d23b62b43ea48da9f0ad7fd47"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/date_picker.dart","hash":"f0ae3d508981a1fc1da2d73883b101d1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/lints-6.1.0/LICENSE","hash":"4cb782b79f6fc5792728e331e81a3558"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_map.dart","hash":"42e37fab03a3ee2d526bb6f51ea4af23"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.35/LICENSE","hash":"2b36ca50262dc615e560c27654badb26"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_activity.dart","hash":"568b5c15879974b6a40dabc916f6bd65"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/reorderable_list.dart","hash":"d0ffbd9374302bd34364424fcfcd1497"},{"path":"/opt/flutter/packages/flutter/lib/src/material/flexible_space_bar.dart","hash":"2e084a548b366b849be3e17b894fe9a7"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tab_controller.dart","hash":"47209aba8a1b5a4577b58b1f3456da65"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/serialization.dart","hash":"136d8d9f6504839ffc4b6a498f4d3e93"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_android.dart","hash":"c9111e47389ee4b70aab720435a2a2df"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/widget_state.dart","hash":"8f0ffdcc13937f4c7f4af5dd9c20c134"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemclassobject.dart","hash":"20a078b2eb6ecf6b4b16bd817e30ecdc"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/custom_paint.dart","hash":"fef10b0abf3243ad4bd8662292f411ac"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10/LICENSE","hash":"f721b495d225cd93026aaeb2f6e41bcc"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/image_resolution.dart","hash":"2c86f851a6498dc37af3894fedee6f52"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/uxtheme.g.dart","hash":"14ca92a49cc066f7dbf04357098fef9e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemlocator.dart","hash":"84516bb884e27c54321d286d9ae9e9d4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/generated_bindings.dart","hash":"193b3d87d8e5e1c65855f2cda33b3386"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackagedependenciesenumerator.dart","hash":"21bea147ac9531ac715cd99a07f55866"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/view.dart","hash":"b7f24095a9863d0d6920a70d44f5d61c"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registrar.h","hash":"3d850b5432140f7e565baa806ee1f716"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/windows/file_picker_windows_ffi_types.dart","hash":"6d9bf9e41acfef21e5407dced2080155"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/io.dart","hash":"c39b12173f947d61a4b19d285a2a0b9a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemservices.dart","hash":"edac48a72d161089af5eee3c0d7d0d5e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/color_utils.dart","hash":"a97282161191c89d98231dfd655252c6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_closer.dart","hash":"1f08f83d7a9240cb3accf35283c75bdb"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/star_border.dart","hash":"d0357d4b6b592803e9f99a7930521764"},{"path":"/opt/flutter/packages/flutter/lib/src/material/theme_data.dart","hash":"c5e0a59d4b752637762b9ab9e7c3e042"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/package_config-2.2.0/LICENSE","hash":"d2e1c26363672670d1aa5cc58334a83b"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/diagnostics.dart","hash":"dcb6d0625aecf48f069f90c3e4417b3d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/dialog.dart","hash":"8ee51e44eaeb560b697cb18a6b108b24"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_list.dart","hash":"77baff143fb94d1f9134acb8a17adc0c"},{"path":"/opt/flutter/packages/flutter/lib/src/services/deferred_component.dart","hash":"53b9028402187f878713225b48bdd5bb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactorymapping.dart","hash":"7eae5454728dc152e90d36cc6b715544"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationgridpattern.dart","hash":"f4b8510296da48652b91a91857d7c71b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/plane.dart","hash":"d98495bcbc301290a10e6d1dfc255d69"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart","hash":"e5b4b18b359c9703926f723a1b8dd4ac"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/src/point_provider.dart","hash":"7504c44d1fa6150901dd65ec78877be0"},{"path":"/opt/flutter/packages/flutter/lib/src/semantics/semantics_event.dart","hash":"0b1575619d779c040ee7e59debfac224"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/opengl.dart","hash":"de7fb154b9b151b81a78d43ade695365"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/idesktopwallpaper.dart","hash":"28a96a9cad386cca4604fe9b6b0ac250"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_selection_theme.dart","hash":"0d3038cd2058b1549639a275bc1613bc"},{"path":"/opt/flutter/packages/flutter/lib/src/services/text_layout_metrics.dart","hash":"13be7153ef162d162d922f19eb99f341"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_set.dart","hash":"1b20a6e406ca8e79675b2ebd9b362d10"},{"path":"/opt/flutter/packages/flutter/lib/src/material/scaffold.dart","hash":"a0c28cbb07821549d81c61b3010da091"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/multitap.dart","hash":"f3a785ad090332fc04b6845ef026c8d7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/src/path_provider.g.dart","hash":"77971712e28393ec72c9033a92f3ceab"},{"path":"/opt/flutter/packages/flutter/lib/src/material/progress_indicator_theme.dart","hash":"def41f17c96cea18e2b3a5a1d7567c93"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jlong.dart","hash":"a2af4cd8f82efdc948caa14f45b9fd70"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_registrar.h","hash":"455c45888f33294a5054d8adacac5a2e"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_web_image_io.dart","hash":"e88b0574946e5926fde7dd4de1ef3b0d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isequentialstream.dart","hash":"2d06e55a087b389063f0d5777e1d8563"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/charcodes.dart","hash":"a1e4de51bdb32e327bf559008433ab46"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/animated_size.dart","hash":"91d8303ca1ccc72eccc1ae636c7825ed"},{"path":"/opt/flutter/packages/flutter/lib/src/material/about.dart","hash":"096f0ca6103dbd5fe24b0bc157218831"},{"path":"/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/linux.dart","hash":"e5810bd0eaf14fd7034d7c0bc692adb5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/src/method_channel_path_provider.dart","hash":"77ed8d7112753d0eeaa860ecd9fc5ba0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix3.dart","hash":"7711f4b6c3574cec77169f2d2c35ee3d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_array.dart","hash":"9a9e360d34cdf2ecfac6a311a8980848"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/AssetManifest.bin","hash":"a4d54c0d8450a5467a296b48cd3b240b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_completer.dart","hash":"0fa4a82df6fea98c85dcfc6cedf4206d"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_linux.dart","hash":"9e04ab9f6321f4a2213fae7b0c6ba93b"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/paint_utilities.dart","hash":"0d50fddfc336ef63386722b944f83976"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptor.dart","hash":"fa37e7b5d86857fe6a6e7c008773fe79"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_message_codec.h","hash":"4f7385406239c0eb8b31855e75b9addc"},{"path":"/opt/flutter/packages/flutter/lib/src/material/elevated_button_theme.dart","hash":"904ebe4c195d2036f989a5e1c3c6052d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/expansion_panel.dart","hash":"a462524029a4cbce4f7a5b59206883ee"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcustomnavigationpattern.dart","hash":"84de591d644b29f5e21052bd9c84263c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/button_style.dart","hash":"56890032ee132755f7859d792f6a3bfb"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_plugin_registrar.h","hash":"3d850b5432140f7e565baa806ee1f716"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptors/imply_content_type.dart","hash":"9955b767fdde0baa759d3431267e5ed5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/text.dart","hash":"9b556fc1fd58cc9cda37822c1db50870"},{"path":"/opt/flutter/packages/flutter/lib/src/material/scrollbar.dart","hash":"95670a942d6a16e6da8e9f8879842745"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/internal_style.dart","hash":"974d0c452808a1c68d61285d0bd16b28"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/text_theme.dart","hash":"940d3e7ce646ccb08bc517bece948ea1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/typed.dart","hash":"35c9371cbb421753e99a2ca329107309"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/continuous_rectangle_border.dart","hash":"93d025adfc0409629c51036cb0fdc085"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/google_fonts-6.3.3/LICENSE","hash":"2b36ca50262dc615e560c27654badb26"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_channel.h","hash":"de7b99c808de5c710ade00638cf7e484"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tooltip.dart","hash":"347d118311c7fc4b87baf7843613d1de"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellcheckerfactory.dart","hash":"3aa843b290b927ec2ae60e30f12b4ab2"},{"path":"/opt/flutter/packages/flutter/lib/src/material/button_style_button.dart","hash":"51a77029c33902f88383f802e42d8dfb"},{"path":"/opt/flutter/packages/flutter/lib/src/material/action_buttons.dart","hash":"aed826e965e4aa2fdb3466d39e33d824"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/utilities.dart","hash":"121fcbdc1af81a0fd804490f85357fa0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/cf_string.dart","hash":"76763ba579657281f848e4c22e63903f"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart","hash":"33d0626ae9edbbf57b56a12a1447672f"},{"path":"/opt/flutter/packages/flutter/lib/src/material/expand_icon.dart","hash":"eaef2926557480e27a3ce92f89de68b7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/basic.dart","hash":"a878a869fbefd074f1cde40e99c1ffb1"},{"path":"/opt/flutter/packages/flutter/lib/src/material/segmented_button.dart","hash":"0c3580e89a5c7bf5a2210ef0cb6b15b1"},{"path":"/opt/flutter/packages/flutter/lib/src/material/paginated_data_table.dart","hash":"cf36b655d442d52d18c66534a6c0a7b7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_number.dart","hash":"6f7fccc40937a56b389999f5380e2ea2"},{"path":"/opt/flutter/packages/flutter/lib/src/material/selectable_text.dart","hash":"3fab1c4c90dce6d5451027be460e81fc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/list_to_blob.dart","hash":"56d7144236503f311a7d9a966eaf2fbd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationscrollitempattern.dart","hash":"a3ab60b19b4725b3ea1d1b0cb1c64451"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/orientation_builder.dart","hash":"c9a0b024143e4fce4b2f910be0781c9b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllinkdual.dart","hash":"75335c9306751e1de52734c1ae433ac0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2/LICENSE","hash":"f721b495d225cd93026aaeb2f6e41bcc"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/form_row.dart","hash":"4935fd96677780d631f23a75e7009534"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/synchronous_future.dart","hash":"2240c6bf9f7e7cc1ef8af2b2dfcb848d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/tween_animation_builder.dart","hash":"107c33a245427bf0f05e21c250653dc6"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/service_extensions.dart","hash":"d7a6c07c0b77c6d7e5f71ff3d28b86bd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/guid.dart","hash":"831a91029162697310005b2ad492c0ae"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_position.dart","hash":"72e7e85e2e47552670f6d4f278daddd4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart","hash":"11fc97acd20679368ae2eaa698c6f130"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/binding.dart","hash":"3d7ce69d5c360aa4d451febf292f0631"},{"path":"/opt/flutter/packages/flutter/lib/src/services/spell_check.dart","hash":"52391934737ac0f0a81f22570d7596a0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/math_utils.dart","hash":"e4ee21048ab83cc50d61ac3784afa9f5"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/box_border.dart","hash":"d9a9fb2f484490186b0cf31199083326"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/string_scanner.dart","hash":"184d3b79d275d28cd02745b455041ee6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclock.dart","hash":"c31f7af379f7e5f653364d4a14a78750"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/windows/file_picker_windows.dart","hash":"1fc2c049e49706a331e23208d2fa3313"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_extensions.dart","hash":"1f445eb98cf4ace45da422b4cd9f047e"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/image_provider.dart","hash":"c2c197053a2543c78e06f559e1fff98f"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/spacer.dart","hash":"d2372e0fb5a584dcd1304d52e64d3f17"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/char_code.dart","hash":"4fb96b9e2073cadc554a25b36f55e6dd"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/table.dart","hash":"4971823847eec8be347ba81fb8f64d55"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/tweens.dart","hash":"29befe23f841cf5dd2dc7df24c13d88d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_handle_l1_1_0.g.dart","hash":"34336c7c021e6749ef0bd6a11e48f887"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/LICENSE","hash":"5bd4f0c87c75d94b51576389aeaef297"},{"path":"/opt/flutter/packages/flutter/lib/src/material/action_chip.dart","hash":"d9ded7564411bb5f83450d1452c7dde7"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/list_tile.dart","hash":"1b5af29e062854d33f5e4c81c2bdf11c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/fake_async-1.3.3/LICENSE","hash":"175792518e4ac015ab6696d16c4f607e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/contrast/contrast.dart","hash":"31f8129bfae39c459df7bd2d3cc37bae"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/dialogs.dart","hash":"31ff0d4d17e824e16798aed227f48e88"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/path_provider_android.dart","hash":"6d35cfc0d00b450495558fbdc7ce2087"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_monochrome.dart","hash":"5f22b5b8aa08733c616d6f636a05f5f5"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tab_bar_theme.dart","hash":"0e5cb3937debdc1c077639cc42592e92"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/jni_flutter.dart","hash":"5327416ac833c200249d92ddeea11293"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation.dart","hash":"fa2fa16f78792d714ca06eb1bbea9db8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader5.dart","hash":"85574281bf7d7bee9722a21e092b4be0"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/tap_region.dart","hash":"7e633ba3d04299eaf9ae7ec72e73c132"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/bluetoothapis.g.dart","hash":"21dfa823454d051c097b62eb7499f71c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/case_insensitive_map.dart","hash":"5893c7d3910e8924bd2dccc8837775c7"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/image_cache.dart","hash":"0452c1305e59244522809652d814c63c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/bottom_app_bar_theme.dart","hash":"999fad3a37babc6c8e1f0636a70a22d2"},{"path":"/opt/flutter/packages/flutter/lib/src/services/system_sound.dart","hash":"30d771880c8dbd68ea8e5d4a55c778c5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart","hash":"3291fff73306ce8322ca2b332c6da9eb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jreference.dart","hash":"d9fa00a9beeccf6023d9f9950d016c1f"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/standard_component_type.dart","hash":"09973ba0a94d2d819052c0544dcdce70"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/sink_base.dart","hash":"597ee0cf67b512406e619cc05fddadbb"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_basic_message_channel.h","hash":"8730d7034562b44bcab7c48c894ba862"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart","hash":"b1bb8356cca8b86afca314ab4898a527"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/overscroll_indicator.dart","hash":"d91982b24c7c003908ca2c737740c096"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/repeating_animation_builder.dart","hash":"687078082b7735e3c129e0d7966acb90"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/kotlin.dart","hash":"a5cc220cdabeb76d85c3b4dc5a031ccd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set_controller.dart","hash":"f301af2d0392296f456363085becbf47"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iagileobject.dart","hash":"4bc403cec1c5846051bca88edb712a8c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/time_picker.dart","hash":"b660de2fb0ce16d2d87e519dce9f3ab9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/future_group.dart","hash":"fb71dd46672c822515f03f8f0dddbcb8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/LICENSE","hash":"901fb8012bd0bea60fea67092c26b918"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/gdi32.g.dart","hash":"3235bc280cf19dc53be8f10c56d89beb"},{"path":"/opt/flutter/packages/flutter/lib/src/material/autocomplete.dart","hash":"6eb3689fcfc8e7fa79c5c2932da682bd"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill","hash":"309055f3b307d0393174fdd053e974cf"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iknownfolder.dart","hash":"561daa1b637bf14aa167a49b8fc3ce6d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/temperature/temperature_cache.dart","hash":"2e46417042b18a7fd19a9d6c90fce1b6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_rainbow.dart","hash":"61f38162c831759dd3768aa4cf2d22f2"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/inherited_model.dart","hash":"8ef164e1faa86c11d16c84882cb12c59"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemhiperfenum.dart","hash":"adebe1537e162fcbe4404ab29e94fef9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_completer.dart","hash":"2430a12d4750c3c76ef07d29bb6f6691"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart","hash":"77e3a9ed54e0497465a4346f273bcccf"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_union.dart","hash":"991661529c5ea50cf40031f5b74929e3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_dictionary.dart","hash":"40156e00b5f6a885cbecbeb24e74f299"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/selector.dart","hash":"5f59fa1ce6d10c011e76cb4d99e90d6b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart","hash":"edbd68eb36df4f06299204439c771edd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream.dart","hash":"809f1f0bbe7ee77e69f003952a5525d5"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart","hash":"a2affd5ebaf1bc227bccbafc118a05c2"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/converter.dart","hash":"ed5548873fcf5a0a5614fc52139600b8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/null_stream_sink.dart","hash":"cc0ab0117e8a0a54ec3efe6d9251860e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/file_picker.dart","hash":"ef26c7cdc66d3ab5c0cca5067d48c0b5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement7.dart","hash":"f05adccad12249a4f175efc9b8abfb37"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationvaluepattern.dart","hash":"868fd1ae52dcd191d04c90dc4a26dfac"},{"path":"/opt/flutter/packages/flutter/lib/src/material/app_bar_theme.dart","hash":"659f8f9a3f5a1a980a088b4793fc8495"},{"path":"/opt/flutter/packages/flutter/lib/src/material/navigation_drawer.dart","hash":"f57bcaa9fe0b91bd40aac9eae26e5662"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/nested_scroll_view.dart","hash":"df8e3bf0abd04ffea00e0ce1e7b5459b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/banner.dart","hash":"8d12337f9d0a86116d70d8a0821a149d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/animated_cross_fade.dart","hash":"98772211ffa69a8340f8088cd7193398"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart","hash":"f31febe411dfd203eb17b66c924efe05"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_type.dart","hash":"e26cb5bf5970055a9bd1828b524cb213"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_string.dart","hash":"6611268c60b179280f53b27a039a7534"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement.dart","hash":"e00e5a90ff913bc9c53a6572e53ec576"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart","hash":"555fcdeebbe6517cde1cdd95133cabd7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationwindowpattern.dart","hash":"f42009fc52ad811f1d34405961c63183"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/utils.dart","hash":"e8c1fb168963c9e062a369d72d2dad6d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/snack_bar.dart","hash":"061aa829343e679ed9cdfba60a355bee"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/viewport.dart","hash":"427b7360839cb5bd7ab8f629d37f6101"},{"path":"/opt/flutter/packages/flutter/lib/src/material/menu_theme.dart","hash":"cf45c10a5cb7ec05fd354b1d6dfe0bda"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/posix.dart","hash":"5e054086533f32f7181757a17890ae56"},{"path":"/opt/flutter/packages/flutter/lib/src/material/text_theme.dart","hash":"f60846aa76dab98607aa06c9bd6cf1dd"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/decoration.dart","hash":"ae85856265742b6237ed0cb67c4364af"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation4.dart","hash":"d8b980603638367071e1f1c256ebd56f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfilesenumerator.dart","hash":"c72923f8ad46feb8bcf25ecbd0379294"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/typed_buffers.dart","hash":"4b495ff6681b3a7dda3f098bf9ecc77d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/card_theme.dart","hash":"97fe6cb02c6c28039811cd7c64c71bbe"},{"path":"/opt/flutter/packages/flutter/lib/src/material/outlined_button.dart","hash":"dbc7d4f14a6e99682358c850d6a3e648"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/widget_span.dart","hash":"4e9c8bc2b1effc801836836136c617d0"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_message_codec.h","hash":"4e0c2c7002baf140a95f0067b781d498"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/licenses.dart","hash":"89cb45d94b75e11c915c9e69b7fdb763"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdevice.dart","hash":"b5e211d1bb1c533a77b5638eede5479f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_celebi.dart","hash":"88b38af8a6ab0efd56d1fb06883c44db"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/testing/fake_platform.dart","hash":"f1a57183b9d9b863c00fcad39308d4c1"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/matrix_utils.dart","hash":"3d4eafff9af08bcac72660d201af2806"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/radio.dart","hash":"967d5f61442cfcc53918b2592386aba8"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/src/point_provider_lab.dart","hash":"28b2af7f1216ccd38b109a03e06c2831"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackageid.dart","hash":"88956349d04ce0c5fc6ae1e89fd65b2d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/inline.dart","hash":"7cfb88f7da0c2022734fb4c438317d95"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/LICENSE","hash":"2b36ca50262dc615e560c27654badb26"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winmm.g.dart","hash":"34b9072869b35b15ccbe1d843fa778d1"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/border_radius.dart","hash":"a4da900408569709fd3b105b1a75b0d2"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/text_scaler.dart","hash":"a0936682931bc884c5052e9f49bf8829"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/gesture_settings.dart","hash":"b5bd9d15c10929b4a63ea0df649e2d52"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/unmodifiable_wrappers.dart","hash":"ea7c9cbd710872ba6d1b93050936bea7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/cross_file.dart","hash":"b1bb0939f4b26522681cc6be8e11f7c1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/types/io.dart","hash":"f1e1ff4a88eabaa04e9774ee96497141"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/decoration_image.dart","hash":"9a8fc6400cc140083b73cbd4804ce0d7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/LICENSE","hash":"d2e1c26363672670d1aa5cc58334a83b"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/thumb_painter.dart","hash":"e55d53d29e3d84b471afebaf8de60052"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_input_stream.dart","hash":"a18fc5ab21a0ffddbebd7407a1e4ce40"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/highlighter.dart","hash":"5265b4bdec5c90bfd2937f140f3ba8fc"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/enums.g.dart","hash":"ebee8885b5afd397cfa8920eeccf88e6"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/table_border.dart","hash":"4fe25f96882183702cf6662e7ea01501"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_spinkit-5.2.2/LICENSE","hash":"4a6a9b806b898dc68a1f890ad1564a10"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart","hash":"f8275b74f8f83272b8a8d1a79d5b2253"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/constants.dart","hash":"83df4f6e4084a06a4f98c27a524cc505"},{"path":"/opt/flutter/packages/flutter/lib/src/material/app_bar.dart","hash":"467fb3c716f2ba40b5ae6793fa22aada"},{"path":"/opt/flutter/packages/flutter/lib/src/scheduler/debug.dart","hash":"d72a4ddaf6162d8b897954e02b4a2a4c"},{"path":"/opt/flutter/packages/flutter/lib/src/animation/animation_style.dart","hash":"16bc4b81188558534ff51b9732b548f6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/web-1.1.1/LICENSE","hash":"d53c45c14285d5ae1612c4146c90050b"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart","hash":"374ee130942948f52e47681818bd315e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/version.g.dart","hash":"08a0131d87ba3b2535a2de787086a3d6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationspreadsheetpattern.dart","hash":"fac91a50f448265e9a9f97994e8b529e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersiststream.dart","hash":"ba4b050fb9bed64eb6f6476016aeba2b"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/box.dart","hash":"adaab1d00b3071aa81cc56ee110ae35e"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/context_menu_action.dart","hash":"8fde18d2ef5c741e3b748bbc854d6b17"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dbghelp.g.dart","hash":"ec2c8a676c3ca12891e9a65ea03458e9"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json","hash":"f3a664e105b4f792c6c7fe4e4d22c398"},{"path":"/opt/flutter/packages/flutter/lib/foundation.dart","hash":"84939e70d6b7b36e8098dd0cda8cbb2a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/LICENSE","hash":"092362603d55c20cda672457571f6483"},{"path":"/opt/flutter/packages/flutter/lib/src/material/navigation_bar.dart","hash":"2a20d11956107df93657fdbc55cbd7cb"},{"path":"/opt/flutter/packages/flutter/lib/src/services/text_formatter.dart","hash":"690488fcbcc0614c8639f4f45e04155a"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/search_field.dart","hash":"2023335e82aca86a4389400ab4abb27d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iknownfoldermanager.dart","hash":"49703a6e2b7dff13d801b6eb6e02062c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationorcondition.dart","hash":"821dcb1b139f1347a59141ff1fe42766"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/default_extension_map.dart","hash":"fe2df60ed5b05e922df2ee9fef5cf5d9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/LICENSE","hash":"39062f759b587cf2d49199959513204a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/menu_anchor.dart","hash":"f0eca4c902f4b8474b9511fc9bda99a7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jclass.dart","hash":"bf63ca39ce8b824fac21a27027981699"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/clamped_simulation.dart","hash":"5979a1b66500c09f65550fab874ee847"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/scrollbar.dart","hash":"85cf42bafb7c0646bd7a99379649da29"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformer.dart","hash":"49dba21de16234aaed28f8fd898543a7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_comm_l1_1_1.g.dart","hash":"ebf62f8040320f913d52494eab3f3dca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/LICENSE","hash":"23a7e2fab311012bc8f9fc2de0d1593a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_date.dart","hash":"50b1b7bf5e4cfd21e9fa7a0ec26f0aae"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/consumer.dart","hash":"38c2b67895c0418bce6750d3751a5b26"},{"path":"/opt/flutter/packages/flutter/lib/src/material/data_table_theme.dart","hash":"eec2e5cfebd521174d93c5faaab5f3ba"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtreewalker.dart","hash":"034536c8c0bdfd72d8f8060ea1f36f3e"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/flutter_linux.h","hash":"1dcce1af8eb3052e29d06a756f0535db"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jni.dart","hash":"9fce75490356488473f3f0d5259d2f29"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/clock-1.1.2/LICENSE","hash":"175792518e4ac015ab6696d16c4f607e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/intl-0.20.2/LICENSE","hash":"0c3ca74a99412972e36f02b5d149416a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/string_scanner.dart","hash":"f158ffadca730ab601c60307ba31a5e4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_splitter.dart","hash":"508284c37de18e099acd673f1965ccc3"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/chat_response.dart","hash":"5195b58187b2ba73326d2c6c8e2448cf"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/icon.dart","hash":"16de55ea686e81618d22a42ccea945a2"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/shared_app_data.dart","hash":"30fd611ec84651af183517cbda0159e0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement4.dart","hash":"98e80e3c681156f330d79925f2675eb2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiocaptureclient.dart","hash":"187bca624cdda52a572fde54e8395124"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/sink.dart","hash":"93ac00707f7d2e5d4b863c54b11f2a9a"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/utils.dart","hash":"727e4f662a828d4611c731f330a3d79a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement5.dart","hash":"7787380533fd85067e9c4303a9564dbb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitem2.dart","hash":"908da18a3fee181ac432b85d7097e5f1"},{"path":"/opt/flutter/packages/flutter/lib/src/material/badge_theme.dart","hash":"3167bedcdf6eb73bb3355fc778c69ab2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iapplicationactivationmanager.dart","hash":"c96999a0782dffe9bf8eeaf394caf3bd"},{"path":"/opt/flutter/packages/flutter/lib/src/services/service_extensions.dart","hash":"eb115c2e8f0ff170bf26a44efd1b5c05"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/table.dart","hash":"8efb7f5da825cb1493c4415a8464efe6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionenumerator.dart","hash":"e5349492be89ad5eea4187db08b2ad0f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation3.dart","hash":"64b70549a67d82ee25c435f5fc06ea49"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer.dart","hash":"db799bf48af97b7c0edc93ad96b4a6da"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio_exception.dart","hash":"2747964c64fe300f15d15123727cbcf6"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_plugin_registry.h","hash":"9093dc992b7f0c62c899bb5ee75437bb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifileisinuse.dart","hash":"9f2e86f55227535568e0459c4d51e139"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/raw_menu_anchor.dart","hash":"041c8ac4d6262178cba05db5413021e9"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/grid_paper.dart","hash":"a79dfa9ea5ca39d0b9f7c9c444b200c3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_wsmeans.dart","hash":"907dee395c762afbdcd8a23c105e9cff"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jiterator.dart","hash":"5bca961ad685ab10214ea12d5a120b89"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart","hash":"9ad11b4bdb179abe4ccb587eb0e2aebc"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/icon_theme_data.dart","hash":"eca4f0ff81b2d3a801b6c61d80bc211c"},{"path":"/opt/flutter/packages/flutter/lib/rendering.dart","hash":"b86e06980335469c54c30d21d379503a"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/custom_layout.dart","hash":"733445712f8a6bd2c1738e90f712d9d1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_mixin.dart","hash":"89dc3f84db2cd1ea37e349fdb1de09bb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8/LICENSE","hash":"a60894397335535eb10b54e2fff9f265"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/scan.dart","hash":"acfc0a55deec22276e085dae6197833a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/floating_action_button.dart","hash":"50c4b181d99cb8b4d862354c0b5a9d67"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_ro_typeresolution_l1_1_1.g.dart","hash":"8944748ddfae167a4c9f3dc75a702e46"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/utf8.dart","hash":"0ec94439be7a3b65b67cf02ae0824af5"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_messenger.h","hash":"5b259053180f6c3a637a3760f5e78921"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackagedependency.dart","hash":"1a04b09efdee92cd9f3e6c8f821820c0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_zip.dart","hash":"df699735e3bcd730f16ce377d562f787"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/route.dart","hash":"9f08acccaea04a99894f32f4c6f8e786"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jmap.dart","hash":"dfce6b9ee4ae9b9df7401fab182baa6a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/int_to_hexstring.dart","hash":"73cb6deeb88fdcc320cf8e089d51531d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/utils.dart","hash":"27861bf07d93c8ef6c716f3eefab80e4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/input_border.dart","hash":"cf7b3b427869d3dd98740290ad9a4e04"},{"path":"/opt/flutter/packages/flutter/lib/src/material/navigation_rail_theme.dart","hash":"e727b7f9f4a8240e12308e1bbdc8572d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/exception.dart","hash":"5275d424aba5c931a30e6bd3e467027d"},{"path":"/opt/flutter/packages/flutter/lib/src/services/binding.dart","hash":"54aac95ce38b1dd080c10def7806e020"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/inherited_notifier.dart","hash":"12143f732513790cd579481704256dcd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/error.dart","hash":"a10eafbc71350955a16e4e787402780b"},{"path":"/opt/flutter/packages/flutter/lib/src/services/autofill.dart","hash":"735a0ac5fc40bf38a4d803d854b10460"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/characters.dart","hash":"fa2a57b3b873fb7db4b8b961735e4ca3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/x_file.dart","hash":"10fc2d0e5d04abfdc83363ce6cb6fe91"},{"path":"/opt/flutter/packages/flutter/lib/src/material/time_picker_theme.dart","hash":"8579724d0a3da983333feb45e0ec3958"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/score/score.dart","hash":"4f05e8a4424e66fedd1798178f3fbfe4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/toggleable.dart","hash":"45cf5344ca712e468fbc6f7fe262e174"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/documents_screen.dart","hash":"87e237e0c4a59b9d20abf9aae7c2f98c"},{"path":"/opt/flutter/packages/flutter/lib/src/physics/friction_simulation.dart","hash":"52cf71691cf20188b9ad9eba43d4acd5"},{"path":"/opt/flutter/packages/flutter/lib/src/services/live_text.dart","hash":"7da554c3a69a1c2d019202e3f63331c5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio.dart","hash":"3467899798f7f8ca82797ccde4772534"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart","hash":"ecc3d5f1ef44b366b036fe825d724075"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/icudtl.dat","hash":"018361032ba13dfeab636138ab6b9831"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart","hash":"7099c7a2a7f0300a848ccb3b97a3388a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/LICENSE","hash":"39062f759b587cf2d49199959513204a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechwaveformatex.dart","hash":"8d9c84de01d7084606586631ac759a34"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_sink.dart","hash":"8faa98eb1bc31bbb64876e837eec420b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/windows.dart","hash":"0d86d4ba2e01e5e62f80fcf3e872f561"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons.dart","hash":"78ce7527fa364df47ba0e611f4531c2c"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/_bitfield_io.dart","hash":"d43c5b4c21f4d74f1189a27441b55512"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/inherited_theme.dart","hash":"f71067310e44780ed646f7533cfd5eef"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/button.dart","hash":"d2c1fb85c113b5418bcae2a4a121c9d4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_dart_project.h","hash":"1ddbe3c8a2821804ced450e37fa9701a"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/collections.dart","hash":"5f0040dcb01350ae3ca65e4181e2f4b0"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/file.dart","hash":"fa9ae6c732442615050e9a8b5f758a2c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta.dart","hash":"696cb8f38fb01211afb7823d12080410"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/canonicalized_map.dart","hash":"f5e7b04452b0066dff82aec6597afdc5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_string_l1_1_0.g.dart","hash":"05fbdfb1bb8ed12098aa521c31a145ff"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationitemcontainerpattern.dart","hash":"17cf81dd718b76ea3b1453b5f74e1cd9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jarray.dart","hash":"f292145a4e855215a8283d820f14526c"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/annotations.dart","hash":"b092b123c7d8046443429a9cd72baa9a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart","hash":"d747f30222617b5e88045ad2b71b7292"},{"path":"/opt/flutter/packages/flutter/lib/src/material/icons.dart","hash":"32b222420709e8e40d12f6ea9fc0041e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/navigation_drawer_theme.dart","hash":"4298e7b96b5292ad0aa4ad3c9c21d0ba"},{"path":"/opt/flutter/packages/flutter/lib/src/services/mouse_tracking.dart","hash":"5da121a0d3087e7cf021bfcdeb247b77"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/modal_barrier.dart","hash":"b673cbca331d079ee080d930a90d39da"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclock2.dart","hash":"286726a4ae635c3cb149cd640c3c096f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/release_sink.dart","hash":"e2f7d6fbeb362176a24cb422a6dd8193"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/drag_boundary.dart","hash":"8bb14478c4dee520b74ff29cb26abd14"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/opt/flutter/packages/flutter/lib/src/material/shaders/stretch_effect.frag","hash":"57314be0ff2ba370f2b1395f531f58d3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/reassemble_handler.dart","hash":"17dd5087a9b407563f662fc112624260"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/timeline.dart","hash":"49a4fa8a64638fda29a121d439b02610"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_exception.dart","hash":"c39101179f8bdf0b2116c1f40a3acc25"},{"path":"/opt/flutter/packages/flutter/lib/src/material/predictive_back_page_transitions_builder.dart","hash":"748fa3df343f19643c7528b74841b0b5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/filetime.dart","hash":"562889498a1b0cda759a1186693143e1"},{"path":"/opt/flutter/packages/flutter/lib/src/material/debug.dart","hash":"0575a78fbb39a292302737868752da77"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/stream_channel-2.1.4/LICENSE","hash":"39062f759b587cf2d49199959513204a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/button_theme.dart","hash":"030fb65fb869182a12b04a33af6f1716"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/oleaut32.g.dart","hash":"d36205839f51ee14bc2d832726c52853"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/mouse_tracker.dart","hash":"523365ec8286de8ed21bf538c16a55fd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestproperties.dart","hash":"25ff828118233f5852e97c3e15c2a5da"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumvariant.dart","hash":"ad6fa6bf1dadc6e07c4c080c69abde6a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader2.dart","hash":"9e2940d007af19bd5cf177e3be339363"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version.dart","hash":"f8e8ef6736cd88fed6f2b5ab9b5919ec"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/_window_macos.dart","hash":"ac9cafe92efeb9a6a9e38ac77cf0ceea"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immendpoint.dart","hash":"ceac2a8f7197831de70d242e885a1527"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/magic_number.dart","hash":"d9d40cd4fd7e692ca4246d952d48cca8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_notification_observer.dart","hash":"5d501f601c3918737b410e99bbe669e6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/matcher-0.12.19/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8/lib/plugin_platform_interface.dart","hash":"8e49d86f5f9c801960f1d579ca210eab"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_fidelity.dart","hash":"2b93d5d6981f0c021cb892223416927d"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/isolates.dart","hash":"6a714eca68cd2e758bba590e4de5758c"},{"path":"/opt/flutter/packages/flutter/lib/src/material/no_splash.dart","hash":"9c053b0efcabd70996cc27e9d6c9303e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/debug.dart","hash":"c2f41a566fbaf72898c079f64a468f8b"},{"path":"/opt/flutter/packages/flutter/lib/src/material/filled_button_theme.dart","hash":"21496c39aba7bb1435e82558fc3dc9f4"},{"path":"/opt/flutter/packages/flutter/lib/src/material/menu_style.dart","hash":"c024b206fb43b6984cd9218a57b33e9e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/layer.dart","hash":"e544f52b6c401f94d55944700710e814"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationannotationpattern.dart","hash":"d7be13ee7803d293bd92452e5ef3da27"},{"path":"/opt/flutter/packages/flutter/lib/src/material/data_table_source.dart","hash":"094b2c03ad4e0ef5bc1144e281142b2e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/change_notifier_provider.dart","hash":"3ce0eeefa3058c1955fb1f435ce9928b"},{"path":"/opt/flutter/packages/flutter/lib/src/services/text_input.dart","hash":"dd299eb439ea9e8984bbbe7b261d8079"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_comm_l1_1_2.g.dart","hash":"62710fd39bf51f264c7fd8ad1dc7aac5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/propertykey.dart","hash":"241ccb24efad22e002bdfe778f96b46c"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/debug.dart","hash":"51fa10cf30bde630913ff4c6e40723ba"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/box_decoration.dart","hash":"245b299041865508e9fc19bef35ce394"},{"path":"/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart","hash":"c761b80666ae3a0a349cef1131f4413d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/user32.g.dart","hash":"f7d24a92e50e72cd80aab0301eef14ca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationmultipleviewpattern.dart","hash":"509de531546dd357cb81de8c9e42312d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumidlist.dart","hash":"7d1806cb19bc0d23a18c2760d106d95e"},{"path":"/opt/flutter/packages/flutter/lib/src/material/list_tile.dart","hash":"7f469dbf2248d29b7a1df7e363f939ae"},{"path":"/opt/flutter/packages/flutter/lib/src/material/segmented_button_theme.dart","hash":"4bc0135f92824ffb75319868784c6a2a"},{"path":"/opt/flutter/packages/flutter/lib/src/services/binary_messenger.dart","hash":"056355e344c26558a3591f2f8574e4e5"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart","hash":"7156a39dbb7dacc6af204880e7de90df"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/constants.dart","hash":"4a4b67b573e2338cf03cb704b2c18f04"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/pages.dart","hash":"1e1be3e5cb88130e3a06c7a5a8338ebd"},{"path":"/opt/flutter/packages/flutter/lib/src/material/checkbox_theme.dart","hash":"c6ab1a29d1ba66a4753fc123c6844500"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/document.dart","hash":"eb484f76e76fb8acb55287b52d30eea1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jlist.dart","hash":"41540e398bd3cd471052b5b4ae735519"},{"path":"/opt/flutter/packages/flutter/lib/src/material/slider.dart","hash":"fbc41930b8a46cdf0d68d6a28719ba46"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/istream.dart","hash":"3575776abdbb8b6b6ff78edda77516b5"},{"path":"/opt/flutter/bin/cache/engine.stamp","hash":"10f325ed10b0252defcc9efc7739e40a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellchecker.dart","hash":"556c5677ab197ac52aaee6e02d6ebd70"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_notification.dart","hash":"269af8ca7030ccfd9c868fe9af8a6b0a"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart","hash":"3d71d8940be022672282ed70f0cbb8c6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader6.dart","hash":"33186ffed4f0249b40a7d6161b7c2351"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/debug.dart","hash":"dbb0bb20c79bcea9397c34e3620c56c3"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensormanager.dart","hash":"af29a3ea1a69b956f7915a4cc29d4b89"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/compute/compute.dart","hash":"12b8cbac25c7ad95ce53c2f8869a1b5d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/ntdll.g.dart","hash":"72e3f09580a88c2aa3ce838611e0a25d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifileopendialog.dart","hash":"54b556c56a02a636de1790f953f298bf"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_map.dart","hash":"700328ab0177ddfd9a003a8c15619c1a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_apiquery_l2_1_0.g.dart","hash":"71eaaef10eca13dd60c5459f65db0e72"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Light.ttf","hash":"e1718753611a1da034b7e80ecc1523be"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jprimitives.dart","hash":"25e4e5d3bc90a692c908c5eedaaaa97e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_subscription.dart","hash":"e2d2090c2a39f7902893e64150fe82b9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector2.dart","hash":"81d01d8cecc6783526e350800988db74"},{"path":"/opt/flutter/packages/flutter/lib/src/services/restoration.dart","hash":"51b71fe2c718236166425dc5f935fe05"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/icon_data.dart","hash":"eb9b3bf513b18ddaf0057f3877439d9b"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/ray.dart","hash":"d69cd05d9de1731242d357de56893a6f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/get_application_id.dart","hash":"32f5f78e5648f98d8b602c6233aa4fc5"},{"path":"/opt/flutter/packages/flutter/lib/src/material/input_decorator.dart","hash":"7c90636f9ad92b40f2a39b6d29ed06f1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/comdlg32.g.dart","hash":"cd103a8b0a9727840f3bd8bd985ad677"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialog.dart","hash":"8a251fb90302207f7e9e3f95aca01a72"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart","hash":"b05d9b3f16715e71f85e443ff5cc3578"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/pinned_header_sliver.dart","hash":"77c71ac1ce863929fcdc763ddaa43cc4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart","hash":"5c621d343831cbb9619557942e6b7d9f"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart","hash":"1941e472514aa68830923eb534787e3c"},{"path":"/opt/flutter/packages/flutter/lib/src/services/flavor.dart","hash":"229f98ffbc538c9813ef41d9f707f00a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessioncontrol2.dart","hash":"d71b6121d7069ff8303334b41e9a92d1"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/debug.dart","hash":"73989dab409ba51341696277a51b7ceb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/typed_data.dart","hash":"b9abba31a48a9c2caee10ef52c5c1d0e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/compute/compute_io.dart","hash":"e990b24e6368a3aa33f21b4695cfcfab"},{"path":"/opt/flutter/packages/flutter/lib/src/material/divider_theme.dart","hash":"200da5ba0b0cee2bca1acd1c4d772118"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/args-2.7.0/LICENSE","hash":"d26b134ce6925adbbb07c08b02583fb8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/value_listenable_builder.dart","hash":"68c724edcc385ae2764308632abb76b4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/context_menu_button_item.dart","hash":"5061e0737e2db44e82d8a8c12f328a48"},{"path":"/opt/flutter/packages/flutter/lib/src/services/haptic_feedback.dart","hash":"4046ff652f8682c7853d91bc1957cdba"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemobjectaccess.dart","hash":"3ce0f30d7026f6462449617764734437"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/sync_transformer.dart","hash":"787074c3d370e068052721d16acefd9e"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/constants.dart","hash":"92e6028556e74c1dc297e332b473f78e"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/app.dart","hash":"4740467f93e4f6d4f9bb366f62029a8c"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/edge_insets.dart","hash":"8970a6503639bc8ffcb960a5dcfe9cf5"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/variant.dart","hash":"0564ee9e759fe52b58de8af3d5d0f9b4"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/system_context_menu.dart","hash":"4c5a83f116f054e6b12ada656cd12e74"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/platform_file.dart","hash":"4f4268ad277e47f47cddd0df860dcf1a"},{"path":"/opt/flutter/packages/flutter/lib/src/material/expansion_tile_theme.dart","hash":"f64029b4f4dbdc0bc61a4b8787975a94"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/reject_errors.dart","hash":"e9cc91e4ea4141722f1ae9e087afae63"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/kdialog_handler.dart","hash":"7da87daf08914da3588ec6672a0631c9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/pub_semver.dart","hash":"5d10ebcc18f13e0b7d4ba4f8b3d2eae6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationinvokepattern.dart","hash":"942a7879522bdf82258a3383893665a6"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/quad.dart","hash":"25dd0d36ba8109e3199faf508b41d633"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationspreadsheetitempattern.dart","hash":"0b1037c34b64b5d7d84c6e578ab59974"},{"path":"/opt/flutter/packages/flutter/lib/src/material/tabs.dart","hash":"ccfc1cd499858c78d8494069a45f03f9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellfolder.dart","hash":"9595cf0e7becb4bf5de5d3a3865d631d"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/object.dart","hash":"789bca9275fc5aafe7edd9d14fed9bf4"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/image_filter_config.dart","hash":"60f62476572d92483704e46dc2f4caa1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/shlwapi.g.dart","hash":"4230059d9b32165301d8d2a329a9b40d"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/value_listenable_provider.dart","hash":"bbd255fe46712b372dfe3b99cb340068"},{"path":"/opt/flutter/packages/flutter/lib/material.dart","hash":"79c87aaef3dd490ff1c43fad2f2f6e8e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/interface/local_platform.dart","hash":"9cc2170ec43e47681be6cb2a313ba1b5"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart","hash":"1f131d7f971396d52ce5fe78ae6a8a83"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_with_context.dart","hash":"a8f2c6aa382890a1bb34572bd2d264aa"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationsynchronizedinputpattern.dart","hash":"dfa5338b5b93f9705e9f756dc0327549"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/unicode.dart","hash":"8b525140e1bf7268e1681a62c7640eea"},{"path":"/opt/flutter/packages/flutter/lib/src/services/keyboard_maps.g.dart","hash":"2c582bec6fc77f68c975f84d2252ed8d"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_binary_messenger.h","hash":"5b259053180f6c3a637a3760f5e78921"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart","hash":"a06bb87266e0bac30a263d7182aaf68c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/authentication_challenge.dart","hash":"395f07418a28b12b0ed665f32270d702"},{"path":"/opt/flutter/bin/cache/pkg/sky_engine/LICENSE","hash":"7c4bc9f9bec60c0636f78923ee1d4e6c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isupporterrorinfo.dart","hash":"0fe168f7fefcc6e38cea5a1daaa08fe7"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/errors.dart","hash":"ced9775aafb393501c537dd334b029aa"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/method_invocation.dart","hash":"bd7255b381081690ef082c2edad8925a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement9.dart","hash":"13e53604d98eb0a2fbd871588ec8b357"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/undo_history.dart","hash":"73089c9737db54a05691e09bc9fc1bcd"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/response.dart","hash":"2a02594ad813d39d23460e2abfd2551d"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/automatic_keep_alive.dart","hash":"950931e9fb34a49ab919d67cceacc5ed"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/tab_view.dart","hash":"8b15d222f5742b46bf55a4ef4cbfd6e0"},{"path":"/opt/flutter/packages/flutter/lib/src/material/material_localizations.dart","hash":"250495642e27057e720877e240b934bf"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/charcode.dart","hash":"b80f25d51570eededff370f0c2b94c38"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationvirtualizeditempattern.dart","hash":"34ac34257c6ee30da8c0b6de4d0a5444"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_wsl_api_l1_1_0.g.dart","hash":"f5defa76a8d0e0a0a5d1670fbc270cb4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker.dart","hash":"4ba650a13380825c7dee4abb66475443"},{"path":"/opt/flutter/packages/flutter/lib/src/painting/_network_image_io.dart","hash":"e38122737cacd74c14f4af5e43b3adbd"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/main.dart","hash":"d11424770dd987050a9437b4ff47f366"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_value.h","hash":"0fad916a7405474cce0f6d85509a12ac"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactoryentry.dart","hash":"634d273f14a099a4f0bd577979779ee1"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/guid.dart","hash":"55bb53dd4f9ed89c9ff88c204b59293c"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/navigator_pop_handler.dart","hash":"38861aee0e2ba92ec8005a64746c0d10"},{"path":"/opt/flutter/packages/flutter/lib/painting.dart","hash":"4bd60bd8ede4b9dad954493d26d3e586"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/chat_screen.dart","hash":"b97e5ee599ef17408161b11c720a2c17"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ivirtualdesktopmanager.dart","hash":"ffd004f95154cc4fe026271fb8aed8cb"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/form_data.dart","hash":"bfd57391197129cbe3c47c75b2c21672"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/src/hct_solver.dart","hash":"2972206c70139c2948530bbb5c9cfa27"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/animated_switcher.dart","hash":"dd779800a4427470d18d3cf7cee94dca"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/utils.dart","hash":"42550f7112e7e8c786999aab0e356482"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumresources.dart","hash":"2e130b0e6cc669eb69235f142071943e"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/itypeinfo.dart","hash":"d1242664c894dd9825221a49693814f2"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensorcollection.dart","hash":"c20dc5b81ea6dddfc61f66c603afd971"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/sheet.dart","hash":"7c41c15d45ac7ca4c501f433b920cdca"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_controller.dart","hash":"1c30db1141cd553dfef8652fc960b285"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersistfile.dart","hash":"0f1d84a9023a931b4b3cda6b907d76e9"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/observer.dart","hash":"2480f17b8bc5d1954b56f512c6adcd9d"},{"path":"/opt/flutter/packages/flutter/lib/src/material/checkbox_list_tile.dart","hash":"53da5624b052d25dbac28900bd1be07d"},{"path":"/opt/flutter/packages/flutter/lib/src/services/text_editing.dart","hash":"6e8a100c61e43412f04fd40619632907"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipropertystore.dart","hash":"de49c234a47c24f91be2f223476fcd44"},{"path":"/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_application.h","hash":"5774eb642609ea54649f5a74272b973f"},{"path":"/opt/flutter/packages/flutter/lib/src/services/platform_channel.dart","hash":"fa0e2861f741433eeedccb70f496acc4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/noise.dart","hash":"14ee798b10cb318d96667b32b245f21f"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworklistmanagerevents.dart","hash":"cb223d2445f2caf7a2617e25ca761ff4"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants_nodoc.dart","hash":"273e2f5010e85e296a0893f397d71645"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_message_codec.h","hash":"cde1b5d81be59769b872be4d62b4bae8"},{"path":"/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_web.dart","hash":"23f4ab7b865afa9a34078e6237f2f35a"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_metrics.dart","hash":"6f18c18a1a5649f27b6e0c29dfba4dc9"},{"path":"/opt/flutter/packages/flutter/lib/src/semantics/semantics.dart","hash":"bf7735dcc524382da296f76e33e4b2c8"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/notification_listener.dart","hash":"d22c71e1141d4ac749f6854fe9116c79"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/raw_radio.dart","hash":"09e3926c2a167303d98aa56726fd8cfe"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/handler_transformer.dart","hash":"e358dbd512fac73db64b0628ad53bc82"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jimplementer.dart","hash":"58031f960b575eb0db526bf49b706f80"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/ole32.g.dart","hash":"5be59a094b276fbbeb0a2255d1c45e2e"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/kernel_blob.bin","hash":"309055f3b307d0393174fdd053e974cf"},{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/providers/app_state.dart","hash":"8a6eef5c46dacb8e0a3acac55df1f95c"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE","hash":"753206f0b81e6116b384683823069537"},{"path":"/opt/flutter/packages/flutter/lib/src/foundation/assertions.dart","hash":"a66a69d48812aef51615255f4d383438"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_enumerator.dart","hash":"d3b9d47acf4348262c7c16ba99cb7412"},{"path":"/opt/flutter/packages/flutter/lib/src/material/radio.dart","hash":"1e1194a5a79e450b6beea81f2a2015df"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/navigator.dart","hash":"3c5d62423cc1e093cde227a94b7784f0"},{"path":"/opt/flutter/packages/flutter/lib/src/widgets/scroll_simulation.dart","hash":"63ff3569beb0e4155aa7b6fba657ff6b"},{"path":"/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/common.dart","hash":"35edf5ac435b5c857fa70061e07f263e"},{"path":"/opt/flutter/packages/flutter/lib/src/cupertino/nav_bar.dart","hash":"dcb7cfa2c5b505c04b0712736558eb4e"},{"path":"/opt/flutter/packages/flutter/lib/src/rendering/editable.dart","hash":"7aaee177f3c43a39286d3e7f23cf821a"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/LICENSE","hash":"e9f463669bd6dfea2166dcdcbf392645"},{"path":"/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/kernel32.g.dart","hash":"025e33f289842e685909a1adadc790ca"},{"path":"/opt/flutter/packages/flutter/lib/src/gestures/long_press.dart","hash":"4302e3fed0a7d6f93a5015bbfe3c0d28"}]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill new file mode 100644 index 0000000..1196a93 Binary files /dev/null and b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill differ diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build.d b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build.d new file mode 100644 index 0000000..603528f --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build.d @@ -0,0 +1 @@ + /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json: /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/pubspec.yaml /opt/flutter/bin/cache/dart-sdk/version \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build.stamp new file mode 100644 index 0000000..01cae55 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build.stamp @@ -0,0 +1 @@ +{"inputs":["/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/pubspec.yaml","/opt/flutter/bin/cache/dart-sdk/version"],"outputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json"]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json new file mode 100644 index 0000000..745d9ce --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/dart_build_result.json @@ -0,0 +1 @@ +{"build_start":"2026-06-04T10:59:51.909525","build_end":"2026-06-04T10:59:51.959053","dependencies":["file:///home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json","file:///home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/pubspec.yaml","file:///opt/flutter/bin/cache/dart-sdk/version"],"code_assets":[],"data_assets":[]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/debug_bundle_linux-x64_assets.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/debug_bundle_linux-x64_assets.stamp new file mode 100644 index 0000000..fa8772f --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/debug_bundle_linux-x64_assets.stamp @@ -0,0 +1 @@ +{"inputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/pubspec.yaml","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Regular.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Bold.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Light.ttf","/opt/flutter/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf","/opt/flutter/packages/flutter/lib/src/material/shaders/ink_sparkle.frag","/opt/flutter/packages/flutter/lib/src/material/shaders/stretch_effect.frag","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json","/home/aliakbar/.pub-cache/hosted/pub.dev/args-2.7.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/clock-1.1.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/dio_web_adapter-2.1.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/fake_async-1.3.3/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_lints-6.0.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.35/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_spinkit-5.2.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/google_fonts-6.3.3/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/http-1.6.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/intl-0.20.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/lints-6.1.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/matcher-0.12.19/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/package_config-2.2.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider-2.1.5/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/stack_trace-1.12.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/stream_channel-2.1.4/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/test_api-0.7.10/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/vm_service-15.2.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/web-1.1.1/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/LICENSE","/home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/LICENSE","/opt/flutter/bin/cache/pkg/sky_engine/LICENSE","/opt/flutter/packages/flutter/LICENSE"],"outputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/kernel_blob.bin","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Regular.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Bold.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Light.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/fonts/MaterialIcons-Regular.otf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/ink_sparkle.frag","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/stretch_effect.frag","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/AssetManifest.bin","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/FontManifest.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NOTICES.Z","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/version.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NativeAssetsManifest.json"]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/flutter_assets.d b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/flutter_assets.d new file mode 100644 index 0000000..b64a039 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/flutter_assets.d @@ -0,0 +1 @@ + /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Regular.ttf /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Bold.ttf /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Light.ttf /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/fonts/MaterialIcons-Regular.otf /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/ink_sparkle.frag /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/stretch_effect.frag /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/AssetManifest.bin /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/FontManifest.json /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NOTICES.Z /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/version.json /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NativeAssetsManifest.json: /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/pubspec.yaml /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Regular.ttf /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Bold.ttf /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/assets/fonts/Vazir-Light.ttf /opt/flutter/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf /opt/flutter/packages/flutter/lib/src/material/shaders/ink_sparkle.frag /opt/flutter/packages/flutter/lib/src/material/shaders/stretch_effect.frag /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json /home/aliakbar/.pub-cache/hosted/pub.dev/args-2.7.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/clock-1.1.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/dio_web_adapter-2.1.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/fake_async-1.3.3/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/flutter_lints-6.0.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.35/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/flutter_spinkit-5.2.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/google_fonts-6.3.3/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/http-1.6.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/intl-0.20.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/lints-6.1.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/matcher-0.12.19/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/package_config-2.2.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider-2.1.5/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/stack_trace-1.12.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/stream_channel-2.1.4/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/test_api-0.7.10/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/vm_service-15.2.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/web-1.1.1/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/LICENSE /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/LICENSE /opt/flutter/bin/cache/pkg/sky_engine/LICENSE /opt/flutter/packages/flutter/LICENSE \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/gen_dart_plugin_registrant.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/gen_dart_plugin_registrant.stamp new file mode 100644 index 0000000..25eaee7 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/gen_dart_plugin_registrant.stamp @@ -0,0 +1 @@ +{"inputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json"],"outputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart"]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/gen_localizations.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/gen_localizations.stamp new file mode 100644 index 0000000..1b2d28c --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/gen_localizations.stamp @@ -0,0 +1 @@ +{"inputs":[],"outputs":[]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/install_code_assets.d b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/install_code_assets.d new file mode 100644 index 0000000..69733cc --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/install_code_assets.d @@ -0,0 +1 @@ + /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json: \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/install_code_assets.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/install_code_assets.stamp new file mode 100644 index 0000000..a2d9f91 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/install_code_assets.stamp @@ -0,0 +1 @@ +{"inputs":["/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json"],"outputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json"]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/kernel_snapshot_program.d b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/kernel_snapshot_program.d new file mode 100644 index 0000000..7c99623 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/kernel_snapshot_program.d @@ -0,0 +1 @@ +/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill: /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/async.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/async_cache.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/async_memoizer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/byte_collector.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/cancelable_operation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/chunked_stream_reader.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/event_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/future.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_consumer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_subscription.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/future_group.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/lazy_stream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/null_stream_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/restartable_timer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/capture_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/capture_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/error.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/future.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/release_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/release_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/result.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/value.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/single_subscription_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/sink_base.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_closer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_completer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_group.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_queue.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_completer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/handler_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/reject_errors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/typed.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_splitter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_subscription_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_zip.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/subscription_stream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/typed/stream_subscription.dart /home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/typed_stream_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/characters.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/characters.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/characters_impl.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/breaks.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/constants.dart /home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/table.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/collection.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/algorithms.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/boollist.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/unmodifiable_wrappers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/canonicalized_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterable.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_list.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/comparators.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/empty_unmodifiable_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/functions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_zip.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/list_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/priority_queue.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/queue_list.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set_controller.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/wrappers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/cross_file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/types/base.dart /home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/types/io.dart /home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/x_file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/dio.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/io.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/adapter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/adapters/io_adapter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/cancel_token.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/compute/compute.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/compute/compute_io.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio/dio_for_native.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio_mixin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio_exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptor.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/form_data.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/headers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptors/imply_content_type.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptors/log.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/multipart_file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/multipart_file/io_multipart_file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/options.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/parameter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/progress_stream/io_progress_stream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/redirect_record.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/response.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/response/response_stream_handler.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/background_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/fused_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/sync_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/util/consolidate_bytes.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/util/transform_empty_to_null.dart /home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/ffi.dart /home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/allocation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/arena.dart /home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/utf16.dart /home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/utf8.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/file_picker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/exceptions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_io.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_macos.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_result.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/dialog_handler.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/file_picker_linux.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/kdialog_handler.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/qarma_and_zenity_handler.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/platform_file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/windows/file_picker_windows.dart /home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/windows/file_picker_windows_ffi_types.dart /opt/flutter/packages/flutter/lib/animation.dart /opt/flutter/packages/flutter/lib/cupertino.dart /opt/flutter/packages/flutter/lib/foundation.dart /opt/flutter/packages/flutter/lib/gestures.dart /opt/flutter/packages/flutter/lib/material.dart /opt/flutter/packages/flutter/lib/painting.dart /opt/flutter/packages/flutter/lib/physics.dart /opt/flutter/packages/flutter/lib/rendering.dart /opt/flutter/packages/flutter/lib/scheduler.dart /opt/flutter/packages/flutter/lib/semantics.dart /opt/flutter/packages/flutter/lib/services.dart /opt/flutter/packages/flutter/lib/src/animation/animation.dart /opt/flutter/packages/flutter/lib/src/animation/animation_controller.dart /opt/flutter/packages/flutter/lib/src/animation/listener_helpers.dart /opt/flutter/packages/flutter/lib/src/animation/animation_style.dart /opt/flutter/packages/flutter/lib/src/foundation/diagnostics.dart /opt/flutter/packages/flutter/lib/src/animation/animations.dart /opt/flutter/packages/flutter/lib/src/animation/curves.dart /opt/flutter/packages/flutter/lib/src/animation/tween.dart /opt/flutter/packages/flutter/lib/src/animation/tween_sequence.dart /opt/flutter/packages/flutter/lib/src/cupertino/activity_indicator.dart /opt/flutter/packages/flutter/lib/src/widgets/ticker_provider.dart /opt/flutter/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart /opt/flutter/packages/flutter/lib/src/cupertino/app.dart /opt/flutter/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart /opt/flutter/packages/flutter/lib/src/cupertino/button.dart /opt/flutter/packages/flutter/lib/src/cupertino/checkbox.dart /opt/flutter/packages/flutter/lib/src/widgets/toggleable.dart /opt/flutter/packages/flutter/lib/src/cupertino/colors.dart /opt/flutter/packages/flutter/lib/src/cupertino/constants.dart /opt/flutter/packages/flutter/lib/src/cupertino/context_menu.dart /opt/flutter/packages/flutter/lib/src/cupertino/context_menu_action.dart /opt/flutter/packages/flutter/lib/src/cupertino/cupertino_focus_halo.dart /opt/flutter/packages/flutter/lib/src/cupertino/date_picker.dart /opt/flutter/packages/flutter/lib/src/cupertino/debug.dart /opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection.dart /opt/flutter/packages/flutter/lib/src/widgets/text_selection.dart /opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart /opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart /opt/flutter/packages/flutter/lib/src/cupertino/dialog.dart /opt/flutter/packages/flutter/lib/src/cupertino/expansion_tile.dart /opt/flutter/packages/flutter/lib/src/cupertino/form_row.dart /opt/flutter/packages/flutter/lib/src/cupertino/form_section.dart /opt/flutter/packages/flutter/lib/src/cupertino/icon_theme_data.dart /opt/flutter/packages/flutter/lib/src/cupertino/icons.dart /opt/flutter/packages/flutter/lib/src/cupertino/interface_level.dart /opt/flutter/packages/flutter/lib/src/cupertino/list_section.dart /opt/flutter/packages/flutter/lib/src/cupertino/list_tile.dart /opt/flutter/packages/flutter/lib/src/cupertino/localizations.dart /opt/flutter/packages/flutter/lib/src/cupertino/magnifier.dart /opt/flutter/packages/flutter/lib/src/cupertino/nav_bar.dart /opt/flutter/packages/flutter/lib/src/cupertino/page_scaffold.dart /opt/flutter/packages/flutter/lib/src/widgets/binding.dart /opt/flutter/packages/flutter/lib/src/cupertino/picker.dart /opt/flutter/packages/flutter/lib/src/cupertino/radio.dart /opt/flutter/packages/flutter/lib/src/cupertino/refresh.dart /opt/flutter/packages/flutter/lib/src/rendering/object.dart /opt/flutter/packages/flutter/lib/src/cupertino/route.dart /opt/flutter/packages/flutter/lib/src/cupertino/scrollbar.dart /opt/flutter/packages/flutter/lib/src/cupertino/search_field.dart /opt/flutter/packages/flutter/lib/src/widgets/restoration.dart /opt/flutter/packages/flutter/lib/src/cupertino/segmented_control.dart /opt/flutter/packages/flutter/lib/src/widgets/radio_group.dart /opt/flutter/packages/flutter/lib/src/rendering/box.dart /opt/flutter/packages/flutter/lib/src/cupertino/sheet.dart /opt/flutter/packages/flutter/lib/src/cupertino/slider.dart /opt/flutter/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart /opt/flutter/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart /opt/flutter/packages/flutter/lib/src/cupertino/switch.dart /opt/flutter/packages/flutter/lib/src/cupertino/tab_scaffold.dart /opt/flutter/packages/flutter/lib/src/cupertino/tab_view.dart /opt/flutter/packages/flutter/lib/src/cupertino/text_field.dart /opt/flutter/packages/flutter/lib/src/widgets/automatic_keep_alive.dart /opt/flutter/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart /opt/flutter/packages/flutter/lib/src/cupertino/text_form_field_row.dart /opt/flutter/packages/flutter/lib/src/cupertino/text_selection.dart /opt/flutter/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart /opt/flutter/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart /opt/flutter/packages/flutter/lib/src/cupertino/text_theme.dart /opt/flutter/packages/flutter/lib/src/cupertino/theme.dart /opt/flutter/packages/flutter/lib/src/cupertino/thumb_painter.dart /opt/flutter/packages/flutter/lib/src/dart_plugin_registrant.dart /opt/flutter/packages/flutter/lib/src/foundation/_bitfield_io.dart /opt/flutter/packages/flutter/lib/src/foundation/_capabilities_io.dart /opt/flutter/packages/flutter/lib/src/foundation/_features.dart /opt/flutter/packages/flutter/lib/src/foundation/_isolates_io.dart /opt/flutter/packages/flutter/lib/src/foundation/_platform_io.dart /opt/flutter/packages/flutter/lib/src/foundation/_timeline_io.dart /opt/flutter/packages/flutter/lib/src/foundation/annotations.dart /opt/flutter/packages/flutter/lib/src/foundation/assertions.dart /opt/flutter/packages/flutter/lib/src/foundation/basic_types.dart /opt/flutter/packages/flutter/lib/src/foundation/binding.dart /opt/flutter/packages/flutter/lib/src/foundation/bitfield.dart /opt/flutter/packages/flutter/lib/src/foundation/capabilities.dart /opt/flutter/packages/flutter/lib/src/foundation/change_notifier.dart /opt/flutter/packages/flutter/lib/src/foundation/collections.dart /opt/flutter/packages/flutter/lib/src/foundation/consolidate_response.dart /opt/flutter/packages/flutter/lib/src/foundation/constants.dart /opt/flutter/packages/flutter/lib/src/foundation/debug.dart /opt/flutter/packages/flutter/lib/src/foundation/isolates.dart /opt/flutter/packages/flutter/lib/src/foundation/key.dart /opt/flutter/packages/flutter/lib/src/foundation/licenses.dart /opt/flutter/packages/flutter/lib/src/foundation/memory_allocations.dart /opt/flutter/packages/flutter/lib/src/foundation/node.dart /opt/flutter/packages/flutter/lib/src/foundation/object.dart /opt/flutter/packages/flutter/lib/src/foundation/observer_list.dart /opt/flutter/packages/flutter/lib/src/foundation/persistent_hash_map.dart /opt/flutter/packages/flutter/lib/src/foundation/platform.dart /opt/flutter/packages/flutter/lib/src/foundation/print.dart /opt/flutter/packages/flutter/lib/src/foundation/serialization.dart /opt/flutter/packages/flutter/lib/src/foundation/service_extensions.dart /opt/flutter/packages/flutter/lib/src/foundation/stack_frame.dart /opt/flutter/packages/flutter/lib/src/foundation/synchronous_future.dart /opt/flutter/packages/flutter/lib/src/foundation/timeline.dart /opt/flutter/packages/flutter/lib/src/foundation/unicode.dart /opt/flutter/packages/flutter/lib/src/gestures/arena.dart /opt/flutter/packages/flutter/lib/src/gestures/binding.dart /opt/flutter/packages/flutter/lib/src/gestures/constants.dart /opt/flutter/packages/flutter/lib/src/gestures/converter.dart /opt/flutter/packages/flutter/lib/src/gestures/debug.dart /opt/flutter/packages/flutter/lib/src/gestures/drag.dart /opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart /opt/flutter/packages/flutter/lib/src/gestures/eager.dart /opt/flutter/packages/flutter/lib/src/gestures/events.dart /opt/flutter/packages/flutter/lib/src/gestures/force_press.dart /opt/flutter/packages/flutter/lib/src/gestures/gesture_details.dart /opt/flutter/packages/flutter/lib/src/gestures/gesture_settings.dart /opt/flutter/packages/flutter/lib/src/gestures/hit_test.dart /opt/flutter/packages/flutter/lib/src/gestures/long_press.dart /opt/flutter/packages/flutter/lib/src/gestures/lsq_solver.dart /opt/flutter/packages/flutter/lib/src/gestures/monodrag.dart /opt/flutter/packages/flutter/lib/src/gestures/multidrag.dart /opt/flutter/packages/flutter/lib/src/gestures/multitap.dart /opt/flutter/packages/flutter/lib/src/gestures/pointer_router.dart /opt/flutter/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart /opt/flutter/packages/flutter/lib/src/gestures/recognizer.dart /opt/flutter/packages/flutter/lib/src/gestures/resampler.dart /opt/flutter/packages/flutter/lib/src/gestures/scale.dart /opt/flutter/packages/flutter/lib/src/gestures/tap.dart /opt/flutter/packages/flutter/lib/src/gestures/tap_and_drag.dart /opt/flutter/packages/flutter/lib/src/gestures/team.dart /opt/flutter/packages/flutter/lib/src/gestures/velocity_tracker.dart /opt/flutter/packages/flutter/lib/src/material/about.dart /opt/flutter/packages/flutter/lib/src/material/action_buttons.dart /opt/flutter/packages/flutter/lib/src/material/action_chip.dart /opt/flutter/packages/flutter/lib/src/material/action_icons_theme.dart /opt/flutter/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/animated_icons.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart /opt/flutter/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart /opt/flutter/packages/flutter/lib/src/material/app.dart /opt/flutter/packages/flutter/lib/src/material/app_bar.dart /opt/flutter/packages/flutter/lib/src/material/app_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/arc.dart /opt/flutter/packages/flutter/lib/src/material/autocomplete.dart /opt/flutter/packages/flutter/lib/src/material/back_button.dart /opt/flutter/packages/flutter/lib/src/material/badge.dart /opt/flutter/packages/flutter/lib/src/material/badge_theme.dart /opt/flutter/packages/flutter/lib/src/material/banner.dart /opt/flutter/packages/flutter/lib/src/material/banner_theme.dart /opt/flutter/packages/flutter/lib/src/material/bottom_app_bar.dart /opt/flutter/packages/flutter/lib/src/material/bottom_app_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/bottom_navigation_bar.dart /opt/flutter/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/bottom_sheet.dart /opt/flutter/packages/flutter/lib/src/material/bottom_sheet_theme.dart /opt/flutter/packages/flutter/lib/src/material/button.dart /opt/flutter/packages/flutter/lib/src/material/material_state_mixin.dart /opt/flutter/packages/flutter/lib/src/material/button_bar.dart /opt/flutter/packages/flutter/lib/src/material/button_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/button_style.dart /opt/flutter/packages/flutter/lib/src/material/button_style_button.dart /opt/flutter/packages/flutter/lib/src/material/button_theme.dart /opt/flutter/packages/flutter/lib/src/material/calendar_date_picker.dart /opt/flutter/packages/flutter/lib/src/material/card.dart /opt/flutter/packages/flutter/lib/src/material/card_theme.dart /opt/flutter/packages/flutter/lib/src/material/carousel.dart /opt/flutter/packages/flutter/lib/src/material/carousel_theme.dart /opt/flutter/packages/flutter/lib/src/material/checkbox.dart /opt/flutter/packages/flutter/lib/src/material/checkbox_list_tile.dart /opt/flutter/packages/flutter/lib/src/material/checkbox_theme.dart /opt/flutter/packages/flutter/lib/src/material/chip.dart /opt/flutter/packages/flutter/lib/src/material/chip_theme.dart /opt/flutter/packages/flutter/lib/src/material/choice_chip.dart /opt/flutter/packages/flutter/lib/src/material/circle_avatar.dart /opt/flutter/packages/flutter/lib/src/material/color_scheme.dart /opt/flutter/packages/flutter/lib/src/material/colors.dart /opt/flutter/packages/flutter/lib/src/material/constants.dart /opt/flutter/packages/flutter/lib/src/material/curves.dart /opt/flutter/packages/flutter/lib/src/material/data_table.dart /opt/flutter/packages/flutter/lib/src/material/data_table_source.dart /opt/flutter/packages/flutter/lib/src/material/data_table_theme.dart /opt/flutter/packages/flutter/lib/src/material/date.dart /opt/flutter/packages/flutter/lib/src/material/date_picker.dart /opt/flutter/packages/flutter/lib/src/material/date_picker_theme.dart /opt/flutter/packages/flutter/lib/src/material/debug.dart /opt/flutter/packages/flutter/lib/src/material/desktop_text_selection.dart /opt/flutter/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart /opt/flutter/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart /opt/flutter/packages/flutter/lib/src/material/dialog.dart /opt/flutter/packages/flutter/lib/src/material/dialog_theme.dart /opt/flutter/packages/flutter/lib/src/material/divider.dart /opt/flutter/packages/flutter/lib/src/material/divider_theme.dart /opt/flutter/packages/flutter/lib/src/material/drawer.dart /opt/flutter/packages/flutter/lib/src/material/drawer_header.dart /opt/flutter/packages/flutter/lib/src/material/drawer_theme.dart /opt/flutter/packages/flutter/lib/src/material/dropdown.dart /opt/flutter/packages/flutter/lib/src/material/dropdown_menu.dart /opt/flutter/packages/flutter/lib/src/material/dropdown_menu_form_field.dart /opt/flutter/packages/flutter/lib/src/material/dropdown_menu_theme.dart /opt/flutter/packages/flutter/lib/src/material/elevated_button.dart /opt/flutter/packages/flutter/lib/src/material/elevated_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/elevation_overlay.dart /opt/flutter/packages/flutter/lib/src/material/expand_icon.dart /opt/flutter/packages/flutter/lib/src/material/expansion_panel.dart /opt/flutter/packages/flutter/lib/src/material/expansion_tile.dart /opt/flutter/packages/flutter/lib/src/material/expansion_tile_theme.dart /opt/flutter/packages/flutter/lib/src/material/filled_button.dart /opt/flutter/packages/flutter/lib/src/material/filled_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/filter_chip.dart /opt/flutter/packages/flutter/lib/src/material/flexible_space_bar.dart /opt/flutter/packages/flutter/lib/src/material/floating_action_button.dart /opt/flutter/packages/flutter/lib/src/material/floating_action_button_location.dart /opt/flutter/packages/flutter/lib/src/material/floating_action_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/grid_tile.dart /opt/flutter/packages/flutter/lib/src/material/grid_tile_bar.dart /opt/flutter/packages/flutter/lib/src/material/icon_button.dart /opt/flutter/packages/flutter/lib/src/material/icon_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/icons.dart /opt/flutter/packages/flutter/lib/src/material/ink_decoration.dart /opt/flutter/packages/flutter/lib/src/material/ink_highlight.dart /opt/flutter/packages/flutter/lib/src/material/ink_ripple.dart /opt/flutter/packages/flutter/lib/src/material/ink_sparkle.dart /opt/flutter/packages/flutter/lib/src/material/ink_splash.dart /opt/flutter/packages/flutter/lib/src/material/ink_well.dart /opt/flutter/packages/flutter/lib/src/material/input_border.dart /opt/flutter/packages/flutter/lib/src/material/input_chip.dart /opt/flutter/packages/flutter/lib/src/material/input_date_picker_form_field.dart /opt/flutter/packages/flutter/lib/src/material/input_decorator.dart /opt/flutter/packages/flutter/lib/src/material/list_tile.dart /opt/flutter/packages/flutter/lib/src/material/list_tile_theme.dart /opt/flutter/packages/flutter/lib/src/material/magnifier.dart /opt/flutter/packages/flutter/lib/src/material/material.dart /opt/flutter/packages/flutter/lib/src/material/material_button.dart /opt/flutter/packages/flutter/lib/src/material/material_localizations.dart /opt/flutter/packages/flutter/lib/src/material/material_state.dart /opt/flutter/packages/flutter/lib/src/material/menu_anchor.dart /opt/flutter/packages/flutter/lib/src/material/menu_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/menu_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/menu_style.dart /opt/flutter/packages/flutter/lib/src/material/menu_theme.dart /opt/flutter/packages/flutter/lib/src/material/mergeable_material.dart /opt/flutter/packages/flutter/lib/src/material/motion.dart /opt/flutter/packages/flutter/lib/src/material/navigation_bar.dart /opt/flutter/packages/flutter/lib/src/material/navigation_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/navigation_drawer.dart /opt/flutter/packages/flutter/lib/src/material/navigation_drawer_theme.dart /opt/flutter/packages/flutter/lib/src/material/navigation_rail.dart /opt/flutter/packages/flutter/lib/src/material/navigation_rail_theme.dart /opt/flutter/packages/flutter/lib/src/material/no_splash.dart /opt/flutter/packages/flutter/lib/src/material/outlined_button.dart /opt/flutter/packages/flutter/lib/src/material/outlined_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/page.dart /opt/flutter/packages/flutter/lib/src/material/page_transitions_theme.dart /opt/flutter/packages/flutter/lib/src/material/paginated_data_table.dart /opt/flutter/packages/flutter/lib/src/material/popup_menu.dart /opt/flutter/packages/flutter/lib/src/material/popup_menu_theme.dart /opt/flutter/packages/flutter/lib/src/material/predictive_back_page_transitions_builder.dart /opt/flutter/packages/flutter/lib/src/material/progress_indicator.dart /opt/flutter/packages/flutter/lib/src/material/progress_indicator_theme.dart /opt/flutter/packages/flutter/lib/src/material/radio.dart /opt/flutter/packages/flutter/lib/src/material/radio_list_tile.dart /opt/flutter/packages/flutter/lib/src/material/radio_theme.dart /opt/flutter/packages/flutter/lib/src/material/range_slider.dart /opt/flutter/packages/flutter/lib/src/material/range_slider_parts.dart /opt/flutter/packages/flutter/lib/src/material/refresh_indicator.dart /opt/flutter/packages/flutter/lib/src/material/reorderable_list.dart /opt/flutter/packages/flutter/lib/src/material/scaffold.dart /opt/flutter/packages/flutter/lib/src/material/scrollbar.dart /opt/flutter/packages/flutter/lib/src/material/scrollbar_theme.dart /opt/flutter/packages/flutter/lib/src/material/search.dart /opt/flutter/packages/flutter/lib/src/material/search_anchor.dart /opt/flutter/packages/flutter/lib/src/material/search_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/search_view_theme.dart /opt/flutter/packages/flutter/lib/src/material/segmented_button.dart /opt/flutter/packages/flutter/lib/src/material/segmented_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/selectable_text.dart /opt/flutter/packages/flutter/lib/src/material/selection_area.dart /opt/flutter/packages/flutter/lib/src/material/shadows.dart /opt/flutter/packages/flutter/lib/src/material/slider.dart /opt/flutter/packages/flutter/lib/src/material/slider_parts.dart /opt/flutter/packages/flutter/lib/src/material/slider_theme.dart /opt/flutter/packages/flutter/lib/src/material/slider_value_indicator_shape.dart /opt/flutter/packages/flutter/lib/src/material/snack_bar.dart /opt/flutter/packages/flutter/lib/src/material/snack_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart /opt/flutter/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart /opt/flutter/packages/flutter/lib/src/material/stepper.dart /opt/flutter/packages/flutter/lib/src/material/switch.dart /opt/flutter/packages/flutter/lib/src/material/switch_list_tile.dart /opt/flutter/packages/flutter/lib/src/material/switch_theme.dart /opt/flutter/packages/flutter/lib/src/material/tab_bar_theme.dart /opt/flutter/packages/flutter/lib/src/material/tab_controller.dart /opt/flutter/packages/flutter/lib/src/material/tab_indicator.dart /opt/flutter/packages/flutter/lib/src/material/tabs.dart /opt/flutter/packages/flutter/lib/src/material/text_button.dart /opt/flutter/packages/flutter/lib/src/material/text_button_theme.dart /opt/flutter/packages/flutter/lib/src/material/text_field.dart /opt/flutter/packages/flutter/lib/src/material/text_form_field.dart /opt/flutter/packages/flutter/lib/src/material/text_selection.dart /opt/flutter/packages/flutter/lib/src/material/text_selection_theme.dart /opt/flutter/packages/flutter/lib/src/material/text_selection_toolbar.dart /opt/flutter/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart /opt/flutter/packages/flutter/lib/src/material/text_theme.dart /opt/flutter/packages/flutter/lib/src/material/theme.dart /opt/flutter/packages/flutter/lib/src/material/theme_data.dart /opt/flutter/packages/flutter/lib/src/material/time.dart /opt/flutter/packages/flutter/lib/src/material/time_picker.dart /opt/flutter/packages/flutter/lib/src/material/time_picker_theme.dart /opt/flutter/packages/flutter/lib/src/material/toggle_buttons.dart /opt/flutter/packages/flutter/lib/src/material/toggle_buttons_theme.dart /opt/flutter/packages/flutter/lib/src/material/tooltip.dart /opt/flutter/packages/flutter/lib/src/material/tooltip_theme.dart /opt/flutter/packages/flutter/lib/src/material/tooltip_visibility.dart /opt/flutter/packages/flutter/lib/src/material/typography.dart /opt/flutter/packages/flutter/lib/src/material/user_accounts_drawer_header.dart /opt/flutter/packages/flutter/lib/src/painting/_network_image_io.dart /opt/flutter/packages/flutter/lib/src/painting/_web_image_info_io.dart /opt/flutter/packages/flutter/lib/src/painting/alignment.dart /opt/flutter/packages/flutter/lib/src/painting/basic_types.dart /opt/flutter/packages/flutter/lib/src/painting/beveled_rectangle_border.dart /opt/flutter/packages/flutter/lib/src/painting/binding.dart /opt/flutter/packages/flutter/lib/src/painting/border_radius.dart /opt/flutter/packages/flutter/lib/src/painting/borders.dart /opt/flutter/packages/flutter/lib/src/painting/box_border.dart /opt/flutter/packages/flutter/lib/src/painting/box_decoration.dart /opt/flutter/packages/flutter/lib/src/painting/box_fit.dart /opt/flutter/packages/flutter/lib/src/painting/box_shadow.dart /opt/flutter/packages/flutter/lib/src/painting/circle_border.dart /opt/flutter/packages/flutter/lib/src/painting/clip.dart /opt/flutter/packages/flutter/lib/src/painting/colors.dart /opt/flutter/packages/flutter/lib/src/painting/continuous_rectangle_border.dart /opt/flutter/packages/flutter/lib/src/painting/debug.dart /opt/flutter/packages/flutter/lib/src/painting/decoration.dart /opt/flutter/packages/flutter/lib/src/painting/decoration_image.dart /opt/flutter/packages/flutter/lib/src/painting/edge_insets.dart /opt/flutter/packages/flutter/lib/src/painting/flutter_logo.dart /opt/flutter/packages/flutter/lib/src/painting/fractional_offset.dart /opt/flutter/packages/flutter/lib/src/painting/geometry.dart /opt/flutter/packages/flutter/lib/src/painting/gradient.dart /opt/flutter/packages/flutter/lib/src/painting/image_cache.dart /opt/flutter/packages/flutter/lib/src/painting/image_decoder.dart /opt/flutter/packages/flutter/lib/src/painting/image_provider.dart /opt/flutter/packages/flutter/lib/src/painting/image_resolution.dart /opt/flutter/packages/flutter/lib/src/painting/image_stream.dart /opt/flutter/packages/flutter/lib/src/painting/inline_span.dart /opt/flutter/packages/flutter/lib/src/painting/linear_border.dart /opt/flutter/packages/flutter/lib/src/painting/matrix_utils.dart /opt/flutter/packages/flutter/lib/src/painting/notched_shapes.dart /opt/flutter/packages/flutter/lib/src/painting/oval_border.dart /opt/flutter/packages/flutter/lib/src/painting/paint_utilities.dart /opt/flutter/packages/flutter/lib/src/painting/placeholder_span.dart /opt/flutter/packages/flutter/lib/src/painting/rounded_rectangle_border.dart /opt/flutter/packages/flutter/lib/src/painting/shader_warm_up.dart /opt/flutter/packages/flutter/lib/src/painting/shape_decoration.dart /opt/flutter/packages/flutter/lib/src/painting/stadium_border.dart /opt/flutter/packages/flutter/lib/src/painting/star_border.dart /opt/flutter/packages/flutter/lib/src/painting/strut_style.dart /opt/flutter/packages/flutter/lib/src/painting/text_painter.dart /opt/flutter/packages/flutter/lib/src/painting/text_scaler.dart /opt/flutter/packages/flutter/lib/src/painting/text_span.dart /opt/flutter/packages/flutter/lib/src/painting/text_style.dart /opt/flutter/packages/flutter/lib/src/physics/clamped_simulation.dart /opt/flutter/packages/flutter/lib/src/physics/friction_simulation.dart /opt/flutter/packages/flutter/lib/src/physics/gravity_simulation.dart /opt/flutter/packages/flutter/lib/src/physics/simulation.dart /opt/flutter/packages/flutter/lib/src/physics/spring_simulation.dart /opt/flutter/packages/flutter/lib/src/physics/tolerance.dart /opt/flutter/packages/flutter/lib/src/physics/utils.dart /opt/flutter/packages/flutter/lib/src/rendering/animated_size.dart /opt/flutter/packages/flutter/lib/src/rendering/binding.dart /opt/flutter/packages/flutter/lib/src/scheduler/binding.dart /opt/flutter/packages/flutter/lib/src/services/binding.dart /opt/flutter/packages/flutter/lib/src/semantics/binding.dart /opt/flutter/packages/flutter/lib/src/rendering/custom_layout.dart /opt/flutter/packages/flutter/lib/src/rendering/custom_paint.dart /opt/flutter/packages/flutter/lib/src/rendering/debug.dart /opt/flutter/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart /opt/flutter/packages/flutter/lib/src/rendering/decorated_sliver.dart /opt/flutter/packages/flutter/lib/src/rendering/editable.dart /opt/flutter/packages/flutter/lib/src/rendering/paragraph.dart /opt/flutter/packages/flutter/lib/src/rendering/error.dart /opt/flutter/packages/flutter/lib/src/rendering/flex.dart /opt/flutter/packages/flutter/lib/src/rendering/flow.dart /opt/flutter/packages/flutter/lib/src/rendering/image.dart /opt/flutter/packages/flutter/lib/src/rendering/image_filter_config.dart /opt/flutter/packages/flutter/lib/src/rendering/layer.dart /opt/flutter/packages/flutter/lib/src/rendering/layout_helper.dart /opt/flutter/packages/flutter/lib/src/rendering/list_body.dart /opt/flutter/packages/flutter/lib/src/rendering/list_wheel_viewport.dart /opt/flutter/packages/flutter/lib/src/rendering/mouse_tracker.dart /opt/flutter/packages/flutter/lib/src/rendering/selection.dart /opt/flutter/packages/flutter/lib/src/rendering/performance_overlay.dart /opt/flutter/packages/flutter/lib/src/rendering/platform_view.dart /opt/flutter/packages/flutter/lib/src/rendering/proxy_box.dart /opt/flutter/packages/flutter/lib/src/rendering/proxy_sliver.dart /opt/flutter/packages/flutter/lib/src/rendering/rotated_box.dart /opt/flutter/packages/flutter/lib/src/rendering/service_extensions.dart /opt/flutter/packages/flutter/lib/src/rendering/shifted_box.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_fill.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_grid.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_group.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_list.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_padding.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_persistent_header.dart /opt/flutter/packages/flutter/lib/src/rendering/sliver_tree.dart /opt/flutter/packages/flutter/lib/src/rendering/stack.dart /opt/flutter/packages/flutter/lib/src/rendering/table.dart /opt/flutter/packages/flutter/lib/src/rendering/table_border.dart /opt/flutter/packages/flutter/lib/src/rendering/texture.dart /opt/flutter/packages/flutter/lib/src/rendering/tweens.dart /opt/flutter/packages/flutter/lib/src/rendering/view.dart /opt/flutter/packages/flutter/lib/src/rendering/viewport.dart /opt/flutter/packages/flutter/lib/src/rendering/viewport_offset.dart /opt/flutter/packages/flutter/lib/src/rendering/wrap.dart /opt/flutter/packages/flutter/lib/src/scheduler/debug.dart /opt/flutter/packages/flutter/lib/src/scheduler/priority.dart /opt/flutter/packages/flutter/lib/src/scheduler/service_extensions.dart /opt/flutter/packages/flutter/lib/src/scheduler/ticker.dart /opt/flutter/packages/flutter/lib/src/semantics/debug.dart /opt/flutter/packages/flutter/lib/src/semantics/semantics.dart /opt/flutter/packages/flutter/lib/src/semantics/semantics_event.dart /opt/flutter/packages/flutter/lib/src/semantics/semantics_service.dart /opt/flutter/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart /opt/flutter/packages/flutter/lib/src/services/asset_bundle.dart /opt/flutter/packages/flutter/lib/src/services/asset_manifest.dart /opt/flutter/packages/flutter/lib/src/services/autofill.dart /opt/flutter/packages/flutter/lib/src/services/binary_messenger.dart /opt/flutter/packages/flutter/lib/src/services/browser_context_menu.dart /opt/flutter/packages/flutter/lib/src/services/clipboard.dart /opt/flutter/packages/flutter/lib/src/services/debug.dart /opt/flutter/packages/flutter/lib/src/services/deferred_component.dart /opt/flutter/packages/flutter/lib/src/services/flavor.dart /opt/flutter/packages/flutter/lib/src/services/flutter_version.dart /opt/flutter/packages/flutter/lib/src/services/font_loader.dart /opt/flutter/packages/flutter/lib/src/services/haptic_feedback.dart /opt/flutter/packages/flutter/lib/src/services/hardware_keyboard.dart /opt/flutter/packages/flutter/lib/src/services/keyboard_inserted_content.dart /opt/flutter/packages/flutter/lib/src/services/keyboard_key.g.dart /opt/flutter/packages/flutter/lib/src/services/keyboard_maps.g.dart /opt/flutter/packages/flutter/lib/src/services/live_text.dart /opt/flutter/packages/flutter/lib/src/services/message_codec.dart /opt/flutter/packages/flutter/lib/src/services/message_codecs.dart /opt/flutter/packages/flutter/lib/src/services/mouse_cursor.dart /opt/flutter/packages/flutter/lib/src/services/mouse_tracking.dart /opt/flutter/packages/flutter/lib/src/services/platform_channel.dart /opt/flutter/packages/flutter/lib/src/services/platform_views.dart /opt/flutter/packages/flutter/lib/src/services/predictive_back_event.dart /opt/flutter/packages/flutter/lib/src/services/process_text.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_android.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_ios.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_linux.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_macos.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_web.dart /opt/flutter/packages/flutter/lib/src/services/raw_keyboard_windows.dart /opt/flutter/packages/flutter/lib/src/services/restoration.dart /opt/flutter/packages/flutter/lib/src/services/scribe.dart /opt/flutter/packages/flutter/lib/src/services/sensitive_content.dart /opt/flutter/packages/flutter/lib/src/services/service_extensions.dart /opt/flutter/packages/flutter/lib/src/services/spell_check.dart /opt/flutter/packages/flutter/lib/src/services/system_channels.dart /opt/flutter/packages/flutter/lib/src/services/system_chrome.dart /opt/flutter/packages/flutter/lib/src/services/system_navigator.dart /opt/flutter/packages/flutter/lib/src/services/system_sound.dart /opt/flutter/packages/flutter/lib/src/services/text_boundary.dart /opt/flutter/packages/flutter/lib/src/services/text_editing.dart /opt/flutter/packages/flutter/lib/src/services/text_editing_delta.dart /opt/flutter/packages/flutter/lib/src/services/text_formatter.dart /opt/flutter/packages/flutter/lib/src/services/text_input.dart /opt/flutter/packages/flutter/lib/src/services/text_layout_metrics.dart /opt/flutter/packages/flutter/lib/src/services/undo_manager.dart /opt/flutter/packages/flutter/lib/src/widgets/_html_element_view_io.dart /opt/flutter/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart /opt/flutter/packages/flutter/lib/src/widgets/_web_browser_detection_io.dart /opt/flutter/packages/flutter/lib/src/widgets/_web_image_io.dart /opt/flutter/packages/flutter/lib/src/widgets/_window.dart /opt/flutter/packages/flutter/lib/src/widgets/_window_io.dart /opt/flutter/packages/flutter/lib/src/widgets/_window_linux.dart /opt/flutter/packages/flutter/lib/src/widgets/_window_macos.dart /opt/flutter/packages/flutter/lib/src/widgets/_window_positioner.dart /opt/flutter/packages/flutter/lib/src/widgets/_window_win32.dart /opt/flutter/packages/flutter/lib/src/widgets/actions.dart /opt/flutter/packages/flutter/lib/src/widgets/adapter.dart /opt/flutter/packages/flutter/lib/src/widgets/framework.dart /opt/flutter/packages/flutter/lib/src/widgets/animated_cross_fade.dart /opt/flutter/packages/flutter/lib/src/widgets/animated_scroll_view.dart /opt/flutter/packages/flutter/lib/src/widgets/animated_size.dart /opt/flutter/packages/flutter/lib/src/widgets/animated_switcher.dart /opt/flutter/packages/flutter/lib/src/widgets/annotated_region.dart /opt/flutter/packages/flutter/lib/src/widgets/app.dart /opt/flutter/packages/flutter/lib/src/widgets/app_lifecycle_listener.dart /opt/flutter/packages/flutter/lib/src/widgets/async.dart /opt/flutter/packages/flutter/lib/src/widgets/autocomplete.dart /opt/flutter/packages/flutter/lib/src/widgets/autofill.dart /opt/flutter/packages/flutter/lib/src/widgets/banner.dart /opt/flutter/packages/flutter/lib/src/widgets/basic.dart /opt/flutter/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart /opt/flutter/packages/flutter/lib/src/widgets/color_filter.dart /opt/flutter/packages/flutter/lib/src/widgets/constants.dart /opt/flutter/packages/flutter/lib/src/widgets/container.dart /opt/flutter/packages/flutter/lib/src/widgets/context_menu_button_item.dart /opt/flutter/packages/flutter/lib/src/widgets/context_menu_controller.dart /opt/flutter/packages/flutter/lib/src/widgets/date.dart /opt/flutter/packages/flutter/lib/src/widgets/debug.dart /opt/flutter/packages/flutter/lib/src/widgets/decorated_sliver.dart /opt/flutter/packages/flutter/lib/src/widgets/default_selection_style.dart /opt/flutter/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart /opt/flutter/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart /opt/flutter/packages/flutter/lib/src/widgets/dismissible.dart /opt/flutter/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart /opt/flutter/packages/flutter/lib/src/widgets/disposable_build_context.dart /opt/flutter/packages/flutter/lib/src/widgets/drag_boundary.dart /opt/flutter/packages/flutter/lib/src/widgets/drag_target.dart /opt/flutter/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_notification.dart /opt/flutter/packages/flutter/lib/src/widgets/dual_transition_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/editable_text.dart /opt/flutter/packages/flutter/lib/src/widgets/expansible.dart /opt/flutter/packages/flutter/lib/src/widgets/fade_in_image.dart /opt/flutter/packages/flutter/lib/src/widgets/feedback.dart /opt/flutter/packages/flutter/lib/src/widgets/flutter_logo.dart /opt/flutter/packages/flutter/lib/src/widgets/focus_manager.dart /opt/flutter/packages/flutter/lib/src/widgets/focus_scope.dart /opt/flutter/packages/flutter/lib/src/widgets/focus_traversal.dart /opt/flutter/packages/flutter/lib/src/widgets/form.dart /opt/flutter/packages/flutter/lib/src/widgets/gesture_detector.dart /opt/flutter/packages/flutter/lib/src/widgets/grid_paper.dart /opt/flutter/packages/flutter/lib/src/widgets/heroes.dart /opt/flutter/packages/flutter/lib/src/widgets/icon.dart /opt/flutter/packages/flutter/lib/src/widgets/icon_data.dart /opt/flutter/packages/flutter/lib/src/widgets/icon_theme.dart /opt/flutter/packages/flutter/lib/src/widgets/icon_theme_data.dart /opt/flutter/packages/flutter/lib/src/widgets/image.dart /opt/flutter/packages/flutter/lib/src/widgets/image_filter.dart /opt/flutter/packages/flutter/lib/src/widgets/image_icon.dart /opt/flutter/packages/flutter/lib/src/widgets/implicit_animations.dart /opt/flutter/packages/flutter/lib/src/widgets/inherited_model.dart /opt/flutter/packages/flutter/lib/src/widgets/inherited_notifier.dart /opt/flutter/packages/flutter/lib/src/widgets/inherited_theme.dart /opt/flutter/packages/flutter/lib/src/widgets/interactive_viewer.dart /opt/flutter/packages/flutter/lib/src/widgets/keyboard_listener.dart /opt/flutter/packages/flutter/lib/src/widgets/layout_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart /opt/flutter/packages/flutter/lib/src/widgets/localizations.dart /opt/flutter/packages/flutter/lib/src/widgets/lookup_boundary.dart /opt/flutter/packages/flutter/lib/src/widgets/magnifier.dart /opt/flutter/packages/flutter/lib/src/widgets/media_query.dart /opt/flutter/packages/flutter/lib/src/widgets/modal_barrier.dart /opt/flutter/packages/flutter/lib/src/widgets/navigation_toolbar.dart /opt/flutter/packages/flutter/lib/src/widgets/navigator.dart /opt/flutter/packages/flutter/lib/src/widgets/navigator_pop_handler.dart /opt/flutter/packages/flutter/lib/src/widgets/nested_scroll_view.dart /opt/flutter/packages/flutter/lib/src/widgets/notification_listener.dart /opt/flutter/packages/flutter/lib/src/widgets/orientation_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/overflow_bar.dart /opt/flutter/packages/flutter/lib/src/widgets/overlay.dart /opt/flutter/packages/flutter/lib/src/widgets/overscroll_indicator.dart /opt/flutter/packages/flutter/lib/src/widgets/page_storage.dart /opt/flutter/packages/flutter/lib/src/widgets/page_transitions_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/page_view.dart /opt/flutter/packages/flutter/lib/src/widgets/pages.dart /opt/flutter/packages/flutter/lib/src/widgets/performance_overlay.dart /opt/flutter/packages/flutter/lib/src/widgets/pinned_header_sliver.dart /opt/flutter/packages/flutter/lib/src/widgets/placeholder.dart /opt/flutter/packages/flutter/lib/src/widgets/platform_menu_bar.dart /opt/flutter/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart /opt/flutter/packages/flutter/lib/src/widgets/platform_view.dart /opt/flutter/packages/flutter/lib/src/widgets/pop_scope.dart /opt/flutter/packages/flutter/lib/src/widgets/preferred_size.dart /opt/flutter/packages/flutter/lib/src/widgets/primary_scroll_controller.dart /opt/flutter/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart /opt/flutter/packages/flutter/lib/src/widgets/raw_menu_anchor.dart /opt/flutter/packages/flutter/lib/src/widgets/raw_radio.dart /opt/flutter/packages/flutter/lib/src/widgets/raw_tooltip.dart /opt/flutter/packages/flutter/lib/src/widgets/reorderable_list.dart /opt/flutter/packages/flutter/lib/src/widgets/repeating_animation_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/restoration_properties.dart /opt/flutter/packages/flutter/lib/src/widgets/router.dart /opt/flutter/packages/flutter/lib/src/widgets/routes.dart /opt/flutter/packages/flutter/lib/src/widgets/safe_area.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_activity.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_configuration.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_context.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_controller.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_delegate.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_metrics.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_notification_observer.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_physics.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_position.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_simulation.dart /opt/flutter/packages/flutter/lib/src/widgets/scroll_view.dart /opt/flutter/packages/flutter/lib/src/widgets/scrollable.dart /opt/flutter/packages/flutter/lib/src/widgets/scrollable_helpers.dart /opt/flutter/packages/flutter/lib/src/widgets/scrollbar.dart /opt/flutter/packages/flutter/lib/src/widgets/selectable_region.dart /opt/flutter/packages/flutter/lib/src/widgets/selection_container.dart /opt/flutter/packages/flutter/lib/src/widgets/semantics_debugger.dart /opt/flutter/packages/flutter/lib/src/widgets/sensitive_content.dart /opt/flutter/packages/flutter/lib/src/widgets/service_extensions.dart /opt/flutter/packages/flutter/lib/src/widgets/shared_app_data.dart /opt/flutter/packages/flutter/lib/src/widgets/shortcuts.dart /opt/flutter/packages/flutter/lib/src/widgets/single_child_scroll_view.dart /opt/flutter/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_fill.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_floating_header.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_layout_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_persistent_header.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_resizing_header.dart /opt/flutter/packages/flutter/lib/src/widgets/sliver_tree.dart /opt/flutter/packages/flutter/lib/src/widgets/snapshot_widget.dart /opt/flutter/packages/flutter/lib/src/widgets/spacer.dart /opt/flutter/packages/flutter/lib/src/widgets/spell_check.dart /opt/flutter/packages/flutter/lib/src/widgets/standard_component_type.dart /opt/flutter/packages/flutter/lib/src/widgets/status_transitions.dart /opt/flutter/packages/flutter/lib/src/widgets/stretch_effect.dart /opt/flutter/packages/flutter/lib/src/widgets/system_context_menu.dart /opt/flutter/packages/flutter/lib/src/widgets/table.dart /opt/flutter/packages/flutter/lib/src/widgets/tap_region.dart /opt/flutter/packages/flutter/lib/src/widgets/text.dart /opt/flutter/packages/flutter/lib/src/widgets/text_editing_intents.dart /opt/flutter/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart /opt/flutter/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart /opt/flutter/packages/flutter/lib/src/widgets/texture.dart /opt/flutter/packages/flutter/lib/src/widgets/title.dart /opt/flutter/packages/flutter/lib/src/widgets/transitions.dart /opt/flutter/packages/flutter/lib/src/widgets/tween_animation_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/two_dimensional_scroll_view.dart /opt/flutter/packages/flutter/lib/src/widgets/two_dimensional_viewport.dart /opt/flutter/packages/flutter/lib/src/widgets/undo_history.dart /opt/flutter/packages/flutter/lib/src/widgets/unique_widget.dart /opt/flutter/packages/flutter/lib/src/widgets/value_listenable_builder.dart /opt/flutter/packages/flutter/lib/src/widgets/view.dart /opt/flutter/packages/flutter/lib/src/widgets/viewport.dart /opt/flutter/packages/flutter/lib/src/widgets/visibility.dart /opt/flutter/packages/flutter/lib/src/widgets/widget_inspector.dart /opt/flutter/packages/flutter/lib/src/widgets/widget_span.dart /opt/flutter/packages/flutter/lib/src/widgets/widget_state.dart /opt/flutter/packages/flutter/lib/src/widgets/will_pop_scope.dart /opt/flutter/packages/flutter/lib/widgets.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/http_parser.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/authentication_challenge.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/case_insensitive_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/charcodes.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/decoder.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/encoder.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/http_date.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/media_type.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/scan.dart /home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/_internal.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/jni.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/accessors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/core_bindings.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/errors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jarray.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/primitive_jarrays.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jimplementer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jni.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jobject.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jreference.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jvalues.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/kotlin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jboolean.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jbyte.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jcharacter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jdouble.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jfloat.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jinteger.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jlong.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jnumber.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jshort.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jstring.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/lang.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/method_invocation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/jbuffer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/jbyte_buffer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/nio.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/generated_bindings.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/global_env_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/jni_bindings_generated.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/types.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jclass.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jprimitives.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jiterator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jlist.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jmap.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jset.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/util.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/version_check.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/jni_flutter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/src/generated_plugin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/src/jni_flutter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/blend/blend.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/contrast/contrast.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dislike/dislike_analyzer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/dynamic_color.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/dynamic_scheme.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/material_dynamic_colors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/src/contrast_curve.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/src/tone_delta_pair.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/variant.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/cam16.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/hct.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/src/hct_solver.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/viewing_conditions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/material_color_utilities.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/palettes/core_palette.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/palettes/tonal_palette.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_celebi.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_wsmeans.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_wu.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/src/point_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/src/point_provider_lab.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_content.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_expressive.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_fidelity.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_fruit_salad.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_monochrome.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_neutral.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_rainbow.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_tonal_spot.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_vibrant.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/score/score.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/temperature/temperature_cache.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/color_utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/math_utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/string_utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta.dart /home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta_meta.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/mime.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/bound_multipart_stream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/char_code.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/default_extension_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/extension.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/magic_number.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_multipart_transformer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_shared.dart /home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_type.dart /home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/objective_c.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/autorelease.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/block.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/c_bindings_generated.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/cf_string.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/converter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/globals.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/internal.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_array.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_data.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_date.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_dictionary.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_enumerator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_input_stream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_mutable_data.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_number.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_string.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/objective_c_bindings_exported.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/objective_c_bindings_generated.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/observer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/os_version.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/protocol_builder.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/runtime_bindings_generated.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/selector.dart /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/version_check.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/path.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/characters.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/context.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/internal_style.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/parsed_path.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/posix.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/url.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/windows.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/path_provider_android.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/src/path_provider.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/src/path_provider_android_real.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/path_provider_foundation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/src/ffi_bindings.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/src/path_provider_foundation_real.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/path_provider_linux.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/get_application_id.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/get_application_id_real.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/path_provider_linux.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/path_provider_platform_interface.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/src/enums.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/src/method_channel_path_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/path_provider_windows.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/folders.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/guid.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/path_provider_windows_real.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/win32_wrappers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/platform.dart /home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/interface/local_platform.dart /home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/interface/platform.dart /home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/testing/fake_platform.dart /home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8/lib/plugin_platform_interface.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/async_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/change_notifier_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/consumer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/listenable_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/deferred_inherited_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/inherited_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/devtool.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/proxy_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/reassemble_handler.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/selector.dart /home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/value_listenable_provider.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/pub_semver.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/patterns.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_constraint.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_range.dart /home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_union.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/source_span.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/charcode.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/colors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/highlighter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location_mixin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_mixin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_with_context.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/charcode.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/eager_span_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/line_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/relative_span_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/span_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/string_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/string_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/ascii_glyph_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/glyph_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/top_level.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/unicode_glyph_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/term_glyph.dart /home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/src/typed_buffer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/src/typed_queue.dart /home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/typed_buffers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/typed_data.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/vector_math_64.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/aabb2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/aabb3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/colors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/frustum.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/intersection_result.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix4.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/noise.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/obb3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/plane.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/quad.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/quaternion.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/ray.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/sphere.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/triangle.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector4.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/constants.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/error_helpers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/opengl.dart /home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/utilities.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/bstr.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/callbacks.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iagileobject.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iapplicationactivationmanager.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfactory.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfile.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfilesenumerator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestapplication.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestapplicationsenumerator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestospackagedependency.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackagedependenciesenumerator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackagedependency.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackageid.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestproperties.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader4.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader5.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader6.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader7.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxpackagereader.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiocaptureclient.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclientduckingcontrol.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclock.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclock2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclockadjustment.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiorenderclient.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessioncontrol.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessioncontrol2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionenumerator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionmanager.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionmanager2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiostreamvolume.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ibindctx.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ichannelaudiovolume.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iclassfactory.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iconnectionpoint.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iconnectionpointcontainer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/idesktopwallpaper.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/idispatch.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumidlist.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienummoniker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumnetworkconnections.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumnetworks.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumresources.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumspellingerror.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumstring.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumvariant.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumwbemclassobject.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ierrorinfo.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialog.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialog2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialogcustomize.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifileisinuse.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifileopendialog.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifilesavedialog.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iinitializewithwindow.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iinspectable.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iknownfolder.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iknownfoldermanager.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataassemblyimport.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatadispenser.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatadispenserex.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataimport.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataimport2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatatables.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatatables2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdevice.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdevicecollection.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdeviceenumerator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immendpoint.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immnotificationclient.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imodalwindow.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imoniker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetwork.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworkconnection.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworklistmanager.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworklistmanagerevents.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersist.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersistfile.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersistmemory.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersiststream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipropertystore.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iprovideclassinfo.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/irestrictederrorinfo.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/irunningobjecttable.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensor.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensorcollection.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensordatareport.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensormanager.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isequentialstream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellfolder.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitem.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitem2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemarray.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemfilter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemimagefactory.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemresources.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllinkdatalist.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllinkdual.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellservice.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isimpleaudiovolume.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechaudioformat.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechbasestream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechobjecttoken.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechobjecttokens.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechvoice.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechvoicestatus.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechwaveformatex.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellchecker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellchecker2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellcheckerchangedeventhandler.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellcheckerfactory.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellingerror.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeventsource.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispnotifysource.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispvoice.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/istream.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isupporterrorinfo.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/itypeinfo.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation4.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation5.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation6.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationandcondition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationannotationpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationboolcondition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcacherequest.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcondition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcustomnavigationpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdockpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdragpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdroptargetpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement4.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement5.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement6.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement7.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement8.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement9.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelementarray.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationexpandcollapsepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationgriditempattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationgridpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationinvokepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationitemcontainerpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationlegacyiaccessiblepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationmultipleviewpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationnotcondition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationobjectmodelpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationorcondition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationpropertycondition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactory.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactoryentry.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactorymapping.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationrangevaluepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationscrollitempattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationscrollpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionitempattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionpattern2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationspreadsheetitempattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationspreadsheetpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationstylespattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationsynchronizedinputpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtableitempattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtablepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextchildpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtexteditpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextpattern2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange3.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrangearray.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtogglepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtransformpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtransformpattern2.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtreewalker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationvaluepattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationvirtualizeditempattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationwindowpattern.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iunknown.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuri.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ivirtualdesktopmanager.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemclassobject.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemconfigurerefresher.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemcontext.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemhiperfenum.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemlocator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemobjectaccess.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemrefresher.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemservices.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwebauthenticationcoremanagerinterop.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwinhttprequest.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/combase.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants_metadata.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants_nodoc.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/dispatcher.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/enums.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/enums.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/exceptions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/_internal.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/dialogs.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/filetime.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/int_to_hexstring.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/list_to_blob.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_ansi.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_string.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_string_array.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/unpack_utf16.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/functions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/guid.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/inline.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/macros.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/propertykey.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/structs.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/structs.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/types.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/variant.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/advapi32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_apiquery_l2_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_comm_l1_1_1.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_comm_l1_1_2.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_handle_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_path_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_sysinfo_l1_2_3.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_error_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_string_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_ro_typeresolution_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_ro_typeresolution_l1_1_1.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_shcore_scaling_l1_1_1.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_wsl_api_l1_1_0.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/bluetoothapis.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/bthprops.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/comctl32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/comdlg32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/crypt32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dbghelp.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dwmapi.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dxva2.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/gdi32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/iphlpapi.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/kernel32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/magnification.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/netapi32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/ntdll.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/ole32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/oleaut32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/powrprof.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/propsys.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/rometadata.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/scarddlg.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/setupapi.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/shell32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/shlwapi.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/user32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/uxtheme.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/version.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wevtapi.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winmm.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winscard.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winspool.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wlanapi.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wtsapi32.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/xinput1_4.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/winmd_constants.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/winrt_helpers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/win32.dart /home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/lib/xdg_directories.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/main.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/chat_response.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/device.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/document.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/upload_response.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/providers/app_state.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/chat_screen.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/devices_screen.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/documents_screen.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/services/api_service.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/animated_button.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/device_card.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/document_card.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/upload_screen.dart diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/kernel_snapshot_program.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/kernel_snapshot_program.stamp new file mode 100644 index 0000000..b281ba2 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/kernel_snapshot_program.stamp @@ -0,0 +1 @@ +{"inputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json","/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/common.dart","/opt/flutter/bin/cache/engine.stamp","/opt/flutter/bin/cache/engine.stamp","/opt/flutter/bin/cache/engine.stamp","/opt/flutter/bin/cache/engine.stamp","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/async.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/async_cache.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/async_memoizer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/byte_collector.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/cancelable_operation.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/chunked_stream_reader.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/event_sink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/future.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/sink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_consumer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_sink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/delegate/stream_subscription.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/future_group.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/lazy_stream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/null_stream_sink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/restartable_timer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/capture_sink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/capture_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/error.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/future.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/release_sink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/release_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/result.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/result/value.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/single_subscription_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/sink_base.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_closer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_completer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_extensions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_group.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_queue.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_completer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_extensions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/handler_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/reject_errors.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_sink_transformer/typed.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_splitter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_subscription_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/stream_zip.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/subscription_stream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/typed/stream_subscription.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1/lib/src/typed_stream_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/characters.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/characters.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/characters_impl.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/extensions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/breaks.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/constants.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1/lib/src/grapheme_clusters/table.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/collection.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/algorithms.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/boollist.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/unmodifiable_wrappers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/canonicalized_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterable.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_list.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/comparators.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/empty_unmodifiable_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/functions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_extensions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_zip.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/list_extensions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/priority_queue.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/queue_list.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set_controller.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/wrappers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/cross_file.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/types/base.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/types/io.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2/lib/src/x_file.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/dio.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/io.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/adapter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/adapters/io_adapter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/cancel_token.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/compute/compute.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/compute/compute_io.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio/dio_for_native.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio_mixin.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/dio_exception.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptor.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/form_data.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/headers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptors/imply_content_type.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/interceptors/log.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/multipart_file.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/multipart_file/io_multipart_file.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/options.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/parameter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/progress_stream/io_progress_stream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/redirect_record.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/response.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/response/response_stream_handler.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/background_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/fused_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/sync_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/util/consolidate_bytes.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/transformers/util/transform_empty_to_null.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/ffi.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/allocation.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/arena.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/utf16.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0/lib/src/utf8.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/file_picker.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/exceptions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_io.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_macos.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/file_picker_result.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/dialog_handler.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/file_picker_linux.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/kdialog_handler.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/linux/qarma_and_zenity_handler.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/platform_file.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/windows/file_picker_windows.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/lib/src/windows/file_picker_windows_ffi_types.dart","/opt/flutter/packages/flutter/lib/animation.dart","/opt/flutter/packages/flutter/lib/cupertino.dart","/opt/flutter/packages/flutter/lib/foundation.dart","/opt/flutter/packages/flutter/lib/gestures.dart","/opt/flutter/packages/flutter/lib/material.dart","/opt/flutter/packages/flutter/lib/painting.dart","/opt/flutter/packages/flutter/lib/physics.dart","/opt/flutter/packages/flutter/lib/rendering.dart","/opt/flutter/packages/flutter/lib/scheduler.dart","/opt/flutter/packages/flutter/lib/semantics.dart","/opt/flutter/packages/flutter/lib/services.dart","/opt/flutter/packages/flutter/lib/src/animation/animation.dart","/opt/flutter/packages/flutter/lib/src/animation/animation_controller.dart","/opt/flutter/packages/flutter/lib/src/animation/listener_helpers.dart","/opt/flutter/packages/flutter/lib/src/animation/animation_style.dart","/opt/flutter/packages/flutter/lib/src/foundation/diagnostics.dart","/opt/flutter/packages/flutter/lib/src/animation/animations.dart","/opt/flutter/packages/flutter/lib/src/animation/curves.dart","/opt/flutter/packages/flutter/lib/src/animation/tween.dart","/opt/flutter/packages/flutter/lib/src/animation/tween_sequence.dart","/opt/flutter/packages/flutter/lib/src/cupertino/activity_indicator.dart","/opt/flutter/packages/flutter/lib/src/widgets/ticker_provider.dart","/opt/flutter/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/app.dart","/opt/flutter/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/button.dart","/opt/flutter/packages/flutter/lib/src/cupertino/checkbox.dart","/opt/flutter/packages/flutter/lib/src/widgets/toggleable.dart","/opt/flutter/packages/flutter/lib/src/cupertino/colors.dart","/opt/flutter/packages/flutter/lib/src/cupertino/constants.dart","/opt/flutter/packages/flutter/lib/src/cupertino/context_menu.dart","/opt/flutter/packages/flutter/lib/src/cupertino/context_menu_action.dart","/opt/flutter/packages/flutter/lib/src/cupertino/cupertino_focus_halo.dart","/opt/flutter/packages/flutter/lib/src/cupertino/date_picker.dart","/opt/flutter/packages/flutter/lib/src/cupertino/debug.dart","/opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection.dart","/opt/flutter/packages/flutter/lib/src/widgets/text_selection.dart","/opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart","/opt/flutter/packages/flutter/lib/src/cupertino/dialog.dart","/opt/flutter/packages/flutter/lib/src/cupertino/expansion_tile.dart","/opt/flutter/packages/flutter/lib/src/cupertino/form_row.dart","/opt/flutter/packages/flutter/lib/src/cupertino/form_section.dart","/opt/flutter/packages/flutter/lib/src/cupertino/icon_theme_data.dart","/opt/flutter/packages/flutter/lib/src/cupertino/icons.dart","/opt/flutter/packages/flutter/lib/src/cupertino/interface_level.dart","/opt/flutter/packages/flutter/lib/src/cupertino/list_section.dart","/opt/flutter/packages/flutter/lib/src/cupertino/list_tile.dart","/opt/flutter/packages/flutter/lib/src/cupertino/localizations.dart","/opt/flutter/packages/flutter/lib/src/cupertino/magnifier.dart","/opt/flutter/packages/flutter/lib/src/cupertino/nav_bar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/page_scaffold.dart","/opt/flutter/packages/flutter/lib/src/widgets/binding.dart","/opt/flutter/packages/flutter/lib/src/cupertino/picker.dart","/opt/flutter/packages/flutter/lib/src/cupertino/radio.dart","/opt/flutter/packages/flutter/lib/src/cupertino/refresh.dart","/opt/flutter/packages/flutter/lib/src/rendering/object.dart","/opt/flutter/packages/flutter/lib/src/cupertino/route.dart","/opt/flutter/packages/flutter/lib/src/cupertino/scrollbar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/search_field.dart","/opt/flutter/packages/flutter/lib/src/widgets/restoration.dart","/opt/flutter/packages/flutter/lib/src/cupertino/segmented_control.dart","/opt/flutter/packages/flutter/lib/src/widgets/radio_group.dart","/opt/flutter/packages/flutter/lib/src/rendering/box.dart","/opt/flutter/packages/flutter/lib/src/cupertino/sheet.dart","/opt/flutter/packages/flutter/lib/src/cupertino/slider.dart","/opt/flutter/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart","/opt/flutter/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/switch.dart","/opt/flutter/packages/flutter/lib/src/cupertino/tab_scaffold.dart","/opt/flutter/packages/flutter/lib/src/cupertino/tab_view.dart","/opt/flutter/packages/flutter/lib/src/cupertino/text_field.dart","/opt/flutter/packages/flutter/lib/src/widgets/automatic_keep_alive.dart","/opt/flutter/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart","/opt/flutter/packages/flutter/lib/src/cupertino/text_form_field_row.dart","/opt/flutter/packages/flutter/lib/src/cupertino/text_selection.dart","/opt/flutter/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart","/opt/flutter/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart","/opt/flutter/packages/flutter/lib/src/cupertino/text_theme.dart","/opt/flutter/packages/flutter/lib/src/cupertino/theme.dart","/opt/flutter/packages/flutter/lib/src/cupertino/thumb_painter.dart","/opt/flutter/packages/flutter/lib/src/dart_plugin_registrant.dart","/opt/flutter/packages/flutter/lib/src/foundation/_bitfield_io.dart","/opt/flutter/packages/flutter/lib/src/foundation/_capabilities_io.dart","/opt/flutter/packages/flutter/lib/src/foundation/_features.dart","/opt/flutter/packages/flutter/lib/src/foundation/_isolates_io.dart","/opt/flutter/packages/flutter/lib/src/foundation/_platform_io.dart","/opt/flutter/packages/flutter/lib/src/foundation/_timeline_io.dart","/opt/flutter/packages/flutter/lib/src/foundation/annotations.dart","/opt/flutter/packages/flutter/lib/src/foundation/assertions.dart","/opt/flutter/packages/flutter/lib/src/foundation/basic_types.dart","/opt/flutter/packages/flutter/lib/src/foundation/binding.dart","/opt/flutter/packages/flutter/lib/src/foundation/bitfield.dart","/opt/flutter/packages/flutter/lib/src/foundation/capabilities.dart","/opt/flutter/packages/flutter/lib/src/foundation/change_notifier.dart","/opt/flutter/packages/flutter/lib/src/foundation/collections.dart","/opt/flutter/packages/flutter/lib/src/foundation/consolidate_response.dart","/opt/flutter/packages/flutter/lib/src/foundation/constants.dart","/opt/flutter/packages/flutter/lib/src/foundation/debug.dart","/opt/flutter/packages/flutter/lib/src/foundation/isolates.dart","/opt/flutter/packages/flutter/lib/src/foundation/key.dart","/opt/flutter/packages/flutter/lib/src/foundation/licenses.dart","/opt/flutter/packages/flutter/lib/src/foundation/memory_allocations.dart","/opt/flutter/packages/flutter/lib/src/foundation/node.dart","/opt/flutter/packages/flutter/lib/src/foundation/object.dart","/opt/flutter/packages/flutter/lib/src/foundation/observer_list.dart","/opt/flutter/packages/flutter/lib/src/foundation/persistent_hash_map.dart","/opt/flutter/packages/flutter/lib/src/foundation/platform.dart","/opt/flutter/packages/flutter/lib/src/foundation/print.dart","/opt/flutter/packages/flutter/lib/src/foundation/serialization.dart","/opt/flutter/packages/flutter/lib/src/foundation/service_extensions.dart","/opt/flutter/packages/flutter/lib/src/foundation/stack_frame.dart","/opt/flutter/packages/flutter/lib/src/foundation/synchronous_future.dart","/opt/flutter/packages/flutter/lib/src/foundation/timeline.dart","/opt/flutter/packages/flutter/lib/src/foundation/unicode.dart","/opt/flutter/packages/flutter/lib/src/gestures/arena.dart","/opt/flutter/packages/flutter/lib/src/gestures/binding.dart","/opt/flutter/packages/flutter/lib/src/gestures/constants.dart","/opt/flutter/packages/flutter/lib/src/gestures/converter.dart","/opt/flutter/packages/flutter/lib/src/gestures/debug.dart","/opt/flutter/packages/flutter/lib/src/gestures/drag.dart","/opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart","/opt/flutter/packages/flutter/lib/src/gestures/eager.dart","/opt/flutter/packages/flutter/lib/src/gestures/events.dart","/opt/flutter/packages/flutter/lib/src/gestures/force_press.dart","/opt/flutter/packages/flutter/lib/src/gestures/gesture_details.dart","/opt/flutter/packages/flutter/lib/src/gestures/gesture_settings.dart","/opt/flutter/packages/flutter/lib/src/gestures/hit_test.dart","/opt/flutter/packages/flutter/lib/src/gestures/long_press.dart","/opt/flutter/packages/flutter/lib/src/gestures/lsq_solver.dart","/opt/flutter/packages/flutter/lib/src/gestures/monodrag.dart","/opt/flutter/packages/flutter/lib/src/gestures/multidrag.dart","/opt/flutter/packages/flutter/lib/src/gestures/multitap.dart","/opt/flutter/packages/flutter/lib/src/gestures/pointer_router.dart","/opt/flutter/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart","/opt/flutter/packages/flutter/lib/src/gestures/recognizer.dart","/opt/flutter/packages/flutter/lib/src/gestures/resampler.dart","/opt/flutter/packages/flutter/lib/src/gestures/scale.dart","/opt/flutter/packages/flutter/lib/src/gestures/tap.dart","/opt/flutter/packages/flutter/lib/src/gestures/tap_and_drag.dart","/opt/flutter/packages/flutter/lib/src/gestures/team.dart","/opt/flutter/packages/flutter/lib/src/gestures/velocity_tracker.dart","/opt/flutter/packages/flutter/lib/src/material/about.dart","/opt/flutter/packages/flutter/lib/src/material/action_buttons.dart","/opt/flutter/packages/flutter/lib/src/material/action_chip.dart","/opt/flutter/packages/flutter/lib/src/material/action_icons_theme.dart","/opt/flutter/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/animated_icons.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart","/opt/flutter/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart","/opt/flutter/packages/flutter/lib/src/material/app.dart","/opt/flutter/packages/flutter/lib/src/material/app_bar.dart","/opt/flutter/packages/flutter/lib/src/material/app_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/arc.dart","/opt/flutter/packages/flutter/lib/src/material/autocomplete.dart","/opt/flutter/packages/flutter/lib/src/material/back_button.dart","/opt/flutter/packages/flutter/lib/src/material/badge.dart","/opt/flutter/packages/flutter/lib/src/material/badge_theme.dart","/opt/flutter/packages/flutter/lib/src/material/banner.dart","/opt/flutter/packages/flutter/lib/src/material/banner_theme.dart","/opt/flutter/packages/flutter/lib/src/material/bottom_app_bar.dart","/opt/flutter/packages/flutter/lib/src/material/bottom_app_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/bottom_navigation_bar.dart","/opt/flutter/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/bottom_sheet.dart","/opt/flutter/packages/flutter/lib/src/material/bottom_sheet_theme.dart","/opt/flutter/packages/flutter/lib/src/material/button.dart","/opt/flutter/packages/flutter/lib/src/material/material_state_mixin.dart","/opt/flutter/packages/flutter/lib/src/material/button_bar.dart","/opt/flutter/packages/flutter/lib/src/material/button_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/button_style.dart","/opt/flutter/packages/flutter/lib/src/material/button_style_button.dart","/opt/flutter/packages/flutter/lib/src/material/button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/calendar_date_picker.dart","/opt/flutter/packages/flutter/lib/src/material/card.dart","/opt/flutter/packages/flutter/lib/src/material/card_theme.dart","/opt/flutter/packages/flutter/lib/src/material/carousel.dart","/opt/flutter/packages/flutter/lib/src/material/carousel_theme.dart","/opt/flutter/packages/flutter/lib/src/material/checkbox.dart","/opt/flutter/packages/flutter/lib/src/material/checkbox_list_tile.dart","/opt/flutter/packages/flutter/lib/src/material/checkbox_theme.dart","/opt/flutter/packages/flutter/lib/src/material/chip.dart","/opt/flutter/packages/flutter/lib/src/material/chip_theme.dart","/opt/flutter/packages/flutter/lib/src/material/choice_chip.dart","/opt/flutter/packages/flutter/lib/src/material/circle_avatar.dart","/opt/flutter/packages/flutter/lib/src/material/color_scheme.dart","/opt/flutter/packages/flutter/lib/src/material/colors.dart","/opt/flutter/packages/flutter/lib/src/material/constants.dart","/opt/flutter/packages/flutter/lib/src/material/curves.dart","/opt/flutter/packages/flutter/lib/src/material/data_table.dart","/opt/flutter/packages/flutter/lib/src/material/data_table_source.dart","/opt/flutter/packages/flutter/lib/src/material/data_table_theme.dart","/opt/flutter/packages/flutter/lib/src/material/date.dart","/opt/flutter/packages/flutter/lib/src/material/date_picker.dart","/opt/flutter/packages/flutter/lib/src/material/date_picker_theme.dart","/opt/flutter/packages/flutter/lib/src/material/debug.dart","/opt/flutter/packages/flutter/lib/src/material/desktop_text_selection.dart","/opt/flutter/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart","/opt/flutter/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart","/opt/flutter/packages/flutter/lib/src/material/dialog.dart","/opt/flutter/packages/flutter/lib/src/material/dialog_theme.dart","/opt/flutter/packages/flutter/lib/src/material/divider.dart","/opt/flutter/packages/flutter/lib/src/material/divider_theme.dart","/opt/flutter/packages/flutter/lib/src/material/drawer.dart","/opt/flutter/packages/flutter/lib/src/material/drawer_header.dart","/opt/flutter/packages/flutter/lib/src/material/drawer_theme.dart","/opt/flutter/packages/flutter/lib/src/material/dropdown.dart","/opt/flutter/packages/flutter/lib/src/material/dropdown_menu.dart","/opt/flutter/packages/flutter/lib/src/material/dropdown_menu_form_field.dart","/opt/flutter/packages/flutter/lib/src/material/dropdown_menu_theme.dart","/opt/flutter/packages/flutter/lib/src/material/elevated_button.dart","/opt/flutter/packages/flutter/lib/src/material/elevated_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/elevation_overlay.dart","/opt/flutter/packages/flutter/lib/src/material/expand_icon.dart","/opt/flutter/packages/flutter/lib/src/material/expansion_panel.dart","/opt/flutter/packages/flutter/lib/src/material/expansion_tile.dart","/opt/flutter/packages/flutter/lib/src/material/expansion_tile_theme.dart","/opt/flutter/packages/flutter/lib/src/material/filled_button.dart","/opt/flutter/packages/flutter/lib/src/material/filled_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/filter_chip.dart","/opt/flutter/packages/flutter/lib/src/material/flexible_space_bar.dart","/opt/flutter/packages/flutter/lib/src/material/floating_action_button.dart","/opt/flutter/packages/flutter/lib/src/material/floating_action_button_location.dart","/opt/flutter/packages/flutter/lib/src/material/floating_action_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/grid_tile.dart","/opt/flutter/packages/flutter/lib/src/material/grid_tile_bar.dart","/opt/flutter/packages/flutter/lib/src/material/icon_button.dart","/opt/flutter/packages/flutter/lib/src/material/icon_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/icons.dart","/opt/flutter/packages/flutter/lib/src/material/ink_decoration.dart","/opt/flutter/packages/flutter/lib/src/material/ink_highlight.dart","/opt/flutter/packages/flutter/lib/src/material/ink_ripple.dart","/opt/flutter/packages/flutter/lib/src/material/ink_sparkle.dart","/opt/flutter/packages/flutter/lib/src/material/ink_splash.dart","/opt/flutter/packages/flutter/lib/src/material/ink_well.dart","/opt/flutter/packages/flutter/lib/src/material/input_border.dart","/opt/flutter/packages/flutter/lib/src/material/input_chip.dart","/opt/flutter/packages/flutter/lib/src/material/input_date_picker_form_field.dart","/opt/flutter/packages/flutter/lib/src/material/input_decorator.dart","/opt/flutter/packages/flutter/lib/src/material/list_tile.dart","/opt/flutter/packages/flutter/lib/src/material/list_tile_theme.dart","/opt/flutter/packages/flutter/lib/src/material/magnifier.dart","/opt/flutter/packages/flutter/lib/src/material/material.dart","/opt/flutter/packages/flutter/lib/src/material/material_button.dart","/opt/flutter/packages/flutter/lib/src/material/material_localizations.dart","/opt/flutter/packages/flutter/lib/src/material/material_state.dart","/opt/flutter/packages/flutter/lib/src/material/menu_anchor.dart","/opt/flutter/packages/flutter/lib/src/material/menu_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/menu_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/menu_style.dart","/opt/flutter/packages/flutter/lib/src/material/menu_theme.dart","/opt/flutter/packages/flutter/lib/src/material/mergeable_material.dart","/opt/flutter/packages/flutter/lib/src/material/motion.dart","/opt/flutter/packages/flutter/lib/src/material/navigation_bar.dart","/opt/flutter/packages/flutter/lib/src/material/navigation_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/navigation_drawer.dart","/opt/flutter/packages/flutter/lib/src/material/navigation_drawer_theme.dart","/opt/flutter/packages/flutter/lib/src/material/navigation_rail.dart","/opt/flutter/packages/flutter/lib/src/material/navigation_rail_theme.dart","/opt/flutter/packages/flutter/lib/src/material/no_splash.dart","/opt/flutter/packages/flutter/lib/src/material/outlined_button.dart","/opt/flutter/packages/flutter/lib/src/material/outlined_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/page.dart","/opt/flutter/packages/flutter/lib/src/material/page_transitions_theme.dart","/opt/flutter/packages/flutter/lib/src/material/paginated_data_table.dart","/opt/flutter/packages/flutter/lib/src/material/popup_menu.dart","/opt/flutter/packages/flutter/lib/src/material/popup_menu_theme.dart","/opt/flutter/packages/flutter/lib/src/material/predictive_back_page_transitions_builder.dart","/opt/flutter/packages/flutter/lib/src/material/progress_indicator.dart","/opt/flutter/packages/flutter/lib/src/material/progress_indicator_theme.dart","/opt/flutter/packages/flutter/lib/src/material/radio.dart","/opt/flutter/packages/flutter/lib/src/material/radio_list_tile.dart","/opt/flutter/packages/flutter/lib/src/material/radio_theme.dart","/opt/flutter/packages/flutter/lib/src/material/range_slider.dart","/opt/flutter/packages/flutter/lib/src/material/range_slider_parts.dart","/opt/flutter/packages/flutter/lib/src/material/refresh_indicator.dart","/opt/flutter/packages/flutter/lib/src/material/reorderable_list.dart","/opt/flutter/packages/flutter/lib/src/material/scaffold.dart","/opt/flutter/packages/flutter/lib/src/material/scrollbar.dart","/opt/flutter/packages/flutter/lib/src/material/scrollbar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/search.dart","/opt/flutter/packages/flutter/lib/src/material/search_anchor.dart","/opt/flutter/packages/flutter/lib/src/material/search_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/search_view_theme.dart","/opt/flutter/packages/flutter/lib/src/material/segmented_button.dart","/opt/flutter/packages/flutter/lib/src/material/segmented_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/selectable_text.dart","/opt/flutter/packages/flutter/lib/src/material/selection_area.dart","/opt/flutter/packages/flutter/lib/src/material/shadows.dart","/opt/flutter/packages/flutter/lib/src/material/slider.dart","/opt/flutter/packages/flutter/lib/src/material/slider_parts.dart","/opt/flutter/packages/flutter/lib/src/material/slider_theme.dart","/opt/flutter/packages/flutter/lib/src/material/slider_value_indicator_shape.dart","/opt/flutter/packages/flutter/lib/src/material/snack_bar.dart","/opt/flutter/packages/flutter/lib/src/material/snack_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart","/opt/flutter/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart","/opt/flutter/packages/flutter/lib/src/material/stepper.dart","/opt/flutter/packages/flutter/lib/src/material/switch.dart","/opt/flutter/packages/flutter/lib/src/material/switch_list_tile.dart","/opt/flutter/packages/flutter/lib/src/material/switch_theme.dart","/opt/flutter/packages/flutter/lib/src/material/tab_bar_theme.dart","/opt/flutter/packages/flutter/lib/src/material/tab_controller.dart","/opt/flutter/packages/flutter/lib/src/material/tab_indicator.dart","/opt/flutter/packages/flutter/lib/src/material/tabs.dart","/opt/flutter/packages/flutter/lib/src/material/text_button.dart","/opt/flutter/packages/flutter/lib/src/material/text_button_theme.dart","/opt/flutter/packages/flutter/lib/src/material/text_field.dart","/opt/flutter/packages/flutter/lib/src/material/text_form_field.dart","/opt/flutter/packages/flutter/lib/src/material/text_selection.dart","/opt/flutter/packages/flutter/lib/src/material/text_selection_theme.dart","/opt/flutter/packages/flutter/lib/src/material/text_selection_toolbar.dart","/opt/flutter/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart","/opt/flutter/packages/flutter/lib/src/material/text_theme.dart","/opt/flutter/packages/flutter/lib/src/material/theme.dart","/opt/flutter/packages/flutter/lib/src/material/theme_data.dart","/opt/flutter/packages/flutter/lib/src/material/time.dart","/opt/flutter/packages/flutter/lib/src/material/time_picker.dart","/opt/flutter/packages/flutter/lib/src/material/time_picker_theme.dart","/opt/flutter/packages/flutter/lib/src/material/toggle_buttons.dart","/opt/flutter/packages/flutter/lib/src/material/toggle_buttons_theme.dart","/opt/flutter/packages/flutter/lib/src/material/tooltip.dart","/opt/flutter/packages/flutter/lib/src/material/tooltip_theme.dart","/opt/flutter/packages/flutter/lib/src/material/tooltip_visibility.dart","/opt/flutter/packages/flutter/lib/src/material/typography.dart","/opt/flutter/packages/flutter/lib/src/material/user_accounts_drawer_header.dart","/opt/flutter/packages/flutter/lib/src/painting/_network_image_io.dart","/opt/flutter/packages/flutter/lib/src/painting/_web_image_info_io.dart","/opt/flutter/packages/flutter/lib/src/painting/alignment.dart","/opt/flutter/packages/flutter/lib/src/painting/basic_types.dart","/opt/flutter/packages/flutter/lib/src/painting/beveled_rectangle_border.dart","/opt/flutter/packages/flutter/lib/src/painting/binding.dart","/opt/flutter/packages/flutter/lib/src/painting/border_radius.dart","/opt/flutter/packages/flutter/lib/src/painting/borders.dart","/opt/flutter/packages/flutter/lib/src/painting/box_border.dart","/opt/flutter/packages/flutter/lib/src/painting/box_decoration.dart","/opt/flutter/packages/flutter/lib/src/painting/box_fit.dart","/opt/flutter/packages/flutter/lib/src/painting/box_shadow.dart","/opt/flutter/packages/flutter/lib/src/painting/circle_border.dart","/opt/flutter/packages/flutter/lib/src/painting/clip.dart","/opt/flutter/packages/flutter/lib/src/painting/colors.dart","/opt/flutter/packages/flutter/lib/src/painting/continuous_rectangle_border.dart","/opt/flutter/packages/flutter/lib/src/painting/debug.dart","/opt/flutter/packages/flutter/lib/src/painting/decoration.dart","/opt/flutter/packages/flutter/lib/src/painting/decoration_image.dart","/opt/flutter/packages/flutter/lib/src/painting/edge_insets.dart","/opt/flutter/packages/flutter/lib/src/painting/flutter_logo.dart","/opt/flutter/packages/flutter/lib/src/painting/fractional_offset.dart","/opt/flutter/packages/flutter/lib/src/painting/geometry.dart","/opt/flutter/packages/flutter/lib/src/painting/gradient.dart","/opt/flutter/packages/flutter/lib/src/painting/image_cache.dart","/opt/flutter/packages/flutter/lib/src/painting/image_decoder.dart","/opt/flutter/packages/flutter/lib/src/painting/image_provider.dart","/opt/flutter/packages/flutter/lib/src/painting/image_resolution.dart","/opt/flutter/packages/flutter/lib/src/painting/image_stream.dart","/opt/flutter/packages/flutter/lib/src/painting/inline_span.dart","/opt/flutter/packages/flutter/lib/src/painting/linear_border.dart","/opt/flutter/packages/flutter/lib/src/painting/matrix_utils.dart","/opt/flutter/packages/flutter/lib/src/painting/notched_shapes.dart","/opt/flutter/packages/flutter/lib/src/painting/oval_border.dart","/opt/flutter/packages/flutter/lib/src/painting/paint_utilities.dart","/opt/flutter/packages/flutter/lib/src/painting/placeholder_span.dart","/opt/flutter/packages/flutter/lib/src/painting/rounded_rectangle_border.dart","/opt/flutter/packages/flutter/lib/src/painting/shader_warm_up.dart","/opt/flutter/packages/flutter/lib/src/painting/shape_decoration.dart","/opt/flutter/packages/flutter/lib/src/painting/stadium_border.dart","/opt/flutter/packages/flutter/lib/src/painting/star_border.dart","/opt/flutter/packages/flutter/lib/src/painting/strut_style.dart","/opt/flutter/packages/flutter/lib/src/painting/text_painter.dart","/opt/flutter/packages/flutter/lib/src/painting/text_scaler.dart","/opt/flutter/packages/flutter/lib/src/painting/text_span.dart","/opt/flutter/packages/flutter/lib/src/painting/text_style.dart","/opt/flutter/packages/flutter/lib/src/physics/clamped_simulation.dart","/opt/flutter/packages/flutter/lib/src/physics/friction_simulation.dart","/opt/flutter/packages/flutter/lib/src/physics/gravity_simulation.dart","/opt/flutter/packages/flutter/lib/src/physics/simulation.dart","/opt/flutter/packages/flutter/lib/src/physics/spring_simulation.dart","/opt/flutter/packages/flutter/lib/src/physics/tolerance.dart","/opt/flutter/packages/flutter/lib/src/physics/utils.dart","/opt/flutter/packages/flutter/lib/src/rendering/animated_size.dart","/opt/flutter/packages/flutter/lib/src/rendering/binding.dart","/opt/flutter/packages/flutter/lib/src/scheduler/binding.dart","/opt/flutter/packages/flutter/lib/src/services/binding.dart","/opt/flutter/packages/flutter/lib/src/semantics/binding.dart","/opt/flutter/packages/flutter/lib/src/rendering/custom_layout.dart","/opt/flutter/packages/flutter/lib/src/rendering/custom_paint.dart","/opt/flutter/packages/flutter/lib/src/rendering/debug.dart","/opt/flutter/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart","/opt/flutter/packages/flutter/lib/src/rendering/decorated_sliver.dart","/opt/flutter/packages/flutter/lib/src/rendering/editable.dart","/opt/flutter/packages/flutter/lib/src/rendering/paragraph.dart","/opt/flutter/packages/flutter/lib/src/rendering/error.dart","/opt/flutter/packages/flutter/lib/src/rendering/flex.dart","/opt/flutter/packages/flutter/lib/src/rendering/flow.dart","/opt/flutter/packages/flutter/lib/src/rendering/image.dart","/opt/flutter/packages/flutter/lib/src/rendering/image_filter_config.dart","/opt/flutter/packages/flutter/lib/src/rendering/layer.dart","/opt/flutter/packages/flutter/lib/src/rendering/layout_helper.dart","/opt/flutter/packages/flutter/lib/src/rendering/list_body.dart","/opt/flutter/packages/flutter/lib/src/rendering/list_wheel_viewport.dart","/opt/flutter/packages/flutter/lib/src/rendering/mouse_tracker.dart","/opt/flutter/packages/flutter/lib/src/rendering/selection.dart","/opt/flutter/packages/flutter/lib/src/rendering/performance_overlay.dart","/opt/flutter/packages/flutter/lib/src/rendering/platform_view.dart","/opt/flutter/packages/flutter/lib/src/rendering/proxy_box.dart","/opt/flutter/packages/flutter/lib/src/rendering/proxy_sliver.dart","/opt/flutter/packages/flutter/lib/src/rendering/rotated_box.dart","/opt/flutter/packages/flutter/lib/src/rendering/service_extensions.dart","/opt/flutter/packages/flutter/lib/src/rendering/shifted_box.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_fill.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_grid.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_group.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_list.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_padding.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_persistent_header.dart","/opt/flutter/packages/flutter/lib/src/rendering/sliver_tree.dart","/opt/flutter/packages/flutter/lib/src/rendering/stack.dart","/opt/flutter/packages/flutter/lib/src/rendering/table.dart","/opt/flutter/packages/flutter/lib/src/rendering/table_border.dart","/opt/flutter/packages/flutter/lib/src/rendering/texture.dart","/opt/flutter/packages/flutter/lib/src/rendering/tweens.dart","/opt/flutter/packages/flutter/lib/src/rendering/view.dart","/opt/flutter/packages/flutter/lib/src/rendering/viewport.dart","/opt/flutter/packages/flutter/lib/src/rendering/viewport_offset.dart","/opt/flutter/packages/flutter/lib/src/rendering/wrap.dart","/opt/flutter/packages/flutter/lib/src/scheduler/debug.dart","/opt/flutter/packages/flutter/lib/src/scheduler/priority.dart","/opt/flutter/packages/flutter/lib/src/scheduler/service_extensions.dart","/opt/flutter/packages/flutter/lib/src/scheduler/ticker.dart","/opt/flutter/packages/flutter/lib/src/semantics/debug.dart","/opt/flutter/packages/flutter/lib/src/semantics/semantics.dart","/opt/flutter/packages/flutter/lib/src/semantics/semantics_event.dart","/opt/flutter/packages/flutter/lib/src/semantics/semantics_service.dart","/opt/flutter/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart","/opt/flutter/packages/flutter/lib/src/services/asset_bundle.dart","/opt/flutter/packages/flutter/lib/src/services/asset_manifest.dart","/opt/flutter/packages/flutter/lib/src/services/autofill.dart","/opt/flutter/packages/flutter/lib/src/services/binary_messenger.dart","/opt/flutter/packages/flutter/lib/src/services/browser_context_menu.dart","/opt/flutter/packages/flutter/lib/src/services/clipboard.dart","/opt/flutter/packages/flutter/lib/src/services/debug.dart","/opt/flutter/packages/flutter/lib/src/services/deferred_component.dart","/opt/flutter/packages/flutter/lib/src/services/flavor.dart","/opt/flutter/packages/flutter/lib/src/services/flutter_version.dart","/opt/flutter/packages/flutter/lib/src/services/font_loader.dart","/opt/flutter/packages/flutter/lib/src/services/haptic_feedback.dart","/opt/flutter/packages/flutter/lib/src/services/hardware_keyboard.dart","/opt/flutter/packages/flutter/lib/src/services/keyboard_inserted_content.dart","/opt/flutter/packages/flutter/lib/src/services/keyboard_key.g.dart","/opt/flutter/packages/flutter/lib/src/services/keyboard_maps.g.dart","/opt/flutter/packages/flutter/lib/src/services/live_text.dart","/opt/flutter/packages/flutter/lib/src/services/message_codec.dart","/opt/flutter/packages/flutter/lib/src/services/message_codecs.dart","/opt/flutter/packages/flutter/lib/src/services/mouse_cursor.dart","/opt/flutter/packages/flutter/lib/src/services/mouse_tracking.dart","/opt/flutter/packages/flutter/lib/src/services/platform_channel.dart","/opt/flutter/packages/flutter/lib/src/services/platform_views.dart","/opt/flutter/packages/flutter/lib/src/services/predictive_back_event.dart","/opt/flutter/packages/flutter/lib/src/services/process_text.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_android.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_ios.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_linux.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_macos.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_web.dart","/opt/flutter/packages/flutter/lib/src/services/raw_keyboard_windows.dart","/opt/flutter/packages/flutter/lib/src/services/restoration.dart","/opt/flutter/packages/flutter/lib/src/services/scribe.dart","/opt/flutter/packages/flutter/lib/src/services/sensitive_content.dart","/opt/flutter/packages/flutter/lib/src/services/service_extensions.dart","/opt/flutter/packages/flutter/lib/src/services/spell_check.dart","/opt/flutter/packages/flutter/lib/src/services/system_channels.dart","/opt/flutter/packages/flutter/lib/src/services/system_chrome.dart","/opt/flutter/packages/flutter/lib/src/services/system_navigator.dart","/opt/flutter/packages/flutter/lib/src/services/system_sound.dart","/opt/flutter/packages/flutter/lib/src/services/text_boundary.dart","/opt/flutter/packages/flutter/lib/src/services/text_editing.dart","/opt/flutter/packages/flutter/lib/src/services/text_editing_delta.dart","/opt/flutter/packages/flutter/lib/src/services/text_formatter.dart","/opt/flutter/packages/flutter/lib/src/services/text_input.dart","/opt/flutter/packages/flutter/lib/src/services/text_layout_metrics.dart","/opt/flutter/packages/flutter/lib/src/services/undo_manager.dart","/opt/flutter/packages/flutter/lib/src/widgets/_html_element_view_io.dart","/opt/flutter/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart","/opt/flutter/packages/flutter/lib/src/widgets/_web_browser_detection_io.dart","/opt/flutter/packages/flutter/lib/src/widgets/_web_image_io.dart","/opt/flutter/packages/flutter/lib/src/widgets/_window.dart","/opt/flutter/packages/flutter/lib/src/widgets/_window_io.dart","/opt/flutter/packages/flutter/lib/src/widgets/_window_linux.dart","/opt/flutter/packages/flutter/lib/src/widgets/_window_macos.dart","/opt/flutter/packages/flutter/lib/src/widgets/_window_positioner.dart","/opt/flutter/packages/flutter/lib/src/widgets/_window_win32.dart","/opt/flutter/packages/flutter/lib/src/widgets/actions.dart","/opt/flutter/packages/flutter/lib/src/widgets/adapter.dart","/opt/flutter/packages/flutter/lib/src/widgets/framework.dart","/opt/flutter/packages/flutter/lib/src/widgets/animated_cross_fade.dart","/opt/flutter/packages/flutter/lib/src/widgets/animated_scroll_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/animated_size.dart","/opt/flutter/packages/flutter/lib/src/widgets/animated_switcher.dart","/opt/flutter/packages/flutter/lib/src/widgets/annotated_region.dart","/opt/flutter/packages/flutter/lib/src/widgets/app.dart","/opt/flutter/packages/flutter/lib/src/widgets/app_lifecycle_listener.dart","/opt/flutter/packages/flutter/lib/src/widgets/async.dart","/opt/flutter/packages/flutter/lib/src/widgets/autocomplete.dart","/opt/flutter/packages/flutter/lib/src/widgets/autofill.dart","/opt/flutter/packages/flutter/lib/src/widgets/banner.dart","/opt/flutter/packages/flutter/lib/src/widgets/basic.dart","/opt/flutter/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart","/opt/flutter/packages/flutter/lib/src/widgets/color_filter.dart","/opt/flutter/packages/flutter/lib/src/widgets/constants.dart","/opt/flutter/packages/flutter/lib/src/widgets/container.dart","/opt/flutter/packages/flutter/lib/src/widgets/context_menu_button_item.dart","/opt/flutter/packages/flutter/lib/src/widgets/context_menu_controller.dart","/opt/flutter/packages/flutter/lib/src/widgets/date.dart","/opt/flutter/packages/flutter/lib/src/widgets/debug.dart","/opt/flutter/packages/flutter/lib/src/widgets/decorated_sliver.dart","/opt/flutter/packages/flutter/lib/src/widgets/default_selection_style.dart","/opt/flutter/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart","/opt/flutter/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart","/opt/flutter/packages/flutter/lib/src/widgets/dismissible.dart","/opt/flutter/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart","/opt/flutter/packages/flutter/lib/src/widgets/disposable_build_context.dart","/opt/flutter/packages/flutter/lib/src/widgets/drag_boundary.dart","/opt/flutter/packages/flutter/lib/src/widgets/drag_target.dart","/opt/flutter/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_notification.dart","/opt/flutter/packages/flutter/lib/src/widgets/dual_transition_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/editable_text.dart","/opt/flutter/packages/flutter/lib/src/widgets/expansible.dart","/opt/flutter/packages/flutter/lib/src/widgets/fade_in_image.dart","/opt/flutter/packages/flutter/lib/src/widgets/feedback.dart","/opt/flutter/packages/flutter/lib/src/widgets/flutter_logo.dart","/opt/flutter/packages/flutter/lib/src/widgets/focus_manager.dart","/opt/flutter/packages/flutter/lib/src/widgets/focus_scope.dart","/opt/flutter/packages/flutter/lib/src/widgets/focus_traversal.dart","/opt/flutter/packages/flutter/lib/src/widgets/form.dart","/opt/flutter/packages/flutter/lib/src/widgets/gesture_detector.dart","/opt/flutter/packages/flutter/lib/src/widgets/grid_paper.dart","/opt/flutter/packages/flutter/lib/src/widgets/heroes.dart","/opt/flutter/packages/flutter/lib/src/widgets/icon.dart","/opt/flutter/packages/flutter/lib/src/widgets/icon_data.dart","/opt/flutter/packages/flutter/lib/src/widgets/icon_theme.dart","/opt/flutter/packages/flutter/lib/src/widgets/icon_theme_data.dart","/opt/flutter/packages/flutter/lib/src/widgets/image.dart","/opt/flutter/packages/flutter/lib/src/widgets/image_filter.dart","/opt/flutter/packages/flutter/lib/src/widgets/image_icon.dart","/opt/flutter/packages/flutter/lib/src/widgets/implicit_animations.dart","/opt/flutter/packages/flutter/lib/src/widgets/inherited_model.dart","/opt/flutter/packages/flutter/lib/src/widgets/inherited_notifier.dart","/opt/flutter/packages/flutter/lib/src/widgets/inherited_theme.dart","/opt/flutter/packages/flutter/lib/src/widgets/interactive_viewer.dart","/opt/flutter/packages/flutter/lib/src/widgets/keyboard_listener.dart","/opt/flutter/packages/flutter/lib/src/widgets/layout_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/localizations.dart","/opt/flutter/packages/flutter/lib/src/widgets/lookup_boundary.dart","/opt/flutter/packages/flutter/lib/src/widgets/magnifier.dart","/opt/flutter/packages/flutter/lib/src/widgets/media_query.dart","/opt/flutter/packages/flutter/lib/src/widgets/modal_barrier.dart","/opt/flutter/packages/flutter/lib/src/widgets/navigation_toolbar.dart","/opt/flutter/packages/flutter/lib/src/widgets/navigator.dart","/opt/flutter/packages/flutter/lib/src/widgets/navigator_pop_handler.dart","/opt/flutter/packages/flutter/lib/src/widgets/nested_scroll_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/notification_listener.dart","/opt/flutter/packages/flutter/lib/src/widgets/orientation_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/overflow_bar.dart","/opt/flutter/packages/flutter/lib/src/widgets/overlay.dart","/opt/flutter/packages/flutter/lib/src/widgets/overscroll_indicator.dart","/opt/flutter/packages/flutter/lib/src/widgets/page_storage.dart","/opt/flutter/packages/flutter/lib/src/widgets/page_transitions_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/page_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/pages.dart","/opt/flutter/packages/flutter/lib/src/widgets/performance_overlay.dart","/opt/flutter/packages/flutter/lib/src/widgets/pinned_header_sliver.dart","/opt/flutter/packages/flutter/lib/src/widgets/placeholder.dart","/opt/flutter/packages/flutter/lib/src/widgets/platform_menu_bar.dart","/opt/flutter/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart","/opt/flutter/packages/flutter/lib/src/widgets/platform_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/pop_scope.dart","/opt/flutter/packages/flutter/lib/src/widgets/preferred_size.dart","/opt/flutter/packages/flutter/lib/src/widgets/primary_scroll_controller.dart","/opt/flutter/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart","/opt/flutter/packages/flutter/lib/src/widgets/raw_menu_anchor.dart","/opt/flutter/packages/flutter/lib/src/widgets/raw_radio.dart","/opt/flutter/packages/flutter/lib/src/widgets/raw_tooltip.dart","/opt/flutter/packages/flutter/lib/src/widgets/reorderable_list.dart","/opt/flutter/packages/flutter/lib/src/widgets/repeating_animation_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/restoration_properties.dart","/opt/flutter/packages/flutter/lib/src/widgets/router.dart","/opt/flutter/packages/flutter/lib/src/widgets/routes.dart","/opt/flutter/packages/flutter/lib/src/widgets/safe_area.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_activity.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_configuration.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_context.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_controller.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_delegate.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_metrics.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_notification_observer.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_physics.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_position.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_simulation.dart","/opt/flutter/packages/flutter/lib/src/widgets/scroll_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/scrollable.dart","/opt/flutter/packages/flutter/lib/src/widgets/scrollable_helpers.dart","/opt/flutter/packages/flutter/lib/src/widgets/scrollbar.dart","/opt/flutter/packages/flutter/lib/src/widgets/selectable_region.dart","/opt/flutter/packages/flutter/lib/src/widgets/selection_container.dart","/opt/flutter/packages/flutter/lib/src/widgets/semantics_debugger.dart","/opt/flutter/packages/flutter/lib/src/widgets/sensitive_content.dart","/opt/flutter/packages/flutter/lib/src/widgets/service_extensions.dart","/opt/flutter/packages/flutter/lib/src/widgets/shared_app_data.dart","/opt/flutter/packages/flutter/lib/src/widgets/shortcuts.dart","/opt/flutter/packages/flutter/lib/src/widgets/single_child_scroll_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_fill.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_floating_header.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_layout_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_persistent_header.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_resizing_header.dart","/opt/flutter/packages/flutter/lib/src/widgets/sliver_tree.dart","/opt/flutter/packages/flutter/lib/src/widgets/snapshot_widget.dart","/opt/flutter/packages/flutter/lib/src/widgets/spacer.dart","/opt/flutter/packages/flutter/lib/src/widgets/spell_check.dart","/opt/flutter/packages/flutter/lib/src/widgets/standard_component_type.dart","/opt/flutter/packages/flutter/lib/src/widgets/status_transitions.dart","/opt/flutter/packages/flutter/lib/src/widgets/stretch_effect.dart","/opt/flutter/packages/flutter/lib/src/widgets/system_context_menu.dart","/opt/flutter/packages/flutter/lib/src/widgets/table.dart","/opt/flutter/packages/flutter/lib/src/widgets/tap_region.dart","/opt/flutter/packages/flutter/lib/src/widgets/text.dart","/opt/flutter/packages/flutter/lib/src/widgets/text_editing_intents.dart","/opt/flutter/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart","/opt/flutter/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart","/opt/flutter/packages/flutter/lib/src/widgets/texture.dart","/opt/flutter/packages/flutter/lib/src/widgets/title.dart","/opt/flutter/packages/flutter/lib/src/widgets/transitions.dart","/opt/flutter/packages/flutter/lib/src/widgets/tween_animation_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/two_dimensional_scroll_view.dart","/opt/flutter/packages/flutter/lib/src/widgets/two_dimensional_viewport.dart","/opt/flutter/packages/flutter/lib/src/widgets/undo_history.dart","/opt/flutter/packages/flutter/lib/src/widgets/unique_widget.dart","/opt/flutter/packages/flutter/lib/src/widgets/value_listenable_builder.dart","/opt/flutter/packages/flutter/lib/src/widgets/view.dart","/opt/flutter/packages/flutter/lib/src/widgets/viewport.dart","/opt/flutter/packages/flutter/lib/src/widgets/visibility.dart","/opt/flutter/packages/flutter/lib/src/widgets/widget_inspector.dart","/opt/flutter/packages/flutter/lib/src/widgets/widget_span.dart","/opt/flutter/packages/flutter/lib/src/widgets/widget_state.dart","/opt/flutter/packages/flutter/lib/src/widgets/will_pop_scope.dart","/opt/flutter/packages/flutter/lib/widgets.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/http_parser.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/authentication_challenge.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/case_insensitive_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/charcodes.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/decoder.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/chunked_coding/encoder.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/http_date.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/media_type.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/scan.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/_internal.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/jni.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/accessors.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/core_bindings.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/errors.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jarray.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/primitive_jarrays.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jimplementer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jni.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jobject.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jreference.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jvalues.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/kotlin.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jboolean.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jbyte.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jcharacter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jdouble.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jfloat.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jinteger.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jlong.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jnumber.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jshort.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/jstring.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/lang/lang.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/method_invocation.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/jbuffer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/jbyte_buffer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/nio/nio.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/generated_bindings.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/global_env_extensions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/third_party/jni_bindings_generated.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/types.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jclass.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/jprimitives.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jiterator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jlist.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jmap.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/jset.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/util/util.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/lib/src/version_check.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/jni_flutter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/src/generated_plugin.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/lib/src/jni_flutter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/blend/blend.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/contrast/contrast.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dislike/dislike_analyzer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/dynamic_color.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/dynamic_scheme.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/material_dynamic_colors.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/src/contrast_curve.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/src/tone_delta_pair.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/dynamiccolor/variant.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/cam16.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/hct.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/src/hct_solver.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/hct/viewing_conditions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/material_color_utilities.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/palettes/core_palette.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/palettes/tonal_palette.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_celebi.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_wsmeans.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/quantizer_wu.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/src/point_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/quantize/src/point_provider_lab.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_content.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_expressive.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_fidelity.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_fruit_salad.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_monochrome.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_neutral.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_rainbow.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_tonal_spot.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/scheme/scheme_vibrant.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/score/score.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/temperature/temperature_cache.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/color_utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/math_utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0/lib/utils/string_utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta_meta.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/mime.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/bound_multipart_stream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/char_code.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/default_extension_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/extension.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/magic_number.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_multipart_transformer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_shared.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/src/mime_type.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/objective_c.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/autorelease.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/block.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/c_bindings_generated.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/cf_string.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/converter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/globals.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/internal.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_array.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_data.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_date.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_dictionary.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_enumerator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_input_stream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_mutable_data.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_number.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/ns_string.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/objective_c_bindings_exported.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/objective_c_bindings_generated.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/observer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/os_version.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/protocol_builder.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/runtime_bindings_generated.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/selector.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/lib/src/version_check.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/path.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/characters.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/context.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/internal_style.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/parsed_path.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_exception.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_map.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/posix.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/url.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/windows.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/path_provider_android.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/src/path_provider.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/lib/src/path_provider_android_real.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/path_provider_foundation.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/src/ffi_bindings.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/lib/src/path_provider_foundation_real.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/path_provider_linux.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/get_application_id.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/get_application_id_real.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/lib/src/path_provider_linux.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/path_provider_platform_interface.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/src/enums.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2/lib/src/method_channel_path_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/path_provider_windows.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/folders.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/guid.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/path_provider_windows_real.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/src/win32_wrappers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/platform.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/interface/local_platform.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/interface/platform.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6/lib/src/testing/fake_platform.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8/lib/plugin_platform_interface.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/async_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/change_notifier_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/consumer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/listenable_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/deferred_inherited_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/inherited_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/devtool.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/proxy_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/reassemble_handler.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/selector.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1/lib/src/value_listenable_provider.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/pub_semver.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/patterns.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_constraint.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_range.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0/lib/src/version_union.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/source_span.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/charcode.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/colors.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/file.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/highlighter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location_mixin.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_exception.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_mixin.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_with_context.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/charcode.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/eager_span_scanner.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/exception.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/line_scanner.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/relative_span_scanner.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/span_scanner.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/string_scanner.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/string_scanner.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/ascii_glyph_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/glyph_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/top_level.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/unicode_glyph_set.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/term_glyph.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/src/typed_buffer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/src/typed_queue.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/typed_buffers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0/lib/typed_data.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/vector_math_64.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/aabb2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/aabb3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/colors.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/frustum.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/intersection_result.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/matrix4.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/noise.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/obb3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/plane.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/quad.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/quaternion.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/ray.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/sphere.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/triangle.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/vector4.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/constants.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/error_helpers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/opengl.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0/lib/src/vector_math_64/utilities.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/bstr.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/callbacks.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iagileobject.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iapplicationactivationmanager.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfactory.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfile.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxfilesenumerator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestapplication.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestapplicationsenumerator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestospackagedependency.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackagedependenciesenumerator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackagedependency.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestpackageid.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestproperties.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader4.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader5.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader6.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxmanifestreader7.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iappxpackagereader.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiocaptureclient.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclient3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclientduckingcontrol.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclock.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclock2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudioclockadjustment.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiorenderclient.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessioncontrol.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessioncontrol2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionenumerator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionmanager.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiosessionmanager2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iaudiostreamvolume.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ibindctx.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ichannelaudiovolume.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iclassfactory.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iconnectionpoint.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iconnectionpointcontainer.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/idesktopwallpaper.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/idispatch.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumidlist.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienummoniker.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumnetworkconnections.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumnetworks.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumresources.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumspellingerror.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumstring.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumvariant.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ienumwbemclassobject.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ierrorinfo.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialog.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialog2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifiledialogcustomize.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifileisinuse.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifileopendialog.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ifilesavedialog.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iinitializewithwindow.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iinspectable.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iknownfolder.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iknownfoldermanager.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataassemblyimport.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatadispenser.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatadispenserex.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataimport.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadataimport2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatatables.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imetadatatables2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdevice.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdevicecollection.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immdeviceenumerator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immendpoint.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/immnotificationclient.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imodalwindow.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/imoniker.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetwork.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworkconnection.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworklistmanager.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/inetworklistmanagerevents.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersist.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersistfile.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersistmemory.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipersiststream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ipropertystore.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iprovideclassinfo.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/irestrictederrorinfo.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/irunningobjecttable.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensor.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensorcollection.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensordatareport.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isensormanager.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isequentialstream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellfolder.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitem.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitem2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemarray.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemfilter.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemimagefactory.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellitemresources.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllink.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllinkdatalist.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishelllinkdual.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ishellservice.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isimpleaudiovolume.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechaudioformat.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechbasestream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechobjecttoken.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechobjecttokens.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechvoice.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechvoicestatus.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeechwaveformatex.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellchecker.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellchecker2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellcheckerchangedeventhandler.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellcheckerfactory.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispellingerror.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispeventsource.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispnotifysource.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ispvoice.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/istream.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/isupporterrorinfo.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/itypeinfo.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation4.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation5.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomation6.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationandcondition.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationannotationpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationboolcondition.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcacherequest.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcondition.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationcustomnavigationpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdockpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdragpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationdroptargetpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement4.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement5.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement6.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement7.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement8.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelement9.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationelementarray.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationexpandcollapsepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationgriditempattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationgridpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationinvokepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationitemcontainerpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationlegacyiaccessiblepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationmultipleviewpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationnotcondition.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationobjectmodelpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationorcondition.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationpropertycondition.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactory.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactoryentry.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationproxyfactorymapping.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationrangevaluepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationscrollitempattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationscrollpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionitempattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationselectionpattern2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationspreadsheetitempattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationspreadsheetpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationstylespattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationsynchronizedinputpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtableitempattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtablepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextchildpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtexteditpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextpattern2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrange3.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtextrangearray.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtogglepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtransformpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtransformpattern2.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationtreewalker.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationvaluepattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationvirtualizeditempattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuiautomationwindowpattern.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iunknown.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iuri.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/ivirtualdesktopmanager.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemclassobject.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemconfigurerefresher.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemcontext.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemhiperfenum.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemlocator.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemobjectaccess.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemrefresher.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwbemservices.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwebauthenticationcoremanagerinterop.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/com/iwinhttprequest.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/combase.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants_metadata.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/constants_nodoc.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/dispatcher.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/enums.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/enums.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/exceptions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/_internal.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/dialogs.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/filetime.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/int_to_hexstring.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/list_to_blob.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_ansi.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_string.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/set_string_array.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/extensions/unpack_utf16.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/functions.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/guid.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/inline.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/macros.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/propertykey.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/structs.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/structs.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/types.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/utils.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/variant.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/advapi32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_apiquery_l2_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_comm_l1_1_1.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_comm_l1_1_2.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_handle_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_path_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_sysinfo_l1_2_3.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_error_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_core_winrt_string_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_ro_typeresolution_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_ro_typeresolution_l1_1_1.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_shcore_scaling_l1_1_1.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/api_ms_win_wsl_api_l1_1_0.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/bluetoothapis.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/bthprops.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/comctl32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/comdlg32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/crypt32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dbghelp.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dwmapi.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/dxva2.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/gdi32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/iphlpapi.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/kernel32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/magnification.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/netapi32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/ntdll.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/ole32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/oleaut32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/powrprof.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/propsys.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/rometadata.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/scarddlg.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/setupapi.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/shell32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/shlwapi.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/user32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/uxtheme.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/version.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wevtapi.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winmm.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winscard.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/winspool.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wlanapi.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/wtsapi32.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/win32/xinput1_4.g.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/winmd_constants.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/src/winrt_helpers.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0/lib/win32.dart","/home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/lib/xdg_directories.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/main.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/chat_response.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/device.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/document.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/models/upload_response.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/providers/app_state.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/chat_screen.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/devices_screen.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/documents_screen.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/services/api_service.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/animated_button.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/device_card.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/widgets/document_card.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/lib/screens/upload_screen.dart"],"outputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/app.dill"]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/linux_engine_sources.d b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/linux_engine_sources.d new file mode 100644 index 0000000..4f8dfc5 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/linux_engine_sources.d @@ -0,0 +1 @@ + /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/libflutter_linux_gtk.so /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/icudtl.dat /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registry.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_event_channel.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_message_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_application.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_method_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_message_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_dart_project.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_basic_message_channel.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_pixel_buffer_texture.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/flutter_linux.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_engine.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_view.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_response.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_messenger.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registrar.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_message_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_value.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_method_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_string_codec.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_channel.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_gl.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_call.h /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_registrar.h: /opt/flutter/bin/cache/artifacts/engine/linux-x64/libflutter_linux_gtk.so /opt/flutter/bin/cache/artifacts/engine/linux-x64/icudtl.dat /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_plugin_registry.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_event_channel.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_message_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_application.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_standard_method_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_json_message_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_dart_project.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_basic_message_channel.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_pixel_buffer_texture.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/flutter_linux.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_engine.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_view.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_response.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_binary_messenger.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_plugin_registrar.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_binary_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_standard_message_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_value.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_json_method_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_string_codec.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_channel.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture_gl.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_call.h /opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture_registrar.h \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json new file mode 100644 index 0000000..523bfc7 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/native_assets.json @@ -0,0 +1 @@ +{"format-version":[1,0,0],"native-assets":{}} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/outputs.json b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/outputs.json new file mode 100644 index 0000000..2fa413f --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/outputs.json @@ -0,0 +1 @@ +["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/libflutter_linux_gtk.so","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/icudtl.dat","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registry.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_event_channel.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_message_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_application.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_method_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_message_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_dart_project.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_basic_message_channel.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_pixel_buffer_texture.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/flutter_linux.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_engine.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_view.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_response.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_messenger.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registrar.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_message_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_value.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_method_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_string_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_channel.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_gl.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_call.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_registrar.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/kernel_blob.bin","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Regular.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Bold.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/assets/fonts/Vazir-Light.ttf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/fonts/MaterialIcons-Regular.otf","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/ink_sparkle.frag","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/shaders/stretch_effect.frag","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/AssetManifest.bin","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/FontManifest.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NOTICES.Z","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/version.json","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/build/flutter_assets/NativeAssetsManifest.json"] \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/unpack_linux.stamp b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/unpack_linux.stamp new file mode 100644 index 0000000..89f1870 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/7aab399251cc5e04464857465e38f957/unpack_linux.stamp @@ -0,0 +1 @@ +{"inputs":["/opt/flutter/packages/flutter_tools/lib/src/build_system/targets/linux.dart","/opt/flutter/bin/cache/artifacts/engine/linux-x64/libflutter_linux_gtk.so","/opt/flutter/bin/cache/artifacts/engine/linux-x64/icudtl.dat","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_plugin_registry.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_event_channel.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_message_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_application.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_standard_method_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_json_message_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_dart_project.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_basic_message_channel.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_pixel_buffer_texture.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/flutter_linux.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_engine.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_view.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_response.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_binary_messenger.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_plugin_registrar.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_binary_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_standard_message_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_value.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_json_method_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_string_codec.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_channel.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture_gl.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_method_call.h","/opt/flutter/bin/cache/artifacts/engine/linux-x64/flutter_linux/fl_texture_registrar.h"],"outputs":["/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/libflutter_linux_gtk.so","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/icudtl.dat","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registry.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_event_channel.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_message_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_application.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_method_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_message_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_dart_project.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_basic_message_channel.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_pixel_buffer_texture.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/flutter_linux.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_engine.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_view.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_response.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_messenger.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_plugin_registrar.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_binary_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_standard_message_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_value.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_json_method_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_string_codec.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_channel.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_gl.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_method_call.h","/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/linux/flutter/ephemeral/flutter_linux/fl_texture_registrar.h"]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart b/edge/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart new file mode 100644 index 0000000..6244702 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/flutter_build/dart_plugin_registrant.dart @@ -0,0 +1,122 @@ +// +// Generated file. Do not edit. +// This file is generated from template in file `flutter_tools/lib/src/flutter_plugins.dart`. +// + +// @dart = 3.11 + +import 'dart:io'; // flutter_ignore: dart_io_import. +import 'package:file_picker/file_picker.dart' as file_picker; +import 'package:path_provider_android/path_provider_android.dart' as path_provider_android; +import 'package:file_picker/file_picker.dart' as file_picker; +import 'package:path_provider_foundation/path_provider_foundation.dart' as path_provider_foundation; +import 'package:file_picker/file_picker.dart' as file_picker; +import 'package:path_provider_linux/path_provider_linux.dart' as path_provider_linux; +import 'package:file_picker/file_picker.dart' as file_picker; +import 'package:path_provider_foundation/path_provider_foundation.dart' as path_provider_foundation; +import 'package:file_picker/file_picker.dart' as file_picker; +import 'package:path_provider_windows/path_provider_windows.dart' as path_provider_windows; + +@pragma('vm:entry-point') +class _PluginRegistrant { + + @pragma('vm:entry-point') + static void register() { + if (Platform.isAndroid) { + try { + file_picker.FilePickerIO.registerWith(); + } catch (err) { + print( + '`file_picker` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + try { + path_provider_android.PathProviderAndroid.registerWith(); + } catch (err) { + print( + '`path_provider_android` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + } else if (Platform.isIOS) { + try { + file_picker.FilePickerIO.registerWith(); + } catch (err) { + print( + '`file_picker` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + try { + path_provider_foundation.PathProviderFoundation.registerWith(); + } catch (err) { + print( + '`path_provider_foundation` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + } else if (Platform.isLinux) { + try { + file_picker.FilePickerLinux.registerWith(); + } catch (err) { + print( + '`file_picker` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + try { + path_provider_linux.PathProviderLinux.registerWith(); + } catch (err) { + print( + '`path_provider_linux` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + } else if (Platform.isMacOS) { + try { + file_picker.FilePickerMacOS.registerWith(); + } catch (err) { + print( + '`file_picker` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + try { + path_provider_foundation.PathProviderFoundation.registerWith(); + } catch (err) { + print( + '`path_provider_foundation` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + } else if (Platform.isWindows) { + try { + file_picker.FilePickerWindows.registerWith(); + } catch (err) { + print( + '`file_picker` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + try { + path_provider_windows.PathProviderWindows.registerWith(); + } catch (err) { + print( + '`path_provider_windows` threw an error: $err. ' + 'The app may not function as expected until you remove this plugin from pubspec.yaml' + ); + } + + } + } +} diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/.lock b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/.lock new file mode 100644 index 0000000..c4fbf89 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/.lock @@ -0,0 +1 @@ +Last acquired by /opt/flutter/bin/cache/dart-sdk/bin/dart (pid 91199) running file:///opt/flutter/bin/cache/flutter_tools.snapshot on 2026-06-04 10:59:51.940621. \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/dependencies.dependencies_hash_file.json b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/dependencies.dependencies_hash_file.json new file mode 100644 index 0000000..d5dea83 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/dependencies.dependencies_hash_file.json @@ -0,0 +1 @@ +{"file_system":[],"environment":[{"key":"HOME","hash":-2411726366738717108},{"key":"PATH","hash":7348437161147114588}]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dependencies_hash_file.json b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dependencies_hash_file.json new file mode 100644 index 0000000..a08e703 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dependencies_hash_file.json @@ -0,0 +1 @@ +{"file_system":[{"path":"/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json","hash":-1108341291529826111},{"path":"/opt/flutter/bin/cache/dart-sdk/version","hash":-2248264749179250399}],"environment":[]} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill new file mode 100644 index 0000000..2300248 Binary files /dev/null and b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill differ diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill.d b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill.d new file mode 100644 index 0000000..6881319 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill.d @@ -0,0 +1 @@ +/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill: /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/hook/build.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/code_assets.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/hooks.dart /home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/lib/logging.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/architecture.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/c_compiler_config.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/code_asset.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/config.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/extension.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/ios_sdk.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/link_mode.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/link_mode_preference.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/os.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/sanitizer.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/testing.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/api/build_and_link.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/api/builder.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/api/linker.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/config.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/encoded_asset.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/extension.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/test.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/user_defines.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/validation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/lib/src/level.dart /home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/lib/src/log_record.dart /home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0/lib/src/logger.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/syntax.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/collection.dart /home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1/lib/src/code_assets/validation.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/args_parser.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/crypto.dart /home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/record_use.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/hooks/syntax.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/metadata.dart /home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2/lib/src/utils/datetime.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/yaml.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/algorithms.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/boollist.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/canonicalized_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterable.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_list.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/comparators.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/equality_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/functions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/iterable_zip.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/list_extensions.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/priority_queue.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/queue_list.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/union_set_controller.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/unmodifiable_wrappers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/wrappers.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/digest.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/hash.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/hmac.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/md5.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/sha1.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/sha256.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/sha512.dart /home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0/lib/meta_meta.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/constant.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/definition.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/loading_unit.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/recordings.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/reference.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/error_listener.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/loader.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/style.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_document.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_node.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/combined_wrappers/combined_iterator.dart /home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1/lib/src/empty_unmodifiable_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/digest_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/hash_sink.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7/lib/src/sha512_fastsinks.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/canonicalization_context.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/helper.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/serialization_context.dart /home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0/lib/src/syntax.g.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/source_span.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/charcodes.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/equality.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/event.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/parser.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/null_span.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_node_wrapper.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/file.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/location_mixin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_mixin.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/span_with_context.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/string_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/token.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/path.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/term_glyph.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/highlighter.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/line_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/span_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/string_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/context.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_exception.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_map.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/path_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/ascii_glyph_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/glyph_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/unicode_glyph_set.dart /home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/top_level.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/charcode.dart /home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2/lib/src/colors.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/charcode.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/utils.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/eager_span_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/relative_span_scanner.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/characters.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/internal_style.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/parsed_path.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/posix.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/url.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/style/windows.dart /home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1/lib/src/utils.dart diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/input.json b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/input.json new file mode 100644 index 0000000..604b033 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/input.json @@ -0,0 +1,26 @@ +{ + "assets": {}, + "config": { + "build_asset_types": [ + "code_assets/code" + ], + "extensions": { + "code_assets": { + "c_compiler": { + "ar": "/usr/lib/llvm-14/bin/llvm-ar", + "cc": "/usr/lib/llvm-14/bin/clang", + "ld": "/usr/lib/llvm-14/bin/ld.lld" + }, + "link_mode_preference": "dynamic", + "target_architecture": "x64", + "target_os": "linux" + } + }, + "linking_enabled": false + }, + "out_dir_shared": "/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/hooks_runner/shared/objective_c/build/", + "out_file": "/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/output.json", + "package_name": "objective_c", + "package_root": "/home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/", + "user_defines": {} +} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/output.json b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/output.json new file mode 100644 index 0000000..eb68619 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/output.json @@ -0,0 +1,5 @@ +{ + "assets_for_linking": {}, + "status": "success", + "timestamp": "2026-06-04 10:42:14.000" +} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/stderr.txt b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/stdout.txt b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/stdout.txt new file mode 100644 index 0000000..6e2a9e5 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/stdout.txt @@ -0,0 +1 @@ +Running `(cd /home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1/; HOME=/home/aliakbar PATH=/opt/flutter/bin:/home/aliakbar/miniconda3/bin:/home/aliakbar/miniconda3/condabin:/home/aliakbar/.cargo/bin:/home/aliakbar/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games /opt/flutter/bin/cache/dart-sdk/bin/dart --packages=/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/package_config.json /home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/hook.dill --config=/home/aliakbar/Desktop/Projects/hamhoosh/coordinator_frontend/.dart_tool/hooks_runner/objective_c/48d08d38e8/input.json )`. diff --git a/edge/coordinator_frontend/.dart_tool/hooks_runner/shared/objective_c/.lock b/edge/coordinator_frontend/.dart_tool/hooks_runner/shared/objective_c/.lock new file mode 100644 index 0000000..3c741c4 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/hooks_runner/shared/objective_c/.lock @@ -0,0 +1 @@ +Last acquired by /opt/flutter/bin/cache/dart-sdk/bin/dart (pid 91199) running file:///opt/flutter/bin/cache/flutter_tools.snapshot on 2026-06-04 10:59:51.939665. \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/package_config.json b/edge/coordinator_frontend/.dart_tool/package_config.json new file mode 100644 index 0000000..baf4603 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/package_config.json @@ -0,0 +1,412 @@ +{ + "configVersion": 2, + "packages": [ + { + "name": "args", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/args-2.7.0", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "async", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/async-2.13.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "boolean_selector", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "characters", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/characters-1.4.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "clock", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/clock-1.1.2", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "code_assets", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/code_assets-1.2.1", + "packageUri": "lib/", + "languageVersion": "3.10" + }, + { + "name": "collection", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/collection-1.19.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "cross_file", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/cross_file-0.3.5+2", + "packageUri": "lib/", + "languageVersion": "3.8" + }, + { + "name": "crypto", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/crypto-3.0.7", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "dio", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/dio-5.9.2", + "packageUri": "lib/", + "languageVersion": "2.18" + }, + { + "name": "dio_web_adapter", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/dio_web_adapter-2.1.2", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "fake_async", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/fake_async-1.3.3", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "ffi", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/ffi-2.2.0", + "packageUri": "lib/", + "languageVersion": "3.7" + }, + { + "name": "file_picker", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "flutter", + "rootUri": "file:///opt/flutter/packages/flutter", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "flutter_lints", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/flutter_lints-6.0.0", + "packageUri": "lib/", + "languageVersion": "3.8" + }, + { + "name": "flutter_localizations", + "rootUri": "file:///opt/flutter/packages/flutter_localizations", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "flutter_plugin_android_lifecycle", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.35", + "packageUri": "lib/", + "languageVersion": "3.10" + }, + { + "name": "flutter_spinkit", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/flutter_spinkit-5.2.2", + "packageUri": "lib/", + "languageVersion": "2.12" + }, + { + "name": "flutter_test", + "rootUri": "file:///opt/flutter/packages/flutter_test", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "flutter_web_plugins", + "rootUri": "file:///opt/flutter/packages/flutter_web_plugins", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "google_fonts", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/google_fonts-6.3.3", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "hooks", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/hooks-2.0.2", + "packageUri": "lib/", + "languageVersion": "3.10" + }, + { + "name": "http", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/http-1.6.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "http_parser", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/http_parser-4.1.2", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "intl", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/intl-0.20.2", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "jni", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "jni_flutter", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "leak_tracker", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2", + "packageUri": "lib/", + "languageVersion": "3.2" + }, + { + "name": "leak_tracker_flutter_testing", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10", + "packageUri": "lib/", + "languageVersion": "3.2" + }, + { + "name": "leak_tracker_testing", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2", + "packageUri": "lib/", + "languageVersion": "3.2" + }, + { + "name": "lints", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/lints-6.1.0", + "packageUri": "lib/", + "languageVersion": "3.8" + }, + { + "name": "logging", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/logging-1.3.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "matcher", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/matcher-0.12.19", + "packageUri": "lib/", + "languageVersion": "3.7" + }, + { + "name": "material_color_utilities", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "meta", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/meta-1.17.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "mime", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/mime-2.0.0", + "packageUri": "lib/", + "languageVersion": "3.2" + }, + { + "name": "nested", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/nested-1.0.0", + "packageUri": "lib/", + "languageVersion": "2.12" + }, + { + "name": "objective_c", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/objective_c-9.4.1", + "packageUri": "lib/", + "languageVersion": "3.10" + }, + { + "name": "package_config", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/package_config-2.2.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "path", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path-1.9.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "path_provider", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path_provider-2.1.5", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "path_provider_android", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "path_provider_foundation", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0", + "packageUri": "lib/", + "languageVersion": "3.10" + }, + { + "name": "path_provider_linux", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1", + "packageUri": "lib/", + "languageVersion": "2.19" + }, + { + "name": "path_provider_platform_interface", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2", + "packageUri": "lib/", + "languageVersion": "3.0" + }, + { + "name": "path_provider_windows", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0", + "packageUri": "lib/", + "languageVersion": "3.2" + }, + { + "name": "platform", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/platform-3.1.6", + "packageUri": "lib/", + "languageVersion": "3.2" + }, + { + "name": "plugin_platform_interface", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8", + "packageUri": "lib/", + "languageVersion": "3.0" + }, + { + "name": "provider", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/provider-6.1.5+1", + "packageUri": "lib/", + "languageVersion": "2.12" + }, + { + "name": "pub_semver", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/pub_semver-2.2.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "record_use", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/record_use-0.6.0", + "packageUri": "lib/", + "languageVersion": "3.10" + }, + { + "name": "sky_engine", + "rootUri": "file:///opt/flutter/bin/cache/pkg/sky_engine", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "source_span", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/source_span-1.10.2", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "stack_trace", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/stack_trace-1.12.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "stream_channel", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/stream_channel-2.1.4", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "string_scanner", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/string_scanner-1.4.1", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "term_glyph", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/term_glyph-1.2.2", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "test_api", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/test_api-0.7.10", + "packageUri": "lib/", + "languageVersion": "3.7" + }, + { + "name": "typed_data", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/typed_data-1.4.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "vector_math", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/vector_math-2.2.0", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "vm_service", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/vm_service-15.2.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "web", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/web-1.1.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "win32", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/win32-5.15.0", + "packageUri": "lib/", + "languageVersion": "3.8" + }, + { + "name": "xdg_directories", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "yaml", + "rootUri": "file:///home/aliakbar/.pub-cache/hosted/pub.dev/yaml-3.1.3", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "coordinator_frontend", + "rootUri": "../", + "packageUri": "lib/", + "languageVersion": "3.11" + } + ], + "generator": "pub", + "generatorVersion": "3.11.5", + "flutterRoot": "file:///opt/flutter", + "flutterVersion": "3.41.9", + "pubCache": "file:///home/aliakbar/.pub-cache" +} diff --git a/edge/coordinator_frontend/.dart_tool/package_graph.json b/edge/coordinator_frontend/.dart_tool/package_graph.json new file mode 100644 index 0000000..848a10b --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/package_graph.json @@ -0,0 +1,577 @@ +{ + "roots": [ + "coordinator_frontend" + ], + "packages": [ + { + "name": "coordinator_frontend", + "version": "1.0.0+1", + "dependencies": [ + "dio", + "file_picker", + "flutter", + "flutter_localizations", + "flutter_spinkit", + "google_fonts", + "intl", + "provider" + ], + "devDependencies": [ + "flutter_lints", + "flutter_test" + ] + }, + { + "name": "flutter_lints", + "version": "6.0.0", + "dependencies": [ + "lints" + ] + }, + { + "name": "flutter_test", + "version": "0.0.0", + "dependencies": [ + "clock", + "collection", + "fake_async", + "flutter", + "leak_tracker_flutter_testing", + "matcher", + "meta", + "path", + "stack_trace", + "stream_channel", + "test_api", + "vector_math" + ] + }, + { + "name": "google_fonts", + "version": "6.3.3", + "dependencies": [ + "crypto", + "flutter", + "http", + "path_provider" + ] + }, + { + "name": "intl", + "version": "0.20.2", + "dependencies": [ + "clock", + "meta", + "path" + ] + }, + { + "name": "flutter_spinkit", + "version": "5.2.2", + "dependencies": [ + "flutter" + ] + }, + { + "name": "file_picker", + "version": "8.3.7", + "dependencies": [ + "cross_file", + "ffi", + "flutter", + "flutter_plugin_android_lifecycle", + "flutter_web_plugins", + "path", + "plugin_platform_interface", + "web", + "win32" + ] + }, + { + "name": "dio", + "version": "5.9.2", + "dependencies": [ + "async", + "collection", + "dio_web_adapter", + "http_parser", + "meta", + "mime", + "path" + ] + }, + { + "name": "provider", + "version": "6.1.5+1", + "dependencies": [ + "collection", + "flutter", + "nested" + ] + }, + { + "name": "flutter_localizations", + "version": "0.0.0", + "dependencies": [ + "flutter", + "intl", + "path" + ] + }, + { + "name": "flutter", + "version": "0.0.0", + "dependencies": [ + "characters", + "collection", + "material_color_utilities", + "meta", + "sky_engine", + "vector_math" + ] + }, + { + "name": "lints", + "version": "6.1.0", + "dependencies": [] + }, + { + "name": "stream_channel", + "version": "2.1.4", + "dependencies": [ + "async" + ] + }, + { + "name": "meta", + "version": "1.17.0", + "dependencies": [] + }, + { + "name": "collection", + "version": "1.19.1", + "dependencies": [] + }, + { + "name": "leak_tracker_flutter_testing", + "version": "3.0.10", + "dependencies": [ + "flutter", + "leak_tracker", + "leak_tracker_testing", + "matcher", + "meta" + ] + }, + { + "name": "vector_math", + "version": "2.2.0", + "dependencies": [] + }, + { + "name": "stack_trace", + "version": "1.12.1", + "dependencies": [ + "path" + ] + }, + { + "name": "clock", + "version": "1.1.2", + "dependencies": [] + }, + { + "name": "fake_async", + "version": "1.3.3", + "dependencies": [ + "clock", + "collection" + ] + }, + { + "name": "path", + "version": "1.9.1", + "dependencies": [] + }, + { + "name": "matcher", + "version": "0.12.19", + "dependencies": [ + "async", + "meta", + "stack_trace", + "term_glyph", + "test_api" + ] + }, + { + "name": "test_api", + "version": "0.7.10", + "dependencies": [ + "async", + "boolean_selector", + "collection", + "meta", + "source_span", + "stack_trace", + "stream_channel", + "string_scanner", + "term_glyph" + ] + }, + { + "name": "path_provider", + "version": "2.1.5", + "dependencies": [ + "flutter", + "path_provider_android", + "path_provider_foundation", + "path_provider_linux", + "path_provider_platform_interface", + "path_provider_windows" + ] + }, + { + "name": "http", + "version": "1.6.0", + "dependencies": [ + "async", + "http_parser", + "meta", + "web" + ] + }, + { + "name": "crypto", + "version": "3.0.7", + "dependencies": [ + "typed_data" + ] + }, + { + "name": "web", + "version": "1.1.1", + "dependencies": [] + }, + { + "name": "cross_file", + "version": "0.3.5+2", + "dependencies": [ + "meta", + "web" + ] + }, + { + "name": "win32", + "version": "5.15.0", + "dependencies": [ + "ffi" + ] + }, + { + "name": "ffi", + "version": "2.2.0", + "dependencies": [] + }, + { + "name": "plugin_platform_interface", + "version": "2.1.8", + "dependencies": [ + "meta" + ] + }, + { + "name": "flutter_plugin_android_lifecycle", + "version": "2.0.35", + "dependencies": [ + "flutter" + ] + }, + { + "name": "flutter_web_plugins", + "version": "0.0.0", + "dependencies": [ + "flutter" + ] + }, + { + "name": "dio_web_adapter", + "version": "2.1.2", + "dependencies": [ + "dio", + "http_parser", + "meta", + "web" + ] + }, + { + "name": "mime", + "version": "2.0.0", + "dependencies": [] + }, + { + "name": "http_parser", + "version": "4.1.2", + "dependencies": [ + "collection", + "source_span", + "string_scanner", + "typed_data" + ] + }, + { + "name": "async", + "version": "2.13.1", + "dependencies": [ + "collection", + "meta" + ] + }, + { + "name": "nested", + "version": "1.0.0", + "dependencies": [ + "flutter" + ] + }, + { + "name": "sky_engine", + "version": "0.0.0", + "dependencies": [] + }, + { + "name": "material_color_utilities", + "version": "0.13.0", + "dependencies": [ + "collection" + ] + }, + { + "name": "characters", + "version": "1.4.1", + "dependencies": [] + }, + { + "name": "leak_tracker_testing", + "version": "3.0.2", + "dependencies": [ + "leak_tracker", + "matcher", + "meta" + ] + }, + { + "name": "leak_tracker", + "version": "11.0.2", + "dependencies": [ + "clock", + "collection", + "meta", + "path", + "vm_service" + ] + }, + { + "name": "term_glyph", + "version": "1.2.2", + "dependencies": [] + }, + { + "name": "string_scanner", + "version": "1.4.1", + "dependencies": [ + "source_span" + ] + }, + { + "name": "source_span", + "version": "1.10.2", + "dependencies": [ + "collection", + "path", + "term_glyph" + ] + }, + { + "name": "boolean_selector", + "version": "2.1.2", + "dependencies": [ + "source_span", + "string_scanner" + ] + }, + { + "name": "path_provider_windows", + "version": "2.3.0", + "dependencies": [ + "ffi", + "flutter", + "path", + "path_provider_platform_interface" + ] + }, + { + "name": "path_provider_platform_interface", + "version": "2.1.2", + "dependencies": [ + "flutter", + "platform", + "plugin_platform_interface" + ] + }, + { + "name": "path_provider_linux", + "version": "2.2.1", + "dependencies": [ + "ffi", + "flutter", + "path", + "path_provider_platform_interface", + "xdg_directories" + ] + }, + { + "name": "path_provider_foundation", + "version": "2.6.0", + "dependencies": [ + "ffi", + "flutter", + "objective_c", + "path_provider_platform_interface" + ] + }, + { + "name": "path_provider_android", + "version": "2.3.1", + "dependencies": [ + "flutter", + "jni", + "jni_flutter", + "path_provider_platform_interface" + ] + }, + { + "name": "typed_data", + "version": "1.4.0", + "dependencies": [ + "collection" + ] + }, + { + "name": "vm_service", + "version": "15.2.0", + "dependencies": [] + }, + { + "name": "platform", + "version": "3.1.6", + "dependencies": [] + }, + { + "name": "xdg_directories", + "version": "1.1.0", + "dependencies": [ + "meta", + "path" + ] + }, + { + "name": "objective_c", + "version": "9.4.1", + "dependencies": [ + "code_assets", + "collection", + "ffi", + "hooks", + "logging", + "meta", + "pub_semver" + ] + }, + { + "name": "jni_flutter", + "version": "1.0.1", + "dependencies": [ + "flutter", + "jni" + ] + }, + { + "name": "jni", + "version": "1.0.0", + "dependencies": [ + "args", + "collection", + "ffi", + "meta", + "package_config", + "path", + "plugin_platform_interface" + ] + }, + { + "name": "pub_semver", + "version": "2.2.0", + "dependencies": [ + "collection" + ] + }, + { + "name": "logging", + "version": "1.3.0", + "dependencies": [] + }, + { + "name": "hooks", + "version": "2.0.2", + "dependencies": [ + "collection", + "crypto", + "logging", + "meta", + "pub_semver", + "record_use", + "yaml" + ] + }, + { + "name": "code_assets", + "version": "1.2.1", + "dependencies": [ + "collection", + "hooks" + ] + }, + { + "name": "package_config", + "version": "2.2.0", + "dependencies": [ + "path" + ] + }, + { + "name": "args", + "version": "2.7.0", + "dependencies": [] + }, + { + "name": "yaml", + "version": "3.1.3", + "dependencies": [ + "collection", + "source_span", + "string_scanner" + ] + }, + { + "name": "record_use", + "version": "0.6.0", + "dependencies": [ + "collection", + "meta", + "pub_semver" + ] + } + ], + "configVersion": 1 +} \ No newline at end of file diff --git a/edge/coordinator_frontend/.dart_tool/version b/edge/coordinator_frontend/.dart_tool/version new file mode 100644 index 0000000..d81f957 --- /dev/null +++ b/edge/coordinator_frontend/.dart_tool/version @@ -0,0 +1 @@ +3.41.9 \ No newline at end of file diff --git a/edge/coordinator_frontend/.flutter-plugins-dependencies b/edge/coordinator_frontend/.flutter-plugins-dependencies new file mode 100644 index 0000000..fa9a77f --- /dev/null +++ b/edge/coordinator_frontend/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"android":[{"name":"file_picker","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"],"dev_dependency":false},{"name":"flutter_plugin_android_lifecycle","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.35/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"path_provider_android","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false}],"macos":[{"name":"file_picker","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"file_picker","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"file_picker","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"web":[{"name":"file_picker","path":"/home/aliakbar/.pub-cache/hosted/pub.dev/file_picker-8.3.7/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2026-06-03 23:41:54.744010","version":"3.41.9","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file diff --git a/edge/coordinator_frontend/.idea/libraries/Dart_SDK.xml b/edge/coordinator_frontend/.idea/libraries/Dart_SDK.xml new file mode 100644 index 0000000..6b36ee2 --- /dev/null +++ b/edge/coordinator_frontend/.idea/libraries/Dart_SDK.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edge/coordinator_frontend/.idea/libraries/KotlinJavaRuntime.xml b/edge/coordinator_frontend/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 0000000..2b96ac4 --- /dev/null +++ b/edge/coordinator_frontend/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/edge/coordinator_frontend/.idea/modules.xml b/edge/coordinator_frontend/.idea/modules.xml new file mode 100644 index 0000000..3a8159d --- /dev/null +++ b/edge/coordinator_frontend/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/edge/coordinator_frontend/.idea/runConfigurations/main_dart.xml b/edge/coordinator_frontend/.idea/runConfigurations/main_dart.xml new file mode 100644 index 0000000..aab7b5c --- /dev/null +++ b/edge/coordinator_frontend/.idea/runConfigurations/main_dart.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/edge/coordinator_frontend/.idea/workspace.xml b/edge/coordinator_frontend/.idea/workspace.xml new file mode 100644 index 0000000..5b3388c --- /dev/null +++ b/edge/coordinator_frontend/.idea/workspace.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/edge/coordinator_frontend/.metadata b/edge/coordinator_frontend/.metadata new file mode 100644 index 0000000..79dc3aa --- /dev/null +++ b/edge/coordinator_frontend/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "00b0c91f06209d9e4a41f71b7a512d6eb3b9c694" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + - platform: android + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + - platform: ios + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + - platform: linux + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + - platform: macos + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + - platform: web + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + - platform: windows + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/coordinator_frontend/README.md b/edge/coordinator_frontend/README.md similarity index 100% rename from coordinator_frontend/README.md rename to edge/coordinator_frontend/README.md diff --git a/coordinator_frontend/analysis_options.yaml b/edge/coordinator_frontend/analysis_options.yaml similarity index 100% rename from coordinator_frontend/analysis_options.yaml rename to edge/coordinator_frontend/analysis_options.yaml diff --git a/edge/coordinator_frontend/android/.gitignore b/edge/coordinator_frontend/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/edge/coordinator_frontend/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/coordinator_frontend/android/app/build.gradle.kts b/edge/coordinator_frontend/android/app/build.gradle.kts similarity index 100% rename from coordinator_frontend/android/app/build.gradle.kts rename to edge/coordinator_frontend/android/app/build.gradle.kts diff --git a/edge/coordinator_frontend/android/app/src/debug/AndroidManifest.xml b/edge/coordinator_frontend/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/edge/coordinator_frontend/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/coordinator_frontend/android/app/src/main/AndroidManifest.xml b/edge/coordinator_frontend/android/app/src/main/AndroidManifest.xml similarity index 100% rename from coordinator_frontend/android/app/src/main/AndroidManifest.xml rename to edge/coordinator_frontend/android/app/src/main/AndroidManifest.xml diff --git a/coordinator_frontend/android/app/src/main/kotlin/com/example/coordinator_frontend/MainActivity.kt b/edge/coordinator_frontend/android/app/src/main/kotlin/com/example/coordinator_frontend/MainActivity.kt similarity index 100% rename from coordinator_frontend/android/app/src/main/kotlin/com/example/coordinator_frontend/MainActivity.kt rename to edge/coordinator_frontend/android/app/src/main/kotlin/com/example/coordinator_frontend/MainActivity.kt diff --git a/coordinator_frontend/android/app/src/main/res/drawable-v21/launch_background.xml b/edge/coordinator_frontend/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from coordinator_frontend/android/app/src/main/res/drawable-v21/launch_background.xml rename to edge/coordinator_frontend/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/coordinator_frontend/android/app/src/main/res/drawable/launch_background.xml b/edge/coordinator_frontend/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from coordinator_frontend/android/app/src/main/res/drawable/launch_background.xml rename to edge/coordinator_frontend/android/app/src/main/res/drawable/launch_background.xml diff --git a/coordinator_frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/edge/coordinator_frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from coordinator_frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to edge/coordinator_frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/coordinator_frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/edge/coordinator_frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from coordinator_frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to edge/coordinator_frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/coordinator_frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/edge/coordinator_frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from coordinator_frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to edge/coordinator_frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/coordinator_frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/edge/coordinator_frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from coordinator_frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to edge/coordinator_frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/coordinator_frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/edge/coordinator_frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from coordinator_frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to edge/coordinator_frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/coordinator_frontend/android/app/src/main/res/values-night/styles.xml b/edge/coordinator_frontend/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from coordinator_frontend/android/app/src/main/res/values-night/styles.xml rename to edge/coordinator_frontend/android/app/src/main/res/values-night/styles.xml diff --git a/coordinator_frontend/android/app/src/main/res/values/styles.xml b/edge/coordinator_frontend/android/app/src/main/res/values/styles.xml similarity index 100% rename from coordinator_frontend/android/app/src/main/res/values/styles.xml rename to edge/coordinator_frontend/android/app/src/main/res/values/styles.xml diff --git a/edge/coordinator_frontend/android/app/src/profile/AndroidManifest.xml b/edge/coordinator_frontend/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/edge/coordinator_frontend/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/coordinator_frontend/android/build.gradle.kts b/edge/coordinator_frontend/android/build.gradle.kts similarity index 100% rename from coordinator_frontend/android/build.gradle.kts rename to edge/coordinator_frontend/android/build.gradle.kts diff --git a/edge/coordinator_frontend/android/coordinator_frontend_android.iml b/edge/coordinator_frontend/android/coordinator_frontend_android.iml new file mode 100644 index 0000000..3bc4b3b --- /dev/null +++ b/edge/coordinator_frontend/android/coordinator_frontend_android.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/coordinator_frontend/android/gradle.properties b/edge/coordinator_frontend/android/gradle.properties similarity index 100% rename from coordinator_frontend/android/gradle.properties rename to edge/coordinator_frontend/android/gradle.properties diff --git a/coordinator_frontend/android/gradle/wrapper/gradle-wrapper.properties b/edge/coordinator_frontend/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from coordinator_frontend/android/gradle/wrapper/gradle-wrapper.properties rename to edge/coordinator_frontend/android/gradle/wrapper/gradle-wrapper.properties diff --git a/coordinator_frontend/android/settings.gradle.kts b/edge/coordinator_frontend/android/settings.gradle.kts similarity index 100% rename from coordinator_frontend/android/settings.gradle.kts rename to edge/coordinator_frontend/android/settings.gradle.kts diff --git a/coordinator_frontend/assets/fonts/Vazir-Bold.ttf b/edge/coordinator_frontend/assets/fonts/Vazir-Bold.ttf similarity index 100% rename from coordinator_frontend/assets/fonts/Vazir-Bold.ttf rename to edge/coordinator_frontend/assets/fonts/Vazir-Bold.ttf diff --git a/coordinator_frontend/assets/fonts/Vazir-Light.ttf b/edge/coordinator_frontend/assets/fonts/Vazir-Light.ttf similarity index 100% rename from coordinator_frontend/assets/fonts/Vazir-Light.ttf rename to edge/coordinator_frontend/assets/fonts/Vazir-Light.ttf diff --git a/coordinator_frontend/assets/fonts/Vazir-Regular.ttf b/edge/coordinator_frontend/assets/fonts/Vazir-Regular.ttf similarity index 100% rename from coordinator_frontend/assets/fonts/Vazir-Regular.ttf rename to edge/coordinator_frontend/assets/fonts/Vazir-Regular.ttf diff --git a/edge/coordinator_frontend/coordinator_frontend.iml b/edge/coordinator_frontend/coordinator_frontend.iml new file mode 100644 index 0000000..f66303d --- /dev/null +++ b/edge/coordinator_frontend/coordinator_frontend.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/edge/coordinator_frontend/ios/.gitignore b/edge/coordinator_frontend/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/edge/coordinator_frontend/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/coordinator_frontend/ios/Flutter/AppFrameworkInfo.plist b/edge/coordinator_frontend/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from coordinator_frontend/ios/Flutter/AppFrameworkInfo.plist rename to edge/coordinator_frontend/ios/Flutter/AppFrameworkInfo.plist diff --git a/edge/coordinator_frontend/ios/Flutter/Debug.xcconfig b/edge/coordinator_frontend/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/edge/coordinator_frontend/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/edge/coordinator_frontend/ios/Flutter/Release.xcconfig b/edge/coordinator_frontend/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/edge/coordinator_frontend/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/coordinator_frontend/ios/Runner.xcodeproj/project.pbxproj b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from coordinator_frontend/ios/Runner.xcodeproj/project.pbxproj rename to edge/coordinator_frontend/ios/Runner.xcodeproj/project.pbxproj diff --git a/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/edge/coordinator_frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/edge/coordinator_frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/edge/coordinator_frontend/ios/Runner.xcworkspace/contents.xcworkspacedata b/edge/coordinator_frontend/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/edge/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/edge/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/edge/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/edge/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/coordinator_frontend/ios/Runner/AppDelegate.swift b/edge/coordinator_frontend/ios/Runner/AppDelegate.swift similarity index 100% rename from coordinator_frontend/ios/Runner/AppDelegate.swift rename to edge/coordinator_frontend/ios/Runner/AppDelegate.swift diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/coordinator_frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard b/edge/coordinator_frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from coordinator_frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to edge/coordinator_frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/edge/coordinator_frontend/ios/Runner/Base.lproj/Main.storyboard b/edge/coordinator_frontend/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coordinator_frontend/ios/Runner/Info.plist b/edge/coordinator_frontend/ios/Runner/Info.plist similarity index 100% rename from coordinator_frontend/ios/Runner/Info.plist rename to edge/coordinator_frontend/ios/Runner/Info.plist diff --git a/edge/coordinator_frontend/ios/Runner/Runner-Bridging-Header.h b/edge/coordinator_frontend/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/edge/coordinator_frontend/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/coordinator_frontend/ios/Runner/SceneDelegate.swift b/edge/coordinator_frontend/ios/Runner/SceneDelegate.swift similarity index 100% rename from coordinator_frontend/ios/Runner/SceneDelegate.swift rename to edge/coordinator_frontend/ios/Runner/SceneDelegate.swift diff --git a/edge/coordinator_frontend/ios/RunnerTests/RunnerTests.swift b/edge/coordinator_frontend/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/edge/coordinator_frontend/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/edge/coordinator_frontend/linux/.gitignore b/edge/coordinator_frontend/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/edge/coordinator_frontend/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/coordinator_frontend/linux/CMakeLists.txt b/edge/coordinator_frontend/linux/CMakeLists.txt similarity index 100% rename from coordinator_frontend/linux/CMakeLists.txt rename to edge/coordinator_frontend/linux/CMakeLists.txt diff --git a/edge/coordinator_frontend/linux/flutter/CMakeLists.txt b/edge/coordinator_frontend/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/edge/coordinator_frontend/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/coordinator_frontend/linux/flutter/generated_plugin_registrant.cc b/edge/coordinator_frontend/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from coordinator_frontend/linux/flutter/generated_plugin_registrant.cc rename to edge/coordinator_frontend/linux/flutter/generated_plugin_registrant.cc diff --git a/edge/coordinator_frontend/linux/flutter/generated_plugin_registrant.h b/edge/coordinator_frontend/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/edge/coordinator_frontend/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/coordinator_frontend/linux/flutter/generated_plugins.cmake b/edge/coordinator_frontend/linux/flutter/generated_plugins.cmake similarity index 100% rename from coordinator_frontend/linux/flutter/generated_plugins.cmake rename to edge/coordinator_frontend/linux/flutter/generated_plugins.cmake diff --git a/edge/coordinator_frontend/linux/runner/CMakeLists.txt b/edge/coordinator_frontend/linux/runner/CMakeLists.txt new file mode 100644 index 0000000..e97dabc --- /dev/null +++ b/edge/coordinator_frontend/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/edge/coordinator_frontend/linux/runner/main.cc b/edge/coordinator_frontend/linux/runner/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/edge/coordinator_frontend/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/coordinator_frontend/linux/runner/my_application.cc b/edge/coordinator_frontend/linux/runner/my_application.cc similarity index 100% rename from coordinator_frontend/linux/runner/my_application.cc rename to edge/coordinator_frontend/linux/runner/my_application.cc diff --git a/coordinator_frontend/linux/runner/my_application.h b/edge/coordinator_frontend/linux/runner/my_application.h similarity index 100% rename from coordinator_frontend/linux/runner/my_application.h rename to edge/coordinator_frontend/linux/runner/my_application.h diff --git a/edge/coordinator_frontend/macos/.gitignore b/edge/coordinator_frontend/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/edge/coordinator_frontend/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/edge/coordinator_frontend/macos/Flutter/Flutter-Debug.xcconfig b/edge/coordinator_frontend/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/edge/coordinator_frontend/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/edge/coordinator_frontend/macos/Flutter/Flutter-Release.xcconfig b/edge/coordinator_frontend/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/edge/coordinator_frontend/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/coordinator_frontend/macos/Flutter/GeneratedPluginRegistrant.swift b/edge/coordinator_frontend/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from coordinator_frontend/macos/Flutter/GeneratedPluginRegistrant.swift rename to edge/coordinator_frontend/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/coordinator_frontend/macos/Runner.xcodeproj/project.pbxproj b/edge/coordinator_frontend/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from coordinator_frontend/macos/Runner.xcodeproj/project.pbxproj rename to edge/coordinator_frontend/macos/Runner.xcodeproj/project.pbxproj diff --git a/edge/coordinator_frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/edge/coordinator_frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/coordinator_frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/edge/coordinator_frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from coordinator_frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to edge/coordinator_frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/edge/coordinator_frontend/macos/Runner.xcworkspace/contents.xcworkspacedata b/edge/coordinator_frontend/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/edge/coordinator_frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/edge/coordinator_frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/edge/coordinator_frontend/macos/Runner/AppDelegate.swift b/edge/coordinator_frontend/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..82b6f9d Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..13b35eb Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..0a3f5fa Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..bdb5722 Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..f083318 Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..326c0e7 Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..2f1632c Binary files /dev/null and b/edge/coordinator_frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/edge/coordinator_frontend/macos/Runner/Base.lproj/MainMenu.xib b/edge/coordinator_frontend/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coordinator_frontend/macos/Runner/Configs/AppInfo.xcconfig b/edge/coordinator_frontend/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from coordinator_frontend/macos/Runner/Configs/AppInfo.xcconfig rename to edge/coordinator_frontend/macos/Runner/Configs/AppInfo.xcconfig diff --git a/edge/coordinator_frontend/macos/Runner/Configs/Debug.xcconfig b/edge/coordinator_frontend/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/edge/coordinator_frontend/macos/Runner/Configs/Release.xcconfig b/edge/coordinator_frontend/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/edge/coordinator_frontend/macos/Runner/Configs/Warnings.xcconfig b/edge/coordinator_frontend/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/edge/coordinator_frontend/macos/Runner/DebugProfile.entitlements b/edge/coordinator_frontend/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/edge/coordinator_frontend/macos/Runner/Info.plist b/edge/coordinator_frontend/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/edge/coordinator_frontend/macos/Runner/MainFlutterWindow.swift b/edge/coordinator_frontend/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/edge/coordinator_frontend/macos/Runner/Release.entitlements b/edge/coordinator_frontend/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/edge/coordinator_frontend/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/edge/coordinator_frontend/macos/RunnerTests/RunnerTests.swift b/edge/coordinator_frontend/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/edge/coordinator_frontend/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/coordinator_frontend/pubspec.lock b/edge/coordinator_frontend/pubspec.lock similarity index 100% rename from coordinator_frontend/pubspec.lock rename to edge/coordinator_frontend/pubspec.lock diff --git a/coordinator_frontend/pubspec.yaml b/edge/coordinator_frontend/pubspec.yaml similarity index 100% rename from coordinator_frontend/pubspec.yaml rename to edge/coordinator_frontend/pubspec.yaml diff --git a/coordinator_frontend/test/widget_test.dart b/edge/coordinator_frontend/test/widget_test.dart similarity index 100% rename from coordinator_frontend/test/widget_test.dart rename to edge/coordinator_frontend/test/widget_test.dart diff --git a/edge/coordinator_frontend/web/favicon.png b/edge/coordinator_frontend/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/edge/coordinator_frontend/web/favicon.png differ diff --git a/edge/coordinator_frontend/web/icons/Icon-192.png b/edge/coordinator_frontend/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/edge/coordinator_frontend/web/icons/Icon-192.png differ diff --git a/edge/coordinator_frontend/web/icons/Icon-512.png b/edge/coordinator_frontend/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/edge/coordinator_frontend/web/icons/Icon-512.png differ diff --git a/edge/coordinator_frontend/web/icons/Icon-maskable-192.png b/edge/coordinator_frontend/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/edge/coordinator_frontend/web/icons/Icon-maskable-192.png differ diff --git a/edge/coordinator_frontend/web/icons/Icon-maskable-512.png b/edge/coordinator_frontend/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/edge/coordinator_frontend/web/icons/Icon-maskable-512.png differ diff --git a/coordinator_frontend/web/index.html b/edge/coordinator_frontend/web/index.html similarity index 100% rename from coordinator_frontend/web/index.html rename to edge/coordinator_frontend/web/index.html diff --git a/coordinator_frontend/web/manifest.json b/edge/coordinator_frontend/web/manifest.json similarity index 100% rename from coordinator_frontend/web/manifest.json rename to edge/coordinator_frontend/web/manifest.json diff --git a/edge/coordinator_frontend/windows/.gitignore b/edge/coordinator_frontend/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/edge/coordinator_frontend/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/coordinator_frontend/windows/CMakeLists.txt b/edge/coordinator_frontend/windows/CMakeLists.txt similarity index 100% rename from coordinator_frontend/windows/CMakeLists.txt rename to edge/coordinator_frontend/windows/CMakeLists.txt diff --git a/edge/coordinator_frontend/windows/flutter/CMakeLists.txt b/edge/coordinator_frontend/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/edge/coordinator_frontend/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/coordinator_frontend/windows/flutter/generated_plugin_registrant.cc b/edge/coordinator_frontend/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from coordinator_frontend/windows/flutter/generated_plugin_registrant.cc rename to edge/coordinator_frontend/windows/flutter/generated_plugin_registrant.cc diff --git a/edge/coordinator_frontend/windows/flutter/generated_plugin_registrant.h b/edge/coordinator_frontend/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/edge/coordinator_frontend/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/coordinator_frontend/windows/flutter/generated_plugins.cmake b/edge/coordinator_frontend/windows/flutter/generated_plugins.cmake similarity index 100% rename from coordinator_frontend/windows/flutter/generated_plugins.cmake rename to edge/coordinator_frontend/windows/flutter/generated_plugins.cmake diff --git a/edge/coordinator_frontend/windows/runner/CMakeLists.txt b/edge/coordinator_frontend/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/coordinator_frontend/windows/runner/Runner.rc b/edge/coordinator_frontend/windows/runner/Runner.rc similarity index 100% rename from coordinator_frontend/windows/runner/Runner.rc rename to edge/coordinator_frontend/windows/runner/Runner.rc diff --git a/edge/coordinator_frontend/windows/runner/flutter_window.cpp b/edge/coordinator_frontend/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/edge/coordinator_frontend/windows/runner/flutter_window.h b/edge/coordinator_frontend/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/coordinator_frontend/windows/runner/main.cpp b/edge/coordinator_frontend/windows/runner/main.cpp similarity index 100% rename from coordinator_frontend/windows/runner/main.cpp rename to edge/coordinator_frontend/windows/runner/main.cpp diff --git a/edge/coordinator_frontend/windows/runner/resource.h b/edge/coordinator_frontend/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/edge/coordinator_frontend/windows/runner/resources/app_icon.ico b/edge/coordinator_frontend/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/edge/coordinator_frontend/windows/runner/resources/app_icon.ico differ diff --git a/edge/coordinator_frontend/windows/runner/utils.cpp b/edge/coordinator_frontend/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/edge/coordinator_frontend/windows/runner/utils.h b/edge/coordinator_frontend/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/edge/coordinator_frontend/windows/runner/win32_window.cpp b/edge/coordinator_frontend/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/edge/coordinator_frontend/windows/runner/win32_window.h b/edge/coordinator_frontend/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/edge/coordinator_frontend/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/orangepi_service/README.md b/edge/orangepi_service/README.md similarity index 100% rename from orangepi_service/README.md rename to edge/orangepi_service/README.md diff --git a/edge/orangepi_service/chroma_db/chroma.sqlite3 b/edge/orangepi_service/chroma_db/chroma.sqlite3 new file mode 100644 index 0000000..6bc7ef1 Binary files /dev/null and b/edge/orangepi_service/chroma_db/chroma.sqlite3 differ diff --git a/orangepi_service/service.py b/edge/orangepi_service/service.py similarity index 100% rename from orangepi_service/service.py rename to edge/orangepi_service/service.py