From b9930b73786e4e3b5d8e0b2ea29608d0c9802d03 Mon Sep 17 00:00:00 2001 From: Sacha Date: Fri, 31 Jul 2026 16:19:42 +0200 Subject: [PATCH] feat: implement Haptika PPG and Watch V1 --- .gitignore | 4 + App.tsx | 856 +- ...ika_Passation_Projet_Watch_2026-07-30.docx | Bin 0 -> 151167 bytes README.md | 308 +- __tests__/App.test.tsx | 39 + babel.config.js | 1 + design-qa.md | 45 + ios/HaptikaApp.xcodeproj/project.pbxproj | 471 +- .../xcschemes/Haptika Watch App.xcscheme | 91 + .../contents.xcworkspacedata | 10 + ios/HaptikaApp/HaptikaApp.entitlements | 10 + ios/HaptikaApp/Info.plist | 16 +- ios/HaptikaApp/PrivacyInfo.xcprivacy | 2 + ios/HaptikaWatch/App/HaptikaWatchApp.swift | 14 + ios/HaptikaWatch/App/WatchAppModel.swift | 128 + .../AccentColor.colorset/Contents.json | 20 + .../AppIcon.appiconset/Contents.json | 13 + .../Assets.xcassets/Contents.json | 6 + .../Core/RegulationProtocol.swift | 181 + ios/HaptikaWatch/Core/WatchBaseline.swift | 72 + .../Core/WatchMeasurementValidator.swift | 73 + ios/HaptikaWatch/Core/WatchModels.swift | 377 + .../Core/WatchResourceArbiter.swift | 40 + ios/HaptikaWatch/Core/WatchStore.swift | 134 + ios/HaptikaWatch/Core/WatchSyncEnvelope.swift | 169 + ios/HaptikaWatch/HaptikaWatch.entitlements | 8 + ios/HaptikaWatch/Info.plist | 36 + .../Services/WatchConnectivityService.swift | 129 + .../Services/WatchHapticService.swift | 127 + .../WatchHealthMeasurementService.swift | 267 + .../Views/WatchBeforeAfterFlowView.swift | 178 + .../Views/WatchCardiacMirrorView.swift | 112 + .../Views/WatchCoherenceView.swift | 138 + .../Views/WatchExercisesView.swift | 102 + ios/HaptikaWatch/Views/WatchHistoryView.swift | 111 + .../Views/WatchMeasurementView.swift | 115 + ios/HaptikaWatch/Views/WatchRootView.swift | 114 + ios/HaptikaWatch/Views/WatchTheme.swift | 29 + ios/HaptikaWatchTests/WatchCoreTests.swift | 126 + ios/Podfile | 2 +- ios/Podfile.lock | 2455 +++ jest.config.js | 1 + metro.config.js | 9 +- onboarding-design-qa.md | 42 + package-lock.json | 12681 ++++++++++++++++ package.json | 29 +- .../HaptikaPPG.podspec | 30 + .../react-native-haptika-ppg/Package.swift | 47 + .../PPGFrameMetricsExtractorTests.swift | 341 + .../PPGThermalSafetyPolicyTests.swift | 16 + .../PPGCoherencePolicyTests.swift | 52 + .../PPGSignalPipelineTests.swift | 247 + .../PPGSyntheticSignalTests.swift | 202 + .../HybridHaptikaPPGFrameProcessor.swift | 887 ++ .../PPGFingerContactDetector.swift | 132 + .../PPGFrameMetricsExtractor.swift | 237 + .../Haptics/HybridHaptikaCardiacMirror.swift | 303 + .../ios/Health/HybridHaptikaHealthKit.swift | 451 + .../ios/Safety/PPGThermalMonitor.swift | 18 + .../ios/Safety/PPGThermalSafetyPolicy.swift | 17 + .../ios/Signal/BPMEstimator.swift | 196 + .../ios/Signal/Filtering.swift | 172 + .../ios/Signal/Models.swift | 523 + .../ios/Signal/PPGCoherencePolicy.swift | 60 + .../Signal/PPGSyntheticSignalGenerator.swift | 242 + .../ios/Signal/PRVCalculator.swift | 143 + .../ios/Signal/PeakDetector.swift | 276 + .../ios/Signal/Resampler.swift | 135 + .../ios/Signal/SignalProcessor.swift | 331 + .../ios/Signal/SignalQualityEvaluator.swift | 176 + .../ios/Signal/Statistics.swift | 196 + .../HaptikaWatchConnectivityModule.swift | 65 + .../HaptikaWatchConnectivityModuleBridge.m | 21 + .../HaptikaWatchConnectivityService.swift | 490 + packages/react-native-haptika-ppg/nitro.json | 26 + .../nitrogen/generated/.gitattributes | 1 + .../generated/ios/HaptikaPPG+autolinking.rb | 62 + .../ios/HaptikaPPG-Swift-Cxx-Bridge.cpp | 110 + .../ios/HaptikaPPG-Swift-Cxx-Bridge.hpp | 489 + .../ios/HaptikaPPG-Swift-Cxx-Umbrella.hpp | 110 + .../generated/ios/HaptikaPPGAutolinking.mm | 49 + .../generated/ios/HaptikaPPGAutolinking.swift | 50 + .../HybridHaptikaCardiacMirrorSpecSwift.cpp | 11 + .../HybridHaptikaCardiacMirrorSpecSwift.hpp | 150 + .../c++/HybridHaptikaHealthKitSpecSwift.cpp | 11 + .../c++/HybridHaptikaHealthKitSpecSwift.hpp | 120 + ...ybridHaptikaPPGFrameProcessorSpecSwift.cpp | 11 + ...ybridHaptikaPPGFrameProcessorSpecSwift.hpp | 145 + .../ios/swift/FingerContactState.swift | 56 + .../Func_void_NativeHealthKitContext.swift | 46 + .../generated/ios/swift/Func_void_bool.swift | 46 + .../swift/Func_void_std__exception_ptr.swift | 46 + ...tional_NativeHeartbeatSeriesSummary_.swift | 46 + .../ios/swift/HealthMetricType.swift | 44 + .../HybridHaptikaCardiacMirrorSpec.swift | 64 + .../HybridHaptikaCardiacMirrorSpec_cxx.swift | 247 + .../swift/HybridHaptikaHealthKitSpec.swift | 58 + .../HybridHaptikaHealthKitSpec_cxx.swift | 201 + .../HybridHaptikaPPGFrameProcessorSpec.swift | 60 + ...bridHaptikaPPGFrameProcessorSpec_cxx.swift | 195 + .../ios/swift/NativeAcceptedBeat.swift | 44 + .../ios/swift/NativeBPMEstimate.swift | 116 + .../swift/NativeCardiacMirrorHeartbeat.swift | 34 + .../NativeCardiacMirrorPatternInfo.swift | 39 + .../ios/swift/NativeHealthKitContext.swift | 77 + .../ios/swift/NativeHealthMetricSample.swift | 103 + .../swift/NativeHeartbeatSeriesSummary.swift | 92 + .../ios/swift/NativePPGConfiguration.swift | 64 + .../ios/swift/NativePPGProcessingResult.swift | 82 + .../ios/swift/NativePRVMetrics.swift | 206 + .../ios/swift/NativeSignalQualityResult.swift | 103 + .../generated/ios/swift/PPGFrameUpdate.swift | 149 + .../ios/swift/PPGSessionPurpose.swift | 40 + .../generated/ios/swift/ThermalState.swift | 52 + .../shared/c++/FingerContactState.hpp | 92 + .../generated/shared/c++/HealthMetricType.hpp | 80 + .../c++/HybridHaptikaCardiacMirrorSpec.cpp | 30 + .../c++/HybridHaptikaCardiacMirrorSpec.hpp | 77 + .../shared/c++/HybridHaptikaHealthKitSpec.cpp | 24 + .../shared/c++/HybridHaptikaHealthKitSpec.hpp | 71 + .../HybridHaptikaPPGFrameProcessorSpec.cpp | 25 + .../HybridHaptikaPPGFrameProcessorSpec.hpp | 81 + .../shared/c++/NativeAcceptedBeat.hpp | 95 + .../shared/c++/NativeBPMEstimate.hpp | 112 + .../c++/NativeCardiacMirrorHeartbeat.hpp | 87 + .../c++/NativeCardiacMirrorPatternInfo.hpp | 91 + .../shared/c++/NativeHealthKitContext.hpp | 111 + .../shared/c++/NativeHealthMetricSample.hpp | 114 + .../c++/NativeHeartbeatSeriesSummary.hpp | 105 + .../shared/c++/NativePPGConfiguration.hpp | 112 + .../shared/c++/NativePPGProcessingResult.hpp | 124 + .../generated/shared/c++/NativePRVMetrics.hpp | 131 + .../shared/c++/NativeSignalQualityResult.hpp | 129 + .../generated/shared/c++/PPGFrameUpdate.hpp | 152 + .../shared/c++/PPGSessionPurpose.hpp | 76 + .../generated/shared/c++/ThermalState.hpp | 88 + .../react-native-haptika-ppg/package.json | 36 + .../react-native.config.js | 8 + .../react-native-haptika-ppg/src/index.ts | 20 + .../src/specs/HaptikaPPG.nitro.ts | 187 + .../react-native-haptika-ppg/tsconfig.json | 23 + qa/figma-123/comparison-all.jpg | Bin 0 -> 302834 bytes qa/figma-123/implementation-home.jpg | Bin 0 -> 47052 bytes qa/figma-123/implementation-measurement.jpg | Bin 0 -> 24848 bytes qa/figma-123/implementation-preparation.jpg | Bin 0 -> 39660 bytes qa/figma-123/implementation-result.jpg | Bin 0 -> 38245 bytes qa/figma-123/source-home.png | Bin 0 -> 131681 bytes qa/figma-123/source-measurement.png | Bin 0 -> 40790 bytes qa/figma-123/source-preparation.png | Bin 0 -> 162836 bytes qa/figma-123/source-result.png | Bin 0 -> 65763 bytes qa/onboarding/step-1-welcome.jpg | Bin 0 -> 32344 bytes qa/onboarding/step-3-assessment.jpg | Bin 0 -> 41869 bytes qa/onboarding/step-6-experience.jpg | Bin 0 -> 45252 bytes qa/onboarding/step-7-complete.jpg | Bin 0 -> 24301 bytes shared/regulation-protocols.v1.json | 150 + shared/watch-sync-fixtures.v1.json | 66 + .../cardiacMirror/CardiacMirrorScreen.tsx | 251 + .../HapticWaveExerciseScreen.tsx | 412 + .../cardiacMirror/ProtocolInfoSheet.tsx | 66 + .../cardiacMirror/cardiacMirrorEngine.test.ts | 35 + .../cardiacMirror/cardiacMirrorEngine.ts | 86 + .../cardiacMirror/cardiacMirrorService.ts | 35 + .../cardiacMirror/cardiacMirrorTypes.ts | 31 + .../regulationComparison.test.ts | 69 + .../cardiacMirror/regulationComparison.ts | 81 + .../cardiacMirror/regulationManifest.test.ts | 26 + .../regulationPhaseEngine.test.ts | 21 + .../cardiacMirror/regulationPhaseEngine.ts | 29 + .../cardiacMirror/regulationProtocols.test.ts | 58 + .../cardiacMirror/regulationProtocols.ts | 77 + .../regulationSessionRepository.test.ts | 126 + .../regulationSessionRepository.ts | 263 + .../cardiacMirror/regulationSessionTypes.ts | 53 + src/features/coherence/MyCoherenceScreen.tsx | 318 + .../coherence/coherenceEngine.test.ts | 63 + src/features/coherence/coherenceEngine.ts | 229 + .../coherenceSessionRepository.test.ts | 36 + .../coherence/coherenceSessionRepository.ts | 140 + src/features/coherence/coherenceTypes.ts | 54 + src/features/onboarding/OnboardingScreen.tsx | 1352 ++ .../onboarding/assets/haptika-silhouettes.png | Bin 0 -> 125596 bytes .../onboarding/onboardingRepository.test.ts | 44 + .../onboarding/onboardingRepository.ts | 84 + .../ppg/assets/finger-camera-placement.png | Bin 0 -> 70001 bytes src/features/ppg/assets/hrv-silhouette.png | Bin 0 -> 78580 bytes src/features/ppg/camera/PPGCameraView.tsx | 414 + src/features/ppg/camera/cameraTypes.ts | 12 + src/features/ppg/camera/usePPGCamera.ts | 23 + .../ppg/components/ConfidenceIndicator.tsx | 72 + .../ppg/components/FingerContactIndicator.tsx | 75 + src/features/ppg/components/HaptikaChrome.tsx | 168 + .../ppg/components/MeasurementProgress.tsx | 66 + .../ppg/components/MetricInsightCard.tsx | 110 + .../ppg/components/MetricTrendChart.tsx | 163 + .../ppg/components/PPGResultSummary.tsx | 280 + .../ppg/components/PotentialStressGauge.tsx | 84 + src/features/ppg/components/PrimaryButton.tsx | 95 + .../ppg/components/SignalQualityBadge.tsx | 65 + .../ppg/health/healthContextEvaluator.ts | 286 + src/features/ppg/health/healthKitService.ts | 55 + src/features/ppg/health/healthTypes.ts | 70 + src/features/ppg/history/historyAnalytics.ts | 78 + src/features/ppg/insights/metricInsights.ts | 250 + .../measurement/measurementConfiguration.ts | 194 + .../ppg/measurement/measurementCoordinator.ts | 104 + .../ppg/measurement/measurementMachine.ts | 377 + .../ppg/measurement/measurementTypes.ts | 186 + .../ppg/measurement/usePPGMeasurement.ts | 490 + src/features/ppg/screens/PPGFailureScreen.tsx | 242 + src/features/ppg/screens/PPGHistoryScreen.tsx | 394 + .../ppg/screens/PPGMeasurementScreen.tsx | 309 + .../ppg/screens/PPGPreparationScreen.tsx | 658 + src/features/ppg/screens/PPGResultScreen.tsx | 1070 ++ .../acquisitionPreferencesRepository.ts | 43 + .../ppg/storage/baselineRepository.ts | 16 + src/features/ppg/storage/database.ts | 24 + .../ppg/storage/measurementRepository.ts | 480 + .../ppg/storage/settingsRepository.ts | 27 + src/features/ppg/storage/storageTypes.ts | 34 + src/features/ppg/stress/baselineCalculator.ts | 248 + src/features/ppg/stress/baselineTypes.ts | 64 + .../ppg/stress/confidenceCalculator.ts | 116 + .../ppg/stress/potentialStressCalculator.ts | 214 + .../ppg/stress/stressIndexConfiguration.ts | 115 + .../ppg/stress/stressInterpretation.ts | 40 + src/features/ppg/stress/stressTypes.ts | 61 + src/features/ppg/tests/PPGCameraView.test.tsx | 352 + .../acquisitionPreferencesRepository.test.ts | 43 + .../ppg/tests/baselineAndStress.test.ts | 190 + .../ppg/tests/healthContextEvaluator.test.ts | 97 + .../ppg/tests/historyAnalytics.test.ts | 54 + .../tests/measurementConfiguration.test.ts | 26 + .../ppg/tests/measurementCoordinator.test.ts | 94 + .../ppg/tests/measurementMachine.test.ts | 238 + src/features/ppg/tests/metricInsights.test.ts | 63 + src/features/ppg/tests/storage.test.ts | 215 + .../ppg/tests/syntheticMeasurements.ts | 75 + .../ppg/tests/usePPGMeasurement.test.tsx | 259 + src/features/watch/watchAnalytics.ts | 57 + src/features/watch/watchBaseline.ts | 63 + src/features/watch/watchContract.test.ts | 26 + src/features/watch/watchRepository.test.ts | 88 + src/features/watch/watchRepository.ts | 224 + src/features/watch/watchService.test.ts | 50 + src/features/watch/watchService.ts | 162 + src/features/watch/watchTypes.ts | 126 + src/features/watch/watchValidation.ts | 97 + src/theme.ts | 31 + tsconfig.json | 7 +- 249 files changed, 46475 insertions(+), 122 deletions(-) create mode 100644 Docs/Haptika_Passation_Projet_Watch_2026-07-30.docx create mode 100644 design-qa.md create mode 100644 ios/HaptikaApp.xcodeproj/xcshareddata/xcschemes/Haptika Watch App.xcscheme create mode 100644 ios/HaptikaApp.xcworkspace/contents.xcworkspacedata create mode 100644 ios/HaptikaApp/HaptikaApp.entitlements create mode 100644 ios/HaptikaWatch/App/HaptikaWatchApp.swift create mode 100644 ios/HaptikaWatch/App/WatchAppModel.swift create mode 100644 ios/HaptikaWatch/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ios/HaptikaWatch/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/HaptikaWatch/Assets.xcassets/Contents.json create mode 100644 ios/HaptikaWatch/Core/RegulationProtocol.swift create mode 100644 ios/HaptikaWatch/Core/WatchBaseline.swift create mode 100644 ios/HaptikaWatch/Core/WatchMeasurementValidator.swift create mode 100644 ios/HaptikaWatch/Core/WatchModels.swift create mode 100644 ios/HaptikaWatch/Core/WatchResourceArbiter.swift create mode 100644 ios/HaptikaWatch/Core/WatchStore.swift create mode 100644 ios/HaptikaWatch/Core/WatchSyncEnvelope.swift create mode 100644 ios/HaptikaWatch/HaptikaWatch.entitlements create mode 100644 ios/HaptikaWatch/Info.plist create mode 100644 ios/HaptikaWatch/Services/WatchConnectivityService.swift create mode 100644 ios/HaptikaWatch/Services/WatchHapticService.swift create mode 100644 ios/HaptikaWatch/Services/WatchHealthMeasurementService.swift create mode 100644 ios/HaptikaWatch/Views/WatchBeforeAfterFlowView.swift create mode 100644 ios/HaptikaWatch/Views/WatchCardiacMirrorView.swift create mode 100644 ios/HaptikaWatch/Views/WatchCoherenceView.swift create mode 100644 ios/HaptikaWatch/Views/WatchExercisesView.swift create mode 100644 ios/HaptikaWatch/Views/WatchHistoryView.swift create mode 100644 ios/HaptikaWatch/Views/WatchMeasurementView.swift create mode 100644 ios/HaptikaWatch/Views/WatchRootView.swift create mode 100644 ios/HaptikaWatch/Views/WatchTheme.swift create mode 100644 ios/HaptikaWatchTests/WatchCoreTests.swift create mode 100644 ios/Podfile.lock create mode 100644 onboarding-design-qa.md create mode 100644 package-lock.json create mode 100644 packages/react-native-haptika-ppg/HaptikaPPG.podspec create mode 100644 packages/react-native-haptika-ppg/Package.swift create mode 100644 packages/react-native-haptika-ppg/Tests/HaptikaFrameMetricsTests/PPGFrameMetricsExtractorTests.swift create mode 100644 packages/react-native-haptika-ppg/Tests/HaptikaSafetyTests/PPGThermalSafetyPolicyTests.swift create mode 100644 packages/react-native-haptika-ppg/Tests/HaptikaSignalTests/PPGCoherencePolicyTests.swift create mode 100644 packages/react-native-haptika-ppg/Tests/HaptikaSignalTests/PPGSignalPipelineTests.swift create mode 100644 packages/react-native-haptika-ppg/Tests/HaptikaSignalTests/PPGSyntheticSignalTests.swift create mode 100644 packages/react-native-haptika-ppg/ios/FrameProcessor/HybridHaptikaPPGFrameProcessor.swift create mode 100644 packages/react-native-haptika-ppg/ios/FrameProcessor/PPGFingerContactDetector.swift create mode 100644 packages/react-native-haptika-ppg/ios/FrameProcessor/PPGFrameMetricsExtractor.swift create mode 100644 packages/react-native-haptika-ppg/ios/Haptics/HybridHaptikaCardiacMirror.swift create mode 100644 packages/react-native-haptika-ppg/ios/Health/HybridHaptikaHealthKit.swift create mode 100644 packages/react-native-haptika-ppg/ios/Safety/PPGThermalMonitor.swift create mode 100644 packages/react-native-haptika-ppg/ios/Safety/PPGThermalSafetyPolicy.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/BPMEstimator.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/Filtering.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/Models.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/PPGCoherencePolicy.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/PPGSyntheticSignalGenerator.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/PRVCalculator.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/PeakDetector.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/Resampler.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/SignalProcessor.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/SignalQualityEvaluator.swift create mode 100644 packages/react-native-haptika-ppg/ios/Signal/Statistics.swift create mode 100644 packages/react-native-haptika-ppg/ios/Watch/HaptikaWatchConnectivityModule.swift create mode 100644 packages/react-native-haptika-ppg/ios/Watch/HaptikaWatchConnectivityModuleBridge.m create mode 100644 packages/react-native-haptika-ppg/ios/Watch/HaptikaWatchConnectivityService.swift create mode 100644 packages/react-native-haptika-ppg/nitro.json create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/.gitattributes create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/HaptikaPPG+autolinking.rb create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/HaptikaPPG-Swift-Cxx-Bridge.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/HaptikaPPG-Swift-Cxx-Bridge.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/HaptikaPPG-Swift-Cxx-Umbrella.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/HaptikaPPGAutolinking.mm create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/HaptikaPPGAutolinking.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/c++/HybridHaptikaCardiacMirrorSpecSwift.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/c++/HybridHaptikaCardiacMirrorSpecSwift.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/c++/HybridHaptikaHealthKitSpecSwift.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/c++/HybridHaptikaHealthKitSpecSwift.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/c++/HybridHaptikaPPGFrameProcessorSpecSwift.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/c++/HybridHaptikaPPGFrameProcessorSpecSwift.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/FingerContactState.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/Func_void_NativeHealthKitContext.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/Func_void_bool.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/Func_void_std__optional_NativeHeartbeatSeriesSummary_.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HealthMetricType.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HybridHaptikaCardiacMirrorSpec.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HybridHaptikaCardiacMirrorSpec_cxx.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HybridHaptikaHealthKitSpec.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HybridHaptikaHealthKitSpec_cxx.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HybridHaptikaPPGFrameProcessorSpec.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/HybridHaptikaPPGFrameProcessorSpec_cxx.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeAcceptedBeat.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeBPMEstimate.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeCardiacMirrorHeartbeat.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeCardiacMirrorPatternInfo.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeHealthKitContext.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeHealthMetricSample.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeHeartbeatSeriesSummary.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativePPGConfiguration.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativePPGProcessingResult.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativePRVMetrics.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/NativeSignalQualityResult.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/PPGFrameUpdate.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/PPGSessionPurpose.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/ios/swift/ThermalState.swift create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/FingerContactState.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HealthMetricType.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HybridHaptikaCardiacMirrorSpec.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HybridHaptikaCardiacMirrorSpec.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HybridHaptikaHealthKitSpec.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HybridHaptikaHealthKitSpec.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HybridHaptikaPPGFrameProcessorSpec.cpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/HybridHaptikaPPGFrameProcessorSpec.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeAcceptedBeat.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeBPMEstimate.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeCardiacMirrorHeartbeat.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeCardiacMirrorPatternInfo.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeHealthKitContext.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeHealthMetricSample.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeHeartbeatSeriesSummary.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativePPGConfiguration.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativePPGProcessingResult.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativePRVMetrics.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/NativeSignalQualityResult.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/PPGFrameUpdate.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/PPGSessionPurpose.hpp create mode 100644 packages/react-native-haptika-ppg/nitrogen/generated/shared/c++/ThermalState.hpp create mode 100644 packages/react-native-haptika-ppg/package.json create mode 100644 packages/react-native-haptika-ppg/react-native.config.js create mode 100644 packages/react-native-haptika-ppg/src/index.ts create mode 100644 packages/react-native-haptika-ppg/src/specs/HaptikaPPG.nitro.ts create mode 100644 packages/react-native-haptika-ppg/tsconfig.json create mode 100644 qa/figma-123/comparison-all.jpg create mode 100644 qa/figma-123/implementation-home.jpg create mode 100644 qa/figma-123/implementation-measurement.jpg create mode 100644 qa/figma-123/implementation-preparation.jpg create mode 100644 qa/figma-123/implementation-result.jpg create mode 100644 qa/figma-123/source-home.png create mode 100644 qa/figma-123/source-measurement.png create mode 100644 qa/figma-123/source-preparation.png create mode 100644 qa/figma-123/source-result.png create mode 100644 qa/onboarding/step-1-welcome.jpg create mode 100644 qa/onboarding/step-3-assessment.jpg create mode 100644 qa/onboarding/step-6-experience.jpg create mode 100644 qa/onboarding/step-7-complete.jpg create mode 100644 shared/regulation-protocols.v1.json create mode 100644 shared/watch-sync-fixtures.v1.json create mode 100644 src/features/cardiacMirror/CardiacMirrorScreen.tsx create mode 100644 src/features/cardiacMirror/HapticWaveExerciseScreen.tsx create mode 100644 src/features/cardiacMirror/ProtocolInfoSheet.tsx create mode 100644 src/features/cardiacMirror/cardiacMirrorEngine.test.ts create mode 100644 src/features/cardiacMirror/cardiacMirrorEngine.ts create mode 100644 src/features/cardiacMirror/cardiacMirrorService.ts create mode 100644 src/features/cardiacMirror/cardiacMirrorTypes.ts create mode 100644 src/features/cardiacMirror/regulationComparison.test.ts create mode 100644 src/features/cardiacMirror/regulationComparison.ts create mode 100644 src/features/cardiacMirror/regulationManifest.test.ts create mode 100644 src/features/cardiacMirror/regulationPhaseEngine.test.ts create mode 100644 src/features/cardiacMirror/regulationPhaseEngine.ts create mode 100644 src/features/cardiacMirror/regulationProtocols.test.ts create mode 100644 src/features/cardiacMirror/regulationProtocols.ts create mode 100644 src/features/cardiacMirror/regulationSessionRepository.test.ts create mode 100644 src/features/cardiacMirror/regulationSessionRepository.ts create mode 100644 src/features/cardiacMirror/regulationSessionTypes.ts create mode 100644 src/features/coherence/MyCoherenceScreen.tsx create mode 100644 src/features/coherence/coherenceEngine.test.ts create mode 100644 src/features/coherence/coherenceEngine.ts create mode 100644 src/features/coherence/coherenceSessionRepository.test.ts create mode 100644 src/features/coherence/coherenceSessionRepository.ts create mode 100644 src/features/coherence/coherenceTypes.ts create mode 100644 src/features/onboarding/OnboardingScreen.tsx create mode 100644 src/features/onboarding/assets/haptika-silhouettes.png create mode 100644 src/features/onboarding/onboardingRepository.test.ts create mode 100644 src/features/onboarding/onboardingRepository.ts create mode 100644 src/features/ppg/assets/finger-camera-placement.png create mode 100644 src/features/ppg/assets/hrv-silhouette.png create mode 100644 src/features/ppg/camera/PPGCameraView.tsx create mode 100644 src/features/ppg/camera/cameraTypes.ts create mode 100644 src/features/ppg/camera/usePPGCamera.ts create mode 100644 src/features/ppg/components/ConfidenceIndicator.tsx create mode 100644 src/features/ppg/components/FingerContactIndicator.tsx create mode 100644 src/features/ppg/components/HaptikaChrome.tsx create mode 100644 src/features/ppg/components/MeasurementProgress.tsx create mode 100644 src/features/ppg/components/MetricInsightCard.tsx create mode 100644 src/features/ppg/components/MetricTrendChart.tsx create mode 100644 src/features/ppg/components/PPGResultSummary.tsx create mode 100644 src/features/ppg/components/PotentialStressGauge.tsx create mode 100644 src/features/ppg/components/PrimaryButton.tsx create mode 100644 src/features/ppg/components/SignalQualityBadge.tsx create mode 100644 src/features/ppg/health/healthContextEvaluator.ts create mode 100644 src/features/ppg/health/healthKitService.ts create mode 100644 src/features/ppg/health/healthTypes.ts create mode 100644 src/features/ppg/history/historyAnalytics.ts create mode 100644 src/features/ppg/insights/metricInsights.ts create mode 100644 src/features/ppg/measurement/measurementConfiguration.ts create mode 100644 src/features/ppg/measurement/measurementCoordinator.ts create mode 100644 src/features/ppg/measurement/measurementMachine.ts create mode 100644 src/features/ppg/measurement/measurementTypes.ts create mode 100644 src/features/ppg/measurement/usePPGMeasurement.ts create mode 100644 src/features/ppg/screens/PPGFailureScreen.tsx create mode 100644 src/features/ppg/screens/PPGHistoryScreen.tsx create mode 100644 src/features/ppg/screens/PPGMeasurementScreen.tsx create mode 100644 src/features/ppg/screens/PPGPreparationScreen.tsx create mode 100644 src/features/ppg/screens/PPGResultScreen.tsx create mode 100644 src/features/ppg/storage/acquisitionPreferencesRepository.ts create mode 100644 src/features/ppg/storage/baselineRepository.ts create mode 100644 src/features/ppg/storage/database.ts create mode 100644 src/features/ppg/storage/measurementRepository.ts create mode 100644 src/features/ppg/storage/settingsRepository.ts create mode 100644 src/features/ppg/storage/storageTypes.ts create mode 100644 src/features/ppg/stress/baselineCalculator.ts create mode 100644 src/features/ppg/stress/baselineTypes.ts create mode 100644 src/features/ppg/stress/confidenceCalculator.ts create mode 100644 src/features/ppg/stress/potentialStressCalculator.ts create mode 100644 src/features/ppg/stress/stressIndexConfiguration.ts create mode 100644 src/features/ppg/stress/stressInterpretation.ts create mode 100644 src/features/ppg/stress/stressTypes.ts create mode 100644 src/features/ppg/tests/PPGCameraView.test.tsx create mode 100644 src/features/ppg/tests/acquisitionPreferencesRepository.test.ts create mode 100644 src/features/ppg/tests/baselineAndStress.test.ts create mode 100644 src/features/ppg/tests/healthContextEvaluator.test.ts create mode 100644 src/features/ppg/tests/historyAnalytics.test.ts create mode 100644 src/features/ppg/tests/measurementConfiguration.test.ts create mode 100644 src/features/ppg/tests/measurementCoordinator.test.ts create mode 100644 src/features/ppg/tests/measurementMachine.test.ts create mode 100644 src/features/ppg/tests/metricInsights.test.ts create mode 100644 src/features/ppg/tests/storage.test.ts create mode 100644 src/features/ppg/tests/syntheticMeasurements.ts create mode 100644 src/features/ppg/tests/usePPGMeasurement.test.tsx create mode 100644 src/features/watch/watchAnalytics.ts create mode 100644 src/features/watch/watchBaseline.ts create mode 100644 src/features/watch/watchContract.test.ts create mode 100644 src/features/watch/watchRepository.test.ts create mode 100644 src/features/watch/watchRepository.ts create mode 100644 src/features/watch/watchService.test.ts create mode 100644 src/features/watch/watchService.ts create mode 100644 src/features/watch/watchTypes.ts create mode 100644 src/features/watch/watchValidation.ts create mode 100644 src/theme.ts diff --git a/.gitignore b/.gitignore index de99955..38b0f48 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,10 @@ yarn-error.log **/Pods/ /vendor/bundle/ +# Swift Package Manager +**/.build/ +**/.swiftpm/ + # Temporary files created by Metro to check the health of the file watcher .metro-health-check* diff --git a/App.tsx b/App.tsx index 5e963b1..ca1f3d4 100644 --- a/App.tsx +++ b/App.tsx @@ -1,44 +1,852 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - */ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { ActivityIndicator, StatusBar, StyleSheet, View } from 'react-native'; +import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'; -import { NewAppScreen } from '@react-native/new-app-screen'; -import { StatusBar, StyleSheet, useColorScheme, View } from 'react-native'; +import { colors } from './src/theme'; +import { OnboardingScreen } from './src/features/onboarding/OnboardingScreen'; import { - SafeAreaProvider, - useSafeAreaInsets, -} from 'react-native-safe-area-context'; + onboardingRepository, + type OnboardingAnswers, +} from './src/features/onboarding/onboardingRepository'; +import { CardiacMirrorScreen } from './src/features/cardiacMirror/CardiacMirrorScreen'; +import { MyCoherenceScreen } from './src/features/coherence/MyCoherenceScreen'; +import { coherenceSessionRepository } from './src/features/coherence/coherenceSessionRepository'; +import { + HapticWaveExerciseScreen, + type HapticExerciseSummary, +} from './src/features/cardiacMirror/HapticWaveExerciseScreen'; +import { + getRegulationProtocol, + recommendRegulationProtocol, + type HapticRegulationProtocolKind, +} from './src/features/cardiacMirror/regulationProtocols'; +import { compareRegulationMeasurements } from './src/features/cardiacMirror/regulationComparison'; +import { regulationSessionRepository } from './src/features/cardiacMirror/regulationSessionRepository'; +import type { + RegulationComparison, + RegulationSession, +} from './src/features/cardiacMirror/regulationSessionTypes'; +import { usePPGCamera } from './src/features/ppg/camera/usePPGCamera'; +import { evaluateHealthKitContext } from './src/features/ppg/health/healthContextEvaluator'; +import { healthKitService } from './src/features/ppg/health/healthKitService'; +import type { HealthKitContext } from './src/features/ppg/health/healthTypes'; +import { PPG_ALGORITHM_VERSION } from './src/features/ppg/measurement/measurementConfiguration'; +import { usePPGMeasurement } from './src/features/ppg/measurement/usePPGMeasurement'; +import { PPGFailureScreen } from './src/features/ppg/screens/PPGFailureScreen'; +import { PPGHistoryScreen } from './src/features/ppg/screens/PPGHistoryScreen'; +import { PPGMeasurementScreen } from './src/features/ppg/screens/PPGMeasurementScreen'; +import { PPGPreparationScreen } from './src/features/ppg/screens/PPGPreparationScreen'; +import { PPGResultScreen } from './src/features/ppg/screens/PPGResultScreen'; +import { calculatePotentialStress } from './src/features/ppg/stress/potentialStressCalculator'; +import type { BaselineCalculationResult } from './src/features/ppg/stress/baselineTypes'; +import { baselineRepository } from './src/features/ppg/storage/baselineRepository'; +import { acquisitionPreferencesRepository } from './src/features/ppg/storage/acquisitionPreferencesRepository'; +import { measurementRepository } from './src/features/ppg/storage/measurementRepository'; +import { settingsRepository } from './src/features/ppg/storage/settingsRepository'; +import type { + DataRetentionPolicy, + MeasurementSelfReport, + StoredMeasurement, +} from './src/features/ppg/storage/storageTypes'; +import {calculateWatchBaseline, type WatchBaselineV1} from './src/features/watch/watchBaseline'; +import {watchRepository} from './src/features/watch/watchRepository'; +import {watchSyncCoordinator} from './src/features/watch/watchService'; +import type { + WatchConnectionState, + WatchMeasurementSummaryV1, + WatchRegulationSessionV1, + WatchSyncEnvelopeV1, + WatchTombstoneV1, +} from './src/features/watch/watchTypes'; -function App() { - const isDarkMode = useColorScheme() === 'dark'; +type AppView = 'measurement' | 'history' | 'cardiacMirror' | 'hapticExercise' | 'myCoherence'; +type FinalizationState = 'idle' | 'saving' | 'failed'; +type SelfReportState = 'idle' | 'saving' | 'saved' | 'failed'; +type OnboardingStatus = 'loading' | 'required' | 'completed'; +const EMPTY_WATCH_CONNECTION: WatchConnectionState = { + supported: false, + paired: false, + watchAppInstalled: false, + reachable: false, + activationState: 'notActivated', + latestEventId: null, + latestEventAt: null, +}; + +function createMeasurementId(): string { + return `ppg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`; +} + +function App(): React.JSX.Element { return ( - - + + + + ); } -function AppContent() { - const safeAreaInsets = useSafeAreaInsets(); +function HaptikaApp(): React.JSX.Element { + const cameraPermission = usePPGCamera(); + const measurement = usePPGMeasurement(); + const [onboardingStatus, setOnboardingStatus] = + useState('loading'); + const [onboardingAnswers, setOnboardingAnswers] = useState< + OnboardingAnswers | undefined + >(); + const [appView, setAppView] = useState('measurement'); + const [includeHealthKit, setIncludeHealthKit] = useState(false); + const [sensitiveContact, setSensitiveContact] = useState(true); + const [cameraPosition, setCameraPosition] = useState<'back' | 'front'>( + 'front', + ); + const [atRestSelection, setAtRestSelection] = useState(null); + const [history, setHistory] = useState([]); + const [watchHistory, setWatchHistory] = useState([]); + const [watchRegulationSessions, setWatchRegulationSessions] = useState([]); + const [watchBaseline, setWatchBaseline] = useState(null); + const [watchConnection, setWatchConnection] = useState(EMPTY_WATCH_CONNECTION); + const [saveMindAndBodyWorkouts, setSaveMindAndBodyWorkouts] = useState(true); + const [retentionPolicy, setRetentionPolicy] = + useState('forever'); + const [baselineProgress, setBaselineProgress] = + useState(null); + const [currentMeasurement, setCurrentMeasurement] = + useState(null); + const [exerciseProtocol, setExerciseProtocol] = + useState('coherence55'); + const [pendingProtocolIntent, setPendingProtocolIntent] = + useState(null); + const [regulationBeforeMeasurement, setRegulationBeforeMeasurement] = + useState(null); + const [pendingRegulationSession, setPendingRegulationSession] = + useState(null); + const [pendingCoherenceSessionId, setPendingCoherenceSessionId] = useState< + string | null + >(null); + const [regulationComparison, setRegulationComparison] = + useState(null); + const [regulationSessions, setRegulationSessions] = useState< + RegulationSession[] + >([]); + const [selfReportState, setSelfReportState] = + useState('idle'); + const [finalizationState, setFinalizationState] = + useState('idle'); + const finalizingResultRef = useRef(false); + const measurementAtRestRef = useRef(false); + const postRegulationMeasurementRef = useRef(false); + + const refreshHistory = useCallback(async (): Promise => { + setHistory(await measurementRepository.getAll()); + }, []); + + const refreshWatchData = useCallback(async (): Promise => { + const [measurements, sessions] = await Promise.all([ + watchRepository.getMeasurements(), + watchRepository.getRegulationSessions(), + ]); + setWatchHistory(measurements); + setWatchRegulationSessions(sessions); + setWatchBaseline(calculateWatchBaseline(measurements)); + setWatchConnection(await watchSyncCoordinator.connectionState()); + }, []); + + const refreshBaseline = + useCallback(async (): Promise => { + const result = await baselineRepository.calculate({ + measurementHourLocal: new Date().getHours(), + cameraPosition, + }); + setBaselineProgress(result); + return result; + }, [cameraPosition]); + + const refreshRegulationSessions = useCallback(async (): Promise => { + setRegulationSessions(await regulationSessionRepository.getAll()); + }, []); + + useEffect(() => { + onboardingRepository + .get() + .then(state => { + if (state !== null) { + setOnboardingAnswers(state); + } + setOnboardingStatus( + state?.completed === true ? 'completed' : 'required', + ); + }) + .catch(() => setOnboardingStatus('required')); + settingsRepository.get().then(settings => { + setIncludeHealthKit(settings.includeHealthKitContext); + setSaveMindAndBodyWorkouts(settings.saveMindAndBodyWorkouts); + watchSyncCoordinator.updatePreferences({ + schemaVersion: 1, + saveMindAndBodyWorkouts: settings.saveMindAndBodyWorkouts, + protocolCatalogVersion: '1', + updatedAt: new Date().toISOString(), + }); + }); + acquisitionPreferencesRepository.get().then(preferences => { + setCameraPosition(preferences.cameraPosition); + setSensitiveContact(preferences.sensitiveContact); + }); + refreshHistory(); + refreshBaseline(); + refreshRegulationSessions(); + refreshWatchData(); + watchSyncCoordinator.start(refreshWatchData); + measurementRepository.getRetentionPolicy().then(setRetentionPolicy); + const connectionTimer = setInterval(() => { + watchSyncCoordinator.connectionState().then(setWatchConnection).catch(() => undefined); + }, 2_000); + return () => { + clearInterval(connectionTimer); + watchSyncCoordinator.stop(); + }; + }, [refreshBaseline, refreshHistory, refreshRegulationSessions, refreshWatchData]); + + useEffect(() => { + if (measurement.snapshot.value === 'cancelled') { + measurement.reset(); + } + }, [measurement, measurement.snapshot.value]); + + useEffect(() => { + const result = measurement.snapshot.context.result; + if ( + measurement.snapshot.value !== 'completed' || + result === null || + finalizingResultRef.current || + finalizationState !== 'idle' || + currentMeasurement !== null + ) { + return; + } + + finalizingResultRef.current = true; + setFinalizationState('saving'); + (async (): Promise => { + let healthContext: HealthKitContext | null = null; + let contextConsistency = 0.5; + if ( + measurement.snapshot.context.healthPermission === 'requestCompleted' + ) { + try { + healthContext = await healthKitService.fetchContext(14); + if (healthContext !== null) { + const evaluation = evaluateHealthKitContext(healthContext); + if (evaluation.hasUsableContext) { + contextConsistency = evaluation.contextConfidence; + } + } + } catch { + healthContext = null; + } + } + + const baselineResult = await baselineRepository.calculate({ + measurementHourLocal: new Date().getHours(), + cameraPosition, + }); + const potentialStress = calculatePotentialStress({ + atRest: measurementAtRestRef.current, + bpm: result.bpm.bpm, + estimatedRmssdMs: result.prv.estimatedRmssdMs, + prvReliable: result.prv.reliable, + validIntervalCount: result.prv.validIntervalCount, + signalQuality: result.quality.score, + usableDurationSeconds: result.quality.usableDurationSeconds, + peakConfidence: result.bpm.confidence, + methodAgreementScore: result.quality.methodAgreementScore, + contextConsistency, + baseline: baselineResult.baseline, + }); + const record: StoredMeasurement = { + schemaVersion: 1, + algorithmVersion: PPG_ALGORITHM_VERSION, + id: createMeasurementId(), + acquisition: { + cameraPosition, + torchUsed: cameraPosition === 'back', + }, + measuredAt: new Date().toISOString(), + atRest: measurementAtRestRef.current, + baselineEligible: + measurementAtRestRef.current && !postRegulationMeasurementRef.current, + cameraResult: result, + potentialStress, + healthKitContext: healthContext, + selfReport: null, + }; + await measurementRepository.add(record); + if ( + pendingRegulationSession !== null && + regulationBeforeMeasurement !== null + ) { + try { + await regulationSessionRepository.complete( + pendingRegulationSession.id, + record.id, + record.measuredAt, + ); + if (pendingCoherenceSessionId !== null) { + await coherenceSessionRepository.attachAfterMeasurement( + pendingCoherenceSessionId, + record.id, + ); + } + await refreshRegulationSessions(); + } catch { + // The physiological result remains usable even if the local journey + // link cannot be persisted. Never discard a completed measurement. + } + setRegulationComparison( + compareRegulationMeasurements(regulationBeforeMeasurement, record), + ); + setPendingRegulationSession(null); + setPendingCoherenceSessionId(null); + } + await refreshBaseline(); + setCurrentMeasurement(record); + if (pendingProtocolIntent !== null && pendingRegulationSession === null) { + setExerciseProtocol(pendingProtocolIntent); + setRegulationBeforeMeasurement(record); + setPendingProtocolIntent(null); + setAppView('hapticExercise'); + } + setSelfReportState('idle'); + refreshHistory().catch(() => undefined); + })() + .catch(() => { + setFinalizationState('failed'); + }) + .finally(() => { + finalizingResultRef.current = false; + }); + }, [ + currentMeasurement, + cameraPosition, + finalizationState, + measurement.snapshot.context.healthPermission, + measurement.snapshot.context.result, + measurement.snapshot.value, + pendingRegulationSession, + pendingCoherenceSessionId, + pendingProtocolIntent, + regulationBeforeMeasurement, + refreshHistory, + refreshBaseline, + refreshRegulationSessions, + ]); + + const handleHealthKitPreference = useCallback((value: boolean): void => { + setIncludeHealthKit(value); + settingsRepository.setIncludeHealthKitContext(value); + }, []); + + const handleSaveMindAndBodyPreference = useCallback((value: boolean): void => { + setSaveMindAndBodyWorkouts(value); + settingsRepository.setSaveMindAndBodyWorkouts(value).catch(() => undefined); + watchSyncCoordinator.updatePreferences({ + schemaVersion: 1, + saveMindAndBodyWorkouts: value, + protocolCatalogVersion: '1', + updatedAt: new Date().toISOString(), + }); + }, []); + + const handleOnboardingHealthKit = useCallback(async (): Promise => { + if (!healthKitService.isAvailable()) { + return false; + } + try { + const accepted = await healthKitService.requestReadAuthorization(); + if (accepted) { + setIncludeHealthKit(true); + await settingsRepository.setIncludeHealthKitContext(true); + } + return accepted; + } catch { + return false; + } + }, []); + + const handleCameraPositionPreference = useCallback( + (value: 'back' | 'front'): void => { + setCameraPosition(value); + acquisitionPreferencesRepository + .set({ cameraPosition: value, sensitiveContact }) + .catch(() => undefined); + }, + [sensitiveContact], + ); + + const handleSensitiveContactPreference = useCallback( + (value: boolean): void => { + setSensitiveContact(value); + acquisitionPreferencesRepository + .set({ cameraPosition, sensitiveContact: value }) + .catch(() => undefined); + }, + [cameraPosition], + ); + + const startMeasurement = useCallback((atRestOverride?: boolean): void => { + const selectedAtRest = atRestOverride ?? atRestSelection; + if (selectedAtRest === null) return; + setAppView('measurement'); + setCurrentMeasurement(null); + setSelfReportState('idle'); + setFinalizationState('idle'); + finalizingResultRef.current = false; + measurementAtRestRef.current = selectedAtRest; + postRegulationMeasurementRef.current = pendingRegulationSession !== null; + if (pendingRegulationSession === null) { + setRegulationComparison(null); + setRegulationBeforeMeasurement(null); + } + measurement.start({ + includeHealthKitContext: includeHealthKit, + sensitiveContact, + requestCameraPermission: cameraPermission.requestCameraPermission, + }); + }, [ + cameraPermission.requestCameraPermission, + atRestSelection, + includeHealthKit, + measurement, + pendingRegulationSession, + sensitiveContact, + ]); + + const restartMeasurement = useCallback((): void => { + measurement.reset(); + setCurrentMeasurement(null); + setAtRestSelection(null); + setFinalizationState('idle'); + finalizingResultRef.current = false; + postRegulationMeasurementRef.current = false; + setPendingRegulationSession(null); + setPendingCoherenceSessionId(null); + setRegulationBeforeMeasurement(null); + setRegulationComparison(null); + }, [measurement]); + + const retryMeasurement = useCallback((): void => { + setCurrentMeasurement(null); + finalizingResultRef.current = false; + measurement.retry(); + if (measurement.snapshot.context.cameraPermission !== 'granted') { + Promise.resolve().then(() => startMeasurement()); + } + }, [measurement, startMeasurement]); + + const backToPreparation = useCallback((): void => { + measurement.reset(); + setCurrentMeasurement(null); + setAtRestSelection(null); + setFinalizationState('idle'); + setSelfReportState('idle'); + setAppView('measurement'); + finalizingResultRef.current = false; + postRegulationMeasurementRef.current = false; + setPendingRegulationSession(null); + setPendingCoherenceSessionId(null); + setRegulationBeforeMeasurement(null); + setRegulationComparison(null); + }, [measurement]); + + const startRegulationJourney = useCallback( + (protocolKind: HapticRegulationProtocolKind): void => { + if (currentMeasurement === null) return; + setExerciseProtocol(protocolKind); + setRegulationBeforeMeasurement(currentMeasurement); + setRegulationComparison(null); + setAppView('hapticExercise'); + }, + [currentMeasurement], + ); + + const completeRegulationExercise = useCallback( + (summary: HapticExerciseSummary, coherenceSessionId?: string): void => { + if (regulationBeforeMeasurement === null || !summary.completed) return; + (async (): Promise => { + const created = await regulationSessionRepository.create({ + protocolKind: summary.protocolKind, + beforeMeasurementId: regulationBeforeMeasurement.id, + startedAt: summary.startedAt, + }); + if (coherenceSessionId !== undefined) { + await coherenceSessionRepository.attachRegulationSession( + coherenceSessionId, + created.id, + ); + setPendingCoherenceSessionId(coherenceSessionId); + } else { + setPendingCoherenceSessionId(null); + } + const awaitingAfter = + await regulationSessionRepository.markAwaitingAfter( + created.id, + summary.completedAt, + ); + await refreshRegulationSessions(); + setPendingRegulationSession(awaitingAfter); + measurement.reset(); + setCurrentMeasurement(null); + setAtRestSelection(true); + setFinalizationState('idle'); + setSelfReportState('idle'); + finalizingResultRef.current = false; + postRegulationMeasurementRef.current = true; + setAppView('measurement'); + })().catch(() => { + setPendingRegulationSession(null); + setPendingCoherenceSessionId(null); + setAppView('measurement'); + }); + }, + [measurement, refreshRegulationSessions, regulationBeforeMeasurement], + ); + + const saveSelfReport = useCallback( + (report: MeasurementSelfReport): void => { + if (currentMeasurement === null) return; + setSelfReportState('saving'); + measurementRepository + .attachSelfReport(currentMeasurement.id, report) + .then(async () => { + const baselineEligible = + currentMeasurement.atRest && + regulationComparison === null && + ![ + report.recentExercise, + report.recentCaffeine, + report.recentMeal, + report.movementDuringMeasurement, + report.phoneUnusuallyWarm, + ].some(value => value === true); + setCurrentMeasurement({ + ...currentMeasurement, + selfReport: report, + baselineEligible, + }); + setSelfReportState('saved'); + await Promise.all([refreshHistory(), refreshBaseline()]); + }) + .catch(() => setSelfReportState('failed')); + }, + [currentMeasurement, refreshBaseline, refreshHistory, regulationComparison], + ); + + const deleteMeasurement = useCallback( + async (measurementId: string): Promise => { + await Promise.all([ + measurementRepository.deleteById(measurementId), + regulationSessionRepository.deleteRelatedToMeasurement(measurementId), + coherenceSessionRepository.deleteRelatedToMeasurement(measurementId), + ]); + await Promise.all([ + refreshHistory(), + refreshBaseline(), + refreshRegulationSessions(), + ]); + }, + [refreshBaseline, refreshHistory, refreshRegulationSessions], + ); + + const transferWatchTombstone = useCallback((tombstone: WatchTombstoneV1): void => { + const envelope: WatchSyncEnvelopeV1 = { + schemaVersion: 1, + eventId: `iphone-delete-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + deviceId: 'iphone', + sequence: 0, + sentAt: new Date().toISOString(), + kind: 'tombstone', + payload: tombstone, + }; + watchSyncCoordinator.transferEvent(envelope); + }, []); + + const deleteWatchMeasurement = useCallback(async (measurementId: string): Promise => { + const tombstone = await watchRepository.deleteMeasurement(measurementId); + transferWatchTombstone(tombstone); + await refreshWatchData(); + }, [refreshWatchData, transferWatchTombstone]); + + const clearMeasurementData = useCallback(async (): Promise => { + const [, , , watchTombstones] = await Promise.all([ + measurementRepository.clearAll(), + regulationSessionRepository.clearAll(), + coherenceSessionRepository.clearAll(), + watchRepository.clearAll(), + ]); + watchTombstones.forEach(transferWatchTombstone); + setCurrentMeasurement(null); + await Promise.all([ + refreshHistory(), + refreshBaseline(), + refreshRegulationSessions(), + refreshWatchData(), + ]); + }, [refreshBaseline, refreshHistory, refreshRegulationSessions, refreshWatchData, transferWatchTombstone]); + + const changeRetentionPolicy = useCallback( + async (policy: DataRetentionPolicy): Promise => { + await measurementRepository.setRetentionPolicy(policy); + setRetentionPolicy(policy); + await Promise.all([refreshHistory(), refreshBaseline()]); + }, + [refreshBaseline, refreshHistory], + ); + + if (onboardingStatus === 'loading') { + return ( + + + + ); + } + + if (onboardingStatus === 'required') { + return ( + { + setOnboardingAnswers(answers); + setOnboardingStatus('completed'); + }} + /> + ); + } + + if (appView === 'history') { + return ( + { + setRegulationBeforeMeasurement(null); + setPendingRegulationSession(null); + setAppView('measurement'); + }} + /> + ); + } + + if (appView === 'cardiacMirror') { + return setAppView('measurement')} />; + } + + if (appView === 'hapticExercise') { + return ( + setAppView('measurement')} + onCompleted={completeRegulationExercise} + onRequestStart={protocol => { + if (currentMeasurement === null) { + setPendingProtocolIntent(protocol.kind); + setExerciseProtocol(protocol.kind); + setAtRestSelection(true); + setAppView('measurement'); + return true; + } + setExerciseProtocol(protocol.kind); + setRegulationBeforeMeasurement(currentMeasurement); + if (protocol.mode === 'livePPG') { + cameraPermission.requestCameraPermission().then(granted => { + if (granted) setAppView('myCoherence'); + }); + return true; + } + return false; + }} + onCancelled={() => { + setRegulationBeforeMeasurement(null); + setPendingRegulationSession(null); + setPendingCoherenceSessionId(null); + }} + /> + ); + } + + if (appView === 'myCoherence') { + return ( + { + completeRegulationExercise( + { + protocolKind: 'myCoherence', + startedAt: summary.startedAt, + completedAt: summary.completedAt, + elapsedSeconds: summary.elapsedSeconds, + completed: summary.completed, + }, + session.id, + ); + }} + onCancelled={() => { + setRegulationBeforeMeasurement(null); + setAppView('hapticExercise'); + }} + /> + ); + } + + const state = measurement.snapshot.value; + if ( + state === 'preparingCamera' || + state === 'waitingForFinger' || + state === 'stabilizing' || + state === 'measuring' || + state === 'processing' + ) { + return ( + + ); + } + + if (state === 'completed') { + if (currentMeasurement === null) { + if (finalizationState === 'failed') { + return ( + setFinalizationState('idle')} + onBack={backToPreparation} + /> + ); + } + return ( + + + + ); + } + return ( + + ); + } + + if ( + state === 'invalid' || + state === 'thermalStop' || + state === 'interrupted' || + state === 'error' + ) { + return ( + + ); + } return ( - - - + setAppView('history')} + onOpenCardiacMirror={() => setAppView('cardiacMirror')} + onOpenHapticExercise={() => setAppView('hapticExercise')} + isStarting={ + state === 'requestingCameraPermission' || + state === 'requestingHealthPermission' + } + /> ); } const styles = StyleSheet.create({ - container: { + safeArea: { flex: 1, + backgroundColor: colors.background, + }, + loadingResult: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: colors.background, }, }); diff --git a/Docs/Haptika_Passation_Projet_Watch_2026-07-30.docx b/Docs/Haptika_Passation_Projet_Watch_2026-07-30.docx new file mode 100644 index 0000000000000000000000000000000000000000..7d15ffeb9dac9a12ca3f8efd52c297dce8987ffa GIT binary patch literal 151167 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

!dgem(`(f<;w; zoeuO1QJ1_f;C$wloh)`H>|dv!b_dr#WF>eB!8GN25DkKt9bFve4rc|@ET6O6o7?As zNyi(oJGr#$Y+`C_aLld|@JSF{OL0^gT6oZmL7MK7THe*GaegGY}z zVA8ImV{56Ye_YjUtmOw&WCa?Mvw>C@XLozMAo&}X#tvqdxAV2JMId%mr`*3IHCjQYPwB&2 zWgucx5`{xr1BE>>IaXVcy!R`wNgXoCg)y@0ZDBG*ZPn7p z!5BB4%Z>Z-@pl_kmpsY(PsmOTZS}}V2F-cg{W6V8ohAlcmGvf8F8fxf$n7Mge#%h##51nvRSIevt6H12bkx`*64#e*;APAk0K$= z`M7dPJ&K&xyX4nGaPk>@#MRW-0EQ>8-QMDQpNTZ7XUj4zH6gu>paOWE3Pz9rsiFMg zLof-%xFN(wToU*vCp&Rcmh}^|tA0e)Mo|&=E@O*6iJ7@IM5DM+D=q!L&FA{4Uq2v` zMT0&QYxT4)YpuahiePryNF{(3(tMzM_}l(L>1muEY4tWpaupZY`?*Jsrd$1*c>av) zIgo7;6}7&Y(S9+eU!tbH z3xu~DYazv(TFPW!Oe~s~qn9%~!r+St&(xDesBROt)!UyiYpZO^8y#iyHkkmx)#icN z0OA|Auy4#_rk|@$7H9vn%N+*B*SVK{nU(GA#Rh0CD@$B`SrXqC){!qORA!n9vfLD+emGxGEy#D%1KL>HAv;dGXpWS zWwG!K@_7i?2mswlY3=Wmy*}xWvg`suXql$9jnwqs&LW~F6FGF|U@5z~E?RA`Cz`o= zBvX(G?6bp9vaqe|c!6#=RujRKuad>(SR=@@Dg&al;Bf;l4@f*U+`0>AlF!8_(eI}X z-tBOi^)+_Kabw>57r=F*_(R}+=jYTWS zky>?5+mr_bt!>C8JklkUS=@F_qlTqduTKw#t%Z;Qzz}R?W-!R0f&Tu>(`n&(&4pF8 z6?#>`$W!Dz5H`*i0`GwM=*+2dMmp{4#8_L>!bTU_hjEQ$o5v}8n{D~-7L)LxF(EW^ zk6n#r-s-|)yFDyg)A#D+H5_cj20PCjCaq@)i8-7chV+Tn@5fCXp>Q<(L&`$5BbCOc_HH{VFHw7y}Zt%T4!%)~BT6Br|&sGQER*-twcs z^Np>{Le~QmhdLkT1I~k2`4B`Hf55Rrt)1-|5f?uAq%wsdu|a`WlwOW@byzLvzDA~c zCd{S34~{ueM2%|Y6wv285$C`s;Ij;DHLs-xi9f9+UE>DibGPs0^|~>AqnY+%ooHcD z;-(B6I9@ccGBbPYjR>c*7hXZz7Ew~BG+@-Nqg$vj;^V_9@}be2b@7&Se0MZSZ&D_6 zj`CdwzMn_+`r6uY{;`>-X09$Yh=Xl|t&^$pCF||)NK#U~eLIV35|EJ#^ed>#42wuh zMZ<)IoEgoo0U``nDOtG<9Dw1%Zu7L*#%d!eV-{fiKL9&G#J_9)^y#s?hblWecVJ+^ z%);yg3!AN}%}SdyXNOXMd{ghB+7*xliJVE78Xq^*OkEtLlPfFVxqA{7k?8PzbTVTi zXBhdytm#B}w5i2>{fdW33NtE|QXo{{EW2H^>+VT3nZomX?Foah2A44+riMN&>HM zu8|&bKO`h*U~2QFxi#M%!G_WTcZP?h*;R0etz?RF!6y3R#<{ZL8!*gU^ zZ`T;du+=hfHyb#{Jg;cny@Nqn)pQe{#X-mSpR%R0X}8hKL?S38orB%rs1 z(J-aordTwS%#m+ili+6bY95g3YeC z^z`w$#d59Ob*K5e%}0)Osg;T9APQ0Yzl~oaPjn3av~`-7%pCH+W|Ag^nkZ8R$YJk& z=>Sf*rd;fw7BO0^f4W3#l+4X<;&j9VXNc!(zbX^`+4mw?I_abJMmsGn#@|L!ntvKa z&69?U_vtuw=AB4i11cFm(RJ`jUq$8D*;(jsJ^ciYx$A2reXnz}ul_ljVY*(x;|uQj#HzgTg5tHm`^FXu`O~xdeO~O- zCxf+L9eQm6^uPE9iX&~OaK(g#bVWsJ*x6IIy>hbO%aJT*W@oFzHvhJ@+6Me>iWOw| z;5GeTtVTgiF5cvevYgs&|1vtp!G2Mu{NF}e_<7ZKDtJ#o>26$;+O>rtpiVzFVh{*@)S>3Zr~?S};UmP>FxP1F_!oWLx3#CBmoH`W z*|GoJLFh~<_3uo;00|0yguHr*Z`1|D0;RwCMq48EEf*0)jgkyAf0+yefd*FtXD`vP zFWaeQ(?B2`KP5Bv0KkSI(yFxD$f`67NM1<1`y(%HtM`PWT-pqZV`*_E5bw^uHua}z zLdkMD?3dEcHl5>xv}hnf$8CpQ+DC$KxkW)Hjl?4xv_UfFNRZkW?6<%vtbTH-ZWQ{A z4HB$>Nm63{=OZsmk=BSwaI)H|FA1R|^Cnh3NBxfV=}0p(L7>d8`(#v;#=(Gm;A=bkzX?lZrAHms zUgPHoX#t;oqh`Tbje`Vgx2N z*>sFDr#SxJF3)mlQn399nR;la{&OJ~xnhFW8!#o9BV<`ENk;n|ByZ*vs9{+hha&b0 zu#^8aFie$IL=Q{YSAa)rSNAgDFO+_1XD30bUQTpI`&@!#|4Bf!4C zJuO}O=fam)1^53W%0Ptww`hcRwwsnnyMjRSXuq#Q6aVYMGXFeSXSf6xc<@gk64T9B zKhm3j24Yvf=Gz-w_V+*t=4oG@mjr>Cd>Vzj-HYw}e@r0=@r-eF^Z#702atP1Sv2&r#< za@@G^8^+|Z9Q5E0W#-2mn^$Mwy8hEYx!Bwcg@y+1%ti$o{Hu-b!lE6%SgJd+pln6k!PN_g1==e_-0Cldt#}%TzRBF)TJ3NpbERG zf3Qx^&5Vgl#ld}bI^Jb7lriMPWZ%__wh*qpnkufMaU8Lta#C^{GbN|jO0go=){;TS zB;K4_WBxctB!|!bC%(59y*00K#V0TQ^`|~6h@ZH9PYKc~` zsi<`+$xPYO&BeL6xp`t#RHmm+i);$FbP|h#NRh9i21f;zo`7vrmR{WsD>8`onfJtC z*H>1cN{h|jh{fLA+cBNfOpqhs`}UBiBR;yA->nF>lcrQs6%*5v0!B;2kGWrO!EoLa zd_F@XYh9A8t?_B)N1MT;qyAZPlc8ptkJUAMD^-vbagtDTJ!Me-7T}&pZv`GYHaG!y zZDnR_Yr);Ov|XZhOnez@4l0cv5C_By{#oJ`3Xu zXG^IRY6glNGA1=OwIX}1y&g9ILq1oF`&N5;Red8|%c*1*wA>dNaZ186TrsaROTY`C z1PyL`o^;uSWRn z8TlajlVA-QUxXkA zCh^p1n<~MVUFGHF+g}pV&=gR~C9kJ0Ln|dzuu(vQ)#C=$pXhn)2$f{AwMG*vY?O}Fco z>e9J(O&6js)a~=%cqidG)DY)WsC4*0ld(T}sgpiPZSx$lda$NMDXBZc!ZpxWJi6bhA7W)WrWC?z<`{c zJ=Vj@+}OYnBCV>LtILO|q5_a@I_{@0)hF24<&~B8ot;?`$qg)D?J7o>7)lsuE68e8 z_4VI|^pGsmk{#V16%1t>tPOavvz9W#Cg}ovniq37*J7Wcf)GCt*QBMu7pm zgGVn;PEJ%baY3L+VYQn=0=I?r&Ar)r5n?O!wUThv2{dcg$w{R?j5qTu6U7;ketz9! zdipbme0(mu=BgZrL^$>kWW#_nM^g)v^s=nXV*Iq9cO1WmmikiF;JgE4c_zKrtL`)7 z=@_@QRBTdRP$3yn*RAXfFfkAQ4Cl|Ns23RMZTI8g#~?cBMag?BhI0+9fb;#y>HO5z z>S|?6?aa%h@24}Q%FznH?d|N_?q5vZI*%2U7HS`tkx|jHIhn5ThaV&*vO}Tr(Q#3O z!-L_W;pbkYE^D1uD|OA{AL3$S@Tc2uzw4%0B_&vx=i}nCuB~ASfUjLIE4DYaW4(kt)NJu>7xxAX(cHW8(D(VF!v9t426$hf{V^AT@Es>zr<}IV?aC@d+X_yf? zWwgY5)Y!;4b0eh~Q+h7;`+4vf4f*X$n}wQkm&a?ArDx+BA6? zIUd}|D1>$*tT~zf{9sYSclwY|j&8&6$HJc!eEU0PeUGQEhEkVDMjZ|t;u?)0S_H4m zYjp3WleTG{-;$pDddta8L6~->zZ`y89~xtZdqd?cwV1QzDq1rSG}W__E4rTQdHVC6 zyV3ow&6nP|1kS3|kms|ChHdXJ&lc_lq8W&x-tb*`fmxIqwdm9 z3tI>FkGfNPdo!*lXV&t+XQc4TS}weZNYnE3^T(l?13&dgQ@CsJ2J^0@q@^3b!3RUO z%ig_vcY1Ql&dy$3l61be(&R|wja;TzX?l(r-v_0!(QP9~7UpDOX$2qJ2?+_=4{?0O zN#Sz-x-iX0GNzlIle4$G`_aL??%VMj%4o3q(7-^8{cUSr(@X?u$H2gV>-F`CogH^0 zx2mcP3MRpLv1>*4M%$-PDK{@DbT8o$!=c)m2Tz+a-G=K29YH(0;6{JVJ&ud$ywD=O zv?X*378V$g9!TI!nOTN0v9U>-zaj|vs#W&la0-4FM4Py`osjFMeROPZRY5z^<1Ag# zXmVpap3he3T5x7k5SVSTXzTAcT{}N;kC%}S9q>Xzd2F=bYfW28+S!>6J$nIAQ7-P5 zP9ygj9HOJB7}fZ)!y-11JV2I&_gkn3kK1s$sMJ=JjiKRsnO@W8-YNIl%;DMD3sh88 z6&0K;WdDQt8j_Fo0-8?{$(S``pA#fMp{}%d5$DsYieM;`r^5P`nL-f&&@pFtd<$9Eu zcilR|xr`+~z0MQQc-cew9>|Q5V+Y0&&LmsV>-{jQZJUN44>V4rIj+CqQpjRW)m0hD zVm!0cr-sfRm<`#XnCq2EjS zdg)Okg0Wz-pY1RF=?L%-rUrC1B)oBxi6>{gEfo)7M1o<#7qH3Q*|=-T;ADSIe@933 zyIEkhw-}0EjJD;^=7d#F)=R%MAskouPZ4mSXn;?B=!g90|SLIg2x$F zZ?vG9!TG4&{3RzqTmiXCz^k+CQRL-077h-dr{J*TpOKN*bnnm9KJTg=%>iy%;iKZijZ5DD= zD;K@C^d^E^R8sP!V-sARPaSL4bu)IDT5Zwm{$7YnLnB`5HeW$O@!rj?X?iqE7B-i2 zFlDGENf8=~y`*86t7@1%v>2mR^YM3SOy^KI) z^gn+5a6aTGTXDK2!mp{YDlO1})-kcZ8=MJXd-hiD_&7+5!+tGE8B-^js4;B1z%$@@Pq_R`Ck|id6cgK}4T{8#?xFl6$)Du73(ib4MoH1X| zRr!j|&ic+A?j;4BKp}ut)OF(+Wl_)?;)I`Mu>~qBh3K_duYVO4X4^MY@^ih^GM5N8 zI&y~lL4kB%hzNT$hAM_IpRV0#x9^Qp&PAsdyO*To-e5}z?Nnp!FkWf_o1VCwfq)!$xH=lFYbiuJZ2{anns5aw7`)EBDgS{!Y zuPfS{fsxi~z3h~pn;={#1QGCf5R-N=wcs?WX3J8f|HVQ{wHR?V^st_Ev1ioXM+F4S z&SENr>)kuri(TT;doixoPi3W6RwcthGXRBU85fV6FG>JQGTEkCjZD5E1~)lV3!dGR0 zEa@FvDO@oqFAcN5R0!$J;%dlncV=|MukyH+h@}Ku^RF$wFP;Od=17nN)Be^4_nBen zv^=?PfOrpjLWS&1Z-danD>M$0w-I&c=nf`fbkjtM@5vc9PZ{%vj*uETMxDU93JYH_ zb|z$XW&Ph0CSmGk*6P1!P8go%khv&LxL)tMUf0@QxGSPl6p`jlD5)tZh)k88Aa-B( z_y79CzE6TU1W61m^#;>?0s~kACDXEmtn2j+o5I3{EZfsLT$RB3U&ro`J+{zyI!WFo zw__fcOht(9efFk8{DxRPvi&9HeugQo62T{8JB_c{uSwlFS=g-7HB2WgpJ6m4HY6%V4s`Fe3IZkDn;s zzt8ubi06K)WNpnD(o=3cDZYG=;;%#W+LLk@~Hx z~qSgVQLKF`G~dY_1$$*`UFZab z0DSeq$Am!r|6=E@|C)UN_)!$Ww<4f)2uO>Rk`e=z5|HkeZU&=cARyh{Al)Ffk((%; z0;9XTVK89q%+L9rzu^3GemIZEe%tQr+I>BquV-A>{kpj*lKQhn9fNwK!X)mGNZDf9 zFe%CD$w^7`h~IbPlNzvEfXBhy>)Yel_mYyB{J|uUPIygCtannut|aVnZx2NdK~Qi& zcQ1P~89R7)bC`|_(2Sv?7RSnNwuo=V?fGNiQpbA_vw%OLgneshVOPe{cuV=F0d6L7 z5VA@}L_|g;fQvipXsIn^uK9YdX?}KAW|1H?j_P9NbXfSf!}zAzaS>)LU%qoB!SQa_ zuK%4O&bz>0WqsTkfZYG)EkjT&e&=_0Yd6SA*RtW|AXr#(axR}ZU&&Rtp8v6gwdJ%`OH3{w=)>pb$R8Xi_3ofvFzaA=Li*7@;`}Dex4A3#c|4i`L8(+g* zX#m2T%bnn!>&_s}*vv>i>Zze8SENq!@}KPVd%|r8%Q*A~Pswv7uJ#4ZrbeW;v5W%o zpFZ8cS{NVa#}=9~>hZyQzufHVz}%qXQ#KpA`TeW0uS1^T(2ynSdMQUre=_-#z_tgQJ@tMxN97 zvET5(2%4Tm!ll!LqO$BX1Z&Wl3rXh56E#!FHG&QM;E9!e~XXlbmAGv~7 zVySn^%8dn%&SM^rQaXsA?W<_YS|JCg^ByZ1Nm=D*h}K`wGvcVSL4htKFN|KVkBNC~ z-{~*r0aO&;qz*@Cee7suS7vCew|m3PJn?JBW;yUMHC0CLD}J!c>2EDY|46s}EkOO( z4j(Zd1K1B^04^S$cN>LJSnQGZ&9w5`IJ^<(x7qY>tGVb1g#m>d_e-`fFO?d#94311 zXClzpniUcj&U)txipyOjBPX}mv~YCDR4dGWv6{fj?QtF6$#1PPIXL4lXFv;kWeGT4a7CdlpB z)7T;(A>Uy zZtLECyZ-RCF>-TbOF0J~=zvysJ>6oqljh}-h!7ob4fRp8t~15;=^G$xvPL2KFA$q% zDtx3#8qfnVB^aGZyeDb!gwB!Lxfc4rCsB%@*A~vuia}GAiejL(#oq24oSrV$>vo>V z-i!*V>^oHgzue z{Z@OQL__RN)zl?@*3#Ek(f*So6NiuQp;ri{z1C0uuApyk-u!n{HdGf(=PuKDkYRt7 zefZwu=^q7LXXZXPmvI;!ISKzVZF~rQT8P(dLZd@F7S=o}T%Eu^37Blgp)v=kQOT{`~$f(jI7j#j`+aX=$kswH5KaAF>x7jmdjkp{ss;lg)`78Y1y^CZ_81 zMly47=s|f(!LnEMMrAJJ_yM#?5z*$vtuR=>ptK^)>)%5hfPmACPK9nu4 zRd9JCZ*Em{7BFfXEp@)Ds5UCCZl^E17?9S9#YlCzSF2kdGF_%Q4vqoP<;2j zyhNv6UE;6=l#5o_eoIh`qvD-#+U)&28cw=@AKCF0x?lbG*4-jS# zK6YZ2R{D&>mV<-yJd~)q{D~|UY_Q{C5a>KSNyb2ofGx>(I{K}zdlan;WiP(Vd0zW(w+VRNAkCaaPmQgp096bf;aB$xn7?iKYPujH`{`hr-gtm zh}8a;veEp7vyD75mVI(;>V1p38rHmqL-Szhr%~bWss?$?wuOdSS<*v74)7zo0!Ejd za|Eg=GpsHG+kjAyhnIzvPqi7hr#g!2m~0~Q3GUt5%9@Xpx4pj?B@6KF+sJ3tuZb}- zSl38m@0<8=-gZ>pq$G}lwS7-#WgV3NCZZ(VS7WmX;bsoJUdQMfXiOpo#4D>|4pE3W1ia2=0 z5GIGj+u{%jSxSv}!2i@yTc(rd8ha-t|5Uyp51HfB8jXd`D||7AKQ{Y;2yv z8zZ`r9rc2S^}j7C21J~kZv>zM22d{_&iR7*-wC+BCDs-rdUe4_=O!kT&c8oKP96YS zJsP3*Q__JTA2zjV84nzcuMS({ix`wa%jMr+5=P-0KVyliecd+&IyTC`EY~a;0>DfK zW)aF46fv~=nOS}}XGxjBG3VzwhT0u%x)ZmgY@{PqmE1ttfk~t&*!f~#S z8Xq~td92VY`N=Bj7%-C^)CVFF@grqqWla(5(u1kI(8c2_ zAS`@E^4f^$O>A2V69*sPP2iyUv5tS9BwoTt>xx9>S}cP%@~o01U+26jZn2Rk;P4E2 z|Gp9KmXNc_#mXx9_9UvY(G3Jrg9gKt0qDD>@Ao%K7bVt@WlhNNWXZ`k`UQTdsf}fa zWhQ^GU|AIH{{6$n<#ZuXO`>T)!^&#vzC&)R#zZ;m=x;eXK7XXKtN!%#iEzzwiwioo zq@*X_bfmENnN*Y-&ZGbP)Upyv$FXeP|0U{fbIaN3lNWNpnlGKTY3tSIrVEAocmYc~ ziMU4gNf&>!Y*Kb6o4x9qW!N`eE^P(<8`ooKY_PRB%;$$vRDl?>+#G*kuwOYBYW&*7 zbm>CPo>D0(VQbo{tf)6vUF(#KheyJ8JvYffXM}CZ$pjFll827;Yvbd1{WYhjfT&ELlx=aum;D1i4L+3SbI<6eBLAC$`6s&s9AAx^FWpWrOuG!W zbLsp;Ws!&a$v}27_N&Y&YY`Q{_MjFVRib>je}I<>;=!lq!oY=1QmSGh3l8l4aC2of+D!)i7Y*}A^Kfz9jph|dJUyIiN=2nj$IgM0wokLQ-##h%j+JF* zMh?c#_Cm`c9|#)=`IYlt{7}9l|O$L_dDr|vG*jxdRL;) zc&~D?L`KL|ATlgT$WbjPkAKsht1Y80YsmTpbk;XGI@&kHq~YXFD~=8!w$_BbNlVHS zGn=c2s_@$055h#PJ~J!}=P4VvYIN4FEVP|(Z8r2lvEkDgcDx*5<$0s6rrz%7#{aG( zKCy|LF(L`^rS$p-b;{OCevAfTyg8+xce|9x>ByD#pXA1; ze+E}7^xx@rs=O#FD%#lGY^aaSRm>4}ZI)3S>DMnR@@}ehc6VQHGM7YY8yE~ujm))2 z=&kpZ>{3&oZ=fiuA$I;J3W0yhZl_YGl2(OCFuWbZoUpV*I5W~Ryyeg;WQEBn^X`=;Jc{ndK~^L zd|)+A#N9vLnZG(#C;qVTVL=I?xMZw~t-x%}n(NKejTeyWTyq=M(jXJlt*(Ml`e*p- zJ1tp+2RE^qb!OZ7=PG%(o9gu6Deh>!Qx})Q5?@bDMPB9PtM*i_F!M?VbY=nyu06;( z>~y^v+jPc0lWmm{ZhfKqc)x$K=__a-fcu=(p8<9f{Ty&b_&Rm*dLr&3noHlx?&wkB zM6WYG(|eaq({*L@-qGdO?G2?Xo#XOhv`x(A^`mwP|J4oaM#v9nN*QFy?@kt$E8Z?V z8t4{Hc)6#6FRLQIDgF11;He=dX3yN(QkIPhd^8xV4L`a4?7;Wr$ySw%OyTg>=5`Y9 zg9x7M>wRMOearI_HuOu8mWn5di6j%UbsAqu>s>*GYmtk0IuHMW2ptj4%1sSHXF$7`X3b{t7ra*LmHvXa~?l+tN1aYxoL@sdw&yLOA4(@Fa5jC zPly>90?wN9^8+D})Nf4+=gZmDBe*#w%6UJEG!Y_yrh73h?ACo8G)6{r+kwgk&{|Kh z$Mi6I=|E(nKLAZcczX$D<@z@B>1(4y#Zu3I$a2 z8UP+wY$n3cx6Da-B%znb_q(VjT!YkShsU2|#iaM8nVFft<1ea+x0kcNn1WV*RZ}s7 zDZ-BaR_vf0ZFD!ViYVxW1LRF*G2FTof zPP@J)b53QXy8a)$f>Nr$DfH}RH|?1_|9L2PmMgxadFjE<`U$c#0bqYGT;?fv^f9L5 zuY20|hP{$|3OglanErU7EHJPjD7!IP6O6kk|Hr4rctM%)9sGn>dzBavdDP6p%GyT} z-X-2&zPs^WQ@Y-^KEbwIapZr8yH`5hnaI2u$k*Y8x)@p-tZv(taX_0Inq9nDb*2jO#-IK@!>GK0p02LfsyMsqXSPDJfzr>2nFUlsTHn}sWfzw8 z`=%FPim9~?-QL0|w341PYJDzMK8&EOdZ@hx7ZBt&sMm0>EPI_L$P?*Xf}!R3ZeyX~ z->w6c6DgjKO$y1F8FQg@&BxS+Wa)ZL}rG@&vc6`k$_ut&@xzZf0i@I~qZ}rrsMl zDv9W2C?D#Jx49?3%-L0uzPKk%+@Pa%dY4p;}lmenpmCmC7Cfan^oq z(}8tS$Be6EhJUS$8nt}d-^en0)LlN+ejk44y?^(0n zY{bQvGxs)%RJ%6{Ry~*DAGW7g-r8~Pj^C4`>E^M}sd&vPdSwGQMV@!#8X`>;bQdc}@s2H@sdo0)TV&<+Kel1>+Nw5o4NJ z?@E@hwzo%)^+eq*OcWdN3-&{vzS4GDUR#i*rlmcVhwLC~DN#2QrN0=KMg9b7u(Fqa zp%VTxdaUH++A2?*@lwK)8=w2tZjAs zyOY!aE3a<&?u-j_pH(UR)2CV^4jMZS2_Dm~zfTN=kA3#GUeM9;g9l!kFkrB$I{P4d zWyQo^2RPFATC|*lgHzDvtLAAU4#KeSoxb9bLCZwX_`+NwmhET7Y*6!@B)9;AJ z=s;46MAMS9hzP}WxX<<&9cMU{$nns)&G^U2+aEfm4?0Bg{0W?vJfB_Z1D+R@tW8lh~`xO?}G*gE)%^fn3voqMu>tix5}-*}51gEhU32Y#iXwW$h@V3u`;NLQfX4+ZA zey+$~XrF9*KP*rYygPU$-tsersx}*bvUA-Z!`tuf20a(8V|W$pKd`*r zM0KWL7s+JB(l4AaoI(o04LZ=M&FKB@8AzV_{0|1W7;#n}N4rZUPL~D<6j}PX^vdNJ z2DlzNK)|m$aeMo>sj>0GsNRA8$^irdVNt;zgJHOWhsM1$94}Mayd{%YRCMjHM^$P& zyjr?Jbx;d@n~0AGT<2DXWmSgB7lx+QWEaJtc-$6!-O%1ERHrwCX+SCbm{k#jPeK2k zmtpamoJ?lW*qDzDg4&x(L4N%NPOe>)n+Y@Lw7LDL_Q8%F7-#}}R7bjnEsKMBSFh#V zKaJkli>~MvcvfC1-u3tQD`A$4-0dOHfy4}=W7FlOiS>!GHONM4QsM(Kg)f+!%iE2J zY&F(0t2fy5PwT{rHmYL%~zamYfz)z|?rPUro2k z4R}Y=!+27*+zH?eNB<4>t2B}GJuI-@yniZ2oO5;NI|?xH_wP(3yj==-GeByssbZpI zkaP#s{L=pCTR)bF-`H}yJdwxk87?guYu`QNisf^_%ZELP>vFZMcNvwpBh}A51Ghb; zxZGe>2KwL!pI(HRcv;ka+4yH1%P#$*Jj1q+joEbx_>ZsM zNR0;{WeA=3Xm|GR!9S&&(buewHohKGAansEQGppLogB{%%}Z@{)H)AhlW{SQog-TmXQjP6 z-5Vtv9M}mlyYmyNhgO<+Y6stoMWuF?Mn^o&Eh4o*-LGno)Y|6j$v%oBsDyeT$_F1-CGlbe;G;mPL672!Ly%)J`fS< z7b&!jjgOlfk$jcT4RwzGCnr2=ax&D8wZ# zAZ#RC)MMr6gT<_L8bx_|S?O*G@GAWHdJ{`k`ZRXZ21aa2A|TaKqc9Pb7XkM-=G*T< z8^3Z#I@)v%GHuH$Dad}VktPPg!o+>Hz^gsMh_&6NMD=mei>yYgRm8}lepxvOJ9{aZ zkf>Nzd5~R@+kA6M%A!s2|3K0Ab%5K^Sgs1g-9fft=@U*i!eharxZswE{GuWYi!beMS7E`{$9K}`wN+Bx*_jI!*m?~4{oEuNz zbd|gmp`a!5REXnpe{@+T7vAD_MLlNwqZLI;J@0vUrY)p|e|hlL-qOxORZdSn|HrqK z^h6rcv<)=d-^*_Mqepl}VMqRAIv~;T_8(ok|IUUV`#IX{B#(^Cd>)p;o28KU4~~`E zy6|+Eh8oafb^N9^^9)pvRRDR8UDFrua$yg2j#?gLVl6aZyg0<>qigabw9wBOM~$^Z z?;6vzGG$}%#Rh7>F4*@y1S(inSy@q#o|yR}E&Wb(Wj@#%7AKB&S;KuEDF%HHNX;}b zm=s)Ld9_szcV&=-7j#W=aFnYoibrV1X@-X43jzK|Nfe~%-D z#q2|qfQN^(%)Bo)Ha4m<_1eMbxz>_Ci9tbkdxDB`u{1uIC1$Mpm-X#jTs(6pY${P2 zrfc&&nyhSl^@sDxzq%P&pmw#QjHz_l{oQ2x2cN_R*{{)axjVl;!c7@~f#$>gON)x? zb-7qsyKgS{XXo^YosZ^!QRVDBpc-oA8ey)VGo5=pf{WY_exJem0OyCoGuWy!Ok%uU zcSNG>I^$^RyZTw|1DtPVA~|ao%3T@CJOBD26&x;flxBp0DiHdPZIITluNo)`JRDV4 zibodHQ~Y$TbSWF{Mjnuud`fDGtte0`C8hx2ygCQ~iHoDt)>b>T!1V zg}9qEbgwXKJL*F%?X57ckU*J6tcbkbn*j}3F-aI`CG2<+@w~Qd)XDftg*%I1%}6Ul zjTBL7z|M>i6YLtC8;@4Y`47e&da*B?#m~OLdk$5>n%TTCYn`F2qOw;iL*AI*x!KO} z-Sx-kCcCq^`&5FixOB5HarT8;$3d&;z0UCk3th~SWYxZ)3fM8!YV&+>}6z;xtDSk^M#8#cT zV(V{@Ncl&eq|nO(B?jSUvASvZ34Y5E)kH1Re)W)k{ab#Th2DG;?MFC4 z&H>1U`UrHph@#iMCzei9l@3(sB{>%c4BrQYSd!k>n!uAZU;($Nznf1`9+v|#*dHu+ z5Ue!BC-si%3)L-m?7zB#6Vbo7n(czQ4~{S_1#Gkk%`r*zy3zg3bsSM zLJ}_ZM|o0B$`a0f5I_o1_{WVxe>&+;;yw7rmo5Ttuyl==Mp16njcaN?gvu^1_?~q7oOU?B&4cUj1~7gtmXIHgZq`Z~#tE?Q_R1_7G}p$u_ZO__e2tgL!+a)af* zy~CVVO$|VaGT=1!yS8SZZdR7rd0nb$;r~!{$_6?et?r_YkS9chS7%@oDdE43A+-H_ z6`+bY1Br=V+K*J3N;P!KfyYWz`lkav$g{<79F+rT7jnz)cer#wi8E1`P19}yTuVXM zO;`r!)nu~I`Nh4euI|jhT(+p1g8F#AR>QXc10|ZtQao95@{OvY7-n-47=GA0yN6nq zGTGfYZ)`q(5V|~!wE_utC}>QK>*8_cbJ<;u;Fc=q>S$?+_@90APAbSXwV&oSX#hb$ zzQ6Ntd9D2zN7eQ@-gAG=apJIo6MG03r)`&oNy=uJ6) zSpUE7_``3%Y-Cc%aLIifl20~!Yl9x9MmIJ_CYohz9n9sYWJHYB{tVYsgi<&IdO5kc z3}L$~Idb$Lmp@%|X=uw@jSbZS^NbblQB0yIyPJhswu^tVG6lt9_M1A#1{|Hn*w05^ z;E|!2ij-1Fs)o9ed0sM zNdl{A@7oJ?g`YYHY1VN($HxmWR`*c;+v%qt7_ugyRnc~=GCz}08c}@$cbNpx*9|fx^8QfK> zI|iZ_L{xQj_K%5`e2$7fN_Y}=!QkXao|i}cggN@crC@CXDaYPOTNCk-uJ*QFkdH=^ z>?NfVZ7R*ic##^|EObJQ5=+dwf2pcCeAYkBYp4elvrNyV`9U!Msbvr8MU%cJbh;AWUP0UG;2t!_WI5>b4iLNG& zivt>ohGgot7b#4QY0kHRMAZU4RjP#FRT$VIht#LFGUh|F*vGP#GBs9e0t_M~z^J3$ zK~HI@&zXtiVYvUr!R{kG@0MZ=?dja6v)`{AXL#k6vg5(3>cNSzx{|tWMWxrWL_Ez# zz1Pj#&NM^2oR_l#S5tLOSeCu9DMh?W<6yo$seOv`{4KtIM%~!L!h#0-h{zR#sr4eP z37pnXYK^+Np4dX6n7z8sE&**~^LkKdgVSgK;Q96ev)@7 zK6~F_zeI<3SB>7-;rI6JD%azYLjygi^GkAa($TMP_2=~fFdtRrR9A+XzkOe~y7E1S zv)m4ZBU;PI&)K-|mUY+MISmFMry)IQ#TPf%j2)HS@q_b=UQ0SIyu!n4=|7)J+V^qW z#L0N5rL0}zdYg(Bx%385Zvww?nW99ayKS$~K^u*wOi16(`_3p9^&kg9YFk?)x?z8S z=tzcWV$RdUO?$JOX@-0WpacZcP!AC(v^s2r*1dJang#RGndYv^@fz+A=#b&>6%yd1dgrJoPp%t_mOJ^4gCM&r%u_C{d0MOj2=JXAI`}$z zugAeTAlJi&UA_gema%)2Jez-;>D5_cjdl>{^)d6b$XxPWyYe=ZSv?h#(%0RPj>$q- z11Cvuy(uk%dY<3tiLAcxB2%M9lmFF>(GEz`|UR5^J z#aA7!Eq))>1Qmh@*fC$ew{j>G1~(>E7u!z1Ah_17uSvaW7!-T9zej>OMD*PBhg3^S zF{2PEul6hM4nJ+Ko||qp-&Z>f0Rc#+5;uEm+Pw6$Q^n5~Zl6p|O`%AL9PbkQ{p8e0 zQ1=@az9c@XXM}>A*guk)MMVO%EGmAfFX(DB>F~c(V#5uMBt(F%eOXKPtc8~;5)RR39k|C>vj0Yt}fzZN#)EF zcy_konTDz9D&>d?`hsKUcQL7@{$jVQj-gT1kp(kzp-Rqs$`|x4=9F>Ibh3mT;C{QI zu{GGZ_Be*dIam1s4uZz!oxXoi;}df2HZ``S@{)puLRVU|yHl|^aa}I$j4hV6j}pMh zk*3X`7w{(@!lENoBiFGh&E?iJNwd(VsFMEAio?c`;U9X$GKE4n zsj=o(HA6!KPL}rabV)g#Ux#wV{qFaSM7NBh9egEyS8EHZt`D}x;sPbB#E5nHci;LW zGk^d7y*dJ5VTnYJrkt}uAq{6|zRQ*?no9hSgSP-Z!}@fzdCjiF?Xo>G!X%H{wv=Ap zsAxORz_do+g@l9zQOc8D1DjTHeN^R&Rc>-2gLnu&gK9*pb>tV7}+So zPJy%IpNd^OUszuhEeRcoppffn%7^;V3`Z=y?7lw7`nDY9)KNmcUF2-o0{ENFgK59!=L*cnJsys)|xw{@}To>uN=0esO@$z2MdO^XE^vxdAt!)*76k zl(3=B=7OEi<9dkj@*phJlg9HDsliP+iFNj=?lPLiJRX||V|?S|=TmfiPQvPc>hsjH zR!J$GMh8Z0XWQRV=WOWp+i%4RR#o0Io>-@?5@08Brx(I_dOgGBPvYt6Yyv4Obbu1u zTbob_2aSb_fz0ukFo==D(M#BGz^5-{pVNKqr7Otd! zR+bZjORC@fWUw1^TuYToJ12OWIz*-1$jx2O*1y}TzehakC?x#OuntW|P0l@$h)Rbz zK+nlM*3SNHAD0X4x*jmWmsoIAr~bFhds};^vt7Bj$1`ISh*=^!@%vS@oPpSW!*<+F z$En}_*=eeyy`Z2V#A)eLtnu~4={;EP?CeaZO8;VQbDcP^y`$X->SV&p&Q5u)1$-r;2!$R=2FnVnUq>^@P3_^^x^{Rf(T=t-AhaJ&U^i+a^17D ze@hkJRYbP;I1HNzV}@S@sH-Q65AuV)s!&7;x(%$|su;7BmdHqVD;xbh-L94FXoVyt zq*}eDij}hJqlHNL99bEDQup`&_(^?WQmp34_#ico#!kjF^!r5GG2MG_K~`?S8#ezz zf281psBRh&u-@OR_^N|!MJRp8?S+=Uf&x5N$d@4{KK*TdfVzVIassB~;x;}vft)hW z4O=%D?pY>QRuLy%lf6XZ9N5wMmbr(rlNrb^BU1Wu3C*WRi&d(xk`2X(xEe@_Duf1_ zyVsO~;&r8>7%f|pyjuZ#=)gDAUo?y@@z z(HQ+RJYDHA&yh$!y{+@_czV`J77;ZSx%06WZmXV43ap7ZzTgJ=WTZaBX(Es6ZgoM& zMn;~Enfp3AWO2Ukv$rYx*N{J%$%==E2X!KEvXJz?QT=6|m;VR9!oEyVL7}3&9JzNm z(<*rD#L617e3~);(=@n5IqOGxd45rqfZc^E?fe!O1t(LxF7(^}^pRnkkD`u_oSxq7 z@Z@?=lh`NpI1bJvUhDYuGc5Jn?q)E;{}=(lSM+UN)+^VEThS_CoGcv5%Ja2h4{dDA zsCV}9!$RS=*D2Y3W_6hm-o4q66_uqERpqw0e_Bg=LWjAB!)vY*F-$&>;?jV9)6xNZ zKaLp@w_(@cS(w07W8N8`RZ{QH@jN>nxM($&Vg3w#fVfvO6?fILu?oDL%_V9FJ{YrfYkyBY|%RyApv=R3Tj!9w{6Lqhi49}{8LXx69h13qK9 zzSk)Ejq`1#a2$@h$nkS@D61_g==%EBY{{iSv1m(awq^9o-ZVA|Tw+cxv6PIe-D&RX z&Akuy@g!^C!qcPdpMaK)3Nmsrg^v9WdjHR#Qz6ElK8d<{ew~yZ*!`yQNF>C|(M(h4 zggimPh^xG&CbhVwF5x2`DKmOY>5Bu`tkE%RWZdJ=)fN-@_-CN{QS?J5^YN$gi79)4QKrcxtT-bxfxmhv_ibOr>ybd2>&+#9z$l(Q(j#5@C zM>{(fX70-c-d8MKk*$r2p1IuVd|egte-iBy-E7tao}PhbMOxwjQ8^IBd4p9WnS_oeA8Jm^kj5j)sEl;_$rm z6|xf^ZQcoW(%?#{OGsF4gEH{(^OuuOjE}pyyDR4a?k)$RDAzQ{+4@R7*Fo8m_dE|i zI0j>x+WqFN!JIW0`dt51mb>l}`8-!*QVX%}z?21f5{gHUK zANqPA5Nk#HXl4k&l?fn_YwfZt0b!J%$9~@-zgQblHWIl`d1J=AnDe%M`Q!m0{MSy| z#|}NNsf@}49waM=Mu!pn7-G4}rAJK-rS!Mm?dFO25B?|0eU!0&prZV>jx(;-*-?UF zdw?pIT9>0Av--DJ-Ku0f#l;CyRM--yVPrC6y?=(e*U<_Aj2mg5Uc??q={@GdiYCX2ZGQ%_rn>uUK^CF>ox0-VwjV=P2eH*N>klAx z4Sjt>NM94OXjL_L>+)v$IQ(aLS*_$Jo#DK3s2IB6`au-9?e&jFc%?t- za|Gn-THU(Dm^Hclv)0jN*sl}=BA~(Lay7r$+yyr2cl0O^TNJ`d`U0dI^S4e+n_uJ^lpu4GvR% zOF0IopGd#x<0V+y^KO6X(_=Km%RRNw!Nn>KdyqJ*XUZ=xD z%@p#(EMfm6+W53QmAfb}i!zh2`^){^hNRYb@6S;KqxKz~9@%pNH%RmZt=OD!7GD9e zNLSJ~MV=;QoFB3pnii7Gbw6!DDE+#wLQO2?H&}69-(0qR>}ajlhn88Z>Zq8EHs_CZ zqI<;`yf3uggy5*4Z!ZpQZEQZY8@Kx1w|PEbWXz|X1}^_Bzo?BT1y8q1F}Pnets5nKcqw^^b`r z%u1&bwzs1>6I-bN6OZ9uYG41`V(+>5`*)#ZR-IflHwUo%m4E16f8UVZ5+WM1ryf!B znW-MrMGp7O+uyOFTY@Ct!b^FVHMF$%=Ejy@BZ>0(zsjY5ngR6<6Mpb9n2jen zKK^}+byGdb?OJq2fXd^&c~f*-lDT(^FYc3&ohjp3bg5nC!w+PSs9j(rvc;uO@98o! zQXDOv77&QCB5xQTMt-!M}$(Hp1!)3f*6_4?wOOF;g#Rz-v7*VZ6VY%&W8N z+n|bQM~1G6xWD08tch`I6#8Uy4JkyPN!u&rKKdUp@bIcA@ADkEzRWlMWN97Mz}#L; zipk4Iyg;}8+cxpN%+0311_;1^{DQT#)aBE=-zT8kNHE;)9l(dMIyp*1_g9=^o`>yq z7Tr&qH`MnZ;S4Cnzu1-myaA(cE;lwe;eJ>r>gz0j{s{97b#v+4;e&t0VEFIh;_ve2 zKFGb2S`+rS@r#pHD?nkqv4pg=Wte$zW8=l581c~}`1QE^0~}4hN3xvX0~Q)?q-7$E z|1g*Gj`k1J0h*!5>#plzVw1I{?EgDZSo=HWv|J*?0H}TQrmwe)RrQub!>IXQ_0y-d zv$0_#(MC=6J9adD2`)V|a$FVr(D0ezg(Qi4R4 zjy_g$Pr)MZ?vTrb%X7E^j{7bKBes#yCd~deGa&=KpOBVaH8fmkPbW6R!O4M`nAQ_= z-KaXnrFz!WEv7;pgt}z68_fUL1|B9f#7IK)-#d8^+-|_V6Q>&5m?XA6p%*@oJBwDiT%Ycb(J)t^D&<@LsObh6a%9o2%DO!nk8X3-RkX>3*)fOj&^?{&v8XB>A5$irl;m| zT&HM(fkh&+ii)~2(Do^0o7+_jr+{=YxWNLwbVO9$OLXYEe2GG{XB&(7A4>pD0M@sA zB3<*pfB!~RdWPH)Q98>ou~s$7-7Dqq@B9@#ZQH(^Y>UnAQ2Rg3Cw-(uwdc0?W^`9e zeY?^#$9A^84l7*ezL8C}0q3XlfekX%yVJ*F%X5&3>f+s;_5BDAY+zt`7@#h<)#5e{ z9_jjs4K?jfN312%-E6t7H#U2Huz#G0HIj%im>#xBj&pTY=vcr5YdPe4FEHKrL~-6n zlz+!yvoXvE{DMlsK0ds6GlUp#{kCmGS_1+Ce&)1^tZ6ZDFk`j&J+aKUgN4Xj= zRDjuk4w&8f5x_ju-t?Wf^szam(Idn9SMHxIvJU4)g!T?&y0c>G;CCNR)F1qcwE_`5 zoFVplBl$)lo&PxC0fPjVC&5eEtcYE0Z6&!lOUdJM`yW6caC`g8sz-ocPx}7u3D6ce z2r!aMTO7aJRLo0-5Gke((+XuvI6GxT(@KutrsUPeVeY&Kd5lDc0pH7=|Lv5E{58}3 zui5;^cK`q5%2veC&^Zy z`GoZ5?}-14x~~k1tLfIABqRh2Bm~zW!QBD`CWHV10t9yp?(Q%o5ZoPtySqCCcZcAv zgU?_C19#{B>YVf5Kez6$TXm;)4MXi!-K*)<&$Ax(>ggKHh=g*Fh!n4_!?0i*%1oTu zh4%aBfaiu<9~E>UZTias{{@i&g3mOR<>jejci!1g^dbp-Aa|pq12Qs0*VjCT7iC;t zy=-(8WZvmX{cw|=*- zt{+MThDx47NE$2`gC0utQ0D{|G~*Novhk0F?WlonnFQw^y5@v&<0a0>_9P>nlmm{= zfkv-aGs8@gduVbGvRn769~I2=^n8v6w6gk+^>`!M2VC|#J+uFvP&US1<1wFFs`@qD)I4G-{mE(H6QJGYo zm&k2S&%~6SQ!?F9xxeK0AZUl6jQSDVsdu>0Y_wI7>4XJ0GBk8_thEBRI8-2a-xO^cZO#=HzzlX>LyH%^7-4CMzbMvC#TwzRfzR+i}Zhz0bDk7i6f_QqOj)wZMT@DW4Z^wCmP)>Mi&S+kZpdKmK#t-=g$t(U1G758mj7>tq zt^R(2BN5-v1JL4A^GD{@?kW2}0fS)>EeLe_$x20cXw=b^KLo>Bgto3 z3KV$!T|*C^GNP=Fvi4~4pQ@4~^uM(xUwNE$TGtLvxGdHxgsm17^TFp{wYvz~XTFt? zNqGDY{m6Ac~{QMe4=5@w9zNAeDX678`ocy$A{9^lCiC;EKMGTyrg#031?1&f| zeLPbQ$(fNVJus6ovuJlG4%=c>M=;MTg79CM+;Qj0~8# zj2?OrNQuZ|s`txVE_Uvp0+ru;5T~1(FmdBd`Ka>tX9^E-aWS~0XA;uNBY@uMP&PC) zs#Ih4f8Nk~x$JdB<=eUUZL!J)dU@gKn43!@nw?$N*zD&0Ld^rQmo|?=3W&|6 z2F0D=2Cr~86r%@%bU%u6R#pE>PFzUj4VMbc=QTsa#A48^v>YBLQf6Ubx#%b@#(ZWl z8W|NL9%{AFp(Z9TucI>B0`XPeeCtwMJvKVh3Wv)p6X1eC=J|b)70hSZs!(UL?chbFXpyPO9?M-vVja!>*RJYjW>fC|PXrw6Y`%#|Te|CS`;(-}>3X4mmXe-Q zQa&=Y;>*&Mv(KG&yKlMu8X5PtFr&!OkmXIMVI?~M(?~sYBKpFasD!wLZUWNWL zW3=e^f(4C^u+ra_p@1k^?d=`Xy%l;{40lAoq0XRJ&I`YaL6YgD-E1#Rpj}@5}3<2#Ro4 zEo-HGHG*J4oix65u(YIHv982ep;ezXi$+|H`7voW!@k+vGC9Kg#pkhMOQluQZx3(o z)1R<{+uA)k(Yx9$=AG8Jim`26hBaqDq$@@r?S|h%Jmp43wJ;l88$DWK5uqV5@zI=x zs@@+=B#Om*>@ON_THSZ97&%$rg4;8~<5et}k|8ga4ewJE05o&{p!ZMM)fUc=?2bJa z^&RNggW8A`Nl9TriA@U&Ig*BfphMI;P~KlKY|+IG)bJXayftDc6v=!Of_*YHGDe+% zPekFeIJ5~(9~Y{|kFDtifa58ui}!im+(p})S6hzR4w(LEWNSjz}ozxTuD z;w{ChxWFaxR4dZiM*XWYLE+yy@hwn~hdw_!aP`Q)wn%RVfB}Bf!g+4-Yg{ zPywBlvi-fE2|84CwpqHrz9o*QBs?gnxEkB2_E-4C@n+7 zqvSKCe@_n<^Y!1kAo09DW1$j`zeS^vTYb1Qu2eg(stUG0H!3<9lA~BX^+edb(O+au z#R>@`UmYqeS%muUP9;!)BZubgw(rvaB%-z6qMgrg)lAdg*7eZhrCta>+_jyLAM=g` zv%Wz|NKUBV*;}!Bh`!m{-u1dWyOzRX?T1_0DFil^u+#j}#1**RX`06vPGLD;A@6KGIxlght$Rz}?h>-6{n_<` zU(Yh4O-QpgE-K#M>&Rnk6s!FEmDv-nz`BA;Z<~QH2eY_ag5<3(Fc(K9ZI)CsBr1=U zUP@Zh%~tJ6Tz&*wlW>i-p|P3e$5EnGLU36^j6sMBdX;@yxz~%;#`TLcFDdt?qUcvv zcHOpEu(wb^kj^^ zJ?FgD$J(&iZDqsrDhvQ%OlWqcK63`K8>RXedHcNTYNyHVHYDPi3dNR-Ky+FMNXMiC z_!VDVz{teHB>7BX#%bOvJUY1k4ehCxo`z>#a9vAu6Z3qmvW&!!0Ye%wm>NK=UxhBO zNf+ou)e5e_e=9-S%r_$YNI^Ze5e+Jz|`hKE>nh% z8gjZ3?ueMw0FwPVtgz5`5a^&H_=kUbR@1@3ISY4AP~|{ink*I^y1lji%=5wi^1gJ+ zrJRq8XKv0oAhEnrNJ(BvgWb3)NZ$)BuluAR5UD!ahK6{JM^Q|thDi+2AIjhA-;BZj zfqrfd^V1tuTNT;xmXgCo8(nk^j3Z*cH}@76vo!Ch?tlbFlM7bfE($w`9nqtS*ULOa zG|}UU^~laTkFB;}pxq_@O3KVG>vRZ{TSags4Fg=u$H{KUPAGML4)YI3zr))gf%CUh z>Pl7Z)%>ZK33$2ej#G|Wa{@o#3>bR@&c?+J>@am#!S|?eYMkuz=^q`r@O)4amvZmg zB0^{^U_KL-mxX+}S}F1I85&D_f9fWQ6)I4B^sYtPWy7i6`2`yoa!q(g{gxpL0E8X4 z`yXU-N@h#K)Q1MnUn*)+lps2+z60aqs`ULPe$QxdQlaWk{RTLaN*=3tNy`8kzl)|3Ga5`DEI1hK3&^crI653=oJmC@=y^dhTGGU$(_xpo}Y> zEr2MyZ`*XgjEiEN9lEVd=Zgx96_?O9P)NTwD&4YnzKpqjL8*g%Jk2A-1RJcT8(XK93$YRtFOIw6_VW$5KlH1+FHXqM=~rKAkAFKSRWkVGO^N5 zj*DS&eFV&8I-*S>T2+nT4S#}7M^>fIS4Ns&y|FYuqT$vf;$S(w=iBzy&gcHYZGtUn z_M}g`x2+hear?#>!49lNy_XnV;nV^;~L`rQ^#dE2k(V6BjAnA1l~w{KyFD=+^zX5f9T zBaf9V$<#OXUd$RN;efm0L5ARsLPmyMBjX%nL(}3y*n@L>7S%b%d2({%OL=*PIs8&q zu*WOXvjBlgx9lwDM=07@GUBHZEq9*6u+I!;?B9Hnyd@N3;}W7{zqOk$RH`xZ`Lu90 zpR~l*{H!T4v{n&*iN~VQe|=2Sg`;NwB|a^vsHyDnOG0G@gL?9?hZr3-HTSP^k@2yq z3ECM&EEG3FNy=a8iz#W#nNvw)dIkv`(LkV${h)Mg-_C~PGkBAPe7W-^z;IH7XCG4z zw~UM~cxr(~V|V-~=@9bfT~!!krh&sE(^%Twb8IH4ebb*>=DHMP-nk`hZ+`;8H|MX3 z2x4LqEL2t#1A|{pD=S$gtF?GOh@U?G)YF%1f=q91{vN!sxCs*GmPY>^`24w)%V#FF zKYCf;vJ3WBkB^T(d=l$XQBpd@N0Fz=eagTPr9q6pqV8YM+WMSv@XFzSm&|16xYgzO za8V!PkR3=Fh*oUTs!!Xaoc>Z!usPHJvUxm%rA&hV&-`|iu3i=S5;~FouAFH)dUxqQ(Pm63@l z{n<62^YqYMv#g$DWYqqK-KCXsli^V&;a2z37EW+4x2x|lvlcWps~{3b1SeEALWaJC zRr=F)-_JD~v?vO@NpXwc@ZOpV0mcPa1|Essu;lK(uG_b#qEAby?k()^=C+c@$oGrQ znNvAq0-z5t$0wkURqVf_`Z^}IdEgADkOkQ92l6!7M`?c5m1}pgk1|W}$2StmZQ*8GWMpN?9#MLE)>8!q=55(#c?& zZ9f6Yvxz6!(VlolH9jf$m_JcKd*6jWi5c$h&TFWR){<%NjxQkvsc_r7y{zD2+R*K< zg;`&UUqgnnSNjE!-cEzwKR@S`hgGXrA@xW z&68D}UU_!#AR;qEB{+N#3!_h#aLy$ox2)}Fps6LN7Yb=<)jD|;5WQ#^&pk&Fm$WQ# zZV!klx{`!Z=^K^m1&?axnhO;A*o?#i)DzDG(xRdw0ehIax>)0{7N3%wSWg187tWV~ zKd+}tG&%?AC{|vgOtebFFk~vqN&;0Ri#PDLcDBoT`bewK6*R=$XtDjOWr^KbIAn^; z-g}m`v9k2D7Sd;P?V?U{}G+*5kD?Y-ye$q`nodo2S)O@Xp+u`jX5ZP;f z{Q@!3kP6LxqE{$(t7Erware9>#td$gLmv=(PQ9OB*hgF2+kI3Jv6KH||Lw`mG{pPn zaMQzwGS+bWSLyfAoY#H6WN9?M2P5!Xj?0}f7m52)u|0yS*EVfpk#krRMXN@k#lXO*8iK@qxyW$i)(0b zC`lrl&U;92c$&YXqoJtCJo$FNBe7s(a`N!51r~AK8gZBNM_D}29Zy5$`5A1C@S7-3 z_d1E{rFJV$(rIo(4NZBZP7)s7i*~dZTY4tx23)@m<0mB~+Do!Lml<}iqSnP|X_NTp zk0VZ2J;l;V$~s@qY;^WPpFcn4`tKeqOQ&u^4bbt^LD}B{c(vc@mh_2ZTh3y&1@}&t= zKBuCkwt{o!)85ug&~+!o$4!{lOxq-#eB95}Cz33zGnEB_Oxf6D$pO*D-kJuF3*S&| zCoZ<&ob{t~I%0l9%NQRU_4W-FBlVksKWwy&c~heN*A8&R)aV7*7i3!QvS^U-6O9X{ zv`6wUd5a0gYRLqbO0Eo{nVsp`;Cz~LVYk?*w1i}jo=@(4II~zhwf$_Y0uQGvQ`jeI zDlQL(K(y)z>jzhryl>?1bN=#0NM`GCEY~cB-@ zkI_?lAFUg8TDONS?kLUpY!P7@nPMlpgq&Hr`M|EraKxx|PRGjj^{hL1W$KjM~>c{9^5&U%Xde?MA`uLcJxRy_huVP^O>Q^zZ+Y&cLR4lp$4I?pSt+o14 zwi{Z%ZRI%Sn&81`pL2M_9b2dR)?t<*Cb#gOrt#z2ngX9MF%PBhjyL(lO{;1OsJMP; z$m^&pEBEv)?qN(%W(8+?A~xjt&9Ee7lN5Oq^_B5NMpz5?yU{@)8TY%iHu6@#%ZOWP z-|YQXPwyF1M4_+049R<~PhSHg5>)H+&tLT248K%EdpUuG#lsb5);71dH@A7Frul31 z)aiauI0SKiA!c_ypmZ00ucbx2j8{M6NNjH2`HjrAp@DBqn>+78FX*7TJ-B6KwlSn9 z3BNGEFHr1L{fK5!d6CHacJAppvBklmR)toBvkZMp%i=B@iH*<~6{%k#F(DBNliC`_ zlV2A{9Ps6f=uq?7+6?*JCUKIFCpq71Ev1mAyvq6}I#TM4toKPdcnz#mBFpIw@6w3g zlr;(q;uS(s?@d$?$a`EZf*{npd2c+RLzHA?|9G_GR(dfeEKH_HDcCoLWst9RUl;)X zqowEd77wSX$7>hT5qDl!W4c)r+Gi0<`}_4EmkJt`3>p;4 zege9~!;h%eeLtFJS{^T#bdg^Sn0a%QNMZl?vk$U=Z=4-p|M%Y8|0lOjrN1;dJZ1rO z;{*HBKH$C0KSy