Repository: PapillonApp/Papillon
Branch: dev
Commit: 638fc1659495
Files: 517
Total size: 3.7 MB
Directory structure:
gitextract_hxvgag7x/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── config.yml
│ │ └── feature.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── bot/
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── issue/
│ │ │ ├── index.ts
│ │ │ ├── labeler.ts
│ │ │ └── message.ts
│ │ └── tsconfig.json
│ └── workflows/
│ ├── build-android.yml
│ ├── merge.yml
│ └── release.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── CODEOWNERS
├── LICENSE
├── README.md
├── app/
│ ├── (features)/
│ │ ├── (cards)/
│ │ │ ├── cards.tsx
│ │ │ ├── qrcode.tsx
│ │ │ └── specific.tsx
│ │ ├── (news)/
│ │ │ └── specific.tsx
│ │ ├── attendance.tsx
│ │ └── soon.tsx
│ ├── (modals)/
│ │ ├── address.tsx
│ │ ├── course.tsx
│ │ ├── grade.tsx
│ │ ├── news.tsx
│ │ ├── notifications.tsx
│ │ ├── profile.tsx
│ │ ├── task.tsx
│ │ ├── wallpaper.tsx
│ │ └── wrapped/
│ │ ├── _layout.tsx
│ │ ├── index.tsx
│ │ └── stories/
│ │ ├── consent.tsx
│ │ └── welcome.tsx
│ ├── (new)/
│ │ ├── _layout.tsx
│ │ └── event.tsx
│ ├── (onboarding)/
│ │ ├── _layout.tsx
│ │ ├── ageSelection.tsx
│ │ ├── components/
│ │ │ ├── LoginView.tsx
│ │ │ ├── OnboardingSelector.tsx
│ │ │ ├── OnboardingWebView.tsx
│ │ │ └── ageSelection/
│ │ │ └── illustrations/
│ │ │ ├── highSchool.tsx
│ │ │ ├── middleSchool.tsx
│ │ │ ├── parents.tsx
│ │ │ ├── supSchool.tsx
│ │ │ └── teacher.tsx
│ │ ├── restaurants/
│ │ │ ├── _layout.tsx
│ │ │ ├── alise.tsx
│ │ │ ├── ard.tsx
│ │ │ ├── izly.tsx
│ │ │ ├── method.tsx
│ │ │ ├── turboself.tsx
│ │ │ └── turboselfHost.tsx
│ │ ├── serviceSelection.tsx
│ │ ├── services/
│ │ │ ├── appscho/
│ │ │ │ ├── _layout.tsx
│ │ │ │ ├── credentials.tsx
│ │ │ │ ├── list.tsx
│ │ │ │ └── webview.tsx
│ │ │ ├── ed/
│ │ │ │ ├── _layout.tsx
│ │ │ │ └── credentials.tsx
│ │ │ ├── lannion/
│ │ │ │ ├── _layout.tsx
│ │ │ │ └── credentials.tsx
│ │ │ ├── multi/
│ │ │ │ ├── _layout.tsx
│ │ │ │ └── credentials.tsx
│ │ │ ├── pronote/
│ │ │ │ ├── 2fa.tsx
│ │ │ │ ├── _layout.tsx
│ │ │ │ ├── browser.tsx
│ │ │ │ ├── locate.tsx
│ │ │ │ ├── qrcode.tsx
│ │ │ │ ├── select.tsx
│ │ │ │ └── url.tsx
│ │ │ └── skolengo/
│ │ │ ├── _layout.tsx
│ │ │ ├── locate.tsx
│ │ │ └── webview.tsx
│ │ ├── utils/
│ │ │ ├── constants.tsx
│ │ │ └── fetchSchools.ts
│ │ └── welcome.tsx
│ ├── (settings)/
│ │ ├── _layout.tsx
│ │ ├── about.tsx
│ │ ├── accounts.tsx
│ │ ├── cards.tsx
│ │ ├── contributors.tsx
│ │ ├── edit_subject.tsx
│ │ ├── language.tsx
│ │ ├── magic.tsx
│ │ ├── personalization.tsx
│ │ ├── services.tsx
│ │ ├── settings.tsx
│ │ ├── subject_personalization.tsx
│ │ ├── tabs.tsx
│ │ └── transport.tsx
│ ├── (tabs)/
│ │ ├── _layout.tsx
│ │ ├── calendar/
│ │ │ ├── _layout.tsx
│ │ │ ├── components/
│ │ │ │ ├── CalendarDay.tsx
│ │ │ │ ├── CalendarHeader.tsx
│ │ │ │ └── EmptyCalendar.tsx
│ │ │ ├── event/
│ │ │ │ └── [id].tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useCalendarState.ts
│ │ │ │ └── useTimetableData.ts
│ │ │ ├── icals.tsx
│ │ │ └── index.tsx
│ │ ├── grades/
│ │ │ ├── _layout.tsx
│ │ │ ├── atoms/
│ │ │ │ ├── Averages.tsx
│ │ │ │ ├── FeaturesMap.tsx
│ │ │ │ └── Subject.tsx
│ │ │ ├── features/
│ │ │ │ └── ScodocUES.tsx
│ │ │ ├── hooks/
│ │ │ │ └── useGradeInfluence.ts
│ │ │ ├── index.tsx
│ │ │ ├── modals/
│ │ │ │ ├── AboutAverages.tsx
│ │ │ │ └── SubjectInfo.tsx
│ │ │ └── utils/
│ │ │ └── graph.ts
│ │ ├── index/
│ │ │ ├── _layout.tsx
│ │ │ ├── atoms/
│ │ │ │ ├── HomeHeader.tsx
│ │ │ │ ├── HomeTopBar.tsx
│ │ │ │ ├── UserProfile.tsx
│ │ │ │ ├── Wallpaper.tsx
│ │ │ │ └── WrappedBanner.tsx
│ │ │ ├── components/
│ │ │ │ ├── HomeHeaderButton.ios.tsx
│ │ │ │ ├── HomeHeaderButton.tsx
│ │ │ │ ├── HomeTopBarButton.ios.tsx
│ │ │ │ ├── HomeTopBarButton.tsx
│ │ │ │ └── HomeWidget.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useHomeData.ts
│ │ │ │ ├── useHomeHeaderData.ts
│ │ │ │ ├── useTimetableWidgetData.ts
│ │ │ │ └── useUserProfileData.ts
│ │ │ ├── index.old.tsx
│ │ │ ├── index.tsx
│ │ │ └── widgets/
│ │ │ ├── Grades.tsx
│ │ │ └── timetable.tsx
│ │ ├── news/
│ │ │ ├── _layout.tsx
│ │ │ └── index.tsx
│ │ └── tasks/
│ │ ├── _layout.tsx
│ │ ├── atoms/
│ │ │ ├── DateHeader.tsx
│ │ │ ├── EmptyState.tsx
│ │ │ └── TasksSummary.tsx
│ │ ├── components/
│ │ │ ├── TaskItem.tsx
│ │ │ ├── TasksHeader.tsx
│ │ │ ├── TasksList.tsx
│ │ │ └── WeekPicker.tsx
│ │ ├── hooks/
│ │ │ ├── useHomeworkData.ts
│ │ │ ├── useMagicPrediction.ts
│ │ │ ├── useTaskFilters.ts
│ │ │ └── useWeekSelection.ts
│ │ └── index.tsx
│ ├── _layout.tsx
│ ├── alert.tsx
│ ├── changelog.tsx
│ ├── consent.tsx
│ ├── demo.tsx
│ └── devmode.tsx
├── app.config.ts
├── assets/
│ ├── app.icon/
│ │ └── icon.json
│ └── lotties/
│ ├── alise.json
│ ├── ard.json
│ ├── connexion.json
│ ├── izly.json
│ ├── link.json
│ ├── location.json
│ ├── onboarding.json
│ ├── qr-code.json
│ ├── school-services.json
│ ├── search.json
│ ├── self.json
│ ├── turboself.json
│ └── uni-services.json
├── babel.config.js
├── components/
│ ├── ActivityIndicator.tsx
│ ├── AndroidHeaderBackground.tsx
│ ├── AppColorsSelector.tsx
│ ├── AppProviders.tsx
│ ├── DevModeNotice.tsx
│ ├── FakeSplash.tsx
│ ├── Log/
│ │ └── LogIcon.tsx
│ ├── ModalOverhead.tsx
│ ├── RootNavigator.tsx
│ ├── SettingsHeader.tsx
│ ├── Transit.tsx
│ ├── UnderConstructionNotice.tsx
│ ├── onboarding/
│ │ ├── OnboardingBackButton.tsx
│ │ ├── OnboardingInput.tsx
│ │ ├── OnboardingScrollingFlatList.tsx
│ │ └── OnboardingWebview.tsx
│ └── router/
│ └── BottomTabs.tsx
├── constants/
│ ├── AvailableTransportServices.ts
│ ├── LayoutScreenOptions.ts
│ └── UnicodeEmojis.ts
├── crowdin.yml
├── database/
│ ├── DatabaseProvider.tsx
│ ├── index.ts
│ ├── mappers/
│ │ ├── attendance.ts
│ │ ├── balances.ts
│ │ ├── canteen.ts
│ │ ├── chats.ts
│ │ ├── course.ts
│ │ ├── grade.ts
│ │ ├── kids.ts
│ │ └── subject.ts
│ ├── models/
│ │ ├── Attendance.ts
│ │ ├── Balance.ts
│ │ ├── CanteenHistory.ts
│ │ ├── CanteenMenu.ts
│ │ ├── Chat.ts
│ │ ├── Event.ts
│ │ ├── Grades.ts
│ │ ├── Homework.ts
│ │ ├── Ical.ts
│ │ ├── Kid.ts
│ │ ├── News.ts
│ │ ├── Subject.ts
│ │ └── Timetable.ts
│ ├── schema.ts
│ ├── useAttendance.ts
│ ├── useBalance.ts
│ ├── useCanteen.ts
│ ├── useChat.ts
│ ├── useEvents.ts
│ ├── useEventsById.ts
│ ├── useGrades.ts
│ ├── useHomework.ts
│ ├── useIcals.ts
│ ├── useKids.ts
│ ├── useNews.ts
│ ├── usePeriodsCache.tsx
│ ├── useSubject.ts
│ ├── useTimetable.ts
│ └── utils/
│ ├── initialization.ts
│ └── safeTransaction.ts
├── eslint.config.mjs
├── hooks/
│ └── useAppInitialization.ts
├── ios/
│ └── Papillon/
│ ├── AppDelegate.swift
│ ├── Images.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── SplashScreenBackground.colorset/
│ │ │ └── Contents.json
│ │ └── SplashScreenLegacy.imageset/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── Papillon-Bridging-Header.h
│ ├── Papillon.entitlements
│ ├── PrivacyInfo.xcprivacy
│ ├── SplashScreen.storyboard
│ └── Supporting/
│ └── Expo.plist
├── locales/
│ ├── af.json
│ ├── ar.json
│ ├── bg.json
│ ├── bn.json
│ ├── br.json
│ ├── cs.json
│ ├── da.json
│ ├── de.json
│ ├── el.json
│ ├── en.json
│ ├── es.json
│ ├── et.json
│ ├── fa.json
│ ├── fi.json
│ ├── fr.json
│ ├── he.json
│ ├── hi.json
│ ├── hr.json
│ ├── hu.json
│ ├── id.json
│ ├── it.json
│ ├── ja.json
│ ├── ko.json
│ ├── ms.json
│ ├── nl.json
│ ├── no.json
│ ├── pl.json
│ ├── pt.json
│ ├── ro.json
│ ├── ru.json
│ ├── sk.json
│ ├── sq.json
│ ├── sv.json
│ ├── sw.json
│ ├── th.json
│ ├── tr.json
│ ├── uk.json
│ ├── ur.json
│ └── vi.json
├── metro.config.js
├── package.json
├── patches/
│ ├── countly-sdk-react-native-bridge+25.4.0.patch
│ └── react-native-fast-tflite+1.6.1.patch
├── scripts/
│ └── generateEmojiList.sh
├── services/
│ ├── alise/
│ │ ├── balance.ts
│ │ ├── history.ts
│ │ ├── index.ts
│ │ └── refresh.ts
│ ├── appscho/
│ │ ├── index.ts
│ │ ├── news.ts
│ │ ├── refresh.ts
│ │ └── timetable.ts
│ ├── ard/
│ │ ├── balance.ts
│ │ ├── history.ts
│ │ ├── index.ts
│ │ └── refresh.ts
│ ├── ecoledirecte/
│ │ ├── attendance.ts
│ │ ├── balance.ts
│ │ ├── chat.ts
│ │ ├── grades.ts
│ │ ├── homework.ts
│ │ ├── index.ts
│ │ ├── news.ts
│ │ ├── qrcode.ts
│ │ ├── refresh.ts
│ │ └── timetable.ts
│ ├── errors/
│ │ └── AuthenticationError.ts
│ ├── izly/
│ │ ├── balances.ts
│ │ ├── history.ts
│ │ ├── index.ts
│ │ ├── qrcode.ts
│ │ └── refresh.ts
│ ├── lannion/
│ │ ├── attendance.ts
│ │ ├── grades.ts
│ │ ├── index.ts
│ │ └── module/
│ │ ├── api.ts
│ │ ├── client.ts
│ │ ├── index.ts
│ │ └── types.ts
│ ├── local/
│ │ ├── .ical.ts.swp
│ │ ├── event-converter.ts
│ │ ├── event-filter.ts
│ │ ├── ical-database.ts
│ │ ├── ical-utils.ts
│ │ ├── ical.ts
│ │ └── parsers/
│ │ ├── ade-parser.ts
│ │ ├── hyperplanning-parser.ts
│ │ ├── ical-event-parser.ts
│ │ └── schools/
│ │ └── univrennes1_parser.ts
│ ├── multi/
│ │ ├── index.ts
│ │ ├── news.ts
│ │ ├── refresh.ts
│ │ └── timetable.ts
│ ├── pronote/
│ │ ├── attendance.ts
│ │ ├── canteen.ts
│ │ ├── chat.ts
│ │ ├── grades.ts
│ │ ├── homework.ts
│ │ ├── index.ts
│ │ ├── news.ts
│ │ ├── refresh.ts
│ │ └── timetable.ts
│ ├── shared/
│ │ ├── attachment.ts
│ │ ├── attendance.ts
│ │ ├── balance.ts
│ │ ├── canteen.ts
│ │ ├── chat.ts
│ │ ├── grade.ts
│ │ ├── homework.ts
│ │ ├── index.ts
│ │ ├── kid.ts
│ │ ├── news.ts
│ │ ├── timetable.ts
│ │ └── types.ts
│ ├── skolengo/
│ │ ├── attendance.ts
│ │ ├── chat.ts
│ │ ├── grades.ts
│ │ ├── homework.ts
│ │ ├── index.ts
│ │ ├── kid.ts
│ │ ├── news.ts
│ │ ├── refresh.ts
│ │ └── timetable.ts
│ ├── transit/
│ │ ├── fetcher/
│ │ │ ├── Fetcher.ts
│ │ │ └── endpoints.ts
│ │ ├── index.ts
│ │ └── models/
│ │ ├── Alerts.ts
│ │ ├── ArrivalSchedule.ts
│ │ ├── DepartureLegs.ts
│ │ ├── Itineraries.ts
│ │ ├── ItinerariesPlanDetails.ts
│ │ ├── Location.ts
│ │ ├── MatchedSubstring.ts
│ │ ├── Period.ts
│ │ ├── Place.ts
│ │ ├── PlaceDetails.ts
│ │ ├── PlaceSuggestion.ts
│ │ ├── PlanDetails.ts
│ │ ├── PlanResult.ts
│ │ ├── Route.ts
│ │ ├── RouteLegs.ts
│ │ ├── Station.ts
│ │ ├── Stop.ts
│ │ ├── StopSchedule.ts
│ │ ├── Suggestions.ts
│ │ ├── TransitDepartures.ts
│ │ └── Vehicle.ts
│ └── turboself/
│ ├── balance.ts
│ ├── booking.ts
│ ├── history.ts
│ ├── index.ts
│ ├── qrcode.ts
│ └── refresh.ts
├── stores/
│ ├── account/
│ │ ├── index.ts
│ │ └── types.ts
│ ├── flags/
│ │ └── index.ts
│ ├── global/
│ │ ├── index.ts
│ │ └── serializer.ts
│ ├── logs/
│ │ ├── index.ts
│ │ └── types.ts
│ ├── magic/
│ │ ├── index.ts
│ │ └── types.ts
│ └── settings/
│ ├── index.ts
│ └── types.ts
├── stubs/
│ └── appscho/
│ ├── index.d.ts
│ ├── index.js
│ └── package.json
├── tsconfig.json
├── ui/
│ ├── components/
│ │ ├── ActionMenu.tsx
│ │ ├── ActivityIndicator.tsx
│ │ ├── AlertProvider.tsx
│ │ ├── AnimatedNumber.tsx
│ │ ├── AnimatedPressable.tsx
│ │ ├── Avatar.tsx
│ │ ├── Button.tsx
│ │ ├── Calendar.tsx
│ │ ├── ChipButton.tsx
│ │ ├── CircularProgress.tsx
│ │ ├── CompactGrade.tsx
│ │ ├── CompactTask.tsx
│ │ ├── ContainedNumber.tsx
│ │ ├── Course.tsx
│ │ ├── Dynamic.tsx
│ │ ├── EmptyItem.tsx
│ │ ├── ErrorBoundary.tsx
│ │ ├── Grade.tsx
│ │ ├── Icon.tsx
│ │ ├── Item.tsx
│ │ ├── List.tsx
│ │ ├── NativeHeader.tsx
│ │ ├── Pattern/
│ │ │ ├── CrossPattern.tsx
│ │ │ └── Pattern.tsx
│ │ ├── Search.tsx
│ │ ├── SectionHeader.tsx
│ │ ├── SkeletonView.tsx
│ │ ├── Stack.tsx
│ │ ├── Subject.tsx
│ │ ├── TabFlatList.tsx
│ │ ├── TabHeader.tsx
│ │ ├── TabHeaderTitle.tsx
│ │ ├── TableFlatList.tsx
│ │ ├── Task.tsx
│ │ ├── Typography.tsx
│ │ └── ViewContainer.tsx
│ ├── hooks/
│ │ └── useKeyboardHeight.ts
│ ├── native/
│ │ └── NativeSwitch.tsx
│ ├── new/
│ │ ├── Button.tsx
│ │ ├── Divider.tsx
│ │ ├── List.tsx
│ │ ├── ListTouchableContext.ts
│ │ ├── RippleEffect.tsx
│ │ ├── TextInput.tsx
│ │ ├── Typography.tsx
│ │ └── symbols/
│ │ └── PapillonLogo.tsx
│ ├── package.json
│ └── utils/
│ ├── Animation.ts
│ ├── Corners.ts
│ ├── Duration.ts
│ ├── IsLiquidGlass.ts
│ └── Transition.ts
└── utils/
├── adjustColor.ts
├── attachments/
│ └── helper.ts
├── chats/
│ ├── colors.ts
│ └── initials.ts
├── colorCheck.ts
├── colors.ts
├── endpoints.ts
├── format/
│ ├── formatSchoolName.ts
│ └── html.ts
├── generateId.ts
├── github/
│ └── contributors.ts
├── grades/
│ ├── algorithms/
│ │ ├── helpers.ts
│ │ ├── median.ts
│ │ ├── subject.ts
│ │ ├── time.ts
│ │ └── weighted.ts
│ └── helper/
│ └── period.ts
├── i18n.ts
├── logger/
│ ├── consent.ts
│ └── logger.ts
├── magic/
│ ├── ModelManager.ts
│ ├── prediction.ts
│ ├── regex/
│ │ └── homeworks.json
│ └── updater/
│ ├── extract.ts
│ ├── fileUtils.ts
│ ├── index.ts
│ ├── integrity.ts
│ ├── manifest.ts
│ ├── network.ts
│ ├── semver.ts
│ └── types.ts
├── native/
│ ├── AnimatedNavigator.ts
│ ├── georeverse.ts
│ └── position.ts
├── news/
│ ├── cleanUpHTMLNews.ts
│ └── getAttachmentIcon.ts
├── notification/
│ └── reminder/
│ └── helper.ts
├── pronote/
│ ├── fetcher.ts
│ └── name.ts
├── restaurant/
│ └── detect-price.ts
├── services/
│ ├── helper.ts
│ └── periods.ts
├── subjects/
│ ├── colors.ts
│ ├── emoji.ts
│ ├── lesson_formats.json
│ ├── name.ts
│ └── utils.ts
├── theme/
│ ├── AndroidBackButton.tsx
│ ├── ScreenOptions.tsx
│ └── Theme.ts
├── transport.ts
└── uuid/
└── uuid.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Règles de contribution
## 🔐 Signaler une vulnérabilité
Nous prenons la sécurité **très au sérieux**. Si tu découvres une **vulnérabilité** dans **Papillon**, merci de suivre notre [**politique de sécurité**](https://github.com/PapillonApp/Papillon/.github/blob/main/SECURITY.md) : **n’ouvre pas d’issue publique** et signale-la directement à l’adresse suivante : **support@papillon.bzh** .
## 📤 Soumettre une Pull Request
Nous serions ravis d’intégrer tes modifications à Papillon. Cependant, avant de fusionner avec la branche principale, merci de respecter les règles ci-dessous. En cas de non-respect, ta Pull Request sera considérée comme **invalide** et ne sera pas traitée tant que les corrections nécessaires n’auront pas été apportées.
* [x] Tu ne dois pas soumettre plusieurs fonctionnalités ou corrections de bugs dans une même Pull Request. Chaque modification doit rester isolée afin de faciliter son traitement et, si nécessaire, son éventuel retour.
* [x] Si ta Pull Request concerne des changements majeurs, merci d'ouvrir une Issue pour discuter avec les mainteneurs de la stratégie à adopter pour ne pas faire de gros travaux pour rien.
* [x] Ta Pull Request doit respecter les conventions [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) et [Conventional Branch](https://conventional-branch.github.io/), ainsi que le style de code de l’application.
* [x] Si ta Pull Request modifie une partie documentée, comme la structure, l’architecture ou autre, assure-toi d’avoir mis à jour la documentation en conséquence.
* [x] J'ai testé mes changements sur iOS et Android et l'application compile correctement.
* [x] J'utilise un langage informel (tutoiement).
#### ❓ Comment vérifier le Lint ?
Par défaut, en effectuant la commande ci-dessous, ESLint essayera de résoudre automatiquement les problèmes, s'il n'y arrive pas, tu dois les corriger manuellement.
```bash
$ npm run lint
```
## 📥 Ouvrir une issue
Avant d’ouvrir une issue, assure-toi d’utiliser la **dernière version** de **Papillon**, teste si le problème persiste après mise à jour, et vérifie qu’une issue similaire n’a pas **déjà** été ouverte. Une issue bien écrite facilite son traitement et est toujours plus agréable pour nous à lire, afin que le traitement se passe au mieux, voici quelques conseils :
1. **Elle porte un nom explicite**, qui permet d’identifier **immédiatement** son **sujet principal**.
2. **Aucune issue semblable n’existe déjà** : il est inutile d’en créer plusieurs pour le même problème, **cela ne fait que ralentir son traitement**. Si tu es concerné par une issue existante, **réagis** simplement avec un👍
3. **Elle contient une description détaillée**, si c’est une fonctionnalité, elle est **clairement expliquée**, idéalement accompagnée d’une **capture d’écran** ou d’un **design Figma,** s’il s’agit d’un bug, la description précise **le comportement actuel**, **le comportement attendu**, ainsi que **les étapes pour le reproduire**.
4. Si tu rencontres **le même problème** ou souhaite **la même fonctionnalité**, privilégie les **réactions** aux commentaires.
5. **Compléte le modèle fourni lors de la création de ton issue**, il a été rédigé pour t'aider à **structurer ta demande, ne rien oublier d’important et gagner du temps**.
================================================
FILE: .github/FUNDING.yml
================================================
ko_fi: thepapillonapp
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: 🐛 Signaler un bug
description: Signaler des bugs nous permet d'améliorer Papillon !
title: "[Bug]: "
body:
- type: textarea
attributes:
label: Description du bug
description: Plus il y a de détails, plus vite nous pourrons trouver le bug !
placeholder: La connexion à mon établissement ne fonctionne pas, j'ai un chargement infini lors de la connexion
validations:
required: true
- type: textarea
attributes:
label: Étapes à reproduire
description: Comment pouvons-nous reproduire le bug ?
placeholder: |
1. Ouvrir l'application
2. Se connecter à l'établissement
3. Observer le comportement
validations:
required: true
- type: textarea
attributes:
label: Comportement attendu
description: Ce que Papillon devrait faire
placeholder: Que la connexion à mon établissement fonctionne et qu'il n'y ait pas de chargement infini
validations:
required: true
- type: input
attributes:
label: Appareil
description: Sur quel appareil tu as rencontré ce bug ?
placeholder: iPhone 13, Samsung Galaxy S23...
validations:
required: true
- type: input
attributes:
label: Version du système d'exploitation
description: Paramètres (du Téléphone) -> À propos (Android)/Général (Apple)
placeholder: iOS 18, Android 15...
validations:
required: true
- type: dropdown
attributes:
label: Papillon testé depuis
description: Tu as testé/installé Papillon depuis...
options:
- Play/App Store (version stable)
- Play Store/TestFlight (version bêta)
validations:
required: true
- type: input
attributes:
label: Version utilisée
description: Paramètres (de Papillon) -> Version affichée en bas de la page
placeholder: "8.0.0"
validations:
required: true
- type: dropdown
attributes:
label: Service scolaire/cantine
description: 🎒 = Service scolaire et 🍽️ = Service de cantine
options:
- 🎒🦋 Pronote
- 🎒🟦 ÉcoleDirecte
- 🎒🟡 Skolengo
- 🎒🏫 Universités et autres (à préciser dans la description du bug)
- 🍽️🟢 Alise
- 🍽️🔴 Turboself
- 🍽️🟣 ARD
- 🍽️🔵 Izly
validations:
required: true
- type: textarea
attributes:
label: "Capture(s) d'écran / vidéo"
description: Cela permettra une résolution encore plus rapide du bug
placeholder: Il faut cliquer sur l'icône 📎 pour pouvoir importer une/des photo(s)/vidéo(s)
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Une faille de sécurité ?
url: https://github.com/PapillonApp/Papillon/security/advisories/new
about: Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabilité, veuillez remplir ce formulaire.
- name: Une question ? Un problème ?
url: https://discord.gg/xn3NstgjuT
about: Rejoignez nous sur Discord et obtenez de l’aide rapidement !
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: ✨ Amélioration/Fonctionnalité
description: Comment pouvons-nous améliorer Papillon ?
title: "[Feature]: "
body:
- type: textarea
attributes:
label: Description de la fonctionnalité
description: Fais place à ta créativité en détaillant ce que tu veux
placeholder: Ça serait cool une intégration d'un simulateur permettant de savoir si on aura le bac/brevet
validations:
required: true
- type: textarea
attributes:
label: Davantage de détails ?
description: Une image pour montrer à quoi ça ressemblerait ? Ce n'est pas obligatoire
placeholder: Ah, même si j'ai des idées, je ne suis pas designer 😂
validations:
required: false
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================

# Règles de contribution
> [!CAUTION]
> Afin de garantir une application stable et pérenne dans le temps, nous t'invitons à vérifier que tu as bien respecté les règles de contribution. Sans cela, ta Pull Request ne pourra pas être examinée.
- [ ] Cette Pull Request porte sur une seule fonctionnalité ou un seul correctif.
- [ ] Cette Pull Request n'est pas faite essentiellement avec de l'IA.
- [ ] Pour tout changement majeur, j’ai créé une issue afin d’échanger avec les mainteneurs de Papillon sur la meilleure façon de l’intégrer.
- [ ] Ma Pull Request respecte les conventions Conventional Commits et Conventional Branch ainsi que les conventions de codage de l'application.
- [ ] J’ai testé mes modifications sur iOS et Android, et l’application fonctionne correctement.
- [ ] J’emploie un langage informel, clair et concis dans mes messages.
- [ ] J’ai documenté mes changements de manière appropriée, soit dans la description de la Pull Request, soit dans le GitBook.
- [ ] J’ai ajouté les traductions nécessaires dans au moins un fichier de langue.
# Résumé des changements
> [!NOTE]
> Une description détaillée des changements apportés dans cette Pull Request permet un traitement plus efficace et rapide.
# Capture(s) d'écran
> [!NOTE]
> Si tes changements concernent l'interface utilisateur, inclue des captures d'écran pour illustrer tes modifications.
# Informations supplémentaires
> [!NOTE]
> Numéro des issues concernées par cette Pull Request, détail sur le fonctionnement ou les choix techniques effectués, ainsi que toute autre information pertinente.
================================================
FILE: .github/bot/package.json
================================================
{
"name": "bot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "tsc"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"devDependencies": {
"@actions/core": "^2.0.1",
"@actions/github": "^6.0.1",
"@octokit/rest": "^22.0.1",
"@types/node": "^25.0.0",
"typescript": "^5.9.3"
}
}
================================================
FILE: .github/bot/src/issue/index.ts
================================================
import * as github from '@actions/github';
import * as core from '@actions/core';
import { getLabelsFromTitle } from './labeler';
import { postWelcomeMessage } from './message';
async function run() {
try {
const context = github.context;
const token = process.env.GITHUB_TOKEN;
if (!token) {
throw new Error("GITHUB_TOKEN is missing");
}
const octokit = github.getOctokit(token);
if (!context.payload.issue) {
core.info("Not an issue event, skipping.");
return;
}
const { title, number, user } = context.payload.issue;
const { owner, repo } = context.repo;
core.info(`Processing Issue #${number}: ${title}`);
const labelsToAdd = getLabelsFromTitle(title);
if (context.payload.action === 'opened') {
labelsToAdd.push('status: needs triage');
}
if (labelsToAdd.length > 0) {
await octokit.rest.issues.addLabels({
owner,
repo,
issue_number: number,
labels: labelsToAdd,
});
core.info(`Added labels: ${labelsToAdd.join(', ')}`);
}
if (context.payload.action === 'opened') {
await postWelcomeMessage(octokit, owner, repo, number, user.login);
}
} catch (error) {
if (error instanceof Error) core.setFailed(error.message);
}
}
run();
================================================
FILE: .github/bot/src/issue/labeler.ts
================================================
export function getLabelsFromTitle(title: string): string[] {
const labels: string[] = [];
const lowerTitle = title.toLowerCase();
if (lowerTitle.startsWith('[bug]')) {
labels.push('type: bug');
} else if (lowerTitle.startsWith('[feature]')) {
labels.push('type: enhancement');
}
return labels;
}
================================================
FILE: .github/bot/src/issue/message.ts
================================================
import { Octokit } from '@octokit/rest';
export async function postWelcomeMessage(
octokit: any,
owner: string,
repo: string,
issueNumber: number,
author: string
) {
const message = `
# 🦋 Merci pour ta contribution sur Papillon
Merci pour l'intérêt que tu portes au projet **Papillon** !
Nous espérons te revoir très bientôt avec une nouvelle issue !
À très vite sur **Papillon** 🦋
`.trim();
const comments = await octokit.rest.issues.listComments({
owner,
repo,
issue_number: issueNumber,
});
const botComment = comments.data.find((comment: any) =>
comment.body && comment.body.includes("Merci pour ta contribution sur Papillon")
);
if (!botComment) {
await octokit.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: message,
});
}
}
================================================
FILE: .github/bot/tsconfig.json
================================================
{
"compilerOptions": {
"target": "ES2022",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"]
}
================================================
FILE: .github/workflows/build-android.yml
================================================
name: Build Android
on:
push:
branches:
- main
jobs:
build:
name: Build & Upload to Play Store
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Cache Expo prebuild
id: prebuild-cache
uses: actions/cache@v4
with:
path: android/
key: ${{ runner.os }}-expo-prebuild-${{ hashFiles('app.json', 'package-lock.json') }}
restore-keys: ${{ runner.os }}-expo-prebuild-
- name: Create secrets.json
run: |
echo '{
"APP_KEY": "${{ secrets.COUNTLY_APP_KEY }}",
"SALT": "${{ secrets.COUNTLY_SALT }}",
"SERVER_URL": "${{ secrets.COUNTLY_SERVER_URL }}"
}' > secrets.json
- name: Prebuild Android
if: steps.prebuild-cache.outputs.cache-hit != 'true'
run: npx expo prebuild --platform android --clean
- name: Decode keystore
run: echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/release.keystore
- name: Calculate version code
run: |
VERSION_CODE=$(node -e "
const version = require('./package.json').version;
const cleanVersion = parseInt(version.replace(/\./g, ''));
const runNumber = parseInt(process.env.GITHUB_RUN_NUMBER || '0');
console.log(cleanVersion * 100000 + runNumber);
")
echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV
- name: Configure signing
run: |
sed -i '/signingConfigs {/a\ release {\n storeFile file('\''release.keystore'\'')\n storePassword '\''${{ secrets.KEYSTORE_PASSWORD }}'\''\n keyAlias '\''${{ secrets.KEY_ALIAS }}'\''\n keyPassword '\''${{ secrets.KEY_PASSWORD }}'\''\n }' android/app/build.gradle
sed -i 's/signingConfig signingConfigs.debug/signingConfig signingConfigs.release/' android/app/build.gradle
sed -i "s/versionCode .*/versionCode ${{ env.VERSION_CODE }}/" android/app/build.gradle
- name: Configure Gradle
run: |
chmod +x android/gradlew
echo "org.gradle.jvmargs=-Xmx6144m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError" >> android/gradle.properties
echo "org.gradle.parallel=true" >> android/gradle.properties
echo "org.gradle.caching=true" >> android/gradle.properties
echo "org.gradle.configuration-cache=true" >> android/gradle.properties
echo "android.enable16KbPageSizes=true" >> android/gradle.properties
- name: Build AAB
run: cd android && ./gradlew bundleRelease --no-daemon
- name: Upload AAB artifact
uses: actions/upload-artifact@v4
with:
name: app-release.aab
path: android/app/build/outputs/bundle/release/*.aab
- name: Upload to Play Store
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.PLAY_STORE_KEY }}
packageName: xyz.getpapillon.app
releaseFiles: android/app/build/outputs/bundle/release/*.aab
track: internal
inAppUpdatePriority: 3
status: draft
================================================
FILE: .github/workflows/merge.yml
================================================
name: Merge dev into main
on:
workflow_dispatch:
jobs:
merge:
name: Merge
runs-on: ubuntu-latest
steps:
- name: Generate app token
id: app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
fetch-depth: 0
- name: Configure git
run: |
git config user.name "papillon-release[bot]"
git config user.email "papillon-release[bot]@users.noreply.github.com"
- name: Merge dev into main
run: |
git checkout main
git merge origin/dev --no-edit
git push origin main
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
workflow_dispatch:
inputs:
version:
description: "Numéro de version (x.x.x)"
required: true
type: string
jobs:
release:
name: Merge & Release
runs-on: ubuntu-latest
steps:
- name: Validate version format
run: |
if ! echo "${{ inputs.version }}" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "::error::Version invalide '${{ inputs.version }}'. Format attendu : x.x.x (ex: 7.2.0)"
exit 1
fi
- name: Generate app token
id: app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
fetch-depth: 0
- name: Configure git
run: |
git config user.name "papillon-release[bot]"
git config user.email "papillon-release[bot]@users.noreply.github.com"
- name: Merge dev into main
run: |
git checkout main
git merge origin/dev --no-edit
git push origin main
- name: Create release
uses: softprops/action-gh-release@v2
with:
token: ${{ steps.app-token.outputs.token }}
tag_name: v${{ inputs.version }}
name: v${{ inputs.version }}
target_commitish: main
make_latest: true
body: |
**Notes de mise à jour :** https://papillon.bzh/release-notes/${{ inputs.version }}
================================================
FILE: .gitignore
================================================
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
# dependencies
node_modules/
# Expo
.expo/
dist/
web-build/
expo-env.d.ts
.idea/
# Native
.kotlin/
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
# Metro
.metro-health-check*
# debug
npm-debug.*
yarn-debug.*
yarn-error.*
# macOS
.DS_Store
*.pem
# local env files
.env*.local
# typescript
*.tsbuildinfo
ios/
!ios/Papillon
!ios/Papillon.xcodeproj/xcshareddata/xcschemes
ios/Podfile
android/**
android/*
!android/app/
!android/app/src/
!android/app/src/main/
!android/app/src/main/AndroidManifest.xml
bun.lock
yarn.lock
secrets.json
.vscode/
.idea/
================================================
FILE: .prettierignore
================================================
# Dependencies
node_modules/
bun.lock
package-lock.json
yarn.lock
# Build outputs
dist/
build/
.expo/
android/build/
ios/build/
# Generated files
*.log
.DS_Store
.vscode/
.idea/
# Platform specific
android/
ios/Pods/
ios/Papillon.xcworkspace/
ios/Papillon.xcodeproj/
# Patches
patches/
================================================
FILE: .prettierrc.json
================================================
{
"semi": true,
"trailingComma": "es5",
"singleQuote": false,
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"bracketSpacing": true,
"bracketSameLine": false,
"arrowParens": "avoid",
"endOfLine": "lf"
}
================================================
FILE: CODEOWNERS
================================================
services/* @raphckrman
database/* @raphckrman
stores/* @raphckrman
.github/* @ryzenixx
utils/magic/* @tryon-dev
ui/* @ecnivtwelve
app/* @ecnivtwelve
components/* @ecnivtwelve
utils/* @ecnivtwelve
ui/components/Pattern/* @godetremy
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Copyright (C)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
.
================================================
FILE: README.md
================================================
L'application libre et open source ultime pour gérer toute ta vie scolaire sans compromis.
#
#
Si tu souhaites contribuer à Papillon, tu es au bon endroit !
Retrouve les resources importantes pour t'aider à commencer dans l'univers Papillon ci-dessous.
#
Vince
Lucas
Rémy
Tom
Mael
Raphaël
================================================
FILE: app/(features)/(cards)/cards.tsx
================================================
import { getManager } from "@/services/shared";
import { Balance } from "@/services/shared/balance";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Button from "@/ui/new/Button";
import ChipButton from "@/ui/components/ChipButton";
import { Dynamic } from "@/ui/components/Dynamic";
import { EmptyItem } from "@/ui/components/EmptyItem";
import Icon from "@/ui/components/Icon";
import { NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
import TabHeader from "@/ui/components/TabHeader";
import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
import Typography from "@/ui/components/Typography";
import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
import { getServiceBackground, getServiceLogo, getServiceName } from "@/utils/services/helper";
import { Papicons, Plus } from "@getpapillon/papicons";
import { LinearGradient } from "expo-linear-gradient";
import { router, useFocusEffect } from "expo-router";
import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Image, Platform, Pressable, View } from "react-native";
import { ScrollView } from "react-native-gesture-handler";
export default function QRCodeAndCardsPage() {
const [wallets, setWallets] = useState([]);
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
async function fetchWallets() {
const manager = getManager()
const balances = await manager.getCanteenBalances()
const result: Balance[] = []
for (const balance of balances) {
result.push(balance)
}
setWallets(result);
}
useEffect(() => {
setWallets([])
fetchWallets();
}, [accounts])
const { t } = useTranslation();
const [headerHeight, setHeaderHeight] = useState(0);
return (
<>
}
trailing={Platform.OS === "ios" && (
{
router.dismiss();
}}
/>
)}
/>
{wallets.map((c, i) => {
return (
service.id === c.createdByAccount)?.serviceId ?? Services.TURBOSELF}
totalCards={wallets.length}
/>
);
})}
{wallets.length === 0 && (
)}
}
onPress={() => {
router.navigate({
pathname: "/(onboarding)/restaurants/method"
});
}}
/>
>
);
}
export function Card({
index = 0,
wallet,
service,
disabled,
}: {
index: number;
wallet: Balance;
service: Services;
disabled?: boolean;
inSpecificView?: boolean;
totalCards?: number;
}) {
const [pressed, setPressed] = useState(false);
return (
{
if (!disabled) {
router.push({
pathname: "/(features)/(cards)/specific",
params: { serviceName: getServiceName(service), service: service, wallet: JSON.stringify(wallet) }
});
}
}}
onPressIn={() => setPressed(true)}
onPressOut={() => setPressed(false)}
style={{
width: "100%",
minHeight: 210,
borderRadius: 20,
overflow: "hidden",
marginTop: index === 0 ? 0 : -140,
zIndex: 100 + index,
top: 0,
left: 0,
right: 0,
}}
disabled={disabled}
>
{pressed && (
)}
{getServiceName(service)}
{wallet.label}
{(wallet.amount / 100).toFixed(2)} {wallet.currency}
)
}
================================================
FILE: app/(features)/(cards)/qrcode.tsx
================================================
import Barcode, { Format } from "@aramir/react-native-barcode";
import { Phone } from "@getpapillon/papicons";
import { BlurView } from "expo-blur";
import { router, useLocalSearchParams } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { Dimensions, Platform } from "react-native";
import { Gesture, GestureDetector } from "react-native-gesture-handler";
import QRCode from "react-native-qrcode-svg";
import Reanimated, {
FlipInEasyX,
runOnJS,
useSharedValue,
withSpring,
ZoomInDown,
} from "react-native-reanimated";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import { Services } from "@/stores/account/types";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
export default function QRCodePage() {
const search = useLocalSearchParams();
const qr = String(search.qrcode);
const type = String(search.type || "QR");
const service = Number(search.service || Services.TURBOSELF);
const { t } = useTranslation();
const translationY = useSharedValue(0);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const finalTranslation = Dimensions.get("window").height / 2;
const panGesture = Gesture.Pan()
.onUpdate((e) => {
translationY.value = e.translationY < 0 ? e.translationY / 10 : e.translationY;
if (e.translationY < 0) { return; }
opacity.value = 1 - Math.min(Math.abs(e.translationY) / 300, 0.7);
scale.value = 1 - Math.min(Math.abs(e.translationY) / 600, 0.4);
})
.onEnd((e) => {
if (e.translationY > 150) {
translationY.value = withSpring(finalTranslation, { damping: 150, stiffness: 1500 });
opacity.value = withSpring(0, { damping: 150, stiffness: 1500 });
scale.value = withSpring(0.6, { damping: 150, stiffness: 1500 });
setTimeout(() => {
runOnJS(router.back)();
}, 200);
return;
}
translationY.value = withSpring(0, { damping: 150, stiffness: 1500 });
opacity.value = withSpring(1, { damping: 150, stiffness: 1500 });
scale.value = withSpring(1, { damping: 150, stiffness: 1500 });
});
return (
{type === "QR" ? (
) : (
)}
{t("Profile_Cards_Scan_Orientation")}
);
}
================================================
FILE: app/(features)/(cards)/specific.tsx
================================================
import { useCallback, useEffect, useState, useMemo } from "react";
import { Platform, ScrollView, View } from "react-native";
import { useHeaderHeight } from "@react-navigation/elements";
import { useTheme } from "@react-navigation/native";
import { LinearGradient } from "expo-linear-gradient";
import { router, useLocalSearchParams } from "expo-router";
import { Switch } from "react-native-gesture-handler";
import adjust from "@/utils/adjustColor";
import { getCodeType, getServiceColor } from "@/utils/services/helper";
import { warn } from "@/utils/logger/logger";
import { getWeekNumberFromDate } from "@/database/useHomework";
import { getManager } from "@/services/shared";
import { Balance } from "@/services/shared/balance";
import { BookingDay, CanteenHistoryItem, CanteenKind } from "@/services/shared/canteen";
import ContainedNumber from "@/ui/components/ContainedNumber";
import Icon from "@/ui/components/Icon";
import { NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import List from "@/ui/components/List";
import Item, { Trailing } from "@/ui/components/Item";
import Calendar from "@/ui/components/Calendar";
import { Card } from "./cards";
import { Calendar as CalendarIcon, ChevronDown, Clock, Papicons, QrCode } from "@getpapillon/papicons";
import { useAlert } from "@/ui/components/AlertProvider";
import { Services } from "@/stores/account/types";
import { useTranslation } from "react-i18next";
import { Capabilities } from "@/services/shared/types";
import i18n from "@/utils/i18n";
import TabHeader from "@/ui/components/TabHeader";
import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
import ChipButton from "@/ui/components/ChipButton";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
import NativeSwitch from "@/ui/native/NativeSwitch";
export default function QRCodeAndCardsPage() {
const alert = useAlert();
const search = useLocalSearchParams();
const serviceName = String(search.serviceName);
const service = Number(search.service) as Services;
const wallet = JSON.parse(String(search.wallet)) as Balance;
const theme = useTheme();
const { colors } = theme;
const manager = getManager();
const hasBookingCapacity = manager?.clientHasCapatibility(Capabilities.CANTEEN_BOOKINGS, wallet.createdByAccount)
const [history, setHistory] = useState([]);
const [qrcode, setQR] = useState("");
const [accountKind, setAccountKind] = useState(CanteenKind.ARGENT)
const [date, setDate] = useState(new Date());
const [weekNumber, setWeekNumber] = useState(getWeekNumberFromDate(date));
const [bookingWeek, setBookingWeek] = useState([]);
const [showDatePicker, setShowDatePicker] = useState(false);
const bookingDay = useMemo(() => {
const target = new Date(date);
target.setUTCHours(0, 0, 0, 0);
return bookingWeek.find(day => {
const dayDate = new Date(day.date);
dayDate.setUTCHours(0, 0, 0, 0);
return dayDate.getTime() === target.getTime();
});
}, [date, bookingWeek]);
const fetchQRCode = useCallback(async () => {
try {
const { data } = await manager.getCanteenQRCodes(wallet.createdByAccount);
setQR(data);
} catch (error) {
warn(String(error));
}
}, [manager, wallet.createdByAccount]);
const [loadingHistory, setLoadingHistory] = useState(false);
const fetchHistory = useCallback(async () => {
setLoadingHistory(true);
const history = await manager.getCanteenTransactionsHistory(wallet.createdByAccount);
setHistory(history);
setLoadingHistory(false);
}, [manager, wallet.createdByAccount]);
const fetchBookingWeek = useCallback(async () => {
const bookings = await manager.getCanteenBookingWeek(weekNumber, wallet.createdByAccount);
setBookingWeek(bookings);
}, [manager, weekNumber, wallet.createdByAccount]);
const fetchKind = useCallback(async () => {
const kind = await manager.getCanteenKind(wallet.createdByAccount);
setAccountKind(kind);
}, [manager, weekNumber, wallet.createdByAccount]);
useEffect(() => {
fetchQRCode();
fetchHistory();
fetchKind();
}, [fetchQRCode, fetchHistory]);
useEffect(() => {
fetchBookingWeek();
}, [fetchBookingWeek]);
const handleDateChange = useCallback(
(newDate: Date) => {
setDate(newDate);
const newWeek = getWeekNumberFromDate(newDate);
if (newWeek !== weekNumber) setWeekNumber(newWeek);
if (Platform.OS === "ios") setShowDatePicker(false);
},
[weekNumber]
);
const serviceColor = useMemo(() => adjust(getServiceColor(service), -0.1), [service]);
const handleToggle = async (index: number) => {
if (!bookingDay) return;
const updatedBookingDay = { ...bookingDay };
const item = updatedBookingDay.available[index];
const previous = item.booked;
item.booked = !previous;
setBookingWeek(prev =>
prev.map(day => (day.date === bookingDay.date ? updatedBookingDay : day))
);
try {
await manager.setMealAsBooked(item);
} catch (error) {
alert.showAlert({
title: "Erreur lors de la réservation",
description: "Une erreur est survenue lors de la réservation de ton repas, il n'a donc pas été réservé.",
icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: false
});
item.booked = previous;
setBookingWeek(prev =>
prev.map(day => (day.date === bookingDay.date ? updatedBookingDay : day))
);
}
};
const { t } = useTranslation();
const [headerHeight, setHeaderHeight] = useState(0);
return (
<>
}
trailing={
{
router.dismiss();
}}
/>
}
/>
{qrcode && (
router.push({ pathname: "/(features)/(cards)/qrcode", params: { qrcode, type: getCodeType(service), service } })}
style={{
width: "100%",
backgroundColor: colors.background,
paddingVertical: 18,
borderRadius: 25,
borderWidth: 1,
borderColor: colors.border,
}}
>
Afficher le QR-Code
)}
Solde
{(wallet.amount / 100).toFixed(2)} {wallet.currency}
Repas restants
{wallet.lunchPrice > 0 ? String(Math.floor(wallet.amount / wallet.lunchPrice)) : "Indéterminé"}
{hasBookingCapacity && (
setShowDatePicker(prev => !prev)}>
Réserver mon repas
{date.toLocaleDateString(i18n.language, { weekday: "long", day: "numeric", month: "long" })}
{bookingDay ? (
{bookingDay.available.map((item, index) => (
-
Borne {item.label}
handleToggle(index)}
/>
))}
) : (
{t("Profile_Cards_No_Reservation")}
{t("Profile_Cards_No_Available_Reservation")}
)}
)}
{loadingHistory && history.length === 0 && (
{t("Profile_Cards_Loading_History")}
{t("Profile_Cards_Loading_History_Description")}
)}
{history.length > 0 && (
{t("Profile_Cards_History")}
{history.slice(0, 10).map((c, index) =>
-
{c.amount > 0 ? "+" : ""}{(c.amount / 100).toFixed(2)} {c.currency}
{c.label}
{c.date.toLocaleDateString(i18n.language, { day: "2-digit", month: "2-digit", year: "numeric" })}
{c.date.toLocaleTimeString(i18n.language, { hour: "2-digit", minute: "2-digit", hour12: false })}
)}
)}
>
);
}
================================================
FILE: app/(features)/(news)/specific.tsx
================================================
import { getManager } from "@/services/shared";
import { News } from "@/services/shared/news";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Stack from "@/ui/components/Stack";
import TypographyLegacy from "@/ui/components/Typography";
import { useLocalSearchParams, useNavigation } from "expo-router"
import { useEffect, useState } from "react";
import { Linking, Platform, ScrollView, StyleSheet, View } from "react-native";
import { Attachment, News as SkolengoNews } from "skolengojs"
import * as Papicons from '@getpapillon/papicons';
import { VARIANTS } from "@/ui/components/Typography";
import HTMLView from 'react-native-htmlview';
import * as WebBrowser from 'expo-web-browser';
import { useTheme } from "@react-navigation/native";
import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
import { MenuView } from "@react-native-menu/menu";
import Icon from "@/ui/components/Icon";
import { t } from "i18next";
import ListLegacy from "@/ui/components/List";
import Item from "@/ui/components/Item";
import ActionMenu from "@/ui/components/ActionMenu";
import Typography from "@/ui/new/Typography";
import List from "@/ui/new/List";
export default function NewsPage() {
const search = useLocalSearchParams();
const news = JSON.parse(String(search.news)) as News
const navigation = useNavigation()
useEffect(() => {
const acknowledgeNews = async () => {
if (!news.acknowledged) {
const manager = getManager();
const store = useAccountStore.getState()
const account = store.accounts.find(account => account.id === store.lastUsedAccount)
const service = account?.services.find(service => service.id === news.createdByAccount)
if (service?.serviceId === Services.SKOLENGO) {
const attachment = new Attachment("", "", "")
const ref = new SkolengoNews(news.id, news.createdAt, news.title ?? "", news.content, news.content, { id: "", name: "" }, "", attachment)
news.ref = ref
}
await manager.setNewsAsDone(news);
}
};
acknowledgeNews();
}, [])
const { colors } = useTheme();
const styles = {
"papillon": {
background: colors.background,
foreground: colors.text,
html: StyleSheet.create({
...VARIANTS,
p: {
...VARIANTS.body1,
},
div: {
...VARIANTS.body1,
},
a: {
color: colors.primary,
textDecorationLine: 'underline',
},
})
},
"reading": {
background: "#ffe1a9ff",
foreground: "#634000ff",
html: StyleSheet.create({
...VARIANTS,
p: {
fontFamily: "serif_medium"
},
div: {
fontFamily: "serif_medium"
},
h1: {
fontFamily: "serif_bold"
},
a: {
color: "#a26900ff",
textDecorationLine: 'underline',
fontFamily: "serif_medium"
},
})
}
};
const [style, setStyle] = useState("papillon");
useEffect(() => {
navigation.setOptions({
headerTitle: news.title ?? "News",
headerTitleStyle: {
color: styles[style].foreground,
fontFamily: styles[style].html.p.fontFamily
},
headerLargeTitleStyle: {
color: styles[style].foreground,
fontFamily: styles[style].html.h1.fontFamily
}
})
}, [styles, style])
// Replace all color properties in currentHTMLStyle with foreground
const foreground = styles[style].foreground;
const currentHTMLStyle = (() => {
const htmlStyle = { ...styles[style].html };
Object.keys(htmlStyle).forEach(key => {
htmlStyle[key] = { ...htmlStyle[key], color: foreground };
});
return htmlStyle;
})();
const themes = [
{
title: t("News_Theme_Papillon_Title"),
description: t("News_Theme_Papillon_Description"),
value: "papillon"
},
{
title: t("News_Theme_Reading_Title"),
description: t("News_Theme_Reading_Description"),
value: "reading"
}
]
return (
<>
{news.attachments.length > 0 && (
{news.attachments.map((attachment, i) => (
- {
WebBrowser.openBrowserAsync(
attachment.url,
{
controlsColor: colors.primary,
dismissButtonStyle: 'done'
}
)
}}
>
{attachment.type === 0 ? (
) : (
)}
{attachment.name}
{attachment.url}
))}
)}
Cette news contient un sondage
({
id: theme.value,
title: theme.title,
subtitle: theme.description,
state: theme.value === style ? 'on' : 'off'
}))
}
onPressAction={({ nativeEvent }) => {
const selectedTheme = themes.find(theme => theme.value === nativeEvent.event);
if (selectedTheme) {
setStyle(selectedTheme.value);
}
}}
>
>
)
}
================================================
FILE: app/(features)/attendance.tsx
================================================
import Icon from "@/ui/components/Icon";
import { NativeHeaderHighlight, NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from "@/ui/components/NativeHeader";
import { router, useLocalSearchParams } from "expo-router";
import { Platform, ScrollView, View } from "react-native";
import { Papicons } from "@getpapillon/papicons"
import { useTheme } from "@react-navigation/native";
import { Dynamic } from "@/ui/components/Dynamic";
import { MenuView } from "@react-native-menu/menu";
import { Period } from "@/services/shared/grade";
import { getPeriodName, getPeriodNumber, isPeriodWithNumber } from "@/utils/services/periods";
import { useMemo, useState } from "react";
import { Attendance } from "@/services/shared/attendance";
import Stack from "@/ui/components/Stack";
import { useHeaderHeight } from "@react-navigation/elements";
import AnimatedNumber from "@/ui/components/AnimatedNumber";
import adjust from "@/utils/adjustColor";
import { error } from "@/utils/logger/logger";
import { getManager } from "@/services/shared";
import { t } from "i18next";
import i18n from "@/utils/i18n";
import ActionMenu from "@/ui/components/ActionMenu";
import AndroidBackButton from "@/utils/theme/AndroidBackButton";
import TabHeader from "@/ui/components/TabHeader";
import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
import List from "@/ui/new/List";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Typography from "@/ui/new/Typography";
import { formatDate, formatDistanceToNow, formatDistanceToNowStrict } from "date-fns";
import * as DateLocale from 'date-fns/locale';
const formatEventTime = (durationData: number, detailed: boolean) => {
if(detailed) {
return durationData >= 60
? t("Attendance_Duration_HoursMinutes_Detailed", { hours: Math.floor(durationData / 60), minutes: lz(durationData % 60) })
: t("Attendance_Duration_Minutes", { value: durationData })
}
return durationData >= 60
? t("Attendance_Duration_HoursMinutes_Compact", { hours: Math.floor(durationData / 60), minutes: lz(durationData % 60) })
: t("Attendance_Duration_Minutes", { value: durationData })
}
export default function AttendanceView() {
try {
const theme = useTheme()
const { colors } = theme;
const header = useHeaderHeight();
const search = useLocalSearchParams();
const currentPeriod = JSON.parse(String(search.currentPeriod)) as Period;
const periods = JSON.parse(String(search.periods)) as Period[];
const attendancesFromSearch = JSON.parse(String(search.attendances)) as Attendance[];
const [attendances, setAttendances] = useState(attendancesFromSearch);
const [period, setPeriod] = useState(currentPeriod);
const { missedTime, missedTimeUnjustified, unjustifiedAbsenceCount, unjustifiedDelayCount, absenceCount, delayCount } = useMemo(() => {
let missed = 0;
let unjustified = 0;
let unjustifiedAbs = 0;
let unjustifiedDelays = 0;
let Abs = 0
let Delays = 0
for (const attendance of attendances) {
for (const absence of attendance.absences) {
Abs += 1;
missed += absence.timeMissed;
if (!absence.justified) {
unjustified += absence.timeMissed;
unjustifiedAbs += 1;
}
}
for (const delay of attendance.delays) {
Delays += 1;
if (!delay.justified) {
unjustifiedDelays += 1;
unjustified += delay.duration
}
missed += delay.duration
}
}
return { missedTime: missed, missedTimeUnjustified: unjustified, unjustifiedAbsenceCount: unjustifiedAbs, unjustifiedDelayCount: unjustifiedDelays, absenceCount: Abs, delayCount: Delays };
}, [period, attendances]);
const [headerHeight, setHeaderHeight] = useState(0);
const insets = useSafeAreaInsets();
const dangerColor = adjust("#C50000", theme.dark ? 0.4 : -0.1);
const dangerBg = adjust("#C50000", theme.dark ? -0.65 : 0.85);
const successColor = adjust("#00C851", theme.dark ? 0.3 : -0.1);
const successBg = adjust("#00C851", theme.dark ? -0.75 : 0.85);
return (
<>
{
const actionId = nativeEvent.event;
if (actionId.startsWith("period:")) {
const selectedPeriodId = actionId.replace("period:", "");
const selectedPeriod: Period | undefined = periods.find(item => item.id === selectedPeriodId)
if (!selectedPeriod) {
error(t("Attendance_InvalidPeriod"))
}
const manager = getManager()
const attendancesFetched = await manager.getAttendanceForPeriod(selectedPeriod.name)
setAttendances(attendancesFetched)
setPeriod(selectedPeriod)
}
}}
actions={
periods.map((item) => ({
id: "period:" + item.id,
title: (getPeriodName(item.name || "") + " " + (isPeriodWithNumber(item.name || "") ? getPeriodNumber(item.name || "0") : "")).trim(),
subtitle: `${new Date(item.start).toLocaleDateString(i18n.language, {
month: "short",
year: "numeric",
})} - ${new Date(item.end).toLocaleDateString(i18n.language, {
month: "short",
year: "numeric",
})}`,
state: String(period?.id ?? "") === String(item.id ?? "") ? "on" : "off",
image: Platform.select({
ios: (getPeriodNumber(item.name || "0")) + ".calendar"
}),
imageColor: colors.text,
}))}
>
}
/>
{attendances.some(attendance => attendance.absences.length == 0) && attendances.some(attendance => attendance.delays.length == 0) ? (
{t("Attendance_NoEvent_Title")}
{t("Attendance_NoEvent_Description")}
) : (
{missedTimeUnjustified > 0 ? (
{t("Attendance_Hours_Unjustified_Value", { duration: formatEventTime(missedTimeUnjustified, true) })}
{t("Attendance_Unjustified_Description")}
) : (
{t("Attendance_NoUnjustified_Title")}
{t("Attendance_NoUnjustified_Description")}
)}
{t("Attendance_Hours_Missed")}
0 ? dangerColor : "textSecondary"}>
{formatEventTime(missedTime, true)}
)}
{attendances.some(attendance => attendance.absences.length > 0) && (
{t("Attendance_Missing")}
{absenceCount}
{attendances.map((attendance, index) =>
attendance.absences.map((absence, absenceIndex) => {
const fromDate = new Date(absence.from);
const dateString = formatDistanceToNowStrict(fromDate, {
locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
addSuffix: true
})
const dayString = formatDate(fromDate, "eeee d MMMM", {
locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
})
return (
{absence.reason || t("Attendance_NoReason")}
{dateString} · {dayString}
)
})
)}
)}
{attendances.some(attendance => attendance.delays.length > 0) && (
{t("Attendance_Delays")}
{delayCount}
{attendances.map((attendance, index) =>
attendance.delays.map((delay, absenceIndex) => {
const fromDate = new Date(delay.givenAt);
const date = fromDate.getTime();
const dateString = formatDistanceToNowStrict(date, {
locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
addSuffix: true
})
const dayFormatted = formatDate(date, "eeee d MMMM", {
locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
})
return (
{delay.reason || t("Attendance_NoReason")}
{dateString} · {dayFormatted}
)
})
)}
)}
>
)
} catch (err) {
error(err.toString());
return null;
}
}
const lz = (num: number) => num.toString().padStart(2, "0");
const AttendanceTimer = ({ evt }: { evt: any }) => {
const theme = useTheme();
const { colors } = theme;
const dangerColor = adjust("#C50000", theme.dark ? 0.4 : -0.1);
const dangerBg = dangerColor + "30";
const durationData = evt.timeMissed || evt.duration || 0;
const durationText = formatEventTime(durationData);
return (
{!evt.justified && (
)}
{durationText}
)
}
================================================
FILE: app/(features)/soon.tsx
================================================
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { Papicons } from "@getpapillon/papicons";
import React from "react";
import { Linking, View } from "react-native";
export default function Soon() {
return (
Promis, ça arrive (vraiment) bientôt !
L'onglet est toujours en cours de développement. Il arrivera prochainement dans une version future de Papillon.
{
Linking.openURL("https://www.instagram.com/thepapillonapp/");
}} style={{
textDecorationLine: "underline",
}}>
Et pour rester au courant, tu peux nous suivre sur les réseaux sociaux !
);
}
================================================
FILE: app/(modals)/address.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import * as Linking from "expo-linking";
import * as Location from "expo-location";
import * as React from "react";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import {
ActivityIndicator,
Dimensions,
KeyboardAvoidingView,
Platform,
ScrollView,
TouchableNativeFeedback,
View,
} from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Transit from "@/services/transit";
import { PlaceSuggestion } from "@/services/transit/models/PlaceSuggestion";
import { Stop } from "@/services/transit/models/Stop";
import { TransportAddress } from "@/stores/account/types";
import Button from "@/ui/components/Button";
import Item, { Leading, Trailing } from "@/ui/components/Item";
import List from "@/ui/components/List";
import Search from "@/ui/components/Search";
import Typography from "@/ui/components/Typography";
import { useHeaderHeight } from "@react-navigation/elements";
import AndroidBackButton, { AndroidBackButtonStyles } from "@/utils/theme/AndroidBackButton";
import Icon from "@/ui/components/Icon";
export interface AddressModalProps {
canUseCurrentLocation: boolean;
onCancel: () => void;
onConfirm: (address: TransportAddress) => void;
}
interface AddressItemProps {
icon: string;
firstLine: string;
secondLine: string;
convertFunction: () => Promise;
save: (addess: TransportAddress) => void;
lineLimit?: number;
}
const AddressItem = ({
icon,
firstLine,
secondLine,
convertFunction,
save,
lineLimit = 1,
}: AddressItemProps) => {
const theme = useTheme();
const [savingAddress, setSavingAddress] = useState(false);
const saveAddress = async () => {
setSavingAddress(true);
const address = await convertFunction();
save(address);
setSavingAddress(false);
};
return (
-
{savingAddress && (
)}
{firstLine}
{secondLine}
);
};
export const AddressModal = ({
canUseCurrentLocation,
onCancel,
onConfirm,
}: AddressModalProps) => {
const theme = useTheme();
const { t } = useTranslation();
const insets = useSafeAreaInsets();
const transit = new Transit();
const [status, requestPermission] = Location.useForegroundPermissions();
const [searchTerm, setSearchTerm] = useState("");
const [searchPlaceResults, setSearchPlaceResults] = useState<
PlaceSuggestion[]
>([]);
const [searchStopResults, setSearchStopResults] = useState([]);
let timeout: number | null = null;
const search = async () => {
const location = await Location.getCurrentPositionAsync();
const res = await transit.suggestions(
location.coords.latitude,
location.coords.longitude,
searchTerm
);
setSearchPlaceResults(res.suggestions.places);
setSearchStopResults(res.suggestions.stops);
};
const currentLocationToTransportAddress =
async (): Promise => {
return new Promise(resolve => {
resolve({
firstTitle: "current_location",
secondTitle: "current_location",
address: "current_location",
latitude: -1,
longitude: -1,
});
});
};
const placeToTransportAddress = async (
place: PlaceSuggestion
): Promise => {
const details = await transit.locationDetails(place.place_id);
return {
firstTitle: place.structured_formatting.main_text,
secondTitle: place.structured_formatting.secondary_text,
address: details.placeDetails.result.formatted_address,
latitude: details.placeDetails.result.geometry.location.lat,
longitude: details.placeDetails.result.geometry.location.lng,
};
};
const stopToTransportAddress = async (
stop: Stop
): Promise => {
return new Promise(resolve => {
resolve({
firstTitle: stop.stop_name,
secondTitle: stop.city_name,
address: `${stop.stop_name}, ${stop.city_name}`,
latitude: stop.stop_lat,
longitude: stop.stop_lon,
});
});
};
useEffect(() => {
if (timeout !== null) {
clearTimeout(timeout);
}
if (searchTerm.length === 0) {
setSearchPlaceResults([]);
setSearchStopResults([]);
return;
}
timeout = setTimeout(() => search(), 200);
}, [searchTerm]);
const finalHeaderHeight = Platform.select({
android: insets.top,
default: 0
});
return (
{Platform.OS === "android" && (
)}
{status === null || status?.granted ? (
{searchTerm.length === 0 && canUseCurrentLocation && (
)}
{searchPlaceResults.length > 0 && (
<>
{t("Settings_Transport_Place")}
{searchPlaceResults.map((item: PlaceSuggestion) => (
placeToTransportAddress(item)}
save={onConfirm}
/>
))}
>
)}
{searchStopResults.length > 0 && (
<>
{t("Settings_Transport_Stops")}
{searchStopResults.map((item: Stop) => (
stopToTransportAddress(item)}
save={onConfirm}
/>
))}
>
)}
) : (
{t("Settings_Transport_Localisation_Needed")}
{t("Settings_Transport_Localisation_Needed_Description")}
{
if (status?.canAskAgain) {
requestPermission();
} else {
Linking.openSettings();
}
}}
/>
)}
);
};
================================================
FILE: app/(modals)/course.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useRoute, useTheme } from "@react-navigation/native";
import { formatDistanceStrict, formatDistanceToNow } from 'date-fns'
import * as DateLocale from 'date-fns/locale';
import i18n, { t } from "i18next";
import React from "react";
import { Platform } from 'react-native';
import LinearGradient from "react-native-linear-gradient";
import ModalOverhead from "@/components/ModalOverhead";
import { Course as SharedCourse } from "@/services/shared/timetable";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { getSubjectName } from '@/utils/subjects/name';
import { getStatusText } from "../(tabs)/calendar/components/CalendarDay";
import { useSafeAreaInsets } from 'react-native-safe-area-context';
interface SubjectInfo {
name: string;
originalName: string;
emoji: string;
color: string;
}
interface GradesModalProps {
course: SharedCourse;
subjectInfo: SubjectInfo;
}
export default function CourseModal() {
const { params } = useRoute();
const { colors } = useTheme();
if (!params) {
return null;
}
const { course, subjectInfo } = params as GradesModalProps;
const item = course;
const startTime = Math.floor(course.from.getTime() / 1000);
const endTime = Math.floor(course.to.getTime() / 1000);
const insets = useSafeAreaInsets();
const finalHeaderHeight = Platform.select({
android: insets.top + 32,
default: 0
});
return (
<>
{Platform.OS !== 'android' && (
)}
}
style={{ backgroundColor: "transparent" }}
contentContainerStyle={{ padding: 16 }}
>
{getStatusText(course.status) ? (
{getStatusText(course.status)}
) : null}
{t("Modal_Course_Time")}
{t("Modal_Course_Start")}
{formatDistanceToNow(startTime * 1000, {
locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
addSuffix: true
})}
{new Date(startTime * 1000).toLocaleString(undefined, {
hour: "numeric",
minute: "numeric"
})}
{t("Modal_Course_End")}
{new Date(endTime * 1000).toLocaleString(undefined, {
hour: "numeric",
minute: "numeric"
})}
{t("Modal_Course_Details")}
{t("Modal_Course_Teacher")}
{item.teacher}
{t("Modal_Course_Room")}
{item.room || t("No_Course_Room")}
{t("Modal_Course_Duration")}
{formatDistanceStrict(startTime * 1000, endTime * 1000, {
locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS
})}
>
)
}
================================================
FILE: app/(modals)/grade.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useRoute, useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React from "react";
import { Platform, View } from "react-native";
import LinearGradient from "react-native-linear-gradient";
import ModalOverhead, { ModalOverHeadScore } from '@/components/ModalOverhead';
import { Grade as SharedGrade } from "@/services/shared/grade";
import ContainedNumber from "@/ui/components/ContainedNumber";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
import TypographyLegacy from "@/ui/components/Typography";
import adjust from '@/utils/adjustColor';
import { colorCheck } from '@/utils/colorCheck';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import List from '@/ui/new/List';
import Typography from '@/ui/new/Typography';
interface SubjectInfo {
name: string;
originalName: string;
emoji: string;
color: string;
}
interface GradesModalProps {
grade: SharedGrade;
subjectInfo: SubjectInfo;
avgInfluence: number;
avgClass: number;
}
interface GradeBadgeProps {
icon: string;
label: string;
color: string;
theme: any;
is_outlined?: boolean;
}
const GradeBadge = ({ icon, label, color, theme, is_outlined = false }: GradeBadgeProps) => {
const backgroundColor = is_outlined ? "transparent" : adjust(color, theme.dark ? 0.3 : -0.3);
const textColor = is_outlined ? color : (colorCheck("#FFFFFF", [backgroundColor]) ? "#FFFFFF" : "#000000");
const borderStyle = is_outlined ? { borderWidth: 1, borderColor: color } : undefined;
return (
{label}
);
};
export default function GradesModal() {
const { params } = useRoute();
const theme = useTheme();
const colors = theme.colors;
if (!params) {
return null;
}
const { grade, subjectInfo, avgInfluence = 0, avgClass = 0 } = params as GradesModalProps;
const insets = useSafeAreaInsets();
const finalHeaderHeight = Platform.select({
android: insets.top + 32,
default: 0
});
return (
<>
{Platform.OS !== 'android' && (
)}
}
/>
{grade.studentScore?.value === grade.maxScore?.value && !grade.studentScore?.disabled &&
}
{grade.optional &&
}
{grade.bonus &&
}
{t("Grades_Coefficient")}
x{(grade.coefficient ?? 1).toFixed(2)}
{t("Grades_Avg_Group_Short")}
{grade.averageScore?.value.toFixed(2)}
}
style={{ backgroundColor: "transparent" }}
contentContainerStyle={{ padding: 16,
paddingBottom: 16 + insets.bottom }}
>
{t("Grades_Details_Title")}
{grade.studentScore && grade.outOf && grade.outOf.value !== 20 ? (
{t("Grades_NormalizedGrade_Title")}
{t("Grades_NormalizedGrade_Description")}
{((grade.studentScore.value / grade.outOf.value) * 20).toFixed(2)}
) : null}
{t("Grades_HighestGrade_Title")}
{t("Grades_HighestGrade_Description")}
{grade.maxScore?.value.toFixed(2)}
{t("Grades_LowestGrade_Title")}
{t("Grades_LowestGrade_Description")}
{grade.minScore?.value.toFixed(2)}
{t("Grades_Influence_Title")}
{t("Grades_Avg_All_Title")}
= 0 ? "#2e8900" : "#990000"}
denominator="pts"
>
{avgInfluence >= 0 ? `+${avgInfluence.toFixed(2)}` : avgInfluence.toFixed(2)}
{t("Grades_Avg_Group_Title")}
= 0 ? "#2e8900" : "#990000"}
denominator="pts"
>
{avgClass >= 0 ? `+${avgClass.toFixed(2)}` : avgClass.toFixed(2)}
>
)
}
================================================
FILE: app/(modals)/news.tsx
================================================
import { getManager } from "@/services/shared";
import { News } from "@/services/shared/news";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Stack from "@/ui/components/Stack";
import TypographyLegacy from "@/ui/components/Typography";
import { useLocalSearchParams, useNavigation, useRouter } from "expo-router"
import { useEffect, useState } from "react";
import { Linking, Platform, ScrollView, StyleSheet, View } from "react-native";
import { Attachment, News as SkolengoNews } from "skolengojs"
import { VARIANTS } from "@/ui/components/Typography";
import HTMLView from 'react-native-htmlview';
import * as WebBrowser from 'expo-web-browser';
import { useTheme } from "@react-navigation/native";
import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
import { MenuView } from "@react-native-menu/menu";
import Icon from "@/ui/components/Icon";
import { t } from "i18next";
import ListLegacy from "@/ui/components/List";
import Item, { Leading } from "@/ui/components/Item";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { cleanHtmlForArticle } from "@/utils/news/cleanUpHTMLNews";
import { news } from "pawnote";
import Avatar from "@/ui/components/Avatar";
import { getInitials } from "@/utils/chats/initials";
import { HeaderBackButton } from "@react-navigation/elements";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
import { IconNames, Papicons } from "@getpapillon/papicons";
import { getAttachmentIcon } from "@/utils/news/getAttachmentIcon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
const NewsModal = () => {
const search = useLocalSearchParams();
const news = JSON.parse(String(search.news)) as News
const insets = useSafeAreaInsets();
const navigation = useNavigation()
const router = useRouter()
useEffect(() => {
const acknowledgeNews = async () => {
if (!news.acknowledged) {
const manager = getManager();
const store = useAccountStore.getState()
const account = store.accounts.find(account => account.id === store.lastUsedAccount)
const service = account?.services.find(service => service.id === news.createdByAccount)
if (service?.serviceId === Services.SKOLENGO) {
const attachment = new Attachment("", "", "")
const ref = new SkolengoNews(news.id, news.createdAt, news.title ?? "", news.content, news.content, { id: "", name: "" }, "", attachment)
news.ref = ref
}
await manager.setNewsAsDone(news);
}
};
acknowledgeNews();
}, [])
const { colors } = useTheme();
const stylesheet = StyleSheet.create({
...VARIANTS,
p: {
...VARIANTS.body1,
color: colors.text,
},
div: {
...VARIANTS.body1,
color: colors.text,
},
a: {
color: colors.primary,
textDecorationLine: 'underline'
},
ul: {
...VARIANTS.body1,
paddingHorizontal: 4,
color: colors.text,
},
});
const [HTMLCleanupEnabled, setHTMLCleanupEnabled] = useState(true)
const cleanedContent = HTMLCleanupEnabled ? cleanHtmlForArticle(news.content) : news.content
return (
{
Platform.OS === 'ios' && (
router.back()}
style={{
marginLeft: runsIOS26 ? 3 : -32,
}}
/>
)
}
{news.category}
{news.title}
{news.author}
{new Date(news.createdAt).toLocaleDateString(undefined, {
day: '2-digit',
month: 'short',
year: 'numeric'
})}
{news.question && (
Cette actualité contient un sondage
PRONOTE ne nous permet pas d'afficher les sondages pour le moment.
)}
{news.attachments.length > 0 && (
{news.attachments.map((attachment, index) => (
- Linking.openURL(attachment.url)}>
{attachment.name}
{attachment.url}
))}
)}
Si cette actualité ne s'affiche pas correctement,
setHTMLCleanupEnabled(!HTMLCleanupEnabled)}>
{HTMLCleanupEnabled ? "désactiver" : "activer"} le formattage automatique
);
};
export default NewsModal;
================================================
FILE: app/(modals)/notifications.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { useTranslation } from "react-i18next";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
export default function NotificationsModal() {
const { colors } = useTheme();
const { t } = useTranslation();
return (
{t("Feature_Soon")}
{t("Feature_Soon_Notification")}
)
}
================================================
FILE: app/(modals)/profile.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { MenuView, NativeActionEvent } from "@react-native-menu/menu";
import { useHeaderHeight } from "@react-navigation/elements";
import { useTheme } from "@react-navigation/native";
import * as ImagePicker from "expo-image-picker"
import { router } from "expo-router";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import {
Alert,
KeyboardAvoidingView,
Platform,
ScrollView,
View,
} from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { useAccountStore } from "@/stores/account";
import Avatar from "@/ui/components/Avatar";
import Button from "@/ui/components/Button";
import Icon from "@/ui/components/Icon";
import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
import Typography from "@/ui/components/Typography";
import { getInitials } from "@/utils/chats/initials";
import ActionMenu from "@/ui/components/ActionMenu";
export default function CustomProfileScreen() {
const { t } = useTranslation();
const store = useAccountStore.getState();
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
const [firstName, setFirstName] = useState(account?.firstName ?? "");
const [lastName, setLastName] = useState(account?.lastName ?? "");
const [profilePictureUrl, setProfilePictureUrl] = useState(account?.customisation?.profilePicture ? `data:image/png;base64,${account.customisation.profilePicture}` : null);
useEffect(() => {
if (account) {
setFirstName(account.firstName);
setLastName(account.lastName);
setProfilePictureUrl(account.customisation?.profilePicture ? `data:image/png;base64,${account.customisation.profilePicture}` : null);
}
}, [account]);
const insets = useSafeAreaInsets()
const updateProfilePictureFromLibrary = async () => {
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ['images', 'videos'],
allowsEditing: true,
aspect: [4, 3],
quality: 1,
base64: true
});
if (!result.canceled) {
const b64 = result.assets[0].base64 ?? "";
store.setAccountProfilePicture(lastUsedAccount, b64);
}
}
const updateProfilePictureFromService = async () => {
Alert.alert(
t("Feature_Soon"),
"Cette fonctionnalité n'est pas encore disponible, mais elle le sera dans une prochaine mise à jour.",
[{ text: "OK" }]
);
}
const { colors } = useTheme();
const height = useHeaderHeight();
return (
{
switch (e.nativeEvent.event) {
case 'photo_library':
updateProfilePictureFromLibrary();
break;
case 'from_service':
updateProfilePictureFromService();
break;
case 'remove_photo':
store.setAccountProfilePicture(lastUsedAccount, "");
break;
}
}}
>
}
title={t("Button_Change_ProfilePicture")}
/>
Prénom
Nom
{
useAccountStore.getState().setAccountName(lastUsedAccount, firstName, lastName);
router.back();
}}
>
KeyboardAvoidingView >
);
}
================================================
FILE: app/(modals)/task.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useRoute, useTheme } from "@react-navigation/native";
import { LinearGradient } from "expo-linear-gradient";
import * as WebBrowser from "expo-web-browser";
import { t } from "i18next";
import React, { useState } from "react";
import ModalOverhead from "@/components/ModalOverhead";
import Homework from "@/database/models/Homework";
import { updateHomeworkIsDone } from "@/database/useHomework";
import { getManager } from "@/services/shared";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
import { formatHTML } from "@/utils/format/html";
import { generateId } from "@/utils/generateId";
import { getAttachmentIcon } from "@/utils/news/getAttachmentIcon";
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
import { Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
const Task = () => {
const { params } = useRoute();
const theme = useTheme();
const colors = theme.colors;
const { task } = params as { task: Homework };
const subjectInfo = {
color: getSubjectColor(task.subject),
emoji: getSubjectEmoji(task.subject),
name: getSubjectName(task.subject)
}
const [isDone, setIsDone] = useState(task.isDone);
const setAsDone = async (done: boolean) => {
const manager = getManager();
await manager.setHomeworkCompletion(task, done);
const id = generateId(
task.subject +
task.content +
task.createdByAccount +
new Date(task.dueDate).toDateString()
);
updateHomeworkIsDone(id, done);
setIsDone(done);
}
const insets = useSafeAreaInsets();
const finalHeaderHeight = Platform.select({
android: insets.top + 32,
default: 0
});
return (
<>
{Platform.OS !== 'android' && (
)}
}
style={{
backgroundColor: "transparent"
}}
contentContainerStyle={{
padding: 16
}}
>
{t("Modal_Task_Status")}
setAsDone(!isDone)}>
{isDone &&
}
{isDone ? t("Task_Done") : t("Task_Undone")}
{t("Modal_Task_Description")}
{formatHTML(task.content)}
{t("Modal_Task_Attachments")}
{task.attachments.map((attachment) => (
WebBrowser.openBrowserAsync(attachment.url, {
presentationStyle: "formSheet"
})}>
{attachment.name || attachment.url}
{attachment.url}
))}
>
);
};
export default Task;
================================================
FILE: app/(modals)/wallpaper.tsx
================================================
import { useAccountStore } from "@/stores/account"
import { useSettingsStore } from "@/stores/settings"
import { Wallpaper } from "@/stores/settings/types"
import AnimatedPressable from "@/ui/components/AnimatedPressable"
import Stack from "@/ui/components/Stack"
import Typography from "@/ui/components/Typography"
import { useTheme } from "@react-navigation/native"
import React, { useEffect, useState } from "react"
import { FlatList, Image, Platform, RefreshControl, View } from "react-native"
import { File, Directory, Paths } from 'expo-file-system';
import ActivityIndicator from "@/components/ActivityIndicator"
import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader"
import Icon from "@/ui/components/Icon"
import { router } from "expo-router";
import { Papicons } from "@getpapillon/papicons"
import { t } from "i18next";
import * as ImagePicker from 'expo-image-picker';
import ActionMenu from "@/ui/components/ActionMenu"
const COLLECTIONS_SOURCE = "https://raw.githubusercontent.com/PapillonApp/datasets/refs/heads/main/wallpapers/index.json";
interface Collection {
name: string;
icon?: string;
link?: string;
images: Wallpaper[];
}
const WallpaperModal = () => {
const { colors } = useTheme()
const [collections, setCollections] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchCollections = async () => {
try {
setLoading(true);
const response = await fetch(COLLECTIONS_SOURCE);
const data = await response.json();
setCollections(data);
} catch (error) {
setError(error as string);
} finally {
setLoading(false);
}
}
useEffect(() => {
fetchCollections();
}, []);
const [currentlyDownloading, setCurrentlyDownloading] = useState([]);
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const currentWallpaper = settingsStore.wallpaper;
const selectedId = currentWallpaper?.id;
const hasCustomWallpaper = selectedId?.startsWith("custom:") ?? false;
const flatListRef = React.useRef(null);
useEffect(() => {
if (collections.length > 0 && currentWallpaper) {
const collectionIndex = collections.findIndex((collection) => collection.images.find((image) => image.id === currentWallpaper.id));
if (collectionIndex !== -1) {
setTimeout(() => {
flatListRef.current?.scrollToIndex({ index: collectionIndex, animated: true });
}, 500);
}
}
}, [collections, currentWallpaper]);
const wallpaperDirectory = new Directory(Paths.document, "wallpapers");
const downloadAndSelect = (wallpaper: Wallpaper) => {
const fileName = `${wallpaper.id}.jpg`;
const wallpaperFile = new File(wallpaperDirectory, fileName);
if (wallpaperFile.exists) {
mutateProperty("personalization", {
wallpaper: {
id: wallpaper.id,
path: {
directory: wallpaperDirectory.name,
name: wallpaperFile.name
}
}
})
return;
}
setCurrentlyDownloading((prev) => [...prev, wallpaper.id]);
if (!wallpaperDirectory.exists) {
wallpaperDirectory.create();
}
File.downloadFileAsync(wallpaper.url!, wallpaperFile).then((result) => {
mutateProperty("personalization", {
wallpaper: {
id: wallpaper.id,
path: {
directory: wallpaperDirectory.name,
name: result.name
}
}
})
}).finally(() => {
setCurrentlyDownloading((prev) => prev.filter((id) => id !== wallpaper.id));
})
}
const uploadCustomWallpaper = () => {
try {
ImagePicker.launchImageLibraryAsync({
allowsEditing: true,
aspect: [4, 3],
quality: 1,
}).then((result) => {
if (result.canceled) return;
const asset = result.assets[0];
const sourceFile = new File(asset.uri);
if (!wallpaperDirectory.exists) {
wallpaperDirectory.create();
}
const newFileName = `custom:${Date.now()}.jpg`;
const destFile = new File(wallpaperDirectory, newFileName);
sourceFile.copy(destFile);
mutateProperty("personalization", {
wallpaper: {
id: `custom:${Date.now()}`,
path: {
directory: wallpaperDirectory.name,
name: destFile.name
}
}
})
})
} catch (error) {
console.log(error);
}
}
return (
<>
(
{item.icon &&
}
{item.name}
{item.images.find((image) => image.id === currentWallpaper?.id) && item.images.find((image) => image.id === currentWallpaper?.id)?.credit &&
{item.images.find((image) => image.id === currentWallpaper?.id)?.credit}
}
downloadAndSelect(item)} selectedId={currentWallpaper?.id} isDownloading={currentlyDownloading.includes(item.id)} />}
getItemLayout={(data, index) => (
{ length: 160 + 6, offset: (160 + 6) * index, index }
)}
initialScrollIndex={item.images.findIndex((image) => image.id === currentWallpaper?.id) !== -1 ? item.images.findIndex((image) => image.id === currentWallpaper?.id) : undefined}
/>
)}
refreshControl={
}
/>
{Platform.OS === 'android' ? (
router.back()}>
) : (
uploadCustomWallpaper()}>
)}
{Platform.OS === 'android' && (
uploadCustomWallpaper()}>
)}
{
const action = nativeEvent.event;
if (action === "downloads:clear") {
wallpaperDirectory.delete();
mutateProperty("personalization", {
wallpaper: undefined
})
}
if (action === "background:clear") {
mutateProperty("personalization", {
wallpaper: undefined
})
}
}}
>
>
)
}
const WallpaperImage = ({ item, onPress, selectedId, isDownloading }: { item: WallpaperCollection, onPress: () => void, selectedId: string, isDownloading: boolean }) => {
const [imageLoaded, setImageLoaded] = useState(false);
const { colors } = useTheme();
return (
{
(!imageLoaded || isDownloading) &&
}
setImageLoaded(true)}
/>
);
};
export default WallpaperModal
================================================
FILE: app/(modals)/wrapped/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { screenOptions } from "@/utils/theme/ScreenOptions";
export default function Layout() {
return (
);
}
================================================
FILE: app/(modals)/wrapped/index.tsx
================================================
import React, { useEffect, useRef, useState } from 'react';
import { Dimensions, FlatList, Pressable, StatusBar, View } from 'react-native';
import { useVideoPlayer, VideoView, VideoPlayer } from 'expo-video';
import { useEvent } from "expo";
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { Papicons } from '@getpapillon/papicons';
import { useNavigation } from 'expo-router';
import Reanimated, { FadeIn, FadeInDown, FadeInLeft, FadeInRight, FadeInUp, FadeOut, FadeOutUp, LinearTransition, ZoomIn, ZoomOut } from 'react-native-reanimated';
import Typography from '@/ui/components/Typography';
import { Cooking, Warning } from '@/app/(modals)/wrapped/stories/consent';
import { Welcome } from '@/app/(modals)/wrapped/stories/welcome';
const WrappedView = () => {
const insets = useSafeAreaInsets();
const navigation = useNavigation();
const [aboutToExit, setAboutToExit] = useState(false);
const [currentIndex, setCurrentIndex] = useState(0);
const mainBackground = useVideoPlayer({
assetId: require('@/assets/video/wrapped.mp4'),
}, player => {
player.loop = true;
player.play();
});
const altBackground = useVideoPlayer({
assetId: require('@/assets/video/wrapped_alt.mp4'),
}, player => {
player.loop = true;
player.play();
});
const redBackground = useVideoPlayer({
assetId: require('@/assets/video/wrapped_red.mp4'),
}, player => {
player.loop = true;
player.play();
});
const slides = [Welcome, Warning, Cooking];
const sliderRef = useRef(null);
return (
{!aboutToExit && (
<>
{(currentIndex == 0 || currentIndex == 1 || currentIndex == 2) && (
<>
>
)}
>
)}
{
setTimeout(() => {
setAboutToExit(true);
}, 0);
setTimeout(() => {
navigation.goBack();
}, 50);
}}
>
{slides.map((_, index) => (
))}
(
)}
keyExtractor={(item, index) => index.toString()}
style={{
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
zIndex: 10,
}}
showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
scrollEventThrottle={16}
snapToInterval={Dimensions.get('screen').height}
decelerationRate="fast"
onScroll={e => {
const index = Math.round(e.nativeEvent.contentOffset.y / Dimensions.get('screen').height);
setCurrentIndex(index);
}}
ref={sliderRef}
/>
);
};
const WrappedBackgroundVideo = ({ player }: { player: VideoPlayer }) => {
const { isPlaying, oldIsPlaying } = useEvent(player, 'playingChange', { isPlaying: player.playing });
useEffect(() => {
if (!isPlaying) {
player.play();
}
}, [isPlaying]);
return (
);
};
export default WrappedView;
================================================
FILE: app/(modals)/wrapped/stories/consent.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useTheme } from '@react-navigation/native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import React, { memo, useCallback, useState } from 'react';
import { Dimensions, FlatList, StyleSheet, Switch, View } from 'react-native';
import Reanimated, { FadeInDown, FadeOut, FadeOutUp } from 'react-native-reanimated';
import Stack from '@/ui/components/Stack';
import Typography from "@/ui/components/Typography";
import adjust from '@/utils/adjustColor';
import NativeSwitch from '@/ui/native/NativeSwitch';
type ConsentItem = {
title: string;
icon: string;
enabled: boolean;
};
const ConsentButton = memo(({
item,
index,
borderColor,
onToggle
}: {
item: ConsentItem;
index: number;
borderColor: string;
onToggle: (index: number) => void;
}) => (
{item.title}
onToggle(index)} trackColor={TRACK_COLOR} />
));
ConsentButton.displayName = 'ConsentButton';
const INITIAL_ITEMS: ConsentItem[] = [
{ title: "Mes notes", icon: "Pie", enabled: true },
{ title: "Absences et retards", icon: "Chair", enabled: true },
{ title: "Emploi du temps", icon: "Calendar", enabled: true },
{ title: "Tâches", icon: "Tasks", enabled: true }
];
const ICON_COLOR = '#31424A';
const TRACK_COLOR = { true: "#C50000" };
export const Warning = ({ isCurrent }: { isCurrent: boolean, sliderRef: React.RefObject }) => {
const { colors } = useTheme();
const [consentItems, setConsentItems] = useState(INITIAL_ITEMS);
const toggleConsent = useCallback((index: number) => {
setConsentItems(prev => prev.map((item, i) =>
i === index ? { ...item, enabled: !item.enabled } : item
));
}, []);
const renderItem = useCallback(({ item, index }: { item: ConsentItem; index: number }) => (
), [colors.border, toggleConsent]);
return (
{isCurrent && (
Ton Yearbook contient un récap de toutes tes statistiques liées à ta vie d'étudiant, choisis ce que tu souhaites afficher avant de commencer :
)}
);
};
export const Cooking = ({ isCurrent }: { isCurrent: boolean, sliderRef: React.RefObject }) => {
const { colors } = useTheme();
return (
{isCurrent && (
Ton Yearbook contient un récap de toutes tes statistiques liées à ta vie d'étudiant, choisis ce que tu souhaites afficher avant de commencer :
)}
);
};
const styles = StyleSheet.create({
title: {
width: 350,
marginBottom: 40
},
listContent: {
gap: 20,
alignItems: "center"
}
})
================================================
FILE: app/(modals)/wrapped/stories/welcome.tsx
================================================
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import { Papicons } from '@getpapillon/papicons';
import React from 'react';
import { Dimensions, FlatList, View } from 'react-native';
import Reanimated, { FadeOut, ZoomIn } from 'react-native-reanimated';
export const Welcome = ({ isCurrent }: { isCurrent: boolean, sliderRef: React.RefObject }) => {
return (
{isCurrent && (
<>
Swipe pour le révéler
>
)}
);
};
================================================
FILE: app/(new)/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
export default function Layout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
headerLargeTitle: false
}), []);
return (
);
}
================================================
FILE: app/(new)/event.tsx
================================================
import DateTimePicker, { DateTimePickerAndroid } from '@react-native-community/datetimepicker';
import { useTheme } from "@react-navigation/native";
import * as Localization from "expo-localization";
import { useRouter } from "expo-router";
import { CalendarDays, Check, Clock4Icon, MapPinIcon, TypeIcon, User2Icon, X } from "lucide-react-native";
import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import React, { Platform, Pressable, ScrollView, StyleSheet, TextInput } from "react-native";
import { useDatabase } from "@/database/DatabaseProvider";
import Icon from "@/ui/components/Icon";
import Item, { Trailing } from "@/ui/components/Item";
import List from "@/ui/components/List";
import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
export default function NewEventScreen() {
const router = useRouter();
const { colors } = useTheme();
const { t } = useTranslation();
const database = useDatabase();
const [canSave, setCanSave] = useState(false);
const [inputTitle, setInputTitle] = useState("");
const [inputLocation, setInputLocation] = useState("");
const [inputOrganizer, setInputOrganizer] = useState("");
const [inputStartDate, setInputStartDate] = useState(new Date());
const inHour = new Date();
inHour.setHours(new Date().getHours() + 1, 0, 0, 0); // Set to one hour later
const [inputEndDate, setInputEndDate] = useState(inHour);
const checkCanSave = () => {
const titleValid = inputTitle.length > 0;
const locationValid = inputLocation.length > 0;
const organizerValid = inputOrganizer.length > 0;
const startDateValid = inputStartDate instanceof Date && !isNaN(inputStartDate.getTime());
const endDateValid = inputEndDate instanceof Date && !isNaN(inputEndDate.getTime());
const endDateAfterStartDate = inputEndDate.getTime() > inputStartDate.getTime();
setCanSave(titleValid && locationValid && organizerValid && startDateValid && endDateValid && endDateAfterStartDate);
};
useEffect(() => {
checkCanSave();
}, [inputTitle, inputLocation, inputOrganizer, inputStartDate, inputEndDate]);
// Helper to create an event without linking to subject
async function createEvent(eventData: {
title: string;
start: number;
end: number;
color?: string;
room?: string;
teacher?: string;
status?: string;
canceled?: boolean;
}) {
await database.write(async () => {
await database.get('events').create((ev: Event) => {
ev.title = eventData.title;
ev.start = eventData.start;
ev.end = eventData.end;
if (eventData.color) {ev.color = eventData.color;}
if (eventData.room) {ev.room = eventData.room;}
if (eventData.teacher) {ev.teacher = eventData.teacher;}
if (eventData.status) {ev.status = eventData.status;}
if (typeof eventData.canceled === 'boolean') {ev.canceled = eventData.canceled;}
});
});
}
const saveEvent = useCallback(async () => {
if (!canSave) {return;}
// Create event data
const eventData = {
title: inputTitle,
start: inputStartDate.getTime(),
end: inputEndDate.getTime(),
color: "#888888", // Default color, can be changed later
room: inputLocation,
teacher: inputOrganizer,
status: null, // Default status
canceled: false // Default not canceled
};
createEvent(eventData)
.then(() => {
router.back();
})
.catch((error) => {
console.error("Error creating event:", error);
alert(t("Error_CreatingEvent"));
});
}, [canSave, inputTitle, inputLocation, inputOrganizer, inputStartDate, inputEndDate, router, t, database]);
return (
<>
{ router.back() }}>
{ saveEvent() }}>
-
0 ? 1 : 0.5} />
-
0 ? 1 : 0.5} />
-
0 ? 1 : 0.5} />
{
setInputOrganizer(text);
}}
style={{ flex: 1, paddingVertical: 8, fontSize: 16, fontFamily: "medium" }}
/>
-
{t("Form_Start")}
{Platform.OS === "ios" ? (
{
if (date) {
// When changing the start date, update the date part of end date to match, but keep the time part
setInputStartDate(date);
setInputEndDate(prevEnd => {
const newEnd = new Date(date);
newEnd.setHours(prevEnd.getHours(), prevEnd.getMinutes(), 0, 0);
// If new end is before or equal to new start, add 1 hour
if (newEnd.getTime() <= date.getTime()) {
newEnd.setTime(date.getTime() + 60 * 60 * 1000);
}
return newEnd;
});
}
}}
/>
) : (
{
DateTimePickerAndroid.open({
value: inputStartDate,
mode: "date",
design: "material",
locale: Localization.getLocales()[0].languageTag,
onChange: (event, date) => {
if (date) {
setInputStartDate(date);
}
}
});
}}
>
{inputStartDate.toLocaleDateString(Localization.getLocales()[0].languageTag, {
day: "2-digit",
month: "short",
year: "numeric"
})}{" "}
{
DateTimePickerAndroid.open({
value: inputStartDate,
mode: "time",
design: "material",
locale: Localization.getLocales()[0].languageTag,
onChange: (event, date) => {
if (date) {
setInputStartDate(date);
}
}
});
}}
>
{inputStartDate.toLocaleTimeString(Localization.getLocales()[0].languageTag, {
hour: "2-digit",
minute: "2-digit"
})}{" "}
)}
-
{t("Form_End")}
{Platform.OS === "ios" ? (
{
if (date) {
// Only update the time part of end date, keep the date part
setInputEndDate(prevEnd => {
const newEnd = new Date(prevEnd);
newEnd.setHours(date.getHours(), date.getMinutes(), 0, 0);
// If new end is before or equal to start, move to next day
if (newEnd.getTime() <= inputStartDate.getTime()) {
newEnd.setDate(newEnd.getDate() + 1);
}
return newEnd;
});
}
}}
/>
) : (
{
DateTimePickerAndroid.open({
value: inputEndDate,
mode: "time",
design: "material",
locale: Localization.getLocales()[0].languageTag,
onChange: (event, date) => {
if (date) {
setInputEndDate(date);
}
}
});
}}
>
{inputEndDate.toLocaleTimeString(Localization.getLocales()[0].languageTag, {
hour: "2-digit",
minute: "2-digit"
})}{" "}
)}
>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16
},
containerContent: {
justifyContent: "center",
alignItems: "center",
}
});
================================================
FILE: app/(onboarding)/_layout.tsx
================================================
import React from 'react';
import { Platform, StatusBar, View } from 'react-native';
import { Stack } from "expo-router";
import { screenOptions } from "@/utils/theme/ScreenOptions";
import AndroidHeaderBackground, { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
import { t } from 'i18next';
export default function OnboardingLayout() {
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
null, headerShown: false, headerBackground: null }}
/>
);
}
================================================
FILE: app/(onboarding)/ageSelection.tsx
================================================
import { useHeaderHeight } from "@react-navigation/elements";
import { useTheme } from "@react-navigation/native";
import { useNavigation } from "expo-router";
import React, { useState } from "react";
import { FlatList, StatusBar, View } from "react-native";
import { useTranslation } from "react-i18next";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Stack from "@/ui/components/Stack";
import Button from "@/ui/new/Button";
import Divider from "@/ui/new/Divider";
import Typography from "@/ui/new/Typography";
import HighSchoolIllustration from "./components/ageSelection/illustrations/highSchool";
import MiddleSchoolIllustration from "./components/ageSelection/illustrations/middleSchool";
import ParentsIllustration from "./components/ageSelection/illustrations/parents";
import SupSchoolIllustration from "./components/ageSelection/illustrations/supSchool";
import TeacherIllustration from "./components/ageSelection/illustrations/teacher";
import OnboardingSelector from "./components/OnboardingSelector";
const LEVELS = [
{
key: "middle-school",
labelKey: "ONBOARDING_LEVEL_MIDDLE_SCHOOL",
color: "#008CFF",
icon: MiddleSchoolIllustration,
type: "school"
},
{
key: "high-school",
labelKey: "ONBOARDING_LEVEL_HIGH_SCHOOL",
color: "#FFC800",
icon: HighSchoolIllustration,
type: "school"
},
{
key: "sup-school",
labelKey: "ONBOARDING_LEVEL_UNIVERSITY",
color: "#68F000",
icon: SupSchoolIllustration,
type: "univ"
},
{
type: 'separator'
},
{
key: "parents",
labelKey: "ONBOARDING_LEVEL_PARENT",
color: "#ff4d4d",
icon: ParentsIllustration,
type: "parents"
},
{
key: "teacher",
labelKey: "ONBOARDING_LEVEL_TEACHER",
color: "#FF0084",
icon: TeacherIllustration,
type: "teacher"
}
]
export default function AgeSelection() {
const headerHeight = useHeaderHeight();
const theme = useTheme();
const { colors } = theme;
const insets = useSafeAreaInsets();
const navigation = useNavigation();
const { t } = useTranslation();
const [selectedLevel, setSelectedLevel] = useState(null);
return (
(
{t("ONBOARDING_AGE_TITLE")}
{t("ONBOARDING_AGE_DESCRIPTION")}
)}
data={LEVELS.map((level) => ("labelKey" in level ? { ...level, label: t(level.labelKey) } : level))}
renderItem={({ item }) => }
contentContainerStyle={{
padding: 20,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20
}}
initialNumToRender={2}
maxToRenderPerBatch={2}
windowSize={3}
style={{ flex: 1 }}
/>
{
navigation.navigate("serviceSelection", {
type: LEVELS.find((level) => level.key === selectedLevel)?.type
})
}}
disabled={!selectedLevel}
/>
);
}
================================================
FILE: app/(onboarding)/components/LoginView.tsx
================================================
import { useTheme } from '@react-navigation/native';
import React from 'react';
import { Alert, Image, View } from 'react-native';
import { useTranslation } from "react-i18next";
import ActivityIndicator from '@/ui/components/ActivityIndicator';
import { Dynamic } from '@/ui/components/Dynamic';
import Stack from '@/ui/components/Stack';
import Button from '@/ui/new/Button';
import TextInput from '@/ui/new/TextInput';
import Typography from '@/ui/new/Typography';
interface LoginViewProps {
color: string;
serviceName: string;
serviceIcon: any;
loading?: boolean;
fields?: {
name: string;
placeholder: string;
secureTextEntry: boolean;
textContentType?: "username" | "password";
keyboardType?: "default" | "number-pad" | "decimal-pad" | "email-address" | "phone-pad" | "url" | "numeric";
}[];
actions?: {
label: string;
variant?: "primary" | "secondary" | "outlined" | "ghost" | "text";
submit?: boolean;
onPress?: () => void;
}[];
onSubmit?: (fieldValues: { [key: string]: string }) => void;
}
export default function LoginView({
color,
serviceName,
serviceIcon,
loading = false,
fields,
actions,
onSubmit,
}: LoginViewProps) {
const { colors } = useTheme();
const { t } = useTranslation();
const [fieldValues, setFieldValues] = React.useState<{ [key: string]: string }>({});
const defaultFields = fields ?? [
{
name: "username",
placeholder: t("INPUT_USERNAME"),
secureTextEntry: false,
textContentType: "username" as const,
},
{
name: "password",
placeholder: t("INPUT_PASSWORD"),
secureTextEntry: true,
textContentType: "password" as const,
}
];
const defaultActions = actions ?? [
{
label: t("LOGIN_BTN"),
variant: "primary" as const,
submit: true,
},
{
label: t("ONBOARDING_LOGIN_HELP_ACTION"),
variant: "secondary" as const,
onPress: () => {
Alert.alert(t("ONBOARDING_LOGIN_HELP_TITLE"), t("ONBOARDING_LOGIN_HELP_DESCRIPTION"));
},
}
];
const handleChange = (name: string, value: string) => {
setFieldValues(prev => ({ ...prev, [name]: value }));
};
const handleSubmit = () => {
if (onSubmit) {
onSubmit(fieldValues);
}
};
return (
{serviceIcon && (
)}
{!serviceIcon && (
{serviceName[0]}
)}
{t("ONBOARDING_LOGIN_TO_SERVICE")}
{serviceName || t("ONBOARDING_UNKNOWN_SERVICE")}
{loading &&
}
{defaultFields.map((field, index) => (
handleChange(field.name, value)}
textContentType={field.textContentType ? field.textContentType : undefined}
keyboardType={field.keyboardType ? field.keyboardType : 'default'}
/>
))}
{defaultActions.map((action, index) => (
))}
{t("ONBOARDING_LOGIN_DISCLAIMER", { service: serviceName || t("ONBOARDING_THIS_SERVICE") })}
);
}
================================================
FILE: app/(onboarding)/components/OnboardingSelector.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { LinearGradient } from "expo-linear-gradient";
import React from "react";
import { View } from "react-native";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Divider from "@/ui/new/Divider";
import Ripple from "@/ui/new/RippleEffect";
import Typography from "@/ui/new/Typography";
import { PapillonZoomIn, PapillonZoomOut } from "@/ui/utils/Transition";
import adjust from "@/utils/adjustColor";
import { LayoutAnimationConfig } from "react-native-reanimated";
export default function OnboardingSelector({ item, selected, setSelected }) {
const theme = useTheme();
const { colors } = theme;
if (item.type == 'separator') {
return
}
const color = adjust(item.color, theme.dark ? -0.5 : 0.3);
const dark = adjust(item.color, theme.dark ? 0.4 : -0.4);
return (
{ selected == item.key ? setSelected(null) : setSelected(item.key) }}
>
{selected == item.key && (
)}
{selected == item.key && (
)}
{item.label}
)
};
================================================
FILE: app/(onboarding)/components/OnboardingWebView.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import React from "react";
import { Platform, View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import WebView from "react-native-webview";
import { Dynamic } from "@/ui/components/Dynamic";
import Typography from "@/ui/new/Typography";
import { useHeaderHeight } from "@react-navigation/elements";
import AndroidBackButton from "@/utils/theme/AndroidBackButton";
export default function OnboardingWebView({ webViewRef, ...props }: React.ComponentProps) {
const insets = useSafeAreaInsets();
const { colors } = useTheme();
const [currentUrl, setCurrentUrl] = React.useState(props.source.uri || "");
const [loading, setLoading] = React.useState(true);
const [loadingProgress, setLoadingProgress] = React.useState(0);
const extractDomain = (url: string) => {
try {
if (url.trim().length === 0) { return "about:blank"; }
const { hostname } = new URL(url);
return hostname.replace("www.", "");
} catch (e) {
return url;
}
}
const finalHeaderHeight = Platform.select({
android: insets.top,
default: 0
});
return (
{Platform.OS === 'android' && (
)}
{currentUrl.startsWith("https://") && (
)}
{extractDomain(currentUrl)}
{loading && (
)}
{
setCurrentUrl(navState.url);
if (props.onNavigationStateChange) {
props.onNavigationStateChange(navState);
}
}}
onLoadStart={(args) => {
setLoading(true);
if (props.onLoadStart) {
props.onLoadStart(args);
}
}}
onLoadEnd={(args) => {
setLoading(false);
if (props.onLoadEnd) {
props.onLoadEnd(args);
}
}}
onLoadProgress={(args) => {
setLoadingProgress(args.nativeEvent.progress);
if (props.onLoadProgress) {
props.onLoadProgress(args);
}
}}
ref={webViewRef}
/>
)
}
================================================
FILE: app/(onboarding)/components/ageSelection/illustrations/highSchool.tsx
================================================
import * as React from "react";
import type { SvgProps } from "react-native-svg";
import Svg, { Path } from "react-native-svg";
const HighSchoolIllustration = (props: SvgProps) => (
);
export default HighSchoolIllustration;
================================================
FILE: app/(onboarding)/components/ageSelection/illustrations/middleSchool.tsx
================================================
import * as React from "react";
import type { SvgProps } from "react-native-svg";
import Svg, { Path } from "react-native-svg";
const MiddleSchoolIllustration = (props: SvgProps) => (
);
export default MiddleSchoolIllustration;
================================================
FILE: app/(onboarding)/components/ageSelection/illustrations/parents.tsx
================================================
import * as React from "react";
import type { SvgProps } from "react-native-svg";
import Svg, { Path } from "react-native-svg";
const ParentsIllustration = (props: SvgProps) => (
);
export default ParentsIllustration;
================================================
FILE: app/(onboarding)/components/ageSelection/illustrations/supSchool.tsx
================================================
import * as React from "react";
import type { SvgProps } from "react-native-svg";
import Svg, { Path } from "react-native-svg";
const SupSchoolIllustration = (props: SvgProps) => (
);
export default SupSchoolIllustration;
================================================
FILE: app/(onboarding)/components/ageSelection/illustrations/teacher.tsx
================================================
import * as React from "react";
import type { SvgProps } from "react-native-svg";
import Svg, { Path } from "react-native-svg";
const TeacherIllustration = (props: SvgProps) => (
);
export default TeacherIllustration;
================================================
FILE: app/(onboarding)/restaurants/_layout.tsx
================================================
import React from 'react';
import { useTranslation } from "react-i18next";
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { Platform } from 'react-native';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
headerBackVisible: Platform.select({ android: false, default: true }),
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
);
}
================================================
FILE: app/(onboarding)/restaurants/alise.tsx
================================================
import { router, useLocalSearchParams } from "expo-router";
import LottieView from "lottie-react-native";
import React, { useEffect, useMemo, useState } from "react";
import { Keyboard, KeyboardAvoidingView, View } from "react-native";
import Reanimated, { useSharedValue, withTiming } from "react-native-reanimated";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import { useAlert } from "@/ui/components/AlertProvider";
import { t } from "i18next";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { useTheme } from "@react-navigation/native";
import { Alise } from "@/services/alise";
import { authenticateWithCredentials } from "alise-api";
import { initializeAccountManager } from "@/services/shared";
const ANIMATION_DURATION = 100;
export default function AliseLoginWithCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [siteId, setSiteId] = useState("");
const params = useLocalSearchParams();
const action = String(params.action);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const alert = useAlert();
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
const loginAlise = async () => {
try {
const accountId = uuid();
const store = useAccountStore.getState();
const client = await authenticateWithCredentials(username, password, siteId);
const alise = new Alise(accountId);
const auth = {
additionals: {
username,
password,
site: siteId
}
};
alise.session = client;
alise.authData = auth;
const service = {
id: accountId,
auth,
serviceId: Services.ALISE,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
};
if (action === "addService") {
store.addServiceToAccount(store.lastUsedAccount, service);
await initializeAccountManager()
router.back();
return router.back();
}
store.addAccount({
id: accountId,
firstName: client.account?.firstName || "",
lastName: client.account?.lastName || "",
schoolName: client.account?.establishment || "",
services: [service],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
});
store.setLastUsedAccount(accountId);
return router.push({
pathname: "../end/color",
params: { accountId },
});
} catch (error) {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_ALISE_LOGIN_ABORTED"),
icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true,
});
}
};
return (
{t("STEP")} 2
{t("STEP_OUTOF")} 3
{t("ONBOARDING_LOGIN_CREDENTIALS")} Alise
{
Keyboard.dismiss();
loginAlise();
},
returnKeyType: "done",
}}
/>
);
}
================================================
FILE: app/(onboarding)/restaurants/ard.tsx
================================================
/* eslint-disable @typescript-eslint/no-require-imports */
import { useTheme } from "@react-navigation/native";
import { router, useLocalSearchParams, useNavigation } from "expo-router";
import { t } from "i18next";
import LottieView from "lottie-react-native";
// import { Authenticator } from "pawrd";
import React, { useEffect, useMemo, useState } from "react";
import { Alert, Keyboard, KeyboardAvoidingView, ScrollView, View } from "react-native";
import Reanimated, {
useSharedValue,
withTiming,
} from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { fetchARDHistory } from "@/services/ard/history";
import { initializeAccountManager } from "@/services/shared";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import { useAlert } from "@/ui/components/AlertProvider";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { detectMealPrice } from "@/utils/restaurant/detect-price";
import uuid from "@/utils/uuid/uuid";
import LoginView from "../components/LoginView";
const ANIMATION_DURATION = 100;
export default function TurboSelfLoginWithCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const navigation = useNavigation();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [siteId, setSiteId] = useState("");
const [isLoggingIn, setIsLoggingIn] = useState(false);
const params = useLocalSearchParams();
const action = String(params.action);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const alert = useAlert();
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
const loginARD = async () => {
try {
throw new Error("ARD service is currently unavailable");
setIsLoggingIn(true);
const authenticator = new Authenticator();
// ARD require 2 connections, WHY ?
const authentification = await authenticator.fromCredentials(siteId, username, password);
const accountId = uuid();
const store = useAccountStore.getState();
const history = await fetchARDHistory(authentification, "")
const mealPrice = detectMealPrice(history)
const service = {
id: accountId,
auth: {
additionals: {
schoolId: siteId,
password,
username,
mealPrice: String(mealPrice)
},
},
serviceId: Services.ARD,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
};
setIsLoggingIn(false);
if (action === "addService") {
store.addServiceToAccount(store.lastUsedAccount, service);
await initializeAccountManager()
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
}
store.addAccount({
id: accountId,
firstName: "",
lastName: "",
schoolName: authentification.schoolName,
services: [service],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
});
store.setLastUsedAccount(accountId);
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
return router.push("/");
} catch (error) {
setIsLoggingIn(false);
Alert.alert(t("Alert_Auth_Error"), t("ONBOARDING_ALERT_LOGIN_ABORTED"));
}
};
return (
{
if (!isLoggingIn && values.username && values.password) {
setPassword(values.password);
setUsername(values.username);
setSiteId(values.siteId);
loginARD();
}
}}
/>
);
return (
{t("STEP")} 2
{t("STEP_OUTOF")} 3
{t("ONBOARDING_LOGIN_CREDENTIALS")} ARD
{
Keyboard.dismiss();
// Trigger login
loginARD();
},
returnKeyType: "done",
}}
/>
);
}
================================================
FILE: app/(onboarding)/restaurants/izly.tsx
================================================
/* eslint-disable @typescript-eslint/no-require-imports */
import { useTheme } from "@react-navigation/native";
import { router, useLocalSearchParams, useNavigation } from "expo-router";
import { login, tokenize } from "ezly";
import LottieView from "lottie-react-native";
import React, { useCallback, useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import {
ActivityIndicator,
Alert,
Keyboard,
KeyboardAvoidingView,
Linking,
ScrollView,
View,
} from "react-native";
import Reanimated, {
useSharedValue,
withTiming,
} from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { initializeAccountManager } from "@/services/shared";
import { useAccountStore } from "@/stores/account";
import { ServiceAccount, Services } from "@/stores/account/types";
import { useAlert } from "@/ui/components/AlertProvider";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { log } from "@/utils/logger/logger";
import uuid from "@/utils/uuid/uuid";
import LoginView from "../components/LoginView";
const ANIMATION_DURATION = 100;
export default function TurboSelfLoginWithCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const navigation = useNavigation();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [linkSended, setLinkSended] = useState(false);
const [isLoggingIn, setIsLoggingIn] = useState(false);
const params = useLocalSearchParams();
const action = String(params.action);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
const { t } = useTranslation();
const alert = useAlert();
const handleActivation = useCallback(async (url: string) => {
const id = uuid();
const { identification, profile } = await tokenize(url);
const service: ServiceAccount = {
id,
auth: {
session: identification,
additionals: {
secret: password,
},
},
serviceId: Services.IZLY,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
};
const store = useAccountStore.getState();
if (action === "addService") {
store.addServiceToAccount(store.lastUsedAccount, service);
await initializeAccountManager()
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
}
store.addAccount({
id,
firstName: profile.firstName,
lastName: profile.lastName,
services: [service],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
});
store.setLastUsedAccount(id);
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
return router.push('/')
}, [password, action]);
useEffect(() => {
const handleDeepLink = (event: { url: string }) => {
const url = event.url;
const scheme = url.split(":")[0];
if (scheme === "izly") {
log("[IzlyActivation] Activation link received:", url);
handleActivation(url);
} else {
log("[IzlyActivation] Ignoring link:", url);
}
};
Linking.getInitialURL().then((url) => {
if (url) {
handleDeepLink({ url });
}
});
const listener = Linking.addEventListener("url", handleDeepLink);
return () => {
listener?.remove();
};
}, [handleActivation]);
async function handleLogin(username: string, password: string) {
try {
setIsLoggingIn(true);
await login(username, password)
setIsLoggingIn(false);
setLinkSended(true);
Alert.alert(t("ONBOARDING_SMS_SENT_TITLE"), t("ONBOARDING_IZLY_SMS_SENT_DESCRIPTION"));
} catch (error) {
setIsLoggingIn(false);
Alert.alert(t("Alert_Auth_Error"), t("ONBOARDING_ALERT_LOGIN_ABORTED"));
}
}
return (
{
if (!isLoggingIn && values.username && values.password) {
handleLogin(values.username, values.password);
}
}}
/>
);
}
================================================
FILE: app/(onboarding)/restaurants/method.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useHeaderHeight } from "@react-navigation/elements";
import { useRoute, useTheme } from "@react-navigation/native";
import { useRouter } from "expo-router";
import React, { useMemo, useState } from "react";
import { Image, ScrollView, View } from "react-native";
import { useTranslation } from "react-i18next";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Button from "@/ui/new/Button";
import Divider from "@/ui/new/Divider";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { PapillonZoomIn, PapillonZoomOut } from "@/ui/utils/Transition";
import adjust from "@/utils/adjustColor";
import { GetSupportedServices } from './utils/constants';
import { GetSupportedRestaurants } from "../utils/constants";
export default function ServiceSelection() {
const headerHeight = useHeaderHeight();
const theme = useTheme();
const { colors } = theme;
const insets = useSafeAreaInsets();
const router = useRouter();
const { t } = useTranslation();
const { params } = useRoute();
const { type } = params;
const [selectedService, setSelectedService] = useState(null);
const services = GetSupportedRestaurants((path: { pathname: string }) => {
router.push({
pathname: path.pathname as unknown as RelativePathString,
params: path.options ?? {} as unknown as UnknownInputParams
});
});
const filteredServices = services;
const titleString = t("ONBOARDING_RESTAURANT_SELECTION_TITLE");
const hasServiceRoute = services.find(service => service.name === selectedService)?.route || services.find(service => service.name === selectedService)?.onPress;
const loginToService = (serviceName: string) => {
const serviceRoute = services.find(service => service.name === serviceName)?.route;
if(!serviceRoute) {
services.find(service => service.name === serviceName)?.onPress();
return;
}
const newRoute = './services/' + serviceRoute;
router.push(newRoute);
};
return (
(
{titleString}
{t("ONBOARDING_SERVICE_SELECTION_DESCRIPTION")}
)}
contentContainerStyle={{
padding: 16,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20
}}
style={{ flex: 1 }}
>
{filteredServices.map((app) => (
setSelectedService(app.name)} style={{
backgroundColor: selectedService === app.name ? adjust(colors.primary, theme.dark ? -0.8 : 0.9) : colors.card,
minHeight: 62
}}>
{selectedService === app.name && }
{app.title}
))}
{ loginToService(selectedService) }}
disabled={!selectedService || !hasServiceRoute}
/>
{ router.back() }}
variant="secondary"
/>
);
}
================================================
FILE: app/(onboarding)/restaurants/turboself.tsx
================================================
/* eslint-disable @typescript-eslint/no-require-imports */
import { useTheme } from "@react-navigation/native";
import { router, useLocalSearchParams, useNavigation } from 'expo-router';
import LottieView from 'lottie-react-native';
import React, { useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Alert, Keyboard, KeyboardAvoidingView, ScrollView, View } from "react-native";
import Reanimated, {
useSharedValue,
withTiming
} from 'react-native-reanimated';
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { authenticateWithCredentials } from 'turboself-api'
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { initializeAccountManager } from "@/services/shared";
import { useAccountStore } from '@/stores/account';
import { Services } from '@/stores/account/types';
import { useAlert } from '@/ui/components/AlertProvider';
import Button from '@/ui/components/Button';
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import uuid from '@/utils/uuid/uuid';
import LoginView from "../components/LoginView";
const ANIMATION_DURATION = 100;
export default function TurboSelfLoginWithCredentials() {
const theme = useTheme();
const insets = useSafeAreaInsets();
const { t } = useTranslation();
const navigation = useNavigation();
const [username, setUsername] = useState("")
const [password, setPassword] = useState("");
const [isLoggingIn, setIsLoggingIn] = useState(false);
const params = useLocalSearchParams();
const action = String(params.action);
const opacity = useSharedValue(1);
const alert = useAlert();
const scale = useSharedValue(1);
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
const loginTurboself = async () => {
try {
setIsLoggingIn(true);
const authentification = await authenticateWithCredentials(username, password, true, false)
const siblings = await authentification.getSiblings();
if (siblings.length === 0) {
const accountId = uuid()
const store = useAccountStore.getState()
const service = {
id: accountId,
auth: {
additionals: {
username,
password,
"hoteId": authentification.host?.id ?? "N/A"
}
},
serviceId: Services.TURBOSELF,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
if (action === "addService") {
store.addServiceToAccount(store.lastUsedAccount, service)
await initializeAccountManager()
router.back();
router.back();
return router.back();
}
store.addAccount({
id: accountId,
firstName: authentification.host?.firstName ?? "N/A",
lastName: authentification.host?.lastName ?? "N/A",
schoolName: authentification.establishment?.name,
className: authentification.host?.division,
services: [service],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
})
store.setLastUsedAccount(accountId)
setIsLoggingIn(false);
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
}
setIsLoggingIn(false);
const global = [authentification.host, ...siblings].flat()
return router.push({
pathname: "/(onboarding)/restaurants/turboselfHost",
params: {
siblings: JSON.stringify(global),
username,
password
}
});
} catch (error) {
setIsLoggingIn(false);
Alert.alert(t("Alert_Auth_Error"), t("ONBOARDING_ALERT_BAD_CREDENTIALS_TURBOSELF"));
}
}
return (
{
if (!isLoggingIn && values.username && values.password) {
setPassword(values.password);
setUsername(values.username);
loginTurboself();
}
}}
/>
);
}
================================================
FILE: app/(onboarding)/restaurants/turboselfHost.tsx
================================================
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { StyleSheet, Pressable, TextInput, Keyboard, View, FlatList } from 'react-native';
import { router, useFocusEffect, useLocalSearchParams } from 'expo-router';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import LottieView from 'lottie-react-native';
import Typography from '@/ui/components/Typography';
import Stack from '@/ui/components/Stack';
import { Papicons } from '@getpapillon/papicons';
import { authenticateWithCredentials, Host } from 'turboself-api'
import Icon from '@/ui/components/Icon';
import ViewContainer from '@/ui/components/ViewContainer';
import Reanimated, {
Extrapolate,
interpolate,
useAnimatedStyle,
useSharedValue,
withTiming
} from 'react-native-reanimated';
import Button from '@/ui/components/Button';
import uuid from '@/utils/uuid/uuid';
import { useAccountStore } from '@/stores/account';
import { Services } from '@/stores/account/types';
import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import { useTranslation } from 'react-i18next';
const INITIAL_HEIGHT = 570;
const COLLAPSED_HEIGHT = 270;
const staticStyles = StyleSheet.create({
container: {
flex: 1,
},
pressableContainer: {
flex: 1,
},
stackContainer: {
alignItems: 'center',
justifyContent: 'flex-end',
borderBottomLeftRadius: 42,
borderBottomRightRadius: 42,
paddingBottom: 34,
borderCurve: "continuous",
height: "100%",
},
backButton: {
position: 'absolute',
left: 16,
zIndex: 200,
backgroundColor: '#ffffff42',
padding: 10,
borderRadius: 100,
},
inputContainer: {
flex: 1,
padding: 20,
backgroundColor: "#F2F2F2",
borderRadius: 300,
borderWidth: 1,
borderColor: "#0000001F",
},
textInput: {
color: "#5B5B5B",
fontSize: 18,
fontWeight: "600",
flex: 1,
},
iconBackground: {
backgroundColor: "transparent",
},
});
export default function TurboSelfSelectHost() {
const insets = useSafeAreaInsets();
const animation = React.useRef(null);
const search = useLocalSearchParams();
const height = useSharedValue(INITIAL_HEIGHT);
const siblings = useMemo(() => {
const parsedRef = Array.isArray(search.siblings)
? search.siblings
: typeof search.siblings === "string"
? JSON.parse(search.siblings)
: [];
return parsedRef.map(
(sibling: any) =>
new Host(
sibling.id,
sibling.localId,
sibling.etabId,
sibling.firstName,
sibling.lastName,
sibling.mode,
sibling.quality,
sibling.division,
sibling.lunchPrice,
sibling.type,
sibling.cardNumber,
sibling.cafeteriaUrl,
sibling.premissions
)
);
}, [search.siblings]);
const AnimatedHeaderStyle = useAnimatedStyle(() => {
'worklet';
const heightDiff = height.value - COLLAPSED_HEIGHT;
return {
maxHeight: interpolate(
0,
[0, heightDiff],
[height.value, COLLAPSED_HEIGHT],
Extrapolate.CLAMP
),
height: height.value,
position: "absolute",
top: 0,
left: 0,
right: 0,
zIndex: 2,
};
}, []);
const AnimatedInputContainerStyle = useAnimatedStyle(() => {
'worklet';
return {
paddingTop: height.value + 16,
paddingHorizontal: 21,
gap: 9
};
}, []);
const animationCallback = useCallback(() => {
if (animation.current) {
animation.current.reset();
animation.current.play();
}
}, []);
useFocusEffect(animationCallback);
const AnimatedLottieContainerStyle = useAnimatedStyle(() => {
'worklet';
return {
shadowColor: "#000",
shadowOffset: { width: 0, height: 4 },
shadowOpacity: 0.25,
shadowRadius: 4,
elevation: 4,
paddingBottom: 20
};
}, []);
const theme = useTheme();
const { colors } = theme;
const { t } = useTranslation();
return (
{t("STEP")} 3
{t("STEP_OUTOF")} 3
{t("ONBOARDING_TURBOSELF_SELECTHOST")}
(
{
const user = item as Host
const authentification = await authenticateWithCredentials(String(search.username), String(search.password), true, false, user.id)
const accountId = uuid()
const store = useAccountStore.getState()
store.addAccount({
id: accountId,
firstName: authentification.host?.firstName ?? "N/A",
lastName: authentification.host?.lastName ?? "N/A",
schoolName: authentification.establishment?.name,
className: authentification.host?.division,
services: [{
id: accountId,
auth: {
additionals: {
username: String(search.username),
password: String(search.password),
"hoteId": authentification.host?.id ?? "N/A"
}
},
serviceId: Services.TURBOSELF,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
})
store.setLastUsedAccount(accountId)
return router.push({
pathname: "../end/color",
params: {
accountId
}
});
}}>
{`${(item as Host).lastName.toUpperCase()} ${(item as Host).firstName}`}
)}
keyExtractor={item => item.firstName}
showsHorizontalScrollIndicator={false}
contentContainerStyle={{ justifyContent: "space-between" }}
/>
);
}
================================================
FILE: app/(onboarding)/serviceSelection.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useHeaderHeight } from "@react-navigation/elements";
import { useRoute, useTheme } from "@react-navigation/native";
import { useRouter } from "expo-router";
import React, { useMemo, useState } from "react";
import { Image, ScrollView, View } from "react-native";
import { useTranslation } from "react-i18next";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Button from "@/ui/new/Button";
import Divider from "@/ui/new/Divider";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { PapillonZoomIn, PapillonZoomOut } from "@/ui/utils/Transition";
import adjust from "@/utils/adjustColor";
import { GetSupportedServices } from './utils/constants';
export default function ServiceSelection() {
const headerHeight = useHeaderHeight();
const theme = useTheme();
const { colors } = theme;
const insets = useSafeAreaInsets();
const router = useRouter();
const { t } = useTranslation();
const { params } = useRoute();
const { type } = params;
const [selectedService, setSelectedService] = useState(null);
const services = GetSupportedServices((path: { pathname: string, options?: UnknownInputParams }) => {
router.push({
pathname: path.pathname as unknown as RelativePathString,
params: path.options ?? {} as unknown as UnknownInputParams
});
});
const filteredServices = useMemo(() => {
return services.filter((service) => service.type.includes(type));
}, [services, type]);
const titleString = useMemo(() => {
switch (type) {
case "univ":
return t("ONBOARDING_SERVICE_SELECTION_TITLE_UNIV");
default:
return t("ONBOARDING_SERVICE_SELECTION_TITLE_SCHOOL");
}
}, [type, t]);
const hasServiceRoute = services.find(service => service.name === selectedService)?.route || services.find(service => service.name === selectedService)?.onPress;
const loginToService = (serviceName: string) => {
const serviceRoute = services.find(service => service.name === serviceName)?.route;
if(!serviceRoute) {
services.find(service => service.name === serviceName)?.onPress();
return;
}
const newRoute = './services/' + serviceRoute;
router.push(newRoute);
};
if (!["school", "univ"].includes(type)) {
return (
{t("ONBOARDING_UNSUPPORTED_TITLE")}
{t("ONBOARDING_UNSUPPORTED_DESCRIPTION")}
{
router.back();
}}
fullWidth
/>
)
}
return (
(
{titleString}
{t("ONBOARDING_SERVICE_SELECTION_DESCRIPTION")}
)}
contentContainerStyle={{
padding: 16,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20
}}
style={{ flex: 1 }}
>
{filteredServices.map((app) => (
setSelectedService(app.name)} style={{
backgroundColor: selectedService === app.name ? adjust(colors.tint, theme.dark ? -0.8 : 0.9) : colors.item,
minHeight: 62
}}>
{selectedService === app.name && }
{app.title}
))}
{ loginToService(selectedService) }}
disabled={!selectedService || !hasServiceRoute}
/>
);
}
================================================
FILE: app/(onboarding)/services/appscho/_layout.tsx
================================================
import React from 'react';
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { Platform } from 'react-native';
import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: false,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
);
}
================================================
FILE: app/(onboarding)/services/appscho/credentials.tsx
================================================
import { router, useLocalSearchParams } from "expo-router";
import LottieView from "lottie-react-native";
import React, { useEffect, useMemo, useState } from "react";
import {
ActivityIndicator,
Keyboard,
KeyboardAvoidingView,
View,
} from "react-native";
import Reanimated, {
useSharedValue,
withTiming,
} from "react-native-reanimated";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import { useAlert } from "@/ui/components/AlertProvider";
import { useAccountStore } from "@/stores/account";
import { ServiceAccount, Services } from "@/stores/account/types";
import uuid from "@/utils/uuid/uuid";
import { useTranslation } from "react-i18next";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { useTheme } from "@react-navigation/native";
import { INSTANCES, loginWithCredentials } from "appscho";
const ANIMATION_DURATION = 100;
export default function AppSchoCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const { instanceId } = useLocalSearchParams<{ instanceId: string }>();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [isLoading, setIsLoading] = useState(false);
const instance = INSTANCES.find(inst => inst.id === instanceId);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
const { t } = useTranslation();
const alert = useAlert();
async function handleLogin(username: string, password: string) {
if (!instance) {
alert.showAlert({
title: t("ONBOARDING_ERROR"),
description: t("ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND"),
icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true,
});
return;
}
if (!username.trim() || !password.trim()) {
alert.showAlert({
title: t("ONBOARDING_REQUIRED_FIELDS"),
description: t("ONBOARDING_FILL_ALL_FIELDS"),
icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true,
});
return;
}
setIsLoading(true);
try {
const response = await loginWithCredentials(instance.id, username, password);
const id = uuid();
const service: ServiceAccount = {
id,
auth: {
additionals: {
instanceId: instance.id,
username: username,
password: password,
},
},
serviceId: Services.APPSCHO,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
};
const store = useAccountStore.getState();
store.addAccount({
id,
firstName: response.firstname,
lastName: response.lastname,
schoolName: instance.name,
className: response.program ?? undefined,
services: [service],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
});
store.setLastUsedAccount(id);
return router.push({
pathname: "/(onboarding)/end/color",
params: {
accountId: id,
},
});
} catch (error) {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_LOGIN_ABORTED"),
icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true,
});
} finally {
setIsLoading(false);
}
}
return (
{t("STEP")} 2
{t("STEP_OUTOF")} 3
{t("ONBOARDING_LOGIN_CREDENTIALS")} {instance?.name || "AppScho"}
{isLoading ? (
{t("WAITING")}
{t("ONBOARDING_LOADING_LOGIN")}
) : (
{
Keyboard.dismiss();
handleLogin(username, password);
},
returnKeyType: "done",
}}
/>
handleLogin(username, password)}
/>
)}
);
}
================================================
FILE: app/(onboarding)/services/appscho/list.tsx
================================================
import { Image, View } from "react-native";
import { useTheme } from "@react-navigation/native";
import React, { useMemo, useState } from "react";
import Reanimated, {
FadeInDown
} from "react-native-reanimated";
import Typography from "@/ui/components/Typography";
import { useTranslation } from "react-i18next";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import OnboardingScrollingFlatList from "@/components/onboarding/OnboardingScrollingFlatList";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { RelativePathString, router } from "expo-router";
import { INSTANCES } from "appscho";
const UNIVERSITY_LOGOS: { [key: string]: any } = {
alijia: require('@/assets/images/univ/alijia.webp'),
bsb: require('@/assets/images/univ/bsb.webp'),
digitalcampus: require('@/assets/images/univ/digitalcampus.webp'),
edhec: require('@/assets/images/univ/edhec.webp'),
eigsi: require('@/assets/images/univ/eigsi.webp'),
emstra: require('@/assets/images/univ/emstra.webp'),
epp: require('@/assets/images/univ/epp.webp'),
esaip: require('@/assets/images/univ/esaip.webp'),
esarc: require('@/assets/images/univ/esarc.webp'),
esg: require('@/assets/images/univ/esg.webp'),
esigelec: require('@/assets/images/univ/esigelec.webp'),
essca: require('@/assets/images/univ/essca.webp'),
essec: require('@/assets/images/univ/essec.webp'),
estp: require('@/assets/images/univ/estp.webp'),
hec: require('@/assets/images/univ/hec.webp'),
icp: require('@/assets/images/univ/icp.png'),
ieu: require('@/assets/images/univ/ieu.webp'),
iicp: require('@/assets/images/univ/iicp.webp'),
ipp: require('@/assets/images/univ/ipp.webp'),
iseg: require('@/assets/images/univ/iseg.webp'),
lisaa: require('@/assets/images/univ/lisaa.webp'),
macromedia: require('@/assets/images/univ/macromedia.webp'),
mbs: require('@/assets/images/univ/mbs.webp'),
merkure: require('@/assets/images/univ/merkure.webp'),
psb: require('@/assets/images/univ/psb.jpg'),
pstb: require('@/assets/images/univ/pstb.webp'),
regent: require('@/assets/images/univ/regent.webp'),
sciencespo: require('@/assets/images/univ/sciencepo.webp'),
scpoaix: require('@/assets/images/univ/scpoaix.webp'),
ubmont: require('@/assets/images/univ/ubmont.webp'),
uclouvain: require('@/assets/images/univ/uclouvain.webp'),
ucly: require('@/assets/images/univ/ucly.webp'),
ueve: require('@/assets/images/univ/ueve.webp'),
uniassas: require('@/assets/images/univ/uniassas.webp'),
unilyon3: require('@/assets/images/univ/unilyon3.webp'),
unimes: require('@/assets/images/univ/unimes.webp'),
unimons: require('@/assets/images/univ/unimons.webp'),
unitoulon: require('@/assets/images/univ/unitoulon.webp'),
univangers: require('@/assets/images/univ/univangers.webp'),
unieiffel: require('@/assets/images/univ/univeiffel.webp'),
univpoitiers: require('@/assets/images/univ/univpoitiers.webp'),
upjv: require('@/assets/images/univ/upjv.webp'),
wsfactory: require('@/assets/images/univ/wsfactory.png'),
};
export default function AppschoInstancesList() {
const theme = useTheme();
const { colors } = theme;
const [search, setSearch] = useState("");
const { t } = useTranslation();
const filteredInstances = useMemo(() => {
if (!search.trim()) return INSTANCES;
return INSTANCES.filter(instance =>
instance.name.toLowerCase().includes(search.toLowerCase())
);
}, [search]);
return (
{
if (item.isSearchBar) {
return (
);
}
return (
{
requestAnimationFrame(() => {
if (item.casurl) {
router.push({pathname: '/(onboarding)/services/appscho/webview', params: { instanceId: item.id }})
} else {
router.push({pathname: '/(onboarding)/services/appscho/credentials', params: { instanceId: item.id }})
}
});
}}
style={{
paddingHorizontal: 18,
paddingVertical: 14,
borderColor: colors.border,
borderWidth: 1.5,
borderRadius: 80,
borderCurve: "continuous",
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
display: 'flex',
gap: 16,
}}
>
{UNIVERSITY_LOGOS[item.id] ? (
) : (
)}
{item.name}
);
}}
/>
);
}
================================================
FILE: app/(onboarding)/services/appscho/webview.tsx
================================================
import OnboardingWebview from "@/components/onboarding/OnboardingWebview";
import { router, useLocalSearchParams } from "expo-router";
import { INSTANCES, getCASURL, loginWithOAuth } from "appscho";
import { useTranslation } from "react-i18next";
import { useAlert } from "@/ui/components/AlertProvider";
import { useAccountStore } from "@/stores/account";
import { ServiceAccount, Services } from "@/stores/account/types";
import uuid from "@/utils/uuid/uuid";
import { useState } from "react";
export default function AppschoWebView() {
const { instanceId } = useLocalSearchParams<{ instanceId: string }>();
const { t } = useTranslation();
const alert = useAlert();
const [isProcessing, setIsProcessing] = useState(false);
const instance = INSTANCES.find(inst => inst.id === instanceId);
const loginURL = getCASURL(instance?.id as string);
const handleRequest = async (url: string) => {
const urlObj = new URL(url);
const code = urlObj.searchParams.get('code');
if (code && !isProcessing && instance) {
setIsProcessing(true);
try {
const response = await loginWithOAuth(instance.id, code);
const id = uuid();
const service: ServiceAccount = {
id,
auth: {
additionals: {
instanceId: instance.id,
code: code,
refreshToken: response.refreshToken || "",
},
},
serviceId: Services.APPSCHO,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
};
const store = useAccountStore.getState();
store.addAccount({
id,
firstName: response.firstname || t("ONBOARDING_DEFAULT_USER_FIRSTNAME"),
lastName: response.lastname || instance.name,
schoolName: response.program || instance.name,
className: response.department ?? undefined,
services: [service],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
});
store.setLastUsedAccount(id);
return router.push({
pathname: "/(onboarding)/end/color",
params: {
accountId: id,
},
});
} catch (error) {
Error(`OAuth login error: ${error}`);
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_OAUTH_LOGIN_ABORTED"),
icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true,
});
setIsProcessing(false);
}
}
};
return (
${t("ONBOARDING_LOADING")}` },
onShouldStartLoadWithRequest: (request) => {
handleRequest(request.url);
return true;
}
}}
/>
);
}
================================================
FILE: app/(onboarding)/services/ed/_layout.tsx
================================================
import React from 'react';
import { useTranslation } from "react-i18next";
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { Platform } from 'react-native';
import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
);
}
================================================
FILE: app/(onboarding)/services/ed/credentials.tsx
================================================
import { Client, DoubleAuthQuestions, DoubleAuthResult, Require2FA } from "@blockshub/blocksdirecte";
import { useTheme } from "@react-navigation/native";
import { router } from "expo-router";
import React, { useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import {
Alert,
Keyboard,
KeyboardAvoidingView,
Modal,
Platform,
Pressable,
View,
} from "react-native";
import Reanimated, {
FadeInDown,
FadeOutUp,
useSharedValue,
withTiming,
} from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import OnboardingScrollingFlatList from "@/components/onboarding/OnboardingScrollingFlatList";
import { useAccountStore } from "@/stores/account";
import { Account, Services } from "@/stores/account/types";
import { useAlert } from "@/ui/components/AlertProvider";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import { ScrollView } from "react-native-gesture-handler";
import LoginView from "../../components/LoginView";
import { useHeaderHeight } from "@react-navigation/elements";
const ANIMATION_DURATION = 170;
export const PlatformPressable = Platform.OS === 'android' ? Pressable : AnimatedPressable;
export default function EDLoginWithCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const { colors } = theme;
const alert = useAlert();
const { t } = useTranslation();
const [challengeModalVisible, setChallengeModalVisible] = useState(false);
const [doubleAuthChallenge, setDoubleAuthChallenge] = useState(null);
const [session, setSession] = useState(null);
const [token, setToken] = useState();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [isLoggingIn, setIsLoggingIn] = useState(false);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
const handleLogin = async (username: string, password: string, keys?: DoubleAuthResult) => {
const client = new Client();
const device = uuid();
const store = useAccountStore.getState();
try {
const tokens = await client.auth.loginUsername(username, password, keys?.cn, keys?.cv, true, device);
if (tokens) {
client.auth.setAccount(0);
const authentication = client.auth.getAccount();
const account: Account = {
id: device,
firstName: authentication.prenom,
lastName: authentication.nom,
schoolName: authentication.nomEtablissement,
services: [
{
id: device,
auth: {
additionals: {
"username": username,
"token": authentication.accessToken,
"cn": keys?.cn ?? "",
"cv": keys?.cv ?? "",
"deviceUUID": device
}
},
serviceId: Services.ECOLEDIRECTE,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
},
],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
};
store.addAccount(account);
store.setLastUsedAccount(device);
queueMicrotask(() => {
router.push({
pathname: "../end/color",
params: { accountId: device },
});
});
}
} catch (e) {
setIsLoggingIn(false);
if (e instanceof Require2FA) {
const questions = await client.auth.get2FAQuestion(e.token);
setDoubleAuthChallenge(questions);
setSession(client);
setChallengeModalVisible(true);
setToken(e.token);
} else {
Alert.alert(t("Alert_Auth_Error"), t("ONBOARDING_ALERT_LOGIN_ABORTED"));
}
}
}
const loginED = async () => {
if (!username.trim() || !password.trim()) { return; }
setIsLoggingIn(true);
Keyboard.dismiss();
await handleLogin(username, password);
setIsLoggingIn(false);
};
async function handleChallenge(index: number) {
setChallengeModalVisible(false);
if (!session || !doubleAuthChallenge?.propositions?.[index]) { return }
try {
const keys = await session.auth.send2FAQuestion(doubleAuthChallenge.propositions[index], token ?? "");
queueMicrotask(() => void handleLogin(username, password, keys));
} catch {
throw new Error("2FA challenge failed");
}
}
function questionComponent({ item, index }: { item: unknown; index: number }) {
return (
{
handleChallenge(index);
}}
style={{
paddingHorizontal: 10,
paddingVertical: 10,
paddingRight: 18,
borderColor: colors.border,
borderWidth: 1.5,
borderRadius: 80,
flexDirection: "row",
alignItems: "center",
gap: 16,
}}
>
{index + 1}
{String(item)}
);
}
const headerHeight = useHeaderHeight();
const finalHeaderHeight = Platform.select({
android: headerHeight,
default: insets.top
});
return (
{
if (!isLoggingIn && values.username && values.password) {
setUsername(values.username);
setPassword(values.password);
loginED();
}
}}
/>
setChallengeModalVisible(false)}
>
);
}
================================================
FILE: app/(onboarding)/services/lannion/_layout.tsx
================================================
import React from 'react';
import { useTranslation } from "react-i18next";
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { Platform } from 'react-native';
import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
);
}
================================================
FILE: app/(onboarding)/services/lannion/credentials.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { router, useNavigation } from "expo-router";
import React, { useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import {
Alert,
Keyboard,
KeyboardAvoidingView,
Platform,
View,
} from "react-native";
import { ScrollView } from "react-native-gesture-handler";
import {
useSharedValue,
withTiming,
} from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { authenticateWithCredentials, LannionAPI } from "@/services/lannion/module";
import { useAccountStore } from "@/stores/account";
import { Account, Services } from "@/stores/account/types";
import { useSettingsStore } from "@/stores/settings";
import { useAlert } from "@/ui/components/AlertProvider";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import LoginView from "../../components/LoginView";
import { useHeaderHeight } from "@react-navigation/elements";
const ANIMATION_DURATION = 170;
const upperFirst = (str: string) => {
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
}
export default function LannionCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const navigation = useNavigation();
const alert = useAlert();
const { t } = useTranslation();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [isLoggingIn, setIsLoggingIn] = useState(false);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const university = "IUT de Lannion";
const color = "#e0001a";
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
async function handleLogin(password: string, username: string) {
setIsLoggingIn(true);
try {
const store = useAccountStore.getState();
const client = await authenticateWithCredentials(username, password);
const api = new LannionAPI(client);
const relevesResult = await api.getAllReleves();
if (!relevesResult.success || !relevesResult.data || relevesResult.data.length === 0) {
throw new Error(relevesResult.error || "Failed to fetch student data");
}
const firstReleve: any = relevesResult.data[0];
const etudiant = firstReleve.relevé?.etudiant;
const accountUUID = String(uuid());
const studentName = upperFirst(etudiant?.nom) || t("ONBOARDING_UNKNOWN_NAME");
const studentFirstName = upperFirst(etudiant?.prenom) || t("ONBOARDING_UNKNOWN_STUDENT");
const account: Account = {
id: accountUUID,
firstName: studentFirstName,
lastName: studentName,
schoolName: university,
services: [
{
id: uuid(),
auth: {
additionals: {
username: username,
password: password
},
},
serviceId: Services.LANNION,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
};
store.addAccount(account);
store.setLastUsedAccount(accountUUID);
const settingsStore = useSettingsStore.getState();
const disabledTabs = settingsStore.personalization.disabledTabs || [];
const newDisabledTabs = Array.from(new Set([...disabledTabs, "news", "tasks"]));
settingsStore.mutateProperty("personalization", {
disabledTabs: newDisabledTabs
});
setIsLoggingIn(false);
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
return router.push("/");
} catch (error) {
console.error(error);
if (error instanceof Error) {
Alert.alert(t("Alert_Auth_Error"), t("Alert_Auth_Bad_Creds"));
}
setIsLoggingIn(false);
}
}
const headerHeight = useHeaderHeight();
const finalHeaderHeight = Platform.select({
android: headerHeight,
default: insets.top
});
if (Platform.OS === 'android') {
return (
{t("ONBOARDING_LANNION_ANDROID_TITLE")}
{t("ONBOARDING_LANNION_ANDROID_DESCRIPTION")}
router.back()}
/>
)
}
return (
{
if (!isLoggingIn && values.username && values.password) {
handleLogin(values.password, values.username);
}
}}
/>
);
}
================================================
FILE: app/(onboarding)/services/multi/_layout.tsx
================================================
import React from 'react';
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { useLocalSearchParams } from 'expo-router';
import { useTranslation } from "react-i18next";
import { Platform } from 'react-native';
import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
const param = useLocalSearchParams();
return (
);
}
================================================
FILE: app/(onboarding)/services/multi/credentials.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { authWithCredentials } from 'esup-multi.js';
import { router, useLocalSearchParams, useNavigation } from "expo-router";
import React, { useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import {
Keyboard,
KeyboardAvoidingView,
Platform,
ScrollView,
View,
} from "react-native";
import Reanimated, {
useSharedValue,
withTiming,
} from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { useAccountStore } from "@/stores/account";
import { Account, Services } from "@/stores/account/types";
import { useAlert } from "@/ui/components/AlertProvider";
import Button from "@/ui/components/Button";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import LoginView from "../../components/LoginView";
import { useHeaderHeight } from "@react-navigation/elements";
const ANIMATION_DURATION = 170;
export default function MultiLoginWithCredentials() {
const insets = useSafeAreaInsets();
const theme = useTheme();
const navigation = useNavigation();
const alert = useAlert();
const { t } = useTranslation();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [isLoggingIn, setIsLoggingIn] = useState(false);
const opacity = useSharedValue(1);
const scale = useSharedValue(1);
const param = useLocalSearchParams();
console.log(param);
const instanceUrl = String(param.url);
const university = String(param.university);
const color = String(param.color);
const keyboardListeners = useMemo(() => ({
show: () => {
"worklet";
opacity.value = withTiming(0, { duration: ANIMATION_DURATION });
scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });
},
hide: () => {
"worklet";
opacity.value = withTiming(1, { duration: ANIMATION_DURATION });
scale.value = withTiming(1, { duration: ANIMATION_DURATION });
},
}), [opacity]);
useEffect(() => {
const showSub = Keyboard.addListener("keyboardWillShow", keyboardListeners.show);
const hideSub = Keyboard.addListener("keyboardWillHide", keyboardListeners.hide);
return () => {
showSub.remove();
hideSub.remove();
};
}, [keyboardListeners]);
async function handleLogin(password: string, username: string) {
setIsLoggingIn(true);
try {
const store = useAccountStore.getState()
const MultiAccount = await authWithCredentials(instanceUrl, { username, password });
const accountUUID = String(uuid());
const account: Account = {
id: accountUUID,
firstName: MultiAccount?.userData.firstname ?? "",
lastName: MultiAccount?.userData.name ?? "",
schoolName: university,
services: [
{
id: uuid(),
auth: {
refreshToken: MultiAccount.userData.refreshAuthToken,
additionals: { instanceUrl: instanceUrl },
},
serviceId: Services.MULTI,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
store.addAccount(account)
store.setLastUsedAccount(accountUUID)
setIsLoggingIn(false);
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
return router.push("/");
} catch (error) {
if (error instanceof Error) {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("Alert_Auth_Bad_Creds"),
icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true
});
}
setIsLoggingIn(false);
}
}
const headerHeight = useHeaderHeight();
const finalHeaderHeight = Platform.select({
android: headerHeight,
default: insets.top
});
return (
{
if (!isLoggingIn && values.username && values.password) {
handleLogin(values.password, values.username);
}
}}
/>
);
}
================================================
FILE: app/(onboarding)/services/pronote/2fa.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import * as Device from "expo-device"
import { router } from "expo-router";
import { finishLoginManually, SecurityError, securitySave, securitySource, SessionHandle } from "pawnote";
import React, { useCallback, useState } from "react";
import { useTranslation } from "react-i18next";
import { FlatList, View } from "react-native";
import { ScrollView } from "react-native-gesture-handler";
import Reanimated from "react-native-reanimated"
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import { useAlert } from "@/ui/components/AlertProvider";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { PlatformPressable } from "../ed/credentials";
export function Pronote2FAModal({ doubleAuthSession, doubleAuthError, setChallengeModalVisible, deviceId }: { doubleAuthSession: SessionHandle | null, doubleAuthError: SecurityError | null, setChallengeModalVisible: (visible: boolean) => void, deviceId: string }) {
const { t } = useTranslation();
const { colors, dark } = useTheme();
const alert = useAlert();
const [pinCode, setPinCode] = useState("");
const solveDoubleAuth = async (pinCode: string) => {
try {
if (!doubleAuthSession || !doubleAuthError) { return; }
const error = doubleAuthError
const session = doubleAuthSession
const deviceName = Device.deviceName
const source = "Papillon sur " + deviceName
await securitySource(session, source.length > 30 ? "Papillon" : "Papillon sur " + deviceName)
await securitySave(session, error.handle, {
pin: pinCode,
deviceName: source.length > 30 ? "Papillon" : "Papillon sur " + deviceName || "Papillon"
})
const context = error.handle.context;
const refresh = await finishLoginManually(
session,
context.authentication,
context.identity,
context.initialUsername
)
const splittedUsername = session.user.name.split(" ")
const firstName = splittedUsername[splittedUsername.length - 1]
const lastName = splittedUsername.slice(0, splittedUsername.length - 1).join(" ")
const schoolName = session.user.resources[0].establishmentName
const className = session.user.resources[0].className
const account = {
id: deviceId,
firstName,
lastName,
schoolName,
className,
services: [{
id: deviceId,
auth: {
accessToken: refresh.token,
refreshToken: refresh.token,
additionals: {
instanceURL: refresh.url,
kind: refresh.kind,
username: refresh.username,
deviceUUID: deviceId
}
},
serviceId: Services.PRONOTE,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
const store = useAccountStore.getState()
store.addAccount(account)
store.setLastUsedAccount(deviceId)
router.push({
pathname: "../end/color",
params: {
accountId: deviceId
}
});
} catch (error) {
return alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_BAD_CREDENTIALS_PRONOTE"),
icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true
})
}
}
function addPinCodeChar(char: string): void {
if (pinCode.length < 4) {
setPinCode((prev) => prev + char);
}
}
const data = [
{
name: "1",
onPress: () => {
addPinCodeChar("1")
}
},
{
name: "2",
onPress: () => {
addPinCodeChar("2")
}
},
{
name: "3",
onPress: () => {
addPinCodeChar("3")
}
},
{
name: "4",
onPress: () => {
addPinCodeChar("4")
}
},
{
name: "5",
onPress: () => {
addPinCodeChar("5")
}
},
{
name: "6",
onPress: () => {
addPinCodeChar("6")
}
},
{
name: "7",
onPress: () => {
addPinCodeChar("7")
}
},
{
name: "8",
onPress: () => {
addPinCodeChar("8")
}
},
{
name: "9",
onPress: () => {
addPinCodeChar("9")
}
},
{
name: "del",
icon: ,
onPress: () => {
setPinCode((prev) => prev.slice(0, -1));
}
},
{
name: "0",
onPress: () => {
addPinCodeChar("0")
}
},
{
name: "check",
icon: ,
onPress: () => {
solveDoubleAuth(pinCode);
if (!doubleAuthSession || !doubleAuthError || pinCode.length < 4) { return; }
setChallengeModalVisible(false);
}
}
]
const renderItem = useCallback(({ item }: { item: typeof data[0] }) => (
{!item.icon ? ({item.name} ) : (item.icon)}
), [data]);
return (
{t("STEP")} 3
{t("STEP_OUTOF")} 3
{t("ONBOARDING_LOGIN_PINCODE")}
{pinCode.trim() ? pinCode : t("INPUT_PIN")}
)
}
================================================
FILE: app/(onboarding)/services/pronote/_layout.tsx
================================================
import React from 'react';
import { Platform, PlatformColor, View } from 'react-native';
import { useTranslation } from "react-i18next";
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import AndroidHeaderBackground, { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
);
}
================================================
FILE: app/(onboarding)/services/pronote/browser.tsx
================================================
import { useRoute, useTheme } from "@react-navigation/native";
import { router, useNavigation } from "expo-router";
import { AccountKind, createSessionHandle, loginToken, SecurityError, SessionHandle } from "pawnote";
import React, { createRef, RefObject, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Alert, KeyboardAvoidingView, Modal } from "react-native";
import Reanimated, { FadeIn, FadeOut } from "react-native-reanimated";
import WebView from "react-native-webview";
import { WebViewErrorEvent, WebViewMessage, WebViewNavigationEvent } from "react-native-webview/lib/WebViewTypes";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
import Stack from "@/ui/components/Stack";
import Divider from "@/ui/new/Divider";
import Typography from "@/ui/new/Typography";
import { URLToBase64 } from "@/utils/attachments/helper";
import { customFetcher } from "@/utils/pronote/fetcher";
import { GetIdentityFromPronoteUsername } from "@/utils/pronote/name";
import uuid from "@/utils/uuid/uuid";
import OnboardingWebView from "../../components/OnboardingWebView";
import { Pronote2FAModal } from "./2fa";
import Button from "@/ui/new/Button";
export default function PronoteENTLogin() {
const { colors } = useTheme();
const { t } = useTranslation();
const navigation = useNavigation();
const { params } = useRoute();
const { url, school } = params;
const baseURL = url.split("/pronote")[0];
// UI Logic
const [browserVisible, setBrowserVisible] = React.useState(false);
const [hasLoadingBeenTooLong, setHasLoadingBeenTooLong] = useState(false);
const [loadingHidden, setLoadingHidden] = useState(false);
useEffect(() => {
navigation.setOptions({ headerShown: false });
}, []);
useEffect(() => {
if (browserVisible) {
setHasLoadingBeenTooLong(false);
return;
}
const timeout = setTimeout(() => {
setHasLoadingBeenTooLong(true);
}, 15000);
return () => clearTimeout(timeout);
}, [browserVisible]);
const webViewRef: RefObject | null> = createRef();
// Login logic
const infoMobileURL = url + "/InfoMobileApp.json?id=0D264427-EEFC-4810-A9E9-346942A862A4";
const [deviceUUID] = useState(uuid());
const [received, setReceived] = useState(false);
console.log("WebViewScreen initialized with URL:", url);
const [challengeModalVisible, setChallengeModalVisible] = useState(false);
const [doubleAuthError, setDoubleAuthError] = useState(null);
const [doubleAuthSession, setDoubleAuthSession] = useState(null);
const [deviceId, setDeviceId] = useState("");
const [hasShownConnectionErrorAlert, setHasShownConnectionErrorAlert] = useState(false);
const PRONOTE_COOKIE_EXPIRED = new Date(0).toUTCString();
const PRONOTE_COOKIE_VALIDATION_EXPIRES = new Date(
new Date().getTime() + 5 * 60 * 1000,
).toUTCString();
const PRONOTE_COOKIE_LANGUAGE_EXPIRES = new Date(
new Date().getTime() + 365 * 24 * 60 * 60 * 1000,
).toUTCString();
const INJECT_PRONOTE_INITIAL_LOGIN_HOOK = `
window.hookAccesDepuisAppli = function() {
this.passerEnModeValidationAppliMobile('', '${deviceUUID}');
};
try {
window.GInterface.passerEnModeValidationAppliMobile('', '${deviceUUID}', '', '', '{"model": "random", "platform": "android"}');
} catch {}
`.trim();
const INJECT_PRONOTE_JSON = `
(function () {
try {
const json = JSON.parse(document.body.innerText);
const lJetonCas = !!json && !!json.CAS && json.CAS.jetonCAS;
document.cookie = "appliMobile=; expires=${PRONOTE_COOKIE_EXPIRED}"
if (!!lJetonCas) {
document.cookie = "validationAppliMobile=" + lJetonCas + "; expires=${PRONOTE_COOKIE_VALIDATION_EXPIRES}";
document.cookie = "uuidAppliMobile=${deviceUUID}; expires=${PRONOTE_COOKIE_VALIDATION_EXPIRES}";
// 1036 = French
document.cookie = "ielang=1036; expires=${PRONOTE_COOKIE_LANGUAGE_EXPIRES}";
}
console.log(lJetonCas)
window.location.assign("${url}/mobile.eleve.html?fd=1");
}
catch (error) {
console.error("Error parsing JSON or injecting cookies:", error);
}
})();
`.trim();
const INJECT_PRONOTE_CURRENT_LOGIN_STATE = `
(function () {
setInterval(function() {
const state = window && window.loginState ? window.loginState : void 0;
window.ReactNativeWebView.postMessage(JSON.stringify({
type: 'pronote.loginState',
data: state
}));
}, 1000);
})();
`.trim();
const INJECT_PRONOTE_CONNECTION_ERROR_WATCHER = `
(function () {
if (window.__pronoteConnImpossibleWatcherInstalled) return;
window.__pronoteConnImpossibleWatcherInstalled = true;
function hasConnectionError() {
const nodes = document.querySelectorAll('div');
for (let i = 0; i < nodes.length; i += 1) {
const node = nodes[i];
const raw = node && node.textContent ? node.textContent : "";
const text = raw
.normalize("NFD")
.replace(/[\\u0300-\\u036f]/g, "")
.toLowerCase()
.trim();
if (!text) continue;
if (text.includes("connexion impossible") || text.includes("erreur")) {
return true;
}
}
return false;
}
function notifyIfNeeded() {
if (window.__pronoteConnImpossibleSent) return;
if (!hasConnectionError()) return;
window.__pronoteConnImpossibleSent = true;
window.ReactNativeWebView.postMessage(JSON.stringify({
type: 'pronote.connectionError'
}));
}
notifyIfNeeded();
setInterval(notifyIfNeeded, 1000);
const observer = new MutationObserver(notifyIfNeeded);
observer.observe(document.documentElement || document.body, { childList: true, subtree: true, characterData: true });
})();
`.trim();
const onWebviewMessage = async ({ nativeEvent }: { nativeEvent: WebViewMessage }) => {
let message: { type?: string; data?: any };
try {
message = JSON.parse(nativeEvent.data);
} catch {
return;
}
console.log("Message received from WebView:", message);
if (message.type === "pronote.connectionError") {
setBrowserVisible(true);
if (!hasShownConnectionErrorAlert) {
setHasShownConnectionErrorAlert(true);
Alert.alert("Connexion impossible", "La connexion à Pronote est impossible. Cele vient probablement de votre établissement ou d'une erreur de configuration.");
}
return;
}
if (received) { return; }
if (message.type === "pronote.loginState") {
console.log("Login state message received:", message.data);
if (!message.data) {
console.warn("No login data in message");
return;
}
if (message.data.status !== 0) {
console.warn("Login status is not valid:", message.data.status);
return;
}
setReceived(true);
console.log(message.data.login, message.data.mdp);
console.log("Creating session handle...");
const session = createSessionHandle(customFetcher);
try {
const refresh = await loginToken(
session,
{
url: url,
kind: AccountKind.STUDENT,
username: message.data.login,
token: message.data.mdp,
deviceUUID,
},
);
if (!refresh) {
throw new Error("Erreur lors de la connexion");
}
console.log("Login successful, adding account to store...");
const schoolName = session.user.resources[0].establishmentName;
const className = session.user.resources[0].className;
const { firstName, lastName } = GetIdentityFromPronoteUsername(session.user.name)
let pp = "";
if (session.user.resources[0].profilePicture?.url) {
pp = await URLToBase64(session.user.resources[0].profilePicture?.url)
}
useAccountStore.getState().addAccount({
id: deviceUUID,
firstName,
lastName,
schoolName,
className,
customisation: {
profilePicture: pp,
subjects: {}
},
services: [{
id: deviceUUID,
auth: {
accessToken: refresh.token,
refreshToken: refresh.token,
additionals: {
instanceURL: refresh.url,
kind: refresh.kind,
username: refresh.username,
deviceUUID,
},
},
serviceId: Services.PRONOTE,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
}],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString(),
});
useAccountStore.getState().setLastUsedAccount(deviceUUID);
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
return router.push("/");
} catch (error) {
if (error instanceof SecurityError && !error.handle.shouldCustomPassword && !error.handle.shouldCustomDoubleAuth) {
setDoubleAuthError(error)
setDoubleAuthSession(session)
setDeviceId(deviceUUID)
setChallengeModalVisible(true)
} else {
console.error("Error during login:", error);
Alert.alert("Erreur", "Une erreur est survenue lors de la connexion à Pronote. Veuillez réessayer.");
throw error;
}
}
}
};
const onWebviewLoadEnd = (e: WebViewNavigationEvent | WebViewErrorEvent) => {
const { url } = e.nativeEvent;
console.log("WebView finished loading URL:", url);
if (url === infoMobileURL) {
setBrowserVisible(false);
} else {
setBrowserVisible(true);
}
webViewRef.current?.injectJavaScript(
INJECT_PRONOTE_INITIAL_LOGIN_HOOK,
);
if (url.startsWith(baseURL)) {
webViewRef.current?.injectJavaScript(
INJECT_PRONOTE_CONNECTION_ERROR_WATCHER,
);
}
if (url === infoMobileURL) {
console.log("Injecting JSON script for InfoMobileURL");
webViewRef.current?.injectJavaScript(INJECT_PRONOTE_JSON);
} else if (url.includes("mobile.eleve.html")) {
console.log("Injecting login state scripts for student account");
webViewRef.current?.injectJavaScript(
INJECT_PRONOTE_INITIAL_LOGIN_HOOK,
);
webViewRef.current?.injectJavaScript(
INJECT_PRONOTE_CURRENT_LOGIN_STATE,
);
}
};
return (
{!browserVisible && !loadingHidden &&
{t("ONBOARDING_LOGIN_TO")} {school && school.name ? school.name : t("ONBOARDING_YOUR_SCHOOL")}
{t("ONBOARDING_SCHOOLS_SEARCHING_HINT")}
{hasLoadingBeenTooLong && (
setLoadingHidden(true)} />
)}
}
{
webViewRef.current?.stopLoading();
webViewRef.current?.injectJavaScript(`window.location.assign("${evt.nativeEvent.targetUrl}");`); // Yes, this is tricky, but it's in official documentation
}}
injectedJavaScript={`
var meta = document.createElement('meta');
meta.setAttribute('name', 'viewport');
meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');
document.getElementsByTagName('head')[0].appendChild(meta);
`}
/>
setChallengeModalVisible(false)}
>
)
}
================================================
FILE: app/(onboarding)/services/pronote/locate.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useHeaderHeight } from "@react-navigation/elements";
import { useNavigation } from "expo-router";
import React, { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { KeyboardAvoidingView, Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Search from "@/ui/components/Search";
import Stack from "@/ui/components/Stack";
import Divider from "@/ui/new/Divider";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { GeographicSearchCities } from "@/utils/native/georeverse";
const convertPostalCode
= (postalCode: string) => {
if (postalCode.length < 5) {
return "0" + postalCode;
}
return postalCode;
}
export interface School {
name: string,
distance: number,
url: string
}
const PronoteSearchHeader = memo(({
city,
setCity,
loading,
showElse,
t
}: {
city: string,
setCity: (text: string) => void,
loading: boolean,
showElse: boolean,
t: (key: string, options?: any) => string
}) => (
{t("ONBOARDING_SEARCH_TITLE")}
{t("ONBOARDING_PRONOTE_LOCATION_HELP")}
{loading &&
{t("ONBOARDING_SCHOOLS_SEARCHING")}
{t("ONBOARDING_SCHOOLS_SEARCHING_HINT")}
}
));
export default function PronoteLoginMethod() {
const headerHeight = useHeaderHeight();
const insets = useSafeAreaInsets();
const navigation = useNavigation();
const { t } = useTranslation();
const [city, setCity] = useState("");
const [debouncedCity, setDebouncedCity] = useState("");
const [cities, setCities] = useState>([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
const timeout = setTimeout(() => {
setDebouncedCity(city.trim());
}, 350);
return () => {
clearTimeout(timeout);
};
}, [city]);
useEffect(() => {
if(!debouncedCity || debouncedCity.length < 3) {
setCities([]);
setLoading(false);
} else {
let canceled = false;
setLoading(true);
GeographicSearchCities(debouncedCity)
.then((cities) => {
if(canceled) {
return;
}
setCities(cities.sort((a, b) => b.importance - a.importance).splice(0, 10));
})
.finally(() => {
if(canceled) {
return;
}
setLoading(false);
});
return () => {
canceled = true;
};
}
}, [debouncedCity]);
const selectCity = (city: School) => {
navigation.navigate(`select`, { city: city });
}
return (
}
contentContainerStyle={{
padding: 16,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20,
paddingBottom: insets.bottom + 20,
}}
style={{ flex: 1 }}
animated
>
{cities.length === 0 && !loading && (
navigation.navigate("qrcode")}>
{t("ONBOARDING_PRONOTE_LOGIN_QRCODE")}
{t("ONBOARDING_PRONOTE_LOGIN_QRCODE_DESCRIPTION")}
)}
{cities.length === 0 && !loading && (
navigation.navigate("url")}>
{t("ONBOARDING_PRONOTE_LOGIN_URL")}
)}
{cities.map((city, i) => (
{selectCity(city)}}>
{city.city}
{city.context}
{convertPostalCode(city.postalCode.toString())}
))}
)
}
================================================
FILE: app/(onboarding)/services/pronote/qrcode.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import MaskedView from "@react-native-masked-view/masked-view";
import { useTheme } from "@react-navigation/native";
import { CameraView, useCameraPermissions } from "expo-camera";
import * as Haptics from "expo-haptics";
import { router, useGlobalSearchParams } from "expo-router";
import { AuthenticateError, createSessionHandle, loginQrCode, SecurityError } from "pawnote";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { ActivityIndicator, Keyboard, KeyboardAvoidingView, Modal, StyleSheet, TextInput, View } from "react-native";
import Reanimated, { FadeInUp, FadeOutUp, LinearTransition } from "react-native-reanimated";
import { SafeAreaView, useSafeAreaInsets } from "react-native-safe-area-context";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Button from "@/ui/components/Button";
import Icon from "@/ui/components/Icon";
import Typography from "@/ui/components/Typography";
import { URLToBase64 } from "@/utils/attachments/helper";
import { customFetcher } from "@/utils/pronote/fetcher";
import { GetIdentityFromPronoteUsername } from "@/utils/pronote/name";
import uuid from "@/utils/uuid/uuid";
export default function PronoteLoginWithQR() {
const theme = useTheme();
const insets = useSafeAreaInsets();
const { colors } = theme;
const [permission, requestPermission] = useCameraPermissions();
const [scanned, setScanned] = useState(false);
const [keyboardOpen, setKeyboardOpen] = useState(false);
const [QRValidationCode, setQRValidationCode] = useState("");
const [pinModalVisible, setPinModalVisible] = useState(false);
const [loadingModalVisible, setLoadingModalVisible] = useState(false);
const codeInput = React.createRef();
const [QRData, setQRData] = useState(null);
async function loginQR() {
setScanned(false);
setLoadingModalVisible(true);
if (QRValidationCode === "" || QRValidationCode.length !== 4) {
// Handle error
return;
}
const accountID = uuid();
try {
const decodedJSON = JSON.parse(QRData!);
const data = {
jeton: decodedJSON.jeton,
login: decodedJSON.login,
url: decodedJSON.url,
};
const session = createSessionHandle(customFetcher);
const refresh = await loginQrCode(session, {
qr: data,
pin: QRValidationCode,
deviceUUID: accountID
}).catch((error) => {
if (error instanceof SecurityError && !error.handle.shouldCustomPassword && !error.handle.shouldCustomDoubleAuth) {
router.push({
pathname: "/(onboarding)/services/pronote/2fa",
params: {
error: JSON.stringify(error),
session: JSON.stringify(session),
deviceId: accountID
}
});
} else {
throw error;
}
});
if (!refresh) { throw AuthenticateError; }
const user = session.user.resources[0];
const schoolName = user.establishmentName;
const className = user.className;
const { firstName, lastName } = GetIdentityFromPronoteUsername(session.user.name)
let pp = "";
if (session.user.resources[0].profilePicture?.url) {
pp = await URLToBase64(session.user.resources[0].profilePicture?.url)
}
useAccountStore.getState().addAccount({
id: accountID,
firstName,
lastName,
schoolName,
className,
customisation: {
profilePicture: pp,
subjects: {}
},
services: [{
id: accountID,
auth: {
accessToken: refresh.token,
refreshToken: refresh.token,
additionals: {
instanceURL: refresh.url,
kind: refresh.kind,
username: refresh.username,
deviceUUID: accountID
}
},
serviceId: Services.PRONOTE,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
});
useAccountStore.getState().setLastUsedAccount(accountID)
setTimeout(() => {
setLoadingModalVisible(false);
router.push({
pathname: "../end/color",
params: {
accountId: accountID
}
});
}, 1000);
} catch (error) {
console.error(error);
// Handle error
}
}
useEffect(() => {
if (!permission?.granted) {
requestPermission();
}
}, [permission?.granted, requestPermission]);
const handleBarCodeScanned = ({
type,
data,
}: {
type: string;
data: string;
}) => {
setScanned(true);
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
setQRData(data);
setPinModalVisible(true);
};
useEffect(() => {
if (!pinModalVisible) {
setScanned(false);
setQRData(null);
}
}, [pinModalVisible]);
const keyboardDidShow = () => setKeyboardOpen(true);
const keyboardDidHide = () => setKeyboardOpen(false);
useEffect(() => {
const keyboardDidShowListener = Keyboard.addListener("keyboardDidShow", keyboardDidShow);
const keyboardDidHideListener = Keyboard.addListener("keyboardDidHide", keyboardDidHide);
return () => {
keyboardDidShowListener?.remove();
keyboardDidHideListener?.remove();
};
}, []);
const local = useGlobalSearchParams();
const { t } = useTranslation();
return (
{t("ONBOARDING_LOADING_LOGIN")}
{t("ONBOARDING_QRCODE_WAIT")}
{
setLoadingModalVisible(false);
router.back();
}}
/>
{
setPinModalVisible(!pinModalVisible);
}}
>
{t("ONBOARDING_QRCODE_VALIDATION")}
{t("ONBOARDING_PRONOTE_PIN")}
setQRValidationCode(text)}
ref={codeInput}
autoFocus
/>
{
setPinModalVisible(false);
loginQR();
}}
/>
{
setPinModalVisible(false);
}}
/>
{t("ONBOARDING_LOGIN_TO")} PRONOTE
{t("ONBOARDING_SCAN_QRCODE")}
}
>
{permission?.granted && (
)}
{permission?.granted && (
)}
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "black",
},
maskContainer: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "rgba(0, 0, 0, 0.3)",
},
transparentSquare: {
position: "absolute",
width: 300,
height: 300,
backgroundColor: "black",
borderWidth: 2,
borderColor: "#fff",
borderRadius: 30,
borderCurve: "continuous",
alignSelf: "center",
top: "35%",
},
backButton: {
position: 'absolute',
left: 16,
zIndex: 200,
backgroundColor: '#ffffff42',
padding: 10,
borderRadius: 100,
},
transparentSquareBorder: {
position: "absolute",
width: 300,
height: 300,
backgroundColor: "transparent",
borderWidth: 2,
borderColor: "#fff",
borderRadius: 30,
borderCurve: "continuous",
alignSelf: "center",
top: "35%",
},
explainations: {
position: "absolute",
alignItems: "center",
justifyContent: "center",
marginHorizontal: 24,
gap: 4,
zIndex: 9999,
},
title: {
fontSize: 18,
fontWeight: "600",
color: "white",
textAlign: "center",
},
text: {
fontSize: 16,
fontWeight: "400",
color: "white",
textAlign: "center",
opacity: 0.8,
},
});
================================================
FILE: app/(onboarding)/services/pronote/select.tsx
================================================
import { useHeaderHeight } from "@react-navigation/elements";
import { useRoute, useTheme } from "@react-navigation/native";
import { useNavigation } from "expo-router";
import { geolocation } from "pawnote";
import React, { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Image, KeyboardAvoidingView, Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
import { Dynamic } from "@/ui/components/Dynamic";
import Search from "@/ui/components/Search";
import Stack from "@/ui/components/Stack";
import Divider from "@/ui/new/Divider";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
export interface School {
name: string,
distance: number,
url: string
}
const PronoteSearchHeader = memo(({
search,
setSearch,
loading,
t
}: {
search: string,
setSearch: (text: string) => void,
loading: boolean,
t: (key: string, options?: any) => string
}) => (
{t("ONBOARDING_SELECT_SCHOOL")}
{t("ONBOARDING_PRONOTE_LOCATION_HELP")}
{loading &&
{t("ONBOARDING_SCHOOLS_SEARCHING")}
{t("ONBOARDING_SCHOOLS_SEARCHING_HINT")}
}
));
export default function PronoteLoginSelectEtab() {
const headerHeight = useHeaderHeight();
const { colors } = useTheme();
const insets = useSafeAreaInsets();
const navigation = useNavigation();
const { t } = useTranslation();
const { params } = useRoute();
const { city } = params;
const [search, setSearch] = useState("");
const [schools, setSchools] = useState>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
if(!city) {return;}
navigation.setOptions({ headerTitle: t("ONBOARDING_SCHOOLS_IN_CITY", { city: city.city }) });
geolocation({ latitude: city?.latitude ?? 0, longitude: city?.longitude ?? 0 }).then((schoolsFound) => {
setSchools(schoolsFound);
setLoading(false);
});
}, [city, navigation, t]);
const filteredSchools = schools.filter(school => school.name.toLowerCase().includes(search.toLowerCase()));
const selectSchool = (school: School) => {
navigation.navigate("browser", { url: school.url, school });
}
return (
}
contentContainerStyle={{
padding: 16,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20,
paddingBottom: insets.bottom + 20,
}}
style={{ flex: 1 }}
>
{filteredSchools.map((school, i) => (
selectSchool(school)}>
{school.name}
{school.url}
))}
)
}
================================================
FILE: app/(onboarding)/services/pronote/url.tsx
================================================
import { useHeaderHeight } from "@react-navigation/elements";
import { useNavigation } from "expo-router";
import React, { memo } from "react";
import { useTranslation } from "react-i18next";
import { KeyboardAvoidingView } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Search from "@/ui/components/Search";
import Stack from "@/ui/components/Stack";
import Button from "@/ui/new/Button";
import Divider from "@/ui/new/Divider";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
const PronoteSearchHeader = memo(({
}: {
}) => {
const navigation = useNavigation();
const { t } = useTranslation();
const [url, setUrl] = React.useState("");
const submitURL = () => {
if (url.trim().length === 0) {return;}
navigation.navigate("browser", { url });
};
const urlValid = url.trim().length > 0 && (url.startsWith("http://") || url.startsWith("https://"));
return (
{t("ONBOARDING_URL")}
{t("ONBOARDING_PRONOTE_LOCATION_HELP")}
submitURL()} disabled={!urlValid} />
)
});
export default function PronoteLoginURL() {
const headerHeight = useHeaderHeight();
const insets = useSafeAreaInsets();
return (
}
contentContainerStyle={{
padding: 16,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20,
paddingBottom: insets.bottom + 20,
}}
style={{ flex: 1 }}
animated
>
)
}
================================================
FILE: app/(onboarding)/services/skolengo/_layout.tsx
================================================
import React from 'react';
import { useTranslation } from "react-i18next";
import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { Platform } from 'react-native';
import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
);
}
================================================
FILE: app/(onboarding)/services/skolengo/locate.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useHeaderHeight } from "@react-navigation/elements";
import { router, useNavigation } from "expo-router";
import React, { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { KeyboardAvoidingView, Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { SearchSchools } from "skolengojs";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Search from "@/ui/components/Search";
import Stack from "@/ui/components/Stack";
import Divider from "@/ui/new/Divider";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
export interface School {
name: string,
distance: number,
url: string
}
const PronoteSearchHeader = memo(({
city,
setCity,
loading,
showElse,
t
}: {
city: string,
setCity: (text: string) => void,
loading: boolean,
showElse: boolean,
t: (key: string, options?: any) => string
}) => (
{t("ONBOARDING_SEARCH_TITLE")}
{t("ONBOARDING_PRONOTE_LOCATION_HELP")}
{loading &&
{t("ONBOARDING_SCHOOLS_SEARCHING")}
{t("ONBOARDING_SCHOOLS_SEARCHING_HINT")}
}
));
export default function PronoteLoginMethod() {
const headerHeight = useHeaderHeight();
const insets = useSafeAreaInsets();
const navigation = useNavigation();
const { t } = useTranslation();
const [city, setCity] = useState("");
const [debouncedCity, setDebouncedCity] = useState("");
const [schools, setSchools] = useState>([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
const timeout = setTimeout(() => {
setDebouncedCity(city.trim());
}, 350);
return () => {
clearTimeout(timeout);
};
}, [city]);
useEffect(() => {
if(!debouncedCity || debouncedCity.length < 3) {
setSchools([]);
setLoading(false);
} else {
let canceled = false;
setLoading(true);
SearchSchools(debouncedCity, 50)
.then((schools) => {
if(canceled) {
return;
}
console.log(schools);
setSchools(schools);
})
.finally(() => {
if(canceled) {
return;
}
setLoading(false);
});
return () => {
canceled = true;
};
}
}, [debouncedCity]);
const selectSchool = (school: School) => {
router.push(`/(onboarding)/services/skolengo/webview?ref=${JSON.stringify(school)}`);
}
return (
}
contentContainerStyle={{
padding: 16,
flexGrow: 1,
gap: 10,
paddingTop: headerHeight + 20,
paddingBottom: insets.bottom + 20,
}}
style={{ flex: 1 }}
animated
>
{schools.map((school, i) => (
{selectSchool(school)}}>
{school.name}
{school.location.city} ({school.location.zipCode})
))}
)
}
================================================
FILE: app/(onboarding)/services/skolengo/webview.tsx
================================================
import * as Linking from "expo-linking";
import { router, useLocalSearchParams, useNavigation } from "expo-router";
import React, { useCallback, useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { KeyboardAvoidingView } from "react-native";
import { AuthFlow, ChallengeMethod, School } from "skolengojs";
import { useAccountStore } from "@/stores/account";
import { Account, Services } from "@/stores/account/types";
import { log } from "@/utils/logger/logger";
import uuid from "@/utils/uuid/uuid";
import OnboardingWebView from "../../components/OnboardingWebView";
export default function WebViewScreen() {
const navigation = useNavigation();
const [loginURL, setLoginURL] = useState(undefined);
const [flow, setFlow] = useState();
const { ref } = useLocalSearchParams();
const parsedRef = typeof ref === "string" ? JSON.parse(ref) : {};
const school = new School(parsedRef.id, parsedRef.name, parsedRef.emsCode, parsedRef.OIDCWellKnown, parsedRef.location, parsedRef.homepage);
useEffect(() => {
const handleDeepLink = (event: { url: string }) => {
const url = event.url;
const scheme = url.split(":")[0];
if (scheme === "skoapp-prod") {
log("[Skolengo] Activation link received:", url);
handleRequest(url);
} else {
log("[Skolengo] Ignoring link:", url);
}
};
Linking.getInitialURL().then((url) => {
if (url) {
handleDeepLink({ url });
}
});
Linking.addEventListener("url", handleDeepLink);
}, []);
const flowRef = useRef(null);
const initLogin = useCallback(async () => {
const flow = await school.initializeLogin(ChallengeMethod.PLAIN);
flowRef.current = flow;
setFlow(flow);
setLoginURL(flow.loginURL);
}, []);
useEffect(() => {
initLogin();
}, [initLogin]);
const handleRequest = async (url: string) => {
if (url.startsWith("skoapp-prod://")) {
const code = url.match(/code=([^&]*)/)
const state = url.match(/state=([^&]*)/)
if (!code || !state) { return false; }
if (!flowRef.current) {
return false;
}
const auth = await flowRef.current.finalizeLogin(code[1], state[1])
const store = useAccountStore.getState();
const id = uuid()
const account: Account = {
id,
firstName: auth?.firstName ?? "",
lastName: auth?.lastName ?? "",
schoolName: auth?.school.name,
className: auth?.className,
services: [
{
id: id,
auth: {
accessToken: auth.refreshToken,
refreshToken: auth.refreshToken,
additionals: {
refreshUrl: auth.refreshURL,
wellKnown: flowRef.current.endpoints.wellKnown,
tokenEndpoint: flowRef.current.endpoints.tokenEndpoint,
emsCode: flowRef.current.school.emsCode
}
},
serviceId: Services.SKOLENGO,
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
],
createdAt: (new Date()).toISOString(),
updatedAt: (new Date()).toISOString()
}
store.addAccount(account)
store.setLastUsedAccount(id)
const parent = navigation.getParent();
if (parent) {
parent.goBack();
const parentsParent = parent.getParent();
if (parentsParent) {
parentsParent.goBack();
}
}
router.back();
router.dismissAll();
return router.push("/");
}
return true;
};
const { t } = useTranslation();
return (
${t("ONBOARDING_LOADING")}` }}
onShouldStartLoadWithRequest={(request) => {
handleRequest(request.url)
return true;
}}
/>
);
}
================================================
FILE: app/(onboarding)/utils/constants.tsx
================================================
/* eslint-disable @typescript-eslint/no-require-imports */
import { Papicons } from '@getpapillon/papicons';
import { useTheme } from '@react-navigation/native';
import { RelativePathString, UnknownInputParams } from 'expo-router';
import React from 'react';
import { useTranslation } from 'react-i18next';
import { StyleProp, ViewStyle } from 'react-native';
import { Services } from '@/stores/account/types';
import { t } from 'i18next';
export interface SupportedService {
name: string;
route?: string;
title: string;
type: string[];
hasLimitedSupport?: boolean;
image?: NodeRequire;
onPress: () => void;
variant?: string;
color?: string;
icon?: React.ReactNode;
style?: StyleProp;
}
export function GetSupportedServices(redirect: (path: { pathname: string, options?: UnknownInputParams }) => void): SupportedService[] {
const theme = useTheme();
const { colors } = theme;
const { t } = useTranslation()
return [
{
name: "pronote",
route: "pronote",
title: t("ONBOARDING_SERVICE_PRONOTE"),
type: ["school", "univ"],
image: require("@/assets/images/service_pronote.png"),
onPress: () => {
redirect({ pathname: './school/method', options: { service: Services.PRONOTE } });
},
variant: 'service' as const,
color: 'light' as const,
},
{
name: "ed",
route: "ed",
title: t("ONBOARDING_SERVICE_ED"),
type: ["school"],
image: require("@/assets/images/service_ed.png"),
onPress: () => {
redirect({ pathname: './ecoledirecte/credentials', options: { service: Services.ECOLEDIRECTE } });
},
variant: 'service' as const,
color: 'light' as const,
},
{
name: "skolengo",
route: "skolengo",
title: t("ONBOARDING_SERVICE_SKOLENGO"),
type: ["school"],
image: require("@/assets/images/service_skolengo.png"),
onPress: () => {
redirect({ pathname: './school/method', options: { service: Services.SKOLENGO } });
},
variant: 'service' as const,
color: 'light' as const,
},
{
name: "lannion",
route: "lannion",
title: t("ONBOARDING_SERVICE_LANNION"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_lannion.png"),
type: ["univ"],
onPress: () => {
redirect({ pathname: './lannion/credentials' });
},
},
{
name: "univ-lorraine",
title: t("ONBOARDING_SERVICE_UNIV_LORRAINE"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_lorraine.png"),
type: ["univ"],
onPress: () => {
redirect({ pathname: './services/multi/credentials', options: { color: "#000000", university: "ULorraine", url: "https://mobile-back.univ-lorraine.fr" } });
},
},
{
name: "univ-nimes",
title: t("ONBOARDING_SERVICE_UNIV_NIMES"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_nimes.png"),
type: ["univ"],
onPress: () => {
redirect({ pathname: './services/multi/credentials', options: { color: "#FF341B", university: "UNîmes", url: "https://mobile-back.unimes.fr" } });
},
},
{
name: "univ-uphf",
title: t("ONBOARDING_SERVICE_UNIV_UPHF"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_uphf.png"),
type: ["univ"],
onPress: () => {
redirect({ pathname: './services/multi/credentials', options: { color: "#008DB0", university: "UPHF", url: "https://appmob.uphf.fr/backend" } });
},
},
]
}
export interface SupportedUniversity {
name: string;
title: string;
hasLimitedSupport: boolean;
image?: NodeRequire;
type: string;
onPress: () => void;
}
export function GetSupportedUniversities(redirect: (path: { pathname: string, options?: UnknownInputParams }) => void): SupportedUniversity[] {
const { t } = useTranslation();
return [
{
name: "lannion",
title: t("ONBOARDING_SERVICE_LANNION"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_lannion.png"),
type: "main",
onPress: () => {
redirect({ pathname: './lannion/credentials' });
},
},
{
name: "univ-lorraine",
title: t("ONBOARDING_SERVICE_UNIV_LORRAINE"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_lorraine.png"),
type: "main",
onPress: () => {
redirect({ pathname: './services/multi/credentials', options: { color: "#000000", university: "ULorraine", url: "https://mobile-back.univ-lorraine.fr" } });
},
},
{
name: "univ-nimes",
title: t("ONBOARDING_SERVICE_UNIV_NIMES"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_nimes.png"),
type: "main",
onPress: () => {
redirect({ pathname: './services/multi/credentials', options: { color: "#FF341B", university: "UNîmes", url: "https://mobile-back.unimes.fr" } });
},
},
{
name: "univ-uphf",
title: t("ONBOARDING_SERVICE_UNIV_UPHF"),
hasLimitedSupport: false,
image: require("@/assets/images/univ_uphf.png"),
type: "main",
onPress: () => {
redirect({ pathname: './services/multi/credentials', options: { color: "#008DB0", university: "UPHF", url: "https://appmob.uphf.fr/backend" } });
},
},
/*{
name: "limited-functions",
title: t("Feature_Limited"),
hasLimitedSupport: true,
image: require("@/assets/images/univ_lannion.png"),
type: "separator",
onPress: () => { }
},
{
name: "univ-rennes-1",
title: "Université de Rennes 1",
hasLimitedSupport: true,
image: require("@/assets/images/univ_rennes1.png"),
type: "main",
onPress: () => { }
},
{
name: "univ-rennes-2",
title: "Université de Rennes 2",
hasLimitedSupport: true,
image: require("@/assets/images/univ_rennes2.png"),
type: "main",
onPress: () => { }
},
{
name: "univ-limoges",
title: "Université de Limoges",
type: "main",
hasLimitedSupport: true,
image: require("@/assets/images/univ_limoges.png"),
onPress: () => { }
},
{
name: "univ_paris_sorbonne",
title: "Université de Sorbonne Paris Nord",
hasLimitedSupport: true,
image: require("@/assets/images/univ_paris_sorbonne.png"),
type: "main",
onPress: () => { }
} */
]
}
export interface LoginMethod {
id: string,
availableFor: Array,
description: string,
icon: React.ReactNode,
onPress: () => void;
}
export function GetLoginMethods(redirect: (path: { pathname: RelativePathString }) => void): LoginMethod[] {
const { t } = useTranslation();
return [
{
id: "map",
availableFor: [Services.PRONOTE, Services.SKOLENGO],
description: t("ONBOARDING_METHOD_POSITION"),
icon: ,
onPress: async () => {
redirect({ pathname: './map' });
}
},
{
id: "search",
availableFor: [Services.PRONOTE, Services.SKOLENGO],
description: t("ONBOARDING_METHOD_SEARCH"),
icon: ,
onPress: () => {
redirect({ pathname: './search' })
}
},
{
id: "qrcode",
availableFor: [Services.PRONOTE],
description: t("ONBOARDING_METHOD_QRCODE"),
icon: ,
onPress: () => {
redirect({ pathname: "/(onboarding)/pronote/qrcode" });
}
},
{
id: "url",
availableFor: [Services.PRONOTE],
description: t("ONBOARDING_METHOD_LINK"),
icon: ,
onPress: () => {
redirect({ pathname: '../pronote/url' });
}
}
]
}
export interface SupportedRestaurant {
name: string;
title: string;
hasLimitedSupport: boolean;
image: any;
type: string;
onPress: () => void;
}
export function GetSupportedRestaurants(redirect: (path: { pathname: string }) => void): SupportedRestaurant[] {
return [
{
name: "turboself",
title: t("ONBOARDING_SERVICE_TURBOSELF"),
hasLimitedSupport: false,
image: require("@/assets/images/turboself.png"),
type: "main",
onPress: () => {
redirect({ pathname: '/(onboarding)/restaurants/turboself' });
}
},/*
{
name: "ard",
title: t("ONBOARDING_SERVICE_ARD"),
hasLimitedSupport: false,
image: require("@/assets/images/ard.png"),
type: "main",
onPress: () => {
redirect({ pathname: '/(onboarding)/restaurants/ard' });
}
},*/
{
name: "izly",
title: t("ONBOARDING_SERVICE_IZLY"),
hasLimitedSupport: false,
image: require("@/assets/images/izly.png"),
type: "main",
onPress: () => {
redirect({ pathname: '/(onboarding)/restaurants/izly' });
}
},
{
name: "alise",
title: t("ONBOARDING_SERVICE_ALISE"),
hasLimitedSupport: false,
image: require("@/assets/images/alise.jpg"),
type: "main",
onPress: () => {
redirect({ pathname: '/(onboarding)/restaurants/alise' });
}
}
]
}
================================================
FILE: app/(onboarding)/utils/fetchSchools.ts
================================================
import { geolocation } from "pawnote";
import { School as SkolengoSkool,SearchSchools } from "skolengojs";
import { t } from "i18next";
import { Services } from "@/stores/account/types";
import { useAlert } from "@/ui/components/AlertProvider";
import { GeographicQuerying, GeographicReverse } from "@/utils/native/georeverse";
import { calculateDistanceBetweenPositions, getCurrentPosition } from "@/utils/native/position";
export interface School {
name: string,
distance: number,
url: string,
ref?: SkolengoSkool
}
export async function fetchSchools(service: Services, alert: ReturnType, city?: string): Promise {
let pos = null;
if (!city) {
pos = await getCurrentPosition();
if (pos === null) {
alert.showAlert({
title: t("Alert_No_Pos"),
description: t("ONBOARDING_ALERT_NO_POSITION_DESCRIPTION"),
icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true,
});
}
}
if (city && service !== Services.SKOLENGO) {
pos = await GeographicQuerying(city);
}
if (service === Services.PRONOTE) {
const schools = await geolocation({ latitude: pos?.latitude ?? 0, longitude: pos?.longitude ?? 0 });
return schools.map(item => ({
name: item.name,
distance: item.distance / 10,
url: item.url,
}));
}
if (service === Services.SKOLENGO) {
let cityName: string | undefined;
if (city) {
cityName = city;
}
else if (pos?.latitude && pos?.longitude) {
cityName = (await GeographicReverse(pos.latitude, pos.longitude)).city;
}
else {
return [];
}
const schools = await SearchSchools(cityName, 50);
const list: School[] = [];
for (const school of schools) {
let distance = 0;
if (pos?.latitude && pos?.longitude) {
if (school.location.addressLine?.trim() && school.location.city?.trim() && school.location.zipCode?.trim()) {
const position = await GeographicQuerying(
`${school.location.addressLine} ${school.location.city} ${school.location.zipCode}`
);
distance = calculateDistanceBetweenPositions(
pos.latitude,
pos.longitude,
position.longitude,
position.latitude
);
}
}
list.push({
name: school.name,
distance: distance / 1000,
url: "",
ref: school,
});
}
return list;
}
return [];
}
type SchoolItem = {
title: string,
description: string,
initials: string,
distance: number,
onPress: () => void
}
================================================
FILE: app/(onboarding)/welcome.tsx
================================================
import { useFocusEffect, useIsFocused, useTheme } from "@react-navigation/native";
import { useRouter } from "expo-router";
import * as WebBrowser from 'expo-web-browser';
import React from "react";
import { Image, StatusBar, View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Reanimated, { FadeIn, FadeOut } from "react-native-reanimated";
import Stack from "@/ui/components/Stack";
import Button from "@/ui/new/Button";
import Divider from "@/ui/new/Divider";
import PapillonLogo from "@/ui/new/symbols/PapillonLogo";
import Typography from "@/ui/new/Typography";
import { useVideoPlayer, VideoView } from "expo-video";
import { LinearGradient } from "expo-linear-gradient";
import { useTranslation } from "react-i18next";
export default function Welcome() {
const insets = useSafeAreaInsets();
const { colors } = useTheme();
const router = useRouter();
const { t } = useTranslation();
const openHelpWebPage = () => {
WebBrowser.openBrowserAsync("https://docs.papillon.bzh/support", {
presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET
});
}
const openLegalWebPage = () => {
WebBrowser.openBrowserAsync("https://docs.papillon.bzh/terms", {
presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET
});
}
const openDevMenu = () => {
router.push("/devmode");
}
const player = useVideoPlayer({
assetId: require('@/assets/video/welcome.mp4'),
}, player => {
player.loop = true;
player.muted = true;
player.volume = 0;
player.showNowPlayingNotification = false;
player.playbackRate = 0.5;
player.audioMixingMode = "mixWithOthers";
player.play();
});
const isFocused = useIsFocused();
useFocusEffect(
React.useCallback(() => {
if (isFocused) {
player.play();
}
}, [isFocused])
);
return (
{isFocused &&
}
{isFocused &&
}
{t("ONBOARDING_WELCOME_DESCRIPTION")}
}
onPress={() => {
router.push("./ageSelection")
}}
fullWidth
/>
{ openHelpWebPage() }}
fullWidth
variant="secondary"
color="#FFFFFF"
/>
{ openLegalWebPage() }} onLongPress={() => { openDevMenu() }}>
{t("ONBOARDING_WELCOME_LEGAL")}
);
}
================================================
FILE: app/(settings)/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { Platform, StatusBar } from "react-native";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { t } from "i18next";
import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
export default function Layout() {
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
headerLargeTitle: false,
headerTransparent: runsIOS26,
headerShadowVisible: false,
headerBackground: AndroidHeaderBackground
}), []);
return (
<>
{Platform.OS === "ios" && }
>
);
}
================================================
FILE: app/(settings)/about.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { useRouter } from "expo-router";
import { Github, Languages, Users } from "lucide-react-native";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Alert, Linking } from "react-native";
import SettingsHeader from "@/components/SettingsHeader";
import packageJson from "@/package.json";
import { useSettingsStore } from "@/stores/settings";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { getInitials } from "@/utils/chats/initials";
import { useSafeAreaInsets } from "react-native-safe-area-context";
export const Team = [
{
title: "Vince Linise",
description: "Président",
login: "ecnivtwelve",
leading: (
),
onPress: () => Linking.openURL("https://www.linkedin.com/in/vincelinise/"),
},
{
title: "Lucas Lavajo",
description: "Vice-Président",
login: "tryon-dev",
leading: (
),
onPress: () => Linking.openURL("https://www.linkedin.com/in/lucas-lavajo/"),
},
{
title: "Raphaël Schröder",
description: "Développeur back-end",
login: "raphckrman",
leading: (
),
onPress: () => Linking.openURL("https://www.linkedin.com/in/raphckrman/"),
},
{
title: "Tom Hélière",
login: "tom-things",
description: "Designer UI/UX",
leading: (
),
onPress: () => Linking.openURL("https://www.linkedin.com/in/tom-heliere/"),
},
{
title: "Rémy Godet",
description: "Développeur",
login: "godetremy",
leading: (
),
onPress: () => Linking.openURL("https://www.linkedin.com/in/godetremy/"),
},
{
title: "Mael Duret",
description: "Développeur",
login: "ryzenixx",
leading: (
),
onPress: () => Linking.openURL("https://www.linkedin.com/in/mael-duret/"),
},
];
export default function SettingsAbout() {
const theme = useTheme();
const router = useRouter();
const { t } = useTranslation();
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const CommunityLinks = [
{
title: t("Settings_Donator"),
description: t("Settings_Donator_Description"),
leading: ,
onPress: () =>
Linking.openURL("https://ko-fi.com/thepapillonapp/leaderboard"),
},
{
title: t("Settings_About_Discord"),
description: t("Settings_About_Discord_Description"),
leading: ,
onPress: () => Linking.openURL("https://go.papillon.bzh/discord"),
},
{
title: t("Settings_About_Issue"),
description: t("Settings_About_Issue_Description"),
leading: ,
onPress: () =>
Linking.openURL("https://github.com/PapillonApp/Papillon/issues"),
},
];
const DeveloperLinks = [
{
title: t("Settings_About_Crowdin"),
description: t("Settings_About_Crowdin_Description"),
leading: ,
onPress: () => Linking.openURL("https://crowdin.com/project/papillonapp"),
},
{
title: t("Settings_About_Github"),
description: t("Settings_About_Github_Description"),
leading: ,
onPress: () => Linking.openURL("https://github.com/PapillonApp/Papillon"),
},
{
title: t("Settings_About_Contributors"),
description: t("Settings_About_Contributors_Description"),
leading: ,
onPress: () => router.push("/(settings)/contributors"),
},
];
const [tapCount, setTapCount] = useState(0);
const handleVersionTap = () => {
setTapCount(prev => prev + 1);
if (tapCount + 1 >= 8) {
setTapCount(0);
if (settingsStore.showDevMode) {
Alert.alert("Dev Mode", "Dev mode désactivé!");
mutateProperty("personalization", { showDevMode: false });
} else {
Alert.alert("Dev Mode", "Dev mode activé!");
mutateProperty("personalization", { showDevMode: true });
}
}
};
const Infos = [
{
title: t("Settings_App_Version"),
description: packageJson.version,
leading: ,
onPress: handleVersionTap,
},
{
title: t("Settings_About_Dependency_Version"),
description: `Expo: ${packageJson.dependencies?.expo || "N/A"} | RN: ${packageJson.dependencies?.["react-native"] || "N/A"}`,
leading: ,
},
];
const insets = useSafeAreaInsets();
return (
{Team.map((item, index) => (
{item.leading}
{item.title}
{item.description}
))}
{CommunityLinks.map((item, index) => (
{item.leading}
{item.title}
{item.description}
))}
{DeveloperLinks.map((item, index) => (
{item.leading}
{item.title}
{item.description}
))}
{Infos.map((item, index) => (
{item.leading}
{item.title}
{item.description}
))}
);
}
================================================
FILE: app/(settings)/accounts.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { MenuView, NativeActionEvent } from "@react-native-menu/menu";
import { router } from "expo-router";
import React from "react";
import { Alert, Image, ScrollView } from "react-native";
import { removeBalanceFromDatabase } from "@/database/useBalance";
import { getManager } from "@/services/shared";
import { useAccountStore } from "@/stores/account";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { getInitials } from "@/utils/chats/initials";
import { formatSchoolName } from "@/utils/format/formatSchoolName";
import { getServiceLogo, getServiceName } from "@/utils/services/helper";
import ActionMenu from "@/ui/components/ActionMenu";
export default function AccountsView() {
const accounts = useAccountStore(state => state.accounts);
const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const account = accounts.find(a => a.id === lastUsedAccount);
const store = useAccountStore.getState();
const services = account?.services;
const askDeleteAccount = (targetAccount: (typeof accounts)[number]) => {
Alert.alert(
"Supprimer le compte",
`${targetAccount.firstName} ${targetAccount.lastName}`,
[
{
text: "Annuler",
style: "cancel",
},
{
text: "Supprimer",
style: "destructive",
onPress: () => {
store.removeAccount(targetAccount);
},
},
]
);
};
const askDeleteService = (serviceId: string, serviceName: string) => {
Alert.alert(serviceName, "Supprimer ce service ?", [
{
text: "Annuler",
style: "cancel",
},
{
text: "Supprimer",
style: "destructive",
onPress: () => {
store.removeServiceFromAccount(serviceId);
removeBalanceFromDatabase(serviceId);
const manager = getManager();
if (manager) {
manager.removeService(serviceId);
}
},
},
]);
};
return (
Profils utilisateur
{accounts.map(account => (
{account.firstName} {account.lastName}
{account.className ? account.className + " " : ""}
{formatSchoolName(account.schoolName ?? "")}
{
if (event.nativeEvent.event === "delete") {
askDeleteAccount(account);
}
}}
>
))}
router.push({
pathname: "/(onboarding)/ageSelection",
params: { action: "addService" },
})
}
>
Nouveau compte
Services et cartes
{services?.map(service => (
{getServiceName(service.serviceId)}
Connecté le{" "}
{new Date(service.createdAt).toLocaleDateString(undefined, {
day: "2-digit",
month: "short",
year: "numeric",
})}
{
if (event.nativeEvent.event === "delete") {
askDeleteService(
service.id,
getServiceName(service.serviceId)
);
}
}}
>
))}
router.navigate({
pathname: "/(onboarding)/restaurants/method",
})
}
>
Ajouter un nouveau service
);
}
================================================
FILE: app/(settings)/cards.tsx
================================================
/* eslint-disable @typescript-eslint/no-require-imports */
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { useRouter } from "expo-router";
import { Alert, Image, ScrollView, View } from "react-native";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Button from "@/ui/components/Button";
import Icon from "@/ui/components/Icon";
import Item, { Leading, Trailing } from "@/ui/components/Item";
import List from "@/ui/components/List";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import SettingsHeader from "@/components/SettingsHeader";
import { getServiceBackground, getServiceName, isSelfModuleEnabledED } from "@/utils/services/helper";
import { useTranslation } from "react-i18next";
import { removeBalanceFromDatabase } from "@/database/useBalance";
import { getManager } from "@/services/shared";
import i18n from "@/utils/i18n";
export default function CardView() {
const router = useRouter();
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
const selfCompatible = account?.services.filter(
service => {
if (service.serviceId === Services.ECOLEDIRECTE) {
return isSelfModuleEnabledED(service.additionals);
}
return [Services.TURBOSELF, Services.ARD, Services.IZLY].includes(service.serviceId);
},
);
const theme = useTheme();
const { colors } = theme;
const { t } = useTranslation();
return (
{(selfCompatible ?? []).length > 0 ? (
<>
Mes cartes
{selfCompatible?.map(service => {
return (
- {
if (service.serviceId === Services.ECOLEDIRECTE) {
Alert.alert("Tu ne peux pas supprimer cette carte", "Cette carte est liée à ton service scolaire.");
return;
}
Alert.alert(getServiceName(service.serviceId), "Que souhaitez-vous faire ?", [
{
text: "Supprimer",
style: "destructive",
onPress: () => {
useAccountStore.getState().removeServiceFromAccount(service.id);
removeBalanceFromDatabase(service.id)
const manager = getManager()
if (manager) {
manager.removeService(service.id)
}
},
},
{
text: "Annuler",
style: "cancel",
},
]);
}}
>
{getServiceName(service.serviceId)}
Ajoutée
le {new Date(service.createdAt).toLocaleDateString(i18n.language, {
day: "2-digit",
month: "2-digit",
})}
);
})}
}
onPress={() => {
router.push({
pathname: "/(onboarding)/restaurants/method",
params: {
action: "addService",
},
});
}}
/>
{t("Feature_Add_Card")}
>
) : (
{t("Settings_Cards_None_Title")}
{t("Settings_Cards_None_Description")}
}
onPress={() => {
router.push({
pathname: "/(onboarding)/restaurants/method",
params: {
action: "addService",
},
});
}}
/>
)
}
);
}
================================================
FILE: app/(settings)/contributors.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import React, { useEffect, useMemo, useState } from "react";
import { Linking } from "react-native";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { getInitials } from "@/utils/chats/initials";
import { Contributor, getContributors } from "@/utils/github/contributors";
const TEAM_LOGINS = [
"ecnivtwelve",
"tryon-dev",
"raphckrman",
"tom-things",
"godetremy",
"ryzenixx",
];
export default function SettingsContributors() {
const [contributors, setContributors] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
getContributors()
.then(allContributors => {
setContributors(
allContributors.filter(
contributor => !TEAM_LOGINS.includes(contributor.login)
)
);
})
.finally(() => {
setIsLoading(false);
});
}, []);
const contributorItems = useMemo(
() =>
contributors.map(item => (
Linking.openURL(item.html_url)}
>
{item.login}
{item.contributions}{" "}
{item.contributions > 1 ? "contributions" : "contribution"}
)),
[contributors]
);
return (
{isLoading && (
Chargement des contributeurs...
)}
{!isLoading && contributorItems}
);
}
================================================
FILE: app/(settings)/edit_subject.tsx
================================================
import Stack from "@/ui/components/Stack";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import Typography from "@/ui/components/Typography";
import { CompactGrade } from "@/ui/components/CompactGrade";
import {
Dimensions,
ScrollView,
View,
Platform,
Modal,
} from "react-native";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { Colors } from "@/utils/subjects/colors";
import { memo, ReactNode, useCallback, useMemo, useRef, useState } from "react";
import { router, useLocalSearchParams } from "expo-router";
import { useAccountStore } from "@/stores/account";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
import ChipButton from "@/ui/components/ChipButton";
import TabHeader from "@/ui/components/TabHeader";
import { useTranslation } from "react-i18next";
import Button from "@/ui/new/Button";
import { UnicodeEmojis } from "@/constants/UnicodeEmojis";
import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated";
import { LinearGradient } from "expo-linear-gradient";
import { PapillonZoomIn, PapillonZoomOut } from "@/ui/utils/Transition";
import { ListTouchable } from "@/ui/new/List";
import { LegendList, LegendListRef } from "@legendapp/list";
import { FlashList } from "@shopify/flash-list";
const EmojiItem = memo(({ item, onPress, isSelected }: {item: string, onPress: (emoji: string) => void, isSelected: boolean}) => {
const theme = useTheme();
return (
onPress(item)}
style={{
flex: 1,
alignItems: "center",
justifyContent: "center",
}}
>
{item}
);
});
function EmojiPicker({
onCancel,
onSelect,
}: {
onCancel: () => void;
onSelect: (emoji: string) => void;
}): ReactNode {
const theme = useTheme();
const { t } = useTranslation();
const insets = useSafeAreaInsets();
const flatListRef = useRef(null);
const scale = useSharedValue(1);
const emojis = useMemo(() => {
return Object.keys(UnicodeEmojis)
.map(key => {
const value = UnicodeEmojis[key];
const uniqueCodes = [...new Set(value.emojis)];
return uniqueCodes.length > 0
? {
title: value.icon,
data: uniqueCodes,
}
: null;
})
.filter(v => v !== null);
}, []);
const flatEmojis = useMemo(() => {
return emojis.flatMap(section =>
section.data.map(item => String.fromCodePoint(item))
);
}, [emojis]);
const handleSelect = useCallback(item => {
setSelectedEmoji(item);
}, []);
const [headerHeight, setHeaderHeight] = useState(0);
const [selectedEmoji, setSelectedEmoji] = useState("😀");
const emojiContainerStyle = {
height: 180,
alignItems: "center",
justifyContent: "center",
};
const [selectedTab, setSelectedTab] = useState(emojis[0].title);
const selectTab = (tab) => {
setSelectedTab(tab);
const section = emojis.find(s => s.title === tab);
if (section) {
const index = emojis
.slice(0, emojis.indexOf(section))
.reduce((acc, curr) => acc + curr.data.length, 0);
flatListRef.current?.scrollToOffset({ offset: index * 56, animated: false });
}
}
return (
}
trailing={ }
/>
{selectedEmoji}
{emojis.map((value, index) => (
selectTab(value.title)}
>
{
selectTab(value.title);
}}
>
))}
item + index}
showsVerticalScrollIndicator={false}
contentContainerStyle={{
padding: 5,
paddingBottom: 80,
}}
renderItem={({ item }) => (
)}
/>
onSelect(selectedEmoji)}
/>
);
}
export default function EditSubject() {
const { colors } = useTheme();
const insets = useSafeAreaInsets();
const params = useLocalSearchParams();
const [selectedName, setSelectedName] = useState(String(params.name));
const [selectedColor, setSelectedColor] = useState(Colors.find(c => c === String(params.color)) || Colors[0]);
const [selectedEmoji, setSelectedEmoji] = useState(String(params.emoji));
const [showEmojiPicker, setShowEmojiPicker] = useState(false);
const AvailableEmojis = [
"📖",
"🧮",
"🌍",
"🎨",
"⚽",
"🎵",
"🧪",
"custom",
];
return (
{
router.back();
}}
>
Modifier la matière
{
const store = useAccountStore.getState();
store.setSubjectName(String(params.id), selectedName);
store.setSubjectEmoji(String(params.id), selectedEmoji);
store.setSubjectColor(String(params.id), selectedColor);
router.back();
}}
>
Nom de la matière
Couleur
{Colors.map(color => (
setSelectedColor(color)}
>
{selectedColor === color && (
)}
))}
Emoji
{!AvailableEmojis.includes(selectedEmoji) && (
{selectedEmoji}
)}
{AvailableEmojis.map(emoji => (
{
if (emoji === "custom") {
setShowEmojiPicker(true);
} else {
setSelectedEmoji(emoji);
}
}}
>
{emoji === "custom" ? (
) : (
{emoji}
)}
))}
setShowEmojiPicker(false)}
>
setShowEmojiPicker(false)}
onSelect={emoji => {
setSelectedEmoji(emoji);
setShowEmojiPicker(false);
}}
/>
);
};
================================================
FILE: app/(settings)/language.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import React from "react";
import { useTranslation } from "react-i18next";
import { Alert, Platform } from "react-native";
import { useSettingsStore } from "@/stores/settings";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { resources } from "@/utils/i18n";
const LanguagePersonalization = () => {
const { i18n } = useTranslation();
const { colors } = useTheme();
const settingStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const languages = Object.keys(resources).map(key => ({
id: key,
name: resources[key].label,
emoji: resources[key].emoji,
}));
const rtlLanguages = ["ar", "he", "fa", "ur"];
const setLanguage = (lang: string) => {
requestAnimationFrame(() => {
if (rtlLanguages.includes(lang)) {
Alert.alert(
"Inverted layout is not supported yet",
"The selected language may not be displayed correctly."
);
}
setTimeout(() => {
i18n.changeLanguage(lang);
mutateProperty("personalization", { ...settingStore, language: lang });
}, 90);
});
};
return (
{languages.map(lang => {
const isSelected = i18n.language === lang.id;
return (
{
setLanguage(lang.id);
}}
>
{lang.emoji}
{lang.name}
{isSelected && (
)}
);
})}
);
};
export default LanguagePersonalization;
================================================
FILE: app/(settings)/magic.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React, { useEffect, useState } from "react";
import { Alert } from "react-native";
import SettingsHeader from "@/components/SettingsHeader";
import packageJson from "@/package.json";
import { useSettingsStore } from "@/stores/settings";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { MAGIC_URL } from "@/utils/endpoints";
import { log } from "@/utils/logger/logger";
import ModelManager from "@/utils/magic/ModelManager";
import { checkAndUpdateModel, getCurrentPtr } from "@/utils/magic/updater";
function getMagicURL(): string {
return useSettingsStore.getState().personalization.magicModelURL || MAGIC_URL;
}
export default function SettingsMagic() {
const theme = useTheme();
const { colors } = theme;
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const [modelStatus, setModelStatus] = useState(null);
const [currentPtr, setCurrentPtr] = useState(null);
const [isUpdating, setIsUpdating] = useState(false);
const [lastUpdateCheck, setLastUpdateCheck] = useState(null);
useEffect(() => {
const updateStatus = async () => {
const status = ModelManager.getStatus();
setModelStatus(status);
try {
const ptr = await getCurrentPtr();
setCurrentPtr(ptr);
} catch (error) {
log("Erreur lors de la récupération du pointeur: " + error);
}
};
updateStatus();
}, []);
const refreshStatus = async () => {
const status = ModelManager.getStatus();
setModelStatus(status);
try {
const ptr = await getCurrentPtr();
setCurrentPtr(ptr);
} catch (error) {
log("Erreur lors de la récupération du pointeur: " + error);
}
};
const showDetailedStatus = () => {
if (!modelStatus) {
return;
}
log(
"Statut détaillé du modèle:" +
JSON.stringify({
hasModel: modelStatus.hasModel,
modelType: modelStatus.modelType,
hasInitialized: modelStatus.hasInitialized,
isInitializing: modelStatus.isInitializing,
maxLen: modelStatus.maxLen,
batchSize: modelStatus.batchSize,
labelsCount: modelStatus.labelsCount,
wordIndexSize: modelStatus.wordIndexSize,
oovIndex: modelStatus.oovIndex,
tokenizerInfo: modelStatus.tokenizerInfo,
})
);
};
const checkForUpdates = async () => {
if (isUpdating) {
return;
}
setIsUpdating(true);
setLastUpdateCheck(new Date());
try {
const result = await checkAndUpdateModel(
packageJson.version,
getMagicURL()
);
if (result.updated) {
await ModelManager.safeInit();
refreshStatus();
}
} catch (error) {
log("Erreur lors de la vérification:" + error);
} finally {
setIsUpdating(false);
}
};
const resetModel = async () => {
try {
const result = await ModelManager.reset();
if (result.success) {
refreshStatus();
}
} catch (error) {
log("Erreur lors de la réinitialisation:" + error);
}
};
return (
{
if (settingsStore.magicEnabled && !isSwitchOn) {
Alert.alert(
"Désactivation de Magic+",
"Papillon Magic+ sera désactivé au prochain redémarrage",
[{ text: "OK", style: "default" }]
);
}
mutateProperty("personalization", {
magicEnabled: !settingsStore.magicEnabled,
});
setTimeout(refreshStatus, 100);
}}
switchValue={settingsStore.magicEnabled}
showSwitch={true}
switchColor={"#DD007D"}
/>
{settingsStore.magicEnabled && (
Statut du modèle
{modelStatus?.hasModel ? "Chargé" : "Non chargé"}
Modèle actuel
{currentPtr
? `${currentPtr.name} v${currentPtr.version}`
: "Aucun"}
)}
{settingsStore.magicEnabled && (
Vérifier les mises à jour
Réinitialiser le modèle
)}
{t("Settings_MagicPlus_ExplanationLocal")}
);
}
================================================
FILE: app/(settings)/personalization.tsx
================================================
import { Alert, Platform, ScrollView, Switch } from "react-native";
import Stack from "@/ui/components/Stack";
import { EarthIcon } from "lucide-react-native";
import React, { useEffect } from "react";
import Typography from "@/ui/new/Typography";
import Icon from "@/ui/components/Icon";
import { Papicons, PapillonApp } from "@getpapillon/papicons";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import { useTheme } from "@react-navigation/native";
import AppColorsSelector from "@/components/AppColorsSelector";
import { AppColors } from "@/utils/colors";
import LinearGradient from "react-native-linear-gradient";
import adjust from "@/utils/adjustColor";
import { useAccountStore } from "@/stores/account";
import { DEFAULT_MATERIAL_YOU_ENABLED, useSettingsStore } from "@/stores/settings";
import { useTranslation } from "react-i18next";
import { router } from "expo-router";
import { useHeaderHeight } from "@react-navigation/elements";
import { Dynamic } from "@/ui/components/Dynamic";
import { FadeIn, FadeOut } from "react-native-reanimated";
import List from "@/ui/new/List";
import NativeSwitch from "@/ui/native/NativeSwitch";
const PersonalizationSettings = () => {
const theme = useTheme();
const { t } = useTranslation()
const store = useAccountStore.getState();
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const useMaterialYou = settingsStore.useMaterialYou ?? DEFAULT_MATERIAL_YOU_ENABLED;
const defaultColorData = AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0];
const [selectedColor, setSelectedColor] = React.useState(defaultColorData.mainColor);
const [selectedTheme, setSelectedTheme] = React.useState<"light" | "dark" | "auto">("auto");
const height = useHeaderHeight()
useEffect(() => {
if (settingsStore.theme) {
setSelectedTheme(settingsStore.theme);
}
}, []);
useEffect(() => {
mutateProperty('personalization', { theme: selectedTheme });
}, [selectedTheme]);
return (
<>
{!useMaterialYou &&
Choix de la couleur
{
setSelectedColor(color);
setTimeout(() => {
const colorData = AppColors.find(appColor => appColor.mainColor === color);
if (colorData) {
mutateProperty('personalization', {
colorSelected: colorData.colorEnum
});
}
}, 50);
}}
accountId={store.lastUsedAccount}
/>
}
Options du thème
{Platform.OS === "android" && Platform.Version >= 31 && (
{t("Global_Recommended")}
{t("Settings_Personalization_MaterialYou_Title")}
{t("Settings_Personalization_MaterialYou_Description")}
{
mutateProperty("personalization", { useMaterialYou: value });
}}
disabled={typeof Platform.Version !== "number" || Platform.Version < 31}
/>
)}
{t("Settings_Personalization_Theme")}
setSelectedTheme("light")}
style={{ overflow: "hidden", height: "100%" }}
>
setSelectedTheme("dark")}
style={{ overflow: "hidden", height: "100%" }}
>
setSelectedTheme("auto")}
style={{ overflow: "hidden", height: "100%" }}
>
Auto
Options des matières
{
router.push("/(settings)/subject_personalization");
}}
>
{t("Settings_Personalization_Subject_Title")}
{t("Settings_Personalization_Subject_Description")}
Options de l'application
{
router.push("/(settings)/tabs");
}}
>
{t("Settings_Tabs_Title")}
{t("Settings_Tabs_Description")}
{
router.push("/(settings)/language");
}}
>
{t("Settings_Language_Title")}
{t("Settings_Language_Description")}
>
)
};
export default PersonalizationSettings;
================================================
FILE: app/(settings)/services.tsx
================================================
import { UserX2Icon } from "lucide-react-native";
import React from "react";
import { ScrollView } from "react-native";
import { useTranslation } from "react-i18next";
import { useAccountStore } from "@/stores/account";
import Icon from "@/ui/components/Icon";
import Item from "@/ui/components/Item";
import List from "@/ui/components/List";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
export default function SettingsServices() {
const accountStore = useAccountStore();
const { t } = useTranslation();
return (
{accountStore.lastUsedAccount && (
-
{t('Settings_Services_Title_LastAccountUsed')}
{accountStore.lastUsedAccount}
)}
{accountStore.accounts.length === 0 && (
Aucun compte lié
Ajoute un compte en appuyant sur le bouton ci-dessus.
)}
);
}
================================================
FILE: app/(settings)/settings.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useTheme } from "@react-navigation/native";
import { LinearGradient } from 'expo-linear-gradient';
import { useNavigation, useRouter } from "expo-router";
import * as WebBrowser from "expo-web-browser";
import { t } from "i18next";
import { BusIcon, HeartIcon, InfoIcon } from "lucide-react-native";
import React, { useCallback, useMemo } from "react";
import { Alert, Image, Platform, Pressable, View } from "react-native";
import { ClearDatabaseForAccount } from "@/database/DatabaseProvider";
import { useAccountStore } from "@/stores/account";
import { useSettingsStore } from "@/stores/settings";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
import { NativeHeaderSide } from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
import TypographyLegacy from "@/ui/components/Typography";
import adjust from "@/utils/adjustColor";
import { getInitials } from "@/utils/chats/initials";
import { error } from "@/utils/logger/logger";
import packagejson from "../../package.json"
import { formatSchoolName } from '@/utils/format/formatSchoolName';
import List, { ListTouchable } from '@/ui/new/List';
import Typography from '@/ui/new/Typography';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { useHeaderHeight } from '@react-navigation/elements';
export default function SettingsIndex() {
const router = useRouter();
const navigation = useNavigation();
const theme = useTheme();
const { colors } = theme;
const accountStore = useAccountStore();
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const settingsStore = useSettingsStore(state => state.personalization);
const currentVersion = packagejson.version;
const releaseNotesUrl = `https://papillon.bzh/release-notes/${currentVersion}`;
const account = accounts.find((a) => a.id === lastUsedAccount);
const [firstName, lastName, level, establishment] = useMemo(() => {
if (!account) { return [null, null, null, null]; }
const firstName = account.firstName;
const lastName = account.lastName;
const level = account.className;
const establishment = account.schoolName;
return [firstName, lastName, level, establishment];
}, [account]);
const logout = useCallback(() => {
const accounts = useAccountStore.getState().accounts;
for (const account of accounts) {
useAccountStore.getState().removeAccount(account);
}
router.replace("/(onboarding)/welcome");
}, [account, accountStore, router]);
const MoreSettingsList = [
{
title: t("Settings_Preferences"),
content: [
/*{
title: t('Settings_Accessibility_Title'),
description: t('Settings_Accessibility_Description'),
papicon: ,
icon: ,
color: "#0038A8",
onPress: () => Alert.alert("Ça arrive... ✨", "Cette fonctionnalité n'est pas encore disponible.")
},*/
{
title: t("Settings_Transport_Title"),
description: t("Settings_Transport_Description"),
papicon: ,
icon: ,
color: "#000",
onPress: () => router.navigate("/(settings)/transport"),
},
],
},
{
title: t("Settings_More"),
content: [
/*{
title: t('Settings_Accessibility_Title'),
description: t('Settings_Accessibility_Description'),
papicon: ,
icon: ,
color: "#0038A8",
onPress: () => Alert.alert("Ça arrive... ✨", "Cette fonctionnalité n'est pas encore disponible.")
},*/
{
title: t("Settings_ReleaseNotes_Title"),
description: t("Settings_ReleaseNotes_Description"),
papicon: ,
icon: ,
color: "#1F7AFC",
onPress: () =>
WebBrowser.openBrowserAsync(releaseNotesUrl, {
presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,
}),
},
{
title: t("Settings_Donate_Title"),
description: t("Settings_Donate_Description"),
papicon: ,
icon: ,
color: "#EFA400",
onPress: () =>
WebBrowser.openBrowserAsync("https://go.papillon.bzh/donate"),
},
{
title: t("Settings_About_Title"),
description: `${t("Settings_About_Description")} ${currentVersion}`,
icon: ,
papicon: ,
color: "#797979",
onPress: () => router.navigate("/(settings)/about"),
},
],
},
{
title: t("Settings_About"),
content: [
{
title: t("Settings_Telemetry_Title"),
description: t("Settings_Telemetry_Description"),
icon: ,
papicon: ,
color: "#797979",
onPress: () => router.navigate("../consent"),
},
{
title: t("Settings_Logout_Title"),
description: t("Settings_Logout_Description"),
papicon: ,
color: "#a80000",
onPress: () => {
Alert.alert(
t("Settings_Logout_Title"),
t("Settings_Logout_Description"),
[
{
text: t("CANCEL_BTN"),
style: "cancel",
},
{
text: t("Settings_Logout_Title"),
style: "destructive",
onPress: () => {
logout();
},
},
],
{ cancelable: true }
);
},
},
],
},
...(settingsStore.showDevMode
? [
{
title: t("Settings_Dev"),
content: [
...(settingsStore.showDevMode
? [
{
title: "Mode développeur",
description: "Options avancées pour les développeurs.",
papicon: ,
icon: ,
color: "#FF6B35",
onPress: () => router.navigate("/devmode"),
},
]
: []),
],
},
]
: []),
];
const BigButtons: Array<{
disabled?: boolean; icon: React.ReactNode, title: string, description: string, color: string, onPress?: () => void;
}> = [
{
icon: ,
title: t('Settings_Personalization_Title_Card'),
description: t('Settings_Personalization_Subtitle_Card'),
color: "#17C300",
onPress: () => {
router.navigate("/(settings)/personalization")
}
},
{
icon: ,
title: t('Settings_Personalization_Subject_Title_Card'),
description: t('Settings_Personalization_Subject_Description'),
color: "#8500dd",
onPress: () => {
router.navigate("/(settings)/subject_personalization")
}
},
{
icon: ,
title: t("Settings_Accounts_Title"),
description: t('Settings_Accounts_Description'),
color: "#0059DD",
onPress: () => {
router.navigate("/(settings)/accounts")
}
},
{
icon: ,
title: "Magic+",
description: t('Settings_MagicPlus_Description_Card'),
color: "#DD007D",
onPress: () => {
router.navigate("/(settings)/magic")
}
}
]
const RenderBigButtons = useCallback(() => {
return (
{Array.from({ length: Math.ceil(BigButtons.length / 2) }, (_, rowIndex) => (
{BigButtons.slice(rowIndex * 2, rowIndex * 2 + 2).map((button, _) => {
const newButtonColor = adjust(button.color, theme.dark ? 0.2 : -0.2);
return (
{Platform.OS === 'ios' && (
)}
{button.icon}
{button.title}
{button.description}
)
})}
))}
);
}, [theme.dark]);
const insets = useSafeAreaInsets();
const headerHeight = useHeaderHeight();
const finalHeaderHeight = Platform.select({
android: headerHeight -16,
default: 0
});
return (
<>
{firstName || lastName ? `${firstName || ''} ${lastName || ''}`.trim() : t('Settings_NoAccount')}
{establishment &&
{level} {(level && establishment) && " — "} {formatSchoolName(establishment)}
}
)}
contentContainerStyle={{ padding: 16, paddingBottom: insets.bottom + 16, paddingTop: finalHeaderHeight + 16 }}
>
{MoreSettingsList.map(section => (
{Platform.OS === 'android' && (
{section.title}
)}
{section.content.map(item => (
{item.papicon}
{item.title}
{item.description}
))}
))}
>
);
};
================================================
FILE: app/(settings)/subject_personalization.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { router } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { Alert, View } from "react-native";
import { useAccountStore } from "@/stores/account";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import Icon from "@/ui/components/Icon";
import {
NativeHeaderPressable,
NativeHeaderSide,
} from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
export default function SubjectPersonalization() {
const { colors } = useTheme();
const accounts = useAccountStore(state => state.accounts);
const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const store = useAccountStore.getState();
const account = accounts.find(a => a.id === lastUsedAccount);
const subjects = Object.entries(account?.customisation?.subjects ?? {})
.map(([key, value]) => ({
id: key,
...value,
}))
.filter(item => item.name && item.emoji && item.color);
const resetAllSubjects = () => {
Alert.alert(
t("Settings_Subjects_Reset_Title"),
t("Settings_Subjects_Reset_Message"),
[
{
text: t("CANCEL_BTN"),
style: "cancel",
},
{
text: t("Settings_Subjects_Reset_Button"),
style: "destructive",
onPress: () => {
store.setSubjects({});
},
},
]
);
};
function renderItem(emoji: string, name: string, id: string, color: string) {
return (
{
router.push({
pathname: "/(settings)/edit_subject",
params: {
id,
emoji,
color,
name,
},
});
}}
>
{emoji}
{name}
);
}
const { t } = useTranslation();
return (
<>
resetAllSubjects()}>
{subjects.length > 0 ? (
subjects.map(item =>
renderItem(item.emoji, item.name, item.id, item.color)
)
) : (
{t("Settings_Subjects_None_Title")}
{t("Settings_Subjects_None_Description")}
)}
>
);
}
================================================
FILE: app/(settings)/tabs.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import React from "react";
import { useTranslation } from "react-i18next";
import { Switch } from "react-native";
import { useSettingsStore } from "@/stores/settings";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import NativeSwitch from "@/ui/native/NativeSwitch";
const SettingsTabs = () => {
const { t } = useTranslation();
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const disabledTabs = settingsStore?.disabledTabs || [];
const tabs = [
{
id: "calendar",
name: t("Tab_Calendar"),
icon: "calendar",
enabled: !disabledTabs.includes("calendar"),
},
{
id: "tasks",
name: t("Tab_Tasks"),
icon: "tasks",
enabled: !disabledTabs.includes("tasks"),
},
{
id: "grades",
name: t("Tab_Grades"),
icon: "grades",
enabled: !disabledTabs.includes("grades"),
},
{
id: "news",
name: t("Tab_News"),
icon: "newspaper",
enabled: !disabledTabs.includes("news"),
},
];
const toggleTab = (tabId: string) => {
if (disabledTabs.includes(tabId)) {
mutateProperty("personalization", {
...settingsStore,
disabledTabs: disabledTabs.filter(id => id !== tabId),
});
} else {
mutateProperty("personalization", {
...settingsStore,
disabledTabs: [...disabledTabs, tabId],
});
}
};
return (
{tabs.map(tab => (
{tab.name}
toggleTab(tab.id)}
/>
))}
);
};
export default SettingsTabs;
================================================
FILE: app/(settings)/transport.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import * as React from "react";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { Image, Modal } from "react-native";
import SettingsHeader from "@/components/SettingsHeader";
import { AvailableTransportServices } from "@/constants/AvailableTransportServices";
import { useAccountStore } from "@/stores/account";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { AddressModal } from "@/app/(modals)/address";
import { TransportAddress } from "@/stores/account/types";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
export default function TransportView() {
const accountStore = useAccountStore();
const accounts = useAccountStore(state => state.accounts);
const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const { transport } = accounts.find(a => a.id === lastUsedAccount)!;
const theme = useTheme();
const { t } = useTranslation();
const [transportEnabled, setTransportEnabled] = React.useState(
transport?.enabled ?? false
);
const [showAddressSelect, setShowAddressSelect] = React.useState(false);
const [
addressSelectCanBeCurrentLocation,
setAddressSelectCanBeCurrentLocation,
] = React.useState(false);
const openAddressSelect = (currentLocationEnabled: boolean) => {
setAddressSelectCanBeCurrentLocation(currentLocationEnabled);
setShowAddressSelect(true);
};
const formatAddress = (address: TransportAddress | undefined): string => {
if (address === undefined) {
return t("Settings_Transport_Address_Not_Set");
}
if (address.firstTitle === "current_location") {
return t("Settings_Transport_Current_Position");
}
return `${address.firstTitle}, ${address.secondTitle}`;
};
useEffect(
() => accountStore.setTransportEnabled(transportEnabled),
[transportEnabled]
);
const insets = useSafeAreaInsets();
return (
{t("Settings_Transport_Address_Title")}
{
if (transportEnabled) {
openAddressSelect(true);
}
}}
style={{ opacity: transportEnabled ? 1 : 0.5 }}
>
{t("Settings_Transport_Address_Home_Title")}
{formatAddress(transport?.homeAddress)}
{
if (transportEnabled) {
openAddressSelect(false);
}
}}
style={{ opacity: transportEnabled ? 1 : 0.5 }}
>
{t("Settings_Transport_Address_School_Title")}
{formatAddress(transport?.schoolAddress)}
{t("Settings_Transport_Address_Description")}
{t("Settings_Transport_Default_Application_Title")}
{AvailableTransportServices.map(service => (
{
if (transportEnabled) {
accountStore.setTransportService(service.id);
}
}}
key={service.id}
style={{ opacity: transportEnabled ? 1 : 0.5 }}
>
{(transport?.defaultApp ?? "transit") === service.id && (
)}
{service.name}
))}
setShowAddressSelect(false)}
animationType={"slide"}
>
setShowAddressSelect(false)}
onConfirm={(item: TransportAddress) => {
if (addressSelectCanBeCurrentLocation) {
// Home
accountStore.setTransportHomeAddress(item);
} else {
// School
accountStore.setTransportSchoolAddress(item);
}
setShowAddressSelect(false);
}}
/>
);
}
================================================
FILE: app/(tabs)/_layout.tsx
================================================
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { useTheme } from '@react-navigation/native';
import { NativeTabs } from 'expo-router/unstable-native-tabs';
import { useTranslation } from 'react-i18next';
import { Platform } from 'react-native';
// Static platform detection - computed once at module load
const IS_IOS_WITH_PADDING = runsIOS26;
const IS_ANDROID = Platform.OS === 'android';
const TAB_LABEL_STYLE = {
fontFamily: 'medium',
fontSize: Platform.OS === 'ios' ? 13 : 13,
} as const;
export default function TabLayout() {
const theme = useTheme();
const { t } = useTranslation();
return (
{t("Tab_Home")}
{t("Tab_Calendar")}
{t("Tab_Tasks")}
{t("Tab_Grades")}
{t("Tab_News")}
);
}
================================================
FILE: app/(tabs)/calendar/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
export default function Layout() {
const { t } = useTranslation();
return (
);
}
================================================
FILE: app/(tabs)/calendar/components/CalendarDay.tsx
================================================
import { useNavigation } from "expo-router";
import { t } from "i18next";
import React, { useMemo, useRef } from "react";
import { Dimensions,FlatList, Platform, RefreshControl, StyleSheet, View } from 'react-native';
import { Transit } from "@/components/Transit";
import { Course as SharedCourse, CourseStatus } from "@/services/shared/timetable";
import { TransportStorage } from "@/stores/account/types";
import Course from "@/ui/components/Course";
import { Colors, getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from '@/utils/subjects/name';
import { EmptyCalendar } from './EmptyCalendar';
interface CalendarDayProps {
dayDate: Date;
courses: SharedCourse[];
isRefreshing: boolean;
onRefresh: () => void;
colors: { primary: string, background: string };
headerHeight: number;
insets: any;
tabBarHeight: number;
transportInfo?: TransportStorage;
}
export const CalendarDay = React.memo(({ dayDate, courses, isRefreshing, onRefresh, colors, headerHeight, insets, tabBarHeight, transportInfo }: CalendarDayProps) => {
const navigation = useNavigation();
// Cache to preserve event object identity by id
const eventCache = useRef<{ [id: string]: any }>({});
// Shallow compare function
function shallowEqual(objA: any, objB: any) {
if (objA === objB) { return true; }
if (!objA || !objB) { return false; }
const keysA = Object.keys(objA);
const keysB = Object.keys(objB);
if (keysA.length !== keysB.length) { return false; }
for (const key of keysA) {
if (objA[key] !== objB[key]) { return false; }
}
return true;
}
const dayEvents = useMemo(() => {
const cache = eventCache.current;
const next: { [id: string]: any } = {};
const result = (courses ?? []).map(ev => {
if (cache[ev.id] && shallowEqual(ev, cache[ev.id])) {
next[ev.id] = cache[ev.id];
return cache[ev.id];
}
next[ev.id] = ev;
return ev;
});
eventCache.current = next;
return result;
}, [courses]);
const threshold = 30;
const enrichedEvents = useMemo(() => {
if (!dayEvents || dayEvents.length === 0) {return dayEvents;}
const result: any[] = [];
// Add transport departure
if (transportInfo?.enabled ?? false) {
result.push({
type: "transit",
isDeparture: true,
targetTime: dayEvents[0].from.getTime() / 1000,
});
}
// Add separator between events
for (let i = 0; i < dayEvents.length; i++) {
result.push(dayEvents[i]);
if (i < dayEvents.length - 1) {
const current = dayEvents[i];
const next = dayEvents[i + 1];
if (current.to && next.from) {
const diffMinutes =
(next.from.getTime() - current.to.getTime()) / (1000 * 60);
if (diffMinutes > threshold) {
result.push({
id: `separator-${current.id}-${next.id}`,
type: "separator" as any,
from: new Date(current.to),
to: new Date(next.from),
});
}
}
}
}
// Add transport arrival
if (transportInfo?.enabled ?? false) {
result.push({
type: "transit",
isDeparture: false,
targetTime: result[result.length - 1].to.getTime() / 1000,
});
}
return result;
}, [dayEvents]);
const isEmpty = enrichedEvents.length === 0;
return (
}
keyExtractor={item => item.id}
ListEmptyComponent={ }
renderItem={({ item }: { item: SharedCourse }) => {
if ((item as any).type === "transit") {
return (
);
}
if ((item as any).type === "separator") {
return (
{
navigation.navigate("(modals)/course", {
course: item,
subjectInfo: {
id: item.subject,
name: getSubjectName(item.subject),
color: getSubjectColor(item.subject) || Colors[0],
emoji: getSubjectEmoji(item.subject),
},
});
}}
/>
);
}
return (
{
navigation.navigate("(modals)/course", {
course: item,
subjectInfo: {
id: item.subject,
name: getSubjectName(item.subject),
color: getSubjectColor(item.subject) || Colors[0],
emoji: getSubjectEmoji(item.subject),
},
});
}}
/>
);
}}
/>
);
}, (prevProps, nextProps) => {
return (
prevProps.dayDate.getTime() === nextProps.dayDate.getTime() &&
prevProps.isRefreshing === nextProps.isRefreshing &&
prevProps.onRefresh === nextProps.onRefresh &&
prevProps.headerHeight === nextProps.headerHeight &&
JSON.stringify(prevProps.courses) === JSON.stringify(nextProps.courses)
);
});
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
export function getStatusText(status?: CourseStatus): string {
switch (status) {
case CourseStatus.ONLINE:
return t("Online_Course")
case CourseStatus.EDITED:
return t("Edited_Course")
case CourseStatus.CANCELED:
return t("Canceled_Course")
case CourseStatus.EVALUATED:
return t("Evaluated_Course")
default:
return ""
}
}
================================================
FILE: app/(tabs)/calendar/components/CalendarHeader.tsx
================================================
import React from 'react';
import { Platform } from 'react-native';
import { useTheme } from '@react-navigation/native';
import { useRouter } from 'expo-router';
import { t } from 'i18next';
import TabHeader from '@/ui/components/TabHeader';
import TabHeaderTitle from '@/ui/components/TabHeaderTitle';
import ChipButton from '@/ui/components/ChipButton';
import Calendar from "@/ui/components/Calendar";
import i18n from '@/utils/i18n';
interface CalendarHeaderProps {
date: Date;
onDateChange: (date: Date) => void;
onHeaderHeightChange: (height: number) => void;
calendarRef: any;
isLoading?: boolean;
}
export const CalendarHeader = React.memo(({ date, onDateChange, onHeaderHeightChange, calendarRef, isLoading }: CalendarHeaderProps) => {
const { colors } = useTheme();
const router = useRouter();
const toggleDatePicker = () => {
calendarRef.current?.toggle();
};
// know if date is today, yesterday, or tomorrow
const isToday = date.toDateString() === new Date().toDateString();
const isYesterday = date.toDateString() === new Date(new Date().setDate(new Date().getDate() - 1)).toDateString();
const isTomorrow = date.toDateString() === new Date(new Date().setDate(new Date().getDate() + 1)).toDateString();
const subtitle = isToday ? t("Today") : isYesterday ? t("Yesterday") : isTomorrow ? t("Tomorrow") : "";
return (
<>
toggleDatePicker()}
loading={isLoading}
/>
}
trailing={
{
if (nativeEvent.event === 'manage_icals') {
router.push({
pathname: "./calendar/icals",
params: {}
});
}
}}
/>
}
/>
>
);
});
================================================
FILE: app/(tabs)/calendar/components/EmptyCalendar.tsx
================================================
import React, { memo } from 'react';
import { t } from "i18next";
import { Papicons } from '@getpapillon/papicons';
import { Dynamic } from "@/ui/components/Dynamic";
import Stack from "@/ui/components/Stack";
import Icon from "@/ui/components/Icon";
import Typography from "@/ui/components/Typography";
export const EmptyCalendar = memo(() => (
{t('Tab_Calendar_Empty')}
{t('Tab_Calendar_Empty_Description')}
));
================================================
FILE: app/(tabs)/calendar/event/[id].tsx
================================================
import { MenuView } from '@react-native-menu/menu';
import { useTheme } from "@react-navigation/native";
import { useLocalSearchParams, useNavigation, useRouter } from "expo-router";
import { t } from 'i18next';
import { MoreVertical } from "lucide-react-native";
import { useEffect, useLayoutEffect, useState } from 'react';
import React, { Alert, Platform, ScrollView, StyleSheet } from "react-native";
import UnderConstructionNotice from "@/components/UnderConstructionNotice";
import { useDatabase } from '@/database/DatabaseProvider';
import { useEventById } from '@/database/useEventsById';
import { NativeHeaderPressable, NativeHeaderSide } from '@/ui/components/NativeHeader';
import ActionMenu from '@/ui/components/ActionMenu';
export default function TabOneScreen() {
const { id, title } = useLocalSearchParams();
const database = useDatabase();
const router = useRouter();
const navigation = useNavigation();
const [isLoading, setIsLoading] = useState(true);
const { colors } = useTheme();
// Ensure id is a string or number, not an array
const eventId = Array.isArray(id) ? id[0] : id;
const event = useEventById(eventId);
useEffect(() => {
if (event && event.id) {
setIsLoading(false);
}
}, [event]);
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: event ? event.title : title ?? t("Event_EventDetails"),
});
}, [event, navigation]);
return (
<>
{
if (nativeEvent.event === 'delete') {
Alert.alert(
t("Event_DeleteEvent"),
t("Event_Confirm_DeleteEvent"),
[
{
text: t("Context_Cancel"),
style: "cancel"
},
{
text: t("Event_DeleteEvent"),
style: "destructive",
onPress: async () => {
try {
await database.write(async () => {
const eventToDelete = await database.get('events').find(eventId);
await eventToDelete.destroyPermanently();
});
router.back();
} catch (error) {
console.error("Error deleting event:", error);
Alert.alert(
"Erreur",
"Une erreur est survenue lors de la suppression de l’événement.",
[{ text: "OK" }]
);
}
}
}
]
);
}
}}
>
>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16
},
containerContent: {
justifyContent: "center",
alignItems: "center",
}
});
================================================
FILE: app/(tabs)/calendar/hooks/useCalendarState.ts
================================================
import { useState, useRef, useEffect, useCallback } from 'react';
import { Dimensions, FlatList } from 'react-native';
import { getWeekNumberFromDate } from "@/database/useHomework";
import { warn } from "@/utils/logger/logger";
const INITIAL_INDEX = 10000;
export function useCalendarState() {
const [date, setDate] = useState(new Date());
const [weekNumber, setWeekNumber] = useState(getWeekNumberFromDate(date));
const [currentIndex, setCurrentIndex] = useState(INITIAL_INDEX);
const flatListRef = useRef>(null);
const referenceDate = useRef(new Date());
const windowWidth = Dimensions.get("window").width;
useEffect(() => {
referenceDate.current.setHours(0, 0, 0, 0);
}, []);
const getDateFromIndex = useCallback((index: number) => {
const d = new Date(referenceDate.current);
d.setDate(referenceDate.current.getDate() + (index - INITIAL_INDEX));
return d;
}, []);
const getIndexFromDate = useCallback((d: Date) => {
const base = new Date(referenceDate.current);
base.setHours(0, 0, 0, 0);
const target = new Date(d);
target.setHours(0, 0, 0, 0);
const diff = Math.round((target.getTime() - base.getTime()) / (1000 * 60 * 60 * 24));
return INITIAL_INDEX + diff;
}, []);
const handleDateChange = useCallback((newDate: Date) => {
setDate(newDate);
const newWeekNumber = getWeekNumberFromDate(newDate);
if (newWeekNumber !== weekNumber) {
setWeekNumber(newWeekNumber);
}
}, [weekNumber]);
// Sync FlatList with date
useEffect(() => {
const newIndex = getIndexFromDate(date);
let newWeekNumber = getWeekNumberFromDate(date);
if (date.getDay() === 0) {
newWeekNumber += 1;
}
if (newIndex !== currentIndex) {
setCurrentIndex(newIndex);
if (flatListRef.current) {
try {
flatListRef.current.scrollToIndex({
index: newIndex,
animated: false,
});
} catch (e) {
warn(String(e))
}
}
}
if (newWeekNumber !== weekNumber) {
setWeekNumber(newWeekNumber);
}
}, [date, getIndexFromDate, currentIndex, weekNumber]);
const onMomentumScrollEnd = useCallback((e: any) => {
const newIndex = Math.round(e.nativeEvent.contentOffset.x / windowWidth);
if (newIndex !== currentIndex) {
setCurrentIndex(newIndex);
const newDate = getDateFromIndex(newIndex);
setDate((prev) => prev.getTime() !== newDate.getTime() ? newDate : prev);
}
}, [windowWidth, currentIndex, getDateFromIndex]);
const lastEmittedIndex = useRef(currentIndex);
const onScroll = useCallback((e: any) => {
const offsetX = e.nativeEvent.contentOffset.x;
const newIndex = Math.round(offsetX / windowWidth);
if (newIndex !== lastEmittedIndex.current) {
lastEmittedIndex.current = newIndex;
setCurrentIndex(newIndex);
const newDate = getDateFromIndex(newIndex);
setDate((prev) => prev.getTime() !== newDate.getTime() ? newDate : prev);
const newWeekNumber = getWeekNumberFromDate(newDate);
if (newWeekNumber !== weekNumber) {
setWeekNumber(newWeekNumber);
}
}
}, [windowWidth, getDateFromIndex, weekNumber]);
return {
date,
setDate,
weekNumber,
setWeekNumber,
currentIndex,
flatListRef,
getDateFromIndex,
getIndexFromDate,
handleDateChange,
onMomentumScrollEnd,
onScroll,
INITIAL_INDEX,
windowWidth
};
}
================================================
FILE: app/(tabs)/calendar/hooks/useTimetableData.ts
================================================
import { useCallback, useEffect, useMemo,useRef, useState } from 'react';
import { useTimetable } from '@/database/useTimetable';
import { getManager, subscribeManagerUpdate } from "@/services/shared";
import { useAccountStore } from '@/stores/account';
import { log, warn } from "@/utils/logger/logger";
export function useTimetableData(weekNumber: number, currentDate: Date = new Date()) {
const safeDate = currentDate;
const [isLoading, setIsLoading] = useState(false);
const [refresh, setRefresh] = useState(0);
const [manualRefreshing, setManualRefreshing] = useState(false);
const [fetchedWeeks, setFetchedWeeks] = useState([]);
const fetchTimeoutRef = useRef | null>(null);
let manager: ReturnType | null;
try {
manager = getManager();
} catch (error) {
warn('Manager not initialized, iCal events will still work');
manager = null;
}
const store = useAccountStore.getState();
const account = store.accounts.find(account => store.lastUsedAccount);
const services: string[] = account?.services?.map((service: { id: string }) => service.id) ?? [];
const rawTimetable = useTimetable(refresh, [weekNumber - 1, weekNumber, weekNumber + 1], safeDate);
const timetable = useMemo(() => {
return rawTimetable.map(day => ({
...day,
courses: day.courses.filter(course =>
services.includes(course.createdByAccount) || course.createdByAccount.startsWith('ical_')
)
})).filter(day => day.courses.length > 0);
}, [rawTimetable, services]);
const fetchWeeklyTimetable = useCallback(async (targetWeekNumber: number, forceRefresh = false) => {
setIsLoading(true);
if (fetchTimeoutRef.current) {
clearTimeout(fetchTimeoutRef.current);
fetchTimeoutRef.current = null;
}
fetchTimeoutRef.current = setTimeout(async () => {
if (forceRefresh) {
setManualRefreshing(true);
}
try {
if (!manager) {
warn('Manager is null, skipping timetable fetch');
return;
}
const candidates = [targetWeekNumber - 1, targetWeekNumber, targetWeekNumber + 1].map(week => {
const targetDate = new Date(safeDate);
targetDate.setDate(targetDate.getDate() + (week - targetWeekNumber) * 7);
const year = targetDate.getFullYear();
const key = `${year}-${week}`;
return { week, targetDate, key };
});
const toFetch = candidates.filter(c => !fetchedWeeks.includes(c.key));
if (toFetch.length > 0) {
await Promise.all(
toFetch.map((c) => {
return manager.getWeeklyTimetable(c.week, c.targetDate)
})
);
setRefresh(prev => prev + 1);
setFetchedWeeks((prevFetchedWeeks) => [
...prevFetchedWeeks,
...toFetch.map(c => c.key),
]);
}
} catch (error) {
log('Error fetching weekly timetable: ' + error);
} finally {
setIsLoading(false);
setManualRefreshing(false);
fetchTimeoutRef.current = null;
}
}, 100);
}, [fetchedWeeks, manager, safeDate]);
useEffect(() => {
fetchWeeklyTimetable(weekNumber);
}, [weekNumber, fetchWeeklyTimetable]);
useEffect(() => {
const unsubscribe = subscribeManagerUpdate((updatedManager) => {
if (updatedManager) {
fetchWeeklyTimetable(weekNumber);
}
});
return () => unsubscribe();
}, [weekNumber, fetchWeeklyTimetable]);
useEffect(() => {
return () => {
if (fetchTimeoutRef.current) {
clearTimeout(fetchTimeoutRef.current);
}
};
}, []);
const handleRefresh = useCallback(() => {
setRefresh(prev => prev + 1);
fetchWeeklyTimetable(weekNumber, true);
}, [weekNumber]);
return {
timetable,
refresh,
manualRefreshing,
handleRefresh,
isLoading
};
}
================================================
FILE: app/(tabs)/calendar/icals.tsx
================================================
import { t } from "i18next";
import { Calendar, Link2Icon, TypeIcon, Brain } from "lucide-react-native";
import React, { useState } from "react";
import { Alert, ScrollView, StyleSheet, TextInput, Switch } from "react-native";
import { useAddIcal, useIcals, useRemoveIcal, useUpdateIcalParsing } from "@/database/useIcals";
import { isValidUrl, normalizeUrl } from "@/services/local/ical-utils";
import { fetchAndParseICal } from "@/services/local/ical";
import { enhanceADEUrl } from "@/services/local/parsers/ade-parser";
import Button from "@/ui/components/Button";
import Icon from "@/ui/components/Icon";
import Item, { Trailing } from "@/ui/components/Item";
import List from "@/ui/components/List";
import Typography from "@/ui/components/Typography";
import { useTheme } from "@react-navigation/native";
import { Papicons } from "@getpapillon/papicons";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import NativeSwitch from "@/ui/native/NativeSwitch";
export default function TabOneScreen() {
const [icalUrl, setIcalUrl] = useState("");
const [icalTitle, setIcalTitle] = useState("");
const [intelligentParsing, setIntelligentParsing] = useState(false);
const [refresh, setRefresh] = useState(0);
const icals = useIcals(refresh);
const addIcal = useAddIcal();
const removeIcal = useRemoveIcal();
const updateIcalParsing = useUpdateIcalParsing();
const handleAdd = async () => {
if (!icalUrl.trim() || !icalTitle.trim()) {
Alert.alert(t("Tab_Calendar_Icals_Add_Title"), t("Tab_Calendar_Icals_Add_Description"));
return;
}
const normalizedUrl = normalizeUrl(icalUrl);
try {
const parsedData = await fetchAndParseICal(normalizedUrl);
const shouldEnableParsing = (parsedData.isADE || parsedData.isHyperplanning) ? true : intelligentParsing;
const finalUrl = parsedData.isADE ? enhanceADEUrl(normalizedUrl) : normalizedUrl;
await addIcal(icalTitle, finalUrl, shouldEnableParsing, parsedData.provider);
setIcalUrl("");
setIcalTitle("");
setIntelligentParsing(false);
setRefresh(r => r + 1);
} catch (error) {
Alert.alert("Erreur", "Impossible de traiter l'URL iCal. Vérifiez qu'elle est valide.");
}
};
const handleRemove = async (id: string) => {
await removeIcal(id);
setRefresh(r => r + 1);
};
const theme = useTheme();
const { colors } = theme;
return (
{icalUrl.length > 0 &&
-
0 ? 1 : 0.5} />
}
-
0 ? 1 : 0.5} />
{icalUrl.length > 0 && (
)}
{icals.length > 0 && (
{icals.flatMap((ical, index) => {
const isADE = (ical as any).provider?.toUpperCase().includes('ADE');
const isHyperplanning = (ical as any).provider?.toUpperCase().includes('HYPERPLANNING');
const supportsIntelligentParsing = isADE || isHyperplanning;
const items = [
- {
Alert.alert(
t('Tab_Calendar_Icals_Manage_Title', { title: ical.title }),
t('Tab_Calendar_Icals_Manage_Description'),
[
{
text: t('Context_Cancel'),
style: 'cancel',
},
{
text: t('Context_Delete'),
style: 'destructive',
onPress: () => handleRemove(ical.id)
}
]
);
}}
>
{ical.title}
{ical.url}
];
// only ADE and Hyperplanning calendars support intelligent parsing
if (supportsIntelligentParsing) {
items.push(
-
Parsing intelligent (Beta)
{
await updateIcalParsing(ical.id, value);
setRefresh(r => r + 1);
}}
/>
);
}
return items;
})}
)}
{icals.length === 0 && (
{t("Tab_Calendar_Icals_Empty")}
)}
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16
},
containerContent: {
justifyContent: "center",
alignItems: "center",
}
});
================================================
FILE: app/(tabs)/calendar/index.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React, { useCallback, useRef, useState } from "react";
import { FlatList, Platform, StyleSheet,View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { CourseStatus } from "@/services/shared/timetable";
import { useAccountStore } from "@/stores/account";
import { CalendarDay } from "./components/CalendarDay";
import { CalendarHeader } from "./components/CalendarHeader";
import { useCalendarState } from "./hooks/useCalendarState";
import { useTimetableData } from "./hooks/useTimetableData";
export default function TabOneScreen() {
const { colors } = useTheme();
const calendarRef = useRef(null);
const [headerHeight, setHeaderHeight] = useState(0);
const insets = useSafeAreaInsets();
const tabBarHeight = insets.bottom;
const accounts = useAccountStore(state => state.accounts);
const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const account = accounts.find(a => a.id === lastUsedAccount)!;
const {
date,
weekNumber,
currentIndex,
flatListRef,
getDateFromIndex,
handleDateChange,
onMomentumScrollEnd,
onScroll,
INITIAL_INDEX,
windowWidth
} = useCalendarState();
const {
timetable,
manualRefreshing,
handleRefresh,
isLoading
} = useTimetableData(weekNumber, date);
const renderDay = useCallback(({ index }: { index: number }) => {
const dayDate = getDateFromIndex(index);
const normalizedDate = new Date(dayDate);
normalizedDate.setHours(0, 0, 0, 0);
const dayCourses = timetable.find(d => {
const dDate = new Date(d.date);
dDate.setHours(0, 0, 0, 0);
return dDate.getTime() === normalizedDate.getTime();
})?.courses || [];
return (
);
}, [getDateFromIndex, timetable, manualRefreshing, handleRefresh, colors, headerHeight]);
return (
<>
({ length: windowWidth, offset: windowWidth * index, index })}
renderItem={renderDay}
keyExtractor={(_, index) => "renderDay:" + String(index)}
onScroll={onScroll}
decelerationRate={Platform.OS === 'ios' ? 0.98 : undefined}
disableIntervalMomentum={true}
scrollEventThrottle={16}
onMomentumScrollEnd={onMomentumScrollEnd}
snapToInterval={windowWidth}
bounces={false}
windowSize={4}
maxToRenderPerBatch={3}
initialNumToRender={3}
showsVerticalScrollIndicator={false}
removeClippedSubviews
extraData={{ manualRefreshing, headerHeight, colors, timetable }}
/>
>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
export function getStatusText(status?: CourseStatus): string {
switch (status) {
case CourseStatus.ONLINE:
return t("Online_Course")
case CourseStatus.EDITED:
return t("Edited_Course")
case CourseStatus.CANCELED:
return t("Canceled_Course")
case CourseStatus.EVALUATED:
return t("Evaluated_Course")
default:
return ""
}
}
================================================
FILE: app/(tabs)/grades/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
export default function Layout() {
const { t } = useTranslation();
return (
);
}
================================================
FILE: app/(tabs)/grades/atoms/Averages.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { MenuView } from "@react-native-menu/menu";
import { useTheme } from "@react-navigation/native";
import * as Haptics from "expo-haptics";
import { LinearGradient } from "expo-linear-gradient";
import { useRouter } from "expo-router";
import * as WebBrowser from "expo-web-browser";
import { t } from "i18next";
import React, { useCallback, useEffect, useMemo, useState } from "react";
import { Platform, TouchableOpacity, View } from "react-native";
import { LineGraph } from "react-native-graph";
import { LayoutAnimationConfig } from "react-native-reanimated";
import Reanimated from "react-native-reanimated";
import { Grade } from "@/services/shared/grade";
import AnimatedNumber from "@/ui/components/AnimatedNumber";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/new/Typography";
import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
import adjust from "@/utils/adjustColor";
import PapillonSubjectAvg from "@/utils/grades/algorithms/subject";
import PapillonGradesAveragesOverTime from "@/utils/grades/algorithms/time";
import PapillonWeightedAvg from "@/utils/grades/algorithms/weighted";
import { calculateAmplifiedGraphPoints, GraphPoint } from "../utils/graph";
import ActionMenu from "@/ui/components/ActionMenu";
const algorithms = [
{
key: "subjects",
label: t('Grades_Avg_Subject_Title'),
description: t('Grades_Avg_Subject_Description'),
algorithm: PapillonSubjectAvg,
canInjectRealAverage: true,
sfsymbol: "square.stack.3d.up.fill"
},
{
key: "weighted",
label: t('Grades_Avg_All_Pond'),
description: t('Grades_Avg_All_Pond_Description'),
algorithm: PapillonWeightedAvg,
sfsymbol: "plus.forwardslash.minus"
}
]
const Averages = ({ grades, realAverage, color, scale = 20, inline = false }: { grades: Grade[], realAverage?: number, color?: string, scale?: number, inline?: boolean }) => {
try {
const theme = useTheme();
const accent = color || theme.colors.primary;
const adjustedColor = adjust(accent, theme.dark ? 0.2 : -0.2);
const [algorithm, setAlgorithm] = useState(algorithms[0]);
const router = useRouter();
const currentAverageHistory = useMemo(() => {
if (!grades || grades.length === 0) { return []; }
try {
const history = PapillonGradesAveragesOverTime(algorithm.algorithm, grades, "studentScore");
if (algorithm.canInjectRealAverage && realAverage) {
history.push({
average: realAverage,
date: new Date(),
});
}
return history;
} catch (e) {
console.error("Error calculating average history:", e);
return [];
}
}, [grades, algorithm, realAverage]);
const initialAverage = useMemo(() => {
if (currentAverageHistory.length === 0) {
return {
average: 0,
date: new Date(),
};
}
if (algorithm.canInjectRealAverage && realAverage) {
return {
average: realAverage,
date: new Date(),
};
}
if (!currentAverageHistory || currentAverageHistory.length === 0) { return null; }
return currentAverageHistory[currentAverageHistory.length - 1];
}, [currentAverageHistory, algorithm, realAverage]);
const [shownAverage, setShownAverage] = useState(initialAverage ? initialAverage.average : 0);
const [shownDate, setShownDate] = useState(initialAverage ? initialAverage.date : new Date());
// Update state when initialAverage changes (e.g. when algorithm changes)
React.useEffect(() => {
if (initialAverage) {
setShownAverage(initialAverage.average);
setShownDate(initialAverage.date);
} else {
setShownAverage(0);
setShownDate(new Date());
}
}, [initialAverage]);
const [active, setActive] = useState(false);
const handleGestureUpdate = useCallback((p: { value: number, date: Date, originalValue?: number, originalDate?: Date }) => {
setActive(true);
setShownAverage(p.originalValue ?? p.value);
setShownDate(p.originalDate ?? p.date);
}, []);
const handleGestureEnd = useCallback(() => {
setActive(false);
setShownAverage(initialAverage ? initialAverage.average : 0);
setShownDate(initialAverage ? initialAverage.date : new Date());
}, [initialAverage]);
useEffect(() => {
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
}, [active]);
const graphAxis = useMemo(() => {
return calculateAmplifiedGraphPoints(currentAverageHistory, scale);
}, [currentAverageHistory, scale]);
const isRealAverage = useMemo(() => {
return shownAverage === realAverage;
}, [shownAverage, realAverage]);
const backgroundColor = useMemo(() => {
return adjust(accent, theme.dark ? -0.89 : 0.8);
}, [accent, theme.dark]);
if (!grades || grades.length === 0) {
// You might want to return null or a placeholder here if there are absolutely no grades
// But if realAverage exists, we might still want to show something?
// For now, if there's no history and no real average, we can return null or render empty state.
if (!realAverage) { return null; }
}
graphAxis.forEach(item => {
item.value = Math.round(item.value * 100) / 100
})
return (
{Platform.OS === 'ios' && (
)}
{graphAxis.length > 0 ? (
) : null}
{shownAverage ? shownAverage.toFixed(2) : "0.00"}
/{scale}
({
id: "setAlg:" + algo.key,
title: algo.label,
subtitle: algo.description,
state: algorithm.key === algo.key ? "on" : "off",
image: Platform.select({
ios: algo.sfsymbol
}),
imageColor: theme.colors.text
})),
displayInline: true
},
{
id: 'open:more',
papicon: "info",
title: t('Grades_Avg_KnowMore'),
subtitle: t('Grades_Avg_KnowMore_Description'),
image: Platform.select({
ios: "info.circle"
}),
imageColor: theme.colors.text
}
]}
onPressAction={({ nativeEvent }) => {
const actionId = nativeEvent.event;
if (actionId.startsWith("open:")) {
if (actionId === "open:more") {
WebBrowser.openBrowserAsync("https://docs.papillon.bzh/support/kb/averages", {
presentationStyle: "pageSheet"
});
}
}
if (actionId.startsWith("setAlg:")) {
setAlgorithm(algorithms.find((algo) => algo.key === actionId.slice(7))!);
}
}}
>
{algorithm.label}
{isRealAverage ? "par l'établissement" :
"estimée au " + (shownDate instanceof Date && !isNaN(shownDate.getTime()) ? shownDate.toLocaleDateString(undefined, {
day: "numeric",
month: "short",
year: "numeric"
}) : "Unknown Date")}
{!inline && }
);
}
catch (e) {
console.error(e);
return null;
}
};
export default Averages;
================================================
FILE: app/(tabs)/grades/atoms/FeaturesMap.tsx
================================================
import React from 'react';
import { View } from 'react-native';
import ScodocUES from '../features/ScodocUES';
const featureComponent = {
"scodoc-ues": ScodocUES,
}
const FeaturesMap: React.FC<{ features: Record }> = ({ features }) => {
if (!features) { return null; }
return (
{Object.entries(features).map(([key, value]) => {
const Component = featureComponent[key as keyof typeof featureComponent];
if (!Component) { return null; }
return ;
})}
);
};
export default FeaturesMap;
================================================
FILE: app/(tabs)/grades/atoms/Subject.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useTheme } from '@react-navigation/native';
import { useNavigation } from 'expo-router';
import { t } from 'i18next';
import React, { useCallback, useMemo } from 'react';
import { Text, TouchableOpacity } from 'react-native';
import { Grade } from '@/database/models/Grades';
import Subject from '@/database/models/Subject';
import Item, { Trailing } from '@/ui/components/Item';
import LegacyList from '@/ui/components/List';
import Stack from '@/ui/components/Stack';
import LegacyTypography from '@/ui/components/Typography';
import adjust from '@/utils/adjustColor';
import { getSubjectColor } from '@/utils/subjects/colors';
import { getSubjectEmoji } from '@/utils/subjects/emoji';
import { getSubjectName } from '@/utils/subjects/name';
import List from '@/ui/new/List';
import Typography from '@/ui/new/Typography';
const GradeItem = React.memo(({ grade, subjectName, subjectColor, onPress, getAvgInfluence, getAvgClassInfluence }: { grade: Grade, subjectName: string, subjectColor: string, onPress: (grade: Grade) => void, getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number }) => {
const dateString = useMemo(() => {
// @ts-expect-error date type
return grade.givenAt.toLocaleDateString(undefined, { weekday: 'short', day: '2-digit', month: 'long', year: 'numeric' });
}, [grade.givenAt]);
const handlePress = useCallback(() => {
requestAnimationFrame(() => onPress(grade));
}, [grade, onPress]);
const theme = useTheme();
const hasMaxScore = grade.studentScore?.value === grade.maxScore?.value && !grade.studentScore.disabled;
const trailingBackground = hasMaxScore ? adjust(subjectColor, theme.dark ? -0.2 : 0) : subjectColor + "15";
const trailingForeground = hasMaxScore ? "#FFFFFF" : subjectColor;
return (
{grade.description ? grade.description : t('Grade_NoDescription', { subject: subjectName })}
{dateString}
{grade.studentScore.disabled ? (
<>
{grade.studentScore.status}
>
) : (
<>
{grade.studentScore.value.toFixed(2)}
>
)}
/{grade.outOf.value}
{hasMaxScore && (
)}
);
});
export const SubjectItem: React.FC<{ subject: Subject, grades: Grade[], getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number }> = React.memo(({ subject, grades, getAvgInfluence, getAvgClassInfluence }) => {
const theme = useTheme();
const navigation = useNavigation()
// Memoize derived values
const subjectAdjustedColor = useMemo(
() => adjust(getSubjectColor(subject.name), theme.dark ? 0.2 : -0.4),
[subject.name, theme.dark]
);
const subjectName = useMemo(() => getSubjectName(subject.name), [subject.name]);
const subjectEmoji = useMemo(() => getSubjectEmoji(subject.name), [subject.name]);
const handlePressSubject = useCallback(() => {
// @ts-expect-error navigation types
navigation.navigate('modals/SubjectInfo', {
subject: subject
});
}, [navigation, subject]);
const handlePressGrade = useCallback(
(grade: Grade) => {
// @ts-expect-error navigation types
navigation.navigate('(modals)/grade', {
grade: grade,
subjectInfo: {
name: subjectName,
color: subjectAdjustedColor,
emoji: subjectEmoji,
originalName: subject.name
},
avgInfluence: getAvgInfluence(grade),
avgClass: getAvgClassInfluence(grade),
});
},
[navigation, subjectName, subjectAdjustedColor, subjectEmoji, subject.name, grades]
);
return (
{subjectEmoji}
{subjectName}
{subject.studentAverage.disabled ? (
{subject.studentAverage.status}
) : (
{subject.studentAverage.value.toFixed(2)}
)}
/{subject.outOf.value}
{subject.studentAverage.value === subject.maximum.value && !subject.studentAverage.disabled && (
)}
{subject.grades.map((grade) => (
))}
);
});
GradeItem.displayName = "GradeItem"
SubjectItem.displayName = "SubjectItem"
================================================
FILE: app/(tabs)/grades/features/ScodocUES.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import React from 'react';
import Icon from '@/ui/components/Icon';
import Item, { Leading, Trailing } from '@/ui/components/Item';
import List from '@/ui/components/List';
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import adjust from '@/utils/adjustColor';
import { Modal, ScrollView, View } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { Dynamic } from '@/ui/components/Dynamic';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
export interface AveragedElement {
id: number;
coef: number;
moyenne: string;
}
export interface UEMoyenne {
value: string;
min: string;
max: string;
moy: string;
rang: string;
total: number;
groupes: Record; // Currently empty in your data
}
export interface ECTSInfo {
acquis: number;
total: number;
}
export interface UE {
id: number;
titre: string;
numero: number;
type: number;
color: string;
competence: string | null;
moyenne: UEMoyenne;
bonus: string;
malus: string;
capitalise: boolean | null;
ressources: Record;
saes: Record;
ECTS: ECTSInfo;
}
export type UEMap = Record;
const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
try {
const { colors } = useTheme();
const [openedUE, setOpenedUE] = React.useState(null);
const [displayUEs, setDisplayUEs] = React.useState(false);
return (
<>
setDisplayUEs(!displayUEs)} style={{ width: '100%' }}>
Unités d'enseignement
{displayUEs && (
{Object.entries(data).map(([key, value]) => (
- setOpenedUE(key)}>
{key}
{value.titre}
{value.moyenne.value}
/20
{value.moyenne.rang}
/{value.moyenne.total}
))}
)}
setOpenedUE(null)}
onRequestClose={() => setOpenedUE(null)}
animationType='slide'
>
{openedUE && (
<>
{openedUE}
ECTS : {data[openedUE].ECTS.acquis} / {data[openedUE].ECTS.total}
{data[openedUE].titre}
{data[openedUE].moyenne.value}
/20
-
Rang
Emplacement dans la classe
{data[openedUE].moyenne.rang}
/{data[openedUE].moyenne.total}
-
Moyenne de classe
{data[openedUE].moyenne.moy}
/20
-
Moyenne basse
{data[openedUE].moyenne.min}
/20
-
Moyenne haute
{data[openedUE].moyenne.max}
/20
{Object.entries(data[openedUE].saes).map(([key, value]) => (
-
{key}
{value.moyenne}
/20
x{value.coef}
))}
{Object.entries(data[openedUE].ressources).map(([key, value]) => (
-
{key}
{value.moyenne}
/20
x{value.coef}
))}
>
)}
>
);
}
catch (error) {
return null;
}
};
export default ScodocUES;
================================================
FILE: app/(tabs)/grades/hooks/useGradeInfluence.ts
================================================
import { useMemo, useCallback } from 'react';
import { Grade, Subject } from "@/services/shared/grade";
import { getSubjectAverageByProperty as getSubjectAverageByPropertyHelper } from "@/utils/grades/algorithms/helpers";
import { getSubjectAverage } from "@/utils/grades/algorithms/subject";
export const useGradeInfluence = (subjects: Subject[], getSubjectById: (id: string) => Subject | undefined) => {
// Pre-calculate subject averages to avoid re-computing them for every grade
const subjectAverages = useMemo(() => {
const avgs: Record = {};
subjects.forEach(subject => {
avgs[subject.id] = getSubjectAverage(subject.grades);
});
return avgs;
}, [subjects]);
const subjectClassAverages = useMemo(() => {
const avgs: Record = {};
subjects.forEach(subject => {
avgs[subject.id] = getSubjectAverageByPropertyHelper(subject.grades, "averageScore");
});
return avgs;
}, [subjects]);
const globalAverage = useMemo(() => {
let total = 0;
let count = 0;
Object.values(subjectAverages).forEach(avg => {
if (avg !== -1) {
total += avg;
count++;
}
});
return count > 0 ? total / count : 0;
}, [subjectAverages]);
const globalClassAverage = useMemo(() => {
let total = 0;
let count = 0;
Object.values(subjectClassAverages).forEach(avg => {
if (avg !== -1) {
total += avg;
count++;
}
});
return count > 0 ? total / count : 0;
}, [subjectClassAverages]);
const getAvgInfluence = useCallback((grade: Grade) => {
const subjectId = grade.subjectId;
const currentSubjectAvg = subjectAverages[subjectId];
if (currentSubjectAvg === undefined || currentSubjectAvg === -1) return 0;
// Calculate what the subject average would be without this grade
// We need to find the subject and filter the grade out
const subject = getSubjectById(subjectId);
if (!subject) return 0;
const newSubjectAvg = getSubjectAverage(subject.grades.filter(g => g.id !== grade.id));
// If the subject average doesn't change (or becomes invalid), the influence is 0 (or based on removing the subject)
// But wait, if the subject average becomes -1 (invalid), it means the subject no longer counts towards the global average.
let newGlobalAverage = 0;
if (newSubjectAvg === -1) {
// Subject is removed from global average
let total = 0;
let count = 0;
Object.entries(subjectAverages).forEach(([id, avg]) => {
if (id !== subjectId && avg !== -1) {
total += avg;
count++;
}
});
newGlobalAverage = count > 0 ? total / count : 0;
} else {
// Subject average changes
let total = 0;
let count = 0;
Object.entries(subjectAverages).forEach(([id, avg]) => {
if (id !== subjectId && avg !== -1) {
total += avg;
count++;
}
});
// Add the new subject average
total += newSubjectAvg;
count++;
newGlobalAverage = count > 0 ? total / count : 0;
}
return Number((globalAverage - newGlobalAverage).toFixed(2));
}, [subjectAverages, globalAverage, getSubjectById]);
const getAvgClassInfluence = useCallback((grade: Grade) => {
const subjectId = grade.subjectId;
const currentSubjectAvg = subjectClassAverages[subjectId];
if (currentSubjectAvg === undefined || currentSubjectAvg === -1) return 0;
const subject = getSubjectById(subjectId);
if (!subject) return 0;
const newSubjectAvg = getSubjectAverageByPropertyHelper(subject.grades.filter(g => g.id !== grade.id), "averageScore");
let newGlobalAverage = 0;
if (newSubjectAvg === -1) {
let total = 0;
let count = 0;
Object.entries(subjectClassAverages).forEach(([id, avg]) => {
if (id !== subjectId && avg !== -1) {
total += avg;
count++;
}
});
newGlobalAverage = count > 0 ? total / count : 0;
} else {
let total = 0;
let count = 0;
Object.entries(subjectClassAverages).forEach(([id, avg]) => {
if (id !== subjectId && avg !== -1) {
total += avg;
count++;
}
});
total += newSubjectAvg;
count++;
newGlobalAverage = count > 0 ? total / count : 0;
}
return Number((globalClassAverage - newGlobalAverage).toFixed(2));
}, [subjectClassAverages, globalClassAverage, getSubjectById]);
return {
getAvgInfluence,
getAvgClassInfluence
};
};
================================================
FILE: app/(tabs)/grades/index.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { LegendList } from '@legendapp/list';
import { MenuView } from '@react-native-menu/menu';
import { useTheme } from '@react-navigation/native';
import { useNavigation } from 'expo-router';
import { t } from 'i18next';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Dimensions, Platform, RefreshControl, View } from 'react-native';
import Reanimated, { LinearTransition, useAnimatedStyle } from 'react-native-reanimated';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { getManager, subscribeManagerUpdate } from '@/services/shared';
import { GradeScore, Period, Subject } from "@/services/shared/grade";
import { useSettingsStore } from "@/stores/settings";
import ChipButton from '@/ui/components/ChipButton';
import { CompactGrade } from '@/ui/components/CompactGrade';
import { Dynamic } from '@/ui/components/Dynamic';
import { ErrorBoundary } from '@/ui/components/ErrorBoundary';
import Icon from '@/ui/components/Icon';
import Item, { Trailing } from '@/ui/components/Item';
import LegacyList from '@/ui/components/List';
import Search from '@/ui/components/Search';
import Stack from '@/ui/components/Stack';
import TabHeader from '@/ui/components/TabHeader';
import TabHeaderTitle from '@/ui/components/TabHeaderTitle';
import LegacyTypography from '@/ui/components/Typography';
import { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
import { getCurrentPeriod } from '@/utils/grades/helper/period';
import i18n from '@/utils/i18n';
import { getPeriodName, getPeriodNumber, isPeriodWithNumber } from "@/utils/services/periods";
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
import Averages from './atoms/Averages';
import FeaturesMap from './atoms/FeaturesMap';
import { SubjectItem } from './atoms/Subject';
import { useGradeInfluence } from './hooks/useGradeInfluence';
import List from '@/ui/new/List';
import Typography from '@/ui/new/Typography';
import ActionMenu from '@/ui/components/ActionMenu';
const MemoizedSubjectItem = React.memo(SubjectItem);
const GradesView: React.FC = () => {
// Layout du header
const [headerHeight, setHeaderHeight] = useState(0);
// Thème
const { colors } = useTheme();
const insets = useSafeAreaInsets();
const bottomTabBarHeight = 0;
const navigation = useNavigation();
// Chargement
const [periodsLoading, setPeriodsLoading] = useState(true);
const [gradesLoading, setGradesLoading] = useState(true);
const loading = periodsLoading || gradesLoading;
const [isRefreshing, setIsRefreshing] = useState(false);
// Sortings
const settings = useSettingsStore(state => state.personalization);
const mutateSettings = useSettingsStore(state => state.mutateProperty);
const [sortMethod, setSortMethod] = useState(settings.gradesSortMethod || "date");
useEffect(() => {
if (settings.gradesSortMethod) {
setSortMethod(settings.gradesSortMethod);
}
}, [settings.gradesSortMethod]);
const updateSortMethod = (method: string) => {
setSortMethod(method);
mutateSettings('personalization', { gradesSortMethod: method });
};
const sortings = [
{
label: t("Grades_Sorting_Alphabetical"),
value: "alphabetical",
papicon: "letter",
icon: {
ios: "character",
android: "ic_alphabetical",
papicon: "font",
}
},
{
label: t("Grades_Sorting_Date"),
value: "date",
papicon: "calendar",
icon: {
ios: "calendar",
android: "ic_date",
papicon: "calendar",
}
},
{
label: t("Grades_Sorting_Averages"),
value: "averages",
papicon: "grades",
icon: {
ios: "chart.xyaxis.line",
android: "ic_averages",
papicon: "grades",
}
},
];
// Gestion du scroll
const [shouldCollapseHeader, setShouldCollapseHeader] = useState(false);
// Manager
const manager = getManager();
// Obtention des périodes
const [periods, setPeriods] = useState([]);
const [currentPeriod, setCurrentPeriod] = useState();
const fetchPeriods = async (managerToUse = manager) => {
if (currentPeriod || !managerToUse) { return; }
setPeriodsLoading(true);
const result = await managerToUse.getGradesPeriods();
let currentPeriodFound = getCurrentPeriod(result);
if (settings.gradesPeriodId) {
const savedPeriod = result.find(p => p.id === settings.gradesPeriodId);
if (savedPeriod) {
currentPeriodFound = savedPeriod;
}
}
// sort by time, then put Semestre and Trimestre on top
const sortedResult = [...result].sort((a, b) => {
const isAKey = a.name.startsWith("Semestre") || a.name.startsWith("Trimestre");
const isBKey = b.name.startsWith("Semestre") || b.name.startsWith("Trimestre");
if (isAKey && !isBKey) { return -1; }
if (!isAKey && isBKey) { return 1; }
return a.start.getTime() - b.start.getTime();
});
setPeriods(sortedResult);
setCurrentPeriod(currentPeriodFound);
setPeriodsLoading(false);
};
useEffect(() => {
const unsubscribe = subscribeManagerUpdate((updatedManager) => {
fetchPeriods(updatedManager);
});
return () => unsubscribe();
}, []);
// Obtention des notes
const [subjects, setSubjects] = useState([]);
const [features, setFeatures] = useState(null);
const [serviceAverage, setServiceAverage] = useState(null);
const [serviceRank, setServiceRank] = useState(null);
const fetchGradesForPeriod = async (period: Period | undefined, managerToUse = manager) => {
setGradesLoading(true);
if (period && managerToUse) {
const grades = await managerToUse.getGradesForPeriod(period, period.createdByAccount);
if (grades?.features) {
setFeatures(grades.features);
}
if (!grades || !grades.subjects) {
setGradesLoading(false);
return;
}
setSubjects(grades.subjects);
if (grades.studentOverall && typeof grades.studentOverall.value === 'number') {
setServiceAverage(grades.studentOverall.value)
} else {
setServiceAverage(null);
}
if (grades.rank && typeof grades.rank.value === 'number' && !grades.rank.disabled) {
setServiceRank(grades.rank)
} else {
setServiceRank(null);
}
requestAnimationFrame(() => {
setTimeout(() => {
setGradesLoading(false);
setIsRefreshing(false);
}, 200);
});
} else {
setGradesLoading(false);
}
};
// Fetch grades when current period changes
useEffect(() => {
fetchGradesForPeriod(currentPeriod);
}, [currentPeriod]);
const grades = useMemo(() => {
return subjects.flatMap((subject) => subject.grades || []);
}, [subjects]);
const getSubjectById = useCallback((id: string) => {
return subjects.find((subject) => subject.id === id);
}, [subjects]);
// Sort
// Sort grades in subjects by date descending then sort subjects by latest grade descending
const sortedSubjects = useMemo(() => {
const subjectsCopy = [...subjects];
subjectsCopy.forEach((subject) => {
subject.grades.sort((a, b) => b.givenAt.getTime() - a.givenAt.getTime());
});
switch (sortMethod) {
case "alphabetical":
subjectsCopy.sort((a, b) => {
const nameA = getSubjectName(a.name).toLowerCase();
const nameB = getSubjectName(b.name).toLowerCase();
return nameA.localeCompare(nameB);
});
break;
case "averages":
subjectsCopy.sort((a, b) => {
const aAvg = a.studentAverage.value;
const bAvg = b.studentAverage.value;
return bAvg - aAvg;
});
break;
default:
subjectsCopy.sort((a, b) => {
const aLatestGrade = a.grades?.[0];
const bLatestGrade = b.grades?.[0];
if (!aLatestGrade && !bLatestGrade) { return 0; }
if (!aLatestGrade) { return 1; }
if (!bLatestGrade) { return -1; }
return bLatestGrade.givenAt.getTime() - aLatestGrade.givenAt.getTime();
});
break;
}
return subjectsCopy;
}, [subjects, sortMethod]);
const sortedGrades = useMemo(() => {
const gradesCopy = [...grades];
gradesCopy.sort((a, b) => b.givenAt.getTime() - a.givenAt.getTime());
return gradesCopy;
}, [grades]);
// Search
const [searchText, setSearchText] = useState("");
const filteredSubjects = useMemo(() => {
if (searchText.trim() === "") {
return sortedSubjects;
}
const lowerSearchText = searchText.toLowerCase();
return sortedSubjects.filter((subject) => {
const subjectName = getSubjectName(subject.name).toLowerCase();
if (subjectName.includes(lowerSearchText)) {
return true;
}
// Also search in grades descriptions
const matchingGrades = subject.grades?.filter((grade) => {
return grade.description?.toLowerCase().includes(lowerSearchText);
});
return (matchingGrades?.length || 0) > 0;
});
}, [searchText, sortedSubjects]);
// Refresh
const handleRefresh = useCallback(async () => {
setIsRefreshing(true);
if (periods.length === 0) {
fetchPeriods();
}
fetchGradesForPeriod(currentPeriod);
}, [currentPeriod, periods]);
const renderItem = useCallback(({ item }: { item: any }) => {
const subject = item as Subject;
return (
{/* @ts-expect-error navigation types */}
)
}, [grades]);
const keyboardHeight = useKeyboardHeight();
const footerStyle = useAnimatedStyle(() => ({
height: keyboardHeight.value - bottomTabBarHeight,
}));
// influences
const { getAvgInfluence, getAvgClassInfluence } = useGradeInfluence(subjects, getSubjectById);
// header
const ListHeader = useMemo(() => ((sortedGrades.length > 0 && searchText.length === 0) ? (
{serviceRank && (
-
{t('Grades_Tab_Rank')}
{t('Grades_Tab_Rank_Description')}
{serviceRank.value}
/{serviceRank.outOf}
)}
{t('Grades_Tab_Latest')}
item.id}
renderItem={({ item: grade }) =>
}>
{
// @ts-expect-error navigation types
navigation.navigate('(modals)/grade', {
grade: grade,
subjectInfo: {
name: getSubjectName(getSubjectById(grade.subjectId)?.name || ""),
color: getSubjectColor(getSubjectById(grade.subjectId)?.name || ""),
emoji: getSubjectEmoji(getSubjectById(grade.subjectId)?.name || ""),
originalName: getSubjectById(grade.subjectId)?.name || ""
},
avgInfluence: getAvgInfluence(grade),
avgClass: getAvgClassInfluence(grade),
})
}}
/>
}
/>
{t('Grades_Tab_Subjects')}
) : null), [sortedGrades, searchText]);
return (
{/* Header */}
{
const actionId = nativeEvent.event;
if (actionId.startsWith("period:")) {
const selectedPeriodId = actionId.replace("period:", "");
const newPeriod = periods.find(period => period.id === selectedPeriodId);
setCurrentPeriod(newPeriod);
if (newPeriod?.id) {
mutateSettings('personalization', { gradesPeriodId: newPeriod.id });
}
}
}}
actions={
periods.map((period) => ({
id: "period:" + period.id,
title: (getPeriodName(period.name || "") + " " + (isPeriodWithNumber(period.name || "") ? getPeriodNumber(period.name || "0") : "")).trim(),
subtitle: `${period.start.toLocaleDateString(i18n.language, {
month: "short",
year: "numeric",
})
} - ${period.end.toLocaleDateString(i18n.language, {
month: "short",
year: "numeric",
})
} `,
state: currentPeriod?.id === period.id ? "on" : "off",
image: Platform.select({
ios: (getPeriodNumber(period.name || "0")) + ".calendar"
}),
imageColor: colors.text,
}))
}
>
0 ? getPeriodName(currentPeriod?.name || '') : t("Tab_Grades")}
number={isPeriodWithNumber(currentPeriod?.name || '') ? getPeriodNumber(currentPeriod?.name || '') : undefined}
loading={loading}
chevron={periods.length > 1}
/>
}
/* Filtres */
trailing={
{
const actionId = nativeEvent.event;
if (actionId.startsWith("sort:")) {
const selectedSorting = actionId.replace("sort:", "");
updateSortMethod(selectedSorting);
}
}}
actions={
sortings.map((s) => ({
id: "sort:" + s.value,
title: s.label,
state: sortMethod === s.value ? "on" : "off",
papicon: s.icon.papicon,
image: Platform.select({
ios: s.icon.ios,
android: s.icon.android,
}),
imageColor: colors.text,
}))
}
icon={sortings.find(s => s.value === sortMethod)?.icon.papicon || 'filter'} chevron
>
{sortings.find(s => s.value === sortMethod)?.label || t("Grades_Sort")}
}
/* Recherche */
bottom={ setSearchText(text)} />}
shouldCollapseHeader={shouldCollapseHeader}
/>
item.id}
itemLayoutAnimation={LinearTransition.springify()}
refreshControl={
}
ListHeaderComponent={ListHeader}
ListFooterComponent={ }
ListEmptyComponent={loading ? undefined :
{t('Grades_Empty_Title')}
{t('Grades_Empty_Description')}
}
>
{filteredSubjects.map((subject) => (
))}
)
};
export default GradesView;
================================================
FILE: app/(tabs)/grades/modals/AboutAverages.tsx
================================================
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { useTheme } from "@react-navigation/native";
import React from "react";
import { ScrollView, Text, View, Image } from "react-native";
export default function AboutAverages() {
const theme = useTheme();
return (
À propos des moyennes générales
Bien que cela semble trivial, calculer une moyenne générale est un processus complexe, encore plus lorsque nous ne savons rien de ton établissement ainsi que de son processus de calcul.
Comment Papillon calcule-t-il les moyennes générales ?
Pour cela, il existe deux méthodes princpales : la moyenne des matières ainsi que la moyenne pondérée des notes.
Papillon regroupe automatiquement vos notes en fonction de leur matière présumée et en calcule la moyenne en tenant compte des coefficients et autres paramètres. Ensuite, il peut ou non calculer la moyennes des matières entre-elles.
Pourquoi peut-il se tromper ?
Il ne s'agit que d'estimations, car nous manquons souvent du contexte nécessaire pour calculer une moyenne exacte. D'autant plus que certains services obfusquent parfois le fonctionnement de leur calcul.
Comment savoir si c'est ma VRAIE moyenne ?
Lorsque Papillon affiche qu'une moyenne est fournie par l'établissement, c'est qu'il n'y a aucune différence entre votre moyenne réelle et celle affichée. Cependant, si la mention "estimée" ou une date apparaît, il peut exister une différence de l'ordre de quelques demi-points.
);
}
================================================
FILE: app/(tabs)/grades/modals/SubjectInfo.tsx
================================================
import ModalOverhead, { ModalOverHeadScore } from "@/components/ModalOverhead";
import Subject from "@/database/models/Subject";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
import TypographyLegacy from "@/ui/components/Typography";
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
import { Papicons } from "@getpapillon/papicons";
import { useRoute, useTheme } from "@react-navigation/native";
import React from "react";
import { Platform, View } from "react-native";
import LinearGradient from "react-native-linear-gradient";
import { colorCheck } from '@/utils/colorCheck';
import adjust from "@/utils/adjustColor";
import i18n from "@/utils/i18n";
import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import Icon from "@/ui/components/Icon";
const SubjectInfo = () => {
const { params } = useRoute();
const theme = useTheme();
const colors = theme.colors;
const subject: Subject = params?.subject;
const subjectColor = getSubjectColor(subject?.name);
const subjectName = getSubjectName(subject?.name);
const subjectEmoji = getSubjectEmoji(subject?.name);
const outOf = subject.outOf.value;
const averagesData = [
{
title: i18n.t("SubjectInfo_ClassAverage_Label"),
subtitle: i18n.t("SubjectInfo_ClassAverage_Description"),
disabled: subject.classAverage.disabled,
value: subject.classAverage.value.toFixed(2),
status: subject.classAverage.status,
icon: "GraduationHat",
},
{
title: i18n.t("SubjectInfo_MaxAverage_Label"),
subtitle: i18n.t("SubjectInfo_MaxAverage_Description"),
disabled: subject.maximum.disabled,
value: subject.maximum.value.toFixed(2),
status: subject.maximum.status,
icon: "ArrowRightUp",
},
{
title: i18n.t("SubjectInfo_MinAverage_Label"),
subtitle: i18n.t("SubjectInfo_MinAverage_Description"),
disabled: subject.minimum.disabled,
value: subject.minimum.value.toFixed(2),
status: subject.minimum.status,
icon: "Minus",
}
]
return (
<>
{Platform.OS !== 'android' && (
)}
}
style={{
marginBottom: (!subject.studentAverage.disabled && subject.studentAverage.value === subject.maximum.value) ? 12 : 0
}}
/>
{(!subject.studentAverage.disabled && subject.studentAverage.value === subject.maximum.value) && (
{i18n.t("SubjectInfo_MaxAverage_Description")}
)}
}
contentContainerStyle={{
padding: 16,
}}
>
{i18n.t("SubjectInfo_Stats_Header")}
{averagesData.map((average, index) => (
{average.title}
{average.subtitle}
{average.disabled ? average.status : average.value}
/{outOf}
))}
>
);
};
export default SubjectInfo;
================================================
FILE: app/(tabs)/grades/utils/graph.ts
================================================
export interface GraphPoint {
value: number;
date: Date;
originalValue?: number;
originalDate?: Date;
}
export interface AverageHistoryItem {
average: number;
date: Date | string;
}
export const calculateAmplifiedGraphPoints = (
currentAverageHistory: AverageHistoryItem[],
scale: number
): GraphPoint[] => {
if (!currentAverageHistory) { return []; }
const points = currentAverageHistory
.filter(item => !isNaN(item.average) && item.average !== null && item.average !== undefined)
.map(item => ({
value: item.average,
date: new Date(item.date),
originalValue: item.average,
originalDate: new Date(item.date)
}));
if (points.length === 0) return [];
const values = points.map(p => p.value);
const dataMin = Math.min(...values);
const dataMax = Math.max(...values);
const dataRange = dataMax - dataMin;
const recentCount = Math.max(5, Math.floor(points.length * 0.5));
const recentPoints = points.slice(-recentCount);
const recentValues = recentPoints.map(p => p.value);
const recentMin = Math.min(...recentValues);
const recentMax = Math.max(...recentValues);
const recentRange = recentMax - recentMin;
const recentMean = recentValues.reduce((a, b) => a + b, 0) / recentValues.length;
const recentScaleUsage = (recentRange / scale) * 100;
const globalScaleUsage = (dataRange / scale) * 100;
const OUTLIER_THRESHOLD = 3;
const compressedPoints = points.map(p => {
const distanceFromRecent = Math.abs(p.value - recentMean);
if (distanceFromRecent > OUTLIER_THRESHOLD) {
const direction = p.value < recentMean ? -1 : 1;
const excessDistance = distanceFromRecent - OUTLIER_THRESHOLD;
const compressionFactor = 0.3;
const compressedDistance = OUTLIER_THRESHOLD + (excessDistance * compressionFactor);
return {
...p,
value: recentMean + (direction * compressedDistance)
};
}
return p;
});
const peakAmplifiedPoints = compressedPoints.map((p, i) => {
const windowSize = 2;
const start = Math.max(0, i - windowSize);
const end = Math.min(compressedPoints.length - 1, i + windowSize);
const neighbors = compressedPoints
.slice(start, end + 1)
.filter((_, idx) => start + idx !== i);
if (neighbors.length === 0) return p;
const neighborAvg = neighbors.reduce((sum, n) => sum + n.value, 0) / neighbors.length;
const localDeviation = p.value - neighborAvg;
const MIN_DEVIATION = 0.2;
if (Math.abs(localDeviation) > MIN_DEVIATION) {
const peakAmplification = 3.5;
return {
...p,
value: neighborAvg + (localDeviation * peakAmplification)
};
}
return p;
});
const shouldAmplify = (globalScaleUsage < 30 || recentScaleUsage < 20) && dataRange > 0;
let finalPoints = peakAmplifiedPoints;
if (shouldAmplify) {
const currentValues = peakAmplifiedPoints.map(p => p.value);
const currentMin = Math.min(...currentValues);
const currentMax = Math.max(...currentValues);
const targetSpread = scale * 0.4;
const currentSpread = currentMax - currentMin;
if (currentSpread < targetSpread && currentSpread > 0) {
const amplificationFactor = Math.min(4, targetSpread / currentSpread);
finalPoints = peakAmplifiedPoints.map(p => ({
...p,
value: recentMean + (p.value - recentMean) * amplificationFactor
}));
}
}
const firstDate = points[0].date.getTime();
const DAY_MS = 86400000;
const COMPRESSED_SPACING = DAY_MS * 0.50;
return finalPoints.map((p, index) => ({
...p,
value: Math.round(p.value * 100) / 100,
date: new Date(firstDate + (index * COMPRESSED_SPACING))
}));
};
================================================
FILE: app/(tabs)/index/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
export default function Layout() {
const { t } = useTranslation();
return (
);
}
================================================
FILE: app/(tabs)/index/atoms/HomeHeader.tsx
================================================
import { LiquidGlassContainer } from '@sbaiahmed1/react-native-blur';
import { router } from 'expo-router';
import * as WebBrowser from "expo-web-browser";
import React, { useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { Platform, Pressable, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import packageJson from '@/package.json';
import Icon from '@/ui/components/Icon';
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import { useSettingsStore } from '@/stores/settings';
import { getCurrentPeriod } from '@/utils/grades/helper/period';
import { Papicons } from '@getpapillon/papicons';
import HomeHeaderButton, { HomeHeaderButtonItem } from '../components/HomeHeaderButton';
import { useHomeHeaderData } from '../hooks/useHomeHeaderData';
import WrappedBanner from './WrappedBanner';
import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
import { ListTouchable } from '@/ui/new/List';
const HomeHeader = () => {
const { t } = useTranslation();
const insets = useSafeAreaInsets();
const theme = useTheme();
const { colors } = theme;
const { availableCanteenCards, attendancesPeriods, attendances, absencesCount, chats } = useHomeHeaderData();
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
const currentVersion = packageJson.version;
const releaseNotesUrl = `https://papillon.bzh/release-notes/${currentVersion}`;
useEffect(() => {
const installedVersion = settingsStore.installedVersion;
if (!installedVersion) {
mutateProperty("personalization", {
installedVersion: currentVersion,
releaseNotesSeenForVersion: currentVersion,
});
return;
}
if (installedVersion !== currentVersion) {
mutateProperty("personalization", { installedVersion: currentVersion });
}
}, [currentVersion, mutateProperty, settingsStore.installedVersion]);
const showReleaseNotesBanner = settingsStore.releaseNotesSeenForVersion !== currentVersion;
const HomeHeaderButtons: HomeHeaderButtonItem[] = useMemo(() => [
{
title: t("Home_Cards_Button_Title"),
icon: "card",
color: "#EE9F00",
description: availableCanteenCards.length > 0 ?
(availableCanteenCards.length > 1 ? t("Home_Cards_Button_Description_Number", { number: availableCanteenCards.length }) :
t("Home_Cards_Button_Description_Singular")) : t("Home_Cards_Button_Description_None"),
onPress: () => {
router.push("/(features)/(cards)/cards");
}
},
{
title: t("Home_Menu_Button_Title"),
icon: "cutlery",
color: "#7ED62B",
description: t("Home_Menu_Button_Description"),
onPress: () => {
router.push("/(features)/soon");
}
},
{
title: t("Home_Attendance_Title"),
icon: "chair",
color: "#D62B94",
description: absencesCount > 0 ?
(absencesCount > 1 ? t("Home_Attendance_Button_Description_Number", { number: absencesCount }) : t("Home_Attendance_Button_Description_Singular"))
: t("Home_Attendance_Button_Description_None"),
onPress: () => {
router.push({
pathname: "/(features)/attendance",
params: {
periods: JSON.stringify(attendancesPeriods),
currentPeriod: JSON.stringify(getCurrentPeriod(attendancesPeriods)),
attendances: JSON.stringify(attendances),
},
});
}
},
{
title: t("Home_Chats_Button_Title"),
icon: "textbubble",
color: "#2B7ED6",
description: chats.length > 0 ?
(chats.length > 1 ? t("Home_Chats_Button_Description_Number", { number: chats.length }) : t("Home_Chats_Button_Description_Singular"))
: t("Home_Chats_Button_Description_None"),
onPress: () => {
router.push("/(features)/soon");
}
}
], [availableCanteenCards, absencesCount, chats, attendancesPeriods, attendances, t]);
return (
{Array.from({ length: Math.ceil(HomeHeaderButtons.length / 2) }).map((_, i) => (
{HomeHeaderButtons.slice(i * 2, i * 2 + 2).map((item) => (
))}
{HomeHeaderButtons.slice(i * 2, i * 2 + 2).length === 1 && }
))}
{showReleaseNotesBanner && (
WebBrowser.openBrowserAsync(releaseNotesUrl, {
presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,
})
}>
{t("Home_Release_Notes_Banner", { version: currentVersion })}
{t("Home_Release_Notes_Banner_Description")}
{
event.stopPropagation();
mutateProperty("personalization", { releaseNotesSeenForVersion: currentVersion });
}}
>
)}
{__DEV__ && 1 === 2 && (
)}
);
};
export default HomeHeader;
================================================
FILE: app/(tabs)/index/atoms/HomeTopBar.tsx
================================================
import { ProgressiveBlurView } from '@sbaiahmed1/react-native-blur';
import { useRouter } from 'expo-router';
import React from 'react';
import { Platform, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import Stack from '@/ui/components/Stack';
import HomeTopBarButton from '../components/HomeTopBarButton';
import UserProfile from './UserProfile';
const HomeTopBar = ({ height = 56 }: { height?: number }) => {
const insets = useSafeAreaInsets();
const router = useRouter();
return (
<>
{Platform.OS === 'ios' && (
)}
router.push("/(modals)/wallpaper")} />
router.push("/(settings)/settings")} />
>
);
};
export default HomeTopBar;
================================================
FILE: app/(tabs)/index/atoms/UserProfile.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { MenuView } from '@react-native-menu/menu';
import { useTheme } from '@react-navigation/native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import { useRouter } from 'expo-router';
import React from 'react';
import { Dimensions, Platform, StyleSheet } from 'react-native';
import { Pressable } from 'react-native';
import { initializeAccountManager } from '@/services/shared';
import { useAccountStore } from '@/stores/account';
import Avatar from '@/ui/components/Avatar';
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { useUserProfileData } from '../hooks/useUserProfileData';
import { t } from 'i18next';
import { formatSchoolName } from '@/utils/format/formatSchoolName';
import ActionMenu from '@/ui/components/ActionMenu';
const UserProfile = ({ subtitle, onPress }: { subtitle?: string, onPress?: () => void }) => {
const router = useRouter();
const { firstName, lastName, initials, profilePicture, level, establishment } = useUserProfileData() ?? {};
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const theme = useTheme();
const AccountsMenuItems = (accounts && accounts.length > 0) && accounts.map((account) => ({
id: account.id,
title: account.firstName + ' ' + account.lastName,
subtitle: formatSchoolName(account.schoolName ?? ""),
state: account.id === lastUsedAccount ? 'on' : 'off',
})) || [];
return (
router.push('/(modals)/profile')}>
{
if (nativeEvent.event === "edit") {
router.push('/(modals)/profile');
return;
}
if (nativeEvent.event === "add") {
router.push("/(onboarding)/ageSelection?action=addService");
return;
}
const store = useAccountStore.getState();
store.setLastUsedAccount(nativeEvent.event);
await initializeAccountManager();
}}
actions={[
...Platform.OS === "ios" ? [{
id: 'workspaces',
title: '',
displayInline: true,
subactions: AccountsMenuItems,
}] : AccountsMenuItems,
{
id: 'edit',
title: t('Home_Edit_Profile'),
image: 'person.crop.circle',
papicon: 'user',
imageColor: theme.colors.text,
},
{
id: 'add',
title: t('Home_Add_Profile'),
image: 'plus',
papicon: 'add',
imageColor: theme.colors.text,
},
]}
>
{firstName && lastName ? `${firstName} ${lastName}` : "Mon compte"}
{subtitle &&
{subtitle}
}
);
};
const UserProfileItemContainer = ({ children }: { children: React.ReactNode }) => {
if (runsIOS26) {
return (
{children}
);
}
return (
{children}
)
}
const styles = StyleSheet.create({
container: {
shadowColor: "#000",
shadowOffset: {
width: 0,
height: 0,
},
shadowOpacity: 0.3,
shadowRadius: 2,
}
});
export default UserProfile;
================================================
FILE: app/(tabs)/index/atoms/Wallpaper.tsx
================================================
import MaskedView from '@react-native-masked-view/masked-view';
import { File, Paths } from 'expo-file-system';
import React, { useEffect, useState } from 'react';
import { Image, StyleSheet } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import { useSettingsStore } from '@/stores/settings';
const Wallpaper = ({ height = 400, dim = true }) => {
try {
const settingsStore = useSettingsStore(state => state.personalization);
const currentWallpaper = settingsStore.wallpaper;
const [image, setImage] = useState(null);
useEffect(() => {
if (currentWallpaper?.path?.name) {
const file = new File(Paths.document, currentWallpaper.path.directory || '', currentWallpaper.path.name);
if (file.exists) {
setImage(file.uri);
} else {
setImage(null);
}
}
else {
setImage(null);
}
}, [currentWallpaper]);
return (
}
>
{dim &&
}
);
} catch (error) {
console.log(error);
return null;
}
};
const styles = StyleSheet.create({
container: {
width: '100%',
position: 'absolute',
top: 0,
left: 0,
zIndex: -9
},
image: {
width: '100%',
position: 'absolute',
top: 0,
left: 0
},
dimGradient: {
width: '100%',
position: 'absolute',
top: 0,
left: 0,
zIndex: 1
}
});
export default Wallpaper;
================================================
FILE: app/(tabs)/index/atoms/WrappedBanner.tsx
================================================
import { useFocusEffect } from "@react-navigation/native";
import { useEvent } from "expo";
import { useNavigation } from 'expo-router';
import { useVideoPlayer, VideoSource, VideoView } from 'expo-video';
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { Image, View } from 'react-native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
// Import assets
const videoAssetId = require('@/assets/video/wrapped.mp4');
const overlayImage = require('@/assets/images/monYearbook.png');
const placeholderImage = require('@/assets/images/wrapped-static.png');
const videoSource: VideoSource = {
assetId: videoAssetId
};
// Dimensions for the banner view (adjust as needed)
const BANNER_HEIGHT = 130; // Use a fixed height for better layout stability
const WrappedBanner = () => {
const navigation = useNavigation();
// Using a ref to hold the player ensures it doesn't get re-created on every render
const playerRef = useRef(useVideoPlayer(videoSource, player => {
player.loop = true;
player.muted = true;
player.showNowPlayingNotification = false;
player.audioMixingMode = "mixWithOthers";
}));
const player = playerRef.current;
// State to track if the component is in focus
const [isFocused, setIsFocused] = useState(false);
// State to track if the video is currently loading/buffering
const [isLoading, setIsLoading] = useState(true);
// Set the initial player state to loading
useEvent(player, 'loadStart', () => setIsLoading(true));
useEvent(player, 'loadedMetadata', () => setIsLoading(false));
// --- Video Playback Control on Focus/Blur ---
useFocusEffect(
useCallback(() => {
// Screen is focused (visible)
setIsFocused(true);
// Play the video when the screen becomes focused
player.play();
return () => {
// Screen is blurred (no longer visible)
setIsFocused(false);
// Pause the video to save resources
try {
player.pause();
} catch (e) {
// Ignore error if native player object is not found
}
// For *extreme* optimization on Android/iOS, you might consider:
// player.replace(null); // This unloads the video resource completely
// If you unload, you need to call player.replace(videoSource) on focus
};
}, [player])
);
// Fallback to ensure play state
const { isPlaying } = useEvent(player, 'playingChange', { isPlaying: player.playing });
useEffect(() => {
if (isFocused && !isPlaying) {
// Only attempt to play if the component is focused
player.play();
}
}, [isFocused, isPlaying, player]);
// --- End Video Control ---
// Conditional Video Rendering: Only render VideoView if focused
const shouldRenderVideo = isFocused && !isLoading;
return (
navigation.navigate('(modals)/wrapped')}
style={{ marginTop: 12 }}
>
{shouldRenderVideo && (
)}
);
};
export default WrappedBanner;
================================================
FILE: app/(tabs)/index/components/HomeHeaderButton.ios.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useTheme } from '@react-navigation/native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import React from 'react';
import { Pressable, StyleSheet, View } from 'react-native';
import Typography from '@/ui/components/Typography';
export interface HomeHeaderButtonItem {
title: string;
icon: string;
color: string;
description: string;
onPress?: () => void;
}
interface HomeHeaderButtonProps {
item: HomeHeaderButtonItem;
}
const HomeHeaderButton: React.FC = ({ item }) => {
const { colors } = useTheme();
return (
{item.title}
{item.description}
);
};
const styles = StyleSheet.create({
headerBtn: {
flex: 1,
width: "100%",
flexDirection: "row",
borderCurve: "circular",
borderRadius: 20,
padding: 10,
gap: 8
}
});
export default HomeHeaderButton;
================================================
FILE: app/(tabs)/index/components/HomeHeaderButton.tsx
================================================
import React from 'react';
import { Pressable, StyleSheet, View } from 'react-native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import { Papicons } from '@getpapillon/papicons';
import Typography from '@/ui/new/Typography';
import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import Stack from '@/ui/components/Stack';
import { TouchableNativeFeedback } from 'react-native';
export interface HomeHeaderButtonItem {
title: string;
icon: string;
color: string;
description: string;
onPress?: () => void;
}
interface HomeHeaderButtonProps {
item: HomeHeaderButtonItem;
}
const HomeHeaderButton: React.FC = ({ item }) => {
const { colors } = useTheme();
return (
{item.title}
{item.description}
);
};
const styles = StyleSheet.create({
headerBtn: {
flex: 1,
width: "100%",
flexDirection: "row",
}
});
export default HomeHeaderButton;
================================================
FILE: app/(tabs)/index/components/HomeTopBarButton.ios.tsx
================================================
import React from 'react';
import { Pressable, View } from 'react-native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import Icon from '@/ui/components/Icon';
import { Papicons } from '@getpapillon/papicons';
interface HomeTopBarButtonProps {
icon: string;
onPress?: () => void;
}
const HomeTopBarButton: React.FC = ({ icon, onPress }) => {
return (
);
};
export default HomeTopBarButton;
================================================
FILE: app/(tabs)/index/components/HomeTopBarButton.tsx
================================================
import React from 'react';
import { Pressable, TouchableNativeFeedback, View } from 'react-native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import Icon from '@/ui/components/Icon';
import { Papicons } from '@getpapillon/papicons';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import Stack from '@/ui/components/Stack';
interface HomeTopBarButtonProps {
icon: string;
onPress?: () => void;
}
const HomeTopBarButton: React.FC = ({ icon, onPress }) => {
return (
);
};
export default HomeTopBarButton;
================================================
FILE: app/(tabs)/index/components/HomeWidget.tsx
================================================
import React from 'react';
import Stack from '@/ui/components/Stack';
import Icon from '@/ui/components/Icon';
import { t } from 'i18next';
import Typography from '@/ui/components/Typography';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { Papicons } from '@getpapillon/papicons';
import { useRouter } from 'expo-router';
import { useTheme } from '@react-navigation/native';
import { Platform } from 'react-native';
import { ErrorBoundary } from '@/ui/components/ErrorBoundary';
import { ListTouchable } from '@/ui/new/List';
export interface HomeWidgetItem {
icon: React.ReactNode;
title: string;
redirect?: string;
onPress?: () => void;
buttonLabel?: string;
render?: () => React.ReactNode;
dev?: boolean;
hidden?: boolean;
}
interface HomeWidgetProps {
item: HomeWidgetItem;
}
const HomeWidgetContent: React.FC = ({ item }) => {
const router = useRouter();
const theme = useTheme();
if (!item || (item.dev && !__DEV__)) {
return null;
}
return (
{item.icon}
{item.title}
{(item.redirect || item.onPress) && (
item.onPress ? item.onPress() : router.navigate(item.redirect as any)}
>
{t('Home_Display_More',)}
)}
{item.render && item.render()}
);
};
const HomeWidget: React.FC = React.memo((props) => (
));
export default HomeWidget;
================================================
FILE: app/(tabs)/index/hooks/useHomeData.ts
================================================
import { router } from 'expo-router';
import { instance } from 'pawnote';
import { useCallback, useEffect } from 'react';
import { getWeekNumberFromDate } from '@/database/useHomework';
import { AuthenticationError } from '@/services/errors/AuthenticationError';
import { getManager, initializeAccountManager } from "@/services/shared";
import { Grade, Period } from '@/services/shared/grade';
import { Services } from '@/stores/account/types';
import { useSettingsStore } from '@/stores/settings';
import { useAlert } from '@/ui/components/AlertProvider';
import { getCurrentPeriod } from '@/utils/grades/helper/period';
import { log, warn } from '@/utils/logger/logger';
import { useAccountStore } from '@/stores/account';
const HOME_SYNC_TTL_MS = 5 * 60 * 1000;
const homeSyncState = new Map<
string,
{ lastSyncedAt: number; inFlight: Promise | null }
>();
export const useHomeData = () => {
const alert = useAlert();
const settingsstore = useSettingsStore(state => state.personalization);
const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const fetchEDT = useCallback(async () => {
const manager = getManager();
const date = new Date();
const weekNumber = getWeekNumberFromDate(date);
await manager.getWeeklyTimetable(weekNumber, date);
}, []);
const fetchGrades = useCallback(async () => {
const manager = getManager();
if (!manager) {
warn('Manager is null, skipping grades fetch');
return;
}
const gradePeriods = await manager.getGradesPeriods();
const validPeriods: Period[] = [];
const date = new Date().getTime();
for (const period of gradePeriods) {
if (period.start.getTime() > date && period.end.getTime() > date) {
validPeriods.push(period);
}
}
const grades: Grade[] = [];
const currentPeriod = getCurrentPeriod(validPeriods);
if (currentPeriod) {
const periodGrades = await manager.getGradesForPeriod(currentPeriod, currentPeriod.createdByAccount);
periodGrades.subjects.forEach(subject => {
subject.grades.forEach(grade => {
grades.push(grade);
});
});
}
}, []);
const initialize = useCallback(async () => {
if (!lastUsedAccount) {
return;
}
const state =
homeSyncState.get(lastUsedAccount) ?? {
lastSyncedAt: 0,
inFlight: null,
};
homeSyncState.set(lastUsedAccount, state);
if (state.inFlight) {
await state.inFlight;
return;
}
if (Date.now() - state.lastSyncedAt < HOME_SYNC_TTL_MS) {
return;
}
state.inFlight = (async () => {
try {
await initializeAccountManager(lastUsedAccount);
log("Refreshed Manager received");
await Promise.all([fetchEDT(), fetchGrades()]);
state.lastSyncedAt = Date.now();
if (settingsstore.showAlertAtLogin) {
alert.showAlert({
title: "Synchronisation réussie",
description: "Toutes vos données ont été mises à jour avec succès.",
icon: "CheckCircle",
color: "#00C851",
withoutNavbar: true,
delay: 1000
});
}
} catch (error) {
if (String(error).includes("Unable to find")) { return; }
if (error instanceof AuthenticationError) {
const instanceURL = error?.service?.auth?.additionals?.["instanceURL"] ?? "";
const serviceId = error?.service?.id ?? undefined;
alert.showAlert({
title: "Vous avez été déconnecté",
message: instanceURL ? `En savoir plus et se reconnecter` : "En savoir plus",
description: "Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.",
icon: "UserCross",
color: "#D60046",
customButton: instanceURL ? {
label: "Me reconnecter",
showCancelButton: error.service.serviceId === Services.PRONOTE,
onPress: async () => {
const authUrl = instanceURL;
const instanceInfo = await instance(authUrl as string);
if (instanceInfo && instanceInfo.name) {
return setTimeout(() => {
router.navigate("/(onboarding)/ageSelection");
setTimeout(() => {
router.navigate({ pathname: "/(onboarding)/services/pronote/browser", params: { url: authUrl, school: instanceInfo.name } })
}, 400)
}, 100)
}
setTimeout(() => {
router.navigate({ pathname: "/(onboarding)/services/pronote/browser", params: { url: authUrl, school: "N/A" } })
}, 200)
}
} : undefined,
technical: error.message
})
}
}
})();
try {
await state.inFlight;
} finally {
state.inFlight = null;
}
}, [alert, fetchEDT, fetchGrades, settingsstore.showAlertAtLogin, lastUsedAccount]);
useEffect(() => {
initialize();
}, [initialize]);
};
================================================
FILE: app/(tabs)/index/hooks/useHomeHeaderData.ts
================================================
import { useState, useEffect, useMemo, useRef } from 'react';
import { getChatsFromCache } from '@/database/useChat';
import { AccountManager, getManager, subscribeManagerUpdate } from '@/services/shared';
import { Attendance } from '@/services/shared/attendance';
import { Chat } from '@/services/shared/chat';
import { Period } from '@/services/shared/grade';
import { getCurrentPeriod } from '@/utils/grades/helper/period';
import { useAccountStore } from '@/stores/account';
import { Services } from '@/stores/account/types';
export const useHomeHeaderData = () => {
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
const availableCanteenCards = useMemo(
() =>
account?.services.filter(service =>
[
Services.TURBOSELF,
Services.ALISE,
Services.ARD,
Services.ECOLEDIRECTE,
Services.IZLY,
].includes(service.serviceId)
) ?? [],
[account]
);
const attendancesPeriodsRef = useRef([]);
const [attendances, setAttendances] = useState([]);
const [chats, setChats] = useState([]);
const absencesCount = useMemo(() => {
if (!attendances) return 0;
let count = 0;
attendances.forEach(att => {
if(att && "absences" in att) {
if (att.absences) count += att.absences.length;
}
});
return count;
}, [attendances]);
useEffect(() => {
const init = async () => {
const cachedChats = await getChatsFromCache();
setChats(cachedChats);
};
init();
const updateAttendance = async (manager: AccountManager) => {
const periods = await manager.getAttendancePeriods();
const currentPeriod = getCurrentPeriod(periods);
const fetchedAttendances = await manager.getAttendanceForPeriod(currentPeriod.name);
attendancesPeriodsRef.current = periods;
setAttendances(fetchedAttendances);
};
const updateDiscussions = async (manager: AccountManager) => {
const fetchedChats = await manager.getChats();
setChats(fetchedChats);
};
const unsubscribe = subscribeManagerUpdate((_) => {
const manager = getManager();
updateAttendance(manager);
updateDiscussions(manager);
});
return () => unsubscribe();
}, []);
return {
availableCanteenCards,
attendancesPeriods: attendancesPeriodsRef.current,
attendances,
absencesCount,
chats
};
};
================================================
FILE: app/(tabs)/index/hooks/useTimetableWidgetData.ts
================================================
import { useState, useEffect, useMemo } from "react";
import { useAccountStore } from "@/stores/account";
import { getWeekNumberFromDate } from "@/database/useHomework";
import { useTimetable } from "@/database/useTimetable";
import { Course as SharedCourse } from "@/services/shared/timetable";
export const useTimetableWidgetData = () => {
const now = new Date();
const weekNumber = getWeekNumberFromDate(now);
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
const services = useMemo(() =>
account?.services?.map((service: { id: string }) => service.id) ?? [],
[account?.services]
);
const [courses, setCourses] = useState([]);
const timetableData = useTimetable(undefined, weekNumber);
const weeklyTimetable = useMemo(() =>
timetableData.map(day => ({
...day,
courses: day.courses.filter(course =>
services.includes(course.createdByAccount) || course.createdByAccount.startsWith('ical_')
)
})).filter(day => day.courses.length > 0),
[timetableData, services]
);
useEffect(() => {
const fetchData = async () => {
const today = new Date();
today.setHours(0, 0, 0, 0);
let dayCourse = weeklyTimetable.find(day => day.date.getTime() === today.getTime())?.courses ?? [];
if (dayCourse.length === 0) {
const futureDays = weeklyTimetable
.filter(day => day.date.getTime() > today.getTime())
.sort((a, b) => a.date.getTime() - b.date.getTime());
if (futureDays.length > 0) {
dayCourse = futureDays[0].courses;
}
}
dayCourse = dayCourse.filter(course => course.to.getTime() > Date.now());
setCourses(dayCourse);
};
fetchData();
}, [weeklyTimetable]);
return { courses };
};
================================================
FILE: app/(tabs)/index/hooks/useUserProfileData.ts
================================================
import { useMemo } from 'react';
import { useAccountStore } from '@/stores/account';
import { getInitials } from '@/utils/chats/initials';
export const useUserProfileData = () => {
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
const [firstName, lastName, level, establishment] = useMemo(() => {
if (!lastUsedAccount) { return [null, null, null, null]; }
const firstName = account?.firstName;
const lastName = account?.lastName;
const level = account?.className;
const establishment = account?.schoolName;
return [firstName, lastName, level, establishment];
}, [lastUsedAccount, account]);
const initials = useMemo(() => getInitials(`${account?.firstName} ${account?.lastName}`), [account]);
const profilePicture = useMemo(() => {
if (account && account.customisation && account.customisation.profilePicture && !account.customisation.profilePicture.startsWith("PCFET0NUWVBFIGh0bWw+")) {
return `data:image/png;base64,${account.customisation.profilePicture}`;
}
return undefined;
}, [account]);
if(!account) {return null;}
return {
firstName,
lastName,
level,
establishment,
initials,
profilePicture
};
};
================================================
FILE: app/(tabs)/index/index.old.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useHeaderHeight } from "@react-navigation/elements";
import { useTheme } from "@react-navigation/native";
import { useNavigation, useRouter } from "expo-router";
import { t } from "i18next";
import { instance } from "pawnote";
import { useCallback, useEffect, useMemo, useState } from "react";
import React, { Alert, Dimensions, FlatList, Platform, View } from "react-native";
import LinearGradient from "react-native-linear-gradient";
import Reanimated, { FadeInUp, FadeOutUp, LinearTransition } from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { removeAllDuplicates } from "@/database/DatabaseProvider";
import { getHomeworksFromCache, getWeekNumberFromDate, updateHomeworkIsDone } from "@/database/useHomework";
import { useTimetable } from "@/database/useTimetable";
import { AuthenticationError } from "@/services/errors/AuthenticationError";
import { getManager, initializeAccountManager, subscribeManagerUpdate } from "@/services/shared";
import { Grade, Period } from "@/services/shared/grade";
import { Homework } from "@/services/shared/homework";
import { Course as SharedCourse, CourseStatus } from "@/services/shared/timetable";
import { useAccountStore } from "@/stores/account";
import { useSettingsStore } from "@/stores/settings";
import { useAlert } from "@/ui/components/AlertProvider";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import { CompactGrade } from "@/ui/components/CompactGrade";
import CompactTask from "@/ui/components/CompactTask";
import Course from "@/ui/components/Course";
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import { NativeHeaderHighlight, NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from "@/ui/components/NativeHeader";
import { AvailablePatterns, Pattern } from "@/ui/components/Pattern/Pattern";
import Stack from "@/ui/components/Stack";
import TabFlatList from "@/ui/components/TabFlatList";
import Typography from "@/ui/components/Typography";
import { Animation } from "@/ui/utils/Animation";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
import adjust from "@/utils/adjustColor";
import { generateId } from "@/utils/generateId";
import { getCurrentPeriod } from "@/utils/grades/helper/period";
import i18n from "@/utils/i18n";
import { checkConsent } from "@/utils/logger/consent";
import { log, warn } from "@/utils/logger/logger";
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
import { getStatusText } from "../calendar";
import GradesWidget from "./widgets/Grades";
const IndexScreen = () => {
const now = new Date();
const weekNumber = getWeekNumberFromDate(now)
const [currentPage, setCurrentPage] = useState(0);
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
const services = useMemo(() =>
account?.services?.map((service: { id: string }) => service.id) ?? [],
[account?.services]
);
const [courses, setCourses] = useState([]);
const timetableData = useTimetable(undefined, weekNumber);
const weeklyTimetable = useMemo(() =>
timetableData.map(day => ({
...day,
courses: day.courses.filter(course =>
services.includes(course.createdByAccount) || course.createdByAccount.startsWith('ical_')
)
})).filter(day => day.courses.length > 0),
[timetableData, services]
);
const [grades, setGrades] = useState([]);
const insets = useSafeAreaInsets();
const router = useRouter();
const navigation = useNavigation();
const alert = useAlert();
const settingsStore = useSettingsStore(state => state.personalization)
const Initialize = async () => {
try {
await initializeAccountManager()
log("Refreshed Manager received")
} catch (error) {
if (String(error).includes("Unable to find")) { return; }
if (error instanceof AuthenticationError) {
const instanceURL = error?.service?.auth?.additionals?.["instanceURL"] ?? "";
const serviceId = error?.service?.id ?? undefined;
alert.showAlert({
title: "Connexion impossible",
description: "Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.",
icon: "AlertTriangle",
color: "#D60046",
customButton: instanceURL ? {
label: "Me reconnecter",
showCancelButton: true,
onPress: async () => {
const authUrl = instanceURL;
const instanceInfo = await instance(authUrl as string);
if (instanceInfo && instanceInfo.casToken && instanceInfo.casURL) {
return setTimeout(() => {
router.push({ pathname: "/(onboarding)/pronote/webview", params: { url: authUrl, serviceId } })
}, 200)
}
setTimeout(() => {
router.push({ pathname: "/(onboarding)/pronote/credentials", params: { url: authUrl, serviceId } })
}, 200)
}
} : undefined,
technical: error.message
})
}
}
await Promise.all([fetchEDT(), fetchGrades()]);
if (settingsStore.showAlertAtLogin) {
alert.showAlert({
title: "Synchronisation réussie",
description: "Toutes vos données ont été mises à jour avec succès.",
icon: "CheckCircle",
color: "#00C851",
withoutNavbar: true,
delay: 1000
});
}
};
useMemo(() => {
Initialize();
}, []);
const fetchEDT = useCallback(async () => {
const manager = getManager();
const date = new Date();
const weekNumber = getWeekNumberFromDate(date)
await manager.getWeeklyTimetable(weekNumber)
}, []);
const [refreshTrigger, setRefreshTrigger] = useState(0);
const [freshHomeworks, setFreshHomeworks] = useState>({});
const [homeworks, setHomeworks] = useState([]);
const fetchHomeworks = useCallback(async () => {
const manager = getManager();
const current = await manager.getHomeworks(weekNumber);
const next = await manager.getHomeworks(weekNumber + 1);
const result = [...current, ...next]
const newHomeworks: Record = {};
for (const hw of result) {
const id = generateId(
hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()
);
newHomeworks[id] = hw;
}
setFreshHomeworks(newHomeworks);
setRefreshTrigger(prev => prev + 1);
}, [weekNumber]);
async function setHomeworkAsDone(homework: Homework) {
const manager = getManager();
const id = generateId(
homework.subject + homework.content + homework.createdByAccount + homework.dueDate.toDateString()
);
await manager.setHomeworkCompletion(homework, !homework.isDone);
updateHomeworkIsDone(id, !homework.isDone)
setRefreshTrigger(prev => prev + 1);
setFreshHomeworks(prev => ({
...prev,
[id]: {
...prev[id],
isDone: !homework.isDone,
}
}));
}
const fetchGrades = useCallback(async () => {
const manager = getManager();
if (!manager) {
warn('Manager is null, skipping grades fetch');
return;
}
const gradePeriods = await manager.getGradesPeriods()
const validPeriods: Period[] = []
const date = new Date().getTime()
for (const period of gradePeriods) {
if (period.start.getTime() > date && period.end.getTime() > date) {
validPeriods.push(period);
}
}
const grades: Grade[] = []
const currentPeriod = getCurrentPeriod(validPeriods)
const periodGrades = await manager.getGradesForPeriod(currentPeriod, currentPeriod.createdByAccount)
periodGrades.subjects.forEach(subject => {
subject.grades.forEach(grade => {
grades.push(grade);
});
});
setGrades(grades.sort((a, b) => b.givenAt.getTime() - a.givenAt.getTime()).splice(0, 10))
}, [])
useEffect(() => {
const fetchHomeworksFromCache = async () => {
const currentWeekHomeworks = await getHomeworksFromCache(weekNumber);
const nextWeekHomeworks = await getHomeworksFromCache(weekNumber + 1);
const fullHomeworks = [...currentWeekHomeworks, ...nextWeekHomeworks];
// get the closest due date from now
const sortedHomeworks = fullHomeworks.sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());
// Filter done homeworks
const filteredHomeworks = sortedHomeworks.filter(hw => !hw.isDone).length > 0 ? sortedHomeworks.filter(hw => !hw.isDone) : sortedHomeworks;
// Take the first 3 homeworks
const splicedHomeworks = filteredHomeworks.splice(0, 3);
setHomeworks(splicedHomeworks);
};
fetchHomeworksFromCache();
}, [refreshTrigger])
useEffect(() => {
const fetchData = async () => {
const today = new Date();
today.setHours(0, 0, 0, 0);
let dayCourse = weeklyTimetable.find(day => day.date.getTime() === today.getTime())?.courses ?? [];
if (dayCourse.length === 0) {
const futureDays = weeklyTimetable
.filter(day => day.date.getTime() > today.getTime())
.sort((a, b) => a.date.getTime() - b.date.getTime());
if (futureDays.length > 0) {
dayCourse = futureDays[0].courses;
}
}
dayCourse = dayCourse.filter(course => course.to.getTime() > Date.now());
setCourses(dayCourse);
};
fetchData();
}, [weeklyTimetable]);
useEffect(() => {
const unsubscribe = subscribeManagerUpdate((_) => {
fetchEDT()
fetchGrades()
fetchHomeworks()
});
return () => unsubscribe();
}, []);
const theme = useTheme();
const { colors } = theme;
const [firstName] = useMemo(() => {
if (!lastUsedAccount) { return [null, null, null, null]; }
const firstName = account?.firstName;
const lastName = account?.lastName;
const level = account?.className;
const establishment = account?.schoolName;
return [firstName, lastName, level, establishment];
}, [account, accounts]);
const date = useMemo(() => new Date(), []);
const accent = colors.primary;
const foreground = adjust(accent, theme.dark ? 0.4 : -0.4);
const foregroundSecondary = adjust(accent, theme.dark ? 0.6 : -0.7) + "88";
const headerHeight = useHeaderHeight();
const [fullyScrolled, setFullyScrolled] = useState(false);
const handleFullyScrolled = useCallback((isFullyScrolled: boolean) => {
setFullyScrolled(isFullyScrolled);
}, []);
useEffect(() => {
removeAllDuplicates()
if (accounts.length > 0) {
checkConsent().then(consent => {
if (!consent.given) {
router.push("../consent");
}
});
}
}, []);
const MagicTaskWrapper = useCallback(({ item }: { item: Homework }) => {
const description = item.content.replace(/<[^>]*>/g, "");
const dueDate = new Date(item.dueDate);
const inFresh = freshHomeworks[item.id]
return (
setHomeworkAsDone(inFresh)}
ref={item}
subject={getSubjectName(item.subject)}
color={getSubjectColor(item.subject)}
description={description}
emoji={getSubjectEmoji(item.subject)}
dueDate={dueDate}
done={item.isDone}
/>
);
}, [freshHomeworks]);
const getScheduleMessage = () => {
const today = new Date();
today.setUTCHours(0, 0, 0, 0);
const todayAllCourses = weeklyTimetable.find(day => day.date.getTime() === today.getTime())?.courses ?? [];
if (todayAllCourses.length === 0) {
return todayAllCourses.length > 0 ? t("Home_Planned_Finished") : t("Home_Planned_None");
} else if (todayAllCourses.length === 1) {
return t("Home_Planned_One");
}
return t("Home_Planned_Number", { number: todayAllCourses.length });
};
const headerItems = [
(
👋
{firstName ? t("Home_Welcome_Name", { name: firstName }) : t("Home_Welcome")}
{getScheduleMessage()}
),
,
];
if (accounts.length === 0) {
router.replace("/(onboarding)/welcome");
return null;
}
return (
<>
{!runsIOS26 && fullyScrolled && (
)}
{
const page = Math.round(
e.nativeEvent.contentOffset.x / Dimensions.get("window").width
);
setCurrentPage(page);
}}
scrollEventThrottle={16}
keyExtractor={(_, index) => "headerItem:" + index}
initialNumToRender={1}
maxToRenderPerBatch={1}
removeClippedSubviews={true}
renderItem={({ item }) => (
{item}
)}
/>
{/* Pagination */}
{headerItems.length > 1 &&
{headerItems.map((item, i) => (
))}
}
>
}
gap={12}
data={[
courses.filter(item => item.to.getTime() > Date.now()).length > 0 && {
icon: ,
title: t("Home_Widget_NextCourses"),
redirect: "(tabs)/calendar",
render: () => (
{courses.filter(item => item.to.getTime() > Date.now()).slice(0, 2).map(item => (
{
(navigation as any).navigate('(modals)/course', {
course: item,
subjectInfo: {
id: item.id,
name: item.subject,
color: getSubjectColor(item.subject),
emoji: getSubjectEmoji(item.subject),
}
});
}}
/>
))}
)
},
homeworks.length > 0 && {
icon: ,
title: t("Tab_Tasks"),
redirect: "/(tabs)/tasks",
buttonLabel: homeworks.length > 3 ? `${(homeworks.length) - 3}+ autres tâches` : t("Home_See_All_Tasks"),
render: () => (
item.id + index}
renderItem={({ item }) => (
)}
/>
)
},
grades.length > 0 && {
icon: ,
title: t("Home_Widget_NewGrades"),
redirect: "(tabs)/grades",
render: () => (
item.id + index}
renderItem={({ item }) => (
{
(navigation as any).navigate('(modals)/grade', {
grade: item,
subjectInfo: {
id: item.subjectId,
name: item.subjectName,
emoji: getSubjectEmoji(item.subjectName),
color: getSubjectColor(item.subjectName)
},
allGrades: grades
});
}}
/>
)}
/>
)
},
// {
// icon: ,
// title: "Onboarding",
// redirect: "/(onboarding)/welcome",
// buttonLabel: "Aller",
// dev: true
// },
// {
// icon: ,
// title: "Devmode",
// redirect: "/devmode",
// buttonLabel: "Aller",
// dev: true
// },
// {
// icon: ,
// title: "Demo components",
// redirect: "/demo",
// buttonLabel: "Aller",
// dev: true
// },
].filter(item => item !== false && (item.dev ? __DEV__ : true))}
keyExtractor={(item) => item.title}
renderItem={({ item }) => {
if (!item || (item.dev && !__DEV__)) {
return null;
}
return (
{item.icon}
{item.title}
{(item.redirect || item.onPress) && (
item.onPress ? item.onPress() : router.navigate(item.redirect)}
>
{item.buttonLabel ?? "Afficher plus"}
)}
{item.render && (
)}
)
}}
paddingTop={0}
/>
{
Alert.alert("Ça arrive... ✨", "Cette fonctionnalité n'est pas encore disponible.")
}}
>
{date.toLocaleDateString(i18n.language, { weekday: "long" })}
{date.toLocaleDateString(i18n.language, { day: "numeric" })}
{date.toLocaleDateString(i18n.language, { month: "long" })}
router.navigate("/(modals)/notifications")}
>
>
);
}
export default IndexScreen;
================================================
FILE: app/(tabs)/index/index.tsx
================================================
import { Papicons } from '@getpapillon/papicons';
import { useIsFocused } from '@react-navigation/native';
import { useRouter } from 'expo-router';
import { t } from 'i18next';
import React from 'react';
import { FlatList, Platform, StatusBar, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { useAccountStore } from '@/stores/account';
import { checkConsent } from '@/utils/logger/consent';
import HomeHeader from './atoms/HomeHeader';
import HomeTopBar from './atoms/HomeTopBar';
import Wallpaper from './atoms/Wallpaper';
import HomeWidget, { HomeWidgetItem } from './components/HomeWidget';
import { useHomeData } from './hooks/useHomeData';
import HomeTimeTableWidget from './widgets/timetable';
import GradesWidget from './widgets/Grades';
import { useAlert } from '@/ui/components/AlertProvider';
import Button from '@/ui/new/Button';
import MaskedView from '@react-native-masked-view/masked-view';
import LinearGradient from 'react-native-linear-gradient';
import Typography from '@/ui/new/Typography';
const HomeScreen = () => {
const insets = useSafeAreaInsets();
const bottomTabBarHeight = insets.bottom + 16;
const focused = useIsFocused();
// Account
const store = useAccountStore();
const accounts = useAccountStore((state) => state.accounts);
const account = accounts.find(a => a.id === store.lastUsedAccount)!;
const router = useRouter();
React.useEffect(() => {
console.log(accounts)
if (accounts.length === 0) {
router.replace("/(onboarding)/welcome");
}
if (accounts.length > 0) {
checkConsent().then(consent => {
if (!consent.given) {
router.push("../consent");
}
});
if (account.transport === undefined) {
store.initializeTransport(account.schoolName);
}
}
}, [accounts.length]);
useHomeData();
const [gradesWidgetHidden, setGradesWidgetHidden] = React.useState(true);
const renderTimeTable = React.useCallback(() => , []);
const renderGrades = React.useCallback(
() => ,
[]
);
const data: HomeWidgetItem[] = React.useMemo(() => [
{
icon: ,
title: t("Home_Widget_NextCourses"),
redirect: "(tabs)/calendar",
render: renderTimeTable
},
{
icon: ,
title: t("Home_Widget_Grades_Average"),
redirect: "(tabs)/grades",
hidden: gradesWidgetHidden,
render: renderGrades
}
], [renderTimeTable, renderGrades, gradesWidgetHidden]);
const alert = useAlert();
return (
<>
{focused && }
}
keyExtractor={(item) => item.title}
ListHeaderComponent={ }
style={{ flex: 1 }}
contentContainerStyle={{
paddingBottom: Platform.OS === 'ios' ? bottomTabBarHeight : 16,
paddingHorizontal: 16,
flexGrow: 1,
gap: 12,
marginTop: 6
}}
data={data}
/>
>
);
};
const HomeViewContainer = ({ children }) => {
const insets = useSafeAreaInsets();
return (
}
style={{ flex: 1 }}
>
{children}
)
}
export default HomeScreen;
================================================
FILE: app/(tabs)/index/widgets/Grades.tsx
================================================
import React, { useCallback, useEffect, useMemo, useState } from "react";
import { View } from "react-native";
import { getManager, subscribeManagerUpdate } from "@/services/shared";
import { Period, Subject as SharedSubject } from "@/services/shared/grade";
import { getCurrentPeriod } from "@/utils/grades/helper/period";
import { error } from "@/utils/logger/logger";
import Averages from "../../grades/atoms/Averages";
const PERIODS_TTL_MS = 5 * 60 * 1000;
const GRADES_TTL_MS = 5 * 60 * 1000;
const periodsCache = new Map<
string,
{
fetchedAt: number;
value?: Period;
inFlight?: Promise;
}
>();
const gradesCache = new Map<
string,
{
fetchedAt: number;
subjects: SharedSubject[];
serviceAverage?: number;
inFlight?: Promise<{
subjects: SharedSubject[];
serviceAverage?: number;
}>;
}
>();
type GradesWidgetProps = {
accent?: string;
header?: boolean;
algorithm?: "subject" | "weighted" | "median";
period?: Period;
onEmptyStateChange?: (isEmpty: boolean) => void;
};
const GradesWidget = ({ period, onEmptyStateChange }: GradesWidgetProps) => {
try {
const manager = getManager();
const [subjects, setSubjects] = useState([]);
const [currentPeriod, setCurrentPeriod] = useState(period);
const [serviceAverage, setServiceAverage] = useState(undefined);
const grades = useMemo(
() =>
subjects
.flatMap((subject) => subject.grades)
.filter(
(grade) =>
grade.studentScore?.value !== undefined &&
grade.givenAt &&
!isNaN(grade.studentScore.value) &&
!grade.studentScore.disabled,
),
[subjects],
);
useEffect(() => {
onEmptyStateChange?.(grades.length === 0);
}, [grades.length, onEmptyStateChange]);
const fetchPeriods = useCallback(
async (managerToUse = manager) => {
if (period) {
setCurrentPeriod(period);
return;
}
if (!managerToUse) {
return;
}
const accountId = managerToUse.getAccount().id;
const cache = periodsCache.get(accountId);
if (cache && Date.now() - cache.fetchedAt < PERIODS_TTL_MS) {
if (cache.value) {
setCurrentPeriod(cache.value);
}
return;
}
if (cache?.inFlight) {
const cachedPeriod = await cache.inFlight;
if (cachedPeriod) {
setCurrentPeriod(cachedPeriod);
}
return;
}
const inFlight = (async () => {
const result = await managerToUse.getGradesPeriods();
return getCurrentPeriod(result);
})();
periodsCache.set(accountId, {
fetchedAt: cache?.fetchedAt ?? 0,
value: cache?.value,
inFlight,
});
try {
const nextPeriod = await inFlight;
periodsCache.set(accountId, {
fetchedAt: Date.now(),
value: nextPeriod,
});
if (nextPeriod) {
setCurrentPeriod(nextPeriod);
}
} catch (err) {
periodsCache.delete(accountId);
error(`Failed to fetch periods: ${err}`);
}
},
[period, manager],
);
useEffect(() => {
const unsubscribe = subscribeManagerUpdate((updatedManager) => {
fetchPeriods(updatedManager);
});
return () => unsubscribe();
}, [fetchPeriods]);
const fetchGradesForPeriod = useCallback(
async (periodToFetch: Period | undefined, managerToUse = manager) => {
if (!periodToFetch || !managerToUse) {
return;
}
const periodKey = `${periodToFetch.createdByAccount}:${periodToFetch.name}`;
const cache = gradesCache.get(periodKey);
if (cache && Date.now() - cache.fetchedAt < GRADES_TTL_MS) {
setSubjects(cache.subjects);
setServiceAverage(cache.serviceAverage);
return;
}
if (cache?.inFlight) {
const cachedGrades = await cache.inFlight;
setSubjects(cachedGrades.subjects);
setServiceAverage(cachedGrades.serviceAverage);
return;
}
const inFlight = (async () => {
const result = await managerToUse.getGradesForPeriod(
periodToFetch,
periodToFetch.createdByAccount,
);
return {
subjects: result.subjects,
serviceAverage: result.studentOverall.value || undefined,
};
})();
gradesCache.set(periodKey, {
fetchedAt: cache?.fetchedAt ?? 0,
subjects: cache?.subjects ?? [],
serviceAverage: cache?.serviceAverage,
inFlight,
});
try {
const nextGrades = await inFlight;
gradesCache.set(periodKey, {
fetchedAt: Date.now(),
subjects: nextGrades.subjects,
serviceAverage: nextGrades.serviceAverage,
});
setSubjects(nextGrades.subjects);
setServiceAverage(nextGrades.serviceAverage);
} catch (err) {
gradesCache.delete(periodKey);
error(`Failed to fetch grades: ${err}`);
}
},
[manager],
);
useEffect(() => {
fetchGradesForPeriod(currentPeriod);
}, [currentPeriod, fetchGradesForPeriod]);
useEffect(() => {
if (period) {
setCurrentPeriod(period);
}
}, [period]);
if (grades.length === 0) {
return null;
}
return (
);
} catch (err) {
error(`Error in GradesWidget: ${err}`);
return null;
}
};
export default GradesWidget;
================================================
FILE: app/(tabs)/index/widgets/timetable.tsx
================================================
import { useNavigation } from "expo-router";
import { t } from "i18next";
import React from 'react';
import { FlatList } from "react-native";
import { CourseStatus } from "@/services/shared/timetable";
import Course from "@/ui/components/Course";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
import { useTimetableWidgetData } from "../hooks/useTimetableWidgetData";
import { getStatusText } from '../../calendar/components/CalendarDay';
const HomeTimeTableWidget = React.memo(() => {
const navigation = useNavigation();
const { courses } = useTimetableWidgetData();
if (courses.length === 0) {
return (
{t("Home_Widget_NoCourses")}
{t("Home_Widget_NoCourses_Description")}
);
}
return (
(
{
(navigation as any).navigate('(modals)/course', {
course: item,
subjectInfo: {
id: item.id,
name: item.subject,
color: getSubjectColor(item.subject),
emoji: getSubjectEmoji(item.subject),
}
});
}}
/>
)}
/>
);
});
export default HomeTimeTableWidget;
================================================
FILE: app/(tabs)/news/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
export default function Layout() {
const { t } = useTranslation();
return (
);
}
================================================
FILE: app/(tabs)/news/index.tsx
================================================
import { useNews } from '@/database/useNews'
import { getManager, subscribeManagerUpdate } from '@/services/shared'
import Avatar from '@/ui/components/Avatar'
import { Dynamic } from '@/ui/components/Dynamic'
import Icon from '@/ui/components/Icon'
import Search from '@/ui/components/Search'
import Stack from '@/ui/components/Stack'
import TabHeader from '@/ui/components/TabHeader'
import TabHeaderTitle from '@/ui/components/TabHeaderTitle'
import { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight'
import List from '@/ui/new/List'
import Typography from '@/ui/new/Typography'
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition'
import { getProfileColorByName } from '@/utils/chats/colors'
import { getInitials } from '@/utils/chats/initials'
import { warn } from '@/utils/logger/logger'
import { Papicons } from '@getpapillon/papicons'
import { useTheme } from '@react-navigation/native'
import { router, useRouter } from 'expo-router'
import { t } from 'i18next'
import React, { useCallback, useEffect, useMemo, useState } from 'react'
import { Platform, View } from 'react-native'
import { RefreshControl } from 'react-native-gesture-handler'
import Reanimated, { LayoutAnimationConfig, useAnimatedStyle } from 'react-native-reanimated'
import { useSafeAreaInsets } from 'react-native-safe-area-context'
const NewsView = () => {
const theme = useTheme()
const colors = theme.colors
const insets = useSafeAreaInsets()
const [headerHeight, setHeaderHeight] = useState(0)
const bottomTabBarHeight = insets.bottom + 16;
const [isLoading, setIsLoading] = useState(false)
const [isManuallyLoading, setIsManuallyLoading] = useState(false)
const keyboardHeight = useKeyboardHeight()
const footerStyle = useAnimatedStyle(() => ({
height: keyboardHeight.value - bottomTabBarHeight,
}))
const news = useNews()
const sortedNews = useMemo(() => {
return news.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
}, [news])
const fetchNews = useCallback(() => {
try {
setIsLoading(true)
const manager = getManager()
if (!manager) {
warn('Manager is null, skipping news fetch')
return
}
manager.getNews()
} catch (error) {
console.error('Error fetching news:', error)
} finally {
setIsLoading(false)
setIsManuallyLoading(false)
}
}, [])
useEffect(() => {
const unsubscribe = subscribeManagerUpdate(() => {
fetchNews()
})
return () => unsubscribe()
}, [])
const [searchText, setSearchText] = useState('')
const filteredNews = useMemo(() => {
return sortedNews.filter((item) => item.title.toLowerCase().includes(searchText.toLowerCase()))
}, [sortedNews, searchText])
return (
<>
}
bottom={ setSearchText(text)} />}
/>
{
setIsManuallyLoading(true)
fetchNews()
}}
progressViewOffset={headerHeight}
/>
}
ListFooterComponent={ }
scrollIndicatorInsets={{ top: headerHeight - insets.top }}
ListHeaderComponent={ }
ListEmptyComponent={
{searchText ? t('News_Search_NoResults') : t('News_Empty_Title')}
{searchText ? t('News_Search_NoResults_Description') : t('News_Empty_Description')}
}
>
{filteredNews.map((item) => {
const profileColor = getProfileColorByName(item.author)
const profileInitials = getInitials(item.author)
return (
router.push({
pathname: '/(modals)/news',
params: { news: JSON.stringify(item) },
})
}
>
{item.title}
{item.content ? truncateString(cleanContent(item.content), 100) : ''}
{item.author}
{item.createdAt.toLocaleDateString(undefined, {
year: 'numeric',
month: 'short',
day: 'numeric',
})}
{item.attachments.length > 0 && (
)}
)
})}
>
)
}
function cleanContent(html: string): string {
html = html.replace(/ /g, ' ').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'")
html = html.replace(/\n/g, ' ')
return html.replace(/<[^>]*>/g, '').replace(/\s+/g, ' ').trim()
}
function truncateString(str: string, maxLength: number): string {
if (str.length <= maxLength) {
return str
}
return str.slice(0, maxLength) + '...'
}
export default NewsView
================================================
FILE: app/(tabs)/tasks/_layout.tsx
================================================
import { Stack } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
export default function Layout() {
const { t } = useTranslation();
return (
);
}
================================================
FILE: app/(tabs)/tasks/atoms/DateHeader.tsx
================================================
import React, { memo } from 'react';
import { Pressable, TouchableOpacity } from 'react-native';
import Reanimated, {
Easing,
useAnimatedStyle,
withTiming,
} from 'react-native-reanimated';
import { useTheme } from '@react-navigation/native';
import { Papicons } from '@getpapillon/papicons';
import { Dynamic } from '@/ui/components/Dynamic';
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
interface DateHeaderProps {
title: string;
isCollapsed: boolean;
onToggle: () => void;
}
const DateHeader = memo(
({ title, isCollapsed, onToggle }: DateHeaderProps) => {
const { colors } = useTheme();
const papillonEasing = Easing.bezier(0.3, 0.3, 0, 1);
const animatedStyle = useAnimatedStyle(() => {
return {
transform: [{ rotate: withTiming(isCollapsed ? '-180deg' : '0deg', { duration: 350, easing: papillonEasing }) }],
marginLeft: 'auto'
};
});
return (
{title}
);
}
);
DateHeader.displayName = "DateHeader";
export default DateHeader;
================================================
FILE: app/(tabs)/tasks/atoms/EmptyState.tsx
================================================
import { Dynamic } from "@/ui/components/Dynamic";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
import { Papicons } from "@getpapillon/papicons";
import { t } from "i18next";
import React, { memo } from "react";
interface EmptyStateProps {
isSearching: boolean;
}
const EmptyState = memo(({ isSearching }: EmptyStateProps) => (
{isSearching ? t("Tasks_Search_NoResults") : t("Tasks_NoTasks_Title")}
{isSearching
? "Essaie avec un autre mot clé."
: t("Tasks_NoTasks_Description")}
));
EmptyState.displayName = "EmptyState";
export default EmptyState;
================================================
FILE: app/(tabs)/tasks/atoms/TasksSummary.tsx
================================================
import React from 'react';
import Reanimated, { LinearTransition } from 'react-native-reanimated';
import { useTheme } from '@react-navigation/native';
import { CircularProgress } from '@/ui/components/CircularProgress';
import Stack from '@/ui/components/Stack';
import Typography from '@/ui/components/Typography';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
import { Homework } from "@/services/shared/homework";
import adjust from '@/utils/adjustColor';
interface TasksSummaryProps {
sections: { data: Homework[] }[];
}
const TasksSummary: React.FC = ({ sections }) => {
const theme = useTheme();
const colors = theme.colors;
if (sections.length === 0) {
return null;
}
return (
acc + section.data.filter(hw => hw.isDone).length, 0) /
Math.max(1, sections.reduce((acc, section) => acc + section.data.length, 0)) * 100
}
radius={15}
strokeWidth={5}
fill={theme.colors.tint}
/>
{(() => {
const total = sections.reduce((acc, section) => acc + section.data.length, 0);
const undone = sections.reduce((acc, section) => acc + section.data.filter(hw => !hw.isDone).length, 0);
if (undone === 0) {
return "Toutes les tâches sont terminées !";
}
return `${undone} tâche${undone !== 1 ? 's' : ''} restante${undone !== 1 ? 's' : ''} cette semaine`;
})()}
);
};
export default TasksSummary;
================================================
FILE: app/(tabs)/tasks/components/TaskItem.tsx
================================================
import React, { memo, useMemo } from 'react';
import { StyleSheet } from 'react-native';
import Reanimated from 'react-native-reanimated';
import { Homework } from "@/services/shared/homework";
import Task from "@/ui/components/Task";
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
import { getSubjectName } from "@/utils/subjects/name";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectColor } from "@/utils/subjects/colors";
import { useMagicPrediction } from '../hooks/useMagicPrediction';
import { useNavigation } from 'expo-router';
interface TaskItemProps {
item: Homework;
index: number;
fromCache?: boolean;
setAsDone: (item: Homework, done: boolean) => void;
}
const TaskItem = memo(
({
item,
fromCache = false,
setAsDone
}: TaskItemProps) => {
const navigation = useNavigation();
const cleanContent = useMemo(() => item.content.replace(/<[^>]*>/g, ""), [item.content]);
const magic = useMagicPrediction(cleanContent);
return (
0}
magic={magic}
onToggle={() => setAsDone(item, !item.isDone)}
onPress={() =>
// @ts-ignore Modal types
navigation.navigate("(modals)/task", {
task: item
})
}
/>
);
}
);
TaskItem.displayName = "TaskItem";
export default TaskItem;
================================================
FILE: app/(tabs)/tasks/components/TasksHeader.tsx
================================================
import { useTheme } from '@react-navigation/native';
import { t } from 'i18next';
import React, { useMemo } from 'react';
import { Platform } from 'react-native';
import { getDateRangeOfWeek, getWeekNumberFromDate } from '@/database/useHomework';
import ChipButton from '@/ui/components/ChipButton';
import Search from '@/ui/components/Search';
import TabHeader from '@/ui/components/TabHeader';
import TabHeaderTitle from '@/ui/components/TabHeaderTitle';
export type SortMethod = 'date' | 'subject' | 'done';
interface TasksHeaderProps {
defaultWeek: number;
selectedWeek: number;
onToggleWeekPicker: () => void;
setHeaderHeight: (height: number) => void;
setShowUndoneOnly: React.Dispatch>;
setSortMethod: React.Dispatch>;
setSearchTerm: React.Dispatch>;
sortMethod: SortMethod;
shouldCollapseHeader: boolean;
}
const TasksHeader: React.FC = ({
defaultWeek,
selectedWeek,
onToggleWeekPicker,
setHeaderHeight,
setShowUndoneOnly,
setSortMethod,
setSearchTerm,
sortMethod,
shouldCollapseHeader,
}) => {
const theme = useTheme();
const { colors } = theme;
const sortingOptions = useMemo(
() => [
{ label: t('Tasks_Sorting_Methods_DueDate'), value: "date", icon: "calendar", papicon: "calendar" },
{ label: t('Tasks_Sorting_Methods_Subject'), value: "subject", icon: "font", papicon: "font" },
{ label: t('Tasks_Sorting_Methods_Done'), value: "done", icon: "check", papicon: "check" },
],
[]
);
const activeSortLabel = sortingOptions.find(s => s.value === sortMethod)?.label;
const menuTitle = (activeSortLabel || t("Tasks_Sort_Default"));
return (
}
trailing={
{
const actionId = nativeEvent.event;
if (actionId === 'only-undone') {
setShowUndoneOnly(prev => !prev);
} else if (actionId.startsWith("sort:")) {
setSortMethod(actionId.replace("sort:", "") as SortMethod);
}
}}
actions={[
{
title: t('Task_Sorting_Title'),
papicon: "filter",
subactions: sortingOptions.map((method) => ({
title: method.label,
id: "sort:" + method.value,
papicon: method.papicon,
state: (sortMethod === method.value ? 'on' : 'off'),
image: Platform.select({
ios:
method.value === 'date'
? "calendar"
: method.value === 'subject'
? "character"
: "checkmark.circle"
}),
imageColor: colors.text,
})),
displayInline: true
}
]}
icon="filter"
chevron
>
{menuTitle}
}
bottom={
}
shouldCollapseHeader={shouldCollapseHeader}
/>
);
};
export default TasksHeader;
================================================
FILE: app/(tabs)/tasks/components/TasksList.tsx
================================================
import React, { useCallback } from 'react';
import { Platform, RefreshControl, SectionList, StyleSheet } from 'react-native';
import Reanimated, {
createAnimatedComponent,
LinearTransition,
} from 'react-native-reanimated';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { Homework } from "@/services/shared/homework";
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
import { generateId } from "@/utils/generateId";
import DateHeader from '../atoms/DateHeader';
import EmptyState from '../atoms/EmptyState';
import TasksSummary from '../atoms/TasksSummary';
import TaskItem from './TaskItem';
const AnimatedSectionList = createAnimatedComponent(SectionList);
export interface HomeworkSection {
id: string;
title: string;
date?: Date;
data: Homework[];
}
interface TasksListProps {
sections: HomeworkSection[];
headerHeight: number;
searchTerm: string;
isRefreshing: boolean;
onRefresh: () => void;
collapsedGroups: string[];
toggleGroup: (headerId: string) => void;
sortMethod: string;
homework: Record;
setAsDone: (item: Homework, done: boolean) => void;
}
const TasksList: React.FC = ({
sections,
headerHeight,
searchTerm,
isRefreshing,
onRefresh,
collapsedGroups,
toggleGroup,
sortMethod,
homework,
setAsDone,
}) => {
const insets = useSafeAreaInsets();
const renderItem = useCallback(
({ item, index, section }: { item: Homework, index: number, section: HomeworkSection }) => {
if (sortMethod === 'date' && collapsedGroups.includes(section.id)) {
return null;
}
// Generate the same ID used to store homeworks in the homework object
const generatedId = generateId(
item.subject + item.content + item.createdByAccount + new Date(item.dueDate).toDateString()
);
const inFresh = homework[generatedId];
const source = inFresh ?? item;
const fromCache = !inFresh;
return (
{
setAsDone(item, done);
}}
/>
);
},
[homework, setAsDone, collapsedGroups, sortMethod]
);
const renderSectionHeader = useCallback(
({ section }: { section: HomeworkSection }) => {
if (!section.title || sortMethod !== 'date') {
return null;
}
const isCollapsed = collapsedGroups.includes(section.id);
return (
toggleGroup(section.id)}
/>
);
},
[collapsedGroups, sortMethod, toggleGroup]
);
const keyExtractor = useCallback((item: Homework) => {
return "hw:" + item.subject + item.content + item.createdByAccount + new Date(item.dueDate).toDateString();
}, []);
const bottomTabBarHeight = insets.bottom;
return (
0} />}
stickySectionHeadersEnabled={false}
ListHeaderComponent={
searchTerm.trim().length === 0 ? (
) : null
}
refreshControl={
}
/>
);
};
const styles = StyleSheet.create({
list: {
flex: 1,
height: '100%',
},
});
export default TasksList;
================================================
FILE: app/(tabs)/tasks/components/WeekPicker.tsx
================================================
import { useTheme } from '@react-navigation/native';
import { BlurView } from 'expo-blur';
import React, { useCallback, useRef, useState } from 'react';
import { FlatList, Pressable, Text, View } from 'react-native';
import Reanimated from 'react-native-reanimated';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { getDateRangeOfWeek, getWeekNumberFromDate } from '@/database/useHomework';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
interface WeekPickerProps {
selectedWeek: number;
onSelectWeek: (week: number) => void;
onClose: () => void;
}
const WeekPicker: React.FC = ({ selectedWeek, onSelectWeek, onClose }) => {
const { colors } = useTheme();
const insets = useSafeAreaInsets();
const WeekPickerRef = useRef(null);
const layoutPicker = useCallback(() => {
if (WeekPickerRef.current) {
const offset = selectedWeek * 60;
WeekPickerRef.current.scrollToOffset({
offset,
animated: false,
});
}
}, [selectedWeek]);
const [weekLimit, setWeekLimit] = useState(60);
const loadMoreWeeks = useCallback(() => {
setWeekLimit((prev) => prev + 26);
}, []);
const handleWeekScroll = useCallback((event: { nativeEvent: { contentOffset: { x: number } } }) => {
const contentOffsetX = event.nativeEvent.contentOffset.x;
const itemWidth = 60;
const index = Math.round(contentOffsetX / itemWidth);
if (index < 0 || index >= weekLimit) { return; }
requestAnimationFrame(() => {
onSelectWeek(index);
});
}, [onSelectWeek]);
return (
{
layoutPicker();
}}
data={Array.from({ length: weekLimit }, (_, i) => i)}
onEndReached={loadMoreWeeks}
onEndReachedThreshold={2}
windowSize={5}
initialScrollIndex={selectedWeek}
getItemLayout={(data, index) => (
{ length: 60, offset: 60 * index, index }
)}
keyExtractor={(item) => "picker:" + item.toString()}
horizontal
removeClippedSubviews={true}
showsHorizontalScrollIndicator={false}
style={{
flexGrow: 0,
height: 100,
width: 300,
}}
contentContainerStyle={{
alignItems: "center",
gap: 0,
paddingLeft: 300 / 2 - 30,
paddingRight: 300 / 2 - 30,
}}
snapToInterval={60}
decelerationRate="fast"
ref={WeekPickerRef}
initialNumToRender={10}
onScroll={handleWeekScroll}
renderItem={({ item }) => (
{
onSelectWeek(item);
onClose();
}}
style={[
{
width: 40,
height: 40,
margin: 10,
borderRadius: 12,
borderCurve: "continuous",
backgroundColor: runsIOS26 ? colors.text + "10" : colors.background,
borderColor: colors.text + "22",
borderWidth: 1,
alignItems: "center",
justifyContent: "center",
},
item === selectedWeek && {
backgroundColor: "#C54CB3",
boxShadow: "0px 1px 6px rgba(0, 0, 0, 0.15)",
}
]}
>
{getWeekNumberFromDate(getDateRangeOfWeek(item, new Date().getFullYear()).start)}
)}
/>
);
};
export default WeekPicker;
================================================
FILE: app/(tabs)/tasks/hooks/useHomeworkData.ts
================================================
import { useState, useCallback, useEffect, useMemo } from 'react';
import { useAccountStore } from "@/stores/account";
import { getManager, subscribeManagerUpdate } from "@/services/shared";
import { Homework } from "@/services/shared/homework";
import { useHomeworkForWeek, updateHomeworkIsDone } from "@/database/useHomework";
import { generateId } from "@/utils/generateId";
import { error } from '@/utils/logger/logger';
import { notificationAsync, NotificationFeedbackType } from "expo-haptics";
export const useHomeworkData = (selectedWeek: number, alert: any) => {
const [isRefreshing, setIsRefreshing] = useState(false);
const [refreshTrigger, setRefreshTrigger] = useState(0);
const [homework, setHomework] = useState>({});
const store = useAccountStore.getState();
const account = store.accounts.find(acc => acc.id === store.lastUsedAccount);
type Service = { id: string };
const services = useMemo(() => account?.services?.map((s: Service) => s.id) ?? [], [account]);
const manager = getManager();
const homeworksFromCache = useHomeworkForWeek(selectedWeek, refreshTrigger)
.filter(h => services.includes(h.createdByAccount));
const fetchHomeworks = useCallback(
async (managerToUse = manager) => {
if (!managerToUse) { return; }
try {
const result: Homework[] = await managerToUse.getHomeworks(selectedWeek);
result.sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());
const newHomeworks: Record = {};
for (const hw of result) {
const id = generateId(
hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()
);
newHomeworks[id] = { ...hw, id: hw.id ?? id };
}
setHomework(newHomeworks);
setRefreshTrigger(p => p + 1);
} catch (e) {
error("Fetch error", String(e));
}
},
[selectedWeek, manager]
);
useEffect(() => {
fetchHomeworks();
const unsubscribe = subscribeManagerUpdate((updatedManager) => {
fetchHomeworks(updatedManager);
});
return () => unsubscribe();
}, [selectedWeek, fetchHomeworks]);
const handleRefresh = useCallback(async () => {
setIsRefreshing(true);
await fetchHomeworks();
setIsRefreshing(false);
}, [fetchHomeworks]);
const setAsDone = useCallback(
async (item: Homework, done: boolean) => {
const id = generateId(
item.subject +
item.content +
item.createdByAccount +
new Date(item.dueDate).toDateString()
);
try {
const manager = getManager();
await manager.setHomeworkCompletion(item, done)
updateHomeworkIsDone(id, done);
setRefreshTrigger(prev => prev + 1);
setHomework(prev => ({
...prev,
[id]: {
...(prev[id] ?? item),
isDone: done,
}
}));
if (done) {
notificationAsync(NotificationFeedbackType.Success);
}
}
catch (err) {
alert.showAlert({
title: "Une erreur est survenue",
message: "Ce devoir n'a pas été mis à jour",
description:
"Nous n'avons pas réussi à mettre à jour l'état du devoir, si ce devoir est important, merci de vous rendre sur l'application officielle de ton établissement afin de définir son état.",
color: "#D60046",
icon: "AlertTriangle",
technical: String(err)
});
updateHomeworkIsDone(id, !done);
setRefreshTrigger(prev => prev + 1);
setHomework(prev => ({
...prev,
[id]: {
...(prev[id] ?? item),
isDone: !done,
}
}));
}
},
[]
);
return {
homework,
homeworksFromCache,
isRefreshing,
handleRefresh,
setAsDone,
};
};
================================================
FILE: app/(tabs)/tasks/hooks/useMagicPrediction.ts
================================================
import { useState, useEffect } from 'react';
import { useSettingsStore } from "@/stores/settings";
import { predictHomework } from "@/utils/magic/prediction";
import { error } from '@/utils/logger/logger';
export const useMagicPrediction = (content: string) => {
const [magic, setMagic] = useState(undefined);
const magicEnabled = useSettingsStore(state => state.personalization.magicEnabled);
useEffect(() => {
let isCancelled = false;
if (content && magicEnabled) {
predictHomework(content, magicEnabled)
.then(p => !isCancelled && setMagic(p))
.catch(e => !isCancelled && error(e));
} else {
setMagic(undefined);
}
return () => {
isCancelled = true;
};
}, [content, magicEnabled]);
return magic;
};
================================================
FILE: app/(tabs)/tasks/hooks/useTaskFilters.ts
================================================
import { useState, useMemo, useCallback } from 'react';
import { t } from 'i18next';
import { Homework } from "@/services/shared/homework";
import { getSubjectName } from "@/utils/subjects/name";
export type SortMethod = 'date' | 'subject' | 'done';
const normalize = (value: string) =>
value
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
const formatDateHeader = (date: Date): string => {
return date.toLocaleDateString(undefined, { weekday: 'long', day: 'numeric', month: 'long' });
};
export interface HomeworkSection {
id: string;
title: string;
date?: Date;
data: Homework[];
}
export const useTaskFilters = (
homeworksFromCache: Homework[],
homework: Record
) => {
const [searchTerm, setSearchTerm] = useState("");
const [showUndoneOnly, setShowUndoneOnly] = useState(false);
const [sortMethod, setSortMethod] = useState("date");
const [collapsedGroups, setCollapsedGroups] = useState([]);
const toggleGroup = useCallback((headerId: string) => {
setCollapsedGroups(prev => {
if (prev.includes(headerId)) {
return prev.filter(id => id !== headerId);
}
return [...prev, headerId];
});
}, []);
const sections = useMemo(() => {
const mergedData = homeworksFromCache.map(cached => {
const fresh = cached.id && homework[cached.id];
return fresh || cached;
});
const uniqueIds = new Set();
let data = mergedData.filter(hw => {
if (hw.id) {
if (!uniqueIds.has(hw.id)) {
uniqueIds.add(hw.id);
return true;
}
return false;
}
return true;
});
if (showUndoneOnly) {
data = data.filter(h => !h.isDone);
}
if (searchTerm.trim().length > 0) {
const term = normalize(searchTerm);
data = data.filter(h => {
const cleanContent = h.content.replace(/<[^>]*>/g, "");
const normalizedContent = normalize(cleanContent);
const normalizedSubject = normalize(h.subject);
const normalizedSubjectName = normalize(getSubjectName(h.subject));
return (
normalizedContent.includes(term) ||
normalizedSubject.includes(term) ||
normalizedSubjectName.includes(term)
);
});
}
if (sortMethod === 'date') {
data.sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());
} else if (sortMethod === 'subject') {
data.sort((a, b) => a.subject.localeCompare(b.subject));
} else if (sortMethod === 'done') {
data.sort((a, b) => Number(a.isDone) - Number(b.isDone));
}
const isSearching = searchTerm.trim().length > 0;
if (sortMethod === 'date' && !isSearching) {
const sectionMap = new Map();
data.forEach((hw) => {
const hwDate = new Date(hw.dueDate);
const dateKey = hwDate.toDateString();
const headerId = `header-${dateKey}`;
if (!sectionMap.has(dateKey)) {
sectionMap.set(dateKey, {
id: headerId,
title: formatDateHeader(hwDate),
date: hwDate,
data: []
});
}
sectionMap.get(dateKey)!.data.push(hw);
});
return Array.from(sectionMap.values());
}
return [
{
id: 'all',
title: '',
data
}
];
}, [homeworksFromCache, homework, showUndoneOnly, searchTerm, sortMethod]);
return {
searchTerm,
setSearchTerm,
showUndoneOnly,
setShowUndoneOnly,
sortMethod,
setSortMethod,
collapsedGroups,
toggleGroup,
sections,
};
};
================================================
FILE: app/(tabs)/tasks/hooks/useWeekSelection.ts
================================================
import { useState, useCallback } from 'react';
import { getWeekNumberFromDate } from "@/database/useHomework";
export const useWeekSelection = () => {
const currentDate = new Date();
const defaultWeek = getWeekNumberFromDate(currentDate);
const [selectedWeek, setSelectedWeek] = useState(defaultWeek);
const [showWeekPicker, setShowWeekPicker] = useState(false);
const toggleWeekPicker = useCallback(() => {
setShowWeekPicker((prev) => !prev);
}, []);
const onSelectWeek = useCallback((week: number) => {
setSelectedWeek(week);
}, []);
return {
defaultWeek,
selectedWeek,
setSelectedWeek,
showWeekPicker,
setShowWeekPicker,
toggleWeekPicker,
onSelectWeek,
};
};
================================================
FILE: app/(tabs)/tasks/index.tsx
================================================
import React, { useState } from 'react';
import { Platform, StyleSheet, View } from 'react-native';
import TasksHeader from './components/TasksHeader';
import TasksList from './components/TasksList';
import WeekPicker from './components/WeekPicker';
import { useHomeworkData } from './hooks/useHomeworkData';
import { useTaskFilters } from './hooks/useTaskFilters';
import { useWeekSelection } from './hooks/useWeekSelection';
import { useAlert } from "@/ui/components/AlertProvider";
import { useTheme } from '@react-navigation/native';
const TasksView: React.FC = () => {
const alert = useAlert();
const [headerHeight, setHeaderHeight] = useState(0);
const [shouldCollapseHeader, setShouldCollapseHeader] = useState(false);
const {
defaultWeek,
selectedWeek,
showWeekPicker,
toggleWeekPicker,
onSelectWeek,
setShowWeekPicker,
} = useWeekSelection();
const {
homework,
homeworksFromCache,
isRefreshing,
handleRefresh,
setAsDone,
} = useHomeworkData(selectedWeek, alert);
const {
searchTerm,
setSearchTerm,
showUndoneOnly,
setShowUndoneOnly,
sortMethod,
setSortMethod,
collapsedGroups,
toggleGroup,
sections,
} = useTaskFilters(homeworksFromCache, homework);
const theme = useTheme();
return (
<>
{showWeekPicker && (
setShowWeekPicker(false)}
/>
)}
>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
export default TasksView;
================================================
FILE: app/_layout.tsx
================================================
import 'react-native-reanimated';
import "@/utils/i18n";
import { Buffer } from 'buffer';
import React from 'react';
import { AppProviders } from '@/components/AppProviders';
import FakeSplash from '@/components/FakeSplash';
import { RootNavigator } from '@/components/RootNavigator';
import { useAppInitialization } from '@/hooks/useAppInitialization';
// Polyfill Buffer
global.Buffer = Buffer;
export default function RootLayout() {
const { isAppReady, fontsLoaded } = useAppInitialization();
if (!fontsLoaded) {
return null;
}
return (
);
}
================================================
FILE: app/alert.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { useLocalSearchParams, useRouter } from "expo-router";
import * as LucideIcons from "lucide-react-native";
import { type ComponentType, useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import React, { Platform, Pressable, Text, View } from "react-native";
import Reanimated, { Easing, LinearTransition } from "react-native-reanimated";
import { Alert, useAlert } from "@/ui/components/AlertProvider";
import Button from "@/ui/components/Button";
import Typography from "@/ui/components/Typography";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
import { Papicons } from "@getpapillon/papicons";
import Icon from "@/ui/components/Icon";
export default function AlertModal() {
const { t } = useTranslation();
const { colors } = useTheme();
const searchParams = useLocalSearchParams();
const params = JSON.parse(searchParams.data as string) as unknown as Alert;
const callbackId = searchParams.callbackId as string | undefined;
const router = useRouter();
const { getCallback, cleanupCallback } = useAlert();
const IconComponent = useMemo(() => {
if (!params.icon) {
return null;
}
return ;
}, [params.icon]);
const [showTechnicalDetails, setShowTechnicalDetails] = useState(false);
useEffect(() => {
return () => {
if (callbackId) {
cleanupCallback(callbackId);
}
};
}, [callbackId, cleanupCallback]);
return (
{/* icon */}
{IconComponent ? (
{IconComponent}
) : null}
{params.title}
{params.description ?? params.message}
{params.technical && (
{
setShowTechnicalDetails(!showTechnicalDetails);
}}
>
{t('Alert_TechnicalDetails')}
{showTechnicalDetails
?
: }
{showTechnicalDetails && (
{params.technical ? params.technical.trim() : "Aucune information technique disponible."}
)}
)}
{
const callback = callbackId ? getCallback(callbackId) : null;
router.back();
if (callback) {
callback();
}
}}
/>
)
};
================================================
FILE: app/changelog.tsx
================================================
import Typography from "@/ui/components/Typography";
import React from "react";
import { View, ScrollView, Image } from "react-native";
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
export default function ChangelogScreen() {
const theme = useTheme();
const { colors } = theme;
return (
Bienvenue sur Papillon v8
Cette mise à jour a été repensée de fond en comble pour améliorer votre expérience. Mais cela prend du temps, nous faisons de notre mieux pour faire de cette version la meilleure possible.
Pourquoi tout changer ?
Vous évoluez, nous aussi ! Papillon n'a jamais cessé de grandir depuis des années, et nous nous devons d'utiliser une application modernisée afin d'offrir la meilleure expérience et de garantir le futur de l'application.
Ce processus prend énormément de temps, et en tant qu'étudiants et lycéens, on doit aussi aller en cours, donc on fait ce qu'on peut avec ce qu'on à !
(Si vous aimez ce qu'on fait, n'hésitez pas à nous soutenir depuis les paramètres !)
Il manque (telle ou telle) fonctionnalité ?
Pour vous permettre d'utiliser Papillon dès la rentrée, l'application est sortie plus lègere en fonctionnalités que prévu. Nous travaillons d'arrache-pied pour réintégrer les fonctionnalités manquantes au plus vite.
J'ai un bug avec (quelque chose) !
Il est possible que certaines choses ne fonctionnent pas. Si la télémétrie est activée, vos bugs nous seront automatiquement parvenus, sinon, n'hésitez pas à nous contacter (Paramètres {">"} À propos)
Merci d'être là depuis le début !
Nous apprécions votre soutien et vos retours. N'hésitez pas à nous faire part de vos suggestions ou de vos problèmes sur les réseaux sociaux ou par email.
);
};
================================================
FILE: app/consent.tsx
================================================
import React, { useEffect, useMemo, useState } from "react";
import { Image, Linking, ScrollView, StyleSheet, View } from "react-native";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import i18n from "@/utils/i18n";
const t = i18n.t.bind(i18n);
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { LinearGradient } from "expo-linear-gradient";
import { useRouter } from "expo-router";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import Button from "@/ui/components/Button";
import Icon from "@/ui/components/Icon";
import { checkConsent, setConsent } from "@/utils/logger/consent";
export default function ConsentScreen() {
const insets = useSafeAreaInsets();
const router = useRouter();
const [currentConsent, setCurrentConsent] = useState(null);
const theme = useTheme();
const { colors } = theme;
useEffect(() => {
checkConsent().then((consent) => {
if (consent.given) {
if (consent.advanced) {
setCurrentConsent("advanced");
} else if (consent.optional) {
setCurrentConsent("optional");
} else if (consent.required) {
setCurrentConsent("required");
} else {
setCurrentConsent(null);
}
}
});
}, []);
console.log("currentConsent", currentConsent)
const consents = [
{
key: "advanced",
title: t("Consent_Advanced_Title"),
description: t("Consent_Advanced_Description"),
icon: "emoji",
color: "#C50083"
},
{
key: "optional",
title: t("Consent_Required_Title"),
description: t("Consent_Required_Description"),
icon: "ghost",
color: "#0080C5"
},
{
key: "none",
title: t("Consent_None_Title"),
description: t("Consent_None_Description"),
icon: "cross",
color: "#5A5A5A"
}
];
const accent = useMemo(() => {
return consents.find(c => c.key === currentConsent)?.color || theme.colors.primary;
}, [currentConsent, theme]);
const saveConsentState = async (consent: string) => {
await setConsent(consent as "none" | "required" | "optional" | "advanced");
router.back();
};
return (
{t("Consent_Title")}
{t("Consent_Intro1")}
{consents.map((consent) => (
{ setCurrentConsent(consent.key) }}
key={consent.key}
>
{consent.title}
{consent.description}
))}
{t("Consent_Arg1")}
{t("Consent_Arg2")}
{t("Consent_Arg3")}
Linking.openURL("https://docs.papillon.bzh/privacy-policy")} variant="caption" color={accent} align="center" style={{ textDecorationLine: "underline", marginTop: 10 }}>
{t("Consent_PrivacyPolicy")}
{ if (currentConsent) { saveConsentState(currentConsent) } }}
inline
style={{
backgroundColor: currentConsent === null ? colors.text + "50" : accent,
}}
icon={
}
title={currentConsent === "none" ? t("Consent_Refuse") : t("Consent_Accept")}
/>
{t("Consent_ChangeMind")}
);
};
================================================
FILE: app/demo.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { Hamburger } from "lucide-react-native";
import React, { ScrollView, StyleSheet, View } from "react-native";
import { Papicons } from "@getpapillon/papicons";
import Course from "@/ui/components/Course";
import Item, { Leading, Trailing } from "@/ui/components/Item";
import List from "@/ui/components/List";
import Typography from "@/ui/components/Typography";
import { log } from "@/utils/logger/logger";
import Icon from "@/ui/components/Icon";
import SkeletonView from "@/ui/components/SkeletonView";
import Avatar from "@/ui/components/Avatar";
import Stack from "@/ui/components/Stack";
import Grade from "@/ui/components/Grade";
import Subject from "@/ui/components/Subject";
import { CompactGrade } from "@/ui/components/CompactGrade";
import Task from "@/ui/components/Task";
export default function TabOneScreen() {
const { colors } = useTheme();
return (
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet venenatis ipsum. Sed non luctus
purus. Fusce vel mollis turpis, non eleifend leo. Praesent id libero tristique, condimentum elit at,
condimentum nibh. Curabitur vehicula mauris in turpis mattis, eget posuere erat sagittis.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet venenatis ipsum. Sed non luctus
purus. Fusce vel mollis turpis, non eleifend leo. Praesent id libero tristique, condimentum elit at,
condimentum nibh. Curabitur vehicula mauris in turpis mattis, eget posuere erat sagittis.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet venenatis ipsum. Sed non luctus
purus. Fusce vel mollis turpis, non eleifend leo. Praesent id libero tristique, condimentum elit at,
condimentum nibh.
log("Bât. 12 amphi 4")}
/>
log("Bât. 12 amphi 4")}
/>
log("Bât. 12 amphi 4", "Bât. 9 salle 6")}
/>
log("Bât. 12 amphi 4")}
/>
log("Bât. 12 amphi 4")}
showTimes={false}
magicInfo={{
label: "Dans 20 minutes",
icon: ({ color }) =>
,
}}
/>
-
This is a list item with primary text.
-
Title
Description
-
Item with Leading
-
Item with Trailing
This is a skeleton text
This is a description with multiple lines
,
}}
skeleton
/>
);
}
interface SectionTitleProps {
title: string;
colors: { primary: string };
}
const SectionTitle = ({ title, colors }: SectionTitleProps) => (
{title}
);
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16,
},
containerContent: {
gap: 16,
paddingBottom: 30,
},
typographyContainer: {
width: "100%",
display: "flex",
flexDirection: "column",
gap: 10,
},
});
================================================
FILE: app/devmode.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { router } from "expo-router";
import { Plus } from "lucide-react-native";
import React, { useEffect, useState } from "react";
import { Alert, ScrollView, StyleSheet, Switch } from "react-native";
import DevModeNotice from "@/components/DevModeNotice";
import LogIcon from "@/components/Log/LogIcon";
import { database } from "@/database";
import { useAccountStore } from '@/stores/account';
import { useLogStore } from '@/stores/logs';
import { useMagicStore } from "@/stores/magic";
import { useSettingsStore } from "@/stores/settings";
import { useAlert } from "@/ui/components/AlertProvider";
import Icon from "@/ui/components/Icon";
import Item, { Leading, Trailing } from '@/ui/components/Item';
import List from '@/ui/components/List';
import SectionHeader from "@/ui/components/SectionHeader";
import Typography from "@/ui/components/Typography";
import { MAGIC_URL } from "@/utils/endpoints";
import { log } from "@/utils/logger/logger";
import ModelManager from "@/utils/magic/ModelManager";
import { scheduleNotificationAtDate } from "@/utils/notification/reminder/helper";
import { initializeTransport } from "@/utils/transport";
import NativeSwitch from "@/ui/native/NativeSwitch";
export default function Devmode() {
const accountStore = useAccountStore();
const logsStore = useLogStore();
const settingStore = useSettingsStore(state => state.personalization)
const mutateProperty = useSettingsStore(state => state.mutateProperty)
const magicStore = useMagicStore()
const magicStoreHomework = useMagicStore(state => state.processHomeworks)
const { colors } = useTheme();
const alert = useAlert();
const [showAccountStore, setShowAccountStore] = useState(false);
const [showLogsStore, setShowLogsStore] = useState(false);
const [visibleLogsCount, setVisibleLogsCount] = useState(20);
const loadMoreLogs = () => {
setVisibleLogsCount((prev) => prev + 20);
};
useEffect(() => {
if (!showLogsStore) {
setVisibleLogsCount(20);
}
}, [showLogsStore]);
return (
-
{
requestAnimationFrame(() => {
setShowLogsStore(!showLogsStore);
});
}}
/>
Logs Store
{showLogsStore &&
logsStore.logs
.slice()
.reverse()
.slice(0, visibleLogsCount)
.map((logEntry, index) => (
-
{logEntry.message}
{new Date(logEntry.date).toLocaleString()} -{" "}
{logEntry.from ?? "UNKNOW"}
))}
{showLogsStore && visibleLogsCount < logsStore.logs.length && (
-
Charger plus
)}
- {
const accounts = useAccountStore.getState().accounts;
for (const account of accounts) {
useAccountStore.getState().removeAccount(account);
}
Alert.alert("Success");
}}
>
Reset Account Store
}
/>
-
{settingStore.magicEnabled
? "Papillon Magic+ est Activé"
: "Papillon Magic+ est Désactivé"}
- ModelManager.refresh()}>
Rafraîchir le modèle
- {
try {
const result = await ModelManager.reset();
if (result.success) {
Alert.alert(
"Succès",
"Le modèle a été réinitialisé avec succès. Il sera retéléchargé au prochain démarrage."
);
} else {
Alert.alert("Erreur", `Échec du reset: ${result.error}`);
}
} catch (error) {
Alert.alert("Erreur", `Erreur lors du reset: ${String(error)}`);
}
}}
>
Reset complet du modèle
- {
const status = ModelManager.getStatus();
Alert.alert(
"Statut du modèle",
`Modèle chargé: ${status.hasModel ? "Oui" : "Non"}\n` +
`Max Length: ${status.maxLen}\n` +
`Nombre de labels: ${status.labelsCount}\n` +
`Taille du vocabulaire: ${status.wordIndexSize}\n` +
`Index OOV: ${status.oovIndex}`
);
}}
>
Afficher le statut du modèle
- {
try {
const result = await ModelManager.predict(
"ds analyse de doc",
true
);
if ("error" in result) {
Alert.alert("Erreur de prédiction", result.error);
} else {
Alert.alert(
"Test de prédiction réussi",
`Prédiction: ${result.predicted}\nScores: ${result.scores
.slice(0, 3)
.map(s => s.toFixed(3))
.join(", ")}...`
);
}
} catch (error) {
Alert.alert("Erreur", `Erreur lors du test: ${String(error)}`);
}
}}
>
Tester une prédiction
- {
try {
magicStore.clear();
Alert.alert(
"Cache vidé",
"Le cache des prédictions Magic a été vidé avec succès !"
);
} catch (error) {
Alert.alert(
"Erreur",
`Erreur lors du vidage du cache: ${String(error)}`
);
}
}}
>
Vider le cache Magic
{magicStoreHomework.length} devoirs
- {
const currentURL = settingStore.magicModelURL || MAGIC_URL;
Alert.prompt(
"URL Custom Magic Model",
`URL actuelle: ${currentURL}\n\nEntrez une nouvelle URL:`,
[
{
text: "Annuler",
style: "cancel",
},
{
text: "Valider",
onPress: (newURL?: string) => {
if (newURL && newURL.trim()) {
mutateProperty("personalization", {
magicModelURL: newURL.trim(),
});
Alert.alert("Succès", "URL du modèle Magic mise à jour!");
}
},
},
],
"plain-text",
currentURL
);
}}
>
Changer l'URL Custom Magic
- {
Alert.alert(
"Reset URL Magic Model",
"Voulez-vous remettre l'URL du modèle Magic par défaut?",
[
{
text: "Annuler",
style: "cancel",
},
{
text: "Reset",
style: "destructive",
onPress: () => {
mutateProperty("personalization", {
magicModelURL: MAGIC_URL,
});
Alert.alert(
"Succès",
"URL du modèle Magic remise par défaut!"
);
},
},
]
);
}}
>
Reset URL Magic Model
- magicStore.clear()}>
Clear Magic Store
- log(JSON.stringify(magicStoreHomework))}>
ConsoleLog Magic Store
}
/>
-
alert.showAlert({
title: "Connexion impossible",
description:
"Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.",
icon: "AlertTriangle",
color: "#D60046",
customButton: {
label: "Me reconnecter",
showCancelButton: true,
onPress: () => {
const lastUsedAccount =
useAccountStore.getState().lastUsedAccount;
const badService = useAccountStore
.getState()
.accounts.find(account => account.id === lastUsedAccount)
?.services[0];
// Unavailable in ED/SKolengo
const authUrl =
badService?.auth?.additionals?.["instanceURL"] ?? "";
setTimeout(() => {
router.push({
pathname: "/(onboarding)/pronote/webview",
params: { url: authUrl, serviceId: badService?.id },
});
}, 200);
},
},
technical: String(
" Error: TokenExpiredError at AuthService.validateToken (file:///app/services/auth.js:45:15) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async file:///app/routes/api/user.js:10:28"
),
})
}
>
Error Alert
- {
const lastUsedAccount = useAccountStore.getState().lastUsedAccount;
const badService = useAccountStore
.getState()
.accounts.find(account => account.id === lastUsedAccount)
?.services[0];
useAccountStore.getState().updateServiceAuthData(badService!.id, {
...badService?.auth,
refreshToken: "",
});
}}
>
Clear Auth Data
-
Activer Alert au Login
mutateProperty("personalization", { showAlertAtLogin: value })
}
/>
}
/>
- {
await database.write(async () => {
await database.unsafeResetDatabase();
});
}}
>
Réinitialiser la base de données
}
/>
- {
initializeTransport(undefined).then(transport => {
console.log(transport);
});
}}
>
Initialiser sans addresse
- {
initializeTransport("106 Rue de la Pompe, 75016 Paris").then(
transport => {
console.log(transport);
}
);
}}
>
Initialiser avec addresse
}
/>
- {
requestPermissionsAsync();
}}
>
Demander la permission
- {
const date = new Date(Date.now() + 5000);
const id = await scheduleNotificationAtDate(
"Papillon",
"Une notification programmée via Papillon arrive à l'instant!",
date
);
Alert.alert("Une notification arrive dans 5 sec", `ID : ${id}`);
}}
>
Programmer une notification
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16,
},
containerContent: {},
});
================================================
FILE: app.config.ts
================================================
import PackageJSON from "./package.json" with { type: 'json' };
const androidPreVersion = PackageJSON.version.replaceAll(".", "")
const androidVersionCode = androidPreVersion.length == 3 ? parseInt(androidPreVersion + "00") : androidPreVersion.length == 4 ? parseInt(androidPreVersion + "0") : parseInt(androidPreVersion)
export default {
expo: {
name: "Papillon",
slug: "papillon",
version: PackageJSON.version,
orientation: "portrait",
icon: "./assets/images/icon.png",
scheme: ["papillon", "izly", "skoapp-prod"],
platforms: ["ios", "android"],
userInterfaceStyle: "automatic",
newArchEnabled: true,
splash: {
image: "./assets/images/splash.png",
resizeMode: "cover",
backgroundColor: "#003A21",
},
ios: {
appStoreUrl:
"https://apps.apple.com/us/app/papillon-lappli-scolaire/id6477761165",
bundleIdentifier: "xyz.getpapillon.ios",
associatedDomains: ["applinks:getpapillon.xyz"],
icon: "./assets/app.icon",
minimumOSVersion: "17.6",
infoPlist: {
CFBundleURLTypes: [
{
CFBundleURLSchemes: ["papillon", "izly", "skoapp-prod"],
},
],
CFBundleLocalizations: [
"fr",
"en",
"br",
"pt",
"de",
"es",
"tr",
"ja",
"ru",
"ko",
"af",
"ar",
"el",
"hi",
"nl",
"pl",
"ro",
"sq",
"uk",
"vi",
"bg",
"bn",
"cs",
"da",
"fi",
"he",
"hu",
"id",
"no",
"sk",
"sv",
"sw",
"th",
"it",
"fa",
"ur",
"ms",
"hr",
"et",
],
CADisableMinimumFrameDurationOnPhone: true,
LSApplicationQueriesSchemes: ["transit", "maps"],
},
supportsTablet: true,
config: {
usesNonExemptEncryption: false,
},
},
android: {
versionCode: androidVersionCode,
package: "xyz.getpapillon.app",
adaptiveIcon: {
foregroundImage: "./assets/images/adaptive-icon.png",
backgroundColor: "#ffffff",
monochromeImage: "./assets/images/monochrome-icon.png",
},
edgeToEdgeEnabled: true,
splash: {
image: "./assets/images/splash_android.png",
resizeMode: "cover",
backgroundColor: "#003A21",
},
supportsTablet: true,
predictiveBackGestureEnabled: true
},
web: {
bundler: "metro",
output: "static",
favicon: "./assets/images/favicon.png",
},
plugins: [
"expo-router",
"expo-font",
"expo-video",
"expo-audio",
"expo-localization",
"expo-asset",
"@react-native-community/datetimepicker",
[
"expo-image-picker",
{
photosPermission:
"Papillon utilise ta galerie pour te permettre de personnaliser ta photo de profil",
},
],
"expo-web-browser",
[
"react-native-fast-tflite",
{
enableCoreMLDelegate: true,
enableAndroidGpuLibraries: true,
},
],
"react-native-bottom-tabs",
"expo-secure-store",
[
"expo-location",
{
locationWhenInUsePermission:
"Papillon utilise ton emplacement pour trouver les établissements autour de toi.",
cameraPermission:
"Papillon utilise ta caméra pour scanner des QR-codes pour te connecter, pour capturer des documents, ou pour des fonctionnalités amusantes telles que les réactions.",
},
],
[
"react-native-edge-to-edge",
{
android: {
parentTheme: "Material3",
enforceNavigationBarContrast: false,
},
},
],
[
"expo-build-properties",
{
android: {
enable16KbPageSizes: true,
},
ios: {
extraPods: [
{ name: "SDWebImage", modular_headers: true },
{ name: "SDWebImageSVGCoder", modular_headers: true },
],
},
},
],
],
experiments: {
typedRoutes: true,
},
},
};
================================================
FILE: assets/app.icon/icon.json
================================================
{
"fill" : {
"linear-gradient" : [
"display-p3:0.20392,0.69804,0.57647,1.00000",
"display-p3:0.19216,0.50588,0.43137,1.00000"
]
},
"groups" : [
{
"layers" : [
{
"hidden" : false,
"image-name" : "glass 2.png",
"name" : "glass 2",
"opacity" : 0,
"position" : {
"scale" : 0.83,
"translation-in-points" : [
62,
50
]
}
},
{
"fill-specializations" : [
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:0.20801,0.68652,0.56885,1.00000"
}
}
],
"glass" : false,
"hidden" : false,
"image-name" : "overlay.png",
"name" : "overlay",
"opacity" : 1,
"position" : {
"scale" : 0.83,
"translation-in-points" : [
62,
50
]
}
},
{
"fill-specializations" : [
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:0.20801,0.68652,0.56885,1.00000"
}
}
],
"glass" : false,
"hidden" : false,
"image-name" : "base.png",
"name" : "base",
"position" : {
"scale" : 0.83,
"translation-in-points" : [
62,
50
]
}
}
],
"position" : {
"scale" : 0.99,
"translation-in-points" : [
-10,
-11
]
},
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"translucency" : {
"enabled" : true,
"value" : 0.5
}
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
================================================
FILE: assets/lotties/alise.json
================================================
{"assets":[{"h":129,"id":"0","p":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCADIAMgDASIAAhEBAxEB/8QAHAABAAMBAAMBAAAAAAAAAAAAAAYHCAUBAwQC/8QAGwEBAAMBAQEBAAAAAAAAAAAAAAMEBQIGAQf/2gAMAwEAAhADEAAAAdUgAAAAAAAAAAAAAAAAAAAAAAAAAAAPloW7S0IpRPBdak/H1dqkfBd6l7oqWz017x1PfpoKeXadhq6sWjcCGcAAACPxOVxTVzLMGVpgCu5oej91ee3Vy7OzrorOtiDvSeMSexBX1n1fyblLWQ8R7UAAADgQ+zaV1cu7FH9zjq1Bm6Th9x1xUHssblauZ76D7cK28acSep/qli+3kfD6dDP2MPzj9EAAAAAAAAR6Q8qWKobzz9oHTzQx9f4csa1zp6DA0WPP74AAAAAABXk3ng+xAp78+5uvHoUHtY2jGevxDNblX+i+++PoGFuAAAAAPxnLl72FqRmnS2ffxfrbJOq/Q4Nd3TmG36F6e+cl9X7zpbz6Mz0bupv1ley5obdGNsgAAACOd8QyMQPRvqPM5W2ri3aXz7i/VWVNVzQ0DcNPX1FLnS2+5nWzWvembvqDjvvxTQXitZmQ8v6YAAAB48io/wAW+0s2oLfK1mn7O6Tr5WkjlAo2U2Snrq4sdUt0TYU0WawZ+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8QALhAAAQQBAgQEBAcAAAAAAAAABQIDBAYBAAcXMDU2EBUgNBIUN0AREyQxM2Bw/9oACAEBAAEFAv7pIlsQ0pVhaeXKkJiRoUEjdneG+dcOM64cK1w4Xrhy5rhy7pnb51p3TzqWGgVzbNENx1Z8wqcrEepALk2bm8qw9C2+6F6jRZzymvGMGxpbpdH7j3G6kG+n9F7il3hiIY5Nh6Ft90L02Q1KEExjOBV3ov6YgW6XR+49xupBvp/Re4jXcvJP4yoHt6vGQnpmBos+bFjSB5SgsK+Xlzo84RR+49xupBvp/Re4jXcvJUnCsSKeRGS/LbZoNCsbRH0EhjBaKYjtxK3R0KeiQmigySRUXLOMyzccfBlygM5+XmeU+ysPQttf5fGZCYIMFhfkxv7IqxmUM26lJbI+i1Z8wt/2djgPVo6FNMG4nhYbAyCiUcW7PI89F6Frcly2oMYTcoJaZqfAYJxZ9WJ1+SxuFPYxIvxKXoVT5xiRHjtxGOZhac58I3uzI7BYbX6PJgE9ZVhOv307FZkaajNR9YVjPNJQzJ4rJppWG1WLTJgzdRvd2TOUgaY8tVkuRtwMPgiSNiWkSaAPT5rY6HMLE7RNlVksHapdndIL5ZS/xYbmNwCLusqyp/Ub3dm6BSu5boEdLjxZqdXnhF/Ylu7hu5QFBnHAL7m4Ux5urLy3YOVY8uJBV5cRsvIswqEw45+bJ1G93ZugUruU3YGQSnjwAkyT+WyQPCnp1TqplkRPwdCZQMODik/lZx+OCO3jEh0ft2wy6vbplTum9umm3SMPBGCHpLYgidr7B9pe2yviD0aIMe0Yo8Mm7jbZ34gFWjgVf43/AP/EADkRAAECBAIECwUJAAAAAAAAAAIBAwAEERIFExQxQVEQICEiNFNxgZGiwRUwMmHwM0BCQ1BysdHx/9oACAEDAQE/Afvj8xlKgANxLsjSJrqPMkaRNdR5kjSJrqPMkMuOHXMC3vrBvNtkIEvKuqAnL5k2FT4YaeB8b21qnGPpoftXhddFkby1Q3MGT4121FU+aRP9LY7fWA6e/wBi+kMTDkvJire0uNMIbbwvgN1OSBmyIkTKLw4CFDShJGjZR5mwar81VYfmFeViZUfDtgZlEmXHrVoSbozB0cWdqFX3TiVAkSMKWsoPf/PBizQk2J/ir7kH2nEVQKtIbdB5Lm1qkEDsg4rjaXNrrTdHtaWprXwhsHZx1HnUtEdSevHLEXarYyqon1uiUmwmwuGMKplPXav9iReYblSdEaInfA4oZc/JW3fE3NtyqolKkuyGcQvcRp4LFXjGVgqW6GH3ptFcJ6xN0YJ+Z3esYX9i/wDW+MPRspE0dXm1/qCNzDkTJdQh3RPXJOgalbVNe6FllcdAjmEJU1fVeP7Olbr7IZl2mK5aUrDcsy0iiA0rAyrINq0g81YDD5VsrhCHWW3xtcSsNSEuwV4Dy/pf/8QAOhEAAQIEAgQLBAsAAAAAAAAAAgEDAAQREgUTFDFBURAVICFTYYGRosHwMDRxciIyMzVAQkNQsdHx/9oACAECAQE/AfxkvLZyKZlaKbY0eU6fwrGjynT+FY0aU6fwrD7bTdMo7uykAw44JGKcya4ckrJUJhF+tsh5lxgrHEovKD3E/mThZaJ47B1w5LNiwVuyhIvUuyMP9zmPh5Qf3ex8yecPyzczOEjmweVLK24yUuZW150g5MRFSzR7+ASIFqKxpWcGXtKidSIkMS4spMSyF39aQUsqyrbNyVFa64yi0gntijT2TS0cFV3xiyUmy7P44MHdIXCD8tPYmw62qIY0rDrLjK2uJRYE2sQaRt0rXE1LvjiiarqTvh02pJlWGVuIta+XLHDWqJe+iKvrfE3JnJnaUYtXOZt1/wCRPsPuzYtEVVVPhBYU2K2ZyXbvSxKSbk2irdQU2w/h1jSvMmhonKAbyQd8PsMSZI2LKmu+Mc/S7fKMV+3Y9boxFXBnwVlKlT+4AG8RVc5lRLfEhaskYIN1F1b4SaRtoxbl1FFTn9U5fGM1bZfD0y7MUzVrSHJp55UIyrSCmnjcR1S+kkHiM04NpHDT7jBXNrSHsQmXxsMub9r/AP/EAEYQAAECAwIGCwwJBQAAAAAAAAECAwAEERIhEzEyQXOxBRAUIiMwUWFxcoEgNUBCUqGjssHR4eI0Q1N0gpGTwvAVYGJw8f/aAAgBAQAGPwL+9LT7yGUm6riqQFJNQcRHGOvLyG0lZ7IdmXprASyVUAxgcwEd8j+j80d8j+j80d8vRfNHfL0XzR3y9F8Y75ei+MIX/UyLJrvW6HXtLcVkoFowZXc5ZqCUKtVrEqK3YLF2w2+6TYaDij0AmFS25ywqlUG1WvFz+gXqhWmVqHdzD+xbrTzrJ39N9QZ4RMYnMlxIzKic0K9US/Qr1TErovbD+he/dDXVVqgyRl1FCV2FO2sR6OKn9ArVCtMrUO62NDZSZd5VFopebx74mZNv6O+gmxmxV98bLSgyELu7CRE5oV6ol+hXqmJXRe2H9C9+6GuqrVE194Ovip8D7BeqHE1vDxqOwd1LzTySp1jIvujZLZzZRIaCAQ2mta8lNXbE7sg9dh14zzYz5/NE8qXeQ8A0sEoVXNEv0K9UxK6L2w/oXv3Q11VaomvvB18UQRUHNC3dh5mw2vxLVCObnj6T6QQ0qcmAqW8cFQNe5LEwkqbrW40icZZTYbRLqAA6I2ZbQKqUyABz0VAfl5d9t5OI4GvshLk2y+6pIoDgaahCpJtt8SpBSUYDMceaEPpbsOpzOphUwoWVOuWiB0+Bz+gVqjZDoR7e4LMw2l1s5jCpatpIUCg8o8Dm2U5S2lJH5RMsG4uoqOz/AL3LbLd5Bba7f4fBEzkvc0teEbOYHOmA60aL8dvOk7ZUSFTChwbfL8Ic2UmKqSkmij4yz4AEAu1JpkQ4+8qy0gVJgSyEuNOKycIBvtpcvMIttq80bokFLdQMS2sodIiw+w06oZ8kxg5ZltlR8kWlRunZNS2kG82zwivdCGWUBDaBQJHG0CgTttdca4flCqxhBcrkOOG5madbsNGqQ2a1O1eadO1wrKHOsmscE0hvqppFxrxs4lsPPMIeWhNVUQADBdwAUE3nBqBIhpl91Tsqs2SFmtnnG011xrieIuODMSgK1Eb/ABn/ABMIDG9feNkK8kZ4ccbCnynKccX74Q5YeZRaFVNKqntpDsy7kNisYJFs2siXbNw/nLG6S2UJTeVtLvT+UGSm1W3QKtuHGrmPGKalWjNEY11on4xwcm0exRi1SybVaDNtNdca4ntEYlPx+oYbVLi28ya2PKGeFpa3lctp1MJanGtzqN2EBqn4Q0kYlvAH8jDjrTTbi1ps7/NCkKlZcpUKEX++JEj7SnFzxay8EcXJniXVPAGXrfaxc1YtbraUALkMm0fNCli60qu011xrie0RiU/H6hiXw6FKQ7XfIzUpHDusOp5HUXw/uOu5rXB15IaaoVTLKELpnJAv9sKMyi2w4LKrq2eeLW6JanRfC2JRFooTbwlig4uhvEFcq+ZYH6sptDsgLmpgzAH1aU2RBWJxSQTWyEYtpK92ruNciHpYqsBxNm1yQ1NpmlOFFd6U0xikIS8paFN1sqRG9nxTna+MJedWZp1N6aiiR2bSnmlGUdVjsiqT2RfPJs8uD+MKcQ4t15QslSsVOj/Tn//EACsQAQABAgQFBAICAwAAAAAAAAERACExQVFhEHGBkfAgMKGxQMFgcNHh8f/aAAgBAQABPyH+aEXZAhXS9BANKJE9zIGZ0EtLoiOKMbkwEleJHG/q8bp51XwqtviZN0HhR+GrsEtS07Fh73ItbnSZ6KTIK5+inUFjFG/qkZKLTJiNiH2/CavYQZhS8haNf1NQeCcoDHo2eteM18Hnm7+O12EQZ2QxC4c/a8Lq9aBB4LzADflZFHvfGRP02cmjNFPy/wCm7V4zXweebv8Ad2udMSXA66LAddCYPUokZu5pJOdFxap0bGwUAcNpESeRKoWP4UGenB55u/3drjQbChWCVrWUZtWQK3NYpBNnUZAYzHpbMBjAlExy7xOnsFvmhKnM6SoSQ2YVec32JM5FX8q5zLivzc6cMZBoI2bWoIuU0L+G87qrwevo5IkXDc0d6eQL7itz/HT8MWJHN1RTIws+a8Oy7ekbuJTUz8fT8Qf7QTcXz0aHeADPJctHigJBLdauypWBudj0l6pp+BCp47+/CbVpUGYRsst+BgMhmskcmk2392mf8lYQaqHr5fFZABF+lNvipbLxbZj9u1ZcBih7uygB9HlliLEwIPkKuEKosrEIOBckd0UIJGSnpT2/tRTA7X0qRgho+7dHDFiASh+6WBawhyxelBtfNE7COEacfHAQiSmxLAiVrDJw8AuN7nenZJvTur1AYcBKdTDnT+xNxi6BusFGUF4AW+vNTO3EDuMp61ot9gMdRznn7axTE3TE+zC0Ut231WlCCZBi9OhOZsJnMhYb2Ku+EYIpqWRqUbYXTvn8qWONzAX7DtV+OgWyZtDy7Ux7zi8SGikwo6ER+H25yOpf8JoaBVqZw2NJioes4qbBg60RaCkcpfSITmX+zYXaZ41hZGJhykntVgb+Ep7r96X20bKecNAwy5eU2h371Bu0QdkTRZ59HjBBN89PbBgEsjnTXxlhPcId6UXU3RzZXtFLoiAxdhjwCCRxjrzpxaSBNLWHZQyYp3prqJxaYmRxwKxa9dRh/wCJzXFLzeCgalzDXBfk0yB9BL2pYdLYuTYcjX+nP//aAAwDAQACAAMAAAAQ8888888888888888888888888888/wD8ffPrN/PPPPDPPPlwvG/PPPPLe/LzyOz/ADzzzzzzzz13z/zzzzzzzz70f7LzzzzzwX7Rh5/PzzzzyqHUu2plXzzzzyw93xy23/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/8QAKhEBAAEDAgUDAwUAAAAAAAAAAREAITFBUSBhcZGhEMHwMLHxQFCB0eH/2gAIAQMBAT8Q/WO+SYCFjKrg4EIQWrbFku2KjZ2Rv851bUBMz0n7+K2qifzxfEbnqxwkLc0PescRaQXROpmvnclfJbUdKFRtNoLcT3AFBm8Im9OkpYlEHNvj0hgSzflcoZlkrzkpW0RFiktQKoJwMdqR84DVLGb8t6CRJaI0SPpNnCP2oAmkHufSKWAHVnT6IBBkjjrUdOCSkdpkMrcNvwxA1lEm0p/rzTv7psru+e68REWm9yY2u+9KjRLI6f5WPTqNyJFOiczeSwdNwKKLjov/ADiPNbKOGe/5mp1cKcPg4rCTBe1H/BwDve8d62Wb0eN7Uj7JC7Wg94p5VOx54lg5iX0oxEhCJ1T5b7TNKqARBLcbRycakwnOsdpjxXVWZ9+tRumeb+edECyJe+N+hRokmJV8KlRjjn7alFIYwysd1/a//8QAKREBAAEDAgUEAgMBAAAAAAAAAREAITFRYUFxkaHBECCB8DCxQFDR4f/aAAgBAgEBPxD+YA5BlC3cAF19nKEQF3m6HXNTd7q0+7VcBVFnOP13rVaIt4931Gj6io5C32F8VmIjELZVycV9zdX2mtDrkFLxeW/23uMwkI4tZHShQ8EwKXYtn0nAG5bezUHZDNBgoC8zN2jLSgCo5nWhXGFwQTi2+hViQ3ieIr+IMQB+6VaZEdB49JJZVOBEX8fhdKsBM8qkdyQ6UGgMJgaLr5uTKViMGsI/3tWHSiwGj7z4B7mgVFrMT8P1RRxG4nH/ALWdRKzozBohxkWgEvPRVphZeIj44u3xWsB1jp3cRXFBKMnd9194kHVinHoyXpYSelbUWo7jzSPYFDW8jpNDoI1G2YJdkbUpqUkMcEdi2sRSKQClgsl53e8O9j4nrE965ETFp5cqntMbFuhtTxsA2IzpzafMhzAHcBqbdbeTD80glrIAT0P6v//EACgQAQABBAECBgMBAQEAAAAAAAERACExQVFhcRAwgZGh8CBAscFgcP/aAAgBAQABPxD/ALTpmap4WC9KNT4skSIlkTfmSd8mJsXWClctiHSGBuCFkzeHR7qkePcUdHu6OpetCHFLHgUztaGLCORDwwxw+Dlj8JRyR2GoS4AQGQRnBbItE8udHI2AQcp7BQa+lcIA6CA7U3dvRiIxV9lm+J8px5GVk5EY0XLEMQCb6QuFDR+wCFnQQ4Aa8Vez5mn6Xmn13OjWaAFIJKkMLBYYMT5Jn89rL3LeLMiuWcFxmS1E8kDcBInVD/pTAakmRIvqHiL9nztP0vNPruflnKydAZYSo+Zw2FpOGG/R4/K3DxBMkYWAJ8yWqdWCusEk6qYVShDQfGcy+ctiGXq4oTvqnFsmP98NnzNJ+run13Py/k6INlBCJsSpsjvJUpIMwwrJxt+qf5TCbzoUEhoMmPR/AAg4fCkTunrU9yLoOxOV5W6quacYYGIHdWPWhGA7fwJWClyt6BkihAm63SoSmo4Bmr81xNooaCJpoFSiHIj1oSsWVFKC3j9gshK2iM+XJkNBEoo51GZL1JV1X6b7Cm2d8koNmFiRkdZHZfjtyUJBX8XiXH6jlmL4LMLV7Nx6YKkIdjXRtX0JwiHhek2NghlxLruILtE2C7eVHyFPQZR590UIgSYL9TRrW1ioYADKqAbUKugYSMCwY0BYbMRM28AAvdWJ2Y0n8UpMLKR34kx5gSJQxT+4CsdxFl2FGl4K695+WjIyknckp1MEMbAKOGQL+u1bqq38xYKaAmSqenj9TwpeUUFwymy6OJpFxJawiWEKO1iIM+BhM2A+aMATCMjRwEIFuPQ0ULMhb7CmwtkAx5uXfSVOBQAYnlLSTBsZLqFPQLT1N1TZcAJFlCTaYfD6HhTEw1wj0aKrUmi9haOiiAbgJtgE4k6oaAgG0iFwmGxMbi1cKJHlN0HZCkSvjk46oB1SkL7Ezb7BAu9XBYFJ4PHsANiQ2lPIT/lFEsyQlcl8oAqgF1dVDwKm+vuCbgDkUvS1m8AsdJGnOPQITKA1Hh9Lwr7npXwqDRB+QDEnSUNghdKsq2bZiJYCW4jzQgipeqxFAJ3INoXpvCxGwKe4oIik9tkQMpLsppwcYoHcLSTVFOEvVDy0gIuYIXHauJlahr5ckXtc2mm3a6rknowDaU1nLwCoPv4fe8K+56V8OhO5LkEXLSDxZIwzU8tjA9tGevorLM6BGNEzGURN5pnD+M9RxsZlQN0SIsGZI1kLELxIlITobJ+VP8KYls9ht0NmcwLWXyz8ihyByJspv4Zm3SOgH4UGMGC+pwdJOtFYwjBkDiY8Gu5DGYDE9tCcemw7BSaFwYyIsFEX41UpxDBkACB6DayUFTl2APRj8UVdMEPcM0GpAzEg+DUiEX8tsFuAbqKzV8jaZ7gfNWtl5UCMSVJVWyf+Of/Z","u":"","w":129,"e":1},{"id":"8","layers":[{"ind":7,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[58,61]},"r":{"a":0,"k":0},"s":{"a":0,"k":[116,122]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],"o":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],"v":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],"o":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],"v":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"14","layers":[{"ind":13,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[73,76]},"r":{"a":0,"k":0},"s":{"a":0,"k":[146,152]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],"o":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],"v":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],"o":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],"v":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],"o":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],"v":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"17","layers":[{"ind":10,"ty":0,"parent":6,"ks":{},"w":116,"h":122,"ip":0,"op":55,"st":0,"refId":"8"},{"ind":6,"ty":3,"parent":5,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[6.181,6.13]}},"ip":0,"op":55,"st":0},{"ind":16,"ty":0,"parent":12,"ks":{},"w":146,"h":152,"ip":0,"op":55,"st":0,"refId":"14"},{"ind":12,"ty":3,"parent":11,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":11,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[-0.109,-0.108]}},"ip":0,"op":55,"st":0},{"ind":4,"ty":3,"ks":{"p":{"a":0,"k":[1,1]}},"ip":0,"op":55,"st":0}]},{"id":"24","layers":[{"ind":23,"ty":2,"parent":22,"ks":{},"ip":0,"op":55,"st":0,"refId":"0"},{"ind":22,"ty":3,"ks":{"s":{"a":0,"k":[61.24,61.24]}},"ip":0,"op":55,"st":0}]},{"id":"32","layers":[{"ind":31,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"37","layers":[{"ind":36,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"43","layers":[{"ind":42,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"48","layers":[{"ind":47,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"53","layers":[{"ind":52,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":19,"ty":0,"parent":3,"ks":{"a":{"a":0,"k":[31.5,32.5]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":12,"s":[0],"h":1},{"t":54,"s":[0],"h":1}]},"p":{"a":0,"k":[30.5,31.5]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":12,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[50,50],"h":1}]}},"w":147,"h":153,"ip":0,"op":55,"st":0,"refId":"17"},{"ind":3,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[28.768,29]}},"ip":0,"op":55,"st":0},{"ind":27,"ty":4,"td":1,"parent":21,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[39.5,39.5]},"r":{"a":0,"k":150},"s":{"a":0,"k":[79,79]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":26,"ty":0,"tt":1,"parent":21,"ks":{},"w":79,"h":79,"ip":0,"op":55,"st":0,"refId":"24"},{"ind":21,"ty":3,"parent":20,"ks":{"a":{"a":0,"k":[39.5,39.5]},"p":{"a":0,"k":[39.5,39.5]},"r":{"a":1,"k":[{"t":0,"s":[-45],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":54,"s":[0],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":54,"s":[100,100],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":20,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[69,20]}},"ip":0,"op":55,"st":0},{"ind":34,"ty":0,"parent":30,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"32"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.974,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.974,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":39,"ty":0,"parent":35,"ks":{},"w":28,"h":29,"ip":0,"op":55,"st":0,"refId":"37"},{"ind":35,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":55,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":55,"st":0},{"ind":45,"ty":0,"parent":41,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"43"},{"ind":41,"ty":3,"parent":40,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.474,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.474,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":50,"ty":0,"parent":46,"ks":{},"w":29,"h":29,"ip":0,"op":55,"st":0,"refId":"48"},{"ind":46,"ty":3,"parent":40,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":55,"st":0},{"ind":40,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":55,"st":0},{"ind":55,"ty":0,"parent":51,"ks":{},"w":129,"h":127,"ip":0,"op":55,"st":0,"refId":"53"},{"ind":51,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":55,"st":0},{"ind":28,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":1,"k":[{"t":0,"s":[108.343,99.459],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[108.343,139.459],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[108.343,139.459],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":48,"s":[60,60],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[60,60],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{},"ip":0,"op":55,"st":0},{"ind":1,"ty":3,"ks":{},"ip":0,"op":55,"st":0}],"meta":{"g":"https://jitter.video"},"op":54,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/ard.json
================================================
{"assets":[{"h":129,"id":"0","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"id":"8","layers":[{"ind":7,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[58,61]},"r":{"a":0,"k":0},"s":{"a":0,"k":[116,122]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],"o":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],"v":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],"o":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],"v":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"14","layers":[{"ind":13,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[73,76]},"r":{"a":0,"k":0},"s":{"a":0,"k":[146,152]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],"o":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],"v":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],"o":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],"v":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],"o":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],"v":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"17","layers":[{"ind":10,"ty":0,"parent":6,"ks":{},"w":116,"h":122,"ip":0,"op":55,"st":0,"refId":"8"},{"ind":6,"ty":3,"parent":5,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[6.181,6.13]}},"ip":0,"op":55,"st":0},{"ind":16,"ty":0,"parent":12,"ks":{},"w":146,"h":152,"ip":0,"op":55,"st":0,"refId":"14"},{"ind":12,"ty":3,"parent":11,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":11,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[-0.109,-0.108]}},"ip":0,"op":55,"st":0},{"ind":4,"ty":3,"ks":{"p":{"a":0,"k":[1,1]}},"ip":0,"op":55,"st":0}]},{"id":"24","layers":[{"ind":23,"ty":2,"parent":22,"ks":{},"ip":0,"op":55,"st":0,"refId":"0"},{"ind":22,"ty":3,"ks":{"s":{"a":0,"k":[61.24,61.24]}},"ip":0,"op":55,"st":0}]},{"id":"32","layers":[{"ind":31,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"37","layers":[{"ind":36,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"43","layers":[{"ind":42,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"48","layers":[{"ind":47,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"53","layers":[{"ind":52,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":19,"ty":0,"parent":3,"ks":{"a":{"a":0,"k":[31.5,32.5]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":12,"s":[0],"h":1},{"t":54,"s":[0],"h":1}]},"p":{"a":0,"k":[30.5,31.5]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":12,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[50,50],"h":1}]}},"w":147,"h":153,"ip":0,"op":55,"st":0,"refId":"17"},{"ind":3,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[28.768,29]}},"ip":0,"op":55,"st":0},{"ind":27,"ty":4,"td":1,"parent":21,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[39.5,39.5]},"r":{"a":0,"k":150},"s":{"a":0,"k":[79,79]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":26,"ty":0,"tt":1,"parent":21,"ks":{},"w":79,"h":79,"ip":0,"op":55,"st":0,"refId":"24"},{"ind":21,"ty":3,"parent":20,"ks":{"a":{"a":0,"k":[39.5,39.5]},"p":{"a":0,"k":[39.5,39.5]},"r":{"a":1,"k":[{"t":0,"s":[-45],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":54,"s":[0],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":54,"s":[100,100],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":20,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[69,20]}},"ip":0,"op":55,"st":0},{"ind":34,"ty":0,"parent":30,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"32"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.974,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.974,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":39,"ty":0,"parent":35,"ks":{},"w":28,"h":29,"ip":0,"op":55,"st":0,"refId":"37"},{"ind":35,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":55,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":55,"st":0},{"ind":45,"ty":0,"parent":41,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"43"},{"ind":41,"ty":3,"parent":40,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.474,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.474,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":50,"ty":0,"parent":46,"ks":{},"w":29,"h":29,"ip":0,"op":55,"st":0,"refId":"48"},{"ind":46,"ty":3,"parent":40,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":55,"st":0},{"ind":40,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":55,"st":0},{"ind":55,"ty":0,"parent":51,"ks":{},"w":129,"h":127,"ip":0,"op":55,"st":0,"refId":"53"},{"ind":51,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":55,"st":0},{"ind":28,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":1,"k":[{"t":0,"s":[108.343,99.459],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[108.343,139.459],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[108.343,139.459],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":48,"s":[60,60],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[60,60],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{},"ip":0,"op":55,"st":0},{"ind":1,"ty":3,"ks":{},"ip":0,"op":55,"st":0}],"meta":{"g":"https://jitter.video"},"op":54,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/connexion.json
================================================
{"assets":[{"h":96,"id":"0","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"h":112,"id":"1","p":"data:image/png;base64,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","u":"","w":99,"e":1},{"h":84,"id":"2","p":"data:image/png;base64,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","u":"","w":84,"e":1},{"h":84,"id":"3","p":"data:image/png;base64,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","u":"","w":84,"e":1},{"h":42,"id":"4","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASBSURBVHgB7ZltaFtVGMf/N/emWV66pGFpm25NWaZ1VqpTYVK6oRNfcA4Gqx9FkX1R8NPQ+U1BQeqHIRPdB0WmQ9icuMmc+kFlrdMNlMIQ67razdY2Xds1TdvkJrkvOdfn3jn7luSeLknZoH+4JPfek5PfeZ7n/M/JjVD72WsGbnkJnzhwm2gVtNxaBS23lgXqcSiol9IwIGClJfE2DBHgqcbj2OCcwankHXhnsh1DWmDFkLkj+oTvMqJVU6gScnhm7SX8Fv0Yr4d+BlshVC5QRseLgZ5FVwW8HPyVovwFvAJDpcUFGhVn0eyK573X5vkHr4a6UOnljQu0UZoGiqT4pZoLeIpKo5LiAt0opG3bvF37k1W/lRLfZGIMzIZhvTOB7Z5hVEpcoAO5tVBl+2jt8A4Wve8QDLK5DFncNA1s1soArydz+eiA4YeWZnD5RAhFhnaXa9KaVPO/2jzfsuYqXgj8ga3uYYKUCVCFYQhIMh8uKH78kNqME8k7Mal7UBLoGKvGsL4OkXgcvlDhj/gdumVl4n/nZtTerO3GLl//InwBAp36xRQe9phHDPuC59Ex0oFeJZS3b67Um42OaK1gmgF5UjdLNq/SxlyHEUrv6cgxgvwL4EhvDa18YRpYMQYufa7dh1EWRE41kJ7QrdfFmtDdFlKdlMKJyHE00CuvZpgbZ+UmlAyaNlzYl91JqXVQRK9HNjuzcIKdTLZYNXmg7gx5Lz+kqcNTD0AxpNJBTfXk1uOQ2ma9F50CRNdcSs01f0gNkvFfweNWuvk1qPpwaOrBom24JlONqNJG5CK2eYaw2XUNPlGCw7Gw7noyYVxSa/BB+DssR1m9CvtHd2LGkG4e1EzjkxShg/XfIyjK8+4snRxHrt2DRz1/o8U18f81s44FSaBB5embyieTEvHWVDu6lQ2wU1HQ3dX9+Kjha9jN2pGEB6ezd+PD4MkF1zOJHK1oBhzO67CmB5uDZxowTul+RXka5/Qm8KggaL0zSR7YZQupyAzvJtpQTSb+kGtsYeduB9RUzrK1G46Wokl5VLsX76ntyNJ7XhUEfd7fi7DNzFVSDL3TQXyqbcEuaQBuScX8gbl8DpyXw/hTDSPOPDijR3HFCBIg9w8Le9DWNWMFP2RQeExrmki7sTfdQSuRgVYxtqSdmerIOgV7B9shM/7o5VNBezoab8FV2QemGxaYWfw5SqEJmBzX8G2yGbvl5zBK+wBTPmStNou1iVaozroulKqCEf0m04xzsSa0SDHscV6EX8ggzZy4zEL4Ud+EvlwtdMz3UdGqxXzaU92H/eOPIFNCVIsWS4KK/Rctah126mMN0PWe/F9C27kd3hhlwb6fQirbA4ivaKIkVFfBqNZLsyhFZQM1reZ9hSwnlX+DrRoiSlFZH+kc0+7H4VnaXCSXwp5NN6IUlRU0S1F7I/sYDsTbIKfmuu5XA7TxCKAULd95bWQm+KCyDV+OtuJZ7+/Y6JXRmdha8vOUsoPe0Aj5a2dqO62ZKItWn4+WW6ug5dZtAyqZfzbhFhf9POv+F7NtpNQ3hR5HAAAAAElFTkSuQmCC","u":"","w":42,"e":1},{"id":"10","layers":[{"ind":9,"ty":2,"parent":8,"ks":{"s":{"a":0,"k":[33.33,33.33]}},"ip":0,"op":120.4,"st":0,"refId":"0"},{"ind":8,"ty":3,"ks":{},"ip":0,"op":120.4,"st":0}]},{"id":"20","layers":[{"ind":17,"ty":4,"parent":16,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[4.375,4.375]},"s":{"a":0,"k":[8.75,8.75]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":16,"ty":3,"parent":15,"ks":{"p":{"a":0,"k":[8.422,7.292]}},"ip":0,"op":120.4,"st":0},{"ind":19,"ty":2,"parent":18,"ks":{"s":{"a":0,"k":[33.33,33.04]}},"ip":0,"op":120.4,"st":0,"refId":"1"},{"ind":18,"ty":3,"parent":15,"ks":{"a":{"a":0,"k":[16.5,18.5]},"p":{"a":0,"k":[12.538,14.893]},"r":{"a":0,"k":12.68}},"ip":0,"op":120.4,"st":0},{"ind":15,"ty":3,"parent":14,"ks":{"a":{"a":0,"k":[13.037,14.939]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":0,"k":-12.68}},"ip":0,"op":120.4,"st":0},{"ind":14,"ty":3,"ks":{"p":{"a":0,"k":[9,9]}},"ip":0,"op":120.4,"st":0}]},{"id":"28","layers":[{"ind":27,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16.5,15]},"r":{"a":0,"k":0},"s":{"a":0,"k":[33,30]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],"o":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],"v":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],"o":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],"v":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"33","layers":[{"ind":32,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[13.5,11.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[27,23]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],"o":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],"v":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],"o":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],"v":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{"ty":"fl","c":{"a":0,"k":[0.49,0.79,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"36","layers":[{"ind":30,"ty":0,"parent":26,"ks":{},"w":33,"h":30,"ip":0,"op":120.4,"st":0,"refId":"28"},{"ind":26,"ty":3,"parent":25,"ks":{"a":{"a":0,"k":[16.5,15]},"p":{"a":0,"k":[15.953,14.392]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":35,"ty":0,"parent":31,"ks":{},"w":27,"h":23,"ip":0,"op":120.4,"st":0,"refId":"33"},{"ind":31,"ty":3,"parent":25,"ks":{"a":{"a":0,"k":[13.5,11.5]},"p":{"a":0,"k":[15.873,14.886]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":25,"ty":3,"parent":24,"ks":{"a":{"a":0,"k":[15.3,15.3]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":0,"k":-9.18}},"ip":0,"op":120.4,"st":0},{"ind":24,"ty":3,"ks":{"p":{"a":0,"k":[3,4]}},"ip":0,"op":120.4,"st":0}]},{"id":"46","layers":[{"ind":45,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],"v":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"51","layers":[{"ind":50,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"56","layers":[{"ind":55,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"61","layers":[{"ind":60,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"66","layers":[{"ind":65,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"71","layers":[{"ind":70,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[5.5,3]},"r":{"a":0,"k":0},"s":{"a":0,"k":[11,6]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],"o":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"74","layers":[{"ind":48,"ty":0,"parent":44,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"46"},{"ind":44,"ty":3,"parent":43,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[17.594,5.138]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":53,"ty":0,"parent":49,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"51"},{"ind":49,"ty":3,"parent":43,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.134,17.416]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":58,"ty":0,"parent":54,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"56"},{"ind":54,"ty":3,"parent":43,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.225,5.047]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":63,"ty":0,"parent":59,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"61"},{"ind":59,"ty":3,"parent":43,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[20.992,21.292]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":68,"ty":0,"parent":64,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"66"},{"ind":64,"ty":3,"parent":43,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[14.69,20.761]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":73,"ty":0,"parent":69,"ks":{},"w":11,"h":6,"ip":0,"op":120.4,"st":0,"refId":"71"},{"ind":69,"ty":3,"parent":43,"ks":{"a":{"a":0,"k":[5.5,3]},"p":{"a":0,"k":[17.282,14.474]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":43,"ty":3,"ks":{"p":{"a":0,"k":[2.572,2.572]}},"ip":0,"op":120.4,"st":0}]},{"id":"79","layers":[{"ind":76,"ty":0,"parent":42,"ks":{"a":{"a":0,"k":[2.286,2.286]},"p":{"a":0,"k":[2.286,2.286]}},"w":27.4286,"h":27.4286,"ip":0,"op":120.4,"st":0,"refId":"74"},{"ind":42,"ty":3,"parent":41,"ks":{"p":{"a":0,"k":[2.286,2.286]}},"ip":0,"op":120.4,"st":0},{"ind":78,"ty":4,"parent":77,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16,16]},"r":{"a":0,"k":6.857},"s":{"a":0,"k":[32,32]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":77,"ty":3,"parent":41,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":41,"ty":3,"parent":40,"ks":{"a":{"a":0,"k":[16,16]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":0,"k":13.62}},"ip":0,"op":120.4,"st":0},{"ind":40,"ty":3,"ks":{"p":{"a":0,"k":[1,0]}},"ip":0,"op":120.4,"st":0}]},{"id":"87","layers":[{"ind":86,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[11.5,12]},"r":{"a":0,"k":0},"s":{"a":0,"k":[23,24]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.06,-1.04],[1.39,0],[0,0],[0,1.6],[-0.02,0.8],[0.21,0.69],[0.63,-2.06],[-0.01,-0.61],[0,-0.89],[1.6,0],[0,0],[0.07,1.39],[-0.3,0.91],[0.32,1.05],[-0.98,0.66],[0,0],[-0.98,-0.65],[0,0],[0.35,-1.14],[-0.57,-1.71]],"o":[[0.31,0.91],[-0.07,1.39],[0,0],[-1.6,0],[0,-0.89],[0.01,-0.61],[-0.63,-2.06],[-0.21,0.69],[0.02,0.8],[0,1.6],[0,0],[-1.39,0],[-0.06,-1.04],[0.57,-1.71],[-0.35,-1.14],[0,0],[0.98,-0.65],[0,0],[0.98,0.66],[-0.32,1.05],[0,0]],"v":[[16.63,12.18],[16.91,15.32],[14.23,17.7],[13.98,17.7],[11.07,14.81],[11.09,12.18],[10.75,10.2],[6.8,10.2],[6.46,12.18],[6.48,14.81],[3.57,17.7],[3.32,17.7],[0.64,15.32],[0.92,12.18],[1.03,7.98],[1.87,4.75],[7.15,1.23],[10.4,1.23],[15.68,4.75],[16.52,7.98],[16.63,12.18]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"90","layers":[{"ind":89,"ty":0,"parent":85,"ks":{},"w":23,"h":24,"ip":0,"op":120.4,"st":0,"refId":"87"},{"ind":85,"ty":3,"ks":{"p":{"a":0,"k":[4.3,4.1]}},"ip":0,"op":120.4,"st":0}]},{"id":"99","layers":[{"ind":98,"ty":2,"parent":97,"ks":{},"ip":0,"op":120.4,"st":0,"refId":"2"},{"ind":97,"ty":3,"ks":{"s":{"a":0,"k":[51.19,51.19]}},"ip":0,"op":120.4,"st":0}]},{"id":"106","layers":[{"ind":105,"ty":2,"parent":104,"ks":{},"ip":0,"op":120.4,"st":0,"refId":"3"},{"ind":104,"ty":3,"ks":{"s":{"a":0,"k":[50,50]}},"ip":0,"op":120.4,"st":0}]},{"id":"113","layers":[{"ind":112,"ty":2,"parent":111,"ks":{},"ip":0,"op":120.4,"st":0,"refId":"4"},{"ind":111,"ty":3,"ks":{"s":{"a":0,"k":[99.06,99.06]}},"ip":0,"op":120.4,"st":0}]},{"id":"121","layers":[{"ind":120,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"126","layers":[{"ind":125,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"132","layers":[{"ind":131,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"137","layers":[{"ind":136,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"142","layers":[{"ind":141,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":12,"ty":0,"parent":7,"ks":{"a":{"a":0,"k":[21.5,16]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":61.08,"s":[0],"i":{"x":0,"y":1},"o":{"x":0,"y":0}},{"t":93.6,"s":[100],"h":1},{"t":119.4,"s":[100],"h":1}]},"p":{"a":0,"k":[21.5,16]},"s":{"a":1,"k":[{"t":0,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":61.08,"s":[50,50],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":93.6,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[100,100],"h":1}]}},"w":43,"h":32,"ip":0,"op":120.4,"st":0,"refId":"10"},{"ind":7,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[138,40]}},"ip":0,"op":120.4,"st":0},{"ind":22,"ty":0,"parent":13,"ks":{"a":{"a":0,"k":[24.997,26.436]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":45.6,"s":[0],"i":{"x":0,"y":1},"o":{"x":0,"y":0}},{"t":78.12,"s":[100],"h":1},{"t":119.4,"s":[100],"h":1}]},"p":{"a":0,"k":[15.997,17.436]},"s":{"a":1,"k":[{"t":0,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":45.6,"s":[50,50],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":78.12,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[100,100],"h":1}]}},"w":50,"h":53,"ip":0,"op":120.4,"st":0,"refId":"20"},{"ind":13,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[87,28]}},"ip":0,"op":120.4,"st":0},{"ind":38,"ty":0,"parent":23,"ks":{"a":{"a":0,"k":[20.544,21.544]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":20.4,"s":[0],"i":{"x":0,"y":1},"o":{"x":0,"y":0}},{"t":45.6,"s":[100],"h":1},{"t":119.4,"s":[100],"h":1}]},"p":{"a":0,"k":[17.544,17.544]},"s":{"a":1,"k":[{"t":0,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":20.4,"s":[50,50],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":45.6,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[100,100],"h":1}]}},"w":43,"h":41,"ip":0,"op":120.4,"st":0,"refId":"36"},{"ind":23,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[7,49]}},"ip":0,"op":120.4,"st":0},{"ind":81,"ty":0,"parent":39,"ks":{"a":{"a":0,"k":[20.317,19.317]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":29.76,"s":[0],"i":{"x":0,"y":1},"o":{"x":0,"y":0}},{"t":62.28,"s":[100],"h":1},{"t":119.4,"s":[100],"h":1}]},"p":{"a":0,"k":[19.317,19.317]},"s":{"a":1,"k":[{"t":0,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":29.76,"s":[50,50],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":62.28,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[100,100],"h":1}]}},"w":40,"h":39,"ip":0,"op":120.4,"st":0,"refId":"79"},{"ind":39,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[41,10]}},"ip":0,"op":120.4,"st":0},{"ind":92,"ty":0,"parent":84,"ks":{"a":{"a":0,"k":[5.2,3.9]},"p":{"a":0,"k":[5.2,3.9]}},"w":31.2,"h":31.2,"ip":0,"op":120.4,"st":0,"refId":"90"},{"ind":84,"ty":3,"parent":83,"ks":{"p":{"a":0,"k":[5.2,3.9]}},"ip":0,"op":120.4,"st":0},{"ind":94,"ty":4,"parent":93,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[20.802,20.802]},"r":{"a":0,"k":27.3},"s":{"a":0,"k":[41.604,41.604]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":93,"ty":3,"parent":83,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":83,"ty":3,"parent":82,"ks":{"a":{"a":0,"k":[20.802,20.802]},"p":{"a":0,"k":[20.802,20.802]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":12.72,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":12.72,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":82,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[20,134]}},"ip":0,"op":120.4,"st":0},{"ind":101,"ty":0,"parent":96,"ks":{},"w":43,"h":43,"ip":0,"op":120.4,"st":0,"refId":"99"},{"ind":96,"ty":3,"parent":95,"ks":{"a":{"a":0,"k":[21.5,21.5]},"p":{"a":0,"k":[21.5,21.5]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":3.66,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":16.38,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":3.66,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":16.38,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":95,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[157,133]}},"ip":0,"op":120.4,"st":0},{"ind":108,"ty":0,"parent":103,"ks":{},"w":42,"h":42,"ip":0,"op":120.4,"st":0,"refId":"106"},{"ind":103,"ty":3,"parent":102,"ks":{"a":{"a":0,"k":[21,21]},"p":{"a":0,"k":[21,21]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":10.02,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.74,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":10.02,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.74,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":102,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[130,0]}},"ip":0,"op":120.4,"st":0},{"ind":116,"ty":4,"td":1,"parent":110,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[20.802,20.802]},"r":{"a":0,"k":27.3},"s":{"a":0,"k":[41.604,41.604]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":115,"ty":0,"tt":1,"parent":110,"ks":{},"w":41.604,"h":41.604,"ip":0,"op":120.4,"st":0,"refId":"113"},{"ind":110,"ty":3,"parent":109,"ks":{"a":{"a":0,"k":[20.802,20.802]},"p":{"a":0,"k":[20.802,20.802]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":17.28,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":30,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":17.28,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":30,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":109,"ty":3,"parent":6,"ks":{"p":{"a":0,"k":[12,9]}},"ip":0,"op":120.4,"st":0},{"ind":123,"ty":0,"parent":119,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"121"},{"ind":119,"ty":3,"parent":118,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":17.4,"s":[4.974,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.501],"y":[0,0]}},{"t":45.84,"s":[4.974,0.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[4.974,0.541],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":128,"ty":0,"parent":124,"ks":{},"w":28,"h":29,"ip":0,"op":120.4,"st":0,"refId":"126"},{"ind":124,"ty":3,"parent":118,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":118,"ty":3,"parent":117,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":134,"ty":0,"parent":130,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"132"},{"ind":130,"ty":3,"parent":129,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":17.4,"s":[4.474,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.501],"y":[0,0]}},{"t":45.84,"s":[4.474,0.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[4.474,0.541],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":139,"ty":0,"parent":135,"ks":{},"w":29,"h":29,"ip":0,"op":120.4,"st":0,"refId":"137"},{"ind":135,"ty":3,"parent":129,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":129,"ty":3,"parent":117,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":144,"ty":0,"parent":140,"ks":{},"w":129,"h":127,"ip":0,"op":120.4,"st":0,"refId":"142"},{"ind":140,"ty":3,"parent":117,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":120.4,"st":0},{"ind":117,"ty":3,"parent":6,"ks":{"p":{"a":1,"k":[{"t":0,"s":[32.926,43.559],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[32.926,63.559],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[32.926,63.559],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":6,"ty":3,"parent":5,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":5,"ty":3,"ks":{},"ip":0,"op":120.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":119.4,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/izly.json
================================================
{"assets":[{"h":129,"id":"0","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"id":"8","layers":[{"ind":7,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[58,61]},"r":{"a":0,"k":0},"s":{"a":0,"k":[116,122]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],"o":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],"v":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],"o":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],"v":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"14","layers":[{"ind":13,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[73,76]},"r":{"a":0,"k":0},"s":{"a":0,"k":[146,152]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],"o":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],"v":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],"o":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],"v":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],"o":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],"v":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"17","layers":[{"ind":10,"ty":0,"parent":6,"ks":{},"w":116,"h":122,"ip":0,"op":55,"st":0,"refId":"8"},{"ind":6,"ty":3,"parent":5,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[6.181,6.13]}},"ip":0,"op":55,"st":0},{"ind":16,"ty":0,"parent":12,"ks":{},"w":146,"h":152,"ip":0,"op":55,"st":0,"refId":"14"},{"ind":12,"ty":3,"parent":11,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":11,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[-0.109,-0.108]}},"ip":0,"op":55,"st":0},{"ind":4,"ty":3,"ks":{"p":{"a":0,"k":[1,1]}},"ip":0,"op":55,"st":0}]},{"id":"24","layers":[{"ind":23,"ty":2,"parent":22,"ks":{},"ip":0,"op":55,"st":0,"refId":"0"},{"ind":22,"ty":3,"ks":{"s":{"a":0,"k":[61.24,61.24]}},"ip":0,"op":55,"st":0}]},{"id":"32","layers":[{"ind":31,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"37","layers":[{"ind":36,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"43","layers":[{"ind":42,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"48","layers":[{"ind":47,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"53","layers":[{"ind":52,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":19,"ty":0,"parent":3,"ks":{"a":{"a":0,"k":[31.5,32.5]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":12,"s":[0],"h":1},{"t":54,"s":[0],"h":1}]},"p":{"a":0,"k":[30.5,31.5]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":12,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[50,50],"h":1}]}},"w":147,"h":153,"ip":0,"op":55,"st":0,"refId":"17"},{"ind":3,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[28.768,29]}},"ip":0,"op":55,"st":0},{"ind":27,"ty":4,"td":1,"parent":21,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[39.5,39.5]},"r":{"a":0,"k":150},"s":{"a":0,"k":[79,79]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":26,"ty":0,"tt":1,"parent":21,"ks":{},"w":79,"h":79,"ip":0,"op":55,"st":0,"refId":"24"},{"ind":21,"ty":3,"parent":20,"ks":{"a":{"a":0,"k":[39.5,39.5]},"p":{"a":0,"k":[39.5,39.5]},"r":{"a":1,"k":[{"t":0,"s":[-45],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":54,"s":[0],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":54,"s":[100,100],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":20,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[69,20]}},"ip":0,"op":55,"st":0},{"ind":34,"ty":0,"parent":30,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"32"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.974,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.974,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":39,"ty":0,"parent":35,"ks":{},"w":28,"h":29,"ip":0,"op":55,"st":0,"refId":"37"},{"ind":35,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":55,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":55,"st":0},{"ind":45,"ty":0,"parent":41,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"43"},{"ind":41,"ty":3,"parent":40,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.474,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.474,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":50,"ty":0,"parent":46,"ks":{},"w":29,"h":29,"ip":0,"op":55,"st":0,"refId":"48"},{"ind":46,"ty":3,"parent":40,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":55,"st":0},{"ind":40,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":55,"st":0},{"ind":55,"ty":0,"parent":51,"ks":{},"w":129,"h":127,"ip":0,"op":55,"st":0,"refId":"53"},{"ind":51,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":55,"st":0},{"ind":28,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":1,"k":[{"t":0,"s":[108.343,99.459],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[108.343,139.459],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[108.343,139.459],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":48,"s":[60,60],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[60,60],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{},"ip":0,"op":55,"st":0},{"ind":1,"ty":3,"ks":{},"ip":0,"op":55,"st":0}],"meta":{"g":"https://jitter.video"},"op":54,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/link.json
================================================
{"assets":[{"h":346,"id":"0","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdEAAAFaCAYAAABBtGeAAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnU1y5DYSRlkrLfsCWkyoL+ATqO2J8DW88znsOUfvfA1HyG2dwBcYhRa6QC9nVWOoi22qmlUESADML/MpYmI6LBA/LxP4mAkQOgz8QAACEIAABCCwisBh1VM8BAEIQAACEIDAgIjiBBCAAAQgAIGVBBDRleB4DAIQgAAEIICI4gMQgAAEIACBlQQQ0ZXgeAwCEIAABCCAiOIDEIAABCAAgZUEENGV4HgMAhCAAAQggIjiAxCAAAQgAIGVBBDRleB4DAIQgAAEIICI4gMQaEjgeDx+P6l++u8PBc3+OVP20/jfDofD138X1ElRCECgAgFEtAJEqohJYCKQSRzPRXEqmD0BJUEdRfcTAtsTPW1FJICIRrQ6Y84mcEEo9xLI7H5fiFy/RrSHw+HXLZXxLAQg8IUAIoonhCYwk24dI0pFoVxjy/+8LgSI6hp2PAMBRBQf8E/gSto1ilCWGPlVVIdhIBVcQo2yYQkQiYY1va+BO0q7WjMMkao1i9AfUwQQUVPmoDPXCCCUu/sHgrq7CeiANQKIqDWLBO4P+5NSxkdQpcxFZ1sRQERbkaXeWQLsT7p0DATVpVkZVA4BRDSHEmWKCJB2LcLlrfB/OOnrzaSM5xoBRBT/WEUAoVyFLdJDRKeRrB14rIhoYONfGzr7kzhGRQJEpxVhUpUtAoioLXt07Q37k11x09gwIKZ4gTsCiKg7k74dEELp3MCaw0NMNe1Gr2cIIKKO3OIkmNPL0LmRx5F9HQ4FMXVo1GhDQkSFLX4mmgimsC2Ddx0xDe4AysNHRIWsdxLNX05dRjSFbEdXswggplmYKGSJACJqyRpnfUE0DRuHrrUkgJi2pEvdVQkgolVxbq9sIpxEmttxUoMugfTHxZOYpv/nBwJmCSCiBkyDcBowAl2wSoCo1Kpl6NcrAUR0J0cgVbsTeJpVJYCYqlrOeb8R0Y4G5jRtR9g05ZEAQurRquJjQkQ7GJB0bQfINBGJAGIaydrGx4qINjQQ4tkQLlVHJ/DpcDj8EB0C49+fACLawAaIZwOoVAmBeQJEpXjGrgQQ0Yr4Ec+KMKkKAvkEENJ8VpSsTAARrQD0eDz+OgzDeJNQhRqpAgIQKCRAercQGMXrEEBEN3BEPDfA41EItCFAVNqGK7VeIICIrnAN0rYroPEIBPoRQEj7sQ7fEiJa4AKIZwEsikJgXwKkd/flH6Z1RDTT1Mfj8Y9hGLjPNpMXxSBghMAP3L9rxBJOu4GILhiWfU+nns+wIhEgvRvJ2p3HioheAE7qtrMn0hwE2hJASNvyDVs7IjpjelK3YecDA/dNACH1bd9dRoeITrCfos+098kPBCDgkwBC6tOuu40KET2hZ+9zNx+kYQj0JsDJ3d7EHbcXXkTZ+3Ts3TsO7X//+99fY/MvLy+f07+fnp7ejf/t+fn5u5Lu/etf//pa393d3Wt96ef29vbdzc1NUV0l7Toui5A6Nm7PoYUWUaLPnq7mr61RKJNIbhHIWmSS0E4F9v379x9q1e20HoTUqWF7DiusiHJ4qKeb6bY1J5SlUeTeo//3v//9Z+oDojprCYR0bwcVbz+ciHJ4SNxjK3f/PO06RpRqQlmCBVH9hhZCWuJAlH1DIJSIkr6N6f0RhTLX0mMKmCh1QEhznYZyMUUUAfXt+db2JxVpI6gIqaLf7t3nEJEo+597u1md9j3sT9Yh0b6WwClfItL27uWqBdciyucrWr5K2tWmvZKgBkv3IqQ2XdFkr9yKKAeITPrbgFDatEtOr5KYBvoulZuNcpyCMoNLEWX/c1/PZn9yX/6tWw+U6kVIWzuTg/rdiSgC2scr2Z/sw9lyK0HSvAipZSc00DdXIoqA1vMo0q71WHqvKYCY8oe9vTvxhvG5EVFO4JZ7AUJZzownLhNwLqYIKc4/S8CFiCKgy96dBHN6x6vnG3mWaVCiJQGnYsqJ3ZZOI1y3vIiSwp33viSaj4+Pr79EMIVnqGjXEVJRw9HtYgLSIoqA/mNvRLPY93mgAwGHYspBow5+o9SErIgioMPrN5cp2iTSVJpyMfvqTEzZH43pxn72RCMLKMLJ7FUl4ElID4eDbACi6j9W+y3nCBEFFOG0On3oVykBR0LKQaNS4zstLyWi0QQU8XQ66xjW4ERM2R/Fl3Wu/YskoP/973//fHh4+IB/QsAzASdCyv6oZyfNGJtEJBpBQIk6M7yVIu4IpL9h+uOPP34nPDDSusLGq9F18yLq/a+xIJ413Jg6lAk4ENL/TPgnUf2kbA/6XkZAQUSPZUPSKU3aVsdW9LQ9gZ9++umvm5sb5aj0HFIS0z8R2Pa+s2cLpkXU63V+iOeeLk/blgk42SddQjxGqklgiVyXaBn/vVkR9bgPSurW+GygeyYIBBHSS1EromrCC/M7YVJEvQko4pnvkJSEQCIQVEinxh/3WRFV41PCnIh6O0hE6tb4DKB7ZgkgpG9M8yqqf1+U9KtZgwXtmEURdXGQiOgz6Ixi2FUJIKSzOBHUql62rTJTIuoljZsE9LfffvN0ynCbl/E0BDYQQEivwkNQN/hWjUfNiKgXASV9W8MtqQMCbwkgpFkekQSVPdQsVPUKmRBRDwJK+raeU1ITBOYIIKTZfvH6fSr7p9m8NhW0IqLS+6BEn5t8kIchkE3A4YUM2WNfWZBL8leCy31sdxFVj0IR0FxXoxwE6hBASFdxRExXYVt+aFcRVRfQ33///a/n52cOEC37GSUgUI2Ag7t2q7FYUREHkVZAu/bI3iIqm8ZFQCt7ItVBoIAAQloAa74oYroZ4ZcKdhNR1SiUz1cqeR7VQGAjAQ4abQT45XEOIW3EuIuIIqAbrcbjEIDAKwGEtJojIKYrUe4lonJpXA4QrfQwHoNAYwIcNKoKmANIhTi7i6hiFIqAFnoVxSHQkQD7o01gI6aZWLuKqOLl8ghopidRDAI7EiCt2ww+YrqAtreI/vH3Rvb3zcxduWIOEVUGSnUQaEiAtG4zuAjpFbTdRFQtjYuANpuQVAyBZgR+/vnnZnVT8YCYzjhBTxGVOUyEgLJcQECTAPujXeyGmE4wdxFRpSgUAe0yCWkEAs0IkNZthnZaMUJ6otFLRGWi0I8fP3bxQBqBAATaECAabcN1ptb0Z9d+6Naa0Yaai6hSFMpJXKNe6qBbaWFPw7i7u/t8e3v7bjqkm5ub2fuXU1ZkLPfy8vI5/fvp6ekd9zUvOwSndZcZVSwROirtIaISUSgCWnFKBaxqFMlzobwkkDUQJZ9FWC+TJK1bw8uy6wgrpE1FVCUKRUCzJ0rogtNoMoEYI8qWQlkCPPkxkeo/xEjrlnhPtbI/HA6HdIVgmJ/WImo+CuUgURhfzxropbSrFaHMGsQwDLwYfiFFNJrrMVXLhYpKm4moShTKQaKqk0eisjmhVBPJXNDRxZRoNNdTqpcLI6QtRdR8FBp9gak+bYxUuMf+pJGhX+zGuH/68PDwwXpfa/ePaLQ20ez6Ulo3ianr9G4TEVWIQhHQ7IlgsqD1/UmT0IKmeYlGd/dG1/ukrUTUfBRKGnf3ibXYAS/7k4sD3aFAtJdIotEdnOxtk27Tu9VFlCh0d2eV6kCk/UlrhkmH6h4fH4cI350SjZrwPpdC2kJETUeh0d7A95467E/ubYHl9qPMCaLRZV/oUMKdkFYVUYUolDRu/WnC/mR9pr1rjPCpF9Fob6+62J4rIQ0lolHeuFtMFfYnW1C1V+fvv//+l+f0broOcHrt4nid4pIlcq9qXKqH338l4Obe3doiajaVi4DmTd8kltP7Xb1+P5lHI2Yp5kq+3cf5Mj6RxJY5k83PxScw1UTUeiqXNO63jj1Gl/f396+/ZPJnT373BRHS7SaevpAyty7ylI9Ia4ooUej2ede8hjSxEc3mmF00gJDWNSOi6lNIq4goUWjdydaitlE8eSNuQddvnQhpO9um/dlU+/v378PdIjVDVTYidS+ikRcBhLPdAhip5shzqJedxyg1uKBKCmktETWbyo24F4p49lr64rTj/dSuJUsGj1DlhHSziFpO5UZ7g0Y8LS2FPvqSvh9NI0mfgkS8vH5vKwYVVKnvSGuI6B/DMHy/t7PNtR8pCk2TLXgqyKILmu/TKJKjUKY/6p3+7flbUfNGmelgQDGVEdIaImoylRslCiX6VFwS+/Z5Gk2OIolQ9rVBzdYCvTBLCOkmEbWayo1whVmalIEmU801yGVdc0JJNOnS1F8HFWT+mxdSlyIaIQoNMoF8r4KFo0MoC4EFKR5gLTAtpFtF1GQq1/teKH+NwufqyP6kT7v2GpVzMTX7h71Xi6jVVK7nKJS/QtFrOWrbDhFlW76Ra3cspGY/fXEnol6jUARUc2kcBTPKH7/WtJK/XjsVU5NCukVEzaVyvUahCKjOIpdEM31TmU7BcrBHx25ee+pQTM3tj64S0ePxmL4LTd+HmvrxKKIIqCkXm+1MEk4iTft2itpDh0Jqan90rYj+OgzDL9ac0lsqFwG15mH/9AfhtGsbejZPwJmYmhHStSJKKrfDTP355587tEITuQQQzlxSlLNKwJGQmtkfdSOi3qJQPmOxsQwhnDbsQC/qEXB0y5mJ/dFiEbW4H+rthiJHb4v1Zn7nmhDPzsBprjsBJ+vM7mndNSJqbj/U04EiJ47dfUGo1SDiWYsk9SgQ8LDeHA6HYh2raZvixi1esuDpbx2yD1rTvfPrQjzzWVHSFwEHBxh33R9dI6LmDhV52Q9lH7T/4oR49mdOi/YIONgn3S2tKy+iXlK5HtIq9paGyz1CPJWsRV97ERB+kd8tGi0SUYupXC8iShq3zzKBePbhTCu6BIRf6Hc5rSsvoh5SucJOK7VSeHnhkoJOZyUJCK9J3dO6pSKarvpLV/6Z+PGwKDrY1DfhC9c6QfRp3kR00CABUSHtntYtFVFTh4o8iKiooxqc8vNd8nRyWwY6HXVDQHR96prWlRZR9QVS1EElFghvF3BIQKeTLgmIrlPd0rrZImrxUJH6fqioc5pfKDxkKMxDpoOhCAiuVd3SuojojlOBE7l14bP3WZcntUFgSkBQSLtEo7Iiqh5tCDqk6RWF9K1p89A5JwTE1q0u0WiJiHIyt+JEIAqtB1P9haoeCWqCQHsCYhcyNI9GZUVU+VCR2Ntc+1m5oQVlP9gwbB6FwK4EhIS0eTRaIqKmPm9RPlSEiNaZ/whoHY7UAoFSAmLftzeNRiVFVH3/i1Ru6ZR9W17d/ttGz9MQsEFAKRho+efSENHO/qjkeJ3RZDWHgGZhohAEuhAQWs+aXcCQJaLH4zFd9ZcOFpn4UT5IIuR0Jmw97YSy3c3BpEMQqERAZX+0VTSKiFZypNxqVBwudzy9yiGgvUjTDgTKCYhsUTWJRnNF9NdhGH4pR9vmCeUFVcTZ2hhuZa3K9l45ZB6DgBQBlYNGLaJRSRFVPZWp4miWZi8Caska9AUClwmIbFVVj0YR0Y6zQsTJOhK53hQCasYUdAQCWQQUtqtqR6O5ImrqtiLVb0QR0ax5+FqIU7j5rCgJASsERLJtVb8bRUQ7ep/CW1pHHBebQkAtWIE+QGAdAYFgoeotRojoOj9Z9RQiuowNAV1mRAkIWCcgsNZVi0blRFR5keVk7vLUVz00tjwySigQSOnIu7u7z6mvT09P79L/Pz8/f6fQd0t9FEjrVotGEdGOnoeIXofNQaKOzkhTswSW5mh6iU8Pvry8fE4ii8BediTr0WitA0aIaKfFRODNrBOJ+WYQ0F3x0/iJwJKIzoFKvpv++8PDwwdAviWwhmdHhlVSuohoJ4shopdBI6CdnJBmFglsXfRTpJqiVET1C2rjh4yqpHQR0cVpVacAIjrPUXmPu45nUIsVArXnKBHqF8tufTFp7B+bo1FEtLGFxuprT9BO3W7ejOo3v83B0EB3Aq2ipuhi2oprJQfZHI0iopUssVQNIvotIdK4S16j8/vk36m3ygdteiz2UX3e8iGjrQeMENFO6xQi+hZ01MWkk7s1aWYUyvQJyO3t7evnH+nn5ubm6ycgynbtIaIjM2VOa5zL+Pq3KaWLiK7xiJXPGN8bWDmqdY+Rxl3HrfVTc0I5Fcml9pXt2jtaiiakvfku+erk95tSuohoAemtRRHRLwSjLR5b/abm86NIpjqnEWWJUF7qj7pd95if6WDd4+OjdBo81z8tR6NbUrpyIpoMpvq2u8ckzXXwXuXUF9penLa001Ior/VL3bZ7zk91drn+ajgaXZ3SRURzrV+hnGEHqjC6vCpUX4DyRtevVM7+ZL/efGlJ2bY990O9RvI5/mY4Gl2d0kVEcyxfqUx0EY3ytl3JXYat+5O1+pFTj7ptLYjoyFmd5ZK/7BnxX+lbLBFVvaTc8FvYkt9v/j2XKlxHOArm/f39a8Eae5SbjVZQgfrCb+0FV3WNy3EZa6wnfV6V0s2NRH8dhuGXHEA9yqg6WGQRVV9ka/t18gVVwTxn4cG2FqMj1XVuaa4YXgcR0SXjWfi9xcnamouHRbYWo1E81SLNa+P3YF+r89KrkBqNRleldHMj0e+HYfij1kKytR7lSWvUebaa5OrzygdOaoDxKJye9u8s7YfO+ZtHIbUaja751AURrbFKFtRhfcIWDCWrqPILT9YArxSKYGsPL0gKdvIopEaj/+KUrqSIKh9SsfoGtlUwLj3vYZEtZeM58pyy8PKCZHQx/8btvAmp0axccUo3S0STNY/H47F0MWlVXllEExOVSbvVfl4W2VwOUcRz5OHhBUnppVZ93TufR0bZxxDRZAzlCWz0DSxXK7LLKdsoe5CnglFs6mkvNI1FIZXrMfofx2QxoCjdF5WMRJMBlFMbERbcKFGo0bfp0neAovKebKs4F5XXvnNHM8q/aF+0RETT6dx0StfEj7IjRVh4I0ShalFMrYnrybYWI6EcO3mxgdG18D+HwyHdjZD1Iyui6m/DRt/AspxmqZC6bZbGp5gGzBlTThlPtlV+CfKyP2pURIv2RUtE1NStRepOZNR5ctbRxTJe3pLnBhrt8JDn/ThlEVXf0pr6lcGAopmImrpwIRlBfbE26DyLArlUwFOkcj5Wzy8+S3ZVf2mdG59qKnc6FvU10GpWp+RwUUkkak5ElfdFk/N4XJS9iqhHWy0J5/h7jwKqHoV6so3RuZV9uChbRJPRLH0r6iWd4S0a9fBmTAT6DwGPAppG5yEKHa2kHkwYtUczETV1QtfDBPfyRpwmgsco1Ohbcm4Qubmcx5ciT3MuGdjDOmgwmMjeFy2NRBHRzcvStxV4eSv28EY8tU50AfVmz9G23kTUw/kQgzZpJqKmTuh6SekadKDiVwUPb8Png/byclNsTPHLTJbG69Gu6i88Fl9Ycw8XlUaiHC5amqErf28wnVE0Em+pXA8vNkUGPBVOL0OPj4/D8/Pzd2uet/6MV7t6eIk1+HKTtS9aJKIWDxd5cJ7E1eKbWMmC6GnvzOtCu2RPby9Cc+M1uFAvmSX79+rRqEHbNBNRU/uiHvYD1PdqvLzIeHiZyV5xzwpGEFDvL0fq89BgNi7r+r81kag5EVV/A5uuZwYdaXFd9rQAG3wbXuS/pYD39O2UTQTbKq+FBl9ysg4XrRFRc/ui6m9g6gdalCfulL3BSbxFHxef9TZvrg04im2VX2gNbmm1EVGL+6KeUrqKKUUP+6FRFtnkX5GiT/WtksU3obMCyi9G0USUlG6pdxeWV1nUld98o6X6IopnsrHKXCpcIi4WV36ptZZyz/nMpTide4pEzYmo8hvYpdmgMPk9iKgC560LrAc7rWUQwb5TNsrbK9bOhLQUUXP7ot5SuippKOW33pGxtbfftWJx/lzUyDPyPncaOyJaawa91rP4mcvaSNSkiCo7j+KhCA/Rv7coJdnk5eXl89PT0zuvFyaULJFeX5CuMVCel9Yi0WYiSkq3ZBrXKWtxsfeQIvSwyKZFM3mZ55uG1swii3NmzThKn1EWUYM2axOJWhVR9VTG0mSx5mDqImqN55L9x98TbeaR8vCClDfSb0upZuUMzsmmImoypav8FpYzYSw5mepEVdkLHSPMMT2b+k2KNmeWxDuRe05FdW4a/MylnYieotFjnkv3LaXqQLmUrAip8qEiC5N1FMlkd4Qy1/uXy1mZH8s9bVdCNUtkYV6eWaW5iJr71CUB8B6NpjEmZ7u/vx9ubm52+Wsb6ox7LbRz0SQRZTvxSDVHTuNOU/6//fbbLmvDFusaFNHF+3NXnc4dIR2PR5Mp3dQ/5SipxAl7icF5n1TfdFukckm7lnhs27J7zYe2oyqvXfUlN5yIWk7pqi/yJdNmj4VDme8aXghliUfuU3aNXffpaftWEdFqjNtGoicRJaVbzV7bKuq5iCjvO89xYn9ym+9ZeJo07j9WQESreWQXETWb0lWOlra4QA8xVRfRdBnByJgTr1u8zcazPXzexkjze6G4pRUynWs5Go20Nzo3tVouLIoTNH/5oaQSgZZ+rsThvK+qc9RYRqF9JGpdRKNGo9MJ1WKRUZ2gyosifZ8nYGzRNWEm1XRugmfMnot/U3TT6dzRWyyf0k19VE491pyRSUxvb2/fbf0sRnmC1uRJXfsTMHjX6v5QxD/zCymi1qNRFv1v53US1PRf379//6F01sOzlBjlWxBokWFp0c896lSeo8ZEtE869ySivw7D8MseDpPTJtHoZUppM//u7u5zbpRKijzH4yjTkgACep2uqoiGPVg0SeuavAYw9U/VqVouREt1J4dOZZLAnpd9eHgojmCX2uP3EMghgIAuU1Jd7xDR49HkN6OjyxFBLU8+SkDAMgGDi6xJXKprnUH79kvnnlK6Zr8ZHT2dtK7JOU+nIJBFwNh+WVaf9yikKqIGswxtL6Cfc46j8WhUNc2xx0SkTQhYIsBJ3HxrqAYLiOjfJ4usf+6S3FD1LS1/ClESAr4IIKBl9kREy3hdKd0/Ej2ldU3vjaY+qjpZNdegIgiIEEBAyw2lehkKkejJ1grRKGnd8onJExDoTQABLSeuvLZZE9HD4bB4IdFigXITfnnC+t4oad21luU5CPQhgICu46y8XWXN5nuLqPmTuqR1101SnoJAawLWFtPW461Zv7KIWjt9vauInqJRs5cvTJ2W/dGaU5i6ILCNAAK6jZ/qfmgaNSJ6Zvvj8Wj6KsCxu8p7CNumG09DwA6B9KH9/f39sPUPJNgZUf+eKEehBi9aWPwLLsnCzfZER/dR2BtNfUVI+094WoTASMDgAippHGURtXaoaBgGMyIqsTeaZoyyA0rOeDoNgWEYDC6esnZRTuUa9IPFK/+6RKKnvVHz342OswYhlV0/6LggAYMLpyDFL11WX7sM7oWbElGZaDQ5IweNZNcROi5EwOCiKUTv266qi6i1Q0XDMCzeVtQtElWLRhFS6bWEzhsnwAGiNgZSTuUmItZENOfzlt4iKhWNIqRtJjq1xiZA+raN/dWjUIt+YU5ET9GoxCcvUzcntdtm0lNrLAJEn23trR6FGhTRrJO5XSPR0YVUPnlBSNtOemqPQ8DgAukKvnoUmoxhcH8861DRXiIql9YltetqzWEwnQgQffYBrR6FWtwP/fsOBbsiekrrynzyQkTaZyGgFV8EiD772NNDFGrUV7JO5u4SiZ5EVDIaJSLtszDQii4Bos++tvMQhVoU0dxDRbuJ6ElI5Q4ZjdPDw9tf36lOa94JIJ79LexlHbL2acurMGb8HdHR4s3vzr3mWoqHjBDS/osFLdolgHjuYxsvAqq+H7prJKqe1k399+TI+ywFtKpKAPHc13Ie0riJoMVUbsmhot1F1IOQ8tdf9l1MaL0vAcSzL++51jy9vBsV0exDRSZE9CSkkqd1pw7OpQz7Ly70oB0BxLMd25KaPQmo0VRu0X6oGRE9CemxxJkslvXm4BYZ06e+BBDPvryvteZtfTEahWZ/HzraateDRVOHOR6Psp+9TMfhzdHtLCH0pBcBhLMX6fx2PG4bWTyVW7ofaioSPUWjsp+9nE8HxDR/gaDk/gRG4Uw9ubm5+W7/HtGDKQEvB4nGMSV/+/HHHy36WdF+qDkRPQmp/P7o6CgIKQuhZQIIp2Xr/NM3j+ctjKZyi/dDrYqoi7QuKV6NBSpSL5NopvHe398TbYoY3qOAJvReUrkmRfQUjSKkIpOcbtolkETz7u7u8+3t7TvStHbtdKlnXgXUahS6Zj/UrIiehNTN/ihRqd4CptTjMcIcBZM9TSXrfdvXdIjo8fFxeH5+trhnuBmuVREtuepvCsHM6dw5yxyPR5dCmsbKfunmuRiqgnOhHAePYPpyA4+ncKcWMnygaNV+qOlIdATvWUjThHl5efn88PDwwddSwGjWEJgTSkRyDUnNZyK8WFuNQtemciVE9JTadXNid256p8mT/jtiqrn45fZ6FMlUnr3KXGoxykUQ0GRJoweKUteKP20ZPdN0Onc6fY5/h6TepxNiqm9h0q76Nuw5Au/p2ylLw1Hop8Ph8MNauyuJqLsTu9eMFuXNdK3j7vkcQrknfT9tez19e8lChqPQ4qv+pmOUEdFTWtftQaNLjoeY7rdo8onIfuw9txwp+hztaDgKXX2gSC6dO3bY80GjpciUfdO+S6vlid+XBK3VIOD905VrjLxGoWnMUpFodCEdx8/eaY0lLa+On3766S9OyOaxotQ8gcjimYgYfxndlMqVFdGoqd25KYqgtl+6EdL2jL21wOdrXyxq+bvQVwE8HDYHkpsr2NP5o6Z2LzEfJ+7T09M7r7ed7OVvCOle5LXajR51nlvLexQqHYmS2l1eXBDVZUYlJRDSEloxyjLHLtvZuICmjm9O5boQUVK7ZYvVOOnTU0SsZewE9nfKB8QT2QTS3EmF07226Ydsz3V0hg8TvXa8RirXjYgipNnrwMWC4wKRCqSrCM8LJsGdezjdvDNX1vMCI/CGvd0hAtZwPgdGn/fsy63MLDBHqkQk57UpAAAKUklEQVShrkQUIW01HcrrjfAdnMAiUW64AE+MQpleFKcvhghlXeNHiULdiShCWncibKktwm0s1k8ebrGf8rNzQolI9rOowAtmtSjUpYiehDRdEfjLMAzp//nZgUCEaHTEKrBo7OABbZtEKNvyXVu7wlyotRc6MpL+xGXJ0HwCs0So7e8jRKMjwRSV3t/fD1zMUMen2J+sw7FnLSKZmapRqNtIdOo4CGnPafS2rUjRKFFpuZ+xP1nOzPITIp+AIaJrnAghXUOtzjORotEpMYW0Vh0LX68FoexBef82RPy9uoCGiERH90JI95loEaPRaGLK/uQ+c8tKqyICmnAholud5ng8cuBoK8QVz0eNRs/F9Pb29p3inin7kyucPtAj1j9nOZmiiYCGikTZJ91vVkePRs/Jpzd3a4JK2nW/+aHccvQoNKyIpoGT3u07dfnj4vO8ewoqQtnX5723JiSg1a74m7Op609ccpwYMc2hVKfMx48f61TkuJa0MI3DK41WSbs6dgxjQ1MS0FZ7oaNJwosoUWm/2Uladzvr9C3etBZu4tnOlBrKCCCgb3khoiceHDoqm0hrS3PIaC05noPA/gRELlSYgmp2oIhI9II/kt5tO1GJRtvypXYItCKAgM6TJRKd4YKQtpqGX+rlkFFbvtQOgRYERG4k+jr02nfkXmKKiF7xNsS0xVT8Uidp3XZsqRkCtQmoCWjrw0RTvohohrchphmQCouQ1i0ERnEI7ERAUEA/HQ6HH3rhQkQzSZ+E9AN/Xi0TWEYxhDQDEkUgsCMBQQFNtJofJiIS3eCURKUb4M08Slq3Lk9qg0AtAghoHkki0TxO35RCTFeCQ0jrgaMmCDQgoPy3cXsdJiISreh4iOl2mKR1tzOkBgjUICD4Gct02F3TuGPDRKIVPO8kpKmmXypUF7IKhDSk2Rm0IQLiAtr1MBGRaEPHJTJdD5fvR9ez40kIbCEgdpXf3FB/OBwOn7YwWPsskehacgvPIabrwCKk67jxFATWEnAgoLukcUnnrvW4wucQ00JgXMRQDownILCSgOgJ3OlodxXQ1BEi0ZXOV/oY+6ZlxPj0pYwXpSFQQkB8//PrUPc4jXvOGREt8bxKZYlO80AipHmcKAWBEgIO0rfjcHePQolESzyvQdnTn1/7nlO9l+EipA0cjyrDEkBA65ueSLQ+01U1ku69jO3jx4+rmPIQBCDwhYCX9O3Jnrt9zjLnT4iowVmGoL41Ct+QGnRSuiRDwMHhoTesLeyDTjuEiBqfCpOUb+jL75OQPj4+Ds/Pz98ZNxndg4AJAo5St1OeJvZBEVETLr6uE9FFlT3SdX7DU3EIKN99u2AlcwKa+kskKj63JqKaRhLi2kEuZBB3WrrfjIDT6DPxMimgiGgzV9634jNhdZkGRkj39TFat0XAsXgm0KYOEp1bnkjU1lxo2puTuKY20mc16UdaYBHSpu5C5QIEnIuneQElEhWYJK27eBLWP1q306p+hLQVWeq1TMDxvuc59t0uls+1P5FoLinH5dRvUOITGMfOydDeEAgknmnc5gWUSJQJ+pXA8XhM0eiY5pUkQ1QqaTY6vUAgmHCONMweJDo3F5EoU/iVgHpadzQjQopDeyEQVDyT+WQElEjUy2yrNA71tC5CWskRqGY3AoGFUy4CHTtMJLrbdLHZsIe0LmJq07fo1TyBUTjTb29ubiLfyCUVgSKizOiLBBBSnAMC7Qgk0Uy139/fRxfNKWRJASWd226eSNfsZX90agT2SqVdUr7zRJtXTSgroIio/NRsNwCPQpo+hXl5efn88PCQLpngBwLVCYxR5t3d3efb29t3wdOzOXylBRQRzTFx4DJeDhqdm5CoNLBTVxr6uViyn7kKrLyAIqKr7B7rIU/7o4hpLN/dOlqEcitBvync6cg4ndvUT3xU7llIk4WITH34aekoRpFMz43pVyLKUoqryruIQMeRI6KrfCDWQx73R+csiJj68+tpNJlGl/YpEcpd7exKQEnn7upLWo1HEVIiUy2/TL2dS7silCbtKHEXbik5ItFSYoHLRxLSUUyfnp7ePT8/R/4A3oTHsz9pwgxrO/HpdJVf+n93P4ioO5O2HZDXE7vXqPFpTFufmkaT6d/sT7bn3bEF039QuwYHRLQGxWB1RBTS0cRp3zT9m29Ny52e/clyZuJPuNv/nLMHIirupXt1P7KQTgWVdO9bD2R/cq8Zaa5dl/ufiKg5P9PuEEL6j/0iRajsT2rP28a9d73/iYg29p6I1SOk81ZXFlW+n4w4k6uMOUT69pwU6dwqvhO7EoR02f7j4SQr+6nsTy7bjBJFBEIKaCKEiBb5CYUvEUBIy31jKqzp6bS/mv6/xic1l6LJVD+XopfbiicuEgiXviUSZTY0I4CQNkM7JMG9VDui2I47NV8lEDb6nFIhEmWWVCUQ7UKGqvCoDAIaBMJHn4iohqPK9hIhlTUdHYfAEgGizzNCRKJLLsPvVxPw/tdfVoPhQQjoESD6vGAzRFTPmaV6jJBKmYvOQmCOANHnFb9ARJk0zQlw4Kg5YhqAQAsCRJ8ZVBHRDEgU2U4AId3OkBog0IkA4lkAGhEtgEXRbQQ4cLSNH09DoDEBxHMFYER0BTQe2UaAqHQbP56GQGUCiOcGoIjoBng8up4AQrqeHU9CoCKBMH9tpSKzN1Uhoq3IUu8iAYR0EREFINCKACduK5FFRCuBpJr1BBDT9ex4EgKFBBDPQmBLxRHRJUL8vgsBhLQLZhqJSYA9z4Z2R0QbwqXqcgKIaTkznoDABQKIZwfXQEQ7QKaJMgIIaRkvSkNgQgDh7OwOiGhn4DSXTwAxzWdFyfAEEM+dXAAR3Qk8zeYRQEjzOFEqJAGE04DZEVEDRqALywQQ02VGlAhBAOE0ZmZE1JhB6M51AogpHhKMQBLN9JM+TRn/HQyB7eEiorbtQ+9mCJyENP3mFwBBwCGB12gzjQvhtG9dRNS+jejhBQJEpbiGAwJjdPnnMAyfEE09iyKiejajx2cEEFNcQoTA19QsUaaIxTK6iYhmQKKIBgHEVMNOAXr5JrpEMH1bHBH1bd+QozuJ6Ye/02PfhwTAoHsQ+EYoEcse2O21gYjaswk9qkSAA0iVQMathogyru2zR46IZqOioDIBUr3K1mvad4SyKV7/lSOi/m3MCCcESPWGc4fpt5WvJ2BJu4bzgaYDRkSb4qVyqwSOx2PaL03/41tTq0bK7xf7k/msKFmZACJaGSjV6RFg71TCZqRdJcwUr5OIaDybM+IrBBDUXd0DodwVP42vIYCIrqHGMyEITASVz2XqWJz9yTocqcUQAUTUkDHoim0CRKlZ9mF/MgsThbwQQES9WJJxdCUwOZiU2o12OAmh7OptNGaZACJq2Tr0TYqAM2Flf1LK++jsXgQQ0b3I024IAmfCmsZsZX+V/ckQHsggWxNARFsTpn4IXCEwI7Kj0F566vw+4Et/qDldLDD+fC3Dn9rCHSFQlwAiWpcntUEAAhCAQCACiGggYzNUCEAAAhCoS+D/OHkbw/8AM3sAAAAASUVORK5CYII=","u":"","w":465,"e":1},{"h":112,"id":"1","p":"data:image/png;base64,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","u":"","w":99,"e":1},{"id":"19","layers":[{"ind":18,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16.5,15]},"r":{"a":0,"k":0},"s":{"a":0,"k":[33,30]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],"o":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],"v":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],"o":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],"v":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"24","layers":[{"ind":23,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[13.5,11.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[27,23]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],"o":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],"v":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],"o":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],"v":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{"ty":"fl","c":{"a":0,"k":[0.49,0.79,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"34","layers":[{"ind":33,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],"v":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"39","layers":[{"ind":38,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"44","layers":[{"ind":43,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"49","layers":[{"ind":48,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"54","layers":[{"ind":53,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"59","layers":[{"ind":58,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[5.5,3]},"r":{"a":0,"k":0},"s":{"a":0,"k":[11,6]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],"o":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"62","layers":[{"ind":36,"ty":0,"parent":32,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"34"},{"ind":32,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[17.594,5.138]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":41,"ty":0,"parent":37,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"39"},{"ind":37,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.134,17.416]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":46,"ty":0,"parent":42,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"44"},{"ind":42,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.225,5.047]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":51,"ty":0,"parent":47,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"49"},{"ind":47,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[20.992,21.292]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":56,"ty":0,"parent":52,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"54"},{"ind":52,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[14.69,20.761]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":61,"ty":0,"parent":57,"ks":{},"w":11,"h":6,"ip":0,"op":120.4,"st":0,"refId":"59"},{"ind":57,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[5.5,3]},"p":{"a":0,"k":[17.282,14.474]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":31,"ty":3,"ks":{"p":{"a":0,"k":[2.572,2.572]}},"ip":0,"op":120.4,"st":0}]},{"id":"72","layers":[{"ind":71,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"77","layers":[{"ind":76,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"83","layers":[{"ind":82,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"88","layers":[{"ind":87,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"93","layers":[{"ind":92,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":6,"ty":2,"parent":5,"ks":{"s":{"a":0,"k":[9.25,9.25]}},"ip":0,"op":120.4,"st":0,"refId":"0"},{"ind":5,"ty":3,"parent":4,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":4,"ty":3,"parent":3,"ks":{"a":{"a":0,"k":[21.5,16]},"p":{"a":1,"k":[{"t":0,"s":[159.5,56],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":10.44,"s":[159.5,56],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":62.94,"s":[106.5,92],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[106.5,92],"h":1}]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":10.44,"s":[0],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":62.94,"s":[11],"h":1},{"t":119.4,"s":[11],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":10.44,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":62.94,"s":[360,360],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[360,360],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":11,"ty":4,"parent":10,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[4.375,4.375]},"s":{"a":0,"k":[8.75,8.75]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":10,"ty":3,"parent":9,"ks":{"p":{"a":0,"k":[8.422,7.292]}},"ip":0,"op":120.4,"st":0},{"ind":13,"ty":2,"parent":12,"ks":{"s":{"a":0,"k":[33.33,33.04]}},"ip":0,"op":120.4,"st":0,"refId":"1"},{"ind":12,"ty":3,"parent":9,"ks":{"a":{"a":0,"k":[16.5,18.5]},"p":{"a":0,"k":[12.538,14.893]},"r":{"a":0,"k":12.68}},"ip":0,"op":120.4,"st":0},{"ind":9,"ty":3,"parent":8,"ks":{"a":{"a":0,"k":[13.037,14.939]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":0,"k":-12.68}},"ip":0,"op":120.4,"st":0},{"ind":8,"ty":3,"parent":7,"ks":{"a":{"a":0,"k":[15.997,17.436]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":7,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[87,28]}},"ip":0,"op":120.4,"st":0},{"ind":21,"ty":0,"parent":17,"ks":{},"w":33,"h":30,"ip":0,"op":120.4,"st":0,"refId":"19"},{"ind":17,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[16.5,15]},"p":{"a":0,"k":[15.953,14.392]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":26,"ty":0,"parent":22,"ks":{},"w":27,"h":23,"ip":0,"op":120.4,"st":0,"refId":"24"},{"ind":22,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[13.5,11.5]},"p":{"a":0,"k":[15.873,14.886]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":16,"ty":3,"parent":15,"ks":{"a":{"a":0,"k":[15.3,15.3]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":0,"k":-9.18}},"ip":0,"op":120.4,"st":0},{"ind":15,"ty":3,"parent":14,"ks":{"a":{"a":0,"k":[17.544,17.544]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":14,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[7,49]}},"ip":0,"op":120.4,"st":0},{"ind":64,"ty":0,"parent":30,"ks":{"a":{"a":0,"k":[2.286,2.286]},"p":{"a":0,"k":[2.286,2.286]}},"w":27.4286,"h":27.4286,"ip":0,"op":120.4,"st":0,"refId":"62"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[2.286,2.286]}},"ip":0,"op":120.4,"st":0},{"ind":66,"ty":4,"parent":65,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16,16]},"r":{"a":0,"k":6.857},"s":{"a":0,"k":[32,32]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":65,"ty":3,"parent":29,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"a":{"a":0,"k":[16,16]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":0,"k":13.62}},"ip":0,"op":120.4,"st":0},{"ind":28,"ty":3,"parent":27,"ks":{"a":{"a":0,"k":[19.317,19.317]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":27,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[41,10]}},"ip":0,"op":120.4,"st":0},{"ind":74,"ty":0,"parent":70,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"72"},{"ind":70,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[4.974,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":79,"ty":0,"parent":75,"ks":{},"w":28,"h":29,"ip":0,"op":120.4,"st":0,"refId":"77"},{"ind":75,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":69,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":85,"ty":0,"parent":81,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"83"},{"ind":81,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[4.474,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":90,"ty":0,"parent":86,"ks":{},"w":29,"h":29,"ip":0,"op":120.4,"st":0,"refId":"88"},{"ind":86,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":80,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":95,"ty":0,"parent":91,"ks":{},"w":129,"h":127,"ip":0,"op":120.4,"st":0,"refId":"93"},{"ind":91,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":120.4,"st":0},{"ind":68,"ty":3,"parent":67,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":0,"k":[67.649,55.9]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":25.2,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":25.2,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":67,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[32.926,63.56]}},"ip":0,"op":120.4,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":2,"ty":3,"ks":{},"ip":0,"op":120.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":119.4,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/location.json
================================================
{"assets":[{"h":96,"id":"0","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"h":400,"id":"1","p":"data:image/png;base64,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","u":"","w":357,"e":1},{"id":"19","layers":[{"ind":18,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16.5,15]},"r":{"a":0,"k":0},"s":{"a":0,"k":[33,30]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],"o":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],"v":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],"o":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],"v":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"24","layers":[{"ind":23,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[13.5,11.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[27,23]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],"o":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],"v":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],"o":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],"v":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{"ty":"fl","c":{"a":0,"k":[0.49,0.79,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"34","layers":[{"ind":33,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],"v":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"39","layers":[{"ind":38,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"44","layers":[{"ind":43,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"49","layers":[{"ind":48,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"54","layers":[{"ind":53,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"59","layers":[{"ind":58,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[5.5,3]},"r":{"a":0,"k":0},"s":{"a":0,"k":[11,6]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],"o":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"62","layers":[{"ind":36,"ty":0,"parent":32,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"34"},{"ind":32,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[17.594,5.138]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":41,"ty":0,"parent":37,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"39"},{"ind":37,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.134,17.416]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":46,"ty":0,"parent":42,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"44"},{"ind":42,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.225,5.047]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":51,"ty":0,"parent":47,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"49"},{"ind":47,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[20.992,21.292]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":56,"ty":0,"parent":52,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"54"},{"ind":52,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[14.69,20.761]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":61,"ty":0,"parent":57,"ks":{},"w":11,"h":6,"ip":0,"op":120.4,"st":0,"refId":"59"},{"ind":57,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[5.5,3]},"p":{"a":0,"k":[17.282,14.474]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":31,"ty":3,"ks":{"p":{"a":0,"k":[2.572,2.572]}},"ip":0,"op":120.4,"st":0}]},{"id":"72","layers":[{"ind":71,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"77","layers":[{"ind":76,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"83","layers":[{"ind":82,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"88","layers":[{"ind":87,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"93","layers":[{"ind":92,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":7,"ty":2,"parent":6,"ks":{"s":{"a":0,"k":[33.33,33.33]}},"ip":0,"op":120.4,"st":0,"refId":"0"},{"ind":6,"ty":3,"parent":5,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"a":{"a":0,"k":[21.5,16]},"p":{"a":0,"k":[21.5,16]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":4,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[138,40]}},"ip":0,"op":120.4,"st":0},{"ind":11,"ty":4,"parent":10,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[4.375,4.375]},"s":{"a":0,"k":[8.75,8.75]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":10,"ty":3,"parent":9,"ks":{"p":{"a":0,"k":[8.422,7.292]}},"ip":0,"op":120.4,"st":0},{"ind":13,"ty":2,"parent":12,"ks":{"s":{"a":0,"k":[9.24,9.25]}},"ip":0,"op":120.4,"st":0,"refId":"1"},{"ind":12,"ty":3,"parent":9,"ks":{"a":{"a":0,"k":[16.5,18.5]},"p":{"a":0,"k":[12.538,14.893]},"r":{"a":0,"k":12.68}},"ip":0,"op":120.4,"st":0},{"ind":9,"ty":3,"parent":8,"ks":{"a":{"a":0,"k":[13.037,14.939]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":0,"k":-12.68}},"ip":0,"op":120.4,"st":0},{"ind":8,"ty":3,"parent":3,"ks":{"a":{"a":0,"k":[15.997,17.436]},"p":{"a":1,"k":[{"t":0,"s":[102.997,45.436],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":6,"s":[102.997,45.436],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":58.5,"s":[102.997,92.436],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[102.997,92.436],"h":1}]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":6,"s":[0],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":58.5,"s":[11],"h":1},{"t":119.4,"s":[11],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":6,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":58.5,"s":[360,360],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[360,360],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":21,"ty":0,"parent":17,"ks":{},"w":33,"h":30,"ip":0,"op":120.4,"st":0,"refId":"19"},{"ind":17,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[16.5,15]},"p":{"a":0,"k":[15.953,14.392]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":26,"ty":0,"parent":22,"ks":{},"w":27,"h":23,"ip":0,"op":120.4,"st":0,"refId":"24"},{"ind":22,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[13.5,11.5]},"p":{"a":0,"k":[15.873,14.886]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":16,"ty":3,"parent":15,"ks":{"a":{"a":0,"k":[15.3,15.3]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":0,"k":-9.18}},"ip":0,"op":120.4,"st":0},{"ind":15,"ty":3,"parent":14,"ks":{"a":{"a":0,"k":[17.544,17.544]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":14,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[7,49]}},"ip":0,"op":120.4,"st":0},{"ind":64,"ty":0,"parent":30,"ks":{"a":{"a":0,"k":[2.286,2.286]},"p":{"a":0,"k":[2.286,2.286]}},"w":27.4286,"h":27.4286,"ip":0,"op":120.4,"st":0,"refId":"62"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[2.286,2.286]}},"ip":0,"op":120.4,"st":0},{"ind":66,"ty":4,"parent":65,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16,16]},"r":{"a":0,"k":6.857},"s":{"a":0,"k":[32,32]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":65,"ty":3,"parent":29,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"a":{"a":0,"k":[16,16]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":0,"k":13.62}},"ip":0,"op":120.4,"st":0},{"ind":28,"ty":3,"parent":27,"ks":{"a":{"a":0,"k":[19.317,19.317]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":27,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[41,10]}},"ip":0,"op":120.4,"st":0},{"ind":74,"ty":0,"parent":70,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"72"},{"ind":70,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[4.974,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":79,"ty":0,"parent":75,"ks":{},"w":28,"h":29,"ip":0,"op":120.4,"st":0,"refId":"77"},{"ind":75,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":69,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":85,"ty":0,"parent":81,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"83"},{"ind":81,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[4.474,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":90,"ty":0,"parent":86,"ks":{},"w":29,"h":29,"ip":0,"op":120.4,"st":0,"refId":"88"},{"ind":86,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":80,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":95,"ty":0,"parent":91,"ks":{},"w":129,"h":127,"ip":0,"op":120.4,"st":0,"refId":"93"},{"ind":91,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":120.4,"st":0},{"ind":68,"ty":3,"parent":67,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":0,"k":[67.649,55.9]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":25.2,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":25.2,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":67,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[32.926,63.56]}},"ip":0,"op":120.4,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":2,"ty":3,"ks":{},"ip":0,"op":120.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":119.4,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/onboarding.json
================================================
{
"v": "5.7.5",
"fr": 100,
"ip": 0,
"op": 400,
"w": 315,
"h": 283,
"nm": "Comp 1",
"ddd": 0,
"metadata": {},
"assets": [
{
"id": "0",
"layers": [
{
"ddd": 0,
"refId": "1",
"w": 190,
"h": 186,
"ind": 1,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "1",
"layers": [
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
190,
186
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
95,
93
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
136.98,
105.22
],
[
130.82,
176.98
],
[
170.08,
122.43
],
[
175.07,
55.41
],
[
136.98,
105.22
],
[
136.98,
105.22
],
[
136.98,
105.22
]
],
"i": [
[
0,
0
],
[
-9.46,
-3.44
],
[
-12.22,
33.57
],
[
9.46,
3.44
],
[
12.22,
-33.57
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-12.22,
33.57
],
[
9.46,
3.44
],
[
12.22,
-33.57
],
[
-9.46,
-3.44
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
136.98,
105.22
],
[
113.44,
43.53
],
[
50.66,
11.77
],
[
68.47,
82.76
],
[
136.98,
105.22
],
[
136.98,
105.22
],
[
136.98,
105.22
]
],
"i": [
[
0,
0
],
[
22.96,
27.37
],
[
11.71,
-9.83
],
[
-22.96,
-27.37
],
[
-11.71,
9.83
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
3.58,
-5.22
],
[
-22.96,
-27.36
],
[
-11.71,
9.82
],
[
22.96,
27.37
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
136.98,
105.22
],
[
78.08,
66.73
],
[
9.57,
82.76
],
[
68.47,
121.25
],
[
136.98,
105.22
],
[
136.98,
105.22
],
[
136.98,
105.22
]
],
"i": [
[
0,
0
],
[
35.18,
6.2
],
[
2.66,
-15.05
],
[
-35.18,
-6.2
],
[
-1.64,
9.3
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
2.66,
-15.05
],
[
-35.18,
-6.2
],
[
-2.65,
15.05
],
[
35.18,
6.2
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "st",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"w": {
"a": 0,
"k": 17,
"ix": 2
},
"lc": 1,
"lj": 1,
"ml": 4
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
95.15560913085938,
92.9780044555664
],
"ix": 2
},
"a": {
"a": 0,
"k": [
95.15799045562744,
92.98032808303833
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99749660491943,
99.99749660491943
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "2",
"layers": [
{
"ddd": 0,
"refId": "3",
"w": 30,
"h": 30,
"ind": 4,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.724000930786133,
19.31599998474121
],
"ix": 2
},
"a": {
"a": 0,
"k": [
15,
15
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "3",
"layers": [
{
"ddd": 0,
"ind": 5,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
30,
30
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
15,
15
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 6,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
7.32,
0.39
],
[
14.15,
5.22
],
[
4.91,
14.87
],
[
1.29,
14.87
],
[
0.08,
13.66
],
[
0.08,
7.63
],
[
7.32,
0.39
],
[
7.32,
0.39
],
[
7.32,
0.39
]
],
"i": [
[
0,
0
],
[
-0.99,
-2.82
],
[
0,
-5.2
],
[
0,
0
],
[
0,
0.67
],
[
0,
0
],
[
-4,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
3.16,
0
],
[
-5.14,
0.21
],
[
0,
0
],
[
-0.67,
0
],
[
0,
0
],
[
0,
-4
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
14.57,
7.63
],
[
21.81,
14.87
],
[
21.81,
20.91
],
[
20.6,
22.12
],
[
14.57,
22.12
],
[
7.33,
15.25
],
[
7.32,
14.87
],
[
7.33,
14.56
],
[
7.33,
14.5
],
[
7.36,
14.15
],
[
7.36,
14.13
],
[
7.38,
14
],
[
7.4,
13.79
],
[
7.43,
13.63
],
[
7.46,
13.43
],
[
7.52,
13.2
],
[
7.54,
13.09
],
[
7.61,
12.86
],
[
7.64,
12.75
],
[
7.65,
12.72
],
[
7.73,
12.45
],
[
7.75,
12.41
],
[
7.8,
12.27
],
[
7.88,
12.09
],
[
7.94,
11.95
],
[
8.02,
11.77
],
[
8.09,
11.63
],
[
8.17,
11.47
],
[
8.27,
11.28
],
[
8.33,
11.18
],
[
8.43,
11.02
],
[
8.52,
10.88
],
[
8.63,
10.73
],
[
8.71,
10.61
],
[
8.83,
10.45
],
[
8.93,
10.32
],
[
9.03,
10.2
],
[
9.16,
10.05
],
[
9.27,
9.94
],
[
9.37,
9.82
],
[
9.52,
9.68
],
[
9.62,
9.58
],
[
9.75,
9.46
],
[
9.89,
9.34
],
[
10.02,
9.23
],
[
10.13,
9.14
],
[
10.29,
9.02
],
[
10.43,
8.93
],
[
10.57,
8.83
],
[
10.7,
8.75
],
[
10.87,
8.64
],
[
10.98,
8.58
],
[
11.16,
8.48
],
[
11.3,
8.41
],
[
11.47,
8.32
],
[
11.61,
8.26
],
[
11.78,
8.18
],
[
11.96,
8.11
],
[
12.11,
8.06
],
[
12.25,
8.01
],
[
12.45,
7.94
],
[
12.58,
7.91
],
[
12.78,
7.85
],
[
12.95,
7.81
],
[
13.13,
7.77
],
[
13.34,
7.73
],
[
13.47,
7.71
],
[
13.98,
7.65
],
[
14.57,
7.63
],
[
14.57,
7.63
],
[
14.57,
7.63
]
],
"i": [
[
0,
0
],
[
0,
-4
],
[
0,
0
],
[
0.67,
0
],
[
0,
0
],
[
0.19,
3.82
],
[
0,
0
],
[
0,
0.1
],
[
0,
0.02
],
[
0,
0
],
[
0,
0.01
],
[
0,
0.04
],
[
-0.01,
0.07
],
[
-0.01,
0.05
],
[
-0.01,
0.07
],
[
-0.02,
0.08
],
[
-0.01,
0.04
],
[
-0.02,
0.08
],
[
-0.01,
0.04
],
[
0,
0.01
],
[
0,
0
],
[
0,
0.01
],
[
-0.02,
0.05
],
[
-0.02,
0.06
],
[
-0.02,
0.05
],
[
-0.03,
0.06
],
[
-0.02,
0.05
],
[
-0.03,
0.05
],
[
-0.04,
0.06
],
[
-0.02,
0.03
],
[
-0.04,
0.05
],
[
-0.03,
0.05
],
[
-0.04,
0.05
],
[
-0.03,
0.04
],
[
-0.04,
0.05
],
[
-0.03,
0.04
],
[
-0.04,
0.04
],
[
-0.04,
0.05
],
[
-0.04,
0.04
],
[
-0.04,
0.04
],
[
-0.05,
0.05
],
[
-0.03,
0.03
],
[
-0.04,
0.04
],
[
-0.05,
0.04
],
[
-0.05,
0.04
],
[
-0.04,
0.03
],
[
-0.05,
0.04
],
[
-0.04,
0.03
],
[
-0.05,
0.03
],
[
-0.05,
0.03
],
[
-0.06,
0.04
],
[
-0.04,
0.02
],
[
-0.06,
0.03
],
[
-0.04,
0.02
],
[
-0.06,
0.03
],
[
-0.05,
0.02
],
[
-0.06,
0.02
],
[
-0.06,
0.02
],
[
-0.05,
0.02
],
[
-0.05,
0.02
],
[
-0.07,
0.02
],
[
-0.05,
0.01
],
[
-0.07,
0.02
],
[
-0.05,
0.01
],
[
-0.06,
0.01
],
[
-0.07,
0.01
],
[
-0.04,
0.01
],
[
-0.18,
0.02
],
[
-0.2,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
4,
0
],
[
0,
0
],
[
0,
0.66
],
[
0,
0
],
[
-3.87,
0
],
[
0,
0
],
[
0,
-0.1
],
[
0,
-0.02
],
[
0,
0
],
[
0,
0
],
[
0,
-0.05
],
[
0.01,
-0.07
],
[
0.01,
-0.05
],
[
0.01,
-0.07
],
[
0.02,
-0.07
],
[
0.01,
-0.04
],
[
0.02,
-0.07
],
[
0.01,
-0.04
],
[
0,
-0.01
],
[
0,
0
],
[
0,
-0.01
],
[
0.02,
-0.05
],
[
0.02,
-0.06
],
[
0.02,
-0.05
],
[
0.03,
-0.06
],
[
0.02,
-0.05
],
[
0.03,
-0.05
],
[
0.04,
-0.06
],
[
0.02,
-0.03
],
[
0.03,
-0.06
],
[
0.03,
-0.05
],
[
0.04,
-0.05
],
[
0.03,
-0.04
],
[
0.04,
-0.05
],
[
0.03,
-0.04
],
[
0.04,
-0.04
],
[
0.04,
-0.05
],
[
0.04,
-0.04
],
[
0.04,
-0.04
],
[
0.05,
-0.05
],
[
0.04,
-0.04
],
[
0.05,
-0.04
],
[
0.05,
-0.04
],
[
0.04,
-0.04
],
[
0.04,
-0.03
],
[
0.05,
-0.04
],
[
0.04,
-0.03
],
[
0.05,
-0.04
],
[
0.04,
-0.03
],
[
0.06,
-0.04
],
[
0.04,
-0.02
],
[
0.06,
-0.04
],
[
0.04,
-0.02
],
[
0.06,
-0.03
],
[
0.05,
-0.02
],
[
0.05,
-0.02
],
[
0.06,
-0.02
],
[
0.05,
-0.02
],
[
0.05,
-0.02
],
[
0.07,
-0.02
],
[
0.04,
-0.01
],
[
0.07,
-0.02
],
[
0.05,
-0.02
],
[
0.06,
-0.01
],
[
0.07,
-0.02
],
[
0.04,
-0.01
],
[
0.17,
-0.03
],
[
0.19,
-0.02
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
14.592967987060547,
15.006291389465332
],
"ix": 2
},
"a": {
"a": 0,
"k": [
10.944999732077122,
11.255000412464142
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "4",
"layers": [
{
"ddd": 0,
"refId": "5",
"w": 41,
"h": 41,
"ind": 7,
"ty": 0,
"nm": "Clipped group (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
43.876060485839844,
44.9700927734375
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999997424318,
99.99999997424318
],
"ix": 2
},
"r": {
"a": 0,
"k": -123.08999825645346,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "6",
"w": 67,
"h": 63,
"ind": 8,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
45.247005462646484,
46.04199981689453
],
"ix": 2
},
"a": {
"a": 0,
"k": [
33.5,
31.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999997424318,
99.99999997424318
],
"ix": 2
},
"r": {
"a": 0,
"k": -123.08999825645346,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "5",
"layers": [
{
"ddd": 0,
"refId": "7",
"w": 41,
"h": 41,
"ind": 9,
"ty": 0,
"nm": "Clipped group (Masked) (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "8",
"layers": [
{
"ddd": 0,
"refId": "9",
"w": 41,
"h": 41,
"ind": 10,
"ty": 0,
"nm": "Clipped group (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.5,
19.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.5,
19.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 11,
"ty": 4,
"nm": "Shape Layer - box",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
41,
41
],
"ix": 2
},
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "7",
"layers": [
{
"ddd": 0,
"ind": 12,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"td": 1,
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Rectangle",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
39.679,
39.679
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 21,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
19.839000701904297,
19.839000701904297
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
1,
1
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "8",
"w": 41,
"h": 41,
"ind": 9,
"ty": 0,
"nm": "Clipped group (Masked) (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"tt": 1
}
]
},
{
"id": "9",
"layers": [
{
"ddd": 0,
"refId": "10",
"w": 40,
"h": 40,
"ind": 13,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
1,
1
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 14,
"ty": 4,
"nm": "Shape Layer - box",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer - box",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
41,
41
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "10",
"layers": [
{
"ddd": 0,
"refId": "11",
"ind": 15,
"ty": 2,
"nm": "Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
20.567794799804688,
19.839492797851562
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
96.78048622317431,
96.78048622317431
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "11",
"u": "",
"p": "data:image/png;base64,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",
"w": 40,
"h": 41,
"e": 1
},
{
"id": "6",
"layers": [
{
"ddd": 0,
"ind": 16,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
67,
63
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
33.5,
31.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 17,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
46.34,
36.46
],
[
14.01,
43.29
],
[
3.53,
21.21
],
[
3.15,
18.27
],
[
0.61,
12.2
],
[
5.35,
4.92
],
[
11.43,
4.8
],
[
14.44,
3.86
],
[
39.52,
4.14
],
[
46.34,
36.46
],
[
46.34,
36.46
],
[
46.34,
36.46
]
],
"i": [
[
0,
0
],
[
10.81,
7.04
],
[
-0.91,
8.46
],
[
0.39,
0.93
],
[
0,
0
],
[
-3.71,
0.07
],
[
0,
0
],
[
-0.91,
0.56
],
[
-7.84,
-5.11
],
[
7.05,
-10.81
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-7.04,
10.81
],
[
-7.62,
-4.96
],
[
0.11,
-1
],
[
0,
0
],
[
-1.44,
-3.42
],
[
0,
0
],
[
1.07,
-0.02
],
[
7.46,
-4.63
],
[
10.81,
7.04
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
33.55088806152344,
31.615095138549805
],
"ix": 2
},
"a": {
"a": 0,
"k": [
25.163795278840016,
23.711913418028576
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "12",
"layers": [
{
"ddd": 0,
"refId": "13",
"w": 41,
"h": 41,
"ind": 18,
"ty": 0,
"nm": "Clipped group (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
39.552490234375,
40.27444839477539
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.00000024333974,
100.00000024333974
],
"ix": 2
},
"r": {
"a": 0,
"k": -16.80000035671566,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "14",
"w": 64,
"h": 71,
"ind": 19,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
41.172000885009766,
44.03200149536133
],
"ix": 2
},
"a": {
"a": 0,
"k": [
32,
35.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.00000024333974,
100.00000024333974
],
"ix": 2
},
"r": {
"a": 0,
"k": -16.80000035671566,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "13",
"layers": [
{
"ddd": 0,
"refId": "15",
"w": 41,
"h": 41,
"ind": 20,
"ty": 0,
"nm": "Clipped group (Masked) (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "16",
"layers": [
{
"ddd": 0,
"refId": "17",
"w": 41,
"h": 41,
"ind": 21,
"ty": 0,
"nm": "Clipped group (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.5,
19.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.5,
19.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 22,
"ty": 4,
"nm": "Shape Layer - box",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
41,
41
],
"ix": 2
},
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "15",
"layers": [
{
"ddd": 0,
"ind": 23,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"td": 1,
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Rectangle",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
39.679,
39.679
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 21,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
19.839000701904297,
19.839000701904297
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
1,
1
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "16",
"w": 41,
"h": 41,
"ind": 20,
"ty": 0,
"nm": "Clipped group (Masked) (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"tt": 1
}
]
},
{
"id": "17",
"layers": [
{
"ddd": 0,
"refId": "18",
"w": 40,
"h": 40,
"ind": 24,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
1,
1
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 25,
"ty": 4,
"nm": "Shape Layer - box",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer - box",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
41,
41
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "18",
"layers": [
{
"ddd": 0,
"refId": "19",
"ind": 26,
"ty": 2,
"nm": "Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.7803955078125,
19.69636344909668
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.19999837875366,
99.19999837875366
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "19",
"u": "",
"p": "data:image/png;base64,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",
"w": 41,
"h": 40,
"e": 1
},
{
"id": "14",
"layers": [
{
"ddd": 0,
"ind": 27,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
64,
71
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
32,
35.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 28,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
30.86,
1.25
],
[
46.47,
30.37
],
[
28.22,
46.62
],
[
25.5,
47.81
],
[
20.39,
51.95
],
[
12.08,
49.44
],
[
10.26,
43.64
],
[
8.51,
41.02
],
[
1.74,
16.86
],
[
30.86,
1.25
],
[
30.86,
1.25
],
[
30.86,
1.25
]
],
"i": [
[
0,
0
],
[
3.73,
-12.35
],
[
8.38,
-1.5
],
[
0.78,
-0.63
],
[
0,
0
],
[
1.11,
3.54
],
[
0,
0
],
[
0.8,
0.71
],
[
-2.71,
8.96
],
[
-12.35,
-3.73
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
12.35,
3.73
],
[
-2.63,
8.71
],
[
-0.99,
0.18
],
[
0,
0
],
[
-2.88,
2.34
],
[
0,
0
],
[
-0.32,
-1.02
],
[
-6.53,
-5.87
],
[
3.73,
-12.35
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
32.139102935791016,
35.581295013427734
],
"ix": 2
},
"a": {
"a": 0,
"k": [
24.104931494821898,
26.686640179642037
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "20",
"layers": [
{
"ddd": 0,
"refId": "21",
"w": 33,
"h": 35,
"ind": 29,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.979000091552734,
19.523000717163086
],
"ix": 2
},
"a": {
"a": 0,
"k": [
16.5,
17.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.00000266711488,
100.00000266711491
],
"ix": 2
},
"r": {
"a": 0,
"k": -9.969999687139088,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "21",
"layers": [
{
"ddd": 0,
"ind": 30,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
33,
35
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
16.5,
17.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 31,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
11.89,
1.69
],
[
15.28,
2.29
],
[
15.88,
7.18
],
[
17.84,
9.26
],
[
22.59,
10.09
],
[
23.1,
13.5
],
[
18.54,
15.9
],
[
17.25,
18.37
],
[
17.89,
23.55
],
[
14.78,
25.02
],
[
11.63,
21.55
],
[
8.76,
21.05
],
[
4.61,
23.23
],
[
2.19,
20.79
],
[
4.55,
16.13
],
[
4.19,
13.38
],
[
0.72,
9.57
],
[
2.36,
6.54
],
[
7.11,
7.37
],
[
9.66,
6.08
],
[
11.89,
1.69
],
[
11.89,
1.69
]
],
"i": [
[
0,
0
],
[
-0.22,
-1.78
],
[
0,
0
],
[
-1.04,
-0.18
],
[
0,
0
],
[
1.53,
-0.81
],
[
0,
0
],
[
-0.12,
-1.01
],
[
0,
0
],
[
1.18,
1.3
],
[
0,
0
],
[
0.96,
-0.5
],
[
0,
0
],
[
-0.8,
1.58
],
[
0,
0
],
[
0.68,
0.75
],
[
0,
0
],
[
-1.7,
-0.3
],
[
0,
0
],
[
-0.48,
0.95
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0.81,
-1.59
],
[
0,
0
],
[
0.13,
1.06
],
[
0,
0
],
[
1.7,
0.3
],
[
0,
0
],
[
-0.89,
0.47
],
[
0,
0
],
[
0.21,
1.76
],
[
0,
0
],
[
-0.73,
-0.8
],
[
0,
0
],
[
-1.56,
0.82
],
[
0,
0
],
[
0.46,
-0.91
],
[
0,
0
],
[
-1.16,
-1.28
],
[
0,
0
],
[
1.04,
0.18
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
16.211286544799805,
17.538068771362305
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.158768430038934,
13.153880722914502
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "22",
"layers": [
{
"ddd": 0,
"refId": "23",
"w": 31,
"h": 16,
"ind": 32,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.47800064086914,
15.807000160217285
],
"ix": 2
},
"a": {
"a": 0,
"k": [
15.5,
8
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999809893677,
99.99999809893679
],
"ix": 2
},
"r": {
"a": 0,
"k": -8.22000011631331,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "24",
"w": 33,
"h": 11,
"ind": 33,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.858999252319336,
32.42300033569336
],
"ix": 2
},
"a": {
"a": 0,
"k": [
16.5,
5.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999809893677,
99.99999809893679
],
"ix": 2
},
"r": {
"a": 0,
"k": -8.22000011631331,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "23",
"layers": [
{
"ddd": 0,
"ind": 34,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
31,
16
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
15.5,
8
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 35,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": false,
"v": [
[
3.69,
9.84
],
[
11.36,
4.44
],
[
17.2,
11.79
],
[
27.37,
3.51
]
],
"i": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "st",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"w": {
"a": 0,
"k": 6.44,
"ix": 2
},
"lc": 2,
"lj": 2,
"ml": 4
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
15.529610633850098,
7.649808883666992
],
"ix": 2
},
"a": {
"a": 0,
"k": [
15.53,
7.6499999999999995
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99749660491943,
99.99749660491943
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "24",
"layers": [
{
"ddd": 0,
"ind": 36,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
33,
11
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
16.5,
5.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 37,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
20.61,
7.58
],
[
2.69,
4.99
],
[
0.14,
1.57
],
[
2.19,
0.04
],
[
22.5,
2.97
],
[
24.03,
5.03
],
[
20.61,
7.58
],
[
20.61,
7.58
],
[
20.61,
7.58
]
],
"i": [
[
0,
0
],
[
0,
0
],
[
-0.24,
1.65
],
[
-0.99,
-0.14
],
[
0,
0
],
[
0.14,
-0.99
],
[
1.65,
0.24
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
-1.65,
-0.24
],
[
0.14,
-0.99
],
[
0,
0
],
[
0.99,
0.14
],
[
-0.24,
1.65
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
16.103836059570312,
5.088968276977539
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.078178079479231,
3.816821920520771
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "25",
"layers": [
{
"ddd": 0,
"refId": "26",
"w": 35,
"h": 32,
"ind": 38,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.854999542236328,
16.54400062561035
],
"ix": 2
},
"a": {
"a": 0,
"k": [
17.5,
16
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999797104884,
99.99999797104884
],
"ix": 2
},
"r": {
"a": 0,
"k": 10.250000042866644,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "26",
"layers": [
{
"ddd": 0,
"ind": 39,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
35,
32
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
17.5,
16
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 40,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
11.4,
0.62
],
[
25.43,
10.35
],
[
25.69,
11.79
],
[
24.71,
19.12
],
[
20.72,
19.61
],
[
13.87,
18.39
],
[
7.88,
21.93
],
[
3.96,
22.87
],
[
0.49,
16.35
],
[
0.23,
14.91
],
[
9.96,
0.88
],
[
11.4,
0.62
]
],
"i": [
[
0,
0
],
[
-1.18,
-6.56
],
[
0,
0
],
[
1.05,
-2.2
],
[
1.35,
0.84
],
[
2.53,
-0.46
],
[
1.34,
-1.75
],
[
1.15,
1.11
],
[
0.46,
2.59
],
[
0,
0
],
[
-6.56,
1.18
],
[
0,
0
]
],
"o": [
[
6.56,
-1.19
],
[
0,
0
],
[
0.47,
2.59
],
[
-0.68,
1.44
],
[
-1.87,
-1.17
],
[
-2.53,
0.46
],
[
-0.97,
1.27
],
[
-1.75,
-1.7
],
[
0,
0
],
[
-1.19,
-6.56
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
11.59,
5.79
],
[
7.46,
11.74
],
[
13.41,
15.87
],
[
17.54,
9.92
],
[
11.59,
5.79
],
[
11.59,
5.79
]
],
"i": [
[
0,
0
],
[
-0.5,
-2.78
],
[
-2.78,
0.5
],
[
0.5,
2.78
],
[
2.78,
-0.5
],
[
0,
0
]
],
"o": [
[
-2.79,
0.5
],
[
0.5,
2.79
],
[
2.79,
-0.5
],
[
-0.5,
-2.79
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
17.27910041809082,
15.883710861206055
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.959649469703436,
11.913080900907516
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "27",
"layers": [
{
"ddd": 0,
"refId": "28",
"w": 25,
"h": 25,
"ind": 41,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
15.815999984741211,
23.533000946044922
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.5,
12.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "29",
"w": 24,
"h": 24,
"ind": 42,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
25.31599998474121,
14.032999992370605
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12,
12
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "28",
"layers": [
{
"ddd": 0,
"ind": 43,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
25,
25
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
12.5,
12.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 44,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
13.52,
5.16
],
[
18.11,
11.18
],
[
16.8,
13.99
],
[
3.75,
17.94
],
[
0.74,
14.93
],
[
4.7,
1.88
],
[
7.5,
0.57
],
[
13.52,
5.16
],
[
13.52,
5.16
],
[
13.52,
5.16
]
],
"i": [
[
0,
0
],
[
-0.79,
-1.48
],
[
1.24,
-0.37
],
[
0,
0
],
[
-0.56,
1.85
],
[
0,
0
],
[
-1.15,
-0.61
],
[
-2.4,
-2.4
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
2.41,
2.4
],
[
0.61,
1.15
],
[
0,
0
],
[
-1.85,
0.56
],
[
0,
0
],
[
0.38,
-1.24
],
[
1.48,
0.79
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
12.64606761932373,
12.259976387023926
],
"ix": 2
},
"a": {
"a": 0,
"k": [
9.484787772000299,
9.1952122279997
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "29",
"layers": [
{
"ddd": 0,
"ind": 45,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
24,
24
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
12,
12
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 46,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": false,
"v": [
[
19.98,
19.87
],
[
13.15,
10.77
],
[
4.04,
3.93
]
],
"i": [
[
0,
0
],
[
5.15,
5.16
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
-5.16,
-5.16
],
[
0,
0
]
]
}
}
},
{
"ty": "st",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"w": {
"a": 0,
"k": 6.44,
"ix": 2
},
"lc": 2,
"lj": 2,
"ml": 4
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
12.009698867797852,
11.899701118469238
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.010000000000002,
11.9
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99749660491943,
99.99749660491943
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "30",
"layers": [
{
"ddd": 0,
"refId": "31",
"w": 34,
"h": 35,
"ind": 47,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
18.77899932861328,
20.256999969482422
],
"ix": 2
},
"a": {
"a": 0,
"k": [
17,
17.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.0000004551171,
100.00000045511712
],
"ix": 2
},
"r": {
"a": 0,
"k": -6.83999986588411,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "31",
"layers": [
{
"ddd": 0,
"ind": 48,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
34,
35
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
17,
17.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 49,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
3.5,
7.09
],
[
1.24,
11.12
],
[
0.1,
20.63
],
[
2.21,
23.31
],
[
4.86,
23.63
],
[
7.49,
21.78
],
[
8.67,
16.77
],
[
13.09,
13.67
],
[
16.66,
17.72
],
[
16.61,
22.88
],
[
18.73,
25.29
],
[
21.39,
25.61
],
[
24.07,
23.5
],
[
25.21,
14
],
[
23.96,
9.55
],
[
17.94,
1.89
],
[
11.16,
1.07
],
[
3.5,
7.09
],
[
3.5,
7.09
]
],
"i": [
[
0,
0
],
[
0.19,
-1.59
],
[
0,
0
],
[
-1.32,
-0.16
],
[
0,
0
],
[
-0.28,
1.2
],
[
0,
0
],
[
-2.05,
-0.25
],
[
0.02,
-2.06
],
[
0,
0
],
[
-1.22,
-0.15
],
[
0,
0
],
[
-0.16,
1.32
],
[
0,
0
],
[
0.99,
1.26
],
[
0,
0
],
[
2.09,
-1.64
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-1.26,
0.99
],
[
0,
0
],
[
-0.16,
1.32
],
[
0,
0
],
[
1.22,
0.15
],
[
0,
0
],
[
0.47,
-2.01
],
[
2.05,
0.25
],
[
0,
0
],
[
-0.01,
1.23
],
[
0,
0
],
[
1.32,
0.16
],
[
0,
0
],
[
0.19,
-1.59
],
[
0,
0
],
[
-1.64,
-2.1
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
16.889612197875977,
17.11311149597168
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.667526376186217,
12.835154150998617
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "32",
"layers": [
{
"ddd": 0,
"refId": "33",
"w": 25,
"h": 20,
"ind": 50,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
20.232999801635742,
12.520999908447266
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.5,
10
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999885890291,
99.99999885890293
],
"ix": 2
},
"r": {
"a": 0,
"k": 13.500000003802489,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 51,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
6.439,
28.974
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 32.193,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
19.31599998474121,
25.7549991607666
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": -90,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 52,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
6.439,
12.877
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 32.193,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
30.58300018310547,
28.9739990234375
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 53,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
6.439,
12.877
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 32.193,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
8.04800033569336,
28.9739990234375
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "34",
"w": 4,
"h": 4,
"ind": 54,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
-207.46200561523438,
-369.1709899902344
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999885890291,
99.99999885890293
],
"ix": 2
},
"r": {
"a": 0,
"k": 13.500000003802489,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "33",
"layers": [
{
"ddd": 0,
"ind": 55,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
25,
20
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
12.5,
10
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 56,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
2.37,
14.42
],
[
1.38,
13.95
],
[
1.07,
13.27
],
[
7.08,
0.88
],
[
18.06,
9.2
],
[
18.09,
9.93
],
[
17.42,
10.81
],
[
2.37,
14.42
],
[
2.37,
14.42
]
],
"i": [
[
0,
0
],
[
0.17,
0.38
],
[
0,
0
],
[
-5.46,
1.31
],
[
-0.21,
-5.62
],
[
0,
0
],
[
0.4,
-0.1
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-0.4,
0.1
],
[
0,
0
],
[
-2.36,
-5.1
],
[
5.46,
-1.31
],
[
0,
0
],
[
0.02,
0.41
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
12.222896575927734,
10.051118850708008
],
"ix": 2
},
"a": {
"a": 0,
"k": [
9.167401070695366,
7.5385274742464
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "34",
"layers": [
{
"ddd": 0,
"refId": "35",
"ind": 57,
"ty": 2,
"nm": "Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "35",
"u": "",
"p": "31.png",
"w": 1,
"h": 1,
"e": 1
},
{
"id": "36",
"layers": [
{
"ddd": 0,
"refId": "37",
"w": 41,
"h": 41,
"ind": 58,
"ty": 0,
"nm": "Clipped group (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
46.45384979248047,
45.477577209472656
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999953474834,
99.99999953474834
],
"ix": 2
},
"r": {
"a": 0,
"k": 132.19999831142374,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "38",
"w": 64,
"h": 63,
"ind": 59,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
45.70700454711914,
45.51499938964844
],
"ix": 2
},
"a": {
"a": 0,
"k": [
32,
31.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999953474834,
99.99999953474834
],
"ix": 2
},
"r": {
"a": 0,
"k": 132.19999831142374,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "37",
"layers": [
{
"ddd": 0,
"refId": "39",
"w": 41,
"h": 41,
"ind": 60,
"ty": 0,
"nm": "Clipped group (Masked) (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "40",
"layers": [
{
"ddd": 0,
"refId": "41",
"w": 41,
"h": 41,
"ind": 61,
"ty": 0,
"nm": "Clipped group (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.5,
19.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.5,
19.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 62,
"ty": 4,
"nm": "Shape Layer - box",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
41,
41
],
"ix": 2
},
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "39",
"layers": [
{
"ddd": 0,
"ind": 63,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"td": 1,
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Rectangle",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
39.679,
39.679
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 21,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
19.839000701904297,
19.839000701904297
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
1,
1
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "40",
"w": 41,
"h": 41,
"ind": 60,
"ty": 0,
"nm": "Clipped group (Masked) (Masked)",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"tt": 1
}
]
},
{
"id": "41",
"layers": [
{
"ddd": 0,
"refId": "42",
"w": 40,
"h": 40,
"ind": 64,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
1,
1
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 65,
"ty": 4,
"nm": "Shape Layer - box",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer - box",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
41,
41
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
20.5,
20.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "42",
"layers": [
{
"ddd": 0,
"refId": "43",
"ind": 66,
"ty": 2,
"nm": "Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.839502334594727,
19.839492797851562
],
"ix": 2
},
"a": {
"a": 0,
"k": [
360.5,
360.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
5.503467316435709,
5.503467316435709
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "43",
"u": "",
"p": "data:image/png;base64,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",
"w": 721,
"h": 721,
"e": 1
},
{
"id": "38",
"layers": [
{
"ddd": 0,
"ind": 67,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
64,
63
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
32,
31.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 68,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
6.27,
39.26
],
[
7.88,
6.26
],
[
31.89,
1.73
],
[
34.84,
2.11
],
[
41.35,
1.19
],
[
47.19,
7.63
],
[
45.75,
13.53
],
[
45.91,
16.68
],
[
39.27,
40.87
],
[
6.27,
39.26
],
[
6.27,
39.26
],
[
6.27,
39.26
]
],
"i": [
[
0,
0
],
[
-9.55,
8.66
],
[
-7.95,
-3.02
],
[
-0.99,
0.14
],
[
0,
0
],
[
0.88,
-3.61
],
[
0,
0
],
[
-0.32,
-1.02
],
[
6.94,
-6.29
],
[
8.67,
9.56
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-8.66,
-9.56
],
[
6.74,
-6.11
],
[
0.94,
0.36
],
[
0,
0
],
[
3.67,
-0.52
],
[
0,
0
],
[
-0.25,
1.04
],
[
2.58,
8.39
],
[
-9.55,
8.66
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
31.706619262695312,
31.418901443481445
],
"ix": 2
},
"a": {
"a": 0,
"k": [
23.780556709097354,
23.56476619883002
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "44",
"layers": [
{
"ddd": 0,
"refId": "45",
"w": 19,
"h": 28,
"ind": 69,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
28.698999404907227,
19.81100082397461
],
"ix": 2
},
"a": {
"a": 0,
"k": [
9.5,
14
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999789196237,
99.99999789196237
],
"ix": 2
},
"r": {
"a": 0,
"k": -14.480000876980029,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "46",
"w": 19,
"h": 27,
"ind": 70,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
9.895000457763672,
18.986000061035156
],
"ix": 2
},
"a": {
"a": 0,
"k": [
9.5,
13.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999789196237,
99.99999789196237
],
"ix": 2
},
"r": {
"a": 0,
"k": -14.480000876980029,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "47",
"w": 4,
"h": 4,
"ind": 71,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
-321.0369873046875,
-136.73300170898438
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999789196237,
99.99999789196237
],
"ix": 2
},
"r": {
"a": 0,
"k": -14.480000876980029,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "45",
"layers": [
{
"ddd": 0,
"ind": 72,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
19,
28
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
9.5,
14
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 73,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
13.72,
5.11
],
[
9.61,
0.63
],
[
5.71,
1.28
],
[
2.8,
3.95
],
[
0.35,
13.42
],
[
1.61,
17.16
],
[
4.71,
19.63
],
[
10.47,
17.69
],
[
13.72,
5.11
],
[
13.72,
5.11
]
],
"i": [
[
0,
0
],
[
2.59,
-0.43
],
[
0,
0
],
[
0.36,
-1.39
],
[
0,
0
],
[
-1.12,
-0.89
],
[
0,
0
],
[
-0.66,
2.54
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0.66,
-2.54
],
[
0,
0
],
[
-1.41,
0.23
],
[
0,
0
],
[
-0.36,
1.39
],
[
0,
0
],
[
2.05,
1.63
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
9.382323265075684,
13.996461868286133
],
"ix": 2
},
"a": {
"a": 0,
"k": [
7.036918801205624,
10.497609319368696
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "46",
"layers": [
{
"ddd": 0,
"ind": 74,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
19,
27
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
9.5,
13.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 75,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
3.84,
2.82
],
[
9.6,
0.89
],
[
12.7,
3.35
],
[
13.96,
7.09
],
[
11.51,
16.56
],
[
8.6,
19.23
],
[
4.7,
19.88
],
[
0.59,
15.41
],
[
3.84,
2.82
],
[
3.84,
2.82
]
],
"i": [
[
0,
0
],
[
-2.05,
-1.63
],
[
0,
0
],
[
0.36,
-1.39
],
[
0,
0
],
[
1.41,
-0.23
],
[
0,
0
],
[
-0.66,
2.54
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0.66,
-2.54
],
[
0,
0
],
[
1.12,
0.89
],
[
0,
0
],
[
-0.36,
1.39
],
[
0,
0
],
[
-2.59,
0.43
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
9.697198867797852,
13.354605674743652
],
"ix": 2
},
"a": {
"a": 0,
"k": [
7.273081198794376,
10.016204557466061
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "47",
"layers": [
{
"ddd": 0,
"refId": "35",
"ind": 76,
"ty": 2,
"nm": "Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "48",
"layers": [
{
"ddd": 0,
"refId": "49",
"w": 32,
"h": 33,
"ind": 77,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.2549991607666,
19.704999923706055
],
"ix": 2
},
"a": {
"a": 0,
"k": [
16,
16.5
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.9999982762619,
99.99999827626189
],
"ix": 2
},
"r": {
"a": 0,
"k": -7.150000132583977,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "49",
"layers": [
{
"ddd": 0,
"ind": 78,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
32,
33
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
16,
16.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 79,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
10.36,
11.27
],
[
12.46,
13.96
],
[
20.92,
15.02
],
[
22.63,
17.96
],
[
10.58,
24.07
],
[
0.1,
10.59
],
[
9,
0.42
],
[
11.42,
2.8
],
[
10.36,
11.27
],
[
10.36,
11.27
]
],
"i": [
[
0,
0
],
[
-1.32,
-0.17
],
[
0,
0
],
[
0.72,
-1.29
],
[
5.04,
0.63
],
[
-0.83,
6.61
],
[
-4.62,
1.22
],
[
0.18,
-1.46
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-0.16,
1.32
],
[
0,
0
],
[
1.46,
0.18
],
[
-2.32,
4.18
],
[
-6.61,
-0.83
],
[
0.63,
-5.04
],
[
1.43,
-0.38
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"nm": "Path",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
15.02,
3.26
],
[
17.95,
1.54
],
[
23.76,
9.01
],
[
21.37,
11.43
],
[
16.5,
10.82
],
[
14.4,
8.13
],
[
15.02,
3.26
],
[
15.02,
3.26
]
],
"i": [
[
0,
0
],
[
-1.29,
-0.72
],
[
-0.84,
-3.17
],
[
1.46,
0.18
],
[
0,
0
],
[
-0.16,
1.32
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0.18,
-1.47
],
[
2.86,
1.59
],
[
0.38,
1.43
],
[
0,
0
],
[
-1.32,
-0.16
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
15.887228965759277,
16.344947814941406
],
"ix": 2
},
"a": {
"a": 0,
"k": [
11.915719670942053,
12.259016573429108
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "50",
"layers": [
{
"ddd": 0,
"refId": "51",
"w": 34,
"h": 34,
"ind": 80,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.218000411987305,
19.386999130249023
],
"ix": 2
},
"a": {
"a": 0,
"k": [
17,
17
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999872617904,
99.99999872617906
],
"ix": 2
},
"r": {
"a": 0,
"k": 8.0700003209305,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
},
{
"id": "51",
"layers": [
{
"ddd": 0,
"ind": 81,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
34,
34
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
17,
17
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 82,
"ty": 4,
"nm": "Shape Layer",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"nm": "Shape Layer",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
11.12,
0.73
],
[
21.3,
4.09
],
[
13.3,
14.88
],
[
9.1,
11.65
],
[
8.95,
11.54
],
[
6.56,
11.98
],
[
6.75,
14.4
],
[
6.89,
14.52
],
[
11.58,
18.13
],
[
15.84,
17.54
],
[
23.54,
7.14
],
[
24.77,
10.99
],
[
14.51,
24.64
],
[
0.86,
14.38
],
[
11.12,
0.73
],
[
11.12,
0.73
],
[
11.12,
0.73
]
],
"i": [
[
0,
0
],
[
-2.59,
-2.55
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0.57,
-0.74
],
[
-0.67,
-0.63
],
[
0,
0
],
[
0,
0
],
[
-1,
1.36
],
[
0,
0
],
[
-0.2,
-1.38
],
[
6.6,
-0.94
],
[
0.93,
6.6
],
[
-6.6,
0.93
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
3.88,
-0.55
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
-0.78,
-0.48
],
[
-0.57,
0.74
],
[
0,
0
],
[
0,
0
],
[
1.34,
1.03
],
[
0,
0
],
[
0.61,
1.17
],
[
0.93,
6.6
],
[
-6.6,
0.93
],
[
-0.94,
-6.6
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
17.084789276123047,
16.912029266357422
],
"ix": 2
},
"a": {
"a": 0,
"k": [
12.813912717562332,
12.684338333442417
],
"ix": 2
},
"s": {
"a": 0,
"k": [
133.3299994468689,
133.3299994468689
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
}
]
}
],
"layers": [
{
"ddd": 0,
"ind": 12345679,
"ty": 4,
"nm": "Group Layer 8",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"it": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
220.741,
37.184
],
[
225.501,
35.896
],
[
228.749,
32.36800000000001
],
[
229.981,
27.216000000000008
],
[
228.749,
22.12
],
[
225.501,
18.592
],
[
220.741,
17.304
],
[
215.981,
18.592
],
[
212.677,
22.12
],
[
211.501,
27.216000000000008
],
[
212.677,
32.36800000000001
],
[
215.981,
35.896
],
[
220.741,
37.184
],
[
220.741,
37.184
],
[
220.741,
37.184
]
],
"i": [
[
0,
0
],
[
-1.380999999999972,
0.8586999999999989
],
[
-0.7839999999999918,
1.493299999999991
],
[
0,
1.903999999999996
],
[
0.8220000000000027,
1.493299999999991
],
[
1.382000000000062,
0.8586999999999989
],
[
1.79200000000003,
0
],
[
1.418999999999983,
-0.8586999999999989
],
[
0.8220000000000027,
-1.493300000000005
],
[
0,
-1.904000000000011
],
[
-0.7839999999999918,
-1.5307000000000102
],
[
-1.380999999999972,
-0.8586999999999989
],
[
-1.754000000000019,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
1.79200000000003,
0
],
[
1.382000000000062,
-0.8586999999999989
],
[
0.8220000000000027,
-1.5307000000000102
],
[
0,
-1.904000000000011
],
[
-0.7839999999999918,
-1.493300000000005
],
[
-1.380999999999972,
-0.8586999999999989
],
[
-1.754000000000019,
0
],
[
-1.380999999999972,
0.8586999999999989
],
[
-0.7839999999999918,
1.493299999999991
],
[
0,
1.903999999999996
],
[
0.8220000000000027,
1.493299999999991
],
[
1.418999999999983,
0.8586999999999989
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
221.357,
43.06400000000001
],
[
214.917,
41.608
],
[
210.49300000000005,
37.408
],
[
211.221,
36.232
],
[
211.221,
42.392
],
[
205.173,
42.392
],
[
205.173,
0
],
[
211.501,
0
],
[
211.501,
18.36800000000001
],
[
210.49300000000005,
16.912000000000006
],
[
214.973,
12.88
],
[
221.357,
11.424000000000007
],
[
229.085,
13.49600000000001
],
[
234.51700000000005,
19.152
],
[
236.533,
27.216000000000008
],
[
234.51700000000005,
35.28
],
[
229.141,
40.992
],
[
221.357,
43.06400000000001
],
[
221.357,
43.06400000000001
],
[
221.357,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
1.942000000000007,
0.9706999999999937
],
[
1.045999999999935,
1.829300000000003
],
[
-0.2426666666666506,
0.3919999999999959
],
[
0,
-2.053333333333327
],
[
2.015999999999963,
0
],
[
0,
14.13066666666667
],
[
-2.109333333333325,
0
],
[
0,
-6.122666666666674
],
[
0.3360000000000127,
0.4853333333333296
],
[
-1.865999999999985,
0.9707000000000079
],
[
-2.38900000000001,
0
],
[
-2.277000000000044,
-1.3813000000000102
],
[
-1.30600000000004,
-2.389300000000006
],
[
0,
-2.986699999999999
],
[
1.343999999999937,
-2.389300000000006
],
[
2.27800000000002,
-1.4187000000000012
],
[
2.912000000000035,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-2.351999999999975,
0
],
[
-1.903999999999996,
-0.9707000000000079
],
[
0.2426666666666506,
-0.3919999999999959
],
[
0,
2.053333333333327
],
[
-2.015999999999963,
0
],
[
0,
-14.13066666666667
],
[
2.109333333333325,
0
],
[
0,
6.122666666666667
],
[
-0.3360000000000127,
-0.4853333333333296
],
[
1.120000000000005,
-1.717300000000009
],
[
1.867000000000075,
-0.9706999999999937
],
[
2.875,
0
],
[
2.314999999999941,
1.381299999999996
],
[
1.343999999999937,
2.389300000000006
],
[
0,
2.986699999999999
],
[
-1.30600000000004,
2.389300000000006
],
[
-2.27699999999993,
1.381299999999996
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
181.87,
43.06400000000001
],
[
176.438,
42
],
[
172.854,
38.976
],
[
171.566,
34.384
],
[
172.63,
29.960000000000008
],
[
176.046,
26.656000000000006
],
[
181.814,
24.752
],
[
192.342,
23.016000000000005
],
[
192.342,
28
],
[
183.046,
29.624
],
[
179.35,
31.248
],
[
178.174,
34.16
],
[
179.462,
37.016000000000005
],
[
182.878,
38.08
],
[
187.35799999999995,
36.96000000000001
],
[
190.38199999999995,
33.992
],
[
191.446,
29.792
],
[
191.446,
22.008
],
[
189.766,
18.36800000000001
],
[
185.398,
16.912000000000006
],
[
180.974,
18.256
],
[
178.23,
21.616
],
[
172.966,
18.98400000000001
],
[
175.71,
15.064000000000007
],
[
180.134,
12.376
],
[
185.566,
11.424000000000007
],
[
191.894,
12.768
],
[
196.206,
16.52
],
[
197.774,
22.008
],
[
197.774,
42.392
],
[
191.726,
42.392
],
[
191.726,
36.904
],
[
193.014,
37.072
],
[
190.27,
40.264
],
[
186.518,
42.336
],
[
181.87,
43.06400000000001
],
[
181.87,
43.06400000000001
],
[
181.87,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
1.567999999999984,
0.7092999999999989
],
[
0.8589999999999236,
1.2693000000000012
],
[
0,
1.7547
],
[
-0.7089999999999463,
1.306699999999992
],
[
-1.530000000000086,
0.8960000000000008
],
[
-2.313999999999965,
0.3733000000000004
],
[
-3.509333333333302,
0.5786666666666633
],
[
0,
-1.661333333333332
],
[
3.098666666666645,
-0.541333333333327
],
[
0.7839999999999918,
-0.784000000000006
],
[
0,
-1.194699999999997
],
[
-0.8579999999999472,
-0.7467000000000041
],
[
-1.381000000000085,
0
],
[
-1.268999999999892,
0.7466999999999899
],
[
-0.7089999999999463,
1.2319999999999993
],
[
0,
1.530699999999996
],
[
0,
2.594666666666669
],
[
1.120000000000005,
0.9332999999999885
],
[
1.829999999999927,
0
],
[
1.269999999999982,
-0.8960000000000008
],
[
0.5979999999999563,
-1.381299999999996
],
[
1.754666666666708,
0.8773333333333255
],
[
-1.269000000000005,
1.11999999999999
],
[
-1.680000000000064,
0.6346999999999952
],
[
-1.903999999999996,
0
],
[
-1.828999999999951,
-0.8960000000000008
],
[
-1.008000000000038,
-1.6053
],
[
0,
-2.090699999999998
],
[
0,
-6.794666666666672
],
[
2.015999999999963,
0
],
[
0,
1.829333333333338
],
[
-0.4293333333333749,
-0.05599999999999739
],
[
1.120000000000005,
-0.8959999999999866
],
[
1.418999999999983,
-0.4852999999999952
],
[
1.717999999999961,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-2.052999999999997,
0
],
[
-1.529999999999973,
-0.7467000000000041
],
[
-0.8580000000000609,
-1.306699999999992
],
[
0,
-1.642700000000005
],
[
0.7469999999999573,
-1.306700000000006
],
[
1.530999999999949,
-0.8960000000000008
],
[
3.509333333333302,
-0.5786666666666633
],
[
0,
1.661333333333332
],
[
-3.098666666666645,
0.541333333333327
],
[
-1.680000000000064,
0.2987000000000108
],
[
-0.7839999999999918,
0.7467000000000041
],
[
0,
1.157300000000006
],
[
0.8959999999999582,
0.7092999999999989
],
[
1.717999999999961,
0
],
[
1.307000000000016,
-0.7467000000000041
],
[
0.7100000000000364,
-1.2693000000000012
],
[
0,
-2.594666666666669
],
[
0,
-1.493299999999991
],
[
-1.081999999999994,
-0.9707000000000079
],
[
-1.680000000000064,
0
],
[
-1.232000000000085,
0.8586999999999989
],
[
-1.754666666666708,
-0.8773333333333255
],
[
0.5599999999999454,
-1.493300000000005
],
[
1.269999999999982,
-1.157300000000006
],
[
1.717999999999961,
-0.6347000000000094
],
[
2.389999999999986,
0
],
[
1.866999999999962,
0.8960000000000008
],
[
1.045999999999935,
1.568000000000012
],
[
0,
6.794666666666672
],
[
-2.015999999999963,
0
],
[
0,
-1.829333333333338
],
[
0.4293333333333749,
0.05599999999999739
],
[
-0.70900000000006,
1.2319999999999993
],
[
-1.081999999999994,
0.8960000000000008
],
[
-1.380999999999972,
0.4853000000000094
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
159.072,
42.392
],
[
159.072,
0
],
[
165.4,
0
],
[
165.4,
42.392
],
[
159.072,
42.392
],
[
159.072,
42.392
],
[
159.072,
42.392
]
],
"i": [
[
0,
0
],
[
0,
14.13066666666667
],
[
-2.109333333333325,
0
],
[
0,
-14.13066666666667
],
[
2.109333333333325,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-14.13066666666667
],
[
2.109333333333325,
0
],
[
0,
14.13066666666667
],
[
-2.109333333333325,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
138.952,
43.06400000000001
],
[
130.888,
40.992
],
[
125.456,
35.28
],
[
123.496,
27.16
],
[
125.456,
19.040000000000006
],
[
130.832,
13.49600000000001
],
[
138.448,
11.424000000000007
],
[
144.552,
12.600000000000009
],
[
149.088,
15.848
],
[
151.888,
20.49600000000001
],
[
152.896,
26.096
],
[
152.84,
27.608
],
[
152.616,
29.064000000000007
],
[
128.48,
29.064000000000007
],
[
128.48,
24.024
],
[
149.032,
24.024
],
[
146.008,
26.320000000000007
],
[
145.616,
21.448000000000008
],
[
142.816,
18.032
],
[
138.448,
16.744
],
[
133.968,
18.032
],
[
130.944,
21.616
],
[
130.104,
27.216000000000008
],
[
130.944,
32.592
],
[
134.192,
36.176
],
[
139.008,
37.464
],
[
143.65599999999995,
36.232
],
[
146.736,
33.040000000000006
],
[
151.888,
35.56
],
[
149.088,
39.42400000000001
],
[
144.60799999999995,
42.11200000000001
],
[
138.952,
43.06400000000001
],
[
138.952,
43.06400000000001
],
[
138.952,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
2.351999999999975,
1.381299999999996
],
[
1.307000000000016,
2.389300000000006
],
[
0,
2.986699999999999
],
[
-1.307000000000016,
2.35199999999999
],
[
-2.240000000000009,
1.343999999999994
],
[
-2.836999999999989,
0
],
[
-1.79200000000003,
-0.784000000000006
],
[
-1.231999999999971,
-1.381299999999996
],
[
-0.6349999999999909,
-1.754700000000014
],
[
0,
-1.978700000000003
],
[
0.03699999999992087,
-0.5227000000000004
],
[
0.1119999999999663,
-0.4480000000000075
],
[
8.04533333333336,
0
],
[
0,
1.680000000000007
],
[
-6.850666666666712,
0
],
[
1.008000000000038,
-0.7653333333333308
],
[
0.6349999999999909,
1.4187000000000012
],
[
1.269000000000005,
0.8213000000000079
],
[
1.680000000000064,
0
],
[
1.307000000000016,
-0.8586999999999989
],
[
0.70900000000006,
-1.567999999999998
],
[
-0.1490000000000009,
-2.202700000000007
],
[
-0.7469999999999573,
-1.530699999999996
],
[
-1.380999999999972,
-0.8586999999999989
],
[
-1.79200000000003,
0
],
[
-1.268999999999892,
0.8213000000000079
],
[
-0.7469999999999573,
1.306699999999992
],
[
-1.717333333333386,
-0.8400000000000034
],
[
1.269000000000005,
-1.157300000000006
],
[
1.755000000000109,
-0.6720000000000113
],
[
2.052999999999997,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-3.024000000000001,
0
],
[
-2.315000000000055,
-1.4187000000000012
],
[
-1.307000000000016,
-2.426699999999997
],
[
0,
-3.061299999999989
],
[
1.343999999999937,
-2.352000000000004
],
[
2.240000000000009,
-1.3813000000000102
],
[
2.277000000000044,
0
],
[
1.79200000000003,
0.7839999999999918
],
[
1.232000000000085,
1.344000000000008
],
[
0.6720000000000255,
1.7547
],
[
0,
0.4852999999999952
],
[
-0.03700000000003456,
0.5227000000000004
],
[
-8.04533333333336,
0
],
[
0,
-1.680000000000007
],
[
6.850666666666712,
0
],
[
-1.008000000000038,
0.7653333333333308
],
[
0.3729999999999336,
-1.829300000000003
],
[
-0.59699999999998,
-1.456000000000003
],
[
-1.232000000000085,
-0.8586999999999989
],
[
-1.67999999999995,
0
],
[
-1.306999999999903,
0.8213000000000079
],
[
-0.7089999999999463,
1.530699999999996
],
[
-0.1870000000000118,
2.053299999999993
],
[
0.7839999999999918,
1.53070000000001
],
[
1.418999999999983,
0.8586999999999989
],
[
1.828999999999951,
0
],
[
1.307000000000016,
-0.8212999999999937
],
[
1.717333333333386,
0.8400000000000034
],
[
-0.59699999999998,
1.4187000000000012
],
[
-1.231999999999971,
1.11999999999999
],
[
-1.716999999999985,
0.6346999999999952
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
111.001,
7.951999999999998
],
[
111.001,
0.6720000000000041
],
[
117.329,
0.6720000000000041
],
[
117.329,
7.951999999999998
],
[
111.001,
7.951999999999998
],
[
111.001,
7.951999999999998
],
[
111.001,
7.951999999999998
]
],
"i": [
[
0,
0
],
[
0,
2.426666666666662
],
[
-2.109333333333325,
0
],
[
0,
-2.426666666666662
],
[
2.109333333333325,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-2.426666666666662
],
[
2.109333333333325,
0
],
[
0,
2.426666666666662
],
[
-2.109333333333325,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
111.001,
42.392
],
[
111.001,
12.096
],
[
117.329,
12.096
],
[
117.329,
42.392
],
[
111.001,
42.392
],
[
111.001,
42.392
],
[
111.001,
42.392
]
],
"i": [
[
0,
0
],
[
0,
10.09866666666667
],
[
-2.109333333333325,
0
],
[
0,
-10.09866666666667
],
[
2.109333333333325,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-10.09866666666666
],
[
2.109333333333325,
0
],
[
0,
10.09866666666666
],
[
-2.109333333333325,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
101.41,
42.72800000000001
],
[
94.01800000000003,
40.040000000000006
],
[
91.38599999999997,
32.48
],
[
91.38599999999997,
17.808000000000007
],
[
86.06600000000003,
17.808000000000007
],
[
86.06600000000003,
12.096
],
[
86.90599999999995,
12.096
],
[
90.21000000000004,
10.864
],
[
91.38599999999997,
7.504000000000005
],
[
91.38599999999997,
5.152000000000001
],
[
97.71400000000006,
5.152000000000001
],
[
97.71400000000006,
12.096
],
[
104.602,
12.096
],
[
104.602,
17.808000000000007
],
[
97.71400000000006,
17.808000000000007
],
[
97.71400000000006,
32.2
],
[
98.21799999999996,
34.888000000000005
],
[
99.84199999999998,
36.568
],
[
102.754,
37.128
],
[
103.76200000000006,
37.072
],
[
104.826,
36.96000000000001
],
[
104.826,
42.392
],
[
103.09,
42.616
],
[
101.41,
42.72800000000001
],
[
101.41,
42.72800000000001
],
[
101.41,
42.72800000000001
]
],
"i": [
[
0,
0
],
[
1.754999999999995,
1.792000000000002
],
[
0,
3.248000000000005
],
[
0,
4.890666666666661
],
[
1.773333333333312,
0
],
[
0,
1.903999999999996
],
[
-0.2799999999999727,
0
],
[
-0.7839999999999918,
0.8212999999999937
],
[
0,
1.4187000000000012
],
[
0,
0.7839999999999989
],
[
-2.109333333333325,
0
],
[
0,
-2.314666666666668
],
[
-2.295999999999935,
0
],
[
0,
-1.903999999999996
],
[
2.295999999999935,
0
],
[
0,
-4.797333333333327
],
[
-0.3360000000000127,
-0.7467000000000041
],
[
-0.7469999999999573,
-0.4106999999999914
],
[
-1.19500000000005,
0
],
[
-0.3730000000000473,
0.03730000000000189
],
[
-0.3360000000000127,
0.03729999999998768
],
[
0,
-1.810666666666663
],
[
0.6349999999999909,
-0.07469999999999288
],
[
0.4850000000000136,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-3.173000000000002,
0
],
[
-1.754999999999995,
-1.792000000000002
],
[
0,
-4.890666666666661
],
[
-1.773333333333312,
0
],
[
0,
-1.903999999999996
],
[
0.2799999999999727,
0
],
[
1.419000000000096,
0
],
[
0.7839999999999918,
-0.8213000000000079
],
[
0,
-0.7839999999999989
],
[
2.109333333333325,
0
],
[
0,
2.314666666666668
],
[
2.295999999999935,
0
],
[
0,
1.903999999999996
],
[
-2.295999999999935,
0
],
[
0,
4.797333333333327
],
[
0,
1.045299999999997
],
[
0.3360000000000127,
0.7092999999999989
],
[
0.7470000000000709,
0.3733000000000004
],
[
0.2989999999999782,
0
],
[
0.3729999999999336,
-0.03730000000000189
],
[
0,
1.810666666666663
],
[
-0.5230000000000246,
0.0747000000000071
],
[
-0.6349999999999909,
0.0747000000000071
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
78.71499999999997,
42.72800000000001
],
[
71.32299999999998,
40.040000000000006
],
[
68.69100000000003,
32.48
],
[
68.69100000000003,
17.808000000000007
],
[
63.37099999999998,
17.808000000000007
],
[
63.37099999999998,
12.096
],
[
64.21100000000001,
12.096
],
[
67.51499999999999,
10.864
],
[
68.69100000000003,
7.504000000000005
],
[
68.69100000000003,
5.152000000000001
],
[
75.019,
5.152000000000001
],
[
75.019,
12.096
],
[
81.90700000000004,
12.096
],
[
81.90700000000004,
17.808000000000007
],
[
75.019,
17.808000000000007
],
[
75.019,
32.2
],
[
75.52300000000002,
34.888000000000005
],
[
77.14699999999999,
36.568
],
[
80.05900000000003,
37.128
],
[
81.06700000000001,
37.072
],
[
82.13099999999997,
36.96000000000001
],
[
82.13099999999997,
42.392
],
[
80.39499999999998,
42.616
],
[
78.71499999999997,
42.72800000000001
],
[
78.71499999999997,
42.72800000000001
],
[
78.71499999999997,
42.72800000000001
]
],
"i": [
[
0,
0
],
[
1.754000000000019,
1.792000000000002
],
[
0,
3.248000000000005
],
[
0,
4.890666666666661
],
[
1.773333333333369,
0
],
[
0,
1.903999999999996
],
[
-0.2800000000000296,
0
],
[
-0.7839999999999918,
0.8212999999999937
],
[
0,
1.4187000000000012
],
[
0,
0.7839999999999989
],
[
-2.109333333333325,
0
],
[
0,
-2.314666666666668
],
[
-2.295999999999992,
0
],
[
0,
-1.903999999999996
],
[
2.295999999999992,
0
],
[
0,
-4.797333333333327
],
[
-0.3360000000000127,
-0.7467000000000041
],
[
-0.7470000000000141,
-0.4106999999999914
],
[
-1.19500000000005,
0
],
[
-0.3740000000000236,
0.03730000000000189
],
[
-0.3360000000000127,
0.03729999999998768
],
[
0,
-1.810666666666663
],
[
0.6340000000000146,
-0.07469999999999288
],
[
0.4850000000000136,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-3.173999999999978,
0
],
[
-1.754999999999995,
-1.792000000000002
],
[
0,
-4.890666666666661
],
[
-1.773333333333369,
0
],
[
0,
-1.903999999999996
],
[
0.2800000000000296,
0
],
[
1.418000000000006,
0
],
[
0.7839999999999918,
-0.8213000000000079
],
[
0,
-0.7839999999999989
],
[
2.109333333333325,
0
],
[
0,
2.314666666666668
],
[
2.295999999999992,
0
],
[
0,
1.903999999999996
],
[
-2.295999999999992,
0
],
[
0,
4.797333333333327
],
[
0,
1.045299999999997
],
[
0.3359999999999559,
0.7092999999999989
],
[
0.7460000000000377,
0.3733000000000004
],
[
0.297999999999945,
0
],
[
0.3730000000000473,
-0.03730000000000189
],
[
0,
1.810666666666663
],
[
-0.5230000000000246,
0.0747000000000071
],
[
-0.6349999999999909,
0.0747000000000071
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
44.18799999999999,
37.184
],
[
48.94799999999998,
35.896
],
[
52.19600000000003,
32.36800000000001
],
[
53.428,
27.216000000000008
],
[
52.19600000000003,
22.12
],
[
48.94799999999998,
18.592
],
[
44.18799999999999,
17.304
],
[
39.428,
18.592
],
[
36.12400000000002,
22.12
],
[
34.94799999999998,
27.216000000000008
],
[
36.12400000000002,
32.36800000000001
],
[
39.428,
35.896
],
[
44.18799999999999,
37.184
],
[
44.18799999999999,
37.184
],
[
44.18799999999999,
37.184
]
],
"i": [
[
0,
0
],
[
-1.381999999999948,
0.8586999999999989
],
[
-0.7840000000000487,
1.493299999999991
],
[
0,
1.903999999999996
],
[
0.8209999999999695,
1.493299999999991
],
[
1.381000000000029,
0.8586999999999989
],
[
1.79200000000003,
0
],
[
1.418000000000006,
-0.8586999999999989
],
[
0.8209999999999695,
-1.493300000000005
],
[
0,
-1.904000000000011
],
[
-0.7840000000000487,
-1.5307000000000102
],
[
-1.382000000000005,
-0.8586999999999989
],
[
-1.754999999999995,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
1.79200000000003,
0
],
[
1.381000000000029,
-0.8586999999999989
],
[
0.8209999999999695,
-1.5307000000000102
],
[
0,
-1.904000000000011
],
[
-0.7840000000000487,
-1.493300000000005
],
[
-1.381999999999948,
-0.8586999999999989
],
[
-1.754999999999995,
0
],
[
-1.382000000000005,
0.8586999999999989
],
[
-0.7840000000000487,
1.493299999999991
],
[
0,
1.903999999999996
],
[
0.8209999999999695,
1.493299999999991
],
[
1.418000000000006,
0.8586999999999989
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
44.18799999999999,
43.06400000000001
],
[
36.18000000000001,
40.992
],
[
30.46800000000002,
35.336
],
[
28.33999999999997,
27.216000000000008
],
[
30.46800000000002,
19.096
],
[
36.18000000000001,
13.49600000000001
],
[
44.18799999999999,
11.424000000000007
],
[
52.19600000000003,
13.49600000000001
],
[
57.85199999999998,
19.096
],
[
59.98000000000002,
27.216000000000008
],
[
57.85199999999998,
35.392
],
[
52.139999999999986,
41.048
],
[
44.18799999999999,
43.06400000000001
],
[
44.18799999999999,
43.06400000000001
],
[
44.18799999999999,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
2.425999999999988,
1.381299999999996
],
[
1.418000000000006,
2.389300000000006
],
[
0,
3.024000000000001
],
[
-1.41900000000004,
2.352000000000004
],
[
-2.389999999999986,
1.343999999999994
],
[
-2.949999999999989,
0
],
[
-2.352000000000032,
-1.3813000000000102
],
[
-1.381999999999948,
-2.389300000000006
],
[
0,
-3.061300000000003
],
[
1.418000000000006,
-2.389299999999992
],
[
2.38900000000001,
-1.381299999999996
],
[
2.912000000000035,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-2.911999999999978,
0
],
[
-2.389999999999986,
-1.381299999999996
],
[
-1.41900000000004,
-2.389299999999992
],
[
0,
-3.061300000000003
],
[
1.418000000000006,
-2.389300000000006
],
[
2.38900000000001,
-1.3813000000000102
],
[
2.98599999999999,
0
],
[
2.388999999999953,
1.343999999999994
],
[
1.418000000000006,
2.352000000000004
],
[
0,
3.061299999999989
],
[
-1.418999999999983,
2.389300000000006
],
[
-2.389999999999986,
1.343999999999994
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
0,
42.392
],
[
0,
0.6720000000000041
],
[
6.608000000000004,
0.6720000000000041
],
[
6.608000000000004,
36.512
],
[
24.639999999999986,
36.512
],
[
24.639999999999986,
42.392
],
[
0,
42.392
],
[
0,
42.392
],
[
0,
42.392
]
],
"i": [
[
0,
0
],
[
0,
13.90666666666666
],
[
-2.202666666666687,
0
],
[
0,
-11.94666666666666
],
[
-6.01066666666668,
0
],
[
0,
-1.959999999999994
],
[
8.21333333333331,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-13.90666666666667
],
[
2.202666666666687,
0
],
[
0,
11.94666666666667
],
[
6.01066666666668,
0
],
[
0,
1.959999999999994
],
[
-8.21333333333331,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
98.08047485351562,
-21.67217254638672
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999403953552,
99.99999403953552
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
246.681,
42.392
],
[
246.681,
0
],
[
253.009,
0
],
[
253.009,
18.032
],
[
252.001,
17.248
],
[
255.585,
12.936000000000007
],
[
261.297,
11.424000000000007
],
[
267.23299999999995,
12.88
],
[
271.265,
16.912000000000006
],
[
272.721,
22.792
],
[
272.721,
42.392
],
[
266.449,
42.392
],
[
266.449,
24.528000000000006
],
[
265.553,
20.664
],
[
263.201,
18.2
],
[
259.729,
17.304
],
[
256.25699999999995,
18.2
],
[
253.849,
20.664
],
[
253.009,
24.528000000000006
],
[
253.009,
42.392
],
[
246.681,
42.392
],
[
246.681,
42.392
],
[
246.681,
42.392
]
],
"i": [
[
0,
0
],
[
0,
14.13066666666667
],
[
-2.109333333333325,
0
],
[
0,
-6.010666666666665
],
[
0.3360000000000127,
0.2613333333333259
],
[
-1.643000000000029,
0.9706999999999937
],
[
-2.166000000000054,
0
],
[
-1.717999999999961,
-0.9706999999999937
],
[
-0.9710000000000036,
-1.717300000000009
],
[
0,
-2.202699999999993
],
[
0,
-6.533333333333331
],
[
2.090666666666721,
0
],
[
0,
5.954666666666668
],
[
0.59699999999998,
1.045299999999997
],
[
1.007999999999925,
0.5600000000000023
],
[
1.305999999999926,
0
],
[
1.045000000000073,
-0.5973000000000042
],
[
0.59699999999998,
-1.082700000000003
],
[
0,
-1.493300000000005
],
[
0,
-5.954666666666668
],
[
2.109333333333325,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-14.13066666666667
],
[
2.109333333333325,
0
],
[
0,
6.010666666666665
],
[
-0.3360000000000127,
-0.2613333333333259
],
[
0.7459999999999809,
-1.903999999999996
],
[
1.641999999999967,
-1.0080000000000098
],
[
2.240000000000009,
0
],
[
1.717000000000098,
0.9707000000000079
],
[
0.9700000000000273,
1.717299999999994
],
[
0,
6.533333333333331
],
[
-2.090666666666721,
0
],
[
0,
-5.954666666666668
],
[
0,
-1.5307000000000102
],
[
-0.5599999999999454,
-1.082700000000003
],
[
-1.008000000000038,
-0.5973000000000042
],
[
-1.270000000000095,
0
],
[
-1.007999999999953,
0.5600000000000023
],
[
-0.5600000000000023,
1.082700000000003
],
[
0,
5.954666666666668
],
[
-2.109333333333325,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-354.5325317382812,
-77.50520324707031
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
237.089,
42.72800000000001
],
[
229.697,
40.040000000000006
],
[
227.065,
32.48
],
[
227.065,
17.808000000000007
],
[
221.745,
17.808000000000007
],
[
221.745,
12.096
],
[
222.585,
12.096
],
[
225.889,
10.864
],
[
227.065,
7.504000000000005
],
[
227.065,
5.152000000000001
],
[
233.393,
5.152000000000001
],
[
233.393,
12.096
],
[
240.281,
12.096
],
[
240.281,
17.808000000000007
],
[
233.393,
17.808000000000007
],
[
233.393,
32.2
],
[
233.897,
34.888000000000005
],
[
235.521,
36.568
],
[
238.433,
37.128
],
[
239.441,
37.072
],
[
240.505,
36.96000000000001
],
[
240.505,
42.392
],
[
238.769,
42.616
],
[
237.089,
42.72800000000001
],
[
237.089,
42.72800000000001
],
[
237.089,
42.72800000000001
]
],
"i": [
[
0,
0
],
[
1.755000000000052,
1.792000000000002
],
[
0,
3.248000000000005
],
[
0,
4.890666666666661
],
[
1.773333333333369,
0
],
[
0,
1.903999999999996
],
[
-0.2800000000000296,
0
],
[
-0.7839999999999918,
0.8212999999999937
],
[
0,
1.4187000000000012
],
[
0,
0.7839999999999989
],
[
-2.109333333333325,
0
],
[
0,
-2.314666666666668
],
[
-2.295999999999992,
0
],
[
0,
-1.903999999999996
],
[
2.295999999999992,
0
],
[
0,
-4.797333333333327
],
[
-0.3360000000000127,
-0.7467000000000041
],
[
-0.7459999999999809,
-0.4106999999999914
],
[
-1.194000000000017,
0
],
[
-0.3729999999999905,
0.03730000000000189
],
[
-0.3360000000000127,
0.03729999999998768
],
[
0,
-1.810666666666663
],
[
0.6350000000000477,
-0.07469999999999288
],
[
0.48599999999999,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-3.173000000000002,
0
],
[
-1.753999999999962,
-1.792000000000002
],
[
0,
-4.890666666666661
],
[
-1.773333333333369,
0
],
[
0,
-1.903999999999996
],
[
0.2800000000000296,
0
],
[
1.418999999999983,
0
],
[
0.7839999999999918,
-0.8213000000000079
],
[
0,
-0.7839999999999989
],
[
2.109333333333325,
0
],
[
0,
2.314666666666668
],
[
2.295999999999992,
0
],
[
0,
1.903999999999996
],
[
-2.295999999999992,
0
],
[
0,
4.797333333333327
],
[
0,
1.045299999999997
],
[
0.3359999999999559,
0.7092999999999989
],
[
0.7470000000000141,
0.3733000000000004
],
[
0.2989999999999782,
0
],
[
0.3740000000000236,
-0.03730000000000189
],
[
0,
1.810666666666663
],
[
-0.5220000000000482,
0.0747000000000071
],
[
-0.6339999999999577,
0.0747000000000071
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-354.5325317382812,
-77.50520324707031
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
210.259,
7.951999999999998
],
[
210.259,
0.6720000000000041
],
[
216.587,
0.6720000000000041
],
[
216.587,
7.951999999999998
],
[
210.259,
7.951999999999998
],
[
210.259,
7.951999999999998
],
[
210.259,
7.951999999999998
]
],
"i": [
[
0,
0
],
[
0,
2.426666666666662
],
[
-2.109333333333325,
0
],
[
0,
-2.426666666666662
],
[
2.109333333333325,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-2.426666666666662
],
[
2.109333333333325,
0
],
[
0,
2.426666666666662
],
[
-2.109333333333325,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-354.5325317382812,
-77.50520324707031
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
210.259,
42.392
],
[
210.259,
12.096
],
[
216.587,
12.096
],
[
216.587,
42.392
],
[
210.259,
42.392
],
[
210.259,
42.392
],
[
210.259,
42.392
]
],
"i": [
[
0,
0
],
[
0,
10.09866666666667
],
[
-2.109333333333325,
0
],
[
0,
-10.09866666666667
],
[
2.109333333333325,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-10.09866666666666
],
[
2.109333333333325,
0
],
[
0,
10.09866666666666
],
[
-2.109333333333325,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-354.5325317382812,
-77.50520324707031
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
169.688,
42.392
],
[
159.272,
12.096
],
[
165.992,
12.096
],
[
173.944,
36.232
],
[
171.592,
36.232
],
[
179.712,
12.096
],
[
185.48,
12.096
],
[
193.544,
36.232
],
[
191.192,
36.232
],
[
199.2,
12.096
],
[
205.92,
12.096
],
[
195.448,
42.392
],
[
189.736,
42.392
],
[
181.56,
17.696
],
[
183.632,
17.696
],
[
175.456,
42.392
],
[
169.688,
42.392
],
[
169.688,
42.392
],
[
169.688,
42.392
]
],
"i": [
[
0,
0
],
[
3.47199999999998,
10.09866666666667
],
[
-2.240000000000009,
0
],
[
-2.650666666666666,
-8.045333333333332
],
[
0.7839999999999918,
0
],
[
-2.706666666666649,
8.045333333333332
],
[
-1.922666666666657,
0
],
[
-2.687999999999988,
-8.045333333333332
],
[
0.7839999999999918,
0
],
[
-2.669333333333327,
8.045333333333332
],
[
-2.240000000000009,
0
],
[
3.490666666666641,
-10.09866666666667
],
[
1.903999999999996,
0
],
[
2.725333333333367,
8.232
],
[
-0.6906666666666865,
0
],
[
2.72533333333331,
-8.232
],
[
1.922666666666657,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-3.47199999999998,
-10.09866666666666
],
[
2.240000000000009,
0
],
[
2.650666666666666,
8.045333333333332
],
[
-0.7839999999999918,
0
],
[
2.706666666666649,
-8.045333333333332
],
[
1.922666666666657,
0
],
[
2.687999999999988,
8.045333333333332
],
[
-0.7839999999999918,
0
],
[
2.669333333333327,
-8.045333333333332
],
[
2.240000000000009,
0
],
[
-3.490666666666641,
10.09866666666666
],
[
-1.903999999999996,
0
],
[
-2.725333333333367,
-8.232
],
[
0.6906666666666865,
0
],
[
-2.72533333333331,
8.232
],
[
-1.922666666666657,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-354.5325317382812,
-77.50520324707031
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
155.86146545410156,
56.001014709472656
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999403953552,
99.99999403953552
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
132.444,
43.06400000000001
],
[
124.38,
40.992
],
[
118.948,
35.28
],
[
116.988,
27.16
],
[
118.948,
19.040000000000006
],
[
124.324,
13.49600000000001
],
[
131.94,
11.424000000000007
],
[
138.044,
12.600000000000009
],
[
142.58,
15.848
],
[
145.38,
20.49600000000001
],
[
146.388,
26.096
],
[
146.332,
27.608
],
[
146.108,
29.064000000000007
],
[
121.972,
29.064000000000007
],
[
121.972,
24.024
],
[
142.524,
24.024
],
[
139.5,
26.320000000000007
],
[
139.108,
21.448000000000008
],
[
136.308,
18.032
],
[
131.94,
16.744
],
[
127.46,
18.032
],
[
124.436,
21.616
],
[
123.596,
27.216000000000008
],
[
124.436,
32.592
],
[
127.684,
36.176
],
[
132.5,
37.464
],
[
137.148,
36.232
],
[
140.228,
33.040000000000006
],
[
145.38,
35.56
],
[
142.58,
39.42400000000001
],
[
138.1,
42.11200000000001
],
[
132.444,
43.06400000000001
],
[
132.444,
43.06400000000001
],
[
132.444,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
2.351999999999975,
1.381299999999996
],
[
1.305999999999983,
2.389300000000006
],
[
0,
2.986699999999999
],
[
-1.307000000000016,
2.35199999999999
],
[
-2.240000000000009,
1.343999999999994
],
[
-2.838000000000022,
0
],
[
-1.79200000000003,
-0.784000000000006
],
[
-1.232000000000028,
-1.381299999999996
],
[
-0.6350000000000477,
-1.754700000000014
],
[
0,
-1.978700000000003
],
[
0.03699999999997772,
-0.5227000000000004
],
[
0.1120000000000232,
-0.4480000000000075
],
[
8.045333333333303,
0
],
[
0,
1.680000000000007
],
[
-6.850666666666655,
0
],
[
1.007999999999981,
-0.7653333333333308
],
[
0.6340000000000146,
1.4187000000000012
],
[
1.269000000000005,
0.8213000000000079
],
[
1.67999999999995,
0
],
[
1.305999999999983,
-0.8586999999999989
],
[
0.7090000000000032,
-1.567999999999998
],
[
-0.1499999999999773,
-2.202700000000007
],
[
-0.7470000000000141,
-1.530699999999996
],
[
-1.382000000000005,
-0.8586999999999989
],
[
-1.791999999999973,
0
],
[
-1.269999999999982,
0.8213000000000079
],
[
-0.7469999999999573,
1.306699999999992
],
[
-1.717333333333329,
-0.8400000000000034
],
[
1.269000000000005,
-1.157300000000006
],
[
1.754000000000019,
-0.6720000000000113
],
[
2.052999999999997,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-3.024000000000001,
0
],
[
-2.314999999999998,
-1.4187000000000012
],
[
-1.307000000000016,
-2.426699999999997
],
[
0,
-3.061299999999989
],
[
1.343999999999994,
-2.352000000000004
],
[
2.240000000000009,
-1.3813000000000102
],
[
2.276999999999987,
0
],
[
1.791999999999973,
0.7839999999999918
],
[
1.231999999999971,
1.344000000000008
],
[
0.6719999999999686,
1.7547
],
[
0,
0.4852999999999952
],
[
-0.03800000000001091,
0.5227000000000004
],
[
-8.045333333333303,
0
],
[
0,
-1.680000000000007
],
[
6.850666666666655,
0
],
[
-1.007999999999981,
0.7653333333333308
],
[
0.3730000000000473,
-1.829300000000003
],
[
-0.5979999999999563,
-1.456000000000003
],
[
-1.232000000000028,
-0.8586999999999989
],
[
-1.680000000000007,
0
],
[
-1.307000000000016,
0.8213000000000079
],
[
-0.7100000000000364,
1.530699999999996
],
[
-0.186999999999955,
2.053299999999993
],
[
0.7839999999999918,
1.53070000000001
],
[
1.418000000000006,
0.8586999999999989
],
[
1.829000000000008,
0
],
[
1.305999999999983,
-0.8212999999999937
],
[
1.717333333333329,
0.8400000000000034
],
[
-0.5980000000000132,
1.4187000000000012
],
[
-1.232000000000028,
1.11999999999999
],
[
-1.718000000000018,
0.6346999999999952
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-211.7300415039062,
-77.67320251464844
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
95.32,
37.184
],
[
100.024,
35.896
],
[
103.328,
32.36800000000001
],
[
104.56,
27.216000000000008
],
[
103.328,
22.12
],
[
100.024,
18.592
],
[
95.32,
17.304
],
[
90.56,
18.592
],
[
87.256,
22.12
],
[
86.08000000000001,
27.216000000000008
],
[
87.256,
32.36800000000001
],
[
90.50399999999999,
35.896
],
[
95.32,
37.184
],
[
95.32,
37.184
],
[
95.32,
37.184
]
],
"i": [
[
0,
0
],
[
-1.381,
0.8586999999999989
],
[
-0.7839999999999918,
1.493299999999991
],
[
0,
1.903999999999996
],
[
0.820999999999998,
1.493299999999991
],
[
1.419000000000011,
0.8586999999999989
],
[
1.754999999999995,
0
],
[
1.418999999999983,
-0.8586999999999989
],
[
0.7839999999999918,
-1.493300000000005
],
[
0,
-1.904000000000011
],
[
-0.7839999999999918,
-1.5307000000000102
],
[
-1.381,
-0.8586999999999989
],
[
-1.792000000000002,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
1.754999999999995,
0
],
[
1.419000000000011,
-0.8586999999999989
],
[
0.820999999999998,
-1.5307000000000102
],
[
0,
-1.904000000000011
],
[
-0.7839999999999918,
-1.493300000000005
],
[
-1.381,
-0.8586999999999989
],
[
-1.754999999999995,
0
],
[
-1.419000000000011,
0.8586999999999989
],
[
-0.7839999999999918,
1.493299999999991
],
[
0,
1.903999999999996
],
[
0.7839999999999918,
1.493299999999991
],
[
1.419000000000011,
0.8586999999999989
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-211.7300415039062,
-77.67320251464844
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
94.70400000000001,
43.06400000000001
],
[
86.864,
40.992
],
[
81.43199999999999,
35.28
],
[
79.47200000000001,
27.216000000000008
],
[
81.488,
19.152
],
[
86.91999999999999,
13.49600000000001
],
[
94.648,
11.424000000000007
],
[
101.088,
12.88
],
[
105.512,
16.912000000000006
],
[
104.56,
18.36800000000001
],
[
104.56,
0
],
[
110.832,
0
],
[
110.832,
42.392
],
[
104.84,
42.392
],
[
104.84,
36.232
],
[
105.568,
37.408
],
[
101.088,
41.608
],
[
94.70400000000001,
43.06400000000001
],
[
94.70400000000001,
43.06400000000001
],
[
94.70400000000001,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
2.314999999999998,
1.381299999999996
],
[
1.344000000000023,
2.389300000000006
],
[
0,
2.986699999999999
],
[
-1.343999999999994,
2.389300000000006
],
[
-2.276999999999987,
1.381299999999996
],
[
-2.875,
0
],
[
-1.8669999999999902,
-0.9706999999999937
],
[
-1.082999999999998,
-1.717300000000009
],
[
0.3173333333333233,
-0.4853333333333296
],
[
0,
6.122666666666674
],
[
-2.090666666666664,
0
],
[
0,
-14.13066666666667
],
[
1.99733333333333,
0
],
[
0,
2.053333333333327
],
[
-0.242666666666679,
-0.3919999999999959
],
[
1.941000000000003,
-0.9707000000000079
],
[
2.314999999999998,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-2.912000000000006,
0
],
[
-2.277000000000015,
-1.4187000000000012
],
[
-1.306999999999988,
-2.389300000000006
],
[
0,
-2.986699999999999
],
[
1.343999999999994,
-2.389300000000006
],
[
2.277000000000015,
-1.3813000000000102
],
[
2.426999999999992,
0
],
[
1.867000000000019,
0.9707000000000079
],
[
-0.3173333333333233,
0.4853333333333296
],
[
0,
-6.122666666666674
],
[
2.090666666666664,
0
],
[
0,
14.13066666666667
],
[
-1.99733333333333,
0
],
[
0,
-2.053333333333327
],
[
0.242666666666679,
0.3919999999999959
],
[
-1.045000000000016,
1.829300000000003
],
[
-1.941000000000003,
0.9706999999999937
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-211.7300415039062,
-77.67320251464844
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
57.40100000000001,
43.06400000000001
],
[
51.968999999999994,
42
],
[
48.38499999999999,
38.976
],
[
47.09700000000001,
34.384
],
[
48.161,
29.960000000000008
],
[
51.577,
26.656000000000006
],
[
57.345,
24.752
],
[
67.87299999999999,
23.016000000000005
],
[
67.87299999999999,
28
],
[
58.577,
29.624
],
[
54.881,
31.248
],
[
53.70500000000001,
34.16
],
[
54.992999999999995,
37.016000000000005
],
[
58.40899999999999,
38.08
],
[
62.88900000000001,
36.96000000000001
],
[
65.91300000000001,
33.992
],
[
66.977,
29.792
],
[
66.977,
22.008
],
[
65.297,
18.36800000000001
],
[
60.929,
16.912000000000006
],
[
56.505,
18.256
],
[
53.761,
21.616
],
[
48.496999999999986,
18.98400000000001
],
[
51.240999999999985,
15.064000000000007
],
[
55.66499999999999,
12.376
],
[
61.09700000000001,
11.424000000000007
],
[
67.42500000000001,
12.768
],
[
71.737,
16.52
],
[
73.305,
22.008
],
[
73.305,
42.392
],
[
67.257,
42.392
],
[
67.257,
36.904
],
[
68.54499999999999,
37.072
],
[
65.80099999999999,
40.264
],
[
62.04900000000001,
42.336
],
[
57.40100000000001,
43.06400000000001
],
[
57.40100000000001,
43.06400000000001
],
[
57.40100000000001,
43.06400000000001
]
],
"i": [
[
0,
0
],
[
1.568000000000012,
0.7092999999999989
],
[
0.8590000000000089,
1.2693000000000012
],
[
0,
1.7547
],
[
-0.7090000000000032,
1.306699999999992
],
[
-1.531000000000006,
0.8960000000000008
],
[
-2.314999999999998,
0.3733000000000004
],
[
-3.509333333333331,
0.5786666666666633
],
[
0,
-1.661333333333332
],
[
3.098666666666674,
-0.541333333333327
],
[
0.7839999999999918,
-0.784000000000006
],
[
0,
-1.194699999999997
],
[
-0.8590000000000089,
-0.7467000000000041
],
[
-1.381,
0
],
[
-1.269000000000005,
0.7466999999999899
],
[
-0.7090000000000032,
1.2319999999999993
],
[
0,
1.530699999999996
],
[
0,
2.594666666666669
],
[
1.120000000000005,
0.9332999999999885
],
[
1.829000000000008,
0
],
[
1.269000000000005,
-0.8960000000000008
],
[
0.5970000000000084,
-1.381299999999996
],
[
1.754666666666679,
0.8773333333333255
],
[
-1.268999999999977,
1.11999999999999
],
[
-1.680000000000007,
0.6346999999999952
],
[
-1.903999999999996,
0
],
[
-1.829000000000008,
-0.8960000000000008
],
[
-1.0080000000000098,
-1.6053
],
[
0,
-2.090699999999998
],
[
0,
-6.794666666666672
],
[
2.015999999999991,
0
],
[
0,
1.829333333333338
],
[
-0.429333333333318,
-0.05599999999999739
],
[
1.120000000000005,
-0.8959999999999866
],
[
1.418999999999983,
-0.4852999999999952
],
[
1.716999999999985,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
-2.053000000000026,
0
],
[
-1.531000000000006,
-0.7467000000000041
],
[
-0.8589999999999804,
-1.306699999999992
],
[
0,
-1.642700000000005
],
[
0.7469999999999857,
-1.306700000000006
],
[
1.531000000000006,
-0.8960000000000008
],
[
3.509333333333331,
-0.5786666666666633
],
[
0,
1.661333333333332
],
[
-3.098666666666674,
0.541333333333327
],
[
-1.680000000000007,
0.2987000000000108
],
[
-0.7839999999999918,
0.7467000000000041
],
[
0,
1.157300000000006
],
[
0.896000000000015,
0.7092999999999989
],
[
1.717000000000013,
0
],
[
1.306999999999988,
-0.7467000000000041
],
[
0.7089999999999748,
-1.2693000000000012
],
[
0,
-2.594666666666669
],
[
0,
-1.493299999999991
],
[
-1.082999999999998,
-0.9707000000000079
],
[
-1.680000000000007,
0
],
[
-1.2319999999999993,
0.8586999999999989
],
[
-1.754666666666679,
-0.8773333333333255
],
[
0.5600000000000023,
-1.493300000000005
],
[
1.269000000000005,
-1.157300000000006
],
[
1.717000000000013,
-0.6347000000000094
],
[
2.388999999999982,
0
],
[
1.86699999999999,
0.8960000000000008
],
[
1.045000000000016,
1.568000000000012
],
[
0,
6.794666666666672
],
[
-2.015999999999991,
0
],
[
0,
-1.829333333333338
],
[
0.429333333333318,
0.05599999999999739
],
[
-0.7089999999999748,
1.2319999999999993
],
[
-1.082999999999998,
0.8960000000000008
],
[
-1.381,
0.4853000000000094
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-211.7300415039062,
-77.67320251464844
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"v": [
[
0,
42.392
],
[
0,
0.6720000000000041
],
[
6.159999999999997,
0.6720000000000041
],
[
21.84,
22.400000000000006
],
[
18.75999999999999,
22.400000000000006
],
[
34.16,
0.6720000000000041
],
[
40.31999999999999,
0.6720000000000041
],
[
40.31999999999999,
42.392
],
[
33.768,
42.392
],
[
33.768,
8.456000000000003
],
[
36.232,
9.128
],
[
20.49600000000001,
30.632000000000005
],
[
19.824000000000012,
30.632000000000005
],
[
4.424000000000007,
9.128
],
[
6.608000000000004,
8.456000000000003
],
[
6.608000000000004,
42.392
],
[
0,
42.392
],
[
0,
42.392
],
[
0,
42.392
]
],
"i": [
[
0,
0
],
[
0,
13.90666666666666
],
[
-2.053333333333342,
0
],
[
-5.226666666666659,
-7.242666666666665
],
[
1.026666666666671,
0
],
[
-5.133333333333326,
7.242666666666672
],
[
-2.053333333333342,
0
],
[
0,
-13.90666666666667
],
[
2.183999999999997,
0
],
[
0,
11.312
],
[
-0.8213333333333424,
-0.2240000000000038
],
[
5.245333333333321,
-7.168000000000006
],
[
0.2239999999999895,
0
],
[
5.133333333333326,
7.168000000000006
],
[
-0.7280000000000086,
0.2240000000000038
],
[
0,
-11.312
],
[
2.202666666666659,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
-13.90666666666667
],
[
2.053333333333342,
0
],
[
5.226666666666659,
7.242666666666672
],
[
-1.026666666666671,
0
],
[
5.133333333333326,
-7.242666666666665
],
[
2.053333333333342,
0
],
[
0,
13.90666666666666
],
[
-2.183999999999997,
0
],
[
0,
-11.312
],
[
0.8213333333333424,
0.2240000000000038
],
[
-5.245333333333321,
7.168000000000006
],
[
-0.2239999999999895,
0
],
[
-5.133333333333326,
-7.168000000000006
],
[
0.7280000000000086,
-0.2240000000000038
],
[
0,
11.312
],
[
-2.202666666666659,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
]
}
}
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
-211.7300415039062,
-77.67320251464844
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
1,
1,
1
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
2.91259765625,
56.001014709472656
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999403953552,
99.99999403953552
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "gr",
"it": [
{
"ty": "rc",
"d": 1,
"s": {
"a": 0,
"k": [
702.6863719370097,
144
],
"ix": 2
},
"p": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"r": {
"a": 0,
"k": 72,
"ix": 2
}
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"r": 1,
"bm": 0
},
{
"ty": "tm",
"s": {
"a": 0,
"k": 0,
"ix": 2
},
"e": {
"a": 0,
"k": 100,
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 2
},
"m": 1
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
56.54167175292969,
-0.000022762338630855083
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999403953552,
99.99999403953552
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 80,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
122.0000003294881,
25.00000012138912
],
"ix": 2
},
"a": {
"a": 0,
"k": [
56.54167175292969,
-0.00002288818359375
],
"ix": 2
},
"s": {
"a": 0,
"k": [
34.403572049765366,
34.403572049765366
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
}
]
}
],
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 83,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
145.48500061035156,
146.33499145507812
],
"ix": 2
},
"a": {
"a": 0,
"k": [
95,
93
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "0",
"w": 190,
"h": 186,
"ind": 84,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
95,
93
],
"ix": 2
},
"a": {
"a": 0,
"k": [
95,
93
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
50,
50
],
"i": {
"x": [
0
],
"y": [
1
]
},
"o": {
"x": [
0
],
"y": [
0
]
}
},
{
"t": 55,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0
],
"i": {
"x": [
0
],
"y": [
1
]
},
"o": {
"x": [
0
],
"y": [
0
]
}
},
{
"t": 55,
"s": [
100
],
"h": 1
},
{
"t": 400,
"s": [
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 83
},
{
"ddd": 0,
"ind": 85,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
58.316001892089844,
79.31600189208984
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.00000116575909,
100.00000116575907
],
"ix": 2
},
"r": {
"a": 0,
"k": 10.790000113374926,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "2",
"w": 39,
"h": 39,
"ind": 86,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 79,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 117,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 79,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 117,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 85
},
{
"ddd": 0,
"ind": 87,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
268.1695861816406,
229.5001678466797
],
"ix": 2
},
"a": {
"a": 0,
"k": [
31.575000286102295,
34.45449924468994
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999997424318,
99.99999997424318
],
"ix": 2
},
"r": {
"a": 0,
"k": 123.08999825645346,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "4",
"w": 90,
"h": 92,
"ind": 88,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
31.15,
35.909
],
"ix": 2
},
"a": {
"a": 0,
"k": [
44.15,
48.909
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
50,
50
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 161,
"s": [
50,
50
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 211,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0
],
"h": 1
},
{
"t": 161,
"s": [
0
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 211,
"s": [
100
],
"h": 1
},
{
"t": 400,
"s": [
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 87
},
{
"ddd": 0,
"ind": 89,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
194.92755126953125,
52.66899490356445
],
"ix": 2
},
"a": {
"a": 0,
"k": [
31.825000286102295,
35.45449924468994
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.00000024333974,
100.00000024333974
],
"ix": 2
},
"r": {
"a": 0,
"k": 16.80000035671566,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "12",
"w": 83,
"h": 88,
"ind": 90,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
31.15,
35.909
],
"ix": 2
},
"a": {
"a": 0,
"k": [
40.15,
44.909
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
50,
50
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 117,
"s": [
50,
50
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 167,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0
],
"h": 1
},
{
"t": 117,
"s": [
0
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 167,
"s": [
100
],
"h": 1
},
{
"t": 400,
"s": [
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 89
},
{
"ddd": 0,
"ind": 91,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
29.315000534057617,
142.31500244140625
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.315000534057617,
19.315000534057617
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.00000266711488,
100.00000266711491
],
"ix": 2
},
"r": {
"a": 0,
"k": 9.969999687139088,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "20",
"w": 39,
"h": 39,
"ind": 92,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.315,
19.315
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.315,
19.315
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 64,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 102,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 64,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 102,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 91
},
{
"ddd": 0,
"ind": 93,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
73.31600189208984,
29.31599998474121
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999809893677,
99.99999809893679
],
"ix": 2
},
"r": {
"a": 0,
"k": 8.22000011631331,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "22",
"w": 39,
"h": 39,
"ind": 94,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 91,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 129,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 91,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 129,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 93
},
{
"ddd": 0,
"ind": 95,
"ty": 3,
"nm": "Group 1",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
127.947998046875,
220.1580047607422
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999797104884,
99.99999797104884
],
"ix": 2
},
"r": {
"a": 0,
"k": -10.250000042866644,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "25",
"w": 38.6317,
"h": 38.6317,
"ind": 96,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 48,
"s": [
1,
1
],
"i": {
"x": [
0
],
"y": [
1
]
},
"o": {
"x": [
0.5
],
"y": [
0
]
}
},
{
"t": 86,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"h": 1
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 48,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 86,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"h": 1
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 95
},
{
"ddd": 0,
"ind": 97,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
155.48500061035156,
263.6180114746094
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "27",
"w": 39,
"h": 39,
"ind": 98,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 38,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 76,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 38,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 76,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 97
},
{
"ddd": 0,
"ind": 99,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
213.13099670410156,
259.9649963378906
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
100.0000004551171,
100.00000045511712
],
"ix": 2
},
"r": {
"a": 0,
"k": 6.83999986588411,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "30",
"w": 39,
"h": 39,
"ind": 100,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 26,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 64,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 26,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 64,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 99
},
{
"ddd": 0,
"ind": 101,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
265.67999267578125,
168.156005859375
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999885890291,
99.99999885890293
],
"ix": 2
},
"r": {
"a": 0,
"k": -13.500000003802489,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "32",
"w": 39,
"h": 39,
"ind": 102,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 17,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 55,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 17,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 55,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 101
},
{
"ddd": 0,
"ind": 103,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
50.02820587158203,
217.27655029296875
],
"ix": 2
},
"a": {
"a": 0,
"k": [
30.825000286102295,
33.70449924468994
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999953474834,
99.99999953474834
],
"ix": 2
},
"r": {
"a": 0,
"k": -132.19999831142374,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "36",
"w": 91,
"h": 91,
"ind": 104,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
31.15,
35.909
],
"ix": 2
},
"a": {
"a": 0,
"k": [
46.15,
49.909
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
50,
50
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 136,
"s": [
50,
50
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 186,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 0,
"k": 0,
"ix": 2
},
"o": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0
],
"h": 1
},
{
"t": 136,
"s": [
0
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 186,
"s": [
100
],
"h": 1
},
{
"t": 400,
"s": [
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 103
},
{
"ddd": 0,
"ind": 105,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
245.0240020751953,
79.51000213623047
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999789196237,
99.99999789196237
],
"ix": 2
},
"r": {
"a": 0,
"k": 14.480000876980029,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "44",
"w": 39,
"h": 39,
"ind": 106,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 38,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 38,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 105
},
{
"ddd": 0,
"ind": 107,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
266.593994140625,
120.45700073242188
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.9999982762619,
99.99999827626189
],
"ix": 2
},
"r": {
"a": 0,
"k": 7.150000132583977,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "48",
"w": 39,
"h": 39,
"ind": 108,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 8,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 45,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 8,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 45,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 107
},
{
"ddd": 0,
"ind": 109,
"ty": 3,
"nm": "Group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
130.57200622558594,
28.25
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.31599998474121,
19.31599998474121
],
"ix": 2
},
"s": {
"a": 0,
"k": [
99.99999872617904,
99.99999872617906
],
"ix": 2
},
"r": {
"a": 0,
"k": -8.0700003209305,
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"refId": "50",
"w": 39,
"h": 39,
"ind": 110,
"ty": 0,
"nm": "Clipped group",
"sr": 1,
"ks": {
"p": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"a": {
"a": 0,
"k": [
19.316,
19.316
],
"ix": 2
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
1,
1
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 104,
"s": [
1,
1
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 142,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
},
{
"t": 400,
"s": [
100,
100
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"r": {
"a": 1,
"k": [
{
"t": 0,
"s": [
-45
],
"h": 1
},
{
"t": 104,
"s": [
-45
],
"o": {
"x": [
0.5
],
"y": [
0
]
},
"i": {
"x": [
0
],
"y": [
1
]
}
},
{
"t": 142,
"s": [
0
],
"h": 1
},
{
"t": 400,
"s": [
0
],
"i": {
"x": [
0.75
],
"y": [
0.75
]
},
"o": {
"x": [
0.25
],
"y": [
0.25
]
}
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 100,
"ix": 2
},
"sk": {
"a": 0,
"k": 0,
"ix": 2
},
"sa": {
"a": 0,
"k": 0,
"ix": 2
}
},
"ao": 0,
"ip": 0,
"op": 401,
"st": 0,
"bm": 0,
"parent": 109
}
],
"markers": []
}
================================================
FILE: assets/lotties/qr-code.json
================================================
{"assets":[{"h":96,"id":"0","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"h":112,"id":"1","p":"data:image/png;base64,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","u":"","w":99,"e":1},{"id":"20","layers":[{"ind":19,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16.5,15]},"r":{"a":0,"k":0},"s":{"a":0,"k":[33,30]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],"o":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],"v":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],"o":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],"v":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"25","layers":[{"ind":24,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[13.5,11.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[27,23]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],"o":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],"v":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],"o":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],"v":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{"ty":"fl","c":{"a":0,"k":[0.49,0.79,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"34","layers":[{"ind":33,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],"v":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"39","layers":[{"ind":38,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"44","layers":[{"ind":43,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"49","layers":[{"ind":48,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"54","layers":[{"ind":53,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"59","layers":[{"ind":58,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[5.5,3]},"r":{"a":0,"k":0},"s":{"a":0,"k":[11,6]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],"o":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"62","layers":[{"ind":36,"ty":0,"parent":32,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"34"},{"ind":32,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[17.594,5.138]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":41,"ty":0,"parent":37,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"39"},{"ind":37,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.134,17.416]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":46,"ty":0,"parent":42,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"44"},{"ind":42,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.225,5.047]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":51,"ty":0,"parent":47,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"49"},{"ind":47,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[20.992,21.292]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":56,"ty":0,"parent":52,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"54"},{"ind":52,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[14.69,20.761]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":61,"ty":0,"parent":57,"ks":{},"w":11,"h":6,"ip":0,"op":120.4,"st":0,"refId":"59"},{"ind":57,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[5.5,3]},"p":{"a":0,"k":[17.282,14.474]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":31,"ty":3,"ks":{"p":{"a":0,"k":[2.572,2.572]}},"ip":0,"op":120.4,"st":0}]},{"id":"72","layers":[{"ind":71,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"77","layers":[{"ind":76,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"83","layers":[{"ind":82,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"88","layers":[{"ind":87,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"93","layers":[{"ind":92,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":7,"ty":2,"parent":6,"ks":{"s":{"a":0,"k":[33.33,33.33]}},"ip":0,"op":120.4,"st":0,"refId":"0"},{"ind":6,"ty":3,"parent":5,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"a":{"a":0,"k":[21.5,16]},"p":{"a":0,"k":[21.5,16]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":4,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[138,40]}},"ip":0,"op":120.4,"st":0},{"ind":12,"ty":4,"parent":11,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[4.375,4.375]},"s":{"a":0,"k":[8.75,8.75]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":11,"ty":3,"parent":10,"ks":{"p":{"a":0,"k":[8.422,7.292]}},"ip":0,"op":120.4,"st":0},{"ind":14,"ty":2,"parent":13,"ks":{"s":{"a":0,"k":[33.33,33.04]}},"ip":0,"op":120.4,"st":0,"refId":"1"},{"ind":13,"ty":3,"parent":10,"ks":{"a":{"a":0,"k":[16.5,18.5]},"p":{"a":0,"k":[12.538,14.893]},"r":{"a":0,"k":12.68}},"ip":0,"op":120.4,"st":0},{"ind":10,"ty":3,"parent":9,"ks":{"a":{"a":0,"k":[13.037,14.939]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":0,"k":-12.68}},"ip":0,"op":120.4,"st":0},{"ind":9,"ty":3,"parent":8,"ks":{"a":{"a":0,"k":[15.997,17.436]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":8,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[87,28]}},"ip":0,"op":120.4,"st":0},{"ind":22,"ty":0,"parent":18,"ks":{},"w":33,"h":30,"ip":0,"op":120.4,"st":0,"refId":"20"},{"ind":18,"ty":3,"parent":17,"ks":{"a":{"a":0,"k":[16.5,15]},"p":{"a":0,"k":[15.953,14.392]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":27,"ty":0,"parent":23,"ks":{},"w":27,"h":23,"ip":0,"op":120.4,"st":0,"refId":"25"},{"ind":23,"ty":3,"parent":17,"ks":{"a":{"a":0,"k":[13.5,11.5]},"p":{"a":0,"k":[15.873,14.886]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":17,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[15.3,15.3]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":0,"k":-9.18}},"ip":0,"op":120.4,"st":0},{"ind":16,"ty":3,"parent":15,"ks":{"a":{"a":0,"k":[17.544,17.544]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":15,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[7,49]}},"ip":0,"op":120.4,"st":0},{"ind":64,"ty":0,"parent":30,"ks":{"a":{"a":0,"k":[2.286,2.286]},"p":{"a":0,"k":[2.286,2.286]}},"w":27.4286,"h":27.4286,"ip":0,"op":120.4,"st":0,"refId":"62"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[2.286,2.286]}},"ip":0,"op":120.4,"st":0},{"ind":66,"ty":4,"parent":65,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16,16]},"r":{"a":0,"k":6.857},"s":{"a":0,"k":[32,32]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":65,"ty":3,"parent":29,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"a":{"a":0,"k":[16,16]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":0,"k":13.62}},"ip":0,"op":120.4,"st":0},{"ind":28,"ty":3,"parent":3,"ks":{"a":{"a":0,"k":[19.317,19.317]},"p":{"a":1,"k":[{"t":0,"s":[60.317,29.317],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":8.7,"s":[60.317,29.317],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":61.2,"s":[102.317,92.317],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[102.317,92.317],"h":1}]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":8.7,"s":[0],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":61.2,"s":[-14],"h":1},{"t":119.4,"s":[-14],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":8.7,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":61.2,"s":[400,400],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[400,400],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":74,"ty":0,"parent":70,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"72"},{"ind":70,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[4.974,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":79,"ty":0,"parent":75,"ks":{},"w":28,"h":29,"ip":0,"op":120.4,"st":0,"refId":"77"},{"ind":75,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":69,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":85,"ty":0,"parent":81,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"83"},{"ind":81,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[4.474,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":90,"ty":0,"parent":86,"ks":{},"w":29,"h":29,"ip":0,"op":120.4,"st":0,"refId":"88"},{"ind":86,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":80,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":95,"ty":0,"parent":91,"ks":{},"w":129,"h":127,"ip":0,"op":120.4,"st":0,"refId":"93"},{"ind":91,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":120.4,"st":0},{"ind":68,"ty":3,"parent":67,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":0,"k":[67.649,55.9]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":25.2,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":25.2,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":67,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[32.926,63.56]}},"ip":0,"op":120.4,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":2,"ty":3,"ks":{},"ip":0,"op":120.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":119.4,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/school-services.json
================================================
{"assets":[{"h":84,"id":"0","p":"data:image/png;base64,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","u":"","w":84,"e":1},{"h":84,"id":"1","p":"data:image/png;base64,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","u":"","w":84,"e":1},{"h":42,"id":"2","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASBSURBVHgB7ZltaFtVGMf/N/emWV66pGFpm25NWaZ1VqpTYVK6oRNfcA4Gqx9FkX1R8NPQ+U1BQeqHIRPdB0WmQ9icuMmc+kFlrdMNlMIQ67razdY2Xds1TdvkJrkvOdfn3jn7luSeLknZoH+4JPfek5PfeZ7n/M/JjVD72WsGbnkJnzhwm2gVtNxaBS23lgXqcSiol9IwIGClJfE2DBHgqcbj2OCcwankHXhnsh1DWmDFkLkj+oTvMqJVU6gScnhm7SX8Fv0Yr4d+BlshVC5QRseLgZ5FVwW8HPyVovwFvAJDpcUFGhVn0eyK573X5vkHr4a6UOnljQu0UZoGiqT4pZoLeIpKo5LiAt0opG3bvF37k1W/lRLfZGIMzIZhvTOB7Z5hVEpcoAO5tVBl+2jt8A4Wve8QDLK5DFncNA1s1soArydz+eiA4YeWZnD5RAhFhnaXa9KaVPO/2jzfsuYqXgj8ga3uYYKUCVCFYQhIMh8uKH78kNqME8k7Mal7UBLoGKvGsL4OkXgcvlDhj/gdumVl4n/nZtTerO3GLl//InwBAp36xRQe9phHDPuC59Ex0oFeJZS3b67Um42OaK1gmgF5UjdLNq/SxlyHEUrv6cgxgvwL4EhvDa18YRpYMQYufa7dh1EWRE41kJ7QrdfFmtDdFlKdlMKJyHE00CuvZpgbZ+UmlAyaNlzYl91JqXVQRK9HNjuzcIKdTLZYNXmg7gx5Lz+kqcNTD0AxpNJBTfXk1uOQ2ma9F50CRNdcSs01f0gNkvFfweNWuvk1qPpwaOrBom24JlONqNJG5CK2eYaw2XUNPlGCw7Gw7noyYVxSa/BB+DssR1m9CvtHd2LGkG4e1EzjkxShg/XfIyjK8+4snRxHrt2DRz1/o8U18f81s44FSaBB5embyieTEvHWVDu6lQ2wU1HQ3dX9+Kjha9jN2pGEB6ezd+PD4MkF1zOJHK1oBhzO67CmB5uDZxowTul+RXka5/Qm8KggaL0zSR7YZQupyAzvJtpQTSb+kGtsYeduB9RUzrK1G46Wokl5VLsX76ntyNJ7XhUEfd7fi7DNzFVSDL3TQXyqbcEuaQBuScX8gbl8DpyXw/hTDSPOPDijR3HFCBIg9w8Le9DWNWMFP2RQeExrmki7sTfdQSuRgVYxtqSdmerIOgV7B9shM/7o5VNBezoab8FV2QemGxaYWfw5SqEJmBzX8G2yGbvl5zBK+wBTPmStNou1iVaozroulKqCEf0m04xzsSa0SDHscV6EX8ggzZy4zEL4Ud+EvlwtdMz3UdGqxXzaU92H/eOPIFNCVIsWS4KK/Rctah126mMN0PWe/F9C27kd3hhlwb6fQirbA4ivaKIkVFfBqNZLsyhFZQM1reZ9hSwnlX+DrRoiSlFZH+kc0+7H4VnaXCSXwp5NN6IUlRU0S1F7I/sYDsTbIKfmuu5XA7TxCKAULd95bWQm+KCyDV+OtuJZ7+/Y6JXRmdha8vOUsoPe0Aj5a2dqO62ZKItWn4+WW6ug5dZtAyqZfzbhFhf9POv+F7NtpNQ3hR5HAAAAAElFTkSuQmCC","u":"","w":42,"e":1},{"id":"8","layers":[{"ind":7,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[11.5,12]},"r":{"a":0,"k":0},"s":{"a":0,"k":[23,24]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.06,-1.04],[1.39,0],[0,0],[0,1.6],[-0.02,0.8],[0.21,0.69],[0.63,-2.06],[-0.01,-0.61],[0,-0.89],[1.6,0],[0,0],[0.07,1.39],[-0.3,0.91],[0.32,1.05],[-0.98,0.66],[0,0],[-0.98,-0.65],[0,0],[0.35,-1.14],[-0.57,-1.71]],"o":[[0.31,0.91],[-0.07,1.39],[0,0],[-1.6,0],[0,-0.89],[0.01,-0.61],[-0.63,-2.06],[-0.21,0.69],[0.02,0.8],[0,1.6],[0,0],[-1.39,0],[-0.06,-1.04],[0.57,-1.71],[-0.35,-1.14],[0,0],[0.98,-0.65],[0,0],[0.98,0.66],[-0.32,1.05],[0,0]],"v":[[16.63,12.18],[16.91,15.32],[14.23,17.7],[13.98,17.7],[11.07,14.81],[11.09,12.18],[10.75,10.2],[6.8,10.2],[6.46,12.18],[6.48,14.81],[3.57,17.7],[3.32,17.7],[0.64,15.32],[0.92,12.18],[1.03,7.98],[1.87,4.75],[7.15,1.23],[10.4,1.23],[15.68,4.75],[16.52,7.98],[16.63,12.18]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"11","layers":[{"ind":10,"ty":0,"parent":6,"ks":{},"w":23,"h":24,"ip":0,"op":240.4,"st":0,"refId":"8"},{"ind":6,"ty":3,"ks":{"p":{"a":0,"k":[4.3,4.1]}},"ip":0,"op":240.4,"st":0}]},{"id":"16","layers":[{"ind":13,"ty":0,"parent":5,"ks":{"a":{"a":0,"k":[5.2,3.9]},"p":{"a":0,"k":[5.2,3.9]}},"w":31.2,"h":31.2,"ip":0,"op":240.4,"st":0,"refId":"11"},{"ind":5,"ty":3,"ks":{"p":{"a":0,"k":[5.2,3.9]}},"ip":0,"op":240.4,"st":0},{"ind":15,"ty":4,"parent":14,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[20.802,20.802]},"r":{"a":0,"k":27.3},"s":{"a":0,"k":[41.604,41.604]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":14,"ty":3,"ks":{},"ip":0,"op":240.4,"st":0}]},{"id":"21","layers":[{"ind":20,"ty":2,"parent":19,"ks":{},"ip":0,"op":240.4,"st":0,"refId":"0"},{"ind":19,"ty":3,"ks":{"s":{"a":0,"k":[51.19,51.19]}},"ip":0,"op":240.4,"st":0}]},{"id":"24","layers":[{"ind":23,"ty":0,"ks":{},"w":43,"h":43,"ip":0,"op":240.4,"st":0,"refId":"21"}]},{"id":"29","layers":[{"ind":28,"ty":2,"parent":27,"ks":{},"ip":0,"op":240.4,"st":0,"refId":"1"},{"ind":27,"ty":3,"ks":{"s":{"a":0,"k":[50,50]}},"ip":0,"op":240.4,"st":0}]},{"id":"32","layers":[{"ind":31,"ty":0,"ks":{},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"29"}]},{"id":"37","layers":[{"ind":36,"ty":2,"parent":35,"ks":{},"ip":0,"op":240.4,"st":0,"refId":"2"},{"ind":35,"ty":3,"ks":{"s":{"a":0,"k":[99.06,99.06]}},"ip":0,"op":240.4,"st":0}]},{"id":"41","layers":[{"ind":40,"ty":4,"td":1,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[20.802,20.802]},"r":{"a":0,"k":27.3},"s":{"a":0,"k":[41.604,41.604]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":39,"ty":0,"tt":1,"ks":{},"w":41.604,"h":41.604,"ip":0,"op":240.4,"st":0,"refId":"37"}]},{"id":"49","layers":[{"ind":48,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"54","layers":[{"ind":53,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"60","layers":[{"ind":59,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"65","layers":[{"ind":64,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"70","layers":[{"ind":69,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"73","layers":[{"ind":51,"ty":0,"parent":47,"ks":{},"w":13,"h":13,"ip":0,"op":240.4,"st":0,"refId":"49"},{"ind":47,"ty":3,"parent":46,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":43.86,"s":[4.974,4.541],"i":{"x":[0,1],"y":[1,1]},"o":{"x":[0.5,0],"y":[0,0]}},{"t":72.3,"s":[1.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":87.96,"s":[1.974,4.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":116.4,"s":[6.974,6.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":143.76,"s":[6.974,6.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":172.2,"s":[4.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[4.974,4.541],"h":1}]}},"ip":0,"op":240.4,"st":0},{"ind":56,"ty":0,"parent":52,"ks":{},"w":28,"h":29,"ip":0,"op":240.4,"st":0,"refId":"54"},{"ind":52,"ty":3,"parent":46,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":240.4,"st":0},{"ind":46,"ty":3,"parent":45,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":240.4,"st":0},{"ind":62,"ty":0,"parent":58,"ks":{},"w":13,"h":13,"ip":0,"op":240.4,"st":0,"refId":"60"},{"ind":58,"ty":3,"parent":57,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":43.86,"s":[4.474,4.541],"i":{"x":[0,1],"y":[1,1]},"o":{"x":[0.5,0],"y":[0,0]}},{"t":72.3,"s":[1.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":87.96,"s":[1.474,4.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":116.4,"s":[6.474,6.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":143.76,"s":[6.474,6.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":172.2,"s":[4.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[4.474,4.541],"h":1}]}},"ip":0,"op":240.4,"st":0},{"ind":67,"ty":0,"parent":63,"ks":{},"w":29,"h":29,"ip":0,"op":240.4,"st":0,"refId":"65"},{"ind":63,"ty":3,"parent":57,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":240.4,"st":0},{"ind":57,"ty":3,"parent":45,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":240.4,"st":0},{"ind":72,"ty":0,"parent":68,"ks":{},"w":129,"h":127,"ip":0,"op":240.4,"st":0,"refId":"70"},{"ind":68,"ty":3,"parent":45,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":240.4,"st":0},{"ind":45,"ty":3,"ks":{"p":{"a":0,"k":[8,8]}},"ip":0,"op":240.4,"st":0}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":18,"ty":0,"parent":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":45.18,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":63.06,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[54,122],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":45.18,"s":[54,122],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":63.06,"s":[20,134],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[20,134],"h":1}]}},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"16"},{"ind":26,"ty":0,"parent":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":33.3,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":51.18,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[136,117],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":33.3,"s":[136,117],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":51.18,"s":[157,133],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[157,133],"h":1}]}},"w":43,"h":43,"ip":0,"op":240.4,"st":0,"refId":"24"},{"ind":34,"ty":0,"parent":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":21.48,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":39.36,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[103,20],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":21.48,"s":[103,20],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":39.36,"s":[130,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[130,0],"h":1}]}},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"32"},{"ind":43,"ty":0,"parent":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":9.6,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":27.48,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[26,30],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":9.6,"s":[26,30],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":27.48,"s":[12,9],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[12,9],"h":1}]}},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"41"},{"ind":75,"ty":0,"parent":44,"ks":{"a":{"a":0,"k":[75.649,63.9]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0,"y":1},"o":{"x":0,"y":0}},{"t":31.8,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":0,"k":[67.649,55.9]},"s":{"a":1,"k":[{"t":0,"s":[50,50],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":31.8,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[100,100],"h":1}]}},"w":150,"h":135,"ip":0,"op":240.4,"st":0,"refId":"73"},{"ind":44,"ty":3,"parent":4,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":0,"k":[100.575,99.459]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":34.8,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":82.8,"s":[105,105],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":156,"s":[105,105],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":204,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[100,100],"h":1}]}},"ip":0,"op":240.4,"st":0},{"ind":4,"ty":3,"parent":3,"ks":{},"ip":0,"op":240.4,"st":0},{"ind":3,"ty":3,"ks":{},"ip":0,"op":240.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":239.4,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/search.json
================================================
{"assets":[{"h":96,"id":"0","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"h":112,"id":"1","p":"data:image/png;base64,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","u":"","w":99,"e":1},{"id":"19","layers":[{"ind":18,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16.5,15]},"r":{"a":0,"k":0},"s":{"a":0,"k":[33,30]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],"o":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],"v":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],"o":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],"v":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],"o":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],"v":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"24","layers":[{"ind":23,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[13.5,11.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[27,23]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],"o":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],"v":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],"o":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],"v":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{"ty":"fl","c":{"a":0,"k":[0.49,0.79,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"34","layers":[{"ind":33,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],"v":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"39","layers":[{"ind":38,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"44","layers":[{"ind":43,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6,6]},"r":{"a":0,"k":0},"s":{"a":0,"k":[12,12]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],"o":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],"v":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],"o":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],"v":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"49","layers":[{"ind":48,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"54","layers":[{"ind":53,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[2.5,2.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[5,5]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],"o":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"59","layers":[{"ind":58,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[5.5,3]},"r":{"a":0,"k":0},"s":{"a":0,"k":[11,6]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],"o":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],"v":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"62","layers":[{"ind":36,"ty":0,"parent":32,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"34"},{"ind":32,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[17.594,5.138]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":41,"ty":0,"parent":37,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"39"},{"ind":37,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.134,17.416]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":46,"ty":0,"parent":42,"ks":{},"w":12,"h":12,"ip":0,"op":120.4,"st":0,"refId":"44"},{"ind":42,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[6,6]},"p":{"a":0,"k":[5.225,5.047]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":51,"ty":0,"parent":47,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"49"},{"ind":47,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[20.992,21.292]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":56,"ty":0,"parent":52,"ks":{},"w":5,"h":5,"ip":0,"op":120.4,"st":0,"refId":"54"},{"ind":52,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[2.5,2.5]},"p":{"a":0,"k":[14.69,20.761]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":61,"ty":0,"parent":57,"ks":{},"w":11,"h":6,"ip":0,"op":120.4,"st":0,"refId":"59"},{"ind":57,"ty":3,"parent":31,"ks":{"a":{"a":0,"k":[5.5,3]},"p":{"a":0,"k":[17.282,14.474]},"r":{"a":0,"k":-13.62}},"ip":0,"op":120.4,"st":0},{"ind":31,"ty":3,"ks":{"p":{"a":0,"k":[2.572,2.572]}},"ip":0,"op":120.4,"st":0}]},{"id":"72","layers":[{"ind":71,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"77","layers":[{"ind":76,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"83","layers":[{"ind":82,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"88","layers":[{"ind":87,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"93","layers":[{"ind":92,"ty":4,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":7,"ty":2,"parent":6,"ks":{"s":{"a":0,"k":[33.33,33.33]}},"ip":0,"op":120.4,"st":0,"refId":"0"},{"ind":6,"ty":3,"parent":5,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"a":{"a":0,"k":[21.5,16]},"p":{"a":0,"k":[21.5,16]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":4,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[138,40]}},"ip":0,"op":120.4,"st":0},{"ind":12,"ty":4,"parent":11,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[4.375,4.375]},"s":{"a":0,"k":[8.75,8.75]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":11,"ty":3,"parent":10,"ks":{"p":{"a":0,"k":[8.422,7.292]}},"ip":0,"op":120.4,"st":0},{"ind":14,"ty":2,"parent":13,"ks":{"s":{"a":0,"k":[33.33,33.04]}},"ip":0,"op":120.4,"st":0,"refId":"1"},{"ind":13,"ty":3,"parent":10,"ks":{"a":{"a":0,"k":[16.5,18.5]},"p":{"a":0,"k":[12.538,14.893]},"r":{"a":0,"k":12.68}},"ip":0,"op":120.4,"st":0},{"ind":10,"ty":3,"parent":9,"ks":{"a":{"a":0,"k":[13.037,14.939]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":0,"k":-12.68}},"ip":0,"op":120.4,"st":0},{"ind":9,"ty":3,"parent":8,"ks":{"a":{"a":0,"k":[15.997,17.436]},"p":{"a":0,"k":[15.997,17.436]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":8,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[87,28]}},"ip":0,"op":120.4,"st":0},{"ind":21,"ty":0,"parent":17,"ks":{},"w":33,"h":30,"ip":0,"op":120.4,"st":0,"refId":"19"},{"ind":17,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[16.5,15]},"p":{"a":0,"k":[15.953,14.392]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":26,"ty":0,"parent":22,"ks":{},"w":27,"h":23,"ip":0,"op":120.4,"st":0,"refId":"24"},{"ind":22,"ty":3,"parent":16,"ks":{"a":{"a":0,"k":[13.5,11.5]},"p":{"a":0,"k":[15.873,14.886]},"r":{"a":0,"k":9.18}},"ip":0,"op":120.4,"st":0},{"ind":16,"ty":3,"parent":15,"ks":{"a":{"a":0,"k":[15.3,15.3]},"p":{"a":0,"k":[17.544,17.544]},"r":{"a":0,"k":-9.18}},"ip":0,"op":120.4,"st":0},{"ind":15,"ty":3,"parent":3,"ks":{"a":{"a":0,"k":[17.544,17.544]},"p":{"a":1,"k":[{"t":0,"s":[24.544,66.544],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":12,"s":[24.544,66.544],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":64.5,"s":[100.544,92.544],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[100.544,92.544],"h":1}]},"r":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":12,"s":[0],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":64.5,"s":[11],"h":1},{"t":119.4,"s":[11],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":12,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":64.5,"s":[400,400],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[400,400],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":64,"ty":0,"parent":30,"ks":{"a":{"a":0,"k":[2.286,2.286]},"p":{"a":0,"k":[2.286,2.286]}},"w":27.4286,"h":27.4286,"ip":0,"op":120.4,"st":0,"refId":"62"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[2.286,2.286]}},"ip":0,"op":120.4,"st":0},{"ind":66,"ty":4,"parent":65,"ks":{},"ip":0,"op":120.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[16,16]},"r":{"a":0,"k":6.857},"s":{"a":0,"k":[32,32]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":65,"ty":3,"parent":29,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"a":{"a":0,"k":[16,16]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":0,"k":13.62}},"ip":0,"op":120.4,"st":0},{"ind":28,"ty":3,"parent":27,"ks":{"a":{"a":0,"k":[19.317,19.317]},"p":{"a":0,"k":[19.317,19.317]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":22.44,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":22.44,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":27,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[41,10]}},"ip":0,"op":120.4,"st":0},{"ind":74,"ty":0,"parent":70,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"72"},{"ind":70,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[4.974,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":79,"ty":0,"parent":75,"ks":{},"w":28,"h":29,"ip":0,"op":120.4,"st":0,"refId":"77"},{"ind":75,"ty":3,"parent":69,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":69,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":85,"ty":0,"parent":81,"ks":{},"w":13,"h":13,"ip":0,"op":120.4,"st":0,"refId":"83"},{"ind":81,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[4.474,0.54]}},"ip":0,"op":120.4,"st":0},{"ind":90,"ty":0,"parent":86,"ks":{},"w":29,"h":29,"ip":0,"op":120.4,"st":0,"refId":"88"},{"ind":86,"ty":3,"parent":80,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":120.4,"st":0},{"ind":80,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":120.4,"st":0},{"ind":95,"ty":0,"parent":91,"ks":{},"w":129,"h":127,"ip":0,"op":120.4,"st":0,"refId":"93"},{"ind":91,"ty":3,"parent":68,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":120.4,"st":0},{"ind":68,"ty":3,"parent":67,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":0,"k":[67.649,55.9]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":25.2,"s":[45],"h":1},{"t":119.4,"s":[45],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":25.2,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":119.4,"s":[0,0],"h":1}]}},"ip":0,"op":120.4,"st":0},{"ind":67,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[32.926,63.56]}},"ip":0,"op":120.4,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{},"ip":0,"op":120.4,"st":0},{"ind":2,"ty":3,"ks":{},"ip":0,"op":120.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":119.4,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/self.json
================================================
{"assets":[{"id":"7","layers":[{"ind":6,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[58,61]},"r":{"a":0,"k":0},"s":{"a":0,"k":[116,122]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],"o":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],"v":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],"o":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],"v":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"13","layers":[{"ind":12,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[73,76]},"r":{"a":0,"k":0},"s":{"a":0,"k":[146,152]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],"o":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],"v":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],"o":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],"v":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],"o":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],"v":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"21","layers":[{"ind":20,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"26","layers":[{"ind":25,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"32","layers":[{"ind":31,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"37","layers":[{"ind":36,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"42","layers":[{"ind":41,"ty":4,"ks":{},"ip":0,"op":61,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":61,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"45","layers":[{"ind":23,"ty":0,"parent":19,"ks":{},"w":13,"h":13,"ip":0,"op":61,"st":0,"refId":"21"},{"ind":19,"ty":3,"parent":18,"ks":{"p":{"a":0,"k":[4.974,4.541]}},"ip":0,"op":61,"st":0},{"ind":28,"ty":0,"parent":24,"ks":{},"w":28,"h":29,"ip":0,"op":61,"st":0,"refId":"26"},{"ind":24,"ty":3,"parent":18,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":61,"st":0},{"ind":18,"ty":3,"parent":17,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":61,"st":0},{"ind":34,"ty":0,"parent":30,"ks":{},"w":13,"h":13,"ip":0,"op":61,"st":0,"refId":"32"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[4.474,4.541]}},"ip":0,"op":61,"st":0},{"ind":39,"ty":0,"parent":35,"ks":{},"w":29,"h":29,"ip":0,"op":61,"st":0,"refId":"37"},{"ind":35,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":61,"st":0},{"ind":29,"ty":3,"parent":17,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":61,"st":0},{"ind":44,"ty":0,"parent":40,"ks":{},"w":129,"h":127,"ip":0,"op":61,"st":0,"refId":"42"},{"ind":40,"ty":3,"parent":17,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":61,"st":0},{"ind":17,"ty":3,"ks":{"p":{"a":0,"k":[8,8]}},"ip":0,"op":61,"st":0}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":9,"ty":0,"parent":5,"ks":{},"w":116,"h":122,"ip":0,"op":61,"st":0,"refId":"7"},{"ind":5,"ty":3,"parent":4,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":61,"st":0},{"ind":4,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[6.181,6.13]}},"ip":0,"op":61,"st":0},{"ind":15,"ty":0,"parent":11,"ks":{},"w":146,"h":152,"ip":0,"op":61,"st":0,"refId":"13"},{"ind":11,"ty":3,"parent":10,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":61,"st":0},{"ind":10,"ty":3,"parent":3,"ks":{"p":{"a":0,"k":[-0.109,-0.108]}},"ip":0,"op":61,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[30.5,31.5]},"p":{"a":0,"k":[30.5,31.5]},"r":{"a":1,"k":[{"t":0,"s":[-45],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":60,"s":[0],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":60,"s":[100,100],"h":1}]}},"ip":0,"op":61,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{"p":{"a":0,"k":[28.768,29]}},"ip":0,"op":61,"st":0},{"ind":47,"ty":0,"parent":16,"ks":{"a":{"a":0,"k":[75.649,63.9]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0,"y":1},"o":{"x":0,"y":0}},{"t":31.8,"s":[100],"h":1},{"t":60,"s":[100],"h":1}]},"p":{"a":0,"k":[67.649,55.9]},"s":{"a":1,"k":[{"t":0,"s":[50,50],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":31.8,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":60,"s":[100,100],"h":1}]}},"w":150,"h":135,"ip":0,"op":61,"st":0,"refId":"45"},{"ind":16,"ty":3,"parent":1,"ks":{"p":{"a":0,"k":[40.694,43.559]}},"ip":0,"op":61,"st":0},{"ind":1,"ty":3,"parent":0,"ks":{},"ip":0,"op":61,"st":0},{"ind":0,"ty":3,"ks":{},"ip":0,"op":61,"st":0}],"meta":{"g":"https://jitter.video"},"op":60,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/turboself.json
================================================
{"assets":[{"h":237,"id":"0","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO0AAADtCAYAAABTTfKPAAAQAElEQVR4AexdCZwU5ZX/V1Wfcw/MDMwMwgCKgCIqSBZFvM/EKzEao2uiu5pDjVHjGo3GGBN1jWdWjbjq+tNVs16rJt4HnlkxGgGVW0FRbpijp6fvqn2vhtEGenqq76ru178+67ve9//q3+99731flboWEwx5CQZyDjjnHFAhD0FAEHAUAkJaRw2XCCsIAEJaOQsEAYchIKS1PmCSUxCwBQJCWlsMgwghCFhHQEhrHSvJKQjYAgEhrS2GQYQQBKwjIKS1jpXktI6A5CwgAkLaAoIrVQsChUBASFsIVKVOQaCACAhpCwiuVC0IFAIBIW0hUJU6BQHrCGScU0ibMWRSQBAoLQJC2tLiL60LAhkjIKTNGDIpIAiUFgEhbWnxl9YFgYwRqGDSZoyVFBAEbIGAkNYWwyBCCALWERDSWsdKcgoCtkBASGuLYRAhBAHrCAhprWNVwTml63ZCQEhrp9EQWQQBCwgIaS2AJFkEATshIKS102iILIKABQSEtBZAkiyCgHUECp9TSFt4jKUFQSCvCAhp8wqnVCYIFB4BIW3hMZYWBIG8IiCkzSucUpkgUHgEyoe0hcdKWhAEbIGAkNYWwyBCCALWERDSWsdKcgoCtkBASGuLYRAhBAHrCAhprWNVPjmlJ45GQEjr6OET4SsRASFtJY669NnRCAhpHT18InwlIiCkrcRRlz5bR8CGOYW0NhwUEUkQSIeAkDYdOpImCNgQASGtDQdFRBIE0iEgpE2HjqQJAjZEwLaktSFWIpIgYAsEhLS2GAYRQhCwjoCQ1jpWklMQsAUCQlpbDIMIIQhYR0BIax0r2+YUwSoLASFtZY239LYMEBDSlsEgShcqCwEhbWWNt/S2DBAQ0pbBIEoXrCNQDjmdQ1pNheJ1A/RZDsBLHwSBbBFQsy1Y7HKK1wt1ZDPU5kYoHiKvohRbBGlPELAFAo4hLWBA8XqgtbZAbW+BUlcNqA4S3xbDLUKUAwLOOesNoq1Bb0RUdVgDtPYR+ErrlsNISB8EAYsIFIu0FsVJk83QAZ1eW7Mofh9pXTKX21qg1FZtPSofgkD5I+Ac0uqkZZNIaw6NpkEdVk9adyRp3WGASzMPy5sgUM4IqE7pnBFPANH4juKSQ0qp9ptaVxs1EkqVb8c8ckQQKCMEHENaNo2NBBGX57WpBsDtgtpIWnd0K9SmBkhoKBVIcqwcEHAOaRltNo/5xd9TvVQFSnUVtLYRYEcVOK6bKp+9j4l0gkBaBBxFWjaRjcTXzqhBe8Zat6kRrrGj+kNDg2aUBEHAeQg4irSIxoAYvazgbM51SeuO2wnqyCaAnFZWikkeQcDuCDiLtDyntaJpk1BXiKwahYVc49phOqmIzEnJ8lUQcBwCjiKtEYvDiKfwIA8FOxFVqauFNn401OH1AJnPQxWRdEcgUJFCqo7q9UDYZzAP8hCd4TXL2ug2aG3NUPxegBxXQxSRZEHAdgg4i7QEn8FzWjaT6XtWT9K6atMwaB3tZohIEa2bFYxSqHQIOI+0kSjYTM4VMqXKD22nkeSkGg5enCFaN1dEpXyxEHAcaREh7zGbyflAiJxUavNwcEyXl0PKMsh8gCp1FBqBLElbaLEGr9+I5kfTftUCmctKbTXU1mZoFBrijQhfpckXQcCGCDiOtOCNA2QiI5d5bYqBUDwe8FxXHTUCSkMtOamcB02KbsmhMkTAkWemEQpT6CeR/+HQVKikdXnjgdbaBPY2578RqVEQyA0Bx5IW+ZrXbo8fm8teD8y5bkcblJoqgI5BHoKATRBwJmnZGcWhnyzjtZawJ62r1FTDNWUCXFMnIHviQh6CQF4RcCRpQWTVg6FtrmSRV1QGKiMNy3Fc9167wXvMgbL5YAAX+SwpAs4kLUFm9IVgaccP5c3pSQ4vRVHIs9wC3wmHwTV5LMzNBwrkIQiUBAHnkpY1bSyLdciZwpw0d1a8XnhmToNn9jSojXUAmdCZVif5BYFcEXAsaZHQYYTIRCZTOVcQ0pVnbc6vr/JoGlw7d8Bz4Deg8X5dnxcy30WeHlKNFQScS1rqnd4ZAJOXvhb2uf3OIjKXOabr+ac94dpz1/6dQ0TmwgohtQsC/Qg4mrTmvHZ7QvX3K3/vrMmTTOTkinn9snu3CXDvswc0Dg+ZWjc5h3wXBPKPgKNJy7FaIxAEjPwDk1yjwVfMSD6Q/J00LC/GcE+fQuGhXaA01EHMZcijgAg4m7QEjN7ZTaQtLGuNaDR9G2wu19fCtfsEePaZYmpduWUJDY48C4JAP2kLUnVxKjWCYZikKmRz6TRtUruK2w1tTDtMrbv3JChV5KRKSpevgkA+EHA8aaHr0Dt78oHFoHUYFklrVsBat7EebtK67tn7QN1phHlY3gSBfCHgfNISEvrGzvTmK+XJ5WmEIxkX511Drp3aKK67N9ysdX3ujOuQAoJAKgTKgrR8WVW9uzdV//JzjGPC2SzkYK1LjinXlIlw709at7kxP/JILRWNQHmQloZQ30Talj4L8uSwz4C2zaIBxeuBi+a6ngNmwLVrB+DWsqhFiggC/Qio/R/Of+fQj8Fe3gJ1hffw5lS1qkId1gDPftPg2XdPCg3VAArkIQhkjEDZkNbc+bNhS8YAWC2QM2kHGnK54N5nKvynHw/XHrtA8XkAMqMhD0HAIgJlRVqjK2D9tiEWARrIxquvBr7n/Klp5vpl3+nfhuewmVB5rlsumw9cdEr5vVDqa6A01oHvYMgvZVg9lIZaKNU+mNMD+aPK+jRSsy5pw4JGPAG9qzDhHyMcRd6uS0Wk5R1Cak01vEcfBO/JR0Kb2NGvdW2Ia1qR6M9GaaiBNn4U3NN3g+eofeE7/RhUXfRDVF96FmquOgfVv/kpqn91tnnM9y8nwHvsAXDvtye0SeOgtgwD/GRtyIXj08KcnFhWpO2P2QZgZOPpTUYl1XdyRuXLRFb4BB3QNDTXde8+Ef7TjiMP87T+kzhV+zY7xndo0CaMpj+dWag67zTU3HwJ6h+5GY1/vg0Nf/odaq84DzUXE1F/ejqqz/kBai78V9Refi7qb7kSDf99CxoevRV1d/4a1URs/xnHE5EPgvuA6eCrhKijR5JWroGpkW3WbzuIo9pBiLzJwMQiL6/RTWZy3ir9uiIj2Pf1j1y+KQT7AGm31qMOa4T3+MPhOe5guCaPA7w2jeuSXNru4+H7wXGo+f3PUXfHVai98mfwH3M4XGPHgDdRpJ2jU78VnxfayBHwzp6J6vPPQN0ff4P6e69F/ZyrUHPDxaSdz0XVL86A/6wT4T3xcLgPnA5t952htg6n+j2Agop+0NlTZv1nE5lIWwhta/SGcgeLT7hkTZtUo+LS4Jk2hU7UI+A5YB8ozQ2wzYPIxqRhstZecyFqr74A/u8cDW1UG8DmfraCUr18Z0O1sYHCYTvDd+hsVP3wu6i99Keo+8OlqL3lMtTecAlqr7sINVefj+rLfgT/uacSRofBPYtM7AljSCtXAzyXzlYGh5VTHSbv0OKStkVfGEYg/4stDKoXuoWbWqeVUgHoRDVfSPGgNK1tJLxH7A/vtw6ieV8HSm4mkkyuGZNR/dufofaKc+D71iHg/cSD9iFFtzI+RNMG1tqu9lb6I9sDvm8ejKozT0L1xT9C7W/PR+21F6H2+otRe+MvUXvDL2nefC6R+RSyVA6Ea/pkKO1NAK9CI7gzbrsUBTJoU80gr2OyspY1untpbhvLq8xGIo5sljTuIASRIO0JT+l8JUj3tN3hO/4wuGdPI28saZMdKirCAU2B96TDUHvjZag67YR+zUryFaHlHZugdvla1GpDPXnfx8Izczr9gRyMqjNORM3Pz0DN5eeg7tpfkLl9Berv+h2Z7lei5nc/g+/sb8N96Deg7Upaud6PtNjD/g/V/iJmISFpW55/GrzXNovigxbRDRi9Oc5r+Z+fTr5B20hKMHcNjW6H9/DZ5Kg5GBo5aIp6ozCPi7TX90irXQzvvvTHQXNR2PHBWrm6CtqIZrgm7UJk3hu+ow6E/9TjUXXu6aj99fmo/48r0fDADWh45I+ovedqVF1+NrzfPxKuGbtBaW0EPJode5ZSpvIkLXXViMZhattMduhQuaGeuZOWWEtPXgwyVFtmOp2QakMd3DOmwnfqMXBNmwyFnEFmWiHf6CSuuuRM1Fx6DjmYRsNx2on+GE2tXFcLrX0kXBPHw73PHvAeSt7u7x+LmovOQt2Nv0Ljw7dg2LP3ouGvc1Dzp8vhP/8UuL85C+r4NsDvhh0fZUtaJgVrWn7lDXjW4HxLkkQutyRhxmYuEe8a0saMgv97x8Bz/CH9zpfMq7FWgk54/09ONkM1WkuztTKlzEUWEOJx6D29SKzbiPgXXyK28jNEF36MyLx/IPLKm4i89Eb/65W3EH1jHmJ/n4/4h0sQ/2QV9ECAph81FDueBv/ZZFlccxEaH78djS/ci/qnb0P1NeeZWlmbMQlKUw2gKaXsLcqXtAQrz23ZccQrctQRTebAgG8iTSclJZvPTN94AYfBl2/NtGA+8pPcSk0VvAfNhP+8f4Y6tjUfte5Qh/fkw1Fzwb+QudkElPb8RMoHRQhin36G4Jz70fmDi7Bp9knYMOkQbJx0MDbtehg2jT8Cm3c9Glumn4TO/f8ZnUf+GJ1H/2Tw18FnonPWaeic9l1s2fM7VI4+DzwVXSedg57zr0TogSeRWL0OatsIuGbuTa8pUEe3AFpp6FOaVlOORGEOJjZshkEmstbWQs6LDrj3mAjXHrvCNWk8tDFtUFso9ldH/54eNw0CzWvIHMUgIRlTQvYe9wbNr1m9cXnWDETArMpzISrrolBL9YX/CvfR+8E0l+kYJ+X0ojpcM3dH9YVEWJpL51RXPgsTZuwAZK3Ye9McbJx1IjZPOgqBH/8ekfv/ivjbC6GvWAdjTTeMHgrL0XiDF9gMvEgLsyZO+xrIu/XT6OqDsa4HxsrN0BevRvzN+Yg9+Rpif3kD8bcWQv98A4pyJdAUOJY9aRGOIrHyC+hkOg30X3G5KEjvN8MW2k6tcO3SAfNKE5PHw7XzaHMOpDYPg0JkVnxe8NwIVAYcj1SA/luSFPa6VAOypvtkufzHHg7/j0+COmYkwH886QoMkaa2N6OaHDfuqZMAIjBK/WCyUugu+v6H6Lnsemye/X30XnwzEvMWAdFcpiil7lhu7Zc/aQmfxJfroa9ZD4P/cel3yiefpB4PlNoaU/sOkNk1cRy0CR3QOtqhtTUT0Ruh+L1gbfwVodnkZg3NdaSsPPkgkZ3mxjznTj6a9Xdq0zVpAqrOOpnmZHvSXLfWlC3T+nghv+/734TnUNLchEOm5fOdnzVrbNFy9N54N7pOuQChWx8kTbqZ/jEJv3w35rD6KoK0iCUQX7YSRjZXbiTtqni9UOtricxNFKdsJQKPAt85Xh1HnxSGMb83E5l5F0tttanFFd5yN0Dm5JOCz7l8kpbrJuKqTcPgO+5QeI8/GBrJBa+Hk5GxWAAAEABJREFUU6y96A/H9Y0p8H37CGgtTYOWKUoCYcNX2Iw88yp6LroGwevuhv7Jl0LWJPArg7TUYX1DJ+Kffm7Ob+lnbs+EDkSiUIgYSn0d2JRWR42ENnYnmEQe0wqVwgxqawsRnczs4Q2mBmQnkqml6Y+gEOan4vfDM2NPeE88Au4Zu5ttWmlHbWmE79hD4J46OTdcci1NhE2s34S+/3oUgctuQuzFdwjn/C6QyVVEO5SvGNIy2Inln0NfvxE5m6Z0chlEWnO7Hlc88FKAgfmyQlqX98mq7SOgjW6DOpqIvNNIIvMIqCObiMzDTbIrjfVQWDv7fcjVsw1+0B+Ca+xoeI8+EN4jZ0HraANcGqekfrk1uP9pKrxHHQCF5u+pMxXnaGLtBgRvvQ9919+NxLLPi9OoA1tRHShz1iLz2uHYh8v6b9yVdS39BdkjbVjd9aMq4NVNvJZWYTN7WAM0Iq7G2nnUCHDwXxv4JJKrI4jUlMd0hPH8mUmn9Ldr9V2l8u79ppG5TBqUtS5vPk9RmP9APEfPJpN6TIrU4h3Su7oRvOFuhO54mP5YC3i9r+J1qWAtVRRpGUV93SbEF63IXdtSrNDgeG02Cy3YK8phH5pLKuT0Uar95KmmOTOZ0SrNKbXWZiJyC72I0OTd1khTa/Rpzp0pj6mZfV6AykPhXqV+cd2uXcebWtdzzIGk4Ydvm5H+DFxTdoH38P3BO4y2TSzeL/4DDN56L0L3PE4hmxzCacUTeciWCpmh4kjLsbX44k+RIG9yTsCSiQzeuxuKZFyNwUQn4qYsyCQkExdM5ioiM3uzyYRmR5PGGpgC/Exgjb3Z40dDG9NO5G6BOrzRNLNNB5TKlWytnZ1UzcPh2Xda/zLI6RMxQHS1sY68xTPhGtWKkj0Ix74Hn0DfbQ8LYS0OQuWRloAxiGixvy+EEQ7Tr+yf5ry2j4L5mVbBhOVXJuWIfBwnVigWq/h9UKqroNbVgM1glUiptreYBHYRkTnurI0dBV5Qog5vgOkAq66Ga8I4+L5zNLzfOQxKfTVUiu36vnUwuN5MRMln3uh789F3zV0wNnXns9qyrqsiScsjqm/qQuz9j3Izk9lEZtLGMvRwsveZXyxIrq8BMrvd/d5sJnQNEZK1M5vapEW1caPNFWAuXjQ/fQr8Jx+D6ivOgf+HJ8A1dkyuEmRd3gj0ovfqO5BYuSbrOiqxYMWSFjSnTKxYjfiq1bmNe1+EHFuZmcgGaVl+5dbwEKVNMtPw0rxVoXixqaFrqqC1tlBoZyKqvncMqs78HtJ6lodoItfkvoeeROztBSVbDpir/KUqr5aq4QK1m1G1bN7G3v8Yek/2V3A0eF7LDimam1lunDQ0z60t588hoxmCYlOazGRzTkzzWDaZ1dYmmDHjHOrOpWj8y7UI3fckjAJdPTMX2exetqJJy4PDe25j734II5KZtuSy5ovIyntsmbzmbytv7Ihi4lJZK9kt5WHNyg4oTYXi80Ctr4HWPAxqUyPUumqwpjWXXpK2VYi4pufZUsUFyESWRvjhp6GTpcMWTwFaKOsq1bLunZXO0dxSX7MR8cUUBuIdHlbKbJfHvJA5Xz8qAxIaPA+mtreryvpPhbJyyIc8zUxIjgGrvDqLSUrzWf5tmr6cj7Lyd44RK+S8AhOcj5XoFV+9BpHn34K+RZxP2QyBkJZQYy0ZX/YZ+GQCaQE6lNmTtKbOl6HJhPS8oirdBoZUEjDZmKQ8R6U4LXuFVdKa6rD6fm1KGlZhIieXZdKSx5k9zex1Tk4qyXf6Y4u+8jYShDfIr1ASGRzeqJB26wCymRxf/An0jVuy8igbgSCY/OANAVvrTPfB82kQ2dPlMdPI3OXljQqTtNpvktMkakMdVPrNTqZBNSeRnNdHM2HN+C0T2KzUfCvJm94dQOxvH0Av4H2XStKxIjYqpB0AmzSAvn4zYotWgE+sgcOWP1lzEnGt3jqEVwGZJjK1u00bRDTeu8tkM1dK0RyUSafW10LlNcpEXktxVdK4rFmV2hqANO2gxN6m8cL/iC9dQVORT2UjQA5QC2mTwSPNl/h8Tf82Po6/JqdZ+G509pC2DVvT1OSM4kUeYHOctSkRS6nygZcoqkROk6j8yauiKA3sZLIgg5mFTWjWwrVVYC1tHrPDG5nDsQVLkPjsSztI41gZVMdKXijBIzEkltP8lrfxkfbMpBk2eY0tFD5iIqYrSAQ0zV2emxK5TIKSg8gkK/1WaG7KjqOstCPXSWRlLW1JI6eTM89pejCIxKJPoG/synPNlVWdkDbFeBsUd41/uByJL9ZS4D+zy5rond0wTE/ydhWz9mPN2TIc5gaA0W1Qtnp5FTJ5zbkpmbTblcrsJ2lkJj6bxSUN6QwidWLtesRXfgFE44PksO1hWwkmpB1kONixFP9gMRIbNlkzdwfqIRNb37DZLMOhGJU8u9pOreA1wSZZW5vN9cJsBps7azjss/28dqCuDD4V0s6ssfsdTjbwOKWQXf9iHfQv16dIkUOZICCkTYOWTnPU2DsLoHdZjCeSpuQwjMLz0KYGaLt0QB3Vai5wMElKGpWdTMlmLzukct2Ur/BcuK7WVg6nHWClPyZ97Ubw1sgd0uRARggIadPBxSfapi5EXptHJu8gu3l4DjmMwi9j2qBNGgdt/GioI4YDFLdlTTuU2WtEozDIQZNOjEHTyNPMiyV40YQ5Bx40ow0SyPGmb9wMo5vm/DYQx8kiCGmHGj0irkGOk8jzb4AJZmpJNkVH0tx0Qgdcu+0CrWNUvzY1NakGnk8a0RgS6zYNVTvNmXWAV0dRO0NnTspBWp3jtazZTZmSkuz4VSennr6J5/tRO4rnKJlsTlr7YKlvIo37+jyoHa0mUdX2kWCTFxyuIY2XSlK+HpURohBQqsSkY+a1piwuyjCLuTSaF9cB/CdhHnDAm56AEY8B2VoVDuhisURUi9VQObSjf7YO4f99HjqbeFZIRicoX3MZQ4SAOFRENvLQENGfAy+6UMnrDE8Gl0gduubC52BLgvAofEPl34KQNpMxJvLF5y9H5OmXoW/pBPhEHKK80RsEh4HSLm+kekxtm64uMod5K51SXwNbLZhIJ3NSGvfPDIUlHZOv2SGgZlesgktRjDH+3iJEnp1rLRxEIR1eZ2sMsfWvf93yIOqbY7y86IKXJPLtSZwIP83xrUwVnNi1YssspM0CcdYa8fcXIfrCG+AFA0Oav+EIzI0I5EEdrDnzDn8U490hnUiq1PjRv8Ip3XDtUNJWB4xwGIbVS87aSnL7CePcs6DEWBqhKOL/WILo828isXoN0hKXzGqjO0Bz4d7BpSYTWU92WvH81eMmZ1cVFIr7skd68ML2T2EtawTS9N/+XbCNhELaHIbCCEUQn7+ETGXSuJ+upvDN4EseOQSkb+mCkUzM7do2SCMbRHAO4bDDib3TCnuIicDbZXXcT766h94ZcJzcdhRYSJvjqBiRGOIfr0D4mbmIL1kBc7tdqjpJk5onLl+tYTAzmea/XJ/CK5xqq2HnJYmpupjumNEThMF9T5dJ0iwhIKS1BNMQmWJxJJauonDQy4jNmw8jMsgCAiKr0dndbyYTiXeoVVWgulSY81e3C2XzoFCP3kX93kwed1t0ytlCqM4W30bSk5bUv9iAyF9eQ+SF18gMTr3ssd9M7qT0bRddKOQhVhvqALebtPXgZraNemxZFCMWhelBJ21ruZBkHBQBddAUScgcAdKeRlcAsVfeRei+x1NfmpXzBILQ2VTceo0ohRxOamMdeB7Ljaab93K60148LTAXmUTL68+oVOMgpC0A8mZIaOEK9N18HxKrUtyykcxFg0xFo6fXJKrSUAskm8OxGFgjF0C0klSpk2mcWJkCh5JI4/xGVed3waY9IC+wvmYT+m57ENG/vb+DZ9lg4tJc2FzlRKbxNr2gNL651zbHHPxD7+xB4lO5xEy+hrC4pM2X1A6qxwiEEHnkeYSffpEcUBTyIPOYt+tpvBm+qbHfaUXz4W26RHlMZ1aqxRbbZHTAD/7zWr8ZiZUUEnOAuE4QUUhbhFEyKJ4bfeXvCD/8VyTWbTC38aktwwHSsJym8+VpWLsmy0JE5rht8iEnfjfCYcQ//YzCPb1OFN+WMgtpizUsZArHFy5F5IkXEVu0HHpvEAMbDnh5n6lZk2UhDWUeozBR8mGnfdfJMRdfsPirvjpNfjvKK6Qt5qiQ9owvXI6+Pz2E8JMvIrF2A8zlj2wOB3rJVI5tKw2ZxyZxtz3qqF/6li7E/kGkdZTU9hZWSFuC8TH35d7/lBkWYq1rsLeYCM1rc82NAywTv1jLRojIlMY/HfeikBZf45gvSes42W0ssJC2RINjdPUi8szr6LvzIURfe8dcbMGENSiGm3y7EJPQROoSiZlTs0YojNjfFwK92y4kyalSKQwhbSlPAtKi8Xkfom/O/yD0wBPgjfVsDuu9fRQi0vslYy3LyyJpjtt/wDnvOsWho6/Nc47ADpFUSFvqgTJoWrtqDcJ/fg7BP9yN2MdLSetGoPPeUyYqz3d5Azk5skotakbtk+yJz79EfOGyjIpJ5qERENIOjVFRchg9QUTnvovgNXMQeuo56F09RNwQMZpYTQ4pOEzbsqkfmfs3GF3kJS80ghVWv5DWTgNO5Ews+wzhOx9F8Ka7EV+xkohLpjJpLZO0lG4ncdPKQvPZyNOvYiCslTavJGaEgJA2I7iKkJnMYX1jJyJPv4beK25B5KU3oPcEYDqkolHHkCD60RLE319aBMAqrwkhrV3HnJ1U85ei9ze3I/jH+5BYvRbglVMO0bahh55CshfcrjA7US4hrZ1HjaazxuZuhO5+At0XXYPQy2/TXLcb5oIMG8ud2LQFkcdftLGEzhYtJ9I6u+sOkp60a/ztBei98BoE73qon7g2Fj/0yNMwNsg9ewo1RELaQiFbgHr1DZ2IL/4Edr7oN999IfSfjxWg91LlAAJC2gEkHPCp1FXDe8RsqE3D7CktOdHCz7yCxMJP7ClfmUglpHXQQLr2ngT31EkwL6tqQ7kT69YjdPvDkDBPYQdHSFtYfL+qPecvfg88h8yENro956oKUgHNu0MP/wXxBcuEtAUB+OtKhbRfY2Hrb9rOO8EzYyrUuhpbyhn9cDHCDz0DIxSxpXzlJJSQ1gmjqSnw7Ls3XJN3gR1vD6IHehG691EklqyC3cNRThjuoWRUh8og6aVHQG1rgXu/vaGNaCq9MNtLQM6nyHNzEX3+LdjZq7292E7+LaR1wOi59pwI9z5TAJf97joQW7ICofufQuKzdciXA8oBQ1JSEdWSti6ND4mA0lAD98w94Ro3Zsi8xc5gmsX3/y9ib/4DcNrWwWKDlcf2hLR5BLMQVWkTOuCZNQ2Kx1OI6rOvU9cRfuZVhB97AbytMPuKpGSmCAhpM0WsmPk9LorLkmm8N5nGxWx3qLZoHhv94COE7nkM+oovhsot6XlGQEibZ0DzWZ02up8KVHcAAAddSURBVBWew/aFWl2Vz2pzq4sIm/hiLRH2UcRefy+3uqR0VggkkzarCqRQgRBwadAmjoNn/30K1EB21fIVNUJ//ivCDz5D89hEdpVIqZwQUHMqLYULhoDSWAfPwTMozNNcsDYyrdjoCyH87Fz03fGgzGMzBS+P+YW0eQQzb1WpCrSOVniPOgBQFNjhwVfOiLw+D8Eb7oG+isI7dhCqQmUQ0tpw4HlDgHu/veDeeaw9pKN5bOy9BQheeycS85fZQ6YKlkJIm93gF7SUMrwevhOOgF0WU8Q+XILeq29H7K0PCtpvqdwaAqq1bJKraAhoGlz77AbP9D2K1mS6hmKLlyPwqxsRffEdwEiXU9KKhYCQtlhIW2xH8bjhO+WbUKr8FksULlts8TIELv0Dos+/DfCdDgrXlNScAQJC2gzAKkZWdfIY+A6ZVYym0rYRW/AxAv92PRH2b0B86y1K0paQxGIhIKQtFtIW2/Gd+i2oDfUWcxcgGzmdouR06rmECPsymcSRWK6NSPk8IyCkzTOguVSnNFbDf8pxKFmYhwgbef0d9Fx4LWJz3wPCQljY8CGktdGgeE85Gq6RI0ojEc1ZQ8++isDPr0GcvcTReGnkkFaHREBIOyRERcrg96Dq7FOK1FhSM6RdeYtd3wOPofcCIqx5jaekdPlqOwSEtDYZEvdBM+CZtGtxpSHtmlizHsHbH0DglzcjsVx27BR3AHZozdIBIa0lmAqcyetG1ZnfBlwaivUwojHEFi5G4He3Ifj7OTDWbylW09JOjgioOZaX4nlAwDVlPDwzpwOqkofahq6CzeHIi6+jh2Kw4bsfB3pDQxeSHLZBQEhb6qHQVHi/exTUxvrCS0Lz1/jKz9F350MIsIf4hf+TGGzhUc97C0LavEOaWYVqx0h4D9kPiteTWcEMcxt8k+eX3kTvr29B71W3y/w1Q/zslF1Ia45G6d48R86Ga0w7CnY9Y9aun65C8Nb7ELj0RoQffBYIhkvXYWk5ZwSEtDlDmH0FSnMDfIfPglJfl30laUoavUGE//ISAr+8EX033ov4B0shlzlNA5hDkoS0JRwo96y94Jq8MxR3nq9nHE8gtmARAlfdisClNyHy1Fzom7qFsCUc63w2LaTNJ5qZ1OV3w3voftDaR2ZSKn1eMoX19RsRnPPf6PnJrxG66zEkFq8CKLyTvqCkOgkBIW2JRss1dSLc03aH4vPlRQIjFEKITOGu0y5E7+X/gdi7H/dfx4mInJcGvqpEvpQaASFtKUZAU+A5cAZcE8Yi580Buo7Ie/PRddoF6Dn13xB99T0YXQHI/leU7UMt257ZuGNqRzs839gLakNDdlKS9jRXNH20BJ0/vBCds09F5Im5MHiRBJE4u0qllFMQENIWe6RUBZ6ZU+HeayKgIKMHXxFR39KFyFvvovusS7B535MReeA5ICQ7cjIC0uGZVYfL7zjxlaZ684ZaWnubNdlZqwb7EF+5msI3L6Prx5ej69ifIvzAM0BA4q3WQCxVrsK0K6QtDK6pa1UUuHafADeZxkNuDqCwjb5hE6LvLkDffz2K7p9cjp4zfoXooy/RnLWXwjepm5Cj5Y+AkLaIY6zU+ImwU+CetPOgreqkVWMfL0X4yRfR++9z0P2jyxH4xfWIvfBOvzd40JKSUCkICGmLONKmA+qAGdj+SotGOIz4sk8QfuolBG++F4FLrkf3eb9F3033I7FgORCROWsRh8n2TQlpizVEXjfcU3ftv54xzVNNjbp4GUKPP4fe6+4ErwsOXPzvCP72DkSfeQvGui3FkkzacRgC5UlaGw6C2lgHbeIYxD5aiuCcBxG47A8IXHgdei+7CcHr76GQzStILF8NxOROdDYcPluJJKQt0nAYPUFEHnkRgQuuQ/DqOxG661FEX3gbiWWfU8gmWiQppJlyQEBIW6RRNPpo3rpwOeIfLIG+ZiPMy5PKbTaKhH55NSOkLa/xlN5UAAJC2goY5LRdlETHISCkddyQicCVjoCQttLPAOm/4xAQ0jpuyETgSkdASFvpZ4D03zoCNskppLXJQIgYgoBVBIS0VpGSfIKATRAQ0tpkIEQMQcAqAkJaq0hJPkHAJgg4grQ2wUrEEARsgYCQ1hbDIEIIAtYRENJax0pyCgK2QEBIa4thECEEAesICGmtY+WInCJk+SMgpC3/MZYelhkCQtoyG1DpTvkjIKQt/zGWHpYZAkLaMhtQ6Y51BJyaU0jr1JETuSsWASFtxQ69dNypCAhpnTpyInfFIiCkrdihl447FYFSkNapWIncgoAtEBDS2mIYRAhBwDoCQlrrWElOQcAWCAhpbTEMIoQgYB0BIa11rEqRU9oUBHZAQEi7AyRyQBCwNwJCWnuPj0gnCOyAgJB2B0jkgCBgbwSEtPYeH5HOOgIVk1NIWzFDLR0tFwSEtOUyktKPikFASFsxQy0dLRcEhLTlMpLSj4pBIA+krRispKOCgC0QENLaYhhECEHAOgJCWutYSU5BwBYICGltMQwihCBgHYH/BwAA//988snKAAAABklEQVQDAHx2KLqxHpSQAAAAAElFTkSuQmCC","u":"","w":237,"e":1},{"id":"8","layers":[{"ind":7,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[58,61]},"r":{"a":0,"k":0},"s":{"a":0,"k":[116,122]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],"o":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],"v":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],"o":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],"v":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"14","layers":[{"ind":13,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[73,76]},"r":{"a":0,"k":0},"s":{"a":0,"k":[146,152]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],"o":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],"v":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],"o":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],"v":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],"o":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],"v":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"17","layers":[{"ind":10,"ty":0,"parent":6,"ks":{},"w":116,"h":122,"ip":0,"op":55,"st":0,"refId":"8"},{"ind":6,"ty":3,"parent":5,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[6.181,6.13]}},"ip":0,"op":55,"st":0},{"ind":16,"ty":0,"parent":12,"ks":{},"w":146,"h":152,"ip":0,"op":55,"st":0,"refId":"14"},{"ind":12,"ty":3,"parent":11,"ks":{"s":{"a":0,"k":[41.93,41.59]}},"ip":0,"op":55,"st":0},{"ind":11,"ty":3,"parent":4,"ks":{"p":{"a":0,"k":[-0.109,-0.108]}},"ip":0,"op":55,"st":0},{"ind":4,"ty":3,"ks":{"p":{"a":0,"k":[1,1]}},"ip":0,"op":55,"st":0}]},{"id":"24","layers":[{"ind":23,"ty":2,"parent":22,"ks":{"s":{"a":0,"k":[216.03,216.03]}},"ip":0,"op":55,"st":0,"refId":"0"},{"ind":22,"ty":3,"ks":{"s":{"a":0,"k":[15.43,15.43]}},"ip":0,"op":55,"st":0}]},{"id":"32","layers":[{"ind":31,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"37","layers":[{"ind":36,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"43","layers":[{"ind":42,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"48","layers":[{"ind":47,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"53","layers":[{"ind":52,"ty":4,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":55,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":19,"ty":0,"parent":3,"ks":{"a":{"a":0,"k":[31.5,32.5]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":1,"y":1},"o":{"x":1,"y":0}},{"t":12,"s":[0],"h":1},{"t":54,"s":[0],"h":1}]},"p":{"a":0,"k":[30.5,31.5]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]}},{"t":12,"s":[50,50],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[50,50],"h":1}]}},"w":147,"h":153,"ip":0,"op":55,"st":0,"refId":"17"},{"ind":3,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[28.768,29]}},"ip":0,"op":55,"st":0},{"ind":27,"ty":4,"td":1,"parent":21,"ks":{},"ip":0,"op":55,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[39.5,39.5]},"r":{"a":0,"k":150},"s":{"a":0,"k":[79,79]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":26,"ty":0,"tt":1,"parent":21,"ks":{},"w":79,"h":79,"ip":0,"op":55,"st":0,"refId":"24"},{"ind":21,"ty":3,"parent":20,"ks":{"a":{"a":0,"k":[39.5,39.5]},"p":{"a":0,"k":[39.5,39.5]},"r":{"a":1,"k":[{"t":0,"s":[-45],"i":{"x":0,"y":1},"o":{"x":0.5,"y":0}},{"t":54,"s":[0],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":54,"s":[100,100],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":20,"ty":3,"parent":2,"ks":{"p":{"a":0,"k":[69,20]}},"ip":0,"op":55,"st":0},{"ind":34,"ty":0,"parent":30,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"32"},{"ind":30,"ty":3,"parent":29,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.974,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.974,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":39,"ty":0,"parent":35,"ks":{},"w":28,"h":29,"ip":0,"op":55,"st":0,"refId":"37"},{"ind":35,"ty":3,"parent":29,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":55,"st":0},{"ind":29,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":55,"st":0},{"ind":45,"ty":0,"parent":41,"ks":{},"w":13,"h":13,"ip":0,"op":55,"st":0,"refId":"43"},{"ind":41,"ty":3,"parent":40,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[4.474,1.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[4.474,1.541],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":50,"ty":0,"parent":46,"ks":{},"w":29,"h":29,"ip":0,"op":55,"st":0,"refId":"48"},{"ind":46,"ty":3,"parent":40,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":55,"st":0},{"ind":40,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":55,"st":0},{"ind":55,"ty":0,"parent":51,"ks":{},"w":129,"h":127,"ip":0,"op":55,"st":0,"refId":"53"},{"ind":51,"ty":3,"parent":28,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":55,"st":0},{"ind":28,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":1,"k":[{"t":0,"s":[108.343,99.459],"i":{"x":[1,0],"y":[1,1]},"o":{"x":[0,0.5],"y":[0,0]}},{"t":48,"s":[108.343,139.459],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[108.343,139.459],"h":1}]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":48,"s":[60,60],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":54,"s":[60,60],"h":1}]}},"ip":0,"op":55,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{},"ip":0,"op":55,"st":0},{"ind":1,"ty":3,"ks":{},"ip":0,"op":55,"st":0}],"meta":{"g":"https://jitter.video"},"op":54,"v":"5.7.4","w":206}
================================================
FILE: assets/lotties/uni-services.json
================================================
{"assets":[{"h":112,"id":"0","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAYAAADG4PRLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQySURBVHgB7dwxSBtRHMfxv61QEdoIhUIHo841jc41oGNV0N1Fx3ZRp6qLuKibOtSORmhnFUw7alDcCsG0s0kcHEpLUrC00GLzD6RITEzse/fufvL7wOFQuvj1vXv33nFNInIhhCp+RwgaA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JrFo/19PSULhOZTEb29/fF1PDwQwmF7oqJ9PG5HKfPJSg8Dzg6Oirz8/NiQuPZCPjyxWOJ9T0QE0vLp4EKyCkUHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCgwjY1tYmNuRyP8VUONwiQeJ5QP1AgSlbAW8jiBHY2dkpNuRyv8TU00irBInnAVOplNhgI2LWQsBw+J4ECcQUqvRzJaYKhT9iKhRqllhfSILC84D5fL50mRoZGRFTBwcFsSEWM/vWjE1O7oE2PtLT399vPI0WCr9Llyn9YJCOxCBwEjCZTIoNGxsbYmo38U1Maby52XYJAicBbS1kdBSaRkxb+kyWjsLZAER0NoXauA+q8fFxOTk5Kf2sNqXqM2M5dLXnx7fvvogtczPtcnQYlbGxR9Lm05TaVLwuxIHV1VWZnJwU2yoXSZejTkxMSDwev/J/3ie6jT96V43eX/N1VrrdkY9iUdzZg/z29rZ4QUeZRitfl9VauSYSX8ULem/sKD4nXnfZ5iygrU9G3oROpbWmURur0SBwupW2sLAgLmk8vVdW0njrb87kNnAa0I9RWGsafb1+ZmVv1G/ON7N1YWFrRdoInUb1qqSj8NVMRtA5D6h7o66n0lqffN4tLmbQp1JfjpP0kWJzc1Nc0RE4NTVV9d8Wl06hp1Jnz4GVdIGxt7dn/EX7Rum03dXVVXX61iOiD8VnQxdHRfdDR2JR3JcRqPQXOTAwYG2brR79g6m1Dacj8PnQJ8iR6OuJfDni2tqauKBnirWm0nLE4/QPQeL7KxUaUX+p09PTTlanKysrVVelSiM+60vJUvG+iCIw78Towqa3t9fJ4mZra+vae+/i8qk8Ke5ZHhx+l6AL1EtN+oihOye62PAypN536y2edDQOFqfUwaHPVs4QveLbKrQRujmt053uptTa12yU/nHs7OyUNtX/ZzdIV6j6LoweHZmcZNhehQY6YCUdNRpVf0aj0X9BL59CaKjyEVM2my2NNr1svVxVpjEjkVbp6GgpxS2/YlHvUcT2cRJUQLoiHqh7IN0cA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4Bwem7cHEhVMm/HrdKl/DH/NMAAAAASUVORK5CYII=","u":"","w":112,"e":1},{"h":129,"id":"1","p":"data:image/png;base64,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","u":"","w":129,"e":1},{"h":150,"id":"2","p":"data:image/png;base64,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","u":"","w":150,"e":1},{"h":125,"id":"3","p":"data:image/png;base64,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","u":"","w":125,"e":1},{"id":"9","layers":[{"ind":8,"ty":2,"parent":7,"ks":{},"ip":0,"op":240.4,"st":0,"refId":"0"},{"ind":7,"ty":3,"ks":{"s":{"a":0,"k":[37.5,37.5]}},"ip":0,"op":240.4,"st":0}]},{"id":"13","layers":[{"ind":12,"ty":4,"td":1,"parent":6,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[21,21]},"r":{"a":0,"k":21},"s":{"a":0,"k":[42,42]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":11,"ty":0,"tt":1,"parent":6,"ks":{},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"9"},{"ind":6,"ty":3,"ks":{},"ip":0,"op":240.4,"st":0}]},{"id":"18","layers":[{"ind":17,"ty":2,"parent":16,"ks":{"s":{"a":0,"k":[1550.39,1550.39]}},"ip":0,"op":240.4,"st":0,"refId":"1"},{"ind":16,"ty":3,"ks":{"s":{"a":0,"k":[2.15,2.15]}},"ip":0,"op":240.4,"st":0}]},{"id":"22","layers":[{"ind":21,"ty":4,"td":1,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[21.5,21.5]},"r":{"a":0,"k":21},"s":{"a":0,"k":[43,43]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":20,"ty":0,"tt":1,"ks":{},"w":43,"h":43,"ip":0,"op":240.4,"st":0,"refId":"18"}]},{"id":"27","layers":[{"ind":26,"ty":2,"parent":25,"ks":{},"ip":0,"op":240.4,"st":0,"refId":"2"},{"ind":25,"ty":3,"ks":{"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[28,28]}},"ip":0,"op":240.4,"st":0}]},{"id":"31","layers":[{"ind":30,"ty":4,"td":1,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[21,21]},"r":{"a":0,"k":21},"s":{"a":0,"k":[42,42]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":29,"ty":0,"tt":1,"ks":{},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"27"}]},{"id":"36","layers":[{"ind":35,"ty":2,"parent":34,"ks":{"s":{"a":0,"k":[204.8,204.8]}},"ip":0,"op":240.4,"st":0,"refId":"3"},{"ind":34,"ty":3,"ks":{"s":{"a":0,"k":[16.25,16.25]}},"ip":0,"op":240.4,"st":0}]},{"id":"40","layers":[{"ind":39,"ty":4,"td":1,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[20.802,20.802]},"r":{"a":0,"k":27.3},"s":{"a":0,"k":[41.604,41.604]}},{"ty":"fl","c":{"a":0,"k":[0,0,0]},"o":{"a":0,"k":100}}]},{"ind":38,"ty":0,"tt":1,"ks":{},"w":41.604,"h":41.604,"ip":0,"op":240.4,"st":0,"refId":"36"}]},{"id":"47","layers":[{"ind":46,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"52","layers":[{"ind":51,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[28,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"58","layers":[{"ind":57,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[6.5,6.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[13,13]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],"o":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],"v":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{"ty":"fl","c":{"a":0,"k":[0.06,0.06,0.06,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"63","layers":[{"ind":62,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[14.5,14.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[29,29]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],"o":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],"v":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{"ty":"st","c":{"a":0,"k":[0.95,0.95,0.95,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2.6}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],"o":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],"v":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]},{"id":"68","layers":[{"ind":67,"ty":4,"ks":{},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[64.5,63.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[129,127]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":240.4,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],"o":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],"v":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],"o":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],"v":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.12,0.64]],"o":[[0.23,-0.34],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.2,-0.38]],"o":[[-0.06,0.37],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.13,-0.37]],"o":[[-0.14,0.38],[0,0]],"v":[[92.05,71.58],[91.65,72.71]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.18,0.49]],"o":[[0.18,-0.5],[0,0]],"v":[[92.05,71.58],[92.59,70.1]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":false,"i":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],"o":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],"v":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{"ty":"st","c":{"a":0,"k":[0.79,0.82,1,1]},"lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":14.3}},{"ty":"tr","o":{"a":0,"k":100},"s":{"a":0,"k":[75,75]}}]},{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],"o":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],"v":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{"ty":"fl","c":{"a":0,"k":[0.41,0.48,0.92,1]},"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":185,"ip":0,"layers":[{"ind":15,"ty":0,"parent":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":45.18,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":63.06,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[54,122],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":45.18,"s":[54,122],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":63.06,"s":[20,134],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[20,134],"h":1}]}},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"13"},{"ind":24,"ty":0,"parent":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":33.3,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":51.18,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[136,117],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":33.3,"s":[136,117],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":51.18,"s":[157,133],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[157,133],"h":1}]}},"w":43,"h":43,"ip":0,"op":240.4,"st":0,"refId":"22"},{"ind":33,"ty":0,"parent":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":21.48,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":39.36,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[103,20],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":21.48,"s":[103,20],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":39.36,"s":[130,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[130,0],"h":1}]}},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"31"},{"ind":42,"ty":0,"parent":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":9.6,"s":[0],"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"t":27.48,"s":[100],"h":1},{"t":239.4,"s":[100],"h":1}]},"p":{"a":1,"k":[{"t":0,"s":[26,30],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":9.6,"s":[26,30],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":27.48,"s":[12,9],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[12,9],"h":1}]}},"w":42,"h":42,"ip":0,"op":240.4,"st":0,"refId":"40"},{"ind":49,"ty":0,"parent":45,"ks":{},"w":13,"h":13,"ip":0,"op":240.4,"st":0,"refId":"47"},{"ind":45,"ty":3,"parent":44,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":43.86,"s":[4.974,4.541],"i":{"x":[0,1],"y":[1,1]},"o":{"x":[0.5,0],"y":[0,0]}},{"t":72.3,"s":[1.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":87.96,"s":[1.974,4.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":116.4,"s":[6.974,6.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":143.76,"s":[6.974,6.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":172.2,"s":[4.974,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[4.974,4.541],"h":1}]}},"ip":0,"op":240.4,"st":0},{"ind":54,"ty":0,"parent":50,"ks":{},"w":28,"h":29,"ip":0,"op":240.4,"st":0,"refId":"52"},{"ind":50,"ty":3,"parent":44,"ks":{"p":{"a":0,"k":[-3.026,-3.459]}},"ip":0,"op":240.4,"st":0},{"ind":44,"ty":3,"parent":43,"ks":{"p":{"a":0,"k":[113.1,16.9]}},"ip":0,"op":240.4,"st":0},{"ind":60,"ty":0,"parent":56,"ks":{},"w":13,"h":13,"ip":0,"op":240.4,"st":0,"refId":"58"},{"ind":56,"ty":3,"parent":55,"ks":{"p":{"a":1,"k":[{"t":0,"s":[4.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":43.86,"s":[4.474,4.541],"i":{"x":[0,1],"y":[1,1]},"o":{"x":[0.5,0],"y":[0,0]}},{"t":72.3,"s":[1.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":87.96,"s":[1.474,4.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":116.4,"s":[6.474,6.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":143.76,"s":[6.474,6.541],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":172.2,"s":[4.474,4.541],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[4.474,4.541],"h":1}]}},"ip":0,"op":240.4,"st":0},{"ind":65,"ty":0,"parent":61,"ks":{},"w":29,"h":29,"ip":0,"op":240.4,"st":0,"refId":"63"},{"ind":61,"ty":3,"parent":55,"ks":{"p":{"a":0,"k":[-3.526,-3.459]}},"ip":0,"op":240.4,"st":0},{"ind":55,"ty":3,"parent":43,"ks":{"p":{"a":0,"k":[80.6,16.9]}},"ip":0,"op":240.4,"st":0},{"ind":70,"ty":0,"parent":66,"ks":{},"w":129,"h":127,"ip":0,"op":240.4,"st":0,"refId":"68"},{"ind":66,"ty":3,"parent":43,"ks":{"p":{"a":0,"k":[-7.926,-7.559]}},"ip":0,"op":240.4,"st":0},{"ind":43,"ty":3,"parent":5,"ks":{"a":{"a":0,"k":[67.649,55.9]},"p":{"a":0,"k":[100.575,99.459]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":34.8,"s":[100,100],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":82.8,"s":[105,105],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":156,"s":[105,105],"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.5,0.5],"y":[0,0]}},{"t":204,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":239.4,"s":[100,100],"h":1}]}},"ip":0,"op":240.4,"st":0},{"ind":5,"ty":3,"parent":4,"ks":{},"ip":0,"op":240.4,"st":0},{"ind":4,"ty":3,"ks":{},"ip":0,"op":240.4,"st":0}],"meta":{"g":"https://jitter.video"},"op":239.4,"v":"5.7.4","w":206}
================================================
FILE: babel.config.js
================================================
module.exports = function (api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
plugins: [
'react-native-worklets/plugin',
],
};
};
================================================
FILE: components/ActivityIndicator.tsx
================================================
import React, { useEffect } from 'react';
import { ViewStyle } from 'react-native';
import Animated, {
useAnimatedStyle,
useSharedValue,
withRepeat,
withTiming,
Easing,
cancelAnimation,
} from 'react-native-reanimated';
import Svg, { Circle } from 'react-native-svg';
interface ActivityIndicatorProps {
size?: number;
color?: string;
style?: ViewStyle;
}
const ActivityIndicator: React.FC = ({
size = 32,
color = '#000000',
style,
}) => {
const rotation = useSharedValue(0);
useEffect(() => {
rotation.value = withRepeat(
withTiming(360, {
duration: 1000,
easing: Easing.linear,
}),
-1 // Infinite repeat
);
return () => cancelAnimation(rotation);
}, [rotation]);
const animatedStyle = useAnimatedStyle(() => {
return {
transform: [{ rotateZ: `${rotation.value}deg` }],
};
});
const strokeWidth = Math.max(2, size * 0.1);
const radius = (size - strokeWidth) / 2;
const circumference = 2 * Math.PI * radius;
// 75% filled means 0.75 * circumference is drawn, the rest is gap
const strokeDasharray = [circumference * 0.75, circumference];
return (
);
};
export default ActivityIndicator;
================================================
FILE: components/AndroidHeaderBackground.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { Platform, PlatformColor, View } from "react-native";
export default function AndroidHeaderBackground() {
if(Platform.OS !== "android") return null;
const theme = useTheme();
return (
)
}
export const AndroidHeaderProps = {
headerBackVisible: Platform.select({ android: false, default: true }),
headerBackground: AndroidHeaderBackground
}
================================================
FILE: components/AppColorsSelector.tsx
================================================
import React, { useState, useEffect, useMemo, useCallback } from "react";
import { FlatList, View } from "react-native";
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import Typography from "@/ui/components/Typography";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import { useSettingsStore } from "@/stores/settings";
import { Colors, AppColors } from "@/utils/colors";
import adjust from "@/utils/adjustColor";
import { ImpactFeedbackStyle } from "expo-haptics";
export { Colors, AppColors };
interface ColorSelectorProps {
mainColor: string;
backgroundColor: string;
name: string;
onPress?: () => void;
selected: boolean;
itemWidth: number;
}
interface AppColorsSelectorProps {
onChangeColor?: (color: string) => void;
}
const ColorSelector = React.memo(function ColorSelector({
mainColor,
backgroundColor,
name,
onPress,
selected,
itemWidth
}) {
const theme = useTheme();
const handlePress = useCallback(() => {
onPress?.();
}, [onPress]);
const containerStyle = useMemo(() => ({
width: itemWidth,
height: itemWidth * 0.95,
margin: 6,
alignItems: "center" as const,
justifyContent: "center" as const,
backgroundColor,
borderColor: selected ? mainColor : mainColor + "50",
borderWidth: selected ? 4 : 2,
borderRadius: 25,
shadowColor: "#000",
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.07,
shadowRadius: 5,
}), [selected, backgroundColor, mainColor, theme.colors.text, itemWidth]);
const circleStyle = useMemo(() => {
const circleSize = Math.min(itemWidth * 0.4, 50);
return {
width: circleSize,
height: circleSize,
backgroundColor: mainColor,
borderRadius: circleSize / 2,
borderWidth: 3,
borderColor: "#FFFFFF",
shadowColor: "#000",
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.25,
shadowRadius: 3.615,
marginBottom: 6,
};
}, [mainColor, itemWidth]);
return (
{name}
);
});
const AppColorsSelector = React.memo(function AppColorsSelector({
onChangeColor
}) {
const settingsStore = useSettingsStore(state => state.personalization);
const theme = useTheme();
const [containerWidth, setContainerWidth] = useState(0);
const defaultColorData = useMemo(
() => AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0],
[settingsStore.colorSelected]
);
const [selectedColor, setSelectedColor] = useState(defaultColorData.mainColor);
const [color, setColor] = useState(settingsStore.colorSelected || Colors.PINK);
const itemWidth = useMemo(() => {
if (containerWidth === 0) return 100;
return (containerWidth - 36) / 3;
}, [containerWidth]);
useEffect(() => {
const colorData = AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0];
setSelectedColor(colorData.mainColor);
setColor(colorData.colorEnum);
}, [settingsStore.colorSelected]);
const handleColorPress = useCallback((item: typeof AppColors[0]) => {
setSelectedColor(item.mainColor);
setColor(item.colorEnum);
onChangeColor?.(item.mainColor);
}, [onChangeColor]);
const renderItem = useCallback(({ item }: { item: typeof AppColors[0] }) => (
handleColorPress(item)}
itemWidth={itemWidth}
/>
), [selectedColor, theme.dark, handleColorPress, itemWidth]);
return (
item.colorEnum.toString()}
showsHorizontalScrollIndicator={false}
onLayout={(event) => {
const { width } = event.nativeEvent.layout;
setContainerWidth(width);
}}
contentContainerStyle={{
justifyContent: "center",
alignItems: "center",
}}
columnWrapperStyle={{
justifyContent: "space-between",
alignItems: "center",
}}
style={{
width: "100%",
overflow: "hidden"
}}
removeClippedSubviews
maxToRenderPerBatch={6}
windowSize={1}
/>
);
});
export default AppColorsSelector;
================================================
FILE: components/AppProviders.tsx
================================================
import { ThemeProvider } from '@react-navigation/native';
import * as SystemUI from 'expo-system-ui';
import React, { useEffect, useMemo } from 'react';
import { Platform, useColorScheme } from 'react-native';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { DatabaseProvider } from "@/database/DatabaseProvider";
import { DEFAULT_MATERIAL_YOU_ENABLED, useSettingsStore } from '@/stores/settings';
import { AlertProvider } from '@/ui/components/AlertProvider';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { AppColors } from "@/utils/colors";
import { createDarkTheme, createDefaultTheme } from '@/utils/theme/Theme';
interface AppProvidersProps {
children: React.ReactNode;
}
export function AppProviders({ children }: AppProvidersProps) {
const colorScheme = useColorScheme();
const selectedTheme = useSettingsStore(state => state.personalization.theme);
const selectedColorEnum = useSettingsStore(state => state.personalization.colorSelected);
const useMaterialYou = useSettingsStore(state => state.personalization.useMaterialYou) ?? DEFAULT_MATERIAL_YOU_ENABLED;
const color = useMemo(() => {
const color = selectedColorEnum !== null ? AppColors.find(appColor => appColor.colorEnum === selectedColorEnum) : null;
return color || AppColors[0];
}, [selectedColorEnum]);
// Memoize theme selection to prevent unnecessary re-computations
const theme = useMemo(() => {
const defaultTheme = createDefaultTheme(useMaterialYou, color.mainColor);
const darkTheme = createDarkTheme(useMaterialYou, color.mainColor);
const newScheme = selectedTheme === 'auto' ? (colorScheme === 'dark' ? darkTheme : defaultTheme) : (selectedTheme === 'dark' ? darkTheme : defaultTheme);
return newScheme;
}, [colorScheme, color, selectedTheme, useMaterialYou]);
// Memoize background color to prevent string recreation
const backgroundColor = useMemo(() => {
return colorScheme === 'dark' ? '#000000' : '#F5F5F5';
}, [colorScheme]);
// Combined effect for system UI updates to reduce effect overhead
useEffect(() => {
if (runsIOS26) {
SystemUI.setBackgroundColorAsync(backgroundColor);
}
else {
SystemUI.setBackgroundColorAsync("#000000");
}
}, [backgroundColor]);
return (
{children}
);
}
================================================
FILE: components/DevModeNotice.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { Code } from "lucide-react-native";
import React, { memo } from "react";
import { useTranslation } from "react-i18next";
import List from "@/ui/components/List";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
function DevModeNotice() {
const { t } = useTranslation();
const { colors } = useTheme();
return (
{t("TabDevModeNotice_Title")}
{t("TabDevModeNotice_Details")}
);
}
export default DevModeNotice;
================================================
FILE: components/FakeSplash.tsx
================================================
import { SplashScreen } from "expo-router";
import { VideoSource } from 'expo-video';
import React from "react";
import { Image } from "react-native";
import Reanimated, { Easing, withDelay, withTiming } from "react-native-reanimated";
const assetId = require('@/assets/video/splash.mp4');
const videoSource: VideoSource = {
assetId
};
export const PapillonSplashOut = () => {
"worklet";
return {
initialValues: {
opacity: 1,
},
animations: {
opacity: withDelay(100, withTiming(0, {
duration: 250,
easing: Easing.out(Easing.ease),
})),
},
};
};
const FakeSplash = ({ isAppReady, instant }: { isAppReady: boolean, instant?: boolean }) => {
if (instant && isAppReady) {
SplashScreen.hideAsync();
return null;
}
return (
);
};
export default FakeSplash;
================================================
FILE: components/Log/LogIcon.tsx
================================================
import { AlertCircle, Info, TriangleAlert } from 'lucide-react-native';
import React from 'react';
import { View } from 'react-native';
import { LogType } from '@/stores/logs/types';
const ICON_COLORS: Record = {
ERROR: '#BE0B00',
WARN: '#CF6B0F',
INFO: '#0E7CCB',
LOG: '#AAA',
};
const ICON_COMPONENTS: Record> = {
ERROR: AlertCircle,
WARN: TriangleAlert,
INFO: Info,
LOG: Info,
};
const LogIcon: React.FC<{ type: LogType }> = ({ type }) => {
const backgroundColor = ICON_COLORS[type] || ICON_COLORS.LOG;
const Icon = ICON_COMPONENTS[type] || ICON_COMPONENTS.LOG;
return (
);
};
export default LogIcon;
================================================
FILE: components/ModalOverhead.tsx
================================================
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import Typography, { Variant } from "@/ui/components/Typography";
import adjust from "@/utils/adjustColor";
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React from "react";
import { Platform, Text, View, ViewStyle } from "react-native";
const ModalOverhead = ({ style, overhead, overtitle, color, emoji, subject, subjectVariant = "title", title, date, dateFormat }: { style?: ViewStyle, overhead?: React.ReactNode, overtitle?: string, color: string, emoji: string, subject: string, subjectVariant?: Variant, title?: string, date?: Date, dateFormat?: Intl.DateTimeFormatOptions }) => {
const theme = useTheme();
return (
{emoji}
{overhead}
{overtitle && (
{overtitle}
)}
{subject && (
{subject}
)}
{title && (
{title}
)}
{date && (
{new Date(date).toLocaleDateString(undefined, dateFormat ? dateFormat : {
day: "numeric",
month: "long",
year: "numeric",
})}
)}
)
}
const ModalOverHeadScore = ({ color, score, outOf }: { color: string, score: string, outOf: number }) => {
const theme = useTheme();
return (
{score}
/{outOf}
)
}
export default ModalOverhead;
export { ModalOverHeadScore };
================================================
FILE: components/RootNavigator.tsx
================================================
import { useTheme } from '@react-navigation/native';
import { Stack } from 'expo-router';
import { t } from 'i18next';
import React, { useMemo } from 'react';
import { Platform, StatusBar, View } from 'react-native';
import {
AI_SCREEN_OPTIONS,
ALERT_SCREEN_OPTIONS,
CHANGELOG_SCREEN_OPTIONS,
CONSENT_SCREEN_OPTIONS,
DEMO_SCREEN_OPTIONS,
DEVMODE_SCREEN_OPTIONS,
STACK_SCREEN_OPTIONS
} from '@/constants/LayoutScreenOptions';
import getCorners from '@/ui/utils/Corners';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { screenOptions } from '@/utils/theme/ScreenOptions';
import AndroidHeaderBackground from './AndroidHeaderBackground';
export function RootNavigator() {
const theme = useTheme();
const corners = getCorners();
// Memoize combined screen options to prevent object recreation
const stackScreenOptions = useMemo(() => ({
...screenOptions,
...STACK_SCREEN_OPTIONS,
contentStyle: {
backgroundColor: theme.colors.background
}
}), [theme]);
return (
{Platform.OS === "android" && }
2 ? corners - 2 : 0,
overflow: "hidden"
}
}}
/>
);
}
================================================
FILE: components/SettingsHeader.tsx
================================================
import { Papicons } from "@getpapillon/papicons"
import { useTheme } from "@react-navigation/native"
import { Image, ImageSourcePropType, View, Switch } from "react-native"
import Stack from "@/ui/components/Stack"
import Typography from "@/ui/components/Typography"
import Icon from "@/ui/components/Icon"
import NativeSwitch from "@/ui/native/NativeSwitch"
interface SettingsHeaderProps {
color: string
title: string
description: string
iconName?: string
imageSource?: ImageSourcePropType
height?: number
showSwitch?: boolean
switchValue?: boolean
onSwitchChange?: (value: boolean) => void
switchLabel?: string
switchColor?: string
disableMargin?: boolean
}
export default function SettingsHeader({
color,
title,
description,
iconName,
imageSource,
height = 280,
showSwitch = false,
switchValue = false,
onSwitchChange,
switchLabel,
switchColor,
disableMargin = false,
}: SettingsHeaderProps) {
const theme = useTheme()
const { colors } = theme
return (
{imageSource && (
)}
{iconName && (
)}
{title}
{description}
{showSwitch && (
{switchLabel && (
{switchLabel}
)}
)}
)
}
================================================
FILE: components/Transit.tsx
================================================
import { Cross, Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import * as Linking from "expo-linking";
import * as Location from "expo-location";
import * as React from "react";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { Alert, Dimensions, TouchableOpacity, View } from "react-native";
import { Text } from "react-native";
import Svg, { Path } from "react-native-svg";
import { PathProps } from "react-native-svg/src/elements/Path";
import { AvailableTransportServices } from "@/constants/AvailableTransportServices";
import * as TransitService from "@/services/transit";
import { Route } from "@/services/transit/models/Route";
import { TransportAddress } from "@/stores/account/types";
import Typography from "@/ui/components/Typography";
const TransitLogo = (props: PathProps) => (
);
const Dot = (params: { opacity: number }): React.ReactNode => {
const theme = useTheme();
return (
);
};
export interface TransitProps {
isDeparture: boolean;
homeAddress?: TransportAddress;
schoolAddress?: TransportAddress;
targetTime: number;
service: string;
}
const routeIcons: { [key: string]: string } = {
"bus": "Bus",
"metro": "Metro",
"train": "Bus",
"tram": "Tramway",
"tramway": "Tramway",
};
export const Transit = ({
isDeparture,
homeAddress,
schoolAddress,
targetTime,
service,
}: TransitProps): React.ReactNode | null => {
const transit: TransitService.default = new TransitService.default();
const theme = useTheme();
const { t } = useTranslation();
const [status] = Location.useForegroundPermissions();
const [routeFound, setRouteFound] = React.useState(false);
const [error, setError] = React.useState<{
title: string;
description: string;
} | null>(null);
const [_transitRoutes, setTransitRoutes] = React.useState([]);
const [routeStartTime, setRouteStartTime] = React.useState(0);
const [routeIcon, setRouteIcon] = React.useState(null);
const [routesCount, setRoutesCount] = React.useState(0);
const getTransportResult = async () => {
if (service !== "transit") {
return;
}
try {
if (schoolAddress === undefined || homeAddress === undefined) {
throw new Error("Transport_Error_Address_Not_Set");
}
const from = isDeparture ? homeAddress : schoolAddress;
const to = isDeparture ? schoolAddress : homeAddress;
if (to.firstTitle === "current_location") {
throw new Error("Transport_Error_Cant_Go_To_Current_Location");
}
const departureLocation = await getFromLocation(from);
const routeOption: {
locale: string;
arrivalTime?: number;
leaveTime?: number;
} = { locale: "fr" };
if (isDeparture) {
routeOption.arrivalTime = targetTime;
} else {
routeOption.leaveTime = targetTime;
}
const routes = await transit.plan(
departureLocation.latitude,
departureLocation.longitude,
to.latitude,
to.longitude,
routeOption
);
if (routes.results.length > 0) {
setRouteFound(true);
const selectedTrip = routes.results[0];
const allRoutes = selectedTrip.legs.flatMap(leg =>
leg.leg_mode === "transit" && leg.routes.length > 0
? [leg.routes[0]]
: []
);
setTransitRoutes([...allRoutes].splice(0, 2));
setRoutesCount(allRoutes.length);
const routeType = allRoutes.length > 0 ? allRoutes[0].mode_name.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") : null;
if (routeType && routeIcons[routeType]) {
setRouteIcon(routeIcons[routeType]);
} else {
setRouteIcon(null);
}
setRouteStartTime(Number(selectedTrip.start_time));
}
} catch (e: unknown) {
setError({
title: `${(e as Error).message}_Title`,
description: `${(e as Error).message}_Description`,
});
}
};
const formatStartTime = (timestamp: number): string => {
const date = new Date(timestamp * 1000);
const now = new Date().getTime();
const toNow = (date.getTime() - now);
if (toNow < 0) {
return t("Transport_Open_In");
}
const minutes = Math.floor(toNow / 60);
const hours = Math.floor(toNow / (60 * 60));
if (hours < 1) {
return `${t("Transport_Leave_In")} ${minutes}min - ${t("Transport_From")}`;
} else if (hours < 2) {
return `${t("Transport_Leave_In")} ${hours}h${minutes} - ${t("Transport_From")}`;
}
return `${t("Transport_Leave_At")} ${date.toLocaleTimeString("fr-FR", { hour: "numeric", minute: "numeric" })} - ${t("Transport_From")}`;
};
const getFromLocation = async (
from: TransportAddress
): Promise<{
longitude: number;
latitude: number;
}> => {
if (from.firstTitle === "current_location") {
if (!status?.granted) {
throw new Error("Transport_Error_Location");
}
const location = await Location.getCurrentPositionAsync();
return {
latitude: location.coords.latitude,
longitude: location.coords.longitude,
};
}
return {
latitude: from.latitude,
longitude: from.longitude,
};
};
const openInDefaultApp = () => {
const app:
| {
id: string;
name: string;
icon: unknown;
generateDeeplink: (
from: TransportAddress,
to: TransportAddress,
isDeparture: boolean,
targetTime: number
) => string;
}
| undefined = AvailableTransportServices.find(el => el.id === service);
if (app === undefined) {
Alert.alert(
t("Transport_Error_Unknown_Service_Title"),
t("Transport_Error_Unknown_Service_Description")
);
return;
}
const from = isDeparture ? homeAddress : schoolAddress;
const to = isDeparture ? schoolAddress : homeAddress;
const url = app.generateDeeplink(from!, to!, isDeparture, targetTime);
if (!Linking.canOpenURL(url)) {
Alert.alert(
t("Transport_Error_Cant_Open_Deeplink_Title"),
t("Transport_Error_Cant_Open_Deeplink_Description")
);
return;
}
Linking.openURL(url);
}
useEffect(() => {
if (status !== null) {
getTransportResult();
}
}, [status]);
if (homeAddress === undefined || schoolAddress === undefined) {
return null;
}
if (homeAddress.firstTitle === "current_location" && !isDeparture) {
return null;
}
return (
{error ? (
{error.title}
{error.description}
) : (
{_transitRoutes.length > 0 && (
)}
{isDeparture ? schoolAddress.firstTitle : homeAddress.firstTitle}
{routeFound
? `${formatStartTime(routeStartTime)}`
: t("Transport_Open_In")}
{service === "transit" && }
{AvailableTransportServices.find(el => el.id === service)?.name ??
t("Transport_Maps_App")}
)}
);
};
const TransitRoutes = ({ routes, routesCount, routeIcon }: { routes: Route[]; routesCount: number; routeIcon: string | null }): React.ReactNode => {
const theme = useTheme();
return (
{routeIcon && }
{routes.map((route, index) => (
{route.route_short_name}
))}
{routesCount > routes.length && (
+{routesCount - routes.length}
)}
);
}
================================================
FILE: components/UnderConstructionNotice.tsx
================================================
import { AlertTriangle } from "lucide-react-native";
import React, { memo } from "react";
import { useTranslation } from "react-i18next";
import List from "@/ui/components/List";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
function UnderConstructionNotice() {
const { t } = useTranslation();
return (
{t("TabUnderConstruction_Title")}
{t("TabUnderConstruction_Details")}
);
}
export default UnderConstructionNotice;
================================================
FILE: components/onboarding/OnboardingBackButton.tsx
================================================
import { useRouter } from "expo-router";
import { Papicons } from "@getpapillon/papicons";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import React from "react";
import { useSafeAreaInsets } from "react-native-safe-area-context";
const OnboardingBackButton = (props: {
icon?: string;
position?: 'left' | 'right';
}) => {
const router = useRouter();
const insets = useSafeAreaInsets();
return (
router.back()}
style={[
{
position: 'absolute',
top: insets.top + 4,
zIndex: 200,
backgroundColor: '#ffffff42',
padding: 10,
borderRadius: 100,
},
props.position === 'right' ? { right: 16 } : { left: 16 }
]}
>
)
}
export default OnboardingBackButton;
================================================
FILE: components/onboarding/OnboardingInput.tsx
================================================
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import React from "react";
import { KeyboardTypeOptions, Platform, TextInput, TextInputProps } from "react-native";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
const OnboardingInput = ({ placeholder, text, setText, isPassword, icon, inputProps }: {
placeholder: string
text: string
setText: (text: string) => void
icon: string
isPassword?: boolean
keyboardType?: KeyboardTypeOptions
inputProps: TextInputProps
}) => {
const { colors, dark } = useTheme();
return (
)
}
export default OnboardingInput;
================================================
FILE: components/onboarding/OnboardingScrollingFlatList.tsx
================================================
import { useFocusEffect } from "expo-router";
import LottieView from "lottie-react-native";
import React from "react";
import { useTranslation } from "react-i18next";
import { FlatList, ListRenderItemInfo } from "react-native";
import Reanimated, {
Extrapolate,
interpolate,
useAnimatedScrollHandler,
useAnimatedStyle,
useSharedValue,
} from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import ViewContainer from "@/ui/components/ViewContainer";
const AnimatedFlatList = Reanimated.createAnimatedComponent(FlatList);
const OnboardingScrollingFlatList = ({ lottie, hasReturnButton = true, title, color, step, totalSteps, elements, renderItem }: {
lottie?: string
hasReturnButton?: boolean,
title: string
color: string
step: number
totalSteps: number
elements: unknown[]
renderItem: (info: ListRenderItemInfo) => React.JSX.Element
}) => {
const insets = useSafeAreaInsets();
const animation = React.useRef(null);
const scrollY = React.useRef(useSharedValue(0)).current;
const { t } = useTranslation();
const height: number = lottie ? 500 : 250;
const scrollHandler = useAnimatedScrollHandler({
onScroll: (event) => {
scrollY.value = event.contentOffset.y;
},
});
const AnimatedHeaderStyle = useAnimatedStyle(() => ({
maxHeight: interpolate(
scrollY.value,
[0, height - 270],
[height, 270],
Extrapolate.CLAMP
),
height: height,
position: "absolute",
top: 0,
left: 0,
right: 0,
zIndex: 2,
transform: [
{
scaleY: interpolate(
scrollY.value,
[-500, 0],
[1.2, 1],
Extrapolate.CLAMP
)
},
]
}));
const AnimatedLottieContainerStyle = useAnimatedStyle(() => ({
opacity: interpolate(
scrollY.value,
[0, height - 270],
[1, 0],
Extrapolate.CLAMP
),
transform: [
{
scale: interpolate(
scrollY.value,
[0, height - 270],
[1, 0.8],
Extrapolate.CLAMP
),
},
],
}));
useFocusEffect(
React.useCallback(() => {
if (animation.current) {
animation.current.reset();
animation.current.play();
}
}, [])
);
return (
{lottie && (
)}
{t('OnBoarding_Step') + step}
{t('OnBoarding_Step_Of') + totalSteps}
{title}
{hasReturnButton && (
)}
)
}
export default OnboardingScrollingFlatList;
================================================
FILE: components/onboarding/OnboardingWebview.tsx
================================================
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React, { useEffect } from "react";
import { ActivityIndicator, Keyboard, KeyboardAvoidingView, View } from "react-native";
import { useSharedValue, withSpring, withTiming } from "react-native-reanimated";
import Animated from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { WebView, WebViewProps } from "react-native-webview";
import OnboardingBackButton from "@/components/onboarding/OnboardingBackButton";
import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import ViewContainer from "@/ui/components/ViewContainer";
const OnboardingWebview = ({ title, color, step, totalSteps, webviewProps, webViewRef }: {
title: string
color: string
step: number
totalSteps: number
webviewProps: WebViewProps
webViewRef?: React.RefObject | null>
}) => {
const insets = useSafeAreaInsets();
const { colors } = useTheme();
const [totallyLoaded, setTotallyLoaded] = React.useState(false);
const titleOpacity = useSharedValue(1);
const headerHeight = useSharedValue(150 + insets.top);
useEffect(() => {
const showSubscription = Keyboard.addListener("keyboardDidShow", onKeyboardShow);
const hideSubscription = Keyboard.addListener("keyboardDidHide", onKeyboardHide);
return () => {
showSubscription.remove();
hideSubscription.remove();
};
}, []);
const onKeyboardShow = () => {
titleOpacity.value = withTiming(0, { duration: 100 });
headerHeight.value = withTiming(60 + insets.top, { stiffness: 500, damping: 50 });
};
const onKeyboardHide = () => {
titleOpacity.value = withSpring(1, { stiffness: 200, damping: 20 });
headerHeight.value = withSpring(150 + insets.top, { stiffness: 500, damping: 50 });
};
return (
{"Étape " + step}
{"sur " + totalSteps}
{title}
{t("Webview_Wait")}
{t("Onboarding_Load_Webview_Description")}
{
webviewProps.onLoadEnd?.(e);
if (e.nativeEvent.url.includes("pronote")) {
if (e.nativeEvent.url !== webviewProps.source?.uri) {
setTotallyLoaded(true);
}
} else if (e.nativeEvent.url.includes("https://")) {
setTotallyLoaded(true);
}
}}
/>
);
};
export default OnboardingWebview;
================================================
FILE: components/router/BottomTabs.tsx
================================================
import {
createNativeBottomTabNavigator,
NativeBottomTabNavigationEventMap,
NativeBottomTabNavigationOptions,
} from '@bottom-tabs/react-navigation';
import { ParamListBase, TabNavigationState } from '@react-navigation/native';
import { withLayoutContext } from 'expo-router';
const BottomTabNavigator = createNativeBottomTabNavigator().Navigator;
export const Tabs = withLayoutContext<
NativeBottomTabNavigationOptions,
typeof BottomTabNavigator,
TabNavigationState,
NativeBottomTabNavigationEventMap
>(BottomTabNavigator);
================================================
FILE: constants/AvailableTransportServices.ts
================================================
import { Platform } from "react-native";
import { TransportAddress } from "@/stores/account/types";
export const AvailableTransportServices = [
{
id: "transit",
name: "Transit",
icon: require(`@/assets/images/transport/transit.png`),
baseUrlScheme: "transit://",
generateDeeplink: (
from: TransportAddress,
to: TransportAddress,
isDeparture: boolean,
targetTime: number
): string => {
return `transit://directions?from=${from.firstTitle === "current_location" ? "" : `${from.address}`}&to=${to.address}&${isDeparture ? `arrive_by=${targetTime}` : `leave_at=${targetTime}`}`;
},
},
Platform.OS === "ios" && {
id: "apple_maps",
name: "Apple Maps",
icon: require(`@/assets/images/transport/apple_maps.png`),
baseUrlScheme: "maps://",
generateDeeplink: (
from: TransportAddress,
to: TransportAddress,
isDeparture: boolean,
targetTime: number
): string => {
// Apple Maps don't support time in URL... :(
return `maps://?${from.firstTitle === "current_location" ? "" : `saddr=${from.latitude},${from.longitude}&`}daddr=${to.latitude},${to.longitude}`;
},
},
{
id: "google_maps",
name: "Google Maps",
icon: require(`@/assets/images/transport/google_maps.png`),
baseUrlScheme: "https://www.google.com/maps/dir/",
generateDeeplink: (
from: TransportAddress,
to: TransportAddress,
isDeparture: boolean,
targetTime: number
): string => {
// Google too, what the f*ck ??
return `https://www.google.com/maps/dir/?api=1&${from.firstTitle === "current_location" ? "" : `origin=${from.latitude},${from.longitude}&`}destination=${to.latitude},${to.longitude}`;
},
},
].filter(Boolean) as Array<{
id: string;
name: string;
icon: any;
baseUrlScheme: string;
generateDeeplink: (
from: TransportAddress,
to: TransportAddress,
isDeparture: boolean,
targetTime: number
) => string;
}>;
================================================
FILE: constants/LayoutScreenOptions.ts
================================================
import { Platform } from 'react-native';
import "@/utils/i18n";
import { t } from 'i18next';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
export const FONT_CONFIG = {
light: require('../assets/fonts/SNPro-Light.ttf'),
regular: require('../assets/fonts/SNPro-Regular.ttf'),
medium: require('../assets/fonts/SNPro-Medium.ttf'),
semibold: require('../assets/fonts/SNPro-Semibold.ttf'),
bold: require('../assets/fonts/SNPro-Bold.ttf'),
black: require('../assets/fonts/SNPro-Black.ttf'),
serif_light: require('../assets/fonts/NotoSerif-Light.ttf'),
serif_regular: require('../assets/fonts/NotoSerif-Regular.ttf'),
serif_medium: require('../assets/fonts/NotoSerif-Medium.ttf'),
serif_bold: require('../assets/fonts/NotoSerif-Bold.ttf'),
serif_black: require('../assets/fonts/NotoSerif-Black.ttf'),
} as const;
export const STACK_SCREEN_OPTIONS = {
headerBackButtonDisplayMode: "minimal" as const,
};
export const ALERT_SCREEN_OPTIONS = {
headerShown: false,
presentation: 'formSheet' as const,
sheetAllowedDetents: Platform.OS === 'ios' ? 'fitToContents' as const : [0.9],
sheetCornerRadius: Platform.OS === 'ios' ? undefined : 32,
sheetGrabberVisible: false,
sheetExpandsWhenScrolledToEdge: false,
sheetInitialDetentIndex: 0,
} as const;
export const DEVMODE_SCREEN_OPTIONS = {
headerTitle: "DevMode",
headerBackButtonDisplayMode: "minimal" as const,
} as const;
export const DEMO_SCREEN_OPTIONS = {
headerTitle: "Components Demo",
headerBackButtonDisplayMode: "minimal" as const,
};
export const CONSENT_SCREEN_OPTIONS = {
gesturesEnabled: false,
fullScreenGestureEnabled: false,
presentation: "fullScreenModal" as const,
backButtonVisible: false,
headerLargeTitle: false,
headerShown: false,
} as const;
export const CHANGELOG_SCREEN_OPTIONS = {
headerTitle: t("Changelog_Title"),
headerLargeTitle: false,
};
export const AI_SCREEN_OPTIONS = {
headerTitle: "AI",
headerShown: false,
};
================================================
FILE: constants/UnicodeEmojis.ts
================================================
export const UnicodeEmojis = {
smileys_and_emotion: {
icon: "Emoji",
emojis: [0x1F600, 0x1F603, 0x1F604, 0x1F601, 0x1F606, 0x1F605, 0x1F923, 0x1F602, 0x1F642, 0x1F643, 0x1FAE0, 0x1F609, 0x1F60A, 0x1F607, 0x1F970, 0x1F60D, 0x1F929, 0x1F618, 0x1F617, 0x263A, 0x1F61A, 0x1F619, 0x1F972, 0x1F60B, 0x1F61B, 0x1F61C, 0x1F92A, 0x1F61D, 0x1F911, 0x1F917, 0x1F92D, 0x1FAE2, 0x1FAE3, 0x1F92B, 0x1F914, 0x1FAE1, 0x1F910, 0x1F928, 0x1F610, 0x1F611, 0x1F636, 0x1FAE5, 0x1F636, 0x1F60F, 0x1F612, 0x1F644, 0x1F62C, 0x1F62E, 0x1F925, 0x1FAE8, 0x1F642, 0x1F642, 0x1F60C, 0x1F614, 0x1F62A, 0x1F924, 0x1F634, 0x1FAE9, 0x1F637, 0x1F912, 0x1F915, 0x1F922, 0x1F92E, 0x1F927, 0x1F975, 0x1F976, 0x1F974, 0x1F635, 0x1F635, 0x1F92F, 0x1F920, 0x1F973, 0x1F978, 0x1F60E, 0x1F913, 0x1F9D0, 0x1F615, 0x1FAE4, 0x1F61F, 0x1F641, 0x2639, 0x1F62E, 0x1F62F, 0x1F632, 0x1F633, 0x1FAEA, 0x1F97A, 0x1F979, 0x1F626, 0x1F627, 0x1F628, 0x1F630, 0x1F625, 0x1F622, 0x1F62D, 0x1F631, 0x1F616, 0x1F623, 0x1F61E, 0x1F613, 0x1F629, 0x1F62B, 0x1F971, 0x1F624, 0x1F621, 0x1F620, 0x1F92C, 0x1F608, 0x1F47F, 0x1F480, 0x2620, 0x1F4A9, 0x1F921, 0x1F479, 0x1F47A, 0x1F47B, 0x1F47D, 0x1F47E, 0x1F916, 0x1F63A, 0x1F638, 0x1F639, 0x1F63B, 0x1F63C, 0x1F63D, 0x1F640, 0x1F63F, 0x1F63E, 0x1F648, 0x1F649, 0x1F64A, 0x1F48C, 0x1F498, 0x1F49D, 0x1F496, 0x1F497, 0x1F493, 0x1F49E, 0x1F495, 0x1F49F, 0x2763, 0x1F494, 0x2764, 0x2764, 0x2764, 0x1FA77, 0x1F9E1, 0x1F49B, 0x1F49A, 0x1F499, 0x1FA75, 0x1F49C, 0x1F90E, 0x1F5A4, 0x1FA76, 0x1F90D, 0x1F48B, 0x1F4AF, 0x1F4A2, 0x1FAEF, 0x1F4A5, 0x1F4AB, 0x1F4A6, 0x1F4A8, 0x1F573, 0x1F4AC, 0x1F441, 0x1F5E8, 0x1F5EF, 0x1F4AD, 0x1F4A4, ]
},
people_and_body: {
icon: "Accessibility",
emojis: [0x1F44B, 0x1F44B, 0x1F44B, 0x1F44B, 0x1F44B, 0x1F44B, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F590, 0x1F590, 0x1F590, 0x1F590, 0x1F590, 0x1F590, 0x270B, 0x270B, 0x270B, 0x270B, 0x270B, 0x270B, 0x1F596, 0x1F596, 0x1F596, 0x1F596, 0x1F596, 0x1F596, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90F, 0x1F90F, 0x1F90F, 0x1F90F, 0x1F90F, 0x1F90F, 0x270C, 0x270C, 0x270C, 0x270C, 0x270C, 0x270C, 0x1F91E, 0x1F91E, 0x1F91E, 0x1F91E, 0x1F91E, 0x1F91E, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F918, 0x1F918, 0x1F918, 0x1F918, 0x1F918, 0x1F918, 0x1F919, 0x1F919, 0x1F919, 0x1F919, 0x1F919, 0x1F919, 0x1F448, 0x1F448, 0x1F448, 0x1F448, 0x1F448, 0x1F448, 0x1F449, 0x1F449, 0x1F449, 0x1F449, 0x1F449, 0x1F449, 0x1F446, 0x1F446, 0x1F446, 0x1F446, 0x1F446, 0x1F446, 0x1F595, 0x1F595, 0x1F595, 0x1F595, 0x1F595, 0x1F595, 0x1F447, 0x1F447, 0x1F447, 0x1F447, 0x1F447, 0x1F447, 0x261D, 0x261D, 0x261D, 0x261D, 0x261D, 0x261D, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44E, 0x1F44E, 0x1F44E, 0x1F44E, 0x1F44E, 0x1F44E, 0x270A, 0x270A, 0x270A, 0x270A, 0x270A, 0x270A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F64C, 0x1F64C, 0x1F64C, 0x1F64C, 0x1F64C, 0x1F64C, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1F450, 0x1F450, 0x1F450, 0x1F450, 0x1F450, 0x1F450, 0x1F932, 0x1F932, 0x1F932, 0x1F932, 0x1F932, 0x1F932, 0x1F91D, 0x1F91D, 0x1F91D, 0x1F91D, 0x1F91D, 0x1F91D, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1F64F, 0x1F64F, 0x1F64F, 0x1F64F, 0x1F64F, 0x1F64F, 0x270D, 0x270D, 0x270D, 0x270D, 0x270D, 0x270D, 0x1F485, 0x1F485, 0x1F485, 0x1F485, 0x1F485, 0x1F485, 0x1F933, 0x1F933, 0x1F933, 0x1F933, 0x1F933, 0x1F933, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F9BE, 0x1F9BF, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F442, 0x1F442, 0x1F442, 0x1F442, 0x1F442, 0x1F442, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F443, 0x1F443, 0x1F443, 0x1F443, 0x1F443, 0x1F443, 0x1F9E0, 0x1FAC0, 0x1FAC1, 0x1F9B7, 0x1F9B4, 0x1F440, 0x1F441, 0x1F445, 0x1F444, 0x1FAE6, 0x1F476, 0x1F476, 0x1F476, 0x1F476, 0x1F476, 0x1F476, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F466, 0x1F466, 0x1F466, 0x1F466, 0x1F466, 0x1F466, 0x1F467, 0x1F467, 0x1F467, 0x1F467, 0x1F467, 0x1F467, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F474, 0x1F474, 0x1F474, 0x1F474, 0x1F474, 0x1F474, 0x1F475, 0x1F475, 0x1F475, 0x1F475, 0x1F475, 0x1F475, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F977, 0x1F977, 0x1F977, 0x1F977, 0x1F977, 0x1F977, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1F934, 0x1F934, 0x1F934, 0x1F934, 0x1F934, 0x1F934, 0x1F478, 0x1F478, 0x1F478, 0x1F478, 0x1F478, 0x1F478, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F472, 0x1F472, 0x1F472, 0x1F472, 0x1F472, 0x1F472, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F930, 0x1F930, 0x1F930, 0x1F930, 0x1F930, 0x1F930, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1F931, 0x1F931, 0x1F931, 0x1F931, 0x1F931, 0x1F931, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F385, 0x1F385, 0x1F385, 0x1F385, 0x1F385, 0x1F385, 0x1F936, 0x1F936, 0x1F936, 0x1F936, 0x1F936, 0x1F936, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DE, 0x1F9DE, 0x1F9DE, 0x1F9DF, 0x1F9DF, 0x1F9DF, 0x1F9CC, 0x1FAC8, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F483, 0x1F483, 0x1F483, 0x1F483, 0x1F483, 0x1F483, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F574, 0x1F574, 0x1F574, 0x1F574, 0x1F574, 0x1F574, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F93A, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x26F7, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F46D, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F46B, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F46C, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F491, 0x1F491, 0x1F491, 0x1F491, 0x1F491, 0x1F491, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F5E3, 0x1F464, 0x1F465, 0x1FAC2, 0x1F46A, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F463, 0x1FAC6, ]
},
component: {
icon: "Code",
emojis: []
},
animals_and_nature: {
icon: "Butterfly",
emojis: [0x1F435, 0x1F412, 0x1F98D, 0x1F9A7, 0x1F436, 0x1F415, 0x1F9AE, 0x1F415, 0x1F429, 0x1F43A, 0x1F98A, 0x1F99D, 0x1F431, 0x1F408, 0x1F408, 0x1F981, 0x1F42F, 0x1F405, 0x1F406, 0x1F434, 0x1FACE, 0x1FACF, 0x1F40E, 0x1F984, 0x1F993, 0x1F98C, 0x1F9AC, 0x1F42E, 0x1F402, 0x1F403, 0x1F404, 0x1F437, 0x1F416, 0x1F417, 0x1F43D, 0x1F40F, 0x1F411, 0x1F410, 0x1F42A, 0x1F42B, 0x1F999, 0x1F992, 0x1F418, 0x1F9A3, 0x1F98F, 0x1F99B, 0x1F42D, 0x1F401, 0x1F400, 0x1F439, 0x1F430, 0x1F407, 0x1F43F, 0x1F9AB, 0x1F994, 0x1F987, 0x1F43B, 0x1F43B, 0x1F428, 0x1F43C, 0x1F9A5, 0x1F9A6, 0x1F9A8, 0x1F998, 0x1F9A1, 0x1F43E, 0x1F983, 0x1F414, 0x1F413, 0x1F423, 0x1F424, 0x1F425, 0x1F426, 0x1F427, 0x1F54A, 0x1F985, 0x1F986, 0x1F9A2, 0x1F989, 0x1F9A4, 0x1FAB6, 0x1F9A9, 0x1F99A, 0x1F99C, 0x1FABD, 0x1F426, 0x1FABF, 0x1F426, 0x1F438, 0x1F40A, 0x1F422, 0x1F98E, 0x1F40D, 0x1F432, 0x1F409, 0x1F995, 0x1F996, 0x1F433, 0x1F40B, 0x1F42C, 0x1FACD, 0x1F9AD, 0x1F41F, 0x1F420, 0x1F421, 0x1F988, 0x1F419, 0x1F41A, 0x1FAB8, 0x1FABC, 0x1F980, 0x1F99E, 0x1F990, 0x1F991, 0x1F9AA, 0x1F40C, 0x1F98B, 0x1F41B, 0x1F41C, 0x1F41D, 0x1FAB2, 0x1F41E, 0x1F997, 0x1FAB3, 0x1F577, 0x1F578, 0x1F982, 0x1F99F, 0x1FAB0, 0x1FAB1, 0x1F9A0, 0x1F490, 0x1F338, 0x1F4AE, 0x1FAB7, 0x1F3F5, 0x1F339, 0x1F940, 0x1F33A, 0x1F33B, 0x1F33C, 0x1F337, 0x1FABB, 0x1F331, 0x1FAB4, 0x1F332, 0x1F333, 0x1F334, 0x1F335, 0x1F33E, 0x1F33F, 0x2618, 0x1F340, 0x1F341, 0x1F342, 0x1F343, 0x1FAB9, 0x1FABA, 0x1F344, 0x1FABE, ]
},
food_and_drink: {
icon: "Cutlery",
emojis: [0x1F347, 0x1F348, 0x1F349, 0x1F34A, 0x1F34B, 0x1F34B, 0x1F34C, 0x1F34D, 0x1F96D, 0x1F34E, 0x1F34F, 0x1F350, 0x1F351, 0x1F352, 0x1F353, 0x1FAD0, 0x1F95D, 0x1F345, 0x1FAD2, 0x1F965, 0x1F951, 0x1F346, 0x1F954, 0x1F955, 0x1F33D, 0x1F336, 0x1FAD1, 0x1F952, 0x1F96C, 0x1F966, 0x1F9C4, 0x1F9C5, 0x1F95C, 0x1FAD8, 0x1F330, 0x1FADA, 0x1FADB, 0x1F344, 0x1FADC, 0x1F35E, 0x1F950, 0x1F956, 0x1FAD3, 0x1F968, 0x1F96F, 0x1F95E, 0x1F9C7, 0x1F9C0, 0x1F356, 0x1F357, 0x1F969, 0x1F953, 0x1F354, 0x1F35F, 0x1F355, 0x1F32D, 0x1F96A, 0x1F32E, 0x1F32F, 0x1FAD4, 0x1F959, 0x1F9C6, 0x1F95A, 0x1F373, 0x1F958, 0x1F372, 0x1FAD5, 0x1F963, 0x1F957, 0x1F37F, 0x1F9C8, 0x1F9C2, 0x1F96B, 0x1F371, 0x1F358, 0x1F359, 0x1F35A, 0x1F35B, 0x1F35C, 0x1F35D, 0x1F360, 0x1F362, 0x1F363, 0x1F364, 0x1F365, 0x1F96E, 0x1F361, 0x1F95F, 0x1F960, 0x1F961, 0x1F366, 0x1F367, 0x1F368, 0x1F369, 0x1F36A, 0x1F382, 0x1F370, 0x1F9C1, 0x1F967, 0x1F36B, 0x1F36C, 0x1F36D, 0x1F36E, 0x1F36F, 0x1F37C, 0x1F95B, 0x2615, 0x1FAD6, 0x1F375, 0x1F376, 0x1F37E, 0x1F377, 0x1F378, 0x1F379, 0x1F37A, 0x1F37B, 0x1F942, 0x1F943, 0x1FAD7, 0x1F964, 0x1F9CB, 0x1F9C3, 0x1F9C9, 0x1F9CA, 0x1F962, 0x1F37D, 0x1F374, 0x1F944, 0x1F52A, 0x1FAD9, 0x1F3FA, ]
},
travel_and_places: {
icon: "Bus",
emojis: [0x1F30D, 0x1F30E, 0x1F30F, 0x1F310, 0x1F5FA, 0x1F5FE, 0x1F9ED, 0x1F3D4, 0x26F0, 0x1F6D8, 0x1F30B, 0x1F5FB, 0x1F3D5, 0x1F3D6, 0x1F3DC, 0x1F3DD, 0x1F3DE, 0x1F3DF, 0x1F3DB, 0x1F3D7, 0x1F9F1, 0x1FAA8, 0x1FAB5, 0x1F6D6, 0x1F3D8, 0x1F3DA, 0x1F3E0, 0x1F3E1, 0x1F3E2, 0x1F3E3, 0x1F3E4, 0x1F3E5, 0x1F3E6, 0x1F3E8, 0x1F3E9, 0x1F3EA, 0x1F3EB, 0x1F3EC, 0x1F3ED, 0x1F3EF, 0x1F3F0, 0x1F492, 0x1F5FC, 0x1F5FD, 0x26EA, 0x1F54C, 0x1F6D5, 0x1F54D, 0x26E9, 0x1F54B, 0x26F2, 0x26FA, 0x1F301, 0x1F303, 0x1F3D9, 0x1F304, 0x1F305, 0x1F306, 0x1F307, 0x1F309, 0x2668, 0x1F3A0, 0x1F6DD, 0x1F3A1, 0x1F3A2, 0x1F488, 0x1F3AA, 0x1F682, 0x1F683, 0x1F684, 0x1F685, 0x1F686, 0x1F687, 0x1F688, 0x1F689, 0x1F68A, 0x1F69D, 0x1F69E, 0x1F68B, 0x1F68C, 0x1F68D, 0x1F68E, 0x1F690, 0x1F691, 0x1F692, 0x1F693, 0x1F694, 0x1F695, 0x1F696, 0x1F697, 0x1F698, 0x1F699, 0x1F6FB, 0x1F69A, 0x1F69B, 0x1F69C, 0x1F3CE, 0x1F3CD, 0x1F6F5, 0x1F9BD, 0x1F9BC, 0x1F6FA, 0x1F6B2, 0x1F6F4, 0x1F6F9, 0x1F6FC, 0x1F68F, 0x1F6E3, 0x1F6E4, 0x1F6E2, 0x26FD, 0x1F6DE, 0x1F6A8, 0x1F6A5, 0x1F6A6, 0x1F6D1, 0x1F6A7, 0x2693, 0x1F6DF, 0x26F5, 0x1F6F6, 0x1F6A4, 0x1F6F3, 0x26F4, 0x1F6E5, 0x1F6A2, 0x2708, 0x1F6E9, 0x1F6EB, 0x1F6EC, 0x1FA82, 0x1F4BA, 0x1F681, 0x1F69F, 0x1F6A0, 0x1F6A1, 0x1F6F0, 0x1F680, 0x1F6F8, 0x1F6CE, 0x1F9F3, 0x231B, 0x23F3, 0x231A, 0x23F0, 0x23F1, 0x23F2, 0x1F570, 0x1F55B, 0x1F567, 0x1F550, 0x1F55C, 0x1F551, 0x1F55D, 0x1F552, 0x1F55E, 0x1F553, 0x1F55F, 0x1F554, 0x1F560, 0x1F555, 0x1F561, 0x1F556, 0x1F562, 0x1F557, 0x1F563, 0x1F558, 0x1F564, 0x1F559, 0x1F565, 0x1F55A, 0x1F566, 0x1F311, 0x1F312, 0x1F313, 0x1F314, 0x1F315, 0x1F316, 0x1F317, 0x1F318, 0x1F319, 0x1F31A, 0x1F31B, 0x1F31C, 0x1F321, 0x2600, 0x1F31D, 0x1F31E, 0x1FA90, 0x2B50, 0x1F31F, 0x1F320, 0x1F30C, 0x2601, 0x26C5, 0x26C8, 0x1F324, 0x1F325, 0x1F326, 0x1F327, 0x1F328, 0x1F329, 0x1F32A, 0x1F32B, 0x1F32C, 0x1F300, 0x1F308, 0x1F302, 0x2602, 0x2614, 0x26F1, 0x26A1, 0x2744, 0x2603, 0x26C4, 0x2604, 0x1F525, 0x1F4A7, 0x1F30A, ]
},
activities: {
icon: "Palette",
emojis: [0x1F383, 0x1F384, 0x1F386, 0x1F387, 0x1F9E8, 0x2728, 0x1F388, 0x1F389, 0x1F38A, 0x1F38B, 0x1F38D, 0x1F38E, 0x1F38F, 0x1F390, 0x1F391, 0x1F9E7, 0x1F380, 0x1F381, 0x1F397, 0x1F39F, 0x1F3AB, 0x1F396, 0x1F3C6, 0x1F3C5, 0x1F947, 0x1F948, 0x1F949, 0x26BD, 0x26BE, 0x1F94E, 0x1F3C0, 0x1F3D0, 0x1F3C8, 0x1F3C9, 0x1F3BE, 0x1F94F, 0x1F3B3, 0x1F3CF, 0x1F3D1, 0x1F3D2, 0x1F94D, 0x1F3D3, 0x1F3F8, 0x1F94A, 0x1F94B, 0x1F945, 0x26F3, 0x26F8, 0x1F3A3, 0x1F93F, 0x1F3BD, 0x1F3BF, 0x1F6F7, 0x1F94C, 0x1F3AF, 0x1FA80, 0x1FA81, 0x1F52B, 0x1F3B1, 0x1F52E, 0x1FA84, 0x1F3AE, 0x1F579, 0x1F3B0, 0x1F3B2, 0x1F9E9, 0x1F9F8, 0x1FA85, 0x1FAA9, 0x1FA86, 0x2660, 0x2665, 0x2666, 0x2663, 0x265F, 0x1F0CF, 0x1F004, 0x1F3B4, 0x1F3AD, 0x1F5BC, 0x1F3A8, 0x1F9F5, 0x1FAA1, 0x1F9F6, 0x1FAA2, ]
},
objects: {
icon: "Archive",
emojis: [0x1F453, 0x1F576, 0x1F97D, 0x1F97C, 0x1F9BA, 0x1F454, 0x1F455, 0x1F456, 0x1F9E3, 0x1F9E4, 0x1F9E5, 0x1F9E6, 0x1F457, 0x1F458, 0x1F97B, 0x1FA71, 0x1FA72, 0x1FA73, 0x1F459, 0x1F45A, 0x1FAAD, 0x1F45B, 0x1F45C, 0x1F45D, 0x1F6CD, 0x1F392, 0x1FA74, 0x1F45E, 0x1F45F, 0x1F97E, 0x1F97F, 0x1F460, 0x1F461, 0x1FA70, 0x1F462, 0x1FAAE, 0x1F451, 0x1F452, 0x1F3A9, 0x1F393, 0x1F9E2, 0x1FA96, 0x26D1, 0x1F4FF, 0x1F484, 0x1F48D, 0x1F48E, 0x1F507, 0x1F508, 0x1F509, 0x1F50A, 0x1F4E2, 0x1F4E3, 0x1F4EF, 0x1F514, 0x1F515, 0x1F3BC, 0x1F3B5, 0x1F3B6, 0x1F399, 0x1F39A, 0x1F39B, 0x1F3A4, 0x1F3A7, 0x1F4FB, 0x1F3B7, 0x1F3BA, 0x1FA8A, 0x1FA97, 0x1F3B8, 0x1F3B9, 0x1F3BB, 0x1FA95, 0x1F941, 0x1FA98, 0x1FA87, 0x1FA88, 0x1FA89, 0x1F4F1, 0x1F4F2, 0x260E, 0x1F4DE, 0x1F4DF, 0x1F4E0, 0x1F50B, 0x1FAAB, 0x1F50C, 0x1F4BB, 0x1F5A5, 0x1F5A8, 0x2328, 0x1F5B1, 0x1F5B2, 0x1F4BD, 0x1F4BE, 0x1F4BF, 0x1F4C0, 0x1F9EE, 0x1F3A5, 0x1F39E, 0x1F4FD, 0x1F3AC, 0x1F4FA, 0x1F4F7, 0x1F4F8, 0x1F4F9, 0x1F4FC, 0x1F50D, 0x1F50E, 0x1F56F, 0x1F4A1, 0x1F526, 0x1F3EE, 0x1FA94, 0x1F4D4, 0x1F4D5, 0x1F4D6, 0x1F4D7, 0x1F4D8, 0x1F4D9, 0x1F4DA, 0x1F4D3, 0x1F4D2, 0x1F4C3, 0x1F4DC, 0x1F4C4, 0x1F4F0, 0x1F5DE, 0x1F4D1, 0x1F516, 0x1F3F7, 0x1FA99, 0x1F4B0, 0x1FA8E, 0x1F4B4, 0x1F4B5, 0x1F4B6, 0x1F4B7, 0x1F4B8, 0x1F4B3, 0x1F9FE, 0x1F4B9, 0x2709, 0x1F4E7, 0x1F4E8, 0x1F4E9, 0x1F4E4, 0x1F4E5, 0x1F4E6, 0x1F4EB, 0x1F4EA, 0x1F4EC, 0x1F4ED, 0x1F4EE, 0x1F5F3, 0x270F, 0x2712, 0x1F58B, 0x1F58A, 0x1F58C, 0x1F58D, 0x1F4DD, 0x1F4BC, 0x1F4C1, 0x1F4C2, 0x1F5C2, 0x1F4C5, 0x1F4C6, 0x1F5D2, 0x1F5D3, 0x1F4C7, 0x1F4C8, 0x1F4C9, 0x1F4CA, 0x1F4CB, 0x1F4CC, 0x1F4CD, 0x1F4CE, 0x1F587, 0x1F4CF, 0x1F4D0, 0x2702, 0x1F5C3, 0x1F5C4, 0x1F5D1, 0x1F512, 0x1F513, 0x1F50F, 0x1F510, 0x1F511, 0x1F5DD, 0x1F528, 0x1FA93, 0x26CF, 0x2692, 0x1F6E0, 0x1F5E1, 0x2694, 0x1F4A3, 0x1FA83, 0x1F3F9, 0x1F6E1, 0x1FA9A, 0x1F527, 0x1FA9B, 0x1F529, 0x2699, 0x1F5DC, 0x2696, 0x1F9AF, 0x1F517, 0x26D3, 0x26D3, 0x1FA9D, 0x1F9F0, 0x1F9F2, 0x1FA9C, 0x1FA8F, 0x2697, 0x1F9EA, 0x1F9EB, 0x1F9EC, 0x1F52C, 0x1F52D, 0x1F4E1, 0x1F489, 0x1FA78, 0x1F48A, 0x1FA79, 0x1FA7C, 0x1FA7A, 0x1FA7B, 0x1F6AA, 0x1F6D7, 0x1FA9E, 0x1FA9F, 0x1F6CF, 0x1F6CB, 0x1FA91, 0x1F6BD, 0x1FAA0, 0x1F6BF, 0x1F6C1, 0x1FAA4, 0x1FA92, 0x1F9F4, 0x1F9F7, 0x1F9F9, 0x1F9FA, 0x1F9FB, 0x1FAA3, 0x1F9FC, 0x1FAE7, 0x1FAA5, 0x1F9FD, 0x1F9EF, 0x1F6D2, 0x1F6AC, 0x26B0, 0x1FAA6, 0x26B1, 0x1F9FF, 0x1FAAC, 0x1F5FF, 0x1FAA7, 0x1FAAA, ]
},
symbols: {
icon: "Grid",
emojis: [0x1F3E7, 0x1F6AE, 0x1F6B0, 0x267F, 0x1F6B9, 0x1F6BA, 0x1F6BB, 0x1F6BC, 0x1F6BE, 0x1F6C2, 0x1F6C3, 0x1F6C4, 0x1F6C5, 0x26A0, 0x1F6B8, 0x26D4, 0x1F6AB, 0x1F6B3, 0x1F6AD, 0x1F6AF, 0x1F6B1, 0x1F6B7, 0x1F4F5, 0x1F51E, 0x2622, 0x2623, 0x2B06, 0x2197, 0x27A1, 0x2198, 0x2B07, 0x2199, 0x2B05, 0x2196, 0x2195, 0x2194, 0x21A9, 0x21AA, 0x2934, 0x2935, 0x1F503, 0x1F504, 0x1F519, 0x1F51A, 0x1F51B, 0x1F51C, 0x1F51D, 0x1F6D0, 0x269B, 0x1F549, 0x2721, 0x2638, 0x262F, 0x271D, 0x2626, 0x262A, 0x262E, 0x1F54E, 0x1F52F, 0x1FAAF, 0x2648, 0x2649, 0x264A, 0x264B, 0x264C, 0x264D, 0x264E, 0x264F, 0x2650, 0x2651, 0x2652, 0x2653, 0x26CE, 0x1F500, 0x1F501, 0x1F502, 0x25B6, 0x23E9, 0x23ED, 0x23EF, 0x25C0, 0x23EA, 0x23EE, 0x1F53C, 0x23EB, 0x1F53D, 0x23EC, 0x23F8, 0x23F9, 0x23FA, 0x23CF, 0x1F3A6, 0x1F505, 0x1F506, 0x1F4F6, 0x1F6DC, 0x1F4F3, 0x1F4F4, 0x2640, 0x2642, 0x26A7, 0x2716, 0x2795, 0x2796, 0x2797, 0x1F7F0, 0x267E, 0x203C, 0x2049, 0x2753, 0x2754, 0x2755, 0x2757, 0x3030, 0x1F4B1, 0x1F4B2, 0x2695, 0x267B, 0x269C, 0x1F531, 0x1F4DB, 0x1F530, 0x2B55, 0x2705, 0x2611, 0x2714, 0x274C, 0x274E, 0x27B0, 0x27BF, 0x303D, 0x2733, 0x2734, 0x2747, 0x00A9, 0x00AE, 0x2122, 0x1FADF, 0x0023, 0x002A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x1F51F, 0x1F520, 0x1F521, 0x1F522, 0x1F523, 0x1F524, 0x1F170, 0x1F18E, 0x1F171, 0x1F191, 0x1F192, 0x1F193, 0x2139, 0x1F194, 0x24C2, 0x1F195, 0x1F196, 0x1F17E, 0x1F197, 0x1F17F, 0x1F198, 0x1F199, 0x1F19A, 0x1F201, 0x1F202, 0x1F237, 0x1F236, 0x1F22F, 0x1F250, 0x1F239, 0x1F21A, 0x1F232, 0x1F251, 0x1F238, 0x1F234, 0x1F233, 0x3297, 0x3299, 0x1F23A, 0x1F235, 0x1F534, 0x1F7E0, 0x1F7E1, 0x1F7E2, 0x1F535, 0x1F7E3, 0x1F7E4, 0x26AB, 0x26AA, 0x1F7E5, 0x1F7E7, 0x1F7E8, 0x1F7E9, 0x1F7E6, 0x1F7EA, 0x1F7EB, 0x2B1B, 0x2B1C, 0x25FC, 0x25FB, 0x25FE, 0x25FD, 0x25AA, 0x25AB, 0x1F536, 0x1F537, 0x1F538, 0x1F539, 0x1F53A, 0x1F53B, 0x1F4A0, 0x1F518, 0x1F533, 0x1F532, ]
},
flags: {
icon: "MapPin",
emojis: [0x1F3C1, 0x1F6A9, 0x1F38C, 0x1F3F4, 0x1F3F3, 0x1F3F3, 0x1F3F3, 0x1F3F4, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EF, 0x1F1EF, 0x1F1EF, 0x1F1EF, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F4, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F6, 0x1F1F7, 0x1F1F7, 0x1F1F7, 0x1F1F7, 0x1F1F7, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FC, 0x1F1FC, 0x1F1FD, 0x1F1FE, 0x1F1FE, 0x1F1FF, 0x1F1FF, 0x1F1FF, 0x1F3F4, 0x1F3F4, 0x1F3F4, ]
}
};
================================================
FILE: crowdin.yml
================================================
files:
- source: /locales/fr.json
translation: /locales/%two_letters_code%.json
================================================
FILE: database/DatabaseProvider.tsx
================================================
import { Database, Q } from "@nozbe/watermelondb";
import React, { createContext, useContext } from 'react';
import { error, info } from "@/utils/logger/logger";
import { database } from './index';
import { Absence, Attendance, Delay, Observation, Punishment } from "./models/Attendance";
import { Balance } from "./models/Balance";
import CanteenHistoryItem from "./models/CanteenHistory";
import CanteenMenu from "./models/CanteenMenu";
import { Chat, Message, Recipient } from "./models/Chat";
import { Grade, Period } from "./models/Grades";
import Homework from "./models/Homework";
import Kid from "./models/Kid";
import News from "./models/News";
import Subject from "./models/Subject";
import Course from "./models/Timetable";
import { batchOperations, safeWrite } from "./utils/safeTransaction";
const _db: Database = database;
export const getDatabaseInstance = (): Database => _db;
const DatabaseContext = createContext(database);
export const DatabaseProvider = ({ children }: { children: React.ReactNode }) => (
{children}
);
export const useDatabase = () => useContext(DatabaseContext);
export async function ClearDatabaseForAccount(accountId: string) {
const db = getDatabaseInstance();
const tablesWithAccount = [
"homework",
"news",
"periods",
"grades",
"periodgrades",
"attendance",
"canteenmenus",
"chats",
"courses",
"kids",
"balances",
"canteentransactions",
];
await safeWrite(db, async () => {
for (const table of tablesWithAccount) {
try {
const collection = db.get(table);
const records = await collection
.query(Q.where("createdByAccount", accountId))
.fetch();
if (records.length > 0) {
await Promise.all(records.map((record) => record.markAsDeleted()));
await Promise.all(records.map((record) => record.destroyPermanently()));
}
} catch (err) {
error(String(err))
}
}
}, 10000, 'ClearDatabaseForAccount');
}
export async function removeAllDuplicates() {
const db = getDatabaseInstance();
try {
const uniqueKeys = {
subjects: (r: Subject) => `${r.name}-${r.periodGradeId || ''}`,
homework: (r: Homework) => r.homeworkId,
news: (r: News) => r.newsId,
periods: (r: Period) => r.periodId,
grades: (r: Grade) => r.gradeId,
attendance: (r: Attendance) => r.attendanceId,
delays: (r: Delay) => `${r.attendanceId}-${r.givenAt}`,
observations: (r: Observation) => `${r.attendanceId}-${r.givenAt}`,
absences: (r: Absence) => `${r.attendanceId}-${r.from}-${r.to}`,
punishments: (r: Punishment) => `${r.attendanceId}-${r.givenAt}`,
canteenmenus: (r: CanteenMenu) => r.menuId,
chats: (r: Chat) => r.chatId,
recipients: (r: Recipient) => r.recipientId,
messages: (r: Message) => r.messageId,
courses: (r: Course) => r.courseId,
kids: (r: Kid) => r.kidId,
balances: (r: Balance) => r.balanceId,
canteentransactions: (r: CanteenHistoryItem) => r.transactionId,
};
let totalDuplicatesFound = 0;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const allDuplicatesToDelete: any[] = [];
for (const [tableName, keyFn] of Object.entries(uniqueKeys)) {
const tableDuplicates = await findTableDuplicates(db, tableName, keyFn);
if (tableDuplicates.length > 0) {
allDuplicatesToDelete.push(...tableDuplicates);
totalDuplicatesFound += tableDuplicates.length;
}
}
if (allDuplicatesToDelete.length > 0) {
await safeWrite(db, async () => {
const batches = batchOperations(allDuplicatesToDelete, 100);
for (const batch of batches) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
await Promise.all(batch.map((record: any) => record.markAsDeleted()));
}
}, 120000, 'removeAllDuplicates');
info(`🍉 Duplicate removal completed successfully`);
} else {
info("🍉 No duplicates found");
}
} catch (err) {
error(`Failed to remove duplicates: ${err}`);
throw err;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async function findTableDuplicates(db: Database, tableName: string, keyFn: (record: any) => string): Promise {
try {
const collection = db.collections.get(tableName);
const all = await collection.query().fetch();
const seen = new Map();
const duplicates = [];
for (const record of all) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const key = keyFn(record as any);
if (seen.has(key)) {
duplicates.push(record);
} else {
seen.set(key, record);
}
}
return duplicates;
} catch (err) {
error(`Failed to process table ${tableName}: ${err}`);
return [];
}
}
================================================
FILE: database/index.ts
================================================
import { Database } from '@nozbe/watermelondb';
import SQLiteAdapter from '@nozbe/watermelondb/adapters/sqlite';
import { Absence, Attendance, Delay, Observation, Punishment } from '@/database/models/Attendance';
import CanteenMenu from '@/database/models/CanteenMenu';
import { Chat, Message, Recipient } from '@/database/models/Chat';
import Event from '@/database/models/Event';
import { Grade, Period, PeriodGrades } from '@/database/models/Grades';
import Homework from "@/database/models/Homework";
import Ical from '@/database/models/Ical';
import News from '@/database/models/News';
import Subject from '@/database/models/Subject';
import Course from '@/database/models/Timetable';
import { Balance } from './models/Balance';
import CanteenHistoryItem from './models/CanteenHistory';
import Kid from './models/Kid';
import { mySchema } from './schema';
const adapter = new SQLiteAdapter({
schema: mySchema,
});
export const database = new Database({
adapter,
modelClasses: [
Event,
Ical,
Subject,
Homework,
News,
Period,
Grade,
PeriodGrades,
Attendance,
Delay,
Observation,
Absence,
Punishment,
CanteenMenu,
Chat,
Message,
Recipient,
Course,
Kid,
Balance,
CanteenHistoryItem
],
});
================================================
FILE: database/mappers/attendance.ts
================================================
import { Absence, Attendance, Delay, Observation, Punishment } from "@/database/models/Attendance";
import { Absence as SharedAbsence, Delay as SharedDelay, Observation as SharedObservation,Punishment as SharedPunishment } from "@/services/shared/attendance";
export function mapDelaysToShared(delays: Delay[], parent: Attendance): SharedDelay[] {
return delays.map(delay => ({
id: delay.id,
givenAt: new Date(delay.givenAt),
reason: delay.reason,
justified: delay.justified,
duration: delay.duration,
createdByAccount: parent.createdByAccount,
kidName: parent.kidName
}));
}
export function mapAbsencesToShared(absences: Absence[], parent: Attendance): SharedAbsence[] {
return absences.map(absence => ({
id: absence.id,
from: new Date(absence.from),
to: new Date(absence.to),
reason: absence.reason,
justified: absence.justified,
createdByAccount: parent.createdByAccount,
kidName: parent.kidName
}));
}
export function mapPunishmentsToShared(punishments: Punishment[]): SharedPunishment[] {
return punishments.map(punishment => ({
id: punishment.id,
givenAt: new Date(punishment.givenAt),
givenBy: punishment.givenBy,
exclusion: punishment.exclusion,
duringLesson: punishment.duringLesson,
homework: {
text: punishment.homeworkText,
documents: punishment.homeworkDocuments
},
reason: {
text: punishment.reasonText,
circumstances: punishment.reasonCircumstances,
documents: punishment.reasonDocuments
},
nature: punishment.nature,
duration: punishment.duration
}));
}
export function mapObservationsToShared(observations: Observation[]): SharedObservation[] {
return observations.map(observation => ({
id: observation.id,
givenAt: new Date(observation.givenAt),
sectionName: observation.sectionName,
sectionType: observation.sectionType,
subjectName: observation.subjectName,
shouldParentsJustify: observation.shouldParentsJustify,
reason: observation.reason
}))
}
================================================
FILE: database/mappers/balances.ts
================================================
import { Balance as SharedBalance } from "@/services/shared/balance";
import { Balance } from "../models/Balance";
export function mapBalancesToShared(balance: Balance): SharedBalance {
return {
createdByAccount: balance.createdByAccount,
currency: balance.currency,
lunchRemaining: balance.lunchRemaining,
lunchPrice: balance.lunchPrice,
amount: balance.amount,
label: balance.label,
fromCache: true
}
}
================================================
FILE: database/mappers/canteen.ts
================================================
import CanteenMenu from "@/database/models/CanteenMenu";
import { CanteenMenu as SharedCanteenMenu, CanteenHistoryItem as SharedCanteenHistoryItem } from "@/services/shared/canteen";
import CanteenHistoryItem from "../models/CanteenHistory";
export function mapCanteenMenuToShared(menu: CanteenMenu): SharedCanteenMenu {
return {
date: new Date(menu.date),
lunch: menu.lunch,
dinner: menu.dinner,
createdByAccount: menu.createdByAccount,
fromCache: true
}
}
export function mapCanteenTransactionToShared(transaction: CanteenHistoryItem): SharedCanteenHistoryItem {
return {
createdByAccount: transaction.createdByAccount,
date: new Date(transaction.date),
label: transaction.label,
currency: transaction.currency,
amount: transaction.amount
}
}
================================================
FILE: database/mappers/chats.ts
================================================
import { Attachment } from "@/services/shared/attachment";
import { Chat as SharedChat, Message as SharedMessage,Recipient as SharedRecipient } from "@/services/shared/chat";
import { Chat, Message, Recipient } from "../models/Chat";
import { parseJsonArray } from "../useHomework";
export function mapChatsToShared(data: Chat[]): SharedChat[] {
return data.map(chat => ({
fromCache: true,
createdByAccount: chat.createdByAccount,
id: chat.chatId,
subject: chat.subject,
recipient: chat.recipient,
creator: chat.creator,
date: new Date(chat.date)
}))
}
export function mapRecipientsToShared(data: Recipient[]): SharedRecipient[] {
return data.map(recipient => ({
id: recipient.id,
name: recipient.name,
class: recipient.class
}))
}
export function mapMessagesToShared(data: Message[]): SharedMessage[] {
return data.map(message => ({
id: message.id,
content: message.content,
author: message.author,
subject: message.subject,
date: new Date(message.date),
attachments: parseJsonArray(message.attachments) as Attachment[]
}));
}
================================================
FILE: database/mappers/course.ts
================================================
import { Course as SharedCourse } from "@/services/shared/timetable";
import Course from "../models/Timetable";
export function mapCourseToShared(course: Course): SharedCourse {
return {
subject: course.subject,
id: course.id,
fromCache: true,
createdByAccount: course.createdByAccount,
type: course.type,
from: new Date(course.from),
to: new Date(course.to),
additionalInfo: course.additionalInfo,
room: course.room,
teacher: course.teacher,
group: course.group,
backgroundColor: course.backgroundColor,
status: course.status,
customStatus: course.customStatus,
url: course.url,
kidName: course.kidName
}
}
================================================
FILE: database/mappers/grade.ts
================================================
import { mapSubjectToShared } from "@/database/mappers/subject";
import { Grade, Period, PeriodGrades } from "@/database/models/Grades";
import { Attachment } from "@/services/shared/attachment";
import { Grade as SharedGrade, Period as SharedPeriod, PeriodGrades as SharedPeriodGrades } from "@/services/shared/grade";
export function mapPeriodToShared(period: Period): SharedPeriod {
return {
name: period.name,
id: period.id,
start: new Date(period.start),
end: new Date(period.end),
createdByAccount: period.createdByAccount,
kidName: period.kidName,
fromCache: true
}
}
export function mapGradeToShared(grade: Grade): SharedGrade {
return {
id: grade.gradeId,
subjectName: grade.subjectName,
subjectId: grade.subjectId ?? "",
description: grade.description,
givenAt: new Date(grade.givenAt),
subjectFile: JSON.parse(grade.subjectFile ?? "") as Attachment,
correctionFile: JSON.parse(grade.correctionFile ?? "") as Attachment,
bonus: grade.bonus,
optional: grade.optional,
outOf: grade.outOf,
coefficient: grade.coefficient,
studentScore: grade.studentScore,
averageScore: grade.averageScore,
minScore: grade.minScore,
maxScore: grade.maxScore,
fromCache: true,
createdByAccount: grade.createdByAccount
}
}
export function mapPeriodGradesToShared(data: PeriodGrades): SharedPeriodGrades {
return {
studentOverall: data.studentOverall,
classAverage: data.classAverage,
subjects: data.subjects.map(mapSubjectToShared),
createdByAccount: data.createdByAccount
}
}
================================================
FILE: database/mappers/kids.ts
================================================
import { Kid as SharedKid } from "@/services/shared/kid";
import Kid from "../models/Kid";
export function mapKidsToShared(kid: Kid): SharedKid {
return {
createdByAccount: kid.createdByAccount,
id: kid.kidId,
firstName: kid.firstName,
lastName: kid.lastName,
class: kid.class,
dateOfBirth: new Date(kid.dateOfBirth)
}
}
================================================
FILE: database/mappers/subject.ts
================================================
import { mapGradeToShared } from "@/database/mappers/grade";
import Subject from "@/database/models/Subject";
import { Subject as SharedSubject } from "@/services/shared/grade";
export function mapSubjectToShared(subject: Subject): SharedSubject {
return {
id: subject.id,
name: subject.name,
studentAverage: subject.studentAverage,
classAverage: subject.classAverage,
maximum: subject.maximum,
minimum: subject.minimum,
outOf: subject.outOf,
grades: subject.grades.map(mapGradeToShared)
}
}
================================================
FILE: database/models/Attendance.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { children, field, relation } from '@nozbe/watermelondb/decorators';
import { Attachment } from '@/services/shared/attachment';
export class Attendance extends Model {
static table = "attendance";
static associations = {
delays: { type: 'has_many', foreignKey: 'attendanceId' },
absences: { type: 'has_many', foreignKey: 'attendanceId' },
observations: { type: 'has_many', foreignKey: 'attendanceId' },
punishments: { type: 'has_many', foreignKey: 'attendanceId' },
};
@field('attendanceId') attendanceId: string;
@field('createdByAccount') createdByAccount: string;
@field('kidName') kidName?: string;
@field('period') period: string;
@children('delays') delays!: Query;
@children('absences') absences!: Query;
@children('observations') observations!: Query;
@children('punishments') punishments!: Query;
}
export class Delay extends Model {
static table = "delays";
static associations = {
attendance: { type: 'belongs_to', key: 'attendanceId' },
};
@field('givenAt') givenAt: number;
@field('reason') reason?: string;
@field('justified') justified: boolean;
@field('duration') duration: number;
@field('attendanceId') attendanceId: string;
@field('kidName') kidName: string;
@relation('attendance', 'attendanceId') attendance: Attendance;
}
export class Observation extends Model {
static table = "observations";
static associations = {
attendance: { type: 'belongs_to', key: 'attendanceId' },
};
@field('givenAt') givenAt: number;
@field('sectionName') sectionName: string;
@field('sectionType') sectionType: number;
@field('subjectName') subjectName?: string;
@field('shouldParentsJustify') shouldParentsJustify: boolean;
@field('reason') reason?: string;
@field('attendanceId') attendanceId: string;
@relation('attendance', 'attendanceId') attendance: Attendance;
}
export class Absence extends Model {
static table = "absences";
static associations = {
attendance: { type: 'belongs_to', key: 'attendanceId' },
};
@field('from') from: number;
@field('to') to: number;
@field('reason') reason?: string;
@field('justified') justified: boolean;
@field('attendanceId') attendanceId: string;
@field('kidName') kidName: string;
@relation('attendance', 'attendanceId') attendance: Attendance;
}
export class Punishment extends Model {
static table = "punishments";
static associations = {
attendance: { type: 'belongs_to', key: 'attendanceId' },
};
@field('givenAt') givenAt: number;
@field('givenBy') givenBy: string;
@field('exclusion') exclusion: boolean;
@field('duringLesson') duringLesson: boolean;
@field('nature') nature: string;
@field('duration') duration: number;
@field('homeworkDocumentsRaw') homeworkDocumentsRaw: string;
@field('reasonDocumentsRaw') reasonDocumentsRaw: string;
@field('homeworkText') homeworkText: string;
@field('reasonText') reasonText: string;
@field('reasonCircumstances') reasonCircumstances: string;
@field('attendanceId') attendanceId: string;
@relation('attendance', 'attendanceId') attendance: Attendance;
get homeworkDocuments(): Attachment[] {
return JSON.parse(this.homeworkDocumentsRaw);
}
get reasonDocuments(): Attachment[] {
return JSON.parse(this.reasonDocumentsRaw);
}
}
================================================
FILE: database/models/Balance.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { children, field, relation } from '@nozbe/watermelondb/decorators';
export class Balance extends Model {
static table = "balances";
@field('createdByAccount') createdByAccount: string;
@field('balanceId') balanceId: string;
@field('amount') amount: number;
@field('currency') currency: string;
@field('lunchRemaining') lunchRemaining: number;
@field('lunchPrice') lunchPrice: number;
@field('label') label: string;
}
================================================
FILE: database/models/CanteenHistory.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field } from '@nozbe/watermelondb/decorators';
export default class CanteenHistoryItem extends Model {
static table = "canteentransactions";
@field('transactionId') transactionId: string;
@field('date') date: number;
@field('label') label: string;
@field('currency') currency: string;
@field('amount') amount: number;
@field('createdByAccount') createdByAccount: string;
}
================================================
FILE: database/models/CanteenMenu.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field } from '@nozbe/watermelondb/decorators';
import { Meal } from '@/services/shared/canteen';
export default class CanteenMenu extends Model {
static table = "canteenmenus";
@field('menuId') menuId: string;
@field('date') date: number;
@field('lunch') lunchRaw: string;
@field('dinner') mealRaw: string;
@field('createdByAccount') createdByAccount: string;
get lunch(): Meal {
return JSON.parse(this.lunchRaw);
}
get dinner(): Meal {
return JSON.parse(this.mealRaw);
}
}
================================================
FILE: database/models/Chat.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model, Relation } from '@nozbe/watermelondb';
import { children, field, relation } from '@nozbe/watermelondb/decorators';
export class Chat extends Model {
static table = 'chats';
static associations = {
recipients: { type: 'has_many', foreignKey: 'chatId' },
messages: { type: 'has_many', foreignKey: 'chatId' },
};
@field('createdByAccount') createdByAccount: string;
@field('chatId') chatId: string;
@field('subject') subject: string;
@field('recipient') recipient?: string;
@field('creator') creator?: string;
@field('date') date: number;
@children('recipients') recipients?: Relation;
@children('messages') messages?: Relation;
}
export class Recipient extends Model {
static table = 'recipients';
static associations = {
chats: { type: 'belongs_to', key: 'chatId' },
};
@field('recipientId') recipientId: string;
@field('name') name: string;
@field('class') class?: string;
@field('chatId') chatId: string;
@relation('chats', 'chatId') chat: Chat;
}
export class Message extends Model {
static table = 'messages';
static associations = {
chats: { type: 'belongs_to', key: 'chatId' },
};
@field('messageId') messageId: string;
@field('content') content: string;
@field('author') author: string;
@field('subject') subject: string;
@field('date') date: number;
@field('attachments') attachments: string;
@field('chatId') chatId: string;
@relation('chats', 'chatId') chat: Chat;
}
================================================
FILE: database/models/Event.ts
================================================
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field, relation } from '@nozbe/watermelondb/decorators';
export default class Event extends Model {
static table = 'events';
static associations = {
subjects: { type: 'belongs_to', key: 'subject_id' },
};
@field('title') title!: string;
@field('start') start!: number;
@field('end') end!: number;
@field('color') color?: string;
@field('room') room?: string;
@field('teacher') teacher?: string;
@field('status') status?: string;
@field('canceled') canceled?: boolean;
@field('readonly') readonly?: boolean;
@field('subject_id') subject_id?: string;
@relation('subjects', 'subject_id') subject: any;
}
================================================
FILE: database/models/Grades.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { children, field, relation } from "@nozbe/watermelondb/decorators";
import { GradeScore } from '@/services/shared/grade';
import Subject from './Subject';
export class Period extends Model {
static table = 'periods';
static associations = {
periodgrades: { type: 'has_many', foreignKey: 'periodId' },
};
@field('createdByAccount') createdByAccount: string;
@field('kidName') kidName?: string;
@field('name') name: string;
@field('periodId') periodId: string;
@field('start') start: number;
@field('end') end: number;
@children('periodgrades') grades: PeriodGrades[];
}
export class Grade extends Model {
static table = 'grades';
static associations = {
subjects: { type: 'belongs_to', key: 'subjectId' },
};
@field('createdByAccount') createdByAccount: string;
@field('gradeId') gradeId: string;
@field('subjectName') subjectName: string;
@field('subjectId') subjectId?: string;
@relation('subjects', 'subjectId') subject?: Subject;
@field('description') description: string;
@field('givenAt') givenAt: number;
@field('subjectFile') subjectFile?: string;
@field('correctionFile') correctionFile?: string;
@field('bonus') bonus?: boolean;
@field('optional') optional?: boolean;
@field('coefficient') coefficient: number;
@field('outOf') outOfRaw: string;
@field('studentScore') studentScoreRaw: string;
@field('averageScore') averageScoreRaw: string;
@field('minScore') minScoreRaw: string;
@field('maxScore') maxScoreRaw: string;
get outOf(): GradeScore {
return JSON.parse(this.outOfRaw || '{}');
}
get studentScore(): GradeScore {
return JSON.parse(this.studentScoreRaw || '{}');
}
get averageScore(): GradeScore {
return JSON.parse(this.averageScoreRaw || '{}');
}
get minScore(): GradeScore {
return JSON.parse(this.minScoreRaw || '{}');
}
get maxScore(): GradeScore {
return JSON.parse(this.maxScoreRaw || '{}');
}
}
export class PeriodGrades extends Model {
static table = 'periodgrades';
static associations = {
periods: { type: 'belongs_to', key: 'periodId' },
subjects: { type: 'has_many', foreignKey: 'periodGradeId' },
};
@field('periodGradeId') id: string;
@field('createdByAccount') createdByAccount: string;
@field('studentOverall') studentOverallRaw: string;
@field('classAverage') classAverageRaw: string;
@field('periodId') periodId: string;
@relation('periods', 'periodId') period: Period;
@children('subjects') subjects: Subject[];
get studentOverall(): GradeScore {
return JSON.parse(this.studentOverallRaw || '{}');
}
get classAverage(): GradeScore {
return JSON.parse(this.classAverageRaw || '{}');
}
}
================================================
FILE: database/models/Homework.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field} from "@nozbe/watermelondb/decorators";
export default class Homework extends Model {
static table = 'homework';
static associations = {
subjects: { type: 'belongs_to', key: 'subjectId' },
};
@field('createdByAccount') createdByAccount: string;
@field('kidName') kidName: string;
@field('homeworkId') homeworkId: string;
@field('subject') subject: string;
@field('content') content: string;
@field('dueDate') dueDate: number;
@field('isDone') isDone: boolean;
@field('returnFormat') returnFormat: number;
@field('attachments') attachments: string;
@field('evaluation') evaluation: boolean;
@field('custom') custom: boolean;
}
================================================
FILE: database/models/Ical.ts
================================================
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field } from '@nozbe/watermelondb/decorators';
export default class Ical extends Model {
static table = 'icals';
@field('title') title!: string;
@field('url') url!: string;
@field('lastupdated') lastUpdated!: number;
@field('intelligent_parsing') intelligentParsing!: boolean;
@field('provider') provider!: string;
}
================================================
FILE: database/models/Kid.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field } from "@nozbe/watermelondb/decorators";
export default class Kid extends Model {
static table = 'kids';
@field('createdByAccount') createdByAccount: string;
@field('kidId') kidId: string;
@field('firstName') firstName: string;
@field('lastName') lastName: string;
@field('class') class: string;
@field('dateOfBirth') dateOfBirth: number
}
================================================
FILE: database/models/News.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from "@nozbe/watermelondb";
import { field, text } from "@nozbe/watermelondb/decorators";
export default class News extends Model {
static table = 'news';
@field('createdByAccount') createdByAccount!: string;
@field('newsId') newsId!: string;
@text('title') title!: string;
@field('createdAt') createdAt!: number;
@field('acknowledged') acknowledged!: boolean;
@text('attachments') attachments!: string;
@text('content') content!: string;
@text('author') author!: string;
@text('category') category!: string;
@field('question') question!: boolean;
}
================================================
FILE: database/models/Subject.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { children,field, relation } from "@nozbe/watermelondb/decorators";
import { GradeScore } from '@/services/shared/grade';
import { Grade, PeriodGrades } from './Grades';
export default class Subject extends Model {
static table = 'subjects';
static associations = {
periodgrades: { type: 'belongs_to', key: 'periodGradeId' },
grades: { type: 'has_many', foreignKey: 'subjectId' },
};
@field('name') name: string;
@field('subjectId') subjectId: string;
@field('studentAverage') studentAverageRaw: string;
@field('classAverage') classAverageRaw: string;
@field('maximum') maximumRaw: string;
@field('minimum') minimumRaw: string;
@field('outOf') outOfRaw: string;
@field('periodGradeId') periodGradeId?: string;
@relation('periodgrades', 'periodGradeId') periodGrade?: PeriodGrades;
@children('grades') grades: Grade[];
get studentAverage(): GradeScore {
return JSON.parse(this.studentAverageRaw || '{}');
}
get classAverage(): GradeScore {
return JSON.parse(this.classAverageRaw || '{}');
}
get maximum(): GradeScore {
return JSON.parse(this.maximumRaw || '{}');
}
get minimum(): GradeScore {
return JSON.parse(this.minimumRaw || '{}');
}
get outOf(): GradeScore {
return JSON.parse(this.outOfRaw || '{}');
}
}
================================================
FILE: database/models/Timetable.ts
================================================
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { Model } from '@nozbe/watermelondb';
import { field } from "@nozbe/watermelondb/decorators";
export default class Course extends Model {
static table = 'courses';
@field('createdByAccount') createdByAccount: string;
@field('kidName') kidName: string;
@field('courseId') courseId: string;
@field('subject') subject: string;
@field('type') type: number;
@field('from') from: number;
@field('to') to: number;
@field('additionalInfo') additionalInfo?: string;
@field('room') room?: string;
@field('teacher') teacher?: string;
@field('group') group?: string;
@field('backgroundColor') backgroundColor?: string;
@field('status') status?: number;
@field('customStatus') customStatus?: string;
@field('url') url?: string;
}
================================================
FILE: database/schema.ts
================================================
import { appSchema, tableSchema } from '@nozbe/watermelondb';
export const mySchema = appSchema({
version: 37,
tables: [
tableSchema({
name: 'events',
columns: [
{ name: 'title', type: 'string' },
{ name: 'start', type: 'number' },
{ name: 'end', type: 'number' },
{ name: 'color', type: 'string', isOptional: true },
{ name: 'room', type: 'string', isOptional: true },
{ name: 'teacher', type: 'string', isOptional: true },
{ name: 'status', type: 'string', isOptional: true },
{ name: 'canceled', type: 'boolean', isOptional: true },
{ name: 'readonly', type: 'boolean', isOptional: true },
{ name: 'subject_id', type: 'string', isOptional: true, isIndexed: true },
],
}),
tableSchema({
name: 'icals',
columns: [
{ name: 'title', type: 'string' },
{ name: 'url', type: 'string' },
{ name: 'lastupdated', type: 'number' },
{ name: 'intelligent_parsing', type: 'boolean', isOptional: true },
{ name: 'provider', type: 'string', isOptional: true },
],
}),
tableSchema({
name: 'subjects',
columns: [
{ name: 'name', type: 'string' },
{ name: 'subjects', type: 'string' },
{ name: 'studentAverage', type: 'string' },
{ name: 'classAverage', type: 'string' },
{ name: 'maximum', type: 'string' },
{ name: 'minimum', type: 'string' },
{ name: 'outOf', type: 'string' },
{ name: 'periodGradeId', type: 'string', isOptional: true, isIndexed: true }
],
}),
tableSchema({
name: 'homework',
columns: [
{ name: 'homeworkId', type: 'string' },
{ name: 'subject', type: 'string' },
{ name: 'content', type: 'string' },
{ name: 'dueDate', type: 'number' },
{ name: 'isDone', type: 'boolean' },
{ name: 'returnFormat', type: 'number' },
{ name: "attachments", type: 'string', isOptional: true },
{ name: 'evaluation', type: 'boolean' },
{ name: 'custom', type: 'boolean' },
{ name: 'createdByAccount', type: "string" },
{ name: 'kidName', type: "string", isOptional: true }
],
}),
tableSchema({
name: 'news',
columns: [
{ name: 'newsId', type: 'string' },
{ name: 'title', type: 'string' },
{ name: 'createdAt', type: 'number' },
{ name: 'acknowledged', type: 'boolean' },
{ name: "attachments", type: 'string', isOptional: true },
{ name: 'content', type: 'string' },
{ name: 'author', type: 'string' },
{ name: 'category', type: 'string' },
{ name: 'createdByAccount', type: "string" },
{ name: 'question', type: 'boolean', isOptional: true }
],
}),
tableSchema({
name: 'periods',
columns: [
{ name: 'name', type: 'string' },
{ name: 'periodId', type: 'string' },
{ name: 'start', type: 'number' },
{ name: 'end', type: 'number' },
{ name: 'createdByAccount', type: "string" },
{ name: 'kidName', type: "string", isOptional: true }
],
}),
tableSchema({
name: 'grades',
columns: [
{ name: 'createdByAccount', type: 'string' },
{ name: 'gradeId', type: 'string' },
{ name: 'subjectName', type: 'string' },
{ name: 'subjectId', type: 'string', isOptional: true },
{ name: 'description', type: 'string' },
{ name: 'givenAt', type: 'number' },
{ name: 'subjectFile', type: 'string', isOptional: true },
{ name: 'correctionFile', type: 'string', isOptional: true },
{ name: 'bonus', type: 'boolean', isOptional: true },
{ name: 'optional', type: 'boolean', isOptional: true },
{ name: 'coefficient', type: 'number' },
{ name: 'outOf', type: 'string' },
{ name: 'studentScore', type: 'string' },
{ name: 'averageScore', type: 'string' },
{ name: 'minScore', type: 'string' },
{ name: 'maxScore', type: 'string' }
],
}),
tableSchema({
name: 'periodgrades',
columns: [
{ name: 'periodGradeId', type: 'string' },
{ name: 'periodId', type: 'string', isIndexed: true },
{ name: 'createdByAccount', type: 'string' },
{ name: 'studentOverall', type: 'string' },
{ name: 'classAverage', type: 'string' }
]
}),
tableSchema({
name: "attendance",
columns: [
{ name: "attendanceId", type: 'string' },
{ name: 'createdByAccount', type: 'string' },
{ name: 'kidName', type: 'string', isOptional: true },
{ name: 'period', type: 'string' }
]
}),
tableSchema({
name: "delays",
columns: [
{ name: 'givenAt', type: 'number' },
{ name: 'reason', type: 'string', isOptional: true },
{ name: 'justified', type: 'boolean' },
{ name: 'duration', type: 'number' },
{ name: 'attendanceId', type: 'string', isIndexed: true },
{ name: 'kidName', type: 'string', isOptional: true }
]
}),
tableSchema({
name: "observations",
columns: [
{ name: 'givenAt', type: 'number' },
{ name: 'sectionName', type: 'string' },
{ name: 'sectionType', type: 'string' },
{ name: 'subjectName', type: 'string', isOptional: true },
{ name: 'shouldParentsJustify', type: 'boolean' },
{ name: 'reason', type: 'string' },
{ name: 'attendanceId', type: 'string', isIndexed: true }
]
}),
tableSchema({
name: "absences",
columns: [
{ name: 'from', type: 'number' },
{ name: 'to', type: 'number' },
{ name: 'reason', type: 'string', isOptional: true },
{ name: 'justified', type: 'boolean' },
{ name: 'attendanceId', type: 'string', isIndexed: true },
{ name: 'kidName', type: 'string', isOptional: true }
]
}),
tableSchema({
name: "punishments",
columns: [
{ name: 'givenAt', type: 'number' },
{ name: 'givenBy', type: 'string' },
{ name: 'exclusion', type: 'boolean' },
{ name: 'duringLesson', type: 'boolean' },
{ name: 'nature', type: 'string' },
{ name: 'duration', type: 'number' },
{ name: 'homeworkDocumentsRaw', type: 'string' },
{ name: 'reasonDocumentsRaw', type: 'string' },
{ name: 'homeworkText', type: 'string' },
{ name: 'reasonText', type: 'string' },
{ name: 'reasonCircumstances', type: 'string' },
{ name: 'attendanceId', type: 'string', isIndexed: true }
]
}),
tableSchema({
name: "canteenmenus",
columns: [
{ name: 'menuId', type: 'string' },
{ name: 'date', type: 'number' },
{ name: 'lunch', type: 'string', isOptional: true },
{ name: 'dinner', type: 'string', isOptional: true },
{ name: 'createdByAccount', type: 'string' }
]
}),
tableSchema({
name: "chats",
columns: [
{ name: 'chatId', type: 'string' },
{ name: 'subject', type: 'string' },
{ name: 'recipient', type: 'string', isOptional: true },
{ name: 'creator', type: 'string', isOptional: true },
{ name: 'date', type: 'number' },
{ name: 'createdByAccount', type: 'string' }
]
}),
tableSchema({
name: "recipients",
columns: [
{ name: 'recipientId', type: 'string' },
{ name: 'name', type: 'string' },
{ name: 'class', type: 'string', isOptional: true },
{ name: 'chatId', type: 'string', isIndexed: true }
]
}),
tableSchema({
name: "messages",
columns: [
{ name: 'messageId', type: 'string' },
{ name: 'content', type: 'string' },
{ name: 'author', type: 'string' },
{ name: 'subject', type: 'string' },
{ name: 'date', type: 'number' },
{ name: 'attachments', type: 'string' },
{ name: 'chatId', type: 'string', isIndexed: true }
]
}),
tableSchema({
name: "courses",
columns: [
{ name: 'createdByAccount', type: 'string' },
{ name: 'kidName', type: 'string', isOptional: true },
{ name: 'courseId', type: 'string' },
{ name: 'subject', type: 'string' },
{ name: 'type', type: 'number' },
{ name: 'from', type: 'number' },
{ name: 'to', type: 'number' },
{ name: 'additionalInfo', type: 'string', isOptional: true },
{ name: 'room', type: 'string', isOptional: true },
{ name: 'teacher', type: 'string', isOptional: true },
{ name: 'group', type: 'string', isOptional: true },
{ name: 'backgroundColor', type: 'string', isOptional: true },
{ name: 'status', type: 'number', isOptional: true },
{ name: 'customStatus', type: 'string', isOptional: true },
{ name: 'url', type: 'string', isOptional: true }
]
}),
tableSchema({
name: "kids",
columns:[
{ name: 'createdByAccount', type: 'string' },
{ name: 'kidId', type: 'string' },
{ name: 'firstName', type: 'string' },
{ name: 'lastName', type: 'string' },
{ name: 'class', type: 'string' },
{ name: 'dateOfBirth', type: 'number' },
]
}),
tableSchema({
name: "balances",
columns: [
{ name: 'createdByAccount', type: 'string' },
{ name: 'balanceId', type: 'string' },
{ name: 'amount', type: 'number' },
{ name: 'currency', type: 'string' },
{ name: 'lunchRemaining', type: 'number' },
{ name: 'lunchPrice', type: 'number' },
{ name: 'label', type: 'string' }
]
}),
tableSchema({
name: "canteentransactions",
columns: [
{ name: 'createdByAccount', type: 'string' },
{ name: 'transactionId', type: 'string' },
{ name: 'date', type: 'number' },
{ name: 'label', type: 'string' },
{ name: 'currency', type: 'string' },
{ name: 'amount', type: 'number' },
]
})
],
});
================================================
FILE: database/useAttendance.ts
================================================
import { Q } from "@nozbe/watermelondb";
import {Attendance as SharedAttendance } from "@/services/shared/attendance";
import { generateId } from "@/utils/generateId";
import { error } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import { mapAbsencesToShared, mapDelaysToShared, mapObservationsToShared,mapPunishmentsToShared } from "./mappers/attendance";
import { Absence, Attendance, Delay, Observation, Punishment } from "./models/Attendance";
import { safeWrite } from "./utils/safeTransaction";
export async function addAttendanceToDatabase(attendances: SharedAttendance[], period: string) {
const db = getDatabaseInstance();
for (const attendance of attendances) {
const id = generateId(attendance.createdByAccount + period + attendance.kidName);
await safeWrite(db, async () => {
const existing = await db.get('attendance').query(Q.where('attendanceId', id)).fetch();
if (existing.length > 0) {
const existingAttendance = existing[0] as Attendance;
await existingAttendance.update(record => {
record.createdByAccount = attendance.createdByAccount;
record.kidName = attendance.kidName ?? undefined;
record.period = period;
});
await Promise.all([
...(await existingAttendance.delays.fetch()).map((d: Delay) => d.markAsDeleted()),
...(await existingAttendance.absences.fetch()).map((a: Absence) => a.markAsDeleted()),
...(await existingAttendance.observations.fetch()).map((o: Observation) => o.markAsDeleted()),
...(await existingAttendance.punishments.fetch()).map((p: Punishment) => p.markAsDeleted()),
]);
for (const delay of attendance.delays) {
await db.get('delays').create(record => {
Object.assign(record, {
givenAt: delay.givenAt.getTime(),
reason: delay.reason,
justified: delay.justified,
duration: delay.duration,
attendanceId: id,
kidName: delay.kidName
});
});
}
for (const absence of attendance.absences) {
await db.get('absences').create(record => {
Object.assign(record, {
from: absence.from.getTime(),
to: absence.to.getTime(),
reason: absence.reason,
justified: absence.justified,
attendanceId: id,
kidName: absence.kidName
});
});
}
for (const observation of attendance.observations) {
await db.get('observations').create(record => {
Object.assign(record, {
givenAt: observation.givenAt.getTime(),
sectionName: observation.sectionName,
sectionType: observation.sectionType,
subjectName: observation.subjectName,
shouldParentsJustify: observation.shouldParentsJustify,
reason: observation.reason,
attendanceId: id
});
});
}
for (const punishment of attendance.punishments) {
await db.get('punishments').create(record => {
Object.assign(record, {
givenAt: punishment.givenAt.getTime(),
givenBy: punishment.givenBy,
exclusion: punishment.exclusion,
duringLesson: punishment.duringLesson,
nature: punishment.nature,
duration: punishment.duration,
homeworkDocumentsRaw: JSON.stringify(punishment.homework.documents ?? []),
reasonDocumentsRaw: JSON.stringify(punishment.reason.documents ?? []),
homeworkText: punishment.homework.text,
reasonText: punishment.reason.text,
reasonCircumstances: punishment.reason.circumstances,
attendanceId: id
});
});
}
} else {
await db.get('attendance').create(record => {
const att = record as Attendance;
att.attendanceId = id;
att.createdByAccount = attendance.createdByAccount;
att.period = period;
});
for (const delay of attendance.delays) {
await db.get('delays').create(record => {
Object.assign(record, {
givenAt: delay.givenAt.getTime(),
reason: delay.reason,
justified: delay.justified,
duration: delay.duration,
attendanceId: id
});
});
}
for (const absence of attendance.absences) {
await db.get('absences').create(record => {
Object.assign(record, {
from: absence.from.getTime(),
to: absence.to.getTime(),
reason: absence.reason,
justified: absence.justified,
attendanceId: id
});
});
}
for (const observation of attendance.observations) {
await db.get('observations').create(record => {
Object.assign(record, {
givenAt: observation.givenAt.getTime(),
sectionName: observation.sectionName,
sectionType: observation.sectionType,
subjectName: observation.subjectName,
shouldParentsJustify: observation.shouldParentsJustify,
reason: observation.reason,
attendanceId: id
});
});
}
for (const punishment of attendance.punishments) {
await db.get('punishments').create(record => {
Object.assign(record, {
givenAt: punishment.givenAt.getTime(),
givenBy: punishment.givenBy,
exclusion: punishment.exclusion,
duringLesson: punishment.duringLesson,
nature: punishment.nature,
duration: punishment.duration,
homeworkDocumentsRaw: JSON.stringify(punishment.homework.documents ?? []),
reasonDocumentsRaw: JSON.stringify(punishment.reason.documents ?? []),
homeworkText: punishment.homework.text,
reasonText: punishment.reason.text,
reasonCircumstances: punishment.reason.circumstances,
attendanceId: id
});
});
}
}
}, 10000, 'addAttendanceToDatabase');
}
}
export async function getAttendanceFromCache(period: string): Promise {
try {
const database = getDatabaseInstance();
const attendance = await database
.get('attendance')
.query(Q.where('period', period))
.fetch();
if (!attendance[0]) {
throw new Error("Attendance not found");
}
const att = attendance[0];
return {
createdByAccount: att.createdByAccount,
delays: mapDelaysToShared(att.delays, att),
absences: mapAbsencesToShared(att.absences, att),
punishments: mapPunishmentsToShared(att.punishments),
observations: mapObservationsToShared(att.observations),
fromCache: true
};
} catch (err) {
error("Failed to fetch attendance from cache: " + String(err));
}
}
================================================
FILE: database/useBalance.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { Balance as SharedBalance } from "@/services/shared/balance";
import { generateId } from "@/utils/generateId";
import { warn } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import { mapBalancesToShared } from "./mappers/balances";
import { Balance } from "./models/Balance";
import { safeWrite } from "./utils/safeTransaction";
export async function removeBalanceFromDatabase(serviceId: string) {
const db = getDatabaseInstance();
const dbBalances = await db.get('balances')
.query(
Q.where('createdByAccount', serviceId)
)
.fetch();
for (const balance of dbBalances) {
if (balance.createdByAccount === serviceId) {
await safeWrite(db, async () => {
balance.markAsDeleted()
})
}
}
}
export async function addBalancesToDatabase(balances: SharedBalance[]) {
const db = getDatabaseInstance();
for (const balance of balances) {
const id = generateId(balance.label + balance.createdByAccount)
const existing = await db.get('balances').query(Q.where('balanceId', id)).fetch();
if (existing.length === 0) {
await safeWrite(db, async () => {
await db.get('balances').create((record: Model) => {
const balanceModel = record as Balance;
Object.assign(balanceModel, {
createdByAccount: balance.createdByAccount,
balanceId: id,
currency: balance.currency,
amount: balance.amount,
lunchRemaining: balance.lunchRemaining,
lunchPrice: balance.lunchPrice,
label: balance.label
})
})
}, 10000, 'addBalancesToDatabase')
}
}
}
export async function getBalancesFromCache(): Promise {
try {
const database = getDatabaseInstance();
const balances = await database
.get('balances')
.query()
.fetch()
return balances.map(mapBalancesToShared)
} catch (e) {
warn(String(e));
return [];
}
}
================================================
FILE: database/useCanteen.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { CanteenHistoryItem as SharedCanteenHistoryItem,CanteenMenu as SharedCanteenMenu } from "@/services/shared/canteen";
import { generateId } from "@/utils/generateId";
import { info,warn } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import { mapCanteenMenuToShared, mapCanteenTransactionToShared } from "./mappers/canteen";
import CanteenHistoryItem from "./models/CanteenHistory";
import CanteenMenu from "./models/CanteenMenu";
import { safeWrite } from "./utils/safeTransaction";
export async function addCanteenMenuToDatabase(menus: SharedCanteenMenu[]) {
const db = getDatabaseInstance();
const menusToCreate: Array<{
id: string;
item: SharedCanteenMenu;
}> = [];
for (const item of menus) {
const id = generateId(item.createdByAccount + item.date);
const existing = await db.get('canteenmenus').query(Q.where('menuId', id)).fetch();
if (existing.length === 0) {
menusToCreate.push({ id, item });
}
}
if (menusToCreate.length > 0) {
await safeWrite(
db,
async () => {
const promises = menusToCreate.map(({ id, item }) =>
db.get('canteenmenus').create((record: Model) => {
const menu = record as CanteenMenu;
Object.assign(menu, {
menuId: id,
date: item.date.getTime(),
lunch: JSON.stringify(item.lunch),
dinner: JSON.stringify(item.dinner),
createdByAccount: item.createdByAccount
});
})
);
await Promise.all(promises);
},
10000,
`add_canteen_menus_${menusToCreate.length}_items`
);
} else {
info(`🍉 No new canteen menus to add (all ${menus.length} already exist)`);
}
}
export async function getCanteenMenuFromCache(startDate: Date): Promise {
try {
const database = getDatabaseInstance();
const { start, end } = getWeekRangeForDate(startDate);
const menus = await database
.get('canteenmenus')
.query(Q.where('date', Q.between(start.getTime(), end.getTime())))
.fetch();
return menus
.map(mapCanteenMenuToShared)
.sort((a, b) => a.date.getTime() - b.date.getTime());
} catch (e) {
warn(String(e));
return [];
}
}
export async function addCanteenTransactionToDatabase(transactions: SharedCanteenHistoryItem[]) {
const db = getDatabaseInstance();
const transactionsToCreate: Array<{
id: string;
item: SharedCanteenHistoryItem;
}> = [];
for (const item of transactions) {
const id = generateId(item.createdByAccount + item.date + item.amount + item.label + item.currency);
const existing = await db.get('canteentransactions').query(
Q.where('transactionId', id)
).fetch();
if (existing.length === 0) {
transactionsToCreate.push({ id, item });
}
}
if (transactionsToCreate.length > 0) {
await safeWrite(
db,
async () => {
const promises = transactionsToCreate.map(({ id, item }) =>
db.get('canteentransactions').create((record: Model) => {
const transaction = record as CanteenHistoryItem;
Object.assign(transaction, {
createdByAccount: item.createdByAccount,
transactionId: id,
date: item.date,
label: item.label,
currency: item.currency,
amount: item.amount
});
})
);
await Promise.all(promises);
},
10000,
`add_canteen_transactions_${transactionsToCreate.length}_items`
);
} else {
info(`🍉 No new canteen transactions to add (all ${transactions.length} already exist)`);
}
}
export async function getCanteenTransactionsFromCache(): Promise {
try {
const database = getDatabaseInstance();
const transactions = await database
.get('canteentransactions')
.query()
.fetch();
return transactions
.map(mapCanteenTransactionToShared)
.sort((a, b) => a.date.getTime() - b.date.getTime());
} catch (e) {
warn(String(e));
return [];
}
}
export function getWeekRangeForDate(date: Date) {
const day = date.getDay();
const diffToMonday = (day === 0 ? -6 : 1) - day;
const start = new Date(date);
start.setHours(0, 0, 0, 0);
start.setDate(start.getDate() + diffToMonday);
const end = new Date(start);
end.setDate(start.getDate() + 6);
end.setHours(23, 59, 59, 999);
return { start, end };
}
================================================
FILE: database/useChat.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { Chat as SharedChat, Message as SharedMessage, Recipient as SharedRecipient } from "@/services/shared/chat";
import { generateId } from "@/utils/generateId";
import { error } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import { mapChatsToShared, mapMessagesToShared, mapRecipientsToShared } from "./mappers/chats";
import { Chat, Message, Recipient } from "./models/Chat";
import { safeWrite } from "./utils/safeTransaction";
export async function addChatsToDatabase(chats: SharedChat[]) {
const db = getDatabaseInstance();
for (const item of chats) {
const id = generateId(item.createdByAccount + item.subject + item.date)
const existing = await db.get('chats').query(Q.where('chatId', id)).fetch();
if (existing.length === 0) {
await safeWrite(db, async () => {
await db.get('chats').create((record: Model) => {
const chat = record as Chat;
Object.assign(chat, {
chatId: id,
subject: item.subject,
recipient: item.recipient,
creator: item.creator,
date: item.date.getTime(),
createdByAccount: item.createdByAccount
})
})
}, 10000, 'addChatsToDatabase')
}
}
}
export async function addRecipientsToDatabase(chat: SharedChat, recipients: SharedRecipient[]) {
const db = getDatabaseInstance();
const chatId = generateId(chat.createdByAccount + chat.subject + chat.date)
const dbChat = await db.get('chats').find(chatId);
if (!dbChat) {
error("We're unable to find the chat in cache, please rehydrate chats before...")
}
for (const item of recipients) {
const id = generateId(chatId + item.name + item.class)
const existing = await db.get('recipients').query(
Q.where('recipientId', id)
).fetch();
if (existing.length > 0) {continue;}
await safeWrite(db, async () => {
await db.get('recipients').create((record: Model) => {
const recipient = record as Recipient;
Object.assign(recipient, {
recipientId: id,
name: item.name,
class: item.class,
chatId: chatId
})
})
}, 10000, 'addRecipientsToDatabase')
}
}
export async function addMessagesToDatabase(chat: SharedChat, messages: SharedMessage[]) {
const db = getDatabaseInstance();
const chatId = generateId(chat.createdByAccount + chat.subject + chat.date)
const dbChat = await db.get('chats').find(chatId);
if (!dbChat) {
error("We're unable to find the chat in cache, please rehydrate chats before...")
}
for (const item of messages) {
const id = generateId(chatId + item.content + item.author + item.date + item.subject)
const existing = await db.get('messages').query(
Q.where('messageId', id)
).fetch();
if (existing.length > 0) {continue;}
await safeWrite(db, async () => {
await db.get('messages').create((record: Model) => {
const message = record as Message;
Object.assign(message, {
messageId: id,
subject: item.subject,
content: item.content,
author: item.author,
date: item.date.getTime(),
attachments: JSON.stringify(item.attachments),
chatId: chatId
})
})
}, 10000, 'addMessagesToDatabase')
}
}
export async function getChatsFromCache(): Promise {
try {
const database = getDatabaseInstance();
const chats = await database.get('chats').query();
return mapChatsToShared(chats)
} catch (e) {
error(String(e));
}
}
export async function getRecipientsFromCache(chat: SharedChat): Promise {
try {
const database = getDatabaseInstance();
const chatId = generateId(chat.createdByAccount + chat.subject + chat.date);
const recipients = await database.get('recipients').query(
Q.where('chatId', chatId)
).fetch();
return mapRecipientsToShared(recipients);
} catch (e) {
error(String(e));
}
}
export async function getMessagesFromCache(chat: SharedChat): Promise {
try {
const database = getDatabaseInstance();
const chatId = generateId(chat.createdByAccount + chat.subject + chat.date);
const messages = await database.get('messages').query(
Q.where('chatId', chatId)
).fetch();
return mapMessagesToShared(messages);
} catch (e) {
error(String(e));
}
}
================================================
FILE: database/useEvents.ts
================================================
import { Q } from '@nozbe/watermelondb';
import { useEffect, useState } from 'react';
import { useDatabase } from './DatabaseProvider';
import Event from './models/Event';
export function useEventsForDay(date: Date, refresh = 0) {
const database = useDatabase();
const [eventsWithSubjects, setEventsWithSubjects] = useState([]);
useEffect(() => {
const startOfDay = new Date(date);
startOfDay.setHours(0, 0, 0, 0);
const endOfDay = new Date(date);
endOfDay.setHours(23, 59, 59, 999);
const query = database.get('events').query(
Q.where('start', Q.between(startOfDay.getTime(), endOfDay.getTime()))
);
const subscription = query.observe().subscribe(async (events) => {
const eventsWithSubjects = await Promise.all(
events.map(async (event) => {
const subject = await event.subject.fetch();
// Use event.start from the Event instance, not from _raw
return { ...event._raw, start: event.start, end: event.end, subject: subject ? subject._raw : null };
})
);
setEventsWithSubjects(eventsWithSubjects.sort((a, b) => a.start - b.start));
});
return () => subscription.unsubscribe();
}, [date, database, refresh]);
return eventsWithSubjects;
}
================================================
FILE: database/useEventsById.ts
================================================
import { Q } from '@nozbe/watermelondb';
import { useEffect, useState } from 'react';
import { useDatabase } from './DatabaseProvider';
import Event from './models/Event';
export function useEventById(id: string | number | undefined) {
const database = useDatabase();
const [event, setEvent] = useState(null);
useEffect(() => {
if (!id) {
setEvent(null);
return;
}
const query = database.get('events').query(Q.where('id', id));
const subscription = query.observe().subscribe(events => {
setEvent(events[0] || null);
});
return () => subscription.unsubscribe();
}, [id, database]);
return event;
}
================================================
FILE: database/useGrades.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { Grade as SharedGrade, Period as SharedPeriod, PeriodGrades as SharedPeriodGrades } from "@/services/shared/grade";
import { generateId } from "@/utils/generateId";
import { error, warn } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import { mapPeriodGradesToShared,mapPeriodToShared } from "./mappers/grade";
import { Grade, Period, PeriodGrades } from "./models/Grades";
import { safeWrite } from "./utils/safeTransaction";
export async function addPeriodsToDatabase(periods: SharedPeriod[]) {
const db = getDatabaseInstance();
await safeWrite(db, async () => {
for (const item of periods) {
const id = generateId(item.name + item.createdByAccount);
const existing = await db.get('periods')
.query(Q.where("periodId", id))
.fetch();
if (existing.length === 0) {
await db.get('periods').create((record: Model) => {
const period = record as Period;
Object.assign(period, {
periodId: id,
name: item.name,
createdByAccount: item.createdByAccount,
start: item.start.getTime(),
end: item.end.getTime(),
});
});
}
}
}, 10000, 'addPeriodsToDatabase');
}
export async function getPeriodsFromCache(): Promise {
try {
const database = getDatabaseInstance();
const period = await database
.get('periods')
.query()
.fetch();
return period
.map(mapPeriodToShared)
.sort((a, b) => a.end.getTime() - b.end.getTime());
} catch (e) {
warn(String(e));
return [];
}
}
export async function addGradesToDatabase(grades: SharedGrade[], subject: string) {
const db = getDatabaseInstance();
for (const item of grades) {
const id = generateId(item.createdByAccount + item.description + item.givenAt)
const existing = await db.get('grades').query(Q.where('gradeId', id)).fetch();
if(existing.length === 0) {
await safeWrite(db, async () => {
await db.get('grades').create((record: Model) => {
const grade = record as Grade
Object.assign(grade, {
gradeId: id,
createdByAccount: item.createdByAccount,
subjectName: item.subjectName,
subjectId: generateId(subject),
description: item.description,
givenAt: item.givenAt.getTime(),
subjectFile: JSON.stringify(item.subjectFile),
correctionFile: JSON.stringify(item.correctionFile),
bonus: item.bonus,
optional: item.optional,
outOf: JSON.stringify(item.outOf),
coefficient: item.coefficient,
studentScore: JSON.stringify(item.studentScore),
averageScore: JSON.stringify(item.averageScore),
minScore: JSON.stringify(item.minScore),
maxScore: JSON.stringify(item.maxScore)
})
})
}, 10000, 'addGradesToDatabase')
}
}
}
export async function addPeriodGradesToDatabase(item: SharedPeriodGrades, period: string) {
const db = getDatabaseInstance();
const id = generateId(period + item.createdByAccount);
const existing = await db.get('periodgrades').query(
Q.where("id", id)
).fetch();
await safeWrite(db, async () => {
if (existing.length > 0) {
await existing[0].update((record: Model) => {
const periodGrade = record as PeriodGrades;
Object.assign(periodGrade, {
createdByAccount: item.createdByAccount,
studentOverallRaw: JSON.stringify(item.studentOverall),
classAverageRaw: JSON.stringify(item.classAverage)
});
});
} else {
await db.get('periodgrades').create((record: Model) => {
const periodGrade = record as PeriodGrades;
Object.assign(periodGrade, {
id: id,
createdByAccount: item.createdByAccount,
studentOverallRaw: JSON.stringify(item.studentOverall),
classAverageRaw: JSON.stringify(item.classAverage)
});
});
}
}, 10000, 'addPeriodGradesToDatabase');
}
export async function getGradePeriodsFromCache(period: string): Promise {
try {
const database = getDatabaseInstance();
const id = generateId(period)
const periodgrades = await database
.get('periodgrades')
.query(Q.where('id', id))
.fetch();
return mapPeriodGradesToShared(periodgrades[0])
} catch (e) {
error(String(e));
}
}
================================================
FILE: database/useHomework.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { useEffect, useState } from "react";
import { Attachment } from "@/services/shared/attachment";
import { Homework as SharedHomework } from "@/services/shared/homework";
import { generateId } from "@/utils/generateId";
import { warn } from "@/utils/logger/logger";
import { getDatabaseInstance, useDatabase } from "./DatabaseProvider";
import Homework from "./models/Homework";
import { safeWrite } from "./utils/safeTransaction";
function mapHomeworkToShared(homework: Homework): SharedHomework {
return {
id: homework.homeworkId,
subject: homework.subject,
content: homework.content,
dueDate: new Date(homework.dueDate),
isDone: homework.isDone,
returnFormat: homework.returnFormat,
attachments: parseJsonArray(homework.attachments) as Attachment[],
evaluation: homework.evaluation,
custom: homework.custom,
createdByAccount: homework.createdByAccount,
kidName: homework.kidName,
fromCache: true,
};
}
export function useHomeworkForWeek(weekNumber: number, refresh = 0) {
const database = useDatabase();
const [homeworks, setHomeworks] = useState([]);
useEffect(() => {
const fetchHomeworks = async () => {
const homeworksFetched = await getHomeworksFromCache(weekNumber);
setHomeworks(homeworksFetched);
};
fetchHomeworks();
}, [weekNumber, refresh, database]);
return homeworks;
}
export async function getHomeworksFromCache(
weekNumber: number
): Promise {
try {
const database = getDatabaseInstance();
const { start, end } = getDateRangeOfWeek(weekNumber);
const homeworks = await database
.get("homework")
.query(Q.where("dueDate", Q.between(start.getTime(), end.getTime())))
.fetch();
return homeworks
.map(mapHomeworkToShared)
.sort((a, b) => a.dueDate.getTime() - b.dueDate.getTime());
} catch (e) {
warn(String(e));
return [];
}
}
export async function addHomeworkToDatabase(homeworks: SharedHomework[]) {
const db = getDatabaseInstance();
const weekNumber = getWeekNumberFromDate(homeworks[0].dueDate);
const { start, end } = getDateRangeOfWeek(weekNumber);
const dbHomeworks = await db.get("homework")
.query(Q.where("dueDate", Q.between(start.getTime(), end.getTime())))
.fetch();
const homeworkIds: string[] = [];
for (const hw of homeworks) {
const oldId = generateId(hw.subject + hw.content + hw.createdByAccount);
const id = generateId(
hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()
);
homeworkIds.push(oldId, id);
}
const homeworksToDelete = dbHomeworks.filter(
dbHomeworks => !homeworkIds.includes(dbHomeworks.homeworkId)
);
for (const homework of homeworksToDelete) {
await homework.markAsDeleted();
}
for (const hw of homeworks) {
const oldId = generateId(hw.subject + hw.content + hw.createdByAccount);
const id = generateId(
hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()
);
const existing = await db
.get("homework")
.query(Q.where("homeworkId", id))
.fetch();
const oldExisting = await db
.get("homework")
.query(Q.where("homeworkId", oldId))
.fetch();
for (const oldRecord of oldExisting) {
await oldRecord.markAsDeleted();
}
if (existing.length === 0) {
await safeWrite(
db,
async () => {
await db.get("homework").create((record: Model) => {
const homework = record as Homework;
Object.assign(homework, {
homeworkId: id,
subject: hw.subject,
content: hw.content,
dueDate: hw.dueDate.getTime(),
isDone: hw.isDone,
returnFormat: hw.returnFormat,
attachments: JSON.stringify(hw.attachments),
evaluation: hw.evaluation,
custom: hw.custom,
createdByAccount: hw.createdByAccount,
kidName: hw.kidName,
fromCache: true,
});
});
},
10000,
"addHomeworkToDatabase"
);
} else {
const recordToUpdate = existing[0];
await safeWrite(
db,
async () => {
await recordToUpdate.update((record: Model) => {
const homework = record as Homework;
Object.assign(homework, {
subject: hw.subject,
content: hw.content,
dueDate: hw.dueDate.getTime(),
isDone: hw.isDone,
returnFormat: hw.returnFormat,
attachments: JSON.stringify(hw.attachments),
evaluation: hw.evaluation,
custom: hw.custom,
createdByAccount: hw.createdByAccount,
kidName: hw.kidName,
fromCache: true,
});
});
},
10000,
"updateHomeworkToDatabase"
);
}
}
}
export async function updateHomeworkIsDone(
homeworkId: string,
isDone: boolean
) {
const db = getDatabaseInstance();
const existing = await db
.get("homework")
.query(Q.where("homeworkId", homeworkId))
.fetch();
if (existing.length === 0) {
warn(`Homework with ID ${homeworkId} not found`);
return;
}
const recordToUpdate = existing[0];
await safeWrite(
db,
async () => {
await recordToUpdate.update((record: Model) => {
const homework = record as Homework;
homework.isDone = isDone;
});
},
10000,
"updateHomeworkIsDone"
);
}
export function getDateRangeOfWeek(
weekNumber: number,
year = new Date().getFullYear()
) {
const janFirst = new Date(year, 0, 1);
const daysOffset = (weekNumber - 1) * 7;
const weekStart = new Date(janFirst.setDate(janFirst.getDate() + daysOffset));
const day = weekStart.getDay();
const diff = weekStart.getDate() - day + (day <= 4 ? 1 : 8);
const start = new Date(weekStart.setDate(diff));
const end = new Date(start);
end.setDate(start.getDate() + 6);
start.setHours(0, 0, 0, 0);
end.setHours(23, 59, 59, 999);
return { start, end };
}
export function parseJsonArray(s: string): unknown[] {
try {
const result = JSON.parse(s);
return Array.isArray(result) ? result : [];
} catch {
return [];
}
}
export function getWeekNumberFromDate(date: Date): number {
const startOfYear = new Date(date.getFullYear(), 0, 1);
const days = Math.floor(
(date.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24)
);
return Math.ceil((days + startOfYear.getDay() + 1) / 7);
}
================================================
FILE: database/useIcals.ts
================================================
import { useCallback,useEffect, useState } from 'react';
import { useDatabase } from './DatabaseProvider';
import Ical from './models/Ical';
import { safeWrite } from "./utils/safeTransaction";
export function useIcals(refresh = 0) {
const database = useDatabase();
const [icals, setIcals] = useState([]);
useEffect(() => {
const query = database.get('icals').query();
const subscription = query.observe().subscribe(setIcals);
return () => subscription.unsubscribe();
}, [database, refresh]);
return icals;
}
export function useAddIcal() {
const database = useDatabase();
return useCallback(async (title: string, url: string, intelligentParsing: boolean = false, provider: string = 'unknown') => {
await safeWrite(database, async () => {
await database.get('icals').create((ical: any) => {
ical.title = title;
ical.url = url;
ical.lastUpdated = Date.now();
ical.intelligentParsing = intelligentParsing;
ical.provider = provider;
});
}, 10000, 'useAddIcal');
}, [database]);
}
export function useRemoveIcal() {
const database = useDatabase();
return useCallback(async (id: string) => {
await safeWrite(database, async () => {
const ical = await database.get('icals').find(id);
await ical.destroyPermanently();
}, 10000, 'useRemoveIcal');
}, [database]);
}
export function useUpdateIcalParsing() {
const database = useDatabase();
return useCallback(async (id: string, intelligentParsing: boolean) => {
await safeWrite(database,async () => {
const ical = await database.get('icals').find(id);
await ical.update((ical: any) => {
ical.intelligentParsing = intelligentParsing;
});
}, 1000, 'useUpdateIcalParsing');
}, [database]);
}
================================================
FILE: database/useKids.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { Kid as SharedKid } from "@/services/shared/kid";
import { warn } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import { mapKidsToShared } from "./mappers/kids";
import Kid from "./models/Kid";
import { safeWrite } from "./utils/safeTransaction";
export async function addKidToDatabase(kids: SharedKid[]) {
const db = getDatabaseInstance()
for (const kid of kids) {
const existing = await db.get('kids').query(Q.where('kidId', kid.id)).fetch();
if (existing.length === 0) {
await safeWrite(db, async () => {
await db.get('kids').create((record: Model) => {
const kidsModel = record as Kid
Object.assign(kidsModel, {
createByAccount: kid.createdByAccount,
kidId: kid.id,
firstName: kid.firstName,
lastName: kid.lastName,
class: kid.class,
dateOfBirth: kid.dateOfBirth.getTime()
})
})
}, 10000, 'addKidToDatabase')
}
}
}
export async function getKidsFromCache(): Promise {
try {
const db = getDatabaseInstance();
const kids = await db
.get('kids')
.query()
.fetch()
return kids.map(mapKidsToShared)
} catch (error) {
warn(String(error))
return[]
}
}
================================================
FILE: database/useNews.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { useEffect, useState } from "react";
import { Attachment } from "@/services/shared/attachment";
import { News as SharedNews } from "@/services/shared/news";
import { generateId } from "@/utils/generateId";
import { info,warn } from "@/utils/logger/logger";
import { getDatabaseInstance, useDatabase } from "./DatabaseProvider";
import News from "./models/News";
import { parseJsonArray } from "./useHomework";
import { safeWrite } from "./utils/safeTransaction";
export function useNews(refresh = 0) {
const database = useDatabase();
const [news, setNews] = useState([]);
useEffect(() => {
const query = database.get('news').query();
const sub = query.observe().subscribe(news =>
setNews(
news.map(mapNewsToShared).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
)
);
return () => sub.unsubscribe();
}, [refresh, database]);
return news;
}
export async function addNewsToDatabase(news: SharedNews[]) {
const db = getDatabaseInstance();
const itemsToCreate: Array<{ id: string; item: SharedNews }> = [];
const itemsToUpdate: Array<{ record: Model; item: SharedNews }> = [];
for (const item of news) {
const id = generateId(item.author + item.title + item.createdByAccount);
const existingRecords = await db.get('news')
.query(Q.where("newsId", id))
.fetch();
if (existingRecords.length === 0) {
itemsToCreate.push({ id, item });
} else {
itemsToUpdate.push({ record: existingRecords[0], item });
}
}
if (itemsToCreate.length > 0 || itemsToUpdate.length > 0) {
await safeWrite(
db,
async () => {
const createPromises = itemsToCreate.map(({ id, item }) =>
db.get('news').create((record: Model) => {
const newsModel = record as News;
newsModel.newsId = id;
newsModel.title = item.title ?? "";
newsModel.createdAt = item.createdAt.getTime();
newsModel.acknowledged = item.acknowledged;
newsModel.attachments = JSON.stringify(item.attachments ?? []);
newsModel.content = item.content ?? "";
newsModel.author = item.author ?? "";
newsModel.category = item.category ?? "";
newsModel.createdByAccount = item.createdByAccount ?? "";
newsModel.question = item.question ?? false;
})
);
const updatePromises = itemsToUpdate.map(({ record, item }) =>
record.update((model: Model) => {
const newsModel = model as News;
newsModel.title = item.title ?? newsModel.title;
newsModel.createdAt = item.createdAt.getTime();
newsModel.acknowledged = item.acknowledged;
newsModel.attachments = JSON.stringify(item.attachments ?? []);
newsModel.content = item.content ?? newsModel.content;
newsModel.author = item.author ?? newsModel.author;
newsModel.category = item.category ?? newsModel.category;
newsModel.createdByAccount = item.createdByAccount ?? newsModel.createdByAccount;
newsModel.question = item.question ?? newsModel.question;
})
);
await Promise.all([...createPromises, ...updatePromises]);
},
10000,
`add_news_${itemsToCreate.length}_create_${itemsToUpdate.length}_update`
);
} else {
info(`🍉 No news items to process`);
}
}
export async function getNewsFromCache(): Promise {
try {
const database = getDatabaseInstance();
const news = await database
.get('news')
.query()
.fetch();
return news
.map(mapNewsToShared)
.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
} catch (e) {
warn(String(e));
return [];
}
}
function mapNewsToShared(news: News): SharedNews {
return {
id: news.id,
title: news.title,
createdAt: new Date(news.createdAt),
acknowledged: news.acknowledged,
attachments: parseJsonArray(news.attachments) as Attachment[],
content: news.content,
author: news.author,
category: news.category,
createdByAccount: news.createdByAccount,
fromCache: true
};
}
================================================
FILE: database/usePeriodsCache.tsx
================================================
import { useEffect, useMemo, useState } from "react"
import { Grade, Period } from "./models/Grades"
import { getDatabaseInstance, useDatabase } from "./DatabaseProvider";
import { useAccountStore } from "@/stores/account";
import { Q } from "@nozbe/watermelondb";
export function usePeriods() {
const database = useDatabase()
const [periods, setPeriods] = useState([])
const store = useAccountStore.getState();
useEffect(() => {
const collection = database.get("periods")
// Load existing rows from cache
setPeriods(Array.from(collection._cache.map.values()).map((model) => model._raw).filter((row) => row.createdByAccount === store.lastUsedAccount))
// Observe future updates
const subscription = collection
.query(
Q.where("createdByAccount", store.lastUsedAccount)
)
.observe()
.subscribe((rows) => {
setPeriods(
rows.map((row) => ({
...row._raw,
start: new Date(row.start),
end: new Date(row.end),
}))
);
});
// update all periods to change start to new Date(start)
setPeriods((prevPeriods) =>
prevPeriods.map((period) => ({
...period,
start: new Date(period.start),
end: new Date(period.end),
}))
);
return () => subscription.unsubscribe()
}, [database])
return periods;
}
================================================
FILE: database/useSubject.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { Subject as SharedSubject } from "@/services/shared/grade";
import { generateId } from "@/utils/generateId";
import { info } from "@/utils/logger/logger";
import { getDatabaseInstance } from "./DatabaseProvider";
import Subject from "./models/Subject";
import { safeWrite } from "./utils/safeTransaction";
export async function addSubjectsToDatabase(
subjects: SharedSubject[],
periodGradeId?: string
) {
const db = getDatabaseInstance();
const subjectsToCreate: Array<{
id: string;
item: SharedSubject;
}> = [];
for (const item of subjects) {
const id = generateId(item.name);
const existingForAccount = await db.get('subjects').query(Q.where('subjectId', id)).fetch();
if (existingForAccount.length === 0) {
subjectsToCreate.push({ id, item });
}
}
if (subjectsToCreate.length > 0) {
await safeWrite(
db,
async () => {
const promises = subjectsToCreate.map(({ id, item }) =>
db.get('subjects').create((record: Model) => {
const subject = record as Subject;
Object.assign(subject, {
subjectId: id,
name: item.name,
studentAverage: JSON.stringify(item.studentAverage),
classAverage: JSON.stringify(item.classAverage),
maximum: JSON.stringify(item.maximum),
minimum: JSON.stringify(item.minimum),
outOf: JSON.stringify(item.outOf),
periodGradeId: periodGradeId ?? null
});
})
);
await Promise.all(promises);
},
10000,
`add_subjects_${subjectsToCreate.length}_items`
);
} else {
info(`🍉 No new subjects to add (all ${subjects.length} already exist)`);
}
}
================================================
FILE: database/useTimetable.ts
================================================
import { Model, Q } from "@nozbe/watermelondb";
import { useEffect, useState } from "react";
import { getICalEventsForWeek } from "@/services/local/ical";
import { Course as SharedCourse,CourseDay as SharedCourseDay } from "@/services/shared/timetable"
import { generateId } from "@/utils/generateId";
import { warn } from "@/utils/logger/logger";
import { getDatabaseInstance, useDatabase } from "./DatabaseProvider"
import { mapCourseToShared } from "./mappers/course";
import Course from "./models/Timetable";
import { getDateRangeOfWeek } from "./useHomework";
import { safeWrite } from "./utils/safeTransaction";
export function useTimetable(refresh = 0, weekNumber: number | number[] = 0, date: Date = new Date()) {
const database = useDatabase();
const [timetable, setTimetable] = useState([]);
const weeks = Array.isArray(weekNumber) ? weekNumber : [weekNumber];
// Create a stable key for the weeks array to use in dependency arrays
const weeksKey = weeks.join(',');
useEffect(() => {
const fetchTimetable = async () => {
const timetableFetched = await getCoursesFromCache(weeks, date.getFullYear());
setTimetable(timetableFetched);
};
fetchTimetable();
}, [refresh, database, weeksKey, date.getFullYear()]);
useEffect(() => {
const icalQuery = database.get('icals').query();
const subscription = icalQuery.observe().subscribe(() => {
const fetchTimetable = async () => {
const timetableFetched = await getCoursesFromCache(weeks, date.getFullYear());
setTimetable(timetableFetched);
};
fetchTimetable();
});
return () => subscription.unsubscribe();
}, [database, weeksKey, date.getFullYear()]);
return timetable;
}
export async function addCourseDayToDatabase(courses: SharedCourseDay[]) {
const db = getDatabaseInstance();
await safeWrite(
db,
async () => {
for (const day of courses) {
const dayTimestamp = day.date.getTime();
const oneDayMs = 24 * 60 * 60 * 1000;
const dbCourses = await db.get('courses')
.query(
Q.where('from', Q.between(dayTimestamp, dayTimestamp + oneDayMs))
)
.fetch();
const dayCourseIds = new Set(
day.courses.map(course => {
const oldId = generateId(course.from.toISOString() + course.to.toISOString() + course.subject + course.teacher + course.room + course.createdByAccount);
const newId = generateId(course.from.toISOString() + course.to.toISOString() + course.subject + course.teacher + course.createdByAccount);
return [oldId, newId];
}).flat()
);
const coursesToDelete = dbCourses.filter(
dbCourse => !dayCourseIds.has(dbCourse.courseId)
);
for (const course of coursesToDelete) {
await course.markAsDeleted();
}
for (const item of day.courses) {
// MIGRATION TO AVOID DUPES, DO NOT DELETE
const oldId = generateId(item.from.toISOString() + item.to.toISOString() + item.subject + item.teacher + item.room + item.createdByAccount);
const id = generateId(item.from.toISOString() + item.to.toISOString() + item.subject + item.teacher + item.createdByAccount);
const oldExistingRecords = await db.get('courses')
.query(Q.where('courseId', oldId))
.fetch();
const existingRecords = await db.get('courses')
.query(Q.where('courseId', id))
.fetch();
if (oldId !== id) {
for (const oldRecord of oldExistingRecords) {
await oldRecord.markAsDeleted();
}
}
if (existingRecords.length === 0) {
await db.get('courses').create((record: Model) => {
const course = record as Course;
Object.assign(course, {
createdByAccount: item.createdByAccount,
courseId: id,
subject: item.subject,
type: item.type,
from: item.from.getTime(),
to: item.to.getTime(),
additionalInfo: item.additionalInfo,
room: item.room,
teacher: item.teacher,
group: item.group,
backgroundColor: item.backgroundColor,
status: item.status,
customStatus: item.customStatus,
url: item.url,
kidName: item.kidName,
});
});
} else {
const courseToUpdate = existingRecords[0];
await courseToUpdate.update((model: Model) => {
const course = model as Course;
Object.assign(course, {
subject: item.subject ?? course.subject,
type: item.type ?? course.type,
from: item.from.getTime(),
to: item.to.getTime(),
additionalInfo: item.additionalInfo ?? course.additionalInfo,
room: item.room ?? course.room,
teacher: item.teacher ?? course.teacher,
group: item.group ?? course.group,
backgroundColor: item.backgroundColor ?? course.backgroundColor,
status: item.status ?? course.status,
customStatus: item.customStatus ?? course.customStatus,
url: item.url ?? course.url,
kidName: item.kidName ?? course.kidName,
});
});
}
}
}
},
15000,
`add_timetable_${courses.length}_days`
);
}
export async function getCoursesFromCache(weeks: number[], year: number): Promise {
try {
const database = getDatabaseInstance();
let minStart = new Date(8640000000000000);
let maxEnd = new Date(-8640000000000000);
for (const w of weeks) {
const { start, end } = getDateRangeOfWeek(w, year);
if (start < minStart) {minStart = start;}
if (end > maxEnd) {maxEnd = end;}
}
const courses = await database
.get('courses')
.query(Q.where('from', Q.between(minStart.getTime(), maxEnd.getTime())))
.fetch();
const dayMap: Record = {};
for (const course of courses) {
const dayKey = new Date(course.from).toISOString().split("T")[0];
dayMap[dayKey] = dayMap[dayKey] || [];
dayMap[dayKey].push(mapCourseToShared(course));
}
try {
const icalEvents = await getICalEventsForWeek(minStart, maxEnd);
for (const event of icalEvents) {
const dayKey = new Date(event.from).toISOString().split("T")[0];
dayMap[dayKey] = dayMap[dayKey] || [];
dayMap[dayKey].push(event);
}
} catch (icalError) {
console.warn('Error loading iCal events:', icalError);
}
for (const day in dayMap) {
dayMap[day].sort((a, b) => a.from.getTime() - b.from.getTime());
}
return Object.entries(dayMap).map(([day, courses]) => ({
date: new Date(day),
courses
}));
} catch (e) {
warn(String(e));
return [];
}
}
================================================
FILE: database/utils/initialization.ts
================================================
import { Database } from "@nozbe/watermelondb";
import { error,info, warn } from "@/utils/logger/logger";
import { getDatabaseInstance } from "../DatabaseProvider";
export class DatabaseInitializer {
private static instance: DatabaseInitializer;
private isInitialized = false;
static getInstance(): DatabaseInitializer {
if (!DatabaseInitializer.instance) {
DatabaseInitializer.instance = new DatabaseInitializer();
}
return DatabaseInitializer.instance;
}
async initializeDatabase(): Promise {
if (this.isInitialized) {
return;
}
try {
const db = getDatabaseInstance();
await this.forceResetDatabaseQueue(db);
const isResponsive = await this.testInitialDatabaseHealth(db);
if (!isResponsive) {
warn("Database appears to be unresponsive, attempting recovery...");
await this.attemptDatabaseRecovery(db);
}
this.isInitialized = true;
info("🍉 Database initialization completed successfully");
} catch (err) {
error(`Database initialization failed: ${err}`);
throw err;
}
}
private async forceResetDatabaseQueue(db: Database): Promise {
try {
info("🍉 Force resetting database queue...");
for (let i = 0; i < 3; i++) {
const resetPromise = db.write(async () => {
// Empty write operation to flush the queue
});
await Promise.race([
resetPromise,
new Promise((_, reject) => {
setTimeout(() => {
reject(new Error(`Queue reset ${i + 1} timeout`));
}, 3000);
})
]);
await new Promise(resolve => setTimeout(resolve, 100));
}
info("🍉 Database queue reset completed");
} catch (err) {
warn(`Database queue reset failed: ${err}`);
warn("🍉 Database may start with degraded performance");
}
}
private async testInitialDatabaseHealth(db: Database): Promise {
try {
const startTime = Date.now();
const testPromise = db.collections.get('news').query().fetch();
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => {
reject(new Error("Database health check timeout"));
}, 5000);
});
await Promise.race([testPromise, timeoutPromise]);
const duration = Date.now() - startTime;
info(`🍉 Database health check passed (${duration}ms)`);
return duration < 3000; // Consider healthy if under 3 seconds
} catch (err) {
error(`Database health check failed: ${err}`);
return false;
}
}
private async attemptDatabaseRecovery(db: Database): Promise {
try {
info("🍉 Attempting database recovery...");
const recoveryPromise = db.write(async () => {
const collections = ['news', 'homework', 'grades', 'subjects'];
for (const collectionName of collections) {
try {
await db.collections.get(collectionName).query().fetch();
} catch (err) {
warn(`Failed to read from ${collectionName}: ${err}`);
}
}
});
await Promise.race([
recoveryPromise,
new Promise