diff --git a/.github/prompts/design_system.prompt.md b/.github/prompts/design_system.prompt.md
new file mode 100644
index 0000000000..24d81a9166
--- /dev/null
+++ b/.github/prompts/design_system.prompt.md
@@ -0,0 +1,199 @@
+---
+mode: agent
+---
+# Design System
+
+For the feature or bug in question, create a design document using the template below.
+
+Save the design using incrementing numbers like the following: memory/design/001_some_feature.md
+
+# [Feature/Component Name] Design Document
+
+## Metadata
+- **Status:** [Draft | In Review | Approved | Implemented]
+- **Author(s):**
+- **Reviewers:**
+- **Created:**
+- **Updated:**
+- **Implementation PR(s):**
+
+## Overview
+
+
+## Goals
+
+## Proposed Solution
+
+### High-Level Approach
+
+
+### Key Components
+
+- **Component A:**
+- **Component B:**
+- **Component C:**
+
+### Simple Architecture Diagram
+
+```
+[Diagram here - can be ASCII, Mermaid, or embedded image]
+```
+
+## Design Considerations
+
+### 1. [Design Choice Name]
+**Context:**
+
+**Options:**
+- **Option A:**
+ - Pros:
+ - Cons:
+- **Option B:**
+ - Pros:
+ - Cons:
+- **Option C:**
+ - Pros:
+ - Cons:
+
+**Recommendation:**
+
+### 2. [Design Choice Name]
+**Context:**
+
+**Options:**
+- **Option A:**
+ - Pros:
+ - Cons:
+- **Option B:**
+ - Pros:
+ - Cons:
+
+**Recommendation:**
+
+## Lifecycle of Code for Key Use Case
+
+
+1. **User initiates action:**
+2. **System validates:**
+3. **Processing step:**
+4. **Data persistence:**
+5. **Response to user:**
+6. **Post-processing (if any):**
+
+### Error Scenarios
+- **If validation fails:**
+- **If external service is down:**
+- **If database write fails:**
+
+## Detailed Design
+
+### Schema Updates
+```sql
+-- Example table or schema changes
+CREATE TABLE example (
+ id UUID PRIMARY KEY,
+ created_at TIMESTAMP NOT NULL,
+ ...
+);
+```
+
+### API Endpoints
+
+#### `POST /api/v1/[endpoint]`
+**Request:**
+```json
+{
+ "field1": "value",
+ "field2": 123
+}
+```
+
+**Response (200 OK):**
+```json
+{
+ "id": "uuid",
+ "status": "success",
+ "data": {}
+}
+```
+
+**Error Response (4xx/5xx):**
+```json
+{
+ "error": "error_code",
+ "message": "Human readable message"
+}
+```
+
+#### `GET /api/v1/[endpoint]/{id}`
+**Response (200 OK):**
+```json
+{
+ "id": "uuid",
+ "field1": "value",
+ "field2": 123
+}
+```
+
+### UI Changes
+
+- **Screen/Component:**
+- **User flow:**
+- **Key interactions:**
+
+### Services / Business Logic
+
+#### Service A
+```python
+# Pseudocode or key algorithm
+def process_request(input):
+ # Validate
+ # Transform
+ # Persist
+ # Return
+```
+
+#### Service B
+
+
+### Data Migration Plan
+
+- **Migration strategy:**
+- **Rollback plan:**
+- **Estimated data volume:**
+
+## Risks & Mitigations
+
+| Risk | Impact | Likelihood | Mitigation |
+|------|--------|------------|------------|
+| [Risk description] | High/Med/Low | High/Med/Low | [How we prevent/handle it] |
+| | | | |
+
+### Technical Debt
+
+-
+
+## Rollout Plan
+
+### Deployment Strategy
+- [ ] Feature flag implementation
+- [ ] Canary deployment percentage:
+- [ ] Full rollout criteria:
+
+### Rollback Plan
+
+
+### Monitoring & Alerts
+
+- **Key metrics:**
+- **Alert thresholds:**
+- **Dashboards:**
+
+## Open Questions
+
+
+
+## References
+- [Link to related documents]
+- [Link to previous ADRs this supersedes or relates to]
+- [Link to external resources]
\ No newline at end of file
diff --git a/.github/prompts/evaluate_me.prompt.md b/.github/prompts/evaluate_me.prompt.md
new file mode 100644
index 0000000000..80226b94d3
--- /dev/null
+++ b/.github/prompts/evaluate_me.prompt.md
@@ -0,0 +1,8 @@
+---
+mode: agent
+---
+# Implement
+
+For the indicated milestone, ask any clarifying questions. If relevant, review different implementation choices with pros and cons.
+
+Implement the milestone, and be clear with that I need to check in the final integration tests. Where possible, write temporary scripts to test the milestone.
\ No newline at end of file
diff --git a/.github/prompts/explore_use_cases.prompt.md b/.github/prompts/explore_use_cases.prompt.md
new file mode 100644
index 0000000000..6de69cc375
--- /dev/null
+++ b/.github/prompts/explore_use_cases.prompt.md
@@ -0,0 +1,9 @@
+---
+mode: agent
+---
+I am a new developer onboarding onto this codebase. I want to explore it through its primary use cases first. Explore this repository and identify the most common, essential, and core use cases.
+
+- Create a section that has an ordered list of use cases
+- Create a section with some typical user journeys
+
+Write to memory/system/use_cases.md
\ No newline at end of file
diff --git a/.github/prompts/implement.prompt.md b/.github/prompts/implement.prompt.md
new file mode 100644
index 0000000000..80226b94d3
--- /dev/null
+++ b/.github/prompts/implement.prompt.md
@@ -0,0 +1,8 @@
+---
+mode: agent
+---
+# Implement
+
+For the indicated milestone, ask any clarifying questions. If relevant, review different implementation choices with pros and cons.
+
+Implement the milestone, and be clear with that I need to check in the final integration tests. Where possible, write temporary scripts to test the milestone.
\ No newline at end of file
diff --git a/.github/prompts/lifecycle.prompt.md b/.github/prompts/lifecycle.prompt.md
new file mode 100644
index 0000000000..1bde40dac4
--- /dev/null
+++ b/.github/prompts/lifecycle.prompt.md
@@ -0,0 +1,27 @@
+---
+mode: agent
+---
+# Trace the lifecycle of a use case
+
+I’m a junior developer onboarding onto a new codebase, and I think the best way to ramp up is to follow the lifecycle of a use case. Generate a cheatsheet of the lifecycle, using the guidelines below.
+
+Structure:
+- Title with use case name and user story
+- Layer 1: Simple Mermaid flowchart showing user journey (6-8 steps max)
+- Layer 2: Mermaid component architecture diagram showing UI/State/Service/External layers with data flow arrows, plus a table mapping each component to its actual implementation (function/class name, file:line)
+- Layer 3: Mermaid sequence diagram showing the detailed interaction flow, followed by 2-3 key design patterns used
+- Data Structures: TypeScript interfaces/types with inline comments
+- Quick Reference: Bullet points of practical info (event triggers, formats, error handling)
+- Related Lifecycles: List 3-5 related use case traces
+
+Component Overview
+- List the key components and services with their roles
+
+Guidelines:
+- Use Mermaid for all diagrams
+- Add actual key classnames, as appropriate
+- Focus on visual understanding, not verbose explanations
+- Include file paths and line numbers in tables
+- NO code duplication (reference files instead)
+
+Output lifecycle into a file like “/memory/system/001_lifecycle_xxx_xxx_xxx.md”
\ No newline at end of file
diff --git a/.github/prompts/plan_milestones.prompt.md b/.github/prompts/plan_milestones.prompt.md
new file mode 100644
index 0000000000..4ca903d1d8
--- /dev/null
+++ b/.github/prompts/plan_milestones.prompt.md
@@ -0,0 +1,12 @@
+---
+mode: agent
+---
+# Plan Milestones
+
+Reference the relevant design document, and create or update a doc in the `memory/milestones` directory, following the naming convention: `001_xxx_milestones.md`.
+
+Create a series of milestones to implement the design. The milestones should implement the design in an iterative, progressive way, so that we can verify and test along the way.
+
+Each milestone should be relatively small and simple, so that I am able to more easily audit the implementation and debug issues. Each milestone should be designed to be easily verifiable via a manual test.
+
+Create checkboxes like `[ ]`, so we can track completion.
\ No newline at end of file
diff --git a/.github/prompts/research.prompt.md b/.github/prompts/research.prompt.md
new file mode 100644
index 0000000000..4609e1744e
--- /dev/null
+++ b/.github/prompts/research.prompt.md
@@ -0,0 +1,11 @@
+---
+mode: agent
+---
+## Research
+I'm a new developer, and I want to use AI to code, but I want to understand and review all the code that's being developed.
+Before starting with a feature, I want to first get an overview of the flow of code around that feature. It's useful to get an orientation on where I'll need to make edits, and get an overview of the relevant system overview that's related to that feature (where views are generated, actions are handled, etc).
+Sort
+If there is UI involved, where is the code that renders the UI?
+If there is event handling, where is the event handler registered, and where is it implemented?
+If there are services involved, which ones are called?
+Before we dive into this feature, guide me through exploring how nearby or similar features work, so that our solution will be consistent with the existing architecture.
\ No newline at end of file
diff --git a/.github/prompts/system_overview.prompt.md b/.github/prompts/system_overview.prompt.md
new file mode 100644
index 0000000000..4a6d1dd3f5
--- /dev/null
+++ b/.github/prompts/system_overview.prompt.md
@@ -0,0 +1,64 @@
+---
+mode: agent
+---
+Look for the lifecycle documentation files, and trace through the flow to create a system architecture document that shows the major actors and their relationships.
+
+## Goal
+Identify the heavyweight components/services where most logic lives, show how they're wired together, and indicate key technologies used.
+
+## Structure
+
+### 1. System Overview Diagram (Mermaid)
+- Show 5-10 major actors (components/services that do the heavy lifting)
+- Wire them together with labeled arrows showing data/control flow
+- Use subgrouping to show deployment boundaries (processes, machines, external services)
+- Color-code or annotate with key technologies
+
+### 2. Component Catalog (Table)
+For each major actor:
+- **Component Name**
+- **Technology/Framework** (e.g., "React + MUI", "Node.js custom", "FastAPI")
+- **Primary Responsibility** (one sentence)
+- **Key Files** (2-3 main files)
+- **Heavy Logic** (what complex operations happen here?)
+
+### 3. Technology Stack (Quick Reference)
+List the key technologies by layer:
+- UI Layer: [technologies]
+- State/Logic Layer: [technologies]
+- Service/API Layer: [technologies]
+- Data Layer: [technologies]
+- External Dependencies: [services/APIs]
+
+### 4. Integration Points
+Show how major actors communicate:
+- Protocol (HTTP, IPC, WebSocket, etc.)
+- Data format (JSON, protobuf, etc.)
+- Sync vs Async
+
+### 5. Where to Start
+- "To understand user interactions, read: [lifecycle docs]"
+- "To understand data flow, start with: [component]"
+- "To understand business logic, start with: [component]"
+
+## Guidelines
+- Focus on "major actors" - components where significant logic lives
+- Exclude simple pass-through components, thin wrappers, pure UI components
+- Maximum 10 major actors (force prioritization)
+- The diagram should fit on one screen
+- Each actor should be substantial enough to deserve documentation
+- This is a companion to lifecycle documents, not a replacement
+
+## Example Major Actors (not minor ones)
+✅ API Gateway with routing logic
+✅ Authentication service with token management
+✅ State management layer with complex sync logic
+✅ Background job processor
+✅ Real-time event handler
+
+❌ Simple React component that just renders props
+❌ Utility function file
+❌ Thin HTTP client wrapper
+❌ Config file
+
+The test: "If this component disappeared, would significant logic need to be rewritten?" If no, it's not a major actor.
\ No newline at end of file
diff --git a/README.md b/README.md
index 8d4f2eb5c5..9a7df1cc06 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,11 @@
Meet Omi, the world’s leading open-source AI wearable that captures conversations, gives summaries, action items and does actions for you. Simply connect Omi to your mobile device and enjoy automatic, high-quality
transcriptions of meetings, chats, and voice memos wherever you are.
-
+
+
+
+
+

[](http://discord.omi.me)
@@ -58,26 +62,26 @@ Start speaking, you'll see Real-time transcript on [webhook.site ](https://webho
## Documentation:
- [Introduction](https://docs.omi.me/)
-- [omi App setup](https://docs.omi.me/docs/developer/AppSetup)
-- [Buying Guide](https://docs.omi.me/docs/assembly/Buying_Guide/)
-- [Build the device](https://docs.omi.me/docs/assembly/Build_the_device/)
-- [Install firmware](https://docs.omi.me/docs/get_started/Flash_device/)
-- [Create your own app in 1 minute](https://docs.omi.me/docs/developer/apps/Introduction).
+- [omi App setup](https://docs.omi.me/doc/developer/AppSetup)
+- [Buying Guide](https://docs.omi.me/doc/assembly/Buying_Guide/)
+- [Build the device](https://docs.omi.me/doc/assembly/Build_the_device/)
+- [Install firmware](https://docs.omi.me/doc/get_started/Flash_device/)
+- [Create your own app in 1 minute](https://docs.omi.me/doc/developer/apps/Introduction).
## Contributions
-- Check out our [contributions guide](https://docs.omi.me/docs/developer/Contribution/).
+- Check out our [contributions guide](https://docs.omi.me/doc/developer/Contribution/).
- Earn from contributing! Check the [paid bounties 🤑](https://omi.me/bounties).
- Check out the [current issues](https://github.com/BasedHardware/Omi/issues).
- Join the [Discord](http://discord.omi.me).
-- Build your own [Plugins/Integrations](https://docs.omi.me/docs/developer/apps/Introduction).
+- Build your own [Plugins/Integrations](https://docs.omi.me/doc/developer/apps/Introduction).
[//]: # "## More links:"
[//]: #
-[//]: # "- [Contributing](https://docs.omi.me/docs/developer/Contribution/)"
-[//]: # "- [Support](https://docs.omi.me/docs/info/Support/;"
-[//]: # "- [BLE Protocol](https://docs.omi.me/docs/developer/Protocol/)"
-[//]: # "- [Plugins](https://docs.omi.me/docs/developer/Plugins/)"
+[//]: # "- [Contributing](https://docs.omi.me/doc/developer/Contribution/)"
+[//]: # "- [Support](https://docs.omi.me/doc/info/Support/)"
+[//]: # "- [BLE Protocol](https://docs.omi.me/doc/developer/Protocol/)"
+[//]: # "- [Plugins](https://docs.omi.me/doc/developer/Plugins/)"
## Licensing
diff --git a/app/README.md b/app/README.md
index ac08589333..9ab68fa01f 100644
--- a/app/README.md
+++ b/app/README.md
@@ -2,7 +2,7 @@
The Omi App is a Flutter-based mobile application that serves as the companion app for Omi devices. This app enables users to interact with their Omi device, manage apps, and customize their experience.
-## 📚 **[View Full App setup instructions in the documentation](https://docs.omi.me/docs/developer/AppSetup)**
+## 📚 **[View Full App setup instructions in the documentation](https://docs.omi.me/doc/developer/AppSetup)**
### Quick Setup
diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle
index d6574b0634..0daffcd238 100644
--- a/app/android/app/build.gradle
+++ b/app/android/app/build.gradle
@@ -2,6 +2,7 @@ plugins {
id "com.android.application"
// START: FlutterFire Configuration
id 'com.google.gms.google-services'
+ id 'com.google.firebase.crashlytics'
// END: FlutterFire Configuration
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
@@ -71,7 +72,7 @@ android {
// ----- END flavorDimensions (autogenerated by flutter_flavorizr) -----
- compileSdkVersion 35
+ compileSdkVersion 36
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
@@ -140,7 +141,7 @@ android {
}
}
- ndkVersion System.getenv()["NDK_VERSION"] ?: "27.0.12077973"
+ ndkVersion System.getenv()["NDK_VERSION"] ?: "28.2.13676358"
}
flutter {
diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml
index 189fb6c5b7..5ded268a8c 100644
--- a/app/android/app/src/main/AndroidManifest.xml
+++ b/app/android/app/src/main/AndroidManifest.xml
@@ -137,6 +137,12 @@
android:scheme="https"
android:pathPattern="/apps/.*" />
+
+
+
+
+
+
diff --git a/app/android/app/src/main/res/values-night/styles.xml b/app/android/app/src/main/res/values-night/styles.xml
index 5b76c42dc7..adab3a7c66 100644
--- a/app/android/app/src/main/res/values-night/styles.xml
+++ b/app/android/app/src/main/res/values-night/styles.xml
@@ -9,6 +9,7 @@
- false
- false
- shortEdges
+ - true
diff --git a/app/android/app/src/main/res/values-v31/styles.xml b/app/android/app/src/main/res/values-v31/styles.xml
index 889c81705d..2e68b66360 100644
--- a/app/android/app/src/main/res/values-v31/styles.xml
+++ b/app/android/app/src/main/res/values-v31/styles.xml
@@ -11,6 +11,7 @@
- shortEdges
- #000000
- @drawable/splash_icon
+ - true
diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml
index f86ecf4a0a..0e57da1369 100644
--- a/app/android/app/src/main/res/values/styles.xml
+++ b/app/android/app/src/main/res/values/styles.xml
@@ -9,6 +9,7 @@
- false
- false
- shortEdges
+ - true
diff --git a/app/android/gradle/wrapper/gradle-wrapper.properties b/app/android/gradle/wrapper/gradle-wrapper.properties
index 06c3185225..099acfd12d 100644
--- a/app/android/gradle/wrapper/gradle-wrapper.properties
+++ b/app/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Sun Sep 22 21:12:01 IST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/app/android/settings.gradle b/app/android/settings.gradle
index 63dbc5016b..49fab355f2 100644
--- a/app/android/settings.gradle
+++ b/app/android/settings.gradle
@@ -18,9 +18,10 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version "8.6.0" apply false
+ id "com.android.application" version '8.10.1' apply false
// START: FlutterFire Configuration
id "com.google.gms.google-services" version "4.3.15" apply false
+ id "com.google.firebase.crashlytics" version "2.8.1" apply false
// END: FlutterFire Configuration
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
diff --git a/app/assets/images/app_launcher_icon_v1.png b/app/assets/images/app_launcher_icon_v1.png
deleted file mode 100644
index e270819b99..0000000000
Binary files a/app/assets/images/app_launcher_icon_v1.png and /dev/null differ
diff --git a/app/assets/images/app_launcher_icon_v2.png b/app/assets/images/app_launcher_icon_v2.png
deleted file mode 100644
index f580e62856..0000000000
Binary files a/app/assets/images/app_launcher_icon_v2.png and /dev/null differ
diff --git a/app/assets/images/herologo_v1.png b/app/assets/images/herologo_v1.png
deleted file mode 100644
index cf92c093b0..0000000000
Binary files a/app/assets/images/herologo_v1.png and /dev/null differ
diff --git a/app/assets/images/herologo_v3.png b/app/assets/images/herologo_v3.png
deleted file mode 100644
index 0f9d425db8..0000000000
Binary files a/app/assets/images/herologo_v3.png and /dev/null differ
diff --git a/app/assets/images/herologo_v4.png b/app/assets/images/herologo_v4.png
deleted file mode 100644
index 6addb81394..0000000000
Binary files a/app/assets/images/herologo_v4.png and /dev/null differ
diff --git a/app/assets/images/logo_transparent_v1.png b/app/assets/images/logo_transparent_v1.png
deleted file mode 100644
index a1f20c1fcc..0000000000
Binary files a/app/assets/images/logo_transparent_v1.png and /dev/null differ
diff --git a/app/assets/images/omi-without-rope-turned-off.png b/app/assets/images/omi-without-rope-turned-off.png
index 514504849c..805b63d8f8 100644
Binary files a/app/assets/images/omi-without-rope-turned-off.png and b/app/assets/images/omi-without-rope-turned-off.png differ
diff --git a/app/assets/images/omi-without-rope.png b/app/assets/images/omi-without-rope.png
index 543134edf2..7c92c40189 100644
Binary files a/app/assets/images/omi-without-rope.png and b/app/assets/images/omi-without-rope.png differ
diff --git a/app/assets/images/onboarding-language-grey.png b/app/assets/images/onboarding-language-grey.png
deleted file mode 100644
index cec067219c..0000000000
Binary files a/app/assets/images/onboarding-language-grey.png and /dev/null differ
diff --git a/app/assets/images/onboarding-name-grey.png b/app/assets/images/onboarding-name-grey.png
deleted file mode 100644
index c890fcc56c..0000000000
Binary files a/app/assets/images/onboarding-name-grey.png and /dev/null differ
diff --git a/app/assets/images/onboarding-name-white.png b/app/assets/images/onboarding-name-white.png
deleted file mode 100644
index c388950bd6..0000000000
Binary files a/app/assets/images/onboarding-name-white.png and /dev/null differ
diff --git a/app/assets/images/onboarding-name.png b/app/assets/images/onboarding-name.png
deleted file mode 100644
index b6f03f6cfd..0000000000
Binary files a/app/assets/images/onboarding-name.png and /dev/null differ
diff --git a/app/assets/images/onboarding-permissions.png b/app/assets/images/onboarding-permissions.png
deleted file mode 100644
index 024325a9a5..0000000000
Binary files a/app/assets/images/onboarding-permissions.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-1.png b/app/assets/images/onboarding_originals/onboarding-bg-1.png
deleted file mode 100644
index 8708d484cd..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-1.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-2.png b/app/assets/images/onboarding_originals/onboarding-bg-2.png
deleted file mode 100644
index bf6dd66a5a..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-2.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-3.png b/app/assets/images/onboarding_originals/onboarding-bg-3.png
deleted file mode 100644
index df57b1db60..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-3.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-4.png b/app/assets/images/onboarding_originals/onboarding-bg-4.png
deleted file mode 100644
index 669ebc8628..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-4.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-5-1.jpg b/app/assets/images/onboarding_originals/onboarding-bg-5-1.jpg
deleted file mode 100644
index aa8de28e2e..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-5-1.jpg and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-5-2.png b/app/assets/images/onboarding_originals/onboarding-bg-5-2.png
deleted file mode 100644
index 4827063152..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-5-2.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding-bg-6.png b/app/assets/images/onboarding_originals/onboarding-bg-6.png
deleted file mode 100644
index bffec2a169..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding-bg-6.png and /dev/null differ
diff --git a/app/assets/images/onboarding_originals/onboarding.mp4 b/app/assets/images/onboarding_originals/onboarding.mp4
deleted file mode 100644
index 2324ad5cdd..0000000000
Binary files a/app/assets/images/onboarding_originals/onboarding.mp4 and /dev/null differ
diff --git a/app/assets/images/splash_icon_v1.png b/app/assets/images/splash_icon_v1.png
deleted file mode 100644
index 54e5761e1d..0000000000
Binary files a/app/assets/images/splash_icon_v1.png and /dev/null differ
diff --git a/app/assets/images/splash_icon_v2.png b/app/assets/images/splash_icon_v2.png
deleted file mode 100644
index daf44f8793..0000000000
Binary files a/app/assets/images/splash_icon_v2.png and /dev/null differ
diff --git a/app/assets/images/splash_v1.png b/app/assets/images/splash_v1.png
deleted file mode 100644
index 059dcff369..0000000000
Binary files a/app/assets/images/splash_v1.png and /dev/null differ
diff --git a/app/assets/images/splash_v2.png b/app/assets/images/splash_v2.png
deleted file mode 100644
index 55484e11e0..0000000000
Binary files a/app/assets/images/splash_v2.png and /dev/null differ
diff --git a/app/assets/lottie_animations/no_internet.json b/app/assets/lottie_animations/no_internet.json
deleted file mode 100644
index ccc1636e27..0000000000
--- a/app/assets/lottie_animations/no_internet.json
+++ /dev/null
@@ -1 +0,0 @@
-{"v":"5.5.2","fr":60,"ip":0,"op":120,"w":177,"h":177,"nm":"wifi","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"waves Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.597,77.587,0],"ix":2},"a":{"a":0,"k":[40.781,22.769,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-33.281,6.893],[-12.997,-6.893],[24.764,-1.6239999999999997]],"o":[[-24.762999999999998,-1.6239999999999997],[12.997,-6.893],[33.281,6.893]],"v":[[-33.281,6.893],[0,-6.893],[33.281,6.893]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false,"_render":true},{"ty":"st","c":{"a":0,"k":[0.6314,0.6784,0.7176,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[40.768,54.561],"ix":2},"a":{"a":0,"k":[-0.013,40.169],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.29],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[-12]},{"t":103,"s":[360]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-24.739,5.135],[-9.561,-5.135],[18.383000000000003,-1.3329999999999993]],"o":[[-18.357,-1.2110000000000003],[9.711,-5.135],[24.739,4.839]],"v":[[-24.739,5.135],[0.151,-5.135],[24.739,4.839]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false,"_render":true},{"ty":"st","c":{"a":0,"k":[0.6314,0.6784,0.7176,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[40.778,54.557],"ix":2},"a":{"a":0,"k":[0.148,30.157],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.29],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[-9]},{"t":104,"s":[720]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-16.732,3.503],[-6.534,-3.503],[12.468,-0.8399999999999999]],"o":[[-12.465,-0.8220000000000001],[6.556,-3.503],[16.732,3.46]],"v":[[-16.732,3.503],[0.021,-3.503],[16.732,3.46]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false,"_render":true},{"ty":"st","c":{"a":0,"k":[0.6314,0.6784,0.7176,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[40.762,54.552],"ix":2},"a":{"a":0,"k":[0.002,20.016],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.29],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13,"s":[-8]},{"t":105,"s":[1080]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":120,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":2,"ty":4,"nm":"dot Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.597,109.383,0],"ix":2},"a":{"a":0,"k":[8.339,8.34,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":34,"s":[90,90,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":58,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":82,"s":[90,90,100]},{"t":106,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.089,-4.468],[4.467,8.089],[-8.089,4.467],[-4.468,-8.089]],"o":[[8.089,4.467],[-4.468,8.089],[-8.089,-4.468],[4.467,-8.089]],"v":[[8.089,-0.001],[0,8.089],[-8.089,-0.001],[0,-8.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false,"_render":true},{"ty":"fl","c":{"a":0,"k":[0.5294,0.2745,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[8.339,8.34],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":120,"st":0,"bm":0,"completed":true}],"markers":[],"__complete":true}
\ No newline at end of file
diff --git a/app/assets/lottie_animations/server_error.json b/app/assets/lottie_animations/server_error.json
deleted file mode 100644
index 9e0f110447..0000000000
--- a/app/assets/lottie_animations/server_error.json
+++ /dev/null
@@ -1 +0,0 @@
-{"v":"5.1.5","fr":29.9700012207031,"ip":0,"op":42.0000017106951,"w":32,"h":32,"nm":"System-states-Sin conexiÃÂón","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":3,"ty":4,"nm":"! contornos","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16,16,0],"ix":2},"a":{"a":0,"k":[8.25,8.25,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.847,0.847,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"n":["0p847_1_1_0","0p847_1_1_0","0p667_1_0p333_0"],"t":0,"s":[100,100,100],"e":[130,130,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.127,0.127,0.333],"y":[0,0,0]},"n":["0_1_0p127_0","0_1_0p127_0","0p667_1_0p333_0"],"t":21,"s":[130,130,100],"e":[100,100,100]},{"t":42.0000017106951}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.442,0],[0,-0.443],[-0.442,0],[0,0.441]],"o":[[-0.442,0],[0,0.441],[0.442,0],[0,-0.443]],"v":[[0,-0.8],[-0.8,0],[0,0.8],[0.8,0]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,12.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.221,0],[0,0.221],[0,0],[0.221,0],[0,-0.221],[0,0]],"o":[[0.221,0],[0,0],[0,-0.221],[-0.221,0],[0,0],[0,0.221]],"v":[[0,2.544],[0.4,2.144],[0.4,-2.144],[0,-2.544],[-0.4,-2.144],[-0.4,2.144]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,7.194],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.416],[-4.416,0],[0,4.416],[4.416,0]],"o":[[0,4.416],[4.416,0],[0,-4.416],[-4.416,0]],"v":[[-8,0],[0,8],[8,0],[0,-8]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3059,0.2275,0.5098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,8.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3597.00014650881,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Sombra contornos","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8.4,"s":[100],"e":[0]},{"t":23.8000009693939}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16,16,0],"ix":2},"a":{"a":0,"k":[8.25,8.25,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.847,0.847,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"n":["0p847_1_1_0","0p847_1_1_0","0p667_1_0p333_0"],"t":0,"s":[100,100,100],"e":[180,180,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.127,0.127,0.333],"y":[0,0,0]},"n":["0_1_0p127_0","0_1_0p127_0","0p667_1_0p333_0"],"t":21,"s":[180,180,100],"e":[100,100,100]},{"t":42.0000017106951}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.416],[-4.416,0],[0,4.416],[4.416,0]],"o":[[0,4.416],[4.416,0],[0,-4.416],[-4.416,0]],"v":[[-8,0],[0,8],[8,0],[0,-8]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3059,0.2275,0.5098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,8.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3597.00014650881,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/app/assets/lottie_animations/wave.json b/app/assets/lottie_animations/wave.json
deleted file mode 100644
index 2511f687e0..0000000000
--- a/app/assets/lottie_animations/wave.json
+++ /dev/null
@@ -1 +0,0 @@
-{"nm":"æÂÂæÂ¾å¨ç»","mn":"","layers":[{"ty":4,"nm":"å½¢ç¶å¾屠20","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[166.25,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-7.25],[3,11.5],[0,14.5],[-3,11.5],[-3,-7.25],[0,-10.25]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-24.75],[3,21],[0,24],[-3,21],[-3,-24.75],[0,-27.75]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-25.25],[3,26],[0,29],[-3,26],[-3,-25.25],[0,-28.25]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":0},{"ty":4,"nm":"å½¢ç¶å¾屠19","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[154.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-9.25],[2.875,11.5],[-0.125,14.5],[-3.125,11.5],[-3.125,-9.25],[-0.125,-12.25]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"å½¢ç¶å¾屠18","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[142.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-8.5],[2.875,12.25],[-0.125,15.25],[-3.125,12.25],[-3.125,-8.5],[-0.125,-11.5]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-5.75],[2.875,6.75],[-0.125,9.75],[-3.125,6.75],[-3.125,-5.75],[-0.125,-8.75]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-10.25],[2.875,11],[-0.125,14],[-3.125,11],[-3.125,-10.25],[-0.125,-13.25]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"å½¢ç¶å¾屠14","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[178.25,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-6],[3,6.5],[0,9.5],[-3,6.5],[-3,-6],[0,-9]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"å½¢ç¶å¾屠10","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-31.75],[2.875,32.5],[-0.125,35.5],[-3.125,32.5],[-3.125,-31.75],[-0.125,-34.75]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-29],[2.875,27.75],[-0.125,30.75],[-3.125,27.75],[-3.125,-29],[-0.125,-32]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-8.25],[2.875,14.75],[-0.125,17.75],[-3.125,14.75],[-3.125,-8.25],[-0.125,-11.25]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-31],[2.875,34.25],[-0.125,37.25],[-3.125,34.25],[-3.125,-31],[-0.125,-34]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"å½¢ç¶å¾屠9","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5},{"ty":4,"nm":"å½¢ç¶å¾屠5","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.25,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-12.5],[3,7.25],[0,10.25],[-3,7.25],[-3,-12.5],[0,-15.5]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-3.5],[3,7.25],[0,10.25],[-3,7.25],[-3,-3.5],[0,-6.5]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6},{"ty":4,"nm":"å½¢ç¶å¾屠17","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[106.25,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-7.25],[3,11.5],[0,14.5],[-3,11.5],[-3,-7.25],[0,-10.25]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-24.75],[3,21],[0,24],[-3,21],[-3,-24.75],[0,-27.75]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-25.25],[3,26],[0,29],[-3,26],[-3,-25.25],[0,-28.25]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7},{"ty":4,"nm":"å½¢ç¶å¾屠4","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[58.25,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-7.25],[3,11.5],[0,14.5],[-3,11.5],[-3,-7.25],[0,-10.25]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-24.75],[3,21],[0,24],[-3,21],[-3,-24.75],[0,-27.75]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-31],[3,31.25],[0,34.25],[-3,31.25],[-3,-31],[0,-34]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-25.25],[3,26],[0,29],[-3,26],[-3,-25.25],[0,-28.25]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8},{"ty":4,"nm":"å½¢ç¶å¾屠16","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[94.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-24.5],[2.875,26],[-0.125,29],[-3.125,26],[-3.125,-24.5],[-0.125,-27.5]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-2.75],[2.875,5],[-0.125,8],[-3.125,5],[-3.125,-2.75],[-0.125,-5.75]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-33.25],[2.875,29],[-0.125,32],[-3.125,29],[-3.125,-33.25],[-0.125,-36.25]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9},{"ty":4,"nm":"å½¢ç¶å¾屠3","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[46.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-24],[2.875,20.25],[-0.125,23.25],[-3.125,20.25],[-3.125,-24],[-0.125,-27]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-4.5],[2.875,6.75],[-0.125,9.75],[-3.125,6.75],[-3.125,-4.5],[-0.125,-7.5]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"å½¢ç¶å¾屠15","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[82.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-8.5],[2.875,12.25],[-0.125,15.25],[-3.125,12.25],[-3.125,-8.5],[-0.125,-11.5]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-4.5],[2.875,11.75],[-0.125,14.75],[-3.125,11.75],[-3.125,-4.5],[-0.125,-7.5]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"å½¢ç¶å¾屠2","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[34.375,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-8.5],[2.875,12.25],[-0.125,15.25],[-3.125,12.25],[-3.125,-8.5],[-0.125,-11.5]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[2.875,-6],[2.875,12.75],[-0.125,15.75],[-3.125,12.75],[-3.125,-6],[-0.125,-9]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":4,"nm":"å½¢ç¶å¾屠1","mn":"","sr":1,"st":0,"op":100,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-75.5,3.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[22.25,76.723,0],"ix":2},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"ç©形 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"路徠1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-34.25],[3,30],[0,33],[-3,30],[-3,-34.25],[0,-37.25]]}],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-17],[3,17],[0,20],[-3,17],[-3,-17],[0,-20]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,-1.657],[0,0],[1.657,0],[0,1.657],[0,0],[-1.657,0]],"o":[[0,0],[0,1.657],[-1.657,0],[0,0],[0,-1.657],[1.657,0]],"v":[[3,-2],[3,7.25],[0,10.25],[-3,7.25],[-3,-2],[0,-5]]}],"t":36}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"å¡«åÂ
Â
1","c":{"a":0,"k":[0.1451,0.1451,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-74.942,1.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":13}],"ddd":0,"h":150,"w":200,"meta":{"a":"","k":"","d":"","g":"@lottiefiles/toolkit-js 0.21.1","tc":"#ffffff"},"v":"5.6.6","fr":25,"op":36,"ip":0,"assets":[]}
\ No newline at end of file
diff --git a/app/assets/pdfs/favicon.png b/app/assets/pdfs/favicon.png
deleted file mode 100644
index 8aaa46ac1a..0000000000
Binary files a/app/assets/pdfs/favicon.png and /dev/null differ
diff --git a/app/assets/silero_vad.onnx b/app/assets/silero_vad.onnx
deleted file mode 100644
index e6db48d6e2..0000000000
Binary files a/app/assets/silero_vad.onnx and /dev/null differ
diff --git a/app/assets/silero_vad.v5.onnx b/app/assets/silero_vad.v5.onnx
deleted file mode 100644
index d0ccd9d7fc..0000000000
Binary files a/app/assets/silero_vad.v5.onnx and /dev/null differ
diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock
index 72c1b64dca..a3d80a7e1d 100644
--- a/app/ios/Podfile.lock
+++ b/app/ios/Podfile.lock
@@ -1,5 +1,5 @@
PODS:
- - app_links (0.0.2):
+ - app_links (6.4.1):
- Flutter
- AppAuth (1.7.6):
- AppAuth/Core (= 1.7.6)
@@ -57,6 +57,9 @@ PODS:
- FirebaseAuth (~> 11.10.0)
- Firebase/CoreOnly (11.10.0):
- FirebaseCore (~> 11.10.0)
+ - Firebase/Crashlytics (11.10.0):
+ - Firebase/CoreOnly
+ - FirebaseCrashlytics (~> 11.10.0)
- Firebase/Messaging (11.10.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 11.10.0)
@@ -67,11 +70,15 @@ PODS:
- firebase_core (3.13.0):
- Firebase/CoreOnly (= 11.10.0)
- Flutter
+ - firebase_crashlytics (4.3.2):
+ - Firebase/Crashlytics (= 11.10.0)
+ - firebase_core
+ - Flutter
- firebase_messaging (15.2.5):
- Firebase/Messaging (= 11.10.0)
- firebase_core
- Flutter
- - FirebaseAppCheckInterop (11.14.0)
+ - FirebaseAppCheckInterop (11.15.0)
- FirebaseAuth (11.10.0):
- FirebaseAppCheckInterop (~> 11.0)
- FirebaseAuthInterop (~> 11.0)
@@ -81,7 +88,7 @@ PODS:
- GoogleUtilities/Environment (~> 8.0)
- GTMSessionFetcher/Core (< 5.0, >= 3.4)
- RecaptchaInterop (~> 101.0)
- - FirebaseAuthInterop (11.14.0)
+ - FirebaseAuthInterop (11.15.0)
- FirebaseCore (11.10.0):
- FirebaseCoreInternal (~> 11.10.0)
- GoogleUtilities/Environment (~> 8.0)
@@ -90,6 +97,15 @@ PODS:
- FirebaseCore (~> 11.10.0)
- FirebaseCoreInternal (11.10.0):
- "GoogleUtilities/NSData+zlib (~> 8.0)"
+ - FirebaseCrashlytics (11.10.0):
+ - FirebaseCore (~> 11.10.0)
+ - FirebaseInstallations (~> 11.0)
+ - FirebaseRemoteConfigInterop (~> 11.0)
+ - FirebaseSessions (~> 11.0)
+ - GoogleDataTransport (~> 10.0)
+ - GoogleUtilities/Environment (~> 8.0)
+ - nanopb (~> 3.30910.0)
+ - PromisesObjC (~> 2.4)
- FirebaseInstallations (11.10.0):
- FirebaseCore (~> 11.10.0)
- GoogleUtilities/Environment (~> 8.0)
@@ -104,6 +120,16 @@ PODS:
- GoogleUtilities/Reachability (~> 8.0)
- GoogleUtilities/UserDefaults (~> 8.0)
- nanopb (~> 3.30910.0)
+ - FirebaseRemoteConfigInterop (11.15.0)
+ - FirebaseSessions (11.10.0):
+ - FirebaseCore (~> 11.10.0)
+ - FirebaseCoreExtension (~> 11.10.0)
+ - FirebaseInstallations (~> 11.0)
+ - GoogleDataTransport (~> 10.0)
+ - GoogleUtilities/Environment (~> 8.0)
+ - GoogleUtilities/UserDefaults (~> 8.0)
+ - nanopb (~> 3.30910.0)
+ - PromisesSwift (~> 2.1)
- Flutter (1.0.0)
- flutter_archive (0.0.1):
- Flutter
@@ -116,22 +142,19 @@ PODS:
- Flutter
- flutter_native_splash (2.4.3):
- Flutter
- - flutter_silero_vad (0.0.1):
- - Flutter
- - onnxruntime-objc (= 1.15.0)
- flutter_sound (9.28.0):
- Flutter
- flutter_sound_core (= 9.28.0)
- flutter_sound_core (9.28.0)
- flutter_timezone (0.0.1):
- Flutter
+ - flutter_web_auth_2 (5.0.0-alpha.2):
+ - Flutter
- frame_sdk (0.0.2):
- Flutter
- geolocator_apple (1.2.0):
- Flutter
- FlutterMacOS
- - google_sign_in_all_platforms_mobile (0.0.1):
- - Flutter
- google_sign_in_ios (0.0.1):
- Flutter
- FlutterMacOS
@@ -175,10 +198,6 @@ PODS:
- Flutter
- in_app_review (2.0.0):
- Flutter
- - Instabug (14.3.0)
- - instabug_flutter (14.3.1):
- - Flutter
- - Instabug (= 14.3.0)
- integration_test (0.0.1):
- Flutter
- Intercom (18.8.1)
@@ -213,11 +232,6 @@ PODS:
- nordic_dfu (1.0.0):
- Flutter
- iOSDFULibrary (~> 4.15.3)
- - onnxruntime-c (1.15.0)
- - onnxruntime-objc (1.15.0):
- - onnxruntime-objc/Core (= 1.15.0)
- - onnxruntime-objc/Core (1.15.0):
- - onnxruntime-c (= 1.15.0)
- opus_flutter_ios (1.4.0):
- Flutter
- package_info_plus (0.4.5):
@@ -227,12 +241,9 @@ PODS:
- FlutterMacOS
- permission_handler_apple (9.3.0):
- Flutter
- - PostHog (3.26.2)
- - posthog_flutter (0.0.1):
- - Flutter
- - FlutterMacOS
- - PostHog (~> 3.22)
- PromisesObjC (2.4.0)
+ - PromisesSwift (2.4.0):
+ - PromisesObjC (= 2.4.0)
- RecaptchaInterop (101.0.0)
- SDWebImage (5.21.1):
- SDWebImage/Core (= 5.21.1)
@@ -248,7 +259,7 @@ PODS:
- Flutter
- FlutterMacOS
- SwiftCBOR (0.4.4)
- - SwiftProtobuf (1.29.0)
+ - SwiftProtobuf (1.31.0)
- SwiftyGif (5.4.5)
- url_launcher_ios (0.0.1):
- Flutter
@@ -270,6 +281,7 @@ DEPENDENCIES:
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
+ - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- flutter_archive (from `.symlinks/plugins/flutter_archive/ios`)
@@ -277,16 +289,14 @@ DEPENDENCIES:
- flutter_blue_plus (from `.symlinks/plugins/flutter_blue_plus/ios`)
- flutter_foreground_task (from `.symlinks/plugins/flutter_foreground_task/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- - flutter_silero_vad (from `.symlinks/plugins/flutter_silero_vad/ios`)
- flutter_sound (from `.symlinks/plugins/flutter_sound/ios`)
- flutter_timezone (from `.symlinks/plugins/flutter_timezone/ios`)
+ - flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`)
- frame_sdk (from `.symlinks/plugins/frame_sdk/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
- - google_sign_in_all_platforms_mobile (from `.symlinks/plugins/google_sign_in_all_platforms_mobile/ios`)
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
- - instabug_flutter (from `.symlinks/plugins/instabug_flutter/ios`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- intercom_flutter (from `.symlinks/plugins/intercom_flutter/ios`)
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
@@ -298,7 +308,6 @@ DEPENDENCIES:
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- - posthog_flutter (from `.symlinks/plugins/posthog_flutter/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
@@ -319,25 +328,25 @@ SPEC REPOS:
- FirebaseCore
- FirebaseCoreExtension
- FirebaseCoreInternal
+ - FirebaseCrashlytics
- FirebaseInstallations
- FirebaseMessaging
+ - FirebaseRemoteConfigInterop
+ - FirebaseSessions
- flutter_sound_core
- GoogleDataTransport
- GoogleSignIn
- GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher
- - Instabug
- Intercom
- IosAwnCore
- iOSDFULibrary
- iOSMcuManagerLibrary
- Mixpanel-swift
- nanopb
- - onnxruntime-c
- - onnxruntime-objc
- - PostHog
- PromisesObjC
+ - PromisesSwift
- RecaptchaInterop
- SDWebImage
- SwiftCBOR
@@ -364,6 +373,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_auth/ios"
firebase_core:
:path: ".symlinks/plugins/firebase_core/ios"
+ firebase_crashlytics:
+ :path: ".symlinks/plugins/firebase_crashlytics/ios"
firebase_messaging:
:path: ".symlinks/plugins/firebase_messaging/ios"
Flutter:
@@ -378,26 +389,22 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_foreground_task/ios"
flutter_native_splash:
:path: ".symlinks/plugins/flutter_native_splash/ios"
- flutter_silero_vad:
- :path: ".symlinks/plugins/flutter_silero_vad/ios"
flutter_sound:
:path: ".symlinks/plugins/flutter_sound/ios"
flutter_timezone:
:path: ".symlinks/plugins/flutter_timezone/ios"
+ flutter_web_auth_2:
+ :path: ".symlinks/plugins/flutter_web_auth_2/ios"
frame_sdk:
:path: ".symlinks/plugins/frame_sdk/ios"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/darwin"
- google_sign_in_all_platforms_mobile:
- :path: ".symlinks/plugins/google_sign_in_all_platforms_mobile/ios"
google_sign_in_ios:
:path: ".symlinks/plugins/google_sign_in_ios/darwin"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
in_app_review:
:path: ".symlinks/plugins/in_app_review/ios"
- instabug_flutter:
- :path: ".symlinks/plugins/instabug_flutter/ios"
integration_test:
:path: ".symlinks/plugins/integration_test/ios"
intercom_flutter:
@@ -420,8 +427,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
- posthog_flutter:
- :path: ".symlinks/plugins/posthog_flutter/ios"
share_plus:
:path: ".symlinks/plugins/share_plus/ios"
shared_preferences_foundation:
@@ -438,7 +443,7 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
- app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
+ app_links: 3dbc685f76b1693c66a6d9dd1e9ab6f73d97dc0a
AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
awesome_notifications: 0f432b28098d193920b11a44cfa9d2d9313a3888
@@ -451,28 +456,31 @@ SPEC CHECKSUMS:
Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2
firebase_auth: 83bf106e5ac670dd3a0af27a86be6cba16a85723
firebase_core: 2d4534e7b489907dcede540c835b48981d890943
+ firebase_crashlytics: 064d9a9e3b62b53a7657007d0c354bcefc02eb3a
firebase_messaging: 75bc93a4df25faccad67f6662ae872ac9ae69b64
- FirebaseAppCheckInterop: a92ba81d0ee3c4cddb1a2e52c668ea51dc63c3ae
+ FirebaseAppCheckInterop: 06fe5a3799278ae4667e6c432edd86b1030fa3df
FirebaseAuth: c4146bdfdc87329f9962babd24dae89373f49a32
- FirebaseAuthInterop: e25b58ecb90f3285085fa2118861a3c9dfdc62ad
+ FirebaseAuthInterop: 7087d7a4ee4bc4de019b2d0c240974ed5d89e2fd
FirebaseCore: 8344daef5e2661eb004b177488d6f9f0f24251b7
FirebaseCoreExtension: 6f357679327f3614e995dc7cf3f2d600bdc774ac
FirebaseCoreInternal: ef4505d2afb1d0ebbc33162cb3795382904b5679
+ FirebaseCrashlytics: 84b073c997235740e6a951b7ee49608932877e5c
FirebaseInstallations: 9980995bdd06ec8081dfb6ab364162bdd64245c3
FirebaseMessaging: 2b9f56aa4ed286e1f0ce2ee1d413aabb8f9f5cb9
- Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa
+ FirebaseSessions: 9b3b30947b97a15370e0902ee7a90f50ef60ead6
+ Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_archive: ad8edfd7f7d1bb12058d05424ba93e27d9930efe
flutter_background_service_ios: 00d31bdff7b4bfe06d32375df358abe0329cf87e
flutter_blue_plus: e5808fc4e5ebc58bb911635f8fdaf5e2b4da2754
flutter_foreground_task: a159d2c2173b33699ddb3e6c2a067045d7cebb89
flutter_native_splash: 6cad9122ea0fad137d23137dd14b937f3e90b145
- flutter_silero_vad: 623c22e30420ae174857926385670b9f6e52e4b9
flutter_sound: b9236a5875299aaa4cef1690afd2f01d52a3f890
flutter_sound_core: 427465f72d07ab8c3edbe8ffdde709ddacd3763c
flutter_timezone: ee50ce7786b5fde27e2fe5375bbc8c9661ffc13f
+ flutter_web_auth_2: c35a99b4799ad94b0dc140880f406cf59a4af866
frame_sdk: 4d4df786d828557bf57e05f6f1856613896cc9db
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
- google_sign_in_all_platforms_mobile: e0378d33ac45af48bea7420dfb886832a5cf0731
google_sign_in_ios: 39f46834c156be9a4dfef914258e0145b7117725
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleSignIn: b232380cf495a429b8095d3178a8d5855b42e842
@@ -480,9 +488,7 @@ SPEC CHECKSUMS:
GTMAppAuth: 99fb010047ba3973b7026e45393f51f27ab965ae
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
- in_app_review: 5596fe56fab799e8edb3561c03d053363ab13457
- Instabug: 97a4e694731f46bbc02dbe49ab29cc552c5e2f41
- instabug_flutter: 0a2d35be020c80b2b63bd8337a94a3f2ffe65bc0
+ in_app_review: 7dd1ea365263f834b8464673f9df72c80c17c937
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
Intercom: b636b0e27ab832827abdf6573c57a80cf090ff5a
intercom_flutter: b9237a96bc29945d2f1e57d2b702d4a5a1952c70
@@ -496,15 +502,12 @@ SPEC CHECKSUMS:
mixpanel_flutter: a0b6b937035899cd01951735ad5f87718b2ffee5
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
nordic_dfu: e4fb6f461f4a290b28ea4b1dfb69071665cdfa3e
- onnxruntime-c: e87399683ec19e3b812e13c6692882609a802b86
- onnxruntime-objc: 57ae8f83779a4c32731065d50d02d042af581114
opus_flutter_ios: f16ed3599997ced564ad44509e87003159a86def
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
- PostHog: 1537fafb97b44964c170f135e120b1b953338c64
- posthog_flutter: 631ab870f7daf1ed190deeb2414eb3e347445f37
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
+ PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
SDWebImage: f29024626962457f3470184232766516dee8dfea
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
@@ -512,7 +515,7 @@ SPEC CHECKSUMS:
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
SwiftCBOR: ce5354ec8b660da2d6fc754462881119dbe1f963
- SwiftProtobuf: b7aa08087e2ab6d162862d143020091254095f69
+ SwiftProtobuf: caa61117d9a5eeb60a52375f6685991a1fd4bd7b
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
diff --git a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme
index af88214d07..2c65aac41d 100644
--- a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme
+++ b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme
@@ -5,6 +5,24 @@
+
+
+
+
+
+
+
+
+
+
$(GOOGLE_REVERSE_CLIENT_ID)
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ omi.auth
+ CFBundleURLSchemes
+
+ omi
+
+
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
diff --git a/app/lib/backend/auth.dart b/app/lib/backend/auth.dart
deleted file mode 100644
index 98e7d24abd..0000000000
--- a/app/lib/backend/auth.dart
+++ /dev/null
@@ -1,577 +0,0 @@
-import 'dart:async';
-import 'dart:convert';
-import 'dart:math';
-
-import 'package:crypto/crypto.dart';
-import 'package:firebase_auth/firebase_auth.dart';
-import 'package:flutter/foundation.dart';
-import 'package:omi/backend/preferences.dart';
-import 'package:omi/env/env.dart';
-import 'package:omi/utils/auth/custom_post_auth_page.dart';
-import 'package:omi/utils/logger.dart';
-import 'package:google_sign_in/google_sign_in.dart' as standard_google_sign_in;
-import 'package:google_sign_in_all_platforms/google_sign_in_all_platforms.dart' as all_platforms_google_sign_in;
-import 'package:omi/utils/platform/platform_service.dart';
-import 'package:sign_in_with_apple/sign_in_with_apple.dart';
-import 'package:flutter/services.dart';
-
-/// Generates a cryptographically secure random nonce, to be included in a
-/// credential request.
-String generateNonce([int length = 32]) {
- const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._';
- final random = Random.secure();
- return List.generate(length, (_) => charset[random.nextInt(charset.length)]).join();
-}
-
-/// Returns the sha256 hash of [input] in hex notation.
-String sha256ofString(String input) {
- final bytes = utf8.encode(input);
- final digest = sha256.convert(bytes);
- return digest.toString();
-}
-
-final String _googleClientId = Env.googleClientId!;
-final String _googleClientSecret = Env.googleClientSecret!;
-
-// Method channel for native platform calls
-const MethodChannel _screenCaptureChannel = MethodChannel('screenCapturePlatform');
-
-/// Brings the desktop app to the front (macOS and Windows)
-Future _bringAppToFront() async {
- if (PlatformService.isDesktop) {
- try {
- await _screenCaptureChannel.invokeMethod('bringAppToFront');
- } catch (e) {
- debugPrint('Error bringing app to front: $e');
- }
- }
-}
-
-// Create a single GoogleSignIn instance for all platforms to avoid assertion errors
-all_platforms_google_sign_in.GoogleSignIn? _googleSignInAllPlatforms;
-
-all_platforms_google_sign_in.GoogleSignIn _getGoogleSignInAllPlatforms() {
- return _googleSignInAllPlatforms ??= all_platforms_google_sign_in.GoogleSignIn(
- params: all_platforms_google_sign_in.GoogleSignInParams(
- clientId: _googleClientId,
- clientSecret: _googleClientSecret,
- scopes: [
- 'https://www.googleapis.com/auth/userinfo.profile',
- 'https://www.googleapis.com/auth/userinfo.email',
- ],
- redirectPort: 5000,
- customPostAuthPage: customPostAuthHtml,
- ),
- );
-}
-
-Future signInWithApple() async {
- try {
- // Sign out the current user first
- debugPrint('Signing out current user...');
- await FirebaseAuth.instance.signOut();
- debugPrint('User signed out successfully.');
-
- final rawNonce = generateNonce();
- final nonce = sha256ofString(rawNonce);
-
- debugPrint('Requesting Apple credential...');
- final appleCredential = await SignInWithApple.getAppleIDCredential(
- scopes: [AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName],
- nonce: nonce,
- );
-
- debugPrint('Apple credential received.');
- debugPrint('Email: ${appleCredential.email ?? "null"}');
- debugPrint('Given Name: ${appleCredential.givenName ?? "null"}');
- debugPrint('Family Name: ${appleCredential.familyName ?? "null"}');
- debugPrint('Identity Token: ${appleCredential.identityToken != null ? 'Present' : 'Null'}');
- debugPrint('Authorization Code: ${appleCredential.authorizationCode.isNotEmpty ? 'Present' : 'Null'}');
-
- if (appleCredential.identityToken == null) {
- throw Exception('Apple Sign In failed - no identity token received.');
- }
-
- // Create an `OAuthCredential` from the credential returned by Apple.
- final oauthCredential = OAuthProvider("apple.com").credential(
- idToken: appleCredential.identityToken,
- rawNonce: rawNonce,
- accessToken: appleCredential.authorizationCode,
- );
-
- debugPrint('OAuth Credential created.');
- debugPrint('Provider ID: ${oauthCredential.providerId}');
- debugPrint('Sign-in method: ${oauthCredential.signInMethod}');
- debugPrint('Access Token: ${oauthCredential.accessToken ?? "null"}');
- debugPrint('ID Token: ${oauthCredential.idToken ?? "null"}');
-
- // Sign in the user with Firebase.
- debugPrint('Attempting to sign in with Firebase...');
- UserCredential userCred = await FirebaseAuth.instance.signInWithCredential(oauthCredential);
- debugPrint('Firebase sign-in successful.');
-
- // Update user profile and local storage
- var user = FirebaseAuth.instance.currentUser!;
- debugPrint('Firebase User ID: ${user.uid}');
- debugPrint('Firebase User Email: ${user.email ?? "null"}');
- debugPrint('Firebase User Display Name: ${user.displayName ?? "null"}');
-
- if (appleCredential.email != null) {
- SharedPreferencesUtil().email = appleCredential.email!;
- }
- if (appleCredential.givenName != null) {
- SharedPreferencesUtil().givenName = appleCredential.givenName!;
- SharedPreferencesUtil().familyName = appleCredential.familyName ?? '';
- user.updateProfile(displayName: SharedPreferencesUtil().fullName);
- } else {
- var nameParts = user.displayName?.split(' ');
- SharedPreferencesUtil().givenName = nameParts?[0] ?? '';
- SharedPreferencesUtil().familyName = nameParts?[nameParts.length - 1] ?? '';
- }
- if (SharedPreferencesUtil().email.isEmpty) {
- SharedPreferencesUtil().email = user.email ?? '';
- }
-
- debugPrint('signInWithApple Name: ${SharedPreferencesUtil().fullName}');
- debugPrint('signInWithApple Email: ${SharedPreferencesUtil().email}');
-
- // Bring app to front after successful authentication
- await _bringAppToFront();
-
- return userCred;
- } on FirebaseAuthException catch (e) {
- debugPrint('FirebaseAuthException: ${e.code} - ${e.message}');
- if (e.code == 'invalid-credential') {
- debugPrint('Please check Firebase console configuration for Apple Sign In.');
- }
- return null;
- } catch (e) {
- debugPrint('Error during Apple Sign In: $e');
- Logger.handle(e, null, message: 'An error occurred while signing in. Please try again later.');
- return null;
- }
-}
-
-Future signInWithGoogle() async {
- try {
- debugPrint('Signing in with Google');
-
- // Platform-specific Google Sign In implementation
- if (kIsWeb || PlatformService.isDesktop) {
- // Use google_sign_in_all_platforms for Windows, macOS and Web
- return await _signInWithGoogleAllPlatforms();
- } else {
- // Use standard google_sign_in for iOS, Android
- return await _signInWithGoogleStandard();
- }
- } catch (e) {
- debugPrint('Failed to sign in with Google: $e');
- Logger.handle(e, null, message: 'An error occurred while signing in. Please try again later.');
- return null;
- }
-}
-
-/// Google Sign In using the standard google_sign_in package (iOS, Android)
-Future _signInWithGoogleStandard() async {
- debugPrint('Using standard Google Sign In');
-
- // Trigger the authentication flow
- final standard_google_sign_in.GoogleSignInAccount? googleUser = await standard_google_sign_in.GoogleSignIn(
- scopes: ['profile', 'email'],
- ).signIn();
- debugPrint('Google User: $googleUser');
-
- // Obtain the auth details from the request
- final standard_google_sign_in.GoogleSignInAuthentication? googleAuth = await googleUser?.authentication;
- debugPrint('Google Auth: $googleAuth');
- if (googleAuth == null) {
- debugPrint('Failed to sign in with Google: googleAuth is NULL');
- Logger.error('An error occurred while signing in. Please try again later. (Error: 40001)');
- return null;
- }
-
- // Create a new credential
- if (googleAuth.accessToken == null && googleAuth.idToken == null) {
- debugPrint('Failed to sign in with Google: accessToken, idToken are NULL');
- Logger.error('An error occurred while signing in. Please try again later. (Error: 40002)');
- return null;
- }
- final credential = GoogleAuthProvider.credential(
- accessToken: googleAuth.accessToken,
- idToken: googleAuth.idToken,
- );
-
- // Once signed in, return the UserCredential
- var result = await FirebaseAuth.instance.signInWithCredential(credential);
- return _processGoogleSignInResult(result);
-}
-
-/// Google Sign In using google_sign_in_all_platforms (Windows, macOS, Web)
-Future _signInWithGoogleAllPlatforms() async {
- debugPrint('Using Google Sign In All Platforms');
-
- if (_googleClientId.isEmpty) {
- Logger.error('Google Client ID not configured. Please configure _googleClientId and _googleClientSecret');
- return null;
- }
-
- // Initialize the all platforms Google Sign In with required params for Windows
- final googleSignIn = _getGoogleSignInAllPlatforms();
-
- // First, sign out to ensure we get fresh credentials (needed for windows)
- try {
- await googleSignIn.signOut();
- debugPrint('Signed out from Google (all platforms) to get fresh credentials');
- } catch (e) {
- debugPrint('Error signing out from Google: $e');
- }
-
- // Trigger the authentication flow
- final all_platforms_google_sign_in.GoogleSignInCredentials? credentials = await googleSignIn.signIn();
-
- if (credentials == null) {
- debugPrint('Google Sign In was cancelled by user or failed');
- return null;
- }
-
- // For all platforms package, we only get accessToken, so we need to make an API call to get user info
- // and create a custom token for Firebase (this is more complex)
- // For now, let's create a credential with just the access token
- final credential = GoogleAuthProvider.credential(
- accessToken: credentials.accessToken,
- idToken: credentials.idToken, // May be null
- );
-
- try {
- // Once signed in, return the UserCredential
- var result = await FirebaseAuth.instance.signInWithCredential(credential);
- return _processGoogleSignInResultAllPlatforms(result, credentials);
- } catch (e) {
- debugPrint('Firebase sign-in failed with all platforms credentials: $e');
-
- // Handle specific invalid credential error by retrying once with fresh auth
- if (e is FirebaseAuthException && e.code == 'invalid-credential') {
- debugPrint('Invalid credential error detected, attempting to retry with fresh authentication...');
- return await _retryGoogleSignInWithFreshAuth();
- }
-
- Logger.error('Failed to complete Google sign-in. Please try again.');
- return null;
- }
-}
-
-/// Retry Google Sign In with completely fresh authentication
-Future _retryGoogleSignInWithFreshAuth() async {
- try {
- debugPrint('Retrying Google Sign In with fresh authentication');
-
- // Sign out from Firebase first
- await FirebaseAuth.instance.signOut();
-
- // Get a fresh GoogleSignIn instance
- final googleSignIn = _getGoogleSignInAllPlatforms();
-
- // Ensure complete sign out
- await googleSignIn.signOut();
-
- // Trigger fresh authentication flow
- final all_platforms_google_sign_in.GoogleSignInCredentials? credentials = await googleSignIn.signIn();
-
- if (credentials == null) {
- return null;
- }
-
- // Create new credential
- final credential = GoogleAuthProvider.credential(
- accessToken: credentials.accessToken,
- idToken: credentials.idToken,
- );
-
- // Attempt Firebase sign-in with fresh credential
- var result = await FirebaseAuth.instance.signInWithCredential(credential);
- return _processGoogleSignInResultAllPlatforms(result, credentials);
- } catch (e) {
- debugPrint('Retry with fresh authentication also failed: $e');
- Logger.error('Failed to complete Google sign-in after retry. Please try again later.');
- return null;
- }
-}
-
-/// Process the Google Sign In result for standard platforms and update user preferences
-Future _processGoogleSignInResult(UserCredential result) async {
- var givenName = result.additionalUserInfo?.profile?['given_name'] ?? '';
- var familyName = result.additionalUserInfo?.profile?['family_name'] ?? '';
- var email = result.additionalUserInfo?.profile?['email'] ?? '';
-
- if (email != null) SharedPreferencesUtil().email = email;
- if (givenName != null) {
- SharedPreferencesUtil().givenName = givenName;
- SharedPreferencesUtil().familyName = familyName;
- }
-
- debugPrint('signInWithGoogle Email: ${SharedPreferencesUtil().email}');
- debugPrint('signInWithGoogle Name: ${SharedPreferencesUtil().givenName}');
-
- // Bring app to front after successful authentication
- _bringAppToFront();
-
- return result;
-}
-
-/// Process the Google Sign In result for all platforms and update user preferences
-Future _processGoogleSignInResultAllPlatforms(
- UserCredential result, all_platforms_google_sign_in.GoogleSignInCredentials credentials) async {
- // For all platforms, we might need to fetch user info separately if not available in Firebase result
- var givenName = result.additionalUserInfo?.profile?['given_name'] ?? '';
- var familyName = result.additionalUserInfo?.profile?['family_name'] ?? '';
- var email = result.additionalUserInfo?.profile?['email'] ?? '';
-
- // If user info is not available, try to get it from the Firebase user
- if (email.isEmpty) {
- email = result.user?.email ?? '';
- }
- if (givenName.isEmpty) {
- var displayName = result.user?.displayName ?? '';
- var nameParts = displayName.split(' ');
- givenName = nameParts.isNotEmpty ? nameParts[0] : '';
- familyName = nameParts.length > 1 ? nameParts.sublist(1).join(' ') : '';
- }
-
- if (email.isNotEmpty) SharedPreferencesUtil().email = email;
- if (givenName.isNotEmpty) {
- SharedPreferencesUtil().givenName = givenName;
- SharedPreferencesUtil().familyName = familyName;
- }
-
- debugPrint('signInWithGoogle (All Platforms) Email: ${SharedPreferencesUtil().email}');
- debugPrint('signInWithGoogle (All Platforms) Name: ${SharedPreferencesUtil().givenName}');
-
- // Bring app to front after successful authentication
- await _bringAppToFront();
-
- return result;
-}
-
-Future getIdToken() async {
- try {
- IdTokenResult? newToken = await FirebaseAuth.instance.currentUser?.getIdTokenResult(true);
- if (newToken?.token != null) {
- var user = FirebaseAuth.instance.currentUser!;
- SharedPreferencesUtil().uid = user.uid;
- SharedPreferencesUtil().tokenExpirationTime = newToken?.expirationTime?.millisecondsSinceEpoch ?? 0;
- SharedPreferencesUtil().authToken = newToken?.token ?? '';
- if (SharedPreferencesUtil().email.isEmpty) {
- SharedPreferencesUtil().email = user.email ?? '';
- }
-
- if (SharedPreferencesUtil().givenName.isEmpty) {
- SharedPreferencesUtil().givenName = user.displayName?.split(' ')[0] ?? '';
- if ((user.displayName?.split(' ').length ?? 0) > 1) {
- SharedPreferencesUtil().familyName = user.displayName?.split(' ')[1] ?? '';
- } else {
- SharedPreferencesUtil().familyName = '';
- }
- }
- }
- return newToken?.token;
- } catch (e) {
- debugPrint(e.toString());
- return SharedPreferencesUtil().authToken;
- }
-}
-
-Future signOut() async {
- await FirebaseAuth.instance.signOut();
- try {
- // Platform-specific Google Sign Out
- if (kIsWeb || PlatformService.isDesktop) {
- // Use google_sign_in_all_platforms for Windows, macOS and Web
- final googleSignIn = _getGoogleSignInAllPlatforms();
- await googleSignIn.signOut();
- } else {
- // Use standard google_sign_in for iOS, Android
- await standard_google_sign_in.GoogleSignIn().signOut();
- }
- } catch (e) {
- debugPrint(e.toString());
- }
- // context.pushReplacementNamed('auth');
-}
-
-bool isSignedIn() => FirebaseAuth.instance.currentUser != null && !FirebaseAuth.instance.currentUser!.isAnonymous;
-
-getFirebaseUser() {
- return FirebaseAuth.instance.currentUser;
-}
-
-Future updateGivenName(String fullName) async {
- try {
- var user = FirebaseAuth.instance.currentUser;
-
- SharedPreferencesUtil().givenName = fullName.split(' ')[0];
- if (fullName.split(' ').length > 1) {
- SharedPreferencesUtil().familyName = fullName.split(' ').sublist(1).join(' ');
- }
-
- if (user == null) {
- debugPrint('Firebase user is null, skipping Firebase profile update');
- return;
- }
-
- // Try to update Firebase profile with platform-specific handling
- // Skip Firebase updateProfile on Windows due to known crashes and threading issues
- // https://github.com/firebase/flutterfire/issues/13340
- // https://github.com/firebase/flutterfire/issues/12725
- if (PlatformService.isWindows) {
- debugPrint('Skipping Firebase updateProfile on Windows due to known platform issues');
- } else {
- try {
- debugPrint('Attempting to update Firebase user profile...');
-
- // Web and other desktop platforms may still have issues, so use timeout
- if (kIsWeb || PlatformService.isDesktop) {
- debugPrint('Desktop/Web platform detected - attempting updateProfile with caution');
-
- // Try with a timeout to prevent hanging
- await user.updateProfile(displayName: fullName).timeout(
- const Duration(seconds: 5),
- onTimeout: () {
- debugPrint('updateProfile timed out on desktop platform');
- throw TimeoutException('updateProfile timed out', const Duration(seconds: 5));
- },
- );
- } else {
- await user.updateProfile(displayName: fullName);
- }
- await user.reload();
- user = FirebaseAuth.instance.currentUser;
- } catch (updateError) {
- debugPrint('Firebase updateProfile failed (this is expected on windows): $updateError');
- }
- }
- } catch (e) {
- debugPrint('Error in updateGivenName: $e');
-
- // Ensure SharedPreferences are updated even if everything else fails
- try {
- SharedPreferencesUtil().givenName = fullName.split(' ')[0];
- if (fullName.split(' ').length > 1) {
- SharedPreferencesUtil().familyName = fullName.split(' ').sublist(1).join(' ');
- }
- debugPrint('SharedPreferences updated despite error');
- } catch (prefError) {
- debugPrint('Failed to update SharedPreferences: $prefError');
- }
- }
-}
-
-Future signInAnonymously() async {
- try {
- await FirebaseAuth.instance.signInAnonymously();
- var user = FirebaseAuth.instance.currentUser!;
- SharedPreferencesUtil().uid = user.uid;
- await getIdToken();
- } catch (e) {
- Logger.handle(e, null, message: 'An error occurred while signing in. Please try again later.');
- }
-}
-
-/// Platform-specific Google account linking with current Firebase user
-Future linkWithGoogle() async {
- try {
- debugPrint('Linking Google account with current Firebase user');
-
- // Platform-specific Google Sign In implementation for linking
- if (kIsWeb || PlatformService.isDesktop) {
- // Use google_sign_in_all_platforms for Windows, macOS and Web
- return await _linkWithGoogleAllPlatforms();
- } else {
- // Use standard google_sign_in for iOS, Android
- return await _linkWithGoogleStandard();
- }
- } catch (e) {
- debugPrint('Failed to link with Google: $e');
- Logger.handle(e, null, message: 'Failed to link with Google, please try again.');
- rethrow;
- }
-}
-
-/// Link Google account using the standard google_sign_in package (iOS, Android)
-Future _linkWithGoogleStandard() async {
- debugPrint('Using standard Google Sign In for linking');
-
- final standard_google_sign_in.GoogleSignInAccount? googleUser = await standard_google_sign_in.GoogleSignIn().signIn();
- if (googleUser == null) {
- return null;
- }
-
- final standard_google_sign_in.GoogleSignInAuthentication googleAuth = await googleUser.authentication;
- final credential = GoogleAuthProvider.credential(
- accessToken: googleAuth.accessToken,
- idToken: googleAuth.idToken,
- );
-
- try {
- return await FirebaseAuth.instance.currentUser?.linkWithCredential(credential);
- } catch (e) {
- if (e is FirebaseAuthException && e.code == 'credential-already-in-use') {
- // Handle existing credential case
- return await _handleExistingCredential(e);
- }
- rethrow;
- }
-}
-
-/// Link Google account using google_sign_in_all_platforms (Windows, macOS, Web)
-Future _linkWithGoogleAllPlatforms() async {
- debugPrint('Using Google Sign In All Platforms for linking');
-
- if (_googleClientId.isEmpty) {
- Logger.error('Google Client ID not configured. Please configure _googleClientId and _googleClientSecret');
- return null;
- }
-
- final googleSignIn = _getGoogleSignInAllPlatforms();
-
- final all_platforms_google_sign_in.GoogleSignInCredentials? credentials = await googleSignIn.signIn();
- if (credentials == null) {
- return null;
- }
-
- final credential = GoogleAuthProvider.credential(
- accessToken: credentials.accessToken,
- idToken: credentials.idToken,
- );
-
- try {
- return await FirebaseAuth.instance.currentUser?.linkWithCredential(credential);
- } catch (e) {
- if (e is FirebaseAuthException && e.code == 'credential-already-in-use') {
- // Handle existing credential case
- return await _handleExistingCredential(e);
- }
- rethrow;
- }
-}
-
-/// Handle the case when credential is already in use
-Future _handleExistingCredential(FirebaseAuthException e) async {
- // Get existing user credentials
- final existingCred = e.credential;
- final oldUserId = FirebaseAuth.instance.currentUser?.uid;
-
- // Sign out current anonymous user
- await FirebaseAuth.instance.signOut();
-
- // Sign in with existing account
- final result = await FirebaseAuth.instance.signInWithCredential(existingCred!);
- final newUserId = FirebaseAuth.instance.currentUser?.uid;
- await getIdToken();
-
- SharedPreferencesUtil().onboardingCompleted = false;
- SharedPreferencesUtil().uid = newUserId ?? '';
- SharedPreferencesUtil().email = FirebaseAuth.instance.currentUser?.email ?? '';
- SharedPreferencesUtil().givenName = FirebaseAuth.instance.currentUser?.displayName?.split(' ')[0] ?? '';
-
- return result;
-}
diff --git a/app/lib/backend/http/api/action_items.dart b/app/lib/backend/http/api/action_items.dart
index 723a891edc..0d50e8f2fb 100644
--- a/app/lib/backend/http/api/action_items.dart
+++ b/app/lib/backend/http/api/action_items.dart
@@ -14,7 +14,7 @@ Future getActionItems({
DateTime? endDate,
}) async {
String url = '${Env.apiBaseUrl}v1/action-items?limit=$limit&offset=$offset';
-
+
if (completed != null) {
url += '&completed=$completed';
}
@@ -27,16 +27,16 @@ Future getActionItems({
if (endDate != null) {
url += '&end_date=${endDate.toIso8601String()}';
}
-
+
var response = await makeApiCall(
url: url,
headers: {},
method: 'GET',
body: '',
);
-
+
if (response == null) return ActionItemsResponse(actionItems: [], hasMore: false);
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
return ActionItemsResponse.fromJson(jsonDecode(body));
@@ -53,9 +53,9 @@ Future getActionItem(String actionItemId) async {
method: 'GET',
body: '',
);
-
+
if (response == null) return null;
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
return ActionItemWithMetadata.fromJson(jsonDecode(body));
@@ -75,23 +75,23 @@ Future createActionItem({
'description': description,
'completed': completed,
};
-
+
if (dueAt != null) {
requestBody['due_at'] = dueAt.toIso8601String();
}
if (conversationId != null) {
requestBody['conversation_id'] = conversationId;
}
-
+
var response = await makeApiCall(
url: '${Env.apiBaseUrl}v1/action-items',
headers: {},
method: 'POST',
body: jsonEncode(requestBody),
);
-
+
if (response == null) return null;
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
return ActionItemWithMetadata.fromJson(jsonDecode(body));
@@ -108,7 +108,7 @@ Future updateActionItem(
DateTime? dueAt,
}) async {
var requestBody = {};
-
+
if (description != null) {
requestBody['description'] = description;
}
@@ -118,16 +118,16 @@ Future updateActionItem(
if (dueAt != null) {
requestBody['due_at'] = dueAt.toIso8601String();
}
-
+
var response = await makeApiCall(
url: '${Env.apiBaseUrl}v1/action-items/$actionItemId',
headers: {},
method: 'PATCH',
body: jsonEncode(requestBody),
);
-
+
if (response == null) return null;
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
return ActionItemWithMetadata.fromJson(jsonDecode(body));
@@ -147,9 +147,9 @@ Future toggleActionItemCompletion(
method: 'PATCH',
body: '',
);
-
+
if (response == null) return null;
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
return ActionItemWithMetadata.fromJson(jsonDecode(body));
@@ -166,9 +166,9 @@ Future deleteActionItem(String actionItemId) async {
method: 'DELETE',
body: '',
);
-
+
if (response == null) return false;
-
+
return response.statusCode == 204;
}
@@ -180,16 +180,15 @@ Future getConversationActionItems(String conversationId) as
method: 'GET',
body: '',
);
-
+
if (response == null) return ActionItemsResponse(actionItems: [], hasMore: false);
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
var data = jsonDecode(body);
return ActionItemsResponse(
- actionItems: (data['action_items'] as List)
- .map((item) => ActionItemWithMetadata.fromJson(item))
- .toList(),
+ actionItems:
+ (data['action_items'] as List).map((item) => ActionItemWithMetadata.fromJson(item)).toList(),
hasMore: false, // Conversation-specific calls don't have pagination
);
} else {
@@ -205,9 +204,9 @@ Future deleteConversationActionItems(String conversationId) async {
method: 'DELETE',
body: '',
);
-
+
if (response == null) return false;
-
+
return response.statusCode == 204;
}
@@ -221,15 +220,13 @@ Future> createActionItemsBatch(
method: 'POST',
body: jsonEncode(actionItems),
);
-
+
if (response == null) return [];
-
+
if (response.statusCode == 200) {
var body = utf8.decode(response.bodyBytes);
var data = jsonDecode(body);
- return (data['action_items'] as List)
- .map((item) => ActionItemWithMetadata.fromJson(item))
- .toList();
+ return (data['action_items'] as List).map((item) => ActionItemWithMetadata.fromJson(item)).toList();
} else {
debugPrint('createActionItemsBatch error ${response.statusCode}');
return [];
diff --git a/app/lib/backend/http/api/apps.dart b/app/lib/backend/http/api/apps.dart
index 9088423702..bbc6a38034 100644
--- a/app/lib/backend/http/api/apps.dart
+++ b/app/lib/backend/http/api/apps.dart
@@ -7,10 +7,9 @@ import 'package:omi/backend/http/shared.dart';
import 'package:omi/backend/preferences.dart';
import 'package:omi/backend/schema/app.dart';
import 'package:omi/env/env.dart';
-
-import 'package:http/http.dart' as http;
import 'package:omi/utils/logger.dart';
import 'package:omi/utils/platform/platform_manager.dart';
+import 'package:http/http.dart' as http;
import 'package:path/path.dart';
Future> retrieveApps() async {
@@ -29,7 +28,7 @@ Future> retrieveApps() async {
return apps;
} catch (e, stackTrace) {
debugPrint(e.toString());
- PlatformManager.instance.instabug.reportCrash(e, stackTrace);
+ PlatformManager.instance.crashReporter.reportCrash(e, stackTrace);
return SharedPreferencesUtil().appsList;
}
}
@@ -52,7 +51,7 @@ Future> retrievePopularApps() async {
return apps;
} catch (e, stackTrace) {
debugPrint(e.toString());
- PlatformManager.instance.instabug.reportCrash(e, stackTrace);
+ PlatformManager.instance.crashReporter.reportCrash(e, stackTrace);
return SharedPreferencesUtil().appsList;
}
}
@@ -100,16 +99,12 @@ Future reviewApp(String appId, AppReview review) async {
}
Future