├── .github └── workflows │ ├── add_identifiers.yml │ ├── build_LoopFollow.yml │ ├── create_certs.yml │ └── validate_secrets.yml ├── .gitignore ├── BuildDetails.plist ├── Config.xcconfig ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── LoopFollow.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcuserdata │ └── jon.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── LoopFollow.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ ├── IDEWorkspaceChecks.plist │ ├── swiftpm │ │ └── Package.resolved │ └── xcschemes │ │ └── LoopFollow.xcscheme └── xcuserdata │ └── jon.xcuserdatad │ ├── UserInterfaceState.xcuserstate │ └── xcdebugger │ └── Breakpoints_v2.xcbkptlist ├── LoopFollow ├── Application │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ └── SceneDelegate.swift ├── BackgroundRefresh │ ├── BT │ │ ├── BLEDevice.swift │ │ ├── BLEDeviceSelectionView.swift │ │ ├── BLEManager.swift │ │ ├── BluetoothDevice.swift │ │ ├── BluetoothDeviceDelegate.swift │ │ ├── Devices │ │ │ ├── DexcomHeartbeatBluetoothDevice.swift │ │ │ ├── OmnipodDashHeartbeatBluetoothTransmitter.swift │ │ │ └── RileyLinkHeartbeatBluetoothDevice.swift │ │ └── DexcomG7HeartBeat.swift │ ├── BackgroundRefreshSettingsView.swift │ ├── BackgroundRefreshSettingsViewModel.swift │ └── BackgroundRefreshType.swift ├── Contact │ ├── ContactColorOption.swift │ ├── ContactImageUpdater.swift │ ├── ContactIncludeOption.swift │ ├── ContactType.swift │ └── Settings │ │ ├── ContactSettingsView.swift │ │ └── ContactSettingsViewModel.swift ├── Controllers │ ├── AlarmSound.swift │ ├── Alarms.swift │ ├── AppStateController.swift │ ├── BackgroundAlertManager.swift │ ├── Graphs.swift │ ├── NightScout.swift │ ├── Nightscout │ │ ├── BGData.swift │ │ ├── CAge.swift │ │ ├── DeviceStatus.swift │ │ ├── DeviceStatusLoop.swift │ │ ├── DeviceStatusOpenAPS.swift │ │ ├── IAge.swift │ │ ├── NSProfile.swift │ │ ├── Profile.swift │ │ ├── ProfileManager.swift │ │ ├── SAge.swift │ │ ├── Treatments.swift │ │ └── Treatments │ │ │ ├── BGCheck.swift │ │ │ ├── Basals.swift │ │ │ ├── Bolus.swift │ │ │ ├── Carbs.swift │ │ │ ├── InsulinCartridgeChange.swift │ │ │ ├── Notes.swift │ │ │ ├── Overrides.swift │ │ │ ├── ResumePump.swift │ │ │ ├── SMB.swift │ │ │ ├── SensorStart.swift │ │ │ ├── SiteChange.swift │ │ │ ├── SuspendPump.swift │ │ │ └── TemporaryTarget.swift │ ├── Stats.swift │ ├── StatsView.swift │ ├── Timers.swift │ └── ViewControllerManager.swift ├── Dexcom │ ├── DexcomSettingsView.swift │ └── DexcomSettingsViewModel.swift ├── Extensions │ ├── EKEventStore+Extensions.swift │ ├── HKQuantity+AnyConvertible.swift │ ├── HKUnit+Extensions.swift │ ├── ShareClientExtension.swift │ └── UIViewExtension.swift ├── Helpers │ ├── AnyConvertible.swift │ ├── AppConstants.swift │ ├── AppVersionManager.swift │ ├── BackgroundTaskAudio.swift │ ├── BuildDetails.swift │ ├── Chart.swift │ ├── CycleHelper.swift │ ├── DataStructs.swift │ ├── DateTime.swift │ ├── DictionaryKeyPath.swift │ ├── GitHubService.swift │ ├── Globals.swift │ ├── GlucoseConversion.swift │ ├── Localizer.swift │ ├── Mobileprovision.swift │ ├── NightscoutUtils.swift │ ├── ObservationToken.swift │ ├── TextFieldWithToolBar.swift │ ├── Views │ │ ├── ErrorMessageView.swift │ │ ├── HKQuantityInputView.swift │ │ └── LoadingButtonView.swift │ └── carbBolusArrays.swift ├── Info.plist ├── InfoDisplaySettings │ ├── InfoDisplaySettingsView.swift │ └── InfoDisplaySettingsViewModel.swift ├── InfoTable │ ├── InfoData.swift │ ├── InfoDataSeparator.swift │ ├── InfoManager.swift │ └── InfoType.swift ├── Log │ ├── LogEntry.swift │ ├── LogManager.swift │ ├── LogView.swift │ ├── LogViewModel.swift │ └── SearchBar.swift ├── Loop Follow.entitlements ├── LoopFollow.xcdatamodeld │ ├── .xccurrentversion │ └── LoopFollow.xcdatamodel │ │ └── contents ├── Metric │ ├── CarbMetric.swift │ ├── InsulinMetric.swift │ └── Metric.swift ├── Nightscout │ ├── NightscoutSettingsView.swift │ └── NightscoutSettingsViewModel.swift ├── Remote │ ├── Loop │ │ ├── LoopNightscoutRemoteView.swift │ │ ├── LoopOverrideView.swift │ │ └── LoopOverrideViewModel.swift │ ├── Nightscout │ │ └── TrioNightscoutRemoteView.swift │ ├── NoRemoteView.swift │ ├── RemoteType.swift │ ├── RemoteViewController.swift │ ├── Settings │ │ ├── RemoteSettingsView.swift │ │ └── RemoteSettingsViewModel.swift │ ├── TRC │ │ ├── BolusView.swift │ │ ├── MealView.swift │ │ ├── OverrideView.swift │ │ ├── PushMessage.swift │ │ ├── PushNotificationManager.swift │ │ ├── TRCCommandType.swift │ │ ├── TempTargetView.swift │ │ ├── TreatmentResponse.swift │ │ ├── TrioNightscoutRemoteController.swift │ │ ├── TrioRemoteControlView.swift │ │ └── TrioRemoteControlViewModel.swift │ └── TempTargetPreset │ │ ├── TempTargetPreset.swift │ │ └── TempTargetPresetManager.swift ├── Resources │ ├── Alarm Sounds │ │ ├── 1-millisecond-of-silence.mp3 │ │ ├── 20ms-of-silence.caf │ │ ├── 500ms-of-silence.mp3 │ │ ├── Alarm_Buzzer.caf │ │ ├── Alarm_Clock.caf │ │ ├── Alert_Tone_Busy.caf │ │ ├── Alert_Tone_Ringtone_1.caf │ │ ├── Alert_Tone_Ringtone_2.caf │ │ ├── Alien_Siren.caf │ │ ├── Ambulance.caf │ │ ├── Analog_Watch_Alarm.caf │ │ ├── Big_Clock_Ticking.caf │ │ ├── Burglar_Alarm_Siren_1.caf │ │ ├── Burglar_Alarm_Siren_2.caf │ │ ├── CSFX-2_Alarm.caf │ │ ├── Cartoon_Ascend_Climb_Sneaky.caf │ │ ├── Cartoon_Ascend_Then_Descend.caf │ │ ├── Cartoon_Bounce_To_Ceiling.caf │ │ ├── Cartoon_Dreamy_Glissando_Harp.caf │ │ ├── Cartoon_Fail_Strings_Trumpet.caf │ │ ├── Cartoon_Machine_Clumsy_Loop.caf │ │ ├── Cartoon_Siren.caf │ │ ├── Cartoon_Tip_Toe_Sneaky_Walk.caf │ │ ├── Cartoon_Uh_Oh.caf │ │ ├── Cartoon_Villain_Horns.caf │ │ ├── Cell_Phone_Ring_Tone.caf │ │ ├── Chimes_Glassy.caf │ │ ├── Computer_Magic.caf │ │ ├── Cuckoo_Clock.caf │ │ ├── Dhol_Shuffleloop.caf │ │ ├── Discreet.caf │ │ ├── Early_Sunrise.caf │ │ ├── Emergency_Alarm.caf │ │ ├── Emergency_Alarm_Carbon_Monoxide.caf │ │ ├── Emergency_Alarm_Siren.caf │ │ ├── Ending_Reached.caf │ │ ├── Fly.caf │ │ ├── Ghost_Hover.caf │ │ ├── Good_Morning.caf │ │ ├── Hell_Yeah_Somewhat_Calmer.caf │ │ ├── In_A_Hurry.caf │ │ ├── Indeed.caf │ │ ├── Insistently.caf │ │ ├── Jingle_All_The_Way.caf │ │ ├── Laser_Shoot.caf │ │ ├── Machine_Charge.caf │ │ ├── Magical_Twinkle.caf │ │ ├── Marching_Heavy_Footed_Fat_Elephants.caf │ │ ├── Marimba_Descend.caf │ │ ├── Marimba_Flutter_or_Shake.caf │ │ ├── Martian_Gun.caf │ │ ├── Martian_Scanner.caf │ │ ├── Metallic.caf │ │ ├── Nightguard.caf │ │ ├── Not_Kiddin.caf │ │ ├── Open_Your_Eyes_And_See.caf │ │ ├── Orchestral_Horns.caf │ │ ├── Oringz.caf │ │ ├── Pager_Beeps.caf │ │ ├── Remembers_Me_Of_Asia.caf │ │ ├── Rise_And_Shine.caf │ │ ├── Rush.caf │ │ ├── Sci-Fi_Air_Raid_Alarm.caf │ │ ├── Sci-Fi_Alarm.caf │ │ ├── Sci-Fi_Alarm_Loop_1.caf │ │ ├── Sci-Fi_Alarm_Loop_2.caf │ │ ├── Sci-Fi_Alarm_Loop_3.caf │ │ ├── Sci-Fi_Alarm_Loop_4.caf │ │ ├── Sci-Fi_Computer_Console_Alarm.caf │ │ ├── Sci-Fi_Console_Alarm.caf │ │ ├── Sci-Fi_Eerie_Alarm.caf │ │ ├── Sci-Fi_Engine_Shut_Down.caf │ │ ├── Sci-Fi_Incoming_Message_Alert.caf │ │ ├── Sci-Fi_Spaceship_Message.caf │ │ ├── Sci-Fi_Spaceship_Warm_Up.caf │ │ ├── Sci-Fi_Warning.caf │ │ ├── Signature_Corporate.caf │ │ ├── Siri_Alert_Calibration_Needed.caf │ │ ├── Siri_Alert_Device_Muted.caf │ │ ├── Siri_Alert_Glucose_Dropping_Fast.caf │ │ ├── Siri_Alert_Glucose_Rising_Fast.caf │ │ ├── Siri_Alert_High_Glucose.caf │ │ ├── Siri_Alert_Low_Glucose.caf │ │ ├── Siri_Alert_Missed_Readings.caf │ │ ├── Siri_Alert_Transmitter_Battery_Low.caf │ │ ├── Siri_Alert_Urgent_High_Glucose.caf │ │ ├── Siri_Alert_Urgent_Low_Glucose.caf │ │ ├── Siri_Calibration_Needed.caf │ │ ├── Siri_Device_Muted.caf │ │ ├── Siri_Glucose_Dropping_Fast.caf │ │ ├── Siri_Glucose_Rising_Fast.caf │ │ ├── Siri_High_Glucose.caf │ │ ├── Siri_Low_Glucose.caf │ │ ├── Siri_Missed_Readings.caf │ │ ├── Siri_Transmitter_Battery_Low.caf │ │ ├── Siri_Urgent_High_Glucose.caf │ │ ├── Siri_Urgent_Low_Glucose.caf │ │ ├── Soft_Marimba_Pad_Positive.caf │ │ ├── Soft_Warm_Airy_Optimistic.caf │ │ ├── Soft_Warm_Airy_Reassuring.caf │ │ ├── Store_Door_Chime.caf │ │ ├── Sunny.caf │ │ ├── Thunder_Sound_FX.caf │ │ ├── Time_Has_Come.caf │ │ ├── Tornado_Siren.caf │ │ ├── Two_Turtle_Doves.caf │ │ ├── Unpaved.caf │ │ ├── Wake_Up_Will_You.caf │ │ ├── Win_Gain.caf │ │ ├── Wrong_Answer.caf │ │ ├── alarm-notification.m4a │ │ ├── alarm.mp3 │ │ └── silence-1sec.mp3 │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 1024.png │ │ │ ├── 120-1.png │ │ │ ├── 120.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40-1.png │ │ │ ├── 40-2.png │ │ │ ├── 40.png │ │ │ ├── 58-1.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 76.png │ │ │ ├── 80-1.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ ├── Colors │ │ │ ├── Basal.colorset │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── DarkerBlue.colorset │ │ │ │ └── Contents.json │ │ │ ├── Insulin.colorset │ │ │ │ └── Contents.json │ │ │ ├── Lemon.colorset │ │ │ │ └── Contents.json │ │ │ ├── LoopGray.colorset │ │ │ │ └── Contents.json │ │ │ ├── LoopGreen.colorset │ │ │ │ └── Contents.json │ │ │ ├── LoopPink.colorset │ │ │ │ └── Contents.json │ │ │ ├── LoopRed.colorset │ │ │ │ └── Contents.json │ │ │ ├── LoopYellow.colorset │ │ │ │ └── Contents.json │ │ │ ├── ManualTempBasal.colorset │ │ │ │ └── Contents.json │ │ │ ├── NonPumpInsulin.colorset │ │ │ │ └── Contents.json │ │ │ ├── SMB.colorset │ │ │ │ └── Contents.json │ │ │ ├── TempBasal.colorset │ │ │ │ └── Contents.json │ │ │ ├── UAM.colorset │ │ │ │ └── Contents.json │ │ │ ├── ZT.colorset │ │ │ │ └── Contents.json │ │ │ ├── darkGray.colorset │ │ │ │ └── Contents.json │ │ │ ├── minus.colorset │ │ │ │ └── Contents.json │ │ │ └── warning.colorset │ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── first.imageset │ │ │ ├── Contents.json │ │ │ └── first.pdf │ │ └── second.imageset │ │ │ ├── Contents.json │ │ │ └── second.pdf │ ├── blank.wav │ ├── dragbar.png │ └── silence.mp3 ├── Settings │ ├── AdvancedSettingsView.swift │ └── AdvancedSettingsViewModel.swift ├── Storage │ ├── Observable.swift │ ├── ObservableUserDefaults.swift │ ├── ObservableUserDefaultsValue.swift │ ├── ObservableValue.swift │ ├── SecureStorageValue.swift │ ├── Storage.swift │ ├── StorageValue.swift │ ├── UserData.xcdatamodeld │ │ └── UserData.xcdatamodel │ │ │ └── contents │ ├── UserDefaults.swift │ ├── UserDefaultsValue.swift │ └── UserDefaultsValueGroups.swift ├── Task │ ├── AlarmTask.swift │ ├── BGTask.swift │ ├── CalendarTask.swift │ ├── DeviceStatusTask.swift │ ├── MinAgoTask.swift │ ├── ProfileTask.swift │ ├── Task.swift │ ├── TaskScheduler.swift │ └── TreatmentsTask.swift └── ViewControllers │ ├── AlarmViewController.swift │ ├── AppStateViewController.swift │ ├── DebugViewController.swift │ ├── GeneralSettingsViewController.swift │ ├── GraphSettingsViewController.swift │ ├── MainViewController.swift │ ├── NightScoutViewController.swift │ ├── SettingsViewController.swift │ ├── SnoozeViewController.swift │ └── WatchSettingsViewController.swift ├── LoopFollowDisplayNameConfig.xcconfig ├── Podfile ├── Podfile.lock ├── Pods ├── Charts │ ├── LICENSE │ ├── README.md │ └── Source │ │ └── Charts │ │ ├── Animation │ │ ├── Animator.swift │ │ └── ChartAnimationEasing.swift │ │ ├── Charts │ │ ├── BarChartView.swift │ │ ├── BarLineChartViewBase.swift │ │ ├── BubbleChartView.swift │ │ ├── CandleStickChartView.swift │ │ ├── ChartViewBase.swift │ │ ├── CombinedChartView.swift │ │ ├── HorizontalBarChartView.swift │ │ ├── LineChartView.swift │ │ ├── PieChartView.swift │ │ ├── PieRadarChartViewBase.swift │ │ ├── RadarChartView.swift │ │ └── ScatterChartView.swift │ │ ├── Components │ │ ├── AxisBase.swift │ │ ├── ChartLimitLine.swift │ │ ├── ComponentBase.swift │ │ ├── Description.swift │ │ ├── Legend.swift │ │ ├── LegendEntry.swift │ │ ├── Marker.swift │ │ ├── MarkerImage.swift │ │ ├── MarkerView.swift │ │ ├── XAxis.swift │ │ └── YAxis.swift │ │ ├── Data │ │ ├── Implementations │ │ │ ├── ChartBaseDataSet.swift │ │ │ └── Standard │ │ │ │ ├── BarChartData.swift │ │ │ │ ├── BarChartDataEntry.swift │ │ │ │ ├── BarChartDataSet.swift │ │ │ │ ├── BarLineScatterCandleBubbleChartData.swift │ │ │ │ ├── BarLineScatterCandleBubbleChartDataSet.swift │ │ │ │ ├── BubbleChartData.swift │ │ │ │ ├── BubbleChartDataEntry.swift │ │ │ │ ├── BubbleChartDataSet.swift │ │ │ │ ├── CandleChartData.swift │ │ │ │ ├── CandleChartDataEntry.swift │ │ │ │ ├── CandleChartDataSet.swift │ │ │ │ ├── ChartData.swift │ │ │ │ ├── ChartDataEntry.swift │ │ │ │ ├── ChartDataEntryBase.swift │ │ │ │ ├── ChartDataSet.swift │ │ │ │ ├── CombinedChartData.swift │ │ │ │ ├── LineChartData.swift │ │ │ │ ├── LineChartDataSet.swift │ │ │ │ ├── LineRadarChartDataSet.swift │ │ │ │ ├── LineScatterCandleRadarChartDataSet.swift │ │ │ │ ├── PieChartData.swift │ │ │ │ ├── PieChartDataEntry.swift │ │ │ │ ├── PieChartDataSet.swift │ │ │ │ ├── RadarChartData.swift │ │ │ │ ├── RadarChartDataEntry.swift │ │ │ │ ├── RadarChartDataSet.swift │ │ │ │ ├── ScatterChartData.swift │ │ │ │ └── ScatterChartDataSet.swift │ │ └── Interfaces │ │ │ ├── BarChartDataSetProtocol.swift │ │ │ ├── BarLineScatterCandleBubbleChartDataSetProtocol.swift │ │ │ ├── BubbleChartDataSetProtocol.swift │ │ │ ├── CandleChartDataSetProtocol.swift │ │ │ ├── ChartDataSetProtocol.swift │ │ │ ├── LineChartDataSetProtocol.swift │ │ │ ├── LineRadarChartDataSetProtocol.swift │ │ │ ├── LineScatterCandleRadarChartDataSetProtocol.swift │ │ │ ├── PieChartDataSetProtocol.swift │ │ │ ├── RadarChartDataSetProtocol.swift │ │ │ └── ScatterChartDataSetProtocol.swift │ │ ├── Filters │ │ ├── DataApproximator+N.swift │ │ └── DataApproximator.swift │ │ ├── Formatters │ │ ├── AxisValueFormatter.swift │ │ ├── DefaultAxisValueFormatter.swift │ │ ├── DefaultFillFormatter.swift │ │ ├── DefaultValueFormatter.swift │ │ ├── FillFormatter.swift │ │ ├── IndexAxisValueFormatter.swift │ │ └── ValueFormatter.swift │ │ ├── Highlight │ │ ├── BarHighlighter.swift │ │ ├── ChartHighlighter.swift │ │ ├── CombinedHighlighter.swift │ │ ├── Highlight.swift │ │ ├── Highlighter.swift │ │ ├── HorizontalBarHighlighter.swift │ │ ├── PieHighlighter.swift │ │ ├── PieRadarHighlighter.swift │ │ ├── RadarHighlighter.swift │ │ └── Range.swift │ │ ├── Interfaces │ │ ├── BarChartDataProvider.swift │ │ ├── BarLineScatterCandleBubbleChartDataProvider.swift │ │ ├── BubbleChartDataProvider.swift │ │ ├── CandleChartDataProvider.swift │ │ ├── ChartDataProvider.swift │ │ ├── CombinedChartDataProvider.swift │ │ ├── LineChartDataProvider.swift │ │ └── ScatterChartDataProvider.swift │ │ ├── Jobs │ │ ├── AnimatedMoveViewJob.swift │ │ ├── AnimatedViewPortJob.swift │ │ ├── AnimatedZoomViewJob.swift │ │ ├── MoveViewJob.swift │ │ ├── ViewPortJob.swift │ │ └── ZoomViewJob.swift │ │ ├── Renderers │ │ ├── AxisRenderer.swift │ │ ├── BarChartRenderer.swift │ │ ├── BarLineScatterCandleBubbleRenderer.swift │ │ ├── BubbleChartRenderer.swift │ │ ├── CandleStickChartRenderer.swift │ │ ├── CombinedChartRenderer.swift │ │ ├── DataRenderer.swift │ │ ├── HorizontalBarChartRenderer.swift │ │ ├── LegendRenderer.swift │ │ ├── LineChartRenderer.swift │ │ ├── LineRadarRenderer.swift │ │ ├── LineScatterCandleRadarRenderer.swift │ │ ├── PieChartRenderer.swift │ │ ├── RadarChartRenderer.swift │ │ ├── Renderer.swift │ │ ├── Scatter │ │ │ ├── ChevronDownShapeRenderer.swift │ │ │ ├── ChevronUpShapeRenderer.swift │ │ │ ├── CircleShapeRenderer.swift │ │ │ ├── CrossShapeRenderer.swift │ │ │ ├── ShapeRenderer.swift │ │ │ ├── SquareShapeRenderer.swift │ │ │ ├── TriangleShapeRenderer.swift │ │ │ └── XShapeRenderer.swift │ │ ├── ScatterChartRenderer.swift │ │ ├── XAxisRenderer.swift │ │ ├── XAxisRendererHorizontalBarChart.swift │ │ ├── XAxisRendererRadarChart.swift │ │ ├── YAxisRenderer.swift │ │ ├── YAxisRendererHorizontalBarChart.swift │ │ └── YAxisRendererRadarChart.swift │ │ └── Utils │ │ ├── ChartColorTemplates.swift │ │ ├── ChartUtils.swift │ │ ├── Fill.swift │ │ ├── Platform+Accessibility.swift │ │ ├── Platform+Color.swift │ │ ├── Platform+Gestures.swift │ │ ├── Platform+Graphics.swift │ │ ├── Platform+Touch Handling.swift │ │ ├── Platform.swift │ │ ├── Sequence+KeyPath.swift │ │ ├── Transformer.swift │ │ ├── TransformerHorizontalBarChart.swift │ │ └── ViewPortHandler.swift ├── Eureka │ ├── LICENSE │ ├── README.md │ └── Source │ │ ├── Core │ │ ├── BaseRow.swift │ │ ├── Cell.swift │ │ ├── CellType.swift │ │ ├── Core.swift │ │ ├── Form.swift │ │ ├── HeaderFooterView.swift │ │ ├── Helpers.swift │ │ ├── InlineRowType.swift │ │ ├── NavigationAccessoryView.swift │ │ ├── Operators.swift │ │ ├── PresenterRowType.swift │ │ ├── Row.swift │ │ ├── RowControllerType.swift │ │ ├── RowProtocols.swift │ │ ├── RowType.swift │ │ ├── Section.swift │ │ ├── SelectableRowType.swift │ │ ├── SelectableSection.swift │ │ ├── SwipeActions.swift │ │ └── Validation.swift │ │ ├── Rows │ │ ├── ActionSheetRow.swift │ │ ├── AlertRow.swift │ │ ├── ButtonRow.swift │ │ ├── ButtonRowWithPresent.swift │ │ ├── CheckRow.swift │ │ ├── Common │ │ │ ├── AlertOptionsRow.swift │ │ │ ├── DateFieldRow.swift │ │ │ ├── DateInlineFieldRow.swift │ │ │ ├── DecimalFormatter.swift │ │ │ ├── FieldRow.swift │ │ │ ├── GenericMultipleSelectorRow.swift │ │ │ ├── OptionsRow.swift │ │ │ ├── Protocols.swift │ │ │ └── SelectorRow.swift │ │ ├── Controllers │ │ │ ├── MultipleSelectorViewController.swift │ │ │ ├── SelectorAlertController.swift │ │ │ └── SelectorViewController.swift │ │ ├── DateInlineRow.swift │ │ ├── DatePickerRow.swift │ │ ├── DateRow.swift │ │ ├── DoublePickerInputRow.swift │ │ ├── DoublePickerRow.swift │ │ ├── FieldsRow.swift │ │ ├── LabelRow.swift │ │ ├── MultipleSelectorRow.swift │ │ ├── PickerInlineRow.swift │ │ ├── PickerInputRow.swift │ │ ├── PickerRow.swift │ │ ├── PopoverSelectorRow.swift │ │ ├── PushRow.swift │ │ ├── SegmentedRow.swift │ │ ├── SelectableRows │ │ │ └── ListCheckRow.swift │ │ ├── SliderRow.swift │ │ ├── StepperRow.swift │ │ ├── SwitchRow.swift │ │ ├── TextAreaRow.swift │ │ ├── TriplePickerInputRow.swift │ │ └── TriplePickerRow.swift │ │ └── Validations │ │ ├── RuleClosure.swift │ │ ├── RuleEmail.swift │ │ ├── RuleEqualsToRow.swift │ │ ├── RuleLength.swift │ │ ├── RuleRange.swift │ │ ├── RuleRegExp.swift │ │ ├── RuleRequired.swift │ │ └── RuleURL.swift ├── Local Podspecs │ ├── Eureka.podspec.json │ └── ShareClient.podspec.json ├── Manifest.lock ├── Pods.xcodeproj │ ├── project.pbxproj │ └── xcuserdata │ │ └── jon.xcuserdatad │ │ └── xcschemes │ │ ├── Charts.xcscheme │ │ ├── Eureka.xcscheme │ │ ├── Pods-LoopFollow.xcscheme │ │ ├── ShareClient.xcscheme │ │ ├── SwiftAlgorithms.xcscheme │ │ └── xcschememanagement.plist ├── ShareClient │ ├── LICENSE │ └── ShareClient │ │ ├── ShareClient.h │ │ └── ShareClient.swift ├── SwiftAlgorithms │ ├── LICENSE.txt │ ├── README.md │ └── Sources │ │ └── Algorithms │ │ ├── AdjacentPairs.swift │ │ ├── Chain.swift │ │ ├── Chunked.swift │ │ ├── Combinations.swift │ │ ├── Compacted.swift │ │ ├── Cycle.swift │ │ ├── EitherSequence.swift │ │ ├── FirstNonNil.swift │ │ ├── FlattenCollection.swift │ │ ├── Indexed.swift │ │ ├── Intersperse.swift │ │ ├── Joined.swift │ │ ├── MinMax.swift │ │ ├── Partition.swift │ │ ├── Permutations.swift │ │ ├── Product.swift │ │ ├── Reductions.swift │ │ ├── Rotate.swift │ │ ├── Split.swift │ │ ├── Stride.swift │ │ ├── Suffix.swift │ │ ├── Trim.swift │ │ ├── Unique.swift │ │ └── Windows.swift └── Target Support Files │ ├── Charts │ ├── Charts-Info.plist │ ├── Charts-dummy.m │ ├── Charts-prefix.pch │ ├── Charts-umbrella.h │ ├── Charts.debug.xcconfig │ ├── Charts.modulemap │ └── Charts.release.xcconfig │ ├── Eureka │ ├── Eureka-Info.plist │ ├── Eureka-dummy.m │ ├── Eureka-prefix.pch │ ├── Eureka-umbrella.h │ ├── Eureka.debug.xcconfig │ ├── Eureka.modulemap │ └── Eureka.release.xcconfig │ ├── Pods-LoopFollow │ ├── Pods-LoopFollow-Info.plist │ ├── Pods-LoopFollow-acknowledgements.markdown │ ├── Pods-LoopFollow-acknowledgements.plist │ ├── Pods-LoopFollow-dummy.m │ ├── Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist │ ├── Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist │ ├── Pods-LoopFollow-frameworks-Release-input-files.xcfilelist │ ├── Pods-LoopFollow-frameworks-Release-output-files.xcfilelist │ ├── Pods-LoopFollow-frameworks.sh │ ├── Pods-LoopFollow-umbrella.h │ ├── Pods-LoopFollow.debug.xcconfig │ ├── Pods-LoopFollow.modulemap │ └── Pods-LoopFollow.release.xcconfig │ ├── ShareClient │ ├── ShareClient-Info.plist │ ├── ShareClient-dummy.m │ ├── ShareClient-prefix.pch │ ├── ShareClient-umbrella.h │ ├── ShareClient.debug.xcconfig │ ├── ShareClient.modulemap │ └── ShareClient.release.xcconfig │ └── SwiftAlgorithms │ ├── SwiftAlgorithms-Info.plist │ ├── SwiftAlgorithms-dummy.m │ ├── SwiftAlgorithms-prefix.pch │ ├── SwiftAlgorithms-umbrella.h │ ├── SwiftAlgorithms.debug.xcconfig │ ├── SwiftAlgorithms.modulemap │ └── SwiftAlgorithms.release.xcconfig ├── README.md ├── Scripts └── capture-build-details.sh ├── blacklisted-versions.json └── fastlane ├── Fastfile ├── Matchfile └── testflight.md /BuildDetails.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Config.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "LoopFollowConfigOverride.xcconfig" 2 | #include? "../../LoopFollowConfigOverride.xcconfig" 3 | #include? "LoopFollowDisplayNameConfig.xcconfig" 4 | #include? "../../LoopFollowDisplayNameConfig.xcconfig" 5 | 6 | unique_id = ${DEVELOPMENT_TEAM} 7 | 8 | //Version (DEFAULT) 9 | LOOP_FOLLOW_MARKETING_VERSION = 2.6.0 10 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | gem "rexml", "3.3.2" -------------------------------------------------------------------------------- /LoopFollow.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /LoopFollow.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /LoopFollow.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Oxygen", 6 | "repositoryURL": "https://github.com/mpangburn/Oxygen.git", 7 | "state": { 8 | "branch": "master", 9 | "revision": "b3c7a6ead1400e4799b16755d23c9905040d4acc", 10 | "version": null 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | LoopFollow.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 5 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /LoopFollow.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /LoopFollow.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /LoopFollow.xcworkspace/xcuserdata/jon.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow.xcworkspace/xcuserdata/jon.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /LoopFollow/BackgroundRefresh/BT/BLEDevice.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BLEDevice.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-02. 6 | // 7 | 8 | import Foundation 9 | 10 | struct BLEDevice: Identifiable, Codable, Equatable { 11 | let id: UUID 12 | 13 | var name: String? 14 | var rssi: Int 15 | var isConnected: Bool 16 | var advertisedServices: [String]? 17 | var lastSeen: Date 18 | var lastConnected: Date? 19 | 20 | init(id: UUID, 21 | name: String? = nil, 22 | rssi: Int, 23 | isConnected: Bool = false, 24 | advertisedServices: [String]? = nil, 25 | lastSeen: Date = Date(), 26 | lastConnected: Date? = nil) { 27 | self.id = id 28 | self.name = name 29 | self.rssi = rssi 30 | self.isConnected = isConnected 31 | self.advertisedServices = advertisedServices 32 | self.lastSeen = lastSeen 33 | self.lastConnected = lastConnected 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LoopFollow/BackgroundRefresh/BT/BluetoothDeviceDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BluetoothDeviceDelegate.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-04. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import CoreBluetooth 11 | 12 | protocol BluetoothDeviceDelegate: AnyObject { 13 | func didConnectTo(bluetoothDevice: BluetoothDevice) 14 | 15 | func didDisconnectFrom(bluetoothDevice: BluetoothDevice) 16 | 17 | func heartBeat() 18 | } 19 | -------------------------------------------------------------------------------- /LoopFollow/BackgroundRefresh/BT/Devices/DexcomHeartbeatBluetoothDevice.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DexcomHeartbeatBluetoothDevice.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-04. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import os 11 | import CoreBluetooth 12 | import AVFoundation 13 | 14 | class DexcomHeartbeatBluetoothDevice: BluetoothDevice { 15 | private let CBUUID_Service_G7 = "F8083532-849E-531C-C594-30F1F86A4EA5" 16 | private let CBUUID_Advertisement_G7 = "FEBC" 17 | private let CBUUID_ReceiveCharacteristic_G7 = "F8083535-849E-531C-C594-30F1F86A4EA5" 18 | 19 | init(address:String, name:String?, bluetoothDeviceDelegate: BluetoothDeviceDelegate) { 20 | super.init( 21 | address: address, 22 | name: name, 23 | CBUUID_Advertisement: CBUUID_Advertisement_G7, 24 | servicesCBUUIDs: [CBUUID(string: CBUUID_Service_G7)], 25 | CBUUID_ReceiveCharacteristic: CBUUID_ReceiveCharacteristic_G7, 26 | bluetoothDeviceDelegate: bluetoothDeviceDelegate 27 | ) 28 | } 29 | 30 | override func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { 31 | super.centralManager(central, didDisconnectPeripheral: peripheral, error: error) 32 | self.bluetoothDeviceDelegate?.heartBeat() 33 | } 34 | 35 | override func expectedHeartbeatInterval() -> TimeInterval? { 36 | return 5 * 60 // 5 minutes in seconds 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/BackgroundRefresh/BT/DexcomG7HeartBeat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DexcomG7HeartBeat.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-04. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | // Denna behövs 10 | 11 | import Foundation 12 | 13 | /// A simple class to represent the Dexcom G7 Heartbeat. 14 | /// It wraps around a `BLEPeripheral` to store relevant information. 15 | public class DexcomG7HeartBeat { 16 | 17 | // MARK: - Properties 18 | 19 | /// The BLEPeripheral instance associated with this heartbeat. 20 | public let blePeripheral: BLEPeripheral 21 | 22 | // MARK: - Initialization 23 | 24 | /// Initializes a new DexcomG7HeartBeat instance. 25 | /// - Parameters: 26 | /// - address: The unique address of the BLE device. 27 | /// - name: The name of the BLE device. 28 | /// - alias: An optional alias for the device. 29 | public init(address: String, name: String, alias: String? = nil) { 30 | self.blePeripheral = BLEPeripheral( 31 | address: address, 32 | name: name, 33 | alias: alias, 34 | peripheralType: .DexcomG7HeartBeatType 35 | ) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /LoopFollow/BackgroundRefresh/BackgroundRefreshSettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BackgroundRefreshSettingsViewModel.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-02. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | 11 | class BackgroundRefreshSettingsViewModel: ObservableObject { 12 | @Published var backgroundRefreshType: BackgroundRefreshType 13 | 14 | private var storage = Storage.shared 15 | private var cancellables = Set() 16 | 17 | private var isInitialSetup = true // Tracks whether the value is being set initially 18 | 19 | init() { 20 | self.backgroundRefreshType = storage.backgroundRefreshType.value 21 | setupBindings() 22 | } 23 | 24 | private func setupBindings() { 25 | $backgroundRefreshType 26 | .dropFirst() // Ignore the initial emission during setup 27 | .sink { [weak self] newValue in 28 | guard let self = self else { return } 29 | self.handleBackgroundRefreshTypeChange(newValue) 30 | 31 | // Persist the change 32 | self.storage.backgroundRefreshType.value = newValue 33 | } 34 | .store(in: &cancellables) 35 | } 36 | 37 | private func handleBackgroundRefreshTypeChange(_ newValue: BackgroundRefreshType) { 38 | LogManager.shared.log(category: .general, message: "Background refresh type changed to: \(newValue.rawValue)") 39 | 40 | BLEManager.shared.disconnect() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /LoopFollow/Contact/ContactColorOption.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactColorOption.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-02-22. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | enum ContactColorOption: String, CaseIterable { 12 | case red, blue, cyan, green, yellow, orange, purple, white, black 13 | 14 | var uiColor: UIColor { 15 | switch self { 16 | case .red: return .red 17 | case .blue: return .blue 18 | case .cyan: return .cyan 19 | case .green: return .green 20 | case .yellow: return .yellow 21 | case .orange: return .orange 22 | case .purple: return .purple 23 | case .white: return .white 24 | case .black: return .black 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LoopFollow/Contact/ContactIncludeOption.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactIncludeOption.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-02-22. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | enum ContactIncludeOption: String, Codable, Equatable, CaseIterable { 10 | case off = "Off" 11 | case include = "Include" 12 | case separate = "Separate" 13 | } 14 | -------------------------------------------------------------------------------- /LoopFollow/Contact/ContactType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactSuffix.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-02-23. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | enum ContactType: String, CaseIterable { 10 | case BG = "BG" 11 | case Trend = "Trend" 12 | case Delta = "Delta" 13 | } 14 | -------------------------------------------------------------------------------- /LoopFollow/Controllers/Nightscout/Treatments/BGCheck.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CarbsToday.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2023-10-04. 6 | // Copyright © 2023 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | extension MainViewController { 13 | // NS BG Check Response Processor 14 | func processNSBGCheck(entries: [[String:AnyObject]]) { 15 | bgCheckData.removeAll() 16 | 17 | entries.reversed().forEach { currentEntry in 18 | guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return } 19 | 20 | guard let parsedDate = NightscoutUtils.parseDate(dateStr), 21 | let glucose = currentEntry["glucose"] as? Double else { 22 | return 23 | } 24 | 25 | let units = currentEntry["units"] as? String ?? "mg/dl" 26 | let convertedGlucose: Double = units == "mmol" ? glucose * GlucoseConversion.mmolToMgDl : glucose 27 | 28 | let dateTimeStamp = parsedDate.timeIntervalSince1970 29 | if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) { 30 | let dot = ShareGlucoseData(sgv: Int(convertedGlucose.rounded()), date: Double(dateTimeStamp), direction: "") 31 | bgCheckData.append(dot) 32 | } 33 | } 34 | 35 | if UserDefaultsRepository.graphOtherTreatments.value { 36 | updateBGCheckGraph() 37 | } 38 | } 39 | } 40 | 41 | -------------------------------------------------------------------------------- /LoopFollow/Controllers/Nightscout/Treatments/InsulinCartridgeChange.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InsulinCartridgeChange.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-08-05. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | extension MainViewController { 11 | func processIage(entries: [iageData]) { 12 | if !entries.isEmpty { 13 | updateIage(data: entries) 14 | } else if let iage = currentIage { 15 | updateIage(data: [iage]) 16 | } else if UserDefaultsRepository.infoVisible.value[InfoType.iage.rawValue] { 17 | webLoadNSIage() 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LoopFollow/Controllers/Nightscout/Treatments/ResumePump.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResumePump.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2023-10-05. 6 | // Copyright © 2023 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | extension MainViewController { 11 | // NS Resume Pump Response Processor 12 | func processResumePump(entries: [[String:AnyObject]]) { 13 | resumeGraphData.removeAll() 14 | 15 | var lastFoundIndex = 0 16 | 17 | entries.reversed().forEach { currentEntry in 18 | guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return } 19 | 20 | guard let parsedDate = NightscoutUtils.parseDate(dateStr) else { 21 | return 22 | } 23 | 24 | let dateTimeStamp = parsedDate.timeIntervalSince1970 25 | let sgv = findNearestBGbyTime(needle: dateTimeStamp, haystack: bgData, startingIndex: lastFoundIndex) 26 | lastFoundIndex = sgv.foundIndex 27 | 28 | if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) { 29 | let dot = DataStructs.timestampOnlyStruct(date: Double(dateTimeStamp), sgv: Int(sgv.sgv)) 30 | resumeGraphData.append(dot) 31 | } 32 | } 33 | 34 | if UserDefaultsRepository.graphOtherTreatments.value { 35 | updateResumeGraph() 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Controllers/Nightscout/Treatments/SiteChange.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SiteChange.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2023-10-06. 6 | // Copyright © 2023 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | extension MainViewController { 11 | func processCage(entries: [cageData]) { 12 | if !entries.isEmpty { 13 | updateCage(data: entries) 14 | } else if let cage = currentCage { 15 | updateCage(data: [cage]) 16 | } else { 17 | webLoadNSCage() 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LoopFollow/Controllers/Nightscout/Treatments/SuspendPump.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SuspendPump.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2023-10-05. 6 | // Copyright © 2023 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | extension MainViewController { 11 | // NS Suspend Pump Response Processor 12 | func processSuspendPump(entries: [[String:AnyObject]]) { 13 | suspendGraphData.removeAll() 14 | 15 | var lastFoundIndex = 0 16 | 17 | entries.reversed().forEach { currentEntry in 18 | guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return } 19 | 20 | guard let parsedDate = NightscoutUtils.parseDate(dateStr) else { 21 | return 22 | } 23 | 24 | let dateTimeStamp = parsedDate.timeIntervalSince1970 25 | let sgv = findNearestBGbyTime(needle: dateTimeStamp, haystack: bgData, startingIndex: lastFoundIndex) 26 | lastFoundIndex = sgv.foundIndex 27 | 28 | if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) { 29 | let dot = DataStructs.timestampOnlyStruct(date: Double(dateTimeStamp), sgv: Int(sgv.sgv)) 30 | suspendGraphData.append(dot) 31 | } 32 | } 33 | 34 | if UserDefaultsRepository.graphOtherTreatments.value { 35 | updateSuspendGraph() 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Controllers/ViewControllerManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewControllerManager.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-27. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class ViewControllerManager { 13 | 14 | static let shared = ViewControllerManager() 15 | 16 | var alarmViewController: AlarmViewController? 17 | 18 | private init() { 19 | instantiateAlarmViewController() 20 | } 21 | 22 | private func instantiateAlarmViewController() { 23 | let storyboard = UIStoryboard(name: "Main", bundle: nil) 24 | self.alarmViewController = storyboard.instantiateViewController(withIdentifier: "AlarmViewController") as? AlarmViewController 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LoopFollow/Dexcom/DexcomSettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DexcomSettingsView.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-18. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct DexcomSettingsView: View { 12 | @ObservedObject var viewModel: DexcomSettingsViewModel 13 | @Environment(\.presentationMode) var presentationMode 14 | 15 | var body: some View { 16 | NavigationView { 17 | Form { 18 | Section(header: Text("Dexcom Settings")) { 19 | TextField("User Name", text: $viewModel.userName) 20 | .autocapitalization(.none) 21 | .disableAutocorrection(true) 22 | 23 | TextField("Password", text: $viewModel.password) 24 | .autocapitalization(.none) 25 | .disableAutocorrection(true) 26 | 27 | Picker("Server", selection: $viewModel.server) { 28 | Text("US").tag("US") 29 | Text("NON-US").tag("NON-US") 30 | } 31 | .pickerStyle(SegmentedPickerStyle()) 32 | } 33 | } 34 | .navigationBarTitle("Dexcom Settings", displayMode: .inline) 35 | .toolbar { 36 | ToolbarItem(placement: .navigationBarTrailing) { 37 | Button("Done") { 38 | presentationMode.wrappedValue.dismiss() 39 | } 40 | } 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /LoopFollow/Dexcom/DexcomSettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DexcomSettingsViewModel.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-18. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Combine 11 | 12 | class DexcomSettingsViewModel: ObservableObject { 13 | @Published var userName: String = UserDefaultsRepository.shareUserName.value { 14 | willSet { 15 | if newValue != userName { 16 | UserDefaultsRepository.shareUserName.value = newValue 17 | } 18 | } 19 | } 20 | @Published var password: String = UserDefaultsRepository.sharePassword.value { 21 | willSet { 22 | if newValue != password { 23 | UserDefaultsRepository.sharePassword.value = newValue 24 | } 25 | } 26 | } 27 | @Published var server: String = UserDefaultsRepository.shareServer.value { 28 | willSet { 29 | if newValue != server { 30 | UserDefaultsRepository.shareServer.value = newValue 31 | } 32 | } 33 | } 34 | 35 | init() { 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /LoopFollow/Extensions/EKEventStore+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EKEventStore+Extensions.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2023-07-27. 6 | // Copyright © 2023 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import EventKit 11 | 12 | #if swift(>=5.9) 13 | extension EKEventStore { 14 | func requestCalendarAccess(completion: @escaping (Bool, Error?) -> Void) { 15 | if #available(iOS 17, *) { 16 | requestFullAccessToEvents { (granted, error) in 17 | completion(granted, error) 18 | } 19 | } else { 20 | requestAccess(to: .event) { (granted, error) in 21 | completion(granted, error) 22 | } 23 | } 24 | } 25 | } 26 | #else 27 | extension EKEventStore { 28 | func requestCalendarAccess(completion: @escaping (Bool, Error?) -> Void) { 29 | requestAccess(to: .event) { (granted, error) in 30 | completion(granted, error) 31 | } 32 | } 33 | } 34 | #endif 35 | -------------------------------------------------------------------------------- /LoopFollow/Extensions/HKQuantity+AnyConvertible.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HKQuantity+AnyConvertible.swift 3 | // nightguard 4 | // 5 | // Created by Jonas Björkert on 2024-07-24. 6 | // 7 | 8 | import HealthKit 9 | 10 | class HKQuantityWrapper: AnyConvertible { 11 | let quantity: HKQuantity 12 | 13 | init(quantity: HKQuantity) { 14 | self.quantity = quantity 15 | } 16 | 17 | func toAny() -> Any { 18 | return ["unit": UserDefaultsRepository.getPreferredUnit().unitString, 19 | "value": quantity.doubleValue(for: UserDefaultsRepository.getPreferredUnit())] 20 | } 21 | 22 | static func fromAny(_ anyValue: Any) -> HKQuantityWrapper? { 23 | // Convert dictionary back to HKQuantity 24 | guard let dict = anyValue as? [String: Any], 25 | let unitString = dict["unit"] as? String, 26 | let value = dict["value"] as? Double else { 27 | return nil 28 | } 29 | 30 | let unit = HKUnit(from: unitString) 31 | let quantity = HKQuantity(unit: unit, doubleValue: value) 32 | return HKQuantityWrapper(quantity: quantity) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LoopFollow/Extensions/UIViewExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewExtension.swift 3 | // LoopFollow 4 | // 5 | // Created by Jose Paredes on 7/16/20. 6 | // Copyright © 2020 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | extension UIView { 13 | enum ViewSide { 14 | case Left, Right, Top, Bottom 15 | } 16 | 17 | func addBorder(toSide side: ViewSide, withColor color: CGColor, andThickness thickness: CGFloat) { 18 | let border = CALayer() 19 | border.backgroundColor = color 20 | 21 | switch side { 22 | case .Left: border.frame = CGRect(x:0, y: 0, width: thickness, height: frame.height); break 23 | case .Right: border.frame = CGRect(x: frame.width-thickness, y: 0, width: thickness, height: frame.height); break 24 | case .Top: border.frame = CGRect(x: 0, y: 0, width: frame.width, height: thickness); break 25 | case .Bottom: border.frame = CGRect(x: 0, y: frame.height-thickness, width: frame.width, height: thickness); break 26 | } 27 | layer.addSublayer(border) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/AppConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppConstants.swift 3 | // scoutwatch 4 | // 5 | // Created by Dirk Hermanns on 26.12.15. 6 | // Copyright © 2015 private. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // Class that contains general constants used in different classes 12 | class AppConstants { 13 | internal static let APP_GROUP_ID = "group.com.$(unique_id).LoopFollow" 14 | } 15 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/GitHubService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitHubService.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-05-11. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class GitHubService { 12 | enum GitHubDataType { 13 | case versionConfig 14 | case blacklistedVersions 15 | 16 | var url: String { 17 | switch self { 18 | case .versionConfig: 19 | return "https://raw.githubusercontent.com/loopandlearn/LoopFollow/main/Config.xcconfig" 20 | case .blacklistedVersions: 21 | return "https://raw.githubusercontent.com/loopandlearn/LoopFollow/main/blacklisted-versions.json" 22 | } 23 | } 24 | } 25 | 26 | func fetchData(for dataType: GitHubDataType, completion: @escaping (Data?) -> Void) { 27 | let urlString = dataType.url 28 | guard let url = URL(string: urlString) else { 29 | completion(nil) 30 | return 31 | } 32 | 33 | URLSession.shared.dataTask(with: url) { data, response, error in 34 | guard let data = data, error == nil else { 35 | completion(nil) 36 | return 37 | } 38 | if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { 39 | completion(data) 40 | } else { 41 | completion(nil) 42 | } 43 | }.resume() 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/Globals.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Globals.swift 3 | // LoopFollow 4 | // 5 | // Created by Jon Fawcett on 7/23/20. 6 | // Copyright © 2020 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | struct globalVariables { 13 | static var debugLog = "" 14 | 15 | // Graph Settings 16 | static let dotBG: Float = 3 17 | static let dotCarb: Float = 5 18 | static let dotBolus: Float = 5 19 | static let dotOther: Float = 5 20 | } 21 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/GlucoseConversion.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlucoseConversion.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-04-28. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct GlucoseConversion { 12 | static let mgDlToMmolL: Double = 0.0555 13 | static let mmolToMgDl: Double = 18.01559 14 | } 15 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/ObservationToken.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObservationToken.swift 3 | // nightguard 4 | // 5 | // Created by Florian Preknya on 1/30/19. 6 | // Copyright © 2019 private. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// The token received by an observe when subscribes to its subject. The observer can cancel observation, so the subject will remove it from its observers list. 12 | class ObservationToken { 13 | 14 | private let cancellationClosure: () -> Void 15 | 16 | init(cancellationClosure: @escaping () -> Void) { 17 | self.cancellationClosure = cancellationClosure 18 | } 19 | 20 | func cancel() { 21 | cancellationClosure() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/Views/ErrorMessageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ErrorMessageView.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-31. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | 12 | struct ErrorMessageView: View { 13 | var message: String 14 | var buttonTitle: String? 15 | var buttonAction: (() -> Void)? 16 | 17 | var body: some View { 18 | VStack(spacing: 20) { 19 | Text(message) 20 | .foregroundColor(.red) 21 | .multilineTextAlignment(.center) 22 | .padding() 23 | .background( 24 | RoundedRectangle(cornerRadius: 10) 25 | .fill(Color.white) 26 | .shadow(color: .gray, radius: 5, x: 0, y: 2) 27 | ) 28 | .padding() 29 | 30 | if let buttonTitle = buttonTitle, let buttonAction = buttonAction { 31 | Button(action: buttonAction) { 32 | Text(buttonTitle) 33 | .frame(maxWidth: .infinity) 34 | .padding() 35 | .background(Color.blue) 36 | .foregroundColor(.white) 37 | .cornerRadius(8) 38 | } 39 | } 40 | } 41 | .padding() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/Views/HKQuantityInputView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HKQuantityInputView.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-09-17. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | import HealthKit 12 | 13 | struct HKQuantityInputView: View { 14 | var label: String 15 | @Binding var quantity: HKQuantity 16 | var unit: HKUnit 17 | var maxLength: Int 18 | var minValue: HKQuantity 19 | var maxValue: HKQuantity 20 | @FocusState.Binding var isFocused: Bool 21 | 22 | var onValidationError: (String) -> Void 23 | 24 | var body: some View { 25 | HStack { 26 | Text(label) 27 | Spacer() 28 | TextFieldWithToolBar( 29 | quantity: $quantity, 30 | maxLength: maxLength, 31 | unit: unit, 32 | minValue: minValue, 33 | maxValue: maxValue, 34 | onValidationError: onValidationError 35 | ) 36 | .focused($isFocused) 37 | Text(unit.localizedShortUnitString) 38 | .foregroundColor(.secondary) 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /LoopFollow/Helpers/Views/LoadingButtonView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingButtonView.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-09-17. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct LoadingButtonView: View { 12 | var buttonText: String 13 | var progressText: String 14 | var isLoading: Bool 15 | var action: () -> Void 16 | var isDisabled: Bool = false 17 | 18 | var body: some View { 19 | Section { 20 | VStack { 21 | if isLoading { 22 | HStack { 23 | ProgressView() 24 | .padding(.trailing, 10) 25 | Text(progressText) 26 | } 27 | .padding() 28 | } else { 29 | Button(action: { 30 | action() 31 | }) { 32 | Text(buttonText) 33 | .frame(maxWidth: .infinity) 34 | } 35 | .buttonStyle(.borderedProminent) 36 | .controlSize(.large) 37 | .disabled(isDisabled) 38 | } 39 | } 40 | .frame(maxWidth: .infinity, alignment: .center) 41 | .listRowInsets(EdgeInsets()) 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /LoopFollow/InfoDisplaySettings/InfoDisplaySettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfoDisplaySettingsViewModel.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-08-05. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | 12 | class InfoDisplaySettingsViewModel: ObservableObject { 13 | @Published var infoSort: [Int] 14 | @Published var infoVisible: [Bool] 15 | 16 | init() { 17 | self.infoSort = UserDefaultsRepository.infoSort.value 18 | self.infoVisible = UserDefaultsRepository.infoVisible.value 19 | } 20 | 21 | func toggleVisibility(for sortedIndex: Int) { 22 | infoVisible[sortedIndex].toggle() 23 | UserDefaultsRepository.infoVisible.value = infoVisible 24 | } 25 | 26 | func move(from source: IndexSet, to destination: Int) { 27 | infoSort.move(fromOffsets: source, toOffset: destination) 28 | UserDefaultsRepository.infoSort.value = infoSort 29 | } 30 | 31 | func getName(for index: Int) -> String { 32 | guard let infoType = InfoType(rawValue: index) else { 33 | return "Unknown" 34 | } 35 | return infoType.name 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /LoopFollow/InfoTable/InfoData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfoData.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-11. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class InfoData { 12 | var name: String 13 | var value: String 14 | 15 | init(name: String, value: String = "") { 16 | self.name = name 17 | self.value = value 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LoopFollow/InfoTable/InfoDataSeparator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfoDataSeparator.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-16. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum InfoDataSeparator: String { 12 | case arrow = "→" 13 | case slash = "/" 14 | case dash = "-" 15 | } 16 | -------------------------------------------------------------------------------- /LoopFollow/Log/LogEntry.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogEntry.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-13. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct LogEntry: Identifiable { 12 | let id: UUID 13 | let text: String 14 | } 15 | -------------------------------------------------------------------------------- /LoopFollow/Log/SearchBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchBar.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-13. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import UIKit 11 | 12 | struct SearchBar: UIViewRepresentable { 13 | @Binding var text: String 14 | 15 | class Coordinator: NSObject, UISearchBarDelegate { 16 | @Binding var text: String 17 | 18 | init(text: Binding) { 19 | _text = text 20 | } 21 | 22 | func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 23 | text = searchText 24 | } 25 | 26 | func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 27 | searchBar.resignFirstResponder() 28 | } 29 | } 30 | 31 | func makeCoordinator() -> Coordinator { 32 | return Coordinator(text: $text) 33 | } 34 | 35 | func makeUIView(context: UIViewRepresentableContext) -> UISearchBar { 36 | let searchBar = UISearchBar(frame: .zero) 37 | searchBar.placeholder = "Search Log" 38 | searchBar.delegate = context.coordinator 39 | searchBar.autocapitalizationType = .none 40 | searchBar.searchBarStyle = .minimal 41 | return searchBar 42 | } 43 | 44 | func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext) { 45 | uiView.text = text 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /LoopFollow/Loop Follow.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.device.bluetooth 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.personal-information.calendars 12 | 13 | com.apple.security.personal-information.photos-library 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /LoopFollow/LoopFollow.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | LoopFollow.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /LoopFollow/LoopFollow.xcdatamodeld/LoopFollow.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /LoopFollow/Metric/CarbMetric.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CarbMetric.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-17. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class CarbMetric: Metric { 12 | init?(from dictionary: [String: AnyObject], key: String) { 13 | guard let value = dictionary[key] as? Double else { 14 | return nil 15 | } 16 | super.init(value: value, maxFractionDigits: 0, minFractionDigits: 0) 17 | } 18 | 19 | init?(from object: AnyObject?, key: String) { 20 | guard let dictionary = object as? [String: AnyObject], let value = dictionary[key] as? Double else { 21 | return nil 22 | } 23 | super.init(value: value, maxFractionDigits: 0, minFractionDigits: 0) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LoopFollow/Metric/InsulinMetric.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InsulinMetric.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-17. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class InsulinMetric: Metric { 12 | init?(from dictionary: [String: AnyObject], key: String) { 13 | guard let value = dictionary[key] as? Double else { 14 | return nil 15 | } 16 | super.init(value: value, maxFractionDigits: 2, minFractionDigits: 0) 17 | } 18 | 19 | init?(from object: AnyObject?, key: String) { 20 | guard let dictionary = object as? [String: AnyObject], let value = dictionary[key] as? Double else { 21 | return nil 22 | } 23 | super.init(value: value, maxFractionDigits: 2, minFractionDigits: 0) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LoopFollow/Metric/Metric.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Metric.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-17. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Metric { 12 | var value: Double 13 | var maxFractionDigits: Int 14 | var minFractionDigits: Int 15 | 16 | init(value: Double, maxFractionDigits: Int, minFractionDigits: Int) { 17 | self.value = value 18 | self.maxFractionDigits = maxFractionDigits 19 | self.minFractionDigits = minFractionDigits 20 | } 21 | 22 | func formattedValue() -> String { 23 | return Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LoopFollow/Remote/Loop/LoopNightscoutRemoteView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoopNightscoutRemoteView.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-14. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct LoopNightscoutRemoteView: View { 12 | @Environment(\.presentationMode) var presentationMode 13 | @ObservedObject var nsAdmin = ObservableUserDefaults.shared.nsWriteAuth 14 | 15 | var body: some View { 16 | NavigationView { 17 | if !nsAdmin.value { 18 | ErrorMessageView( 19 | message: "Please update your token to include the 'admin' role in order to do remote commands with Loop." 20 | )} else { 21 | VStack { 22 | let columns = [ 23 | GridItem(.flexible(), spacing: 16), 24 | GridItem(.flexible(), spacing: 16) 25 | ] 26 | 27 | LazyVGrid(columns: columns, spacing: 16) { 28 | CommandButtonView(command: "Overrides", iconName: "slider.horizontal.3", destination: LoopOverrideView()) 29 | } 30 | .padding(.horizontal) 31 | 32 | Spacer() 33 | } 34 | .navigationBarTitle("Loop Remote Control", displayMode: .inline) 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Remote/NoRemoteView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NoRemoteView.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-14. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct NoRemoteView: View { 12 | private let remoteController = TrioNightscoutRemoteController() 13 | 14 | var body: some View { 15 | NavigationView { 16 | VStack { 17 | ErrorMessageView( 18 | message: "Remote commands are currently only available for Trio and Loop." 19 | ) 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LoopFollow/Remote/RemoteType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemoteType.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-08-18. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum RemoteType: String, Codable { 12 | case none = "None" 13 | case nightscout = "Nightscout" 14 | case trc = "Trio Remote Control" 15 | } 16 | -------------------------------------------------------------------------------- /LoopFollow/Remote/TRC/TRCCommandType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TRCCommandType.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-10-05. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum TRCCommandType: String { 12 | case bolus = "bolus" 13 | case tempTarget = "temp_target" 14 | case cancelTempTarget = "cancel_temp_target" 15 | case meal = "meal" 16 | case startOverride = "start_override" 17 | case cancelOverride = "cancel_override" 18 | } 19 | -------------------------------------------------------------------------------- /LoopFollow/Remote/TRC/TreatmentResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TreatmentResponse.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-24. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct TreatmentResponse: Decodable { 12 | let enteredBy: String 13 | let eventType: String 14 | let reason: String 15 | let targetTop: Double 16 | let targetBottom: Double 17 | let duration: Int 18 | let createdAt: String 19 | let utcOffset: Int 20 | let id: String 21 | 22 | enum CodingKeys: String, CodingKey { 23 | case enteredBy = "enteredBy" 24 | case eventType = "eventType" 25 | case reason = "reason" 26 | case targetTop = "targetTop" 27 | case targetBottom = "targetBottom" 28 | case duration = "duration" 29 | case createdAt = "created_at" 30 | case utcOffset = "utcOffset" 31 | case id = "_id" 32 | } 33 | } 34 | 35 | struct TreatmentCancelResponse: Decodable { 36 | let enteredBy: String 37 | let eventType: String 38 | let reason: String 39 | let duration: Int 40 | let createdAt: String 41 | let utcOffset: Int 42 | let id: String 43 | 44 | enum CodingKeys: String, CodingKey { 45 | case enteredBy = "enteredBy" 46 | case eventType = "eventType" 47 | case reason = "reason" 48 | case duration = "duration" 49 | case createdAt = "created_at" 50 | case utcOffset = "utcOffset" 51 | case id = "_id" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /LoopFollow/Remote/TRC/TrioRemoteControlViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrioRemoteControlViewModel.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-08-25. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class TrioRemoteControlViewModel: ObservableObject { 12 | } 13 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/1-millisecond-of-silence.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/1-millisecond-of-silence.mp3 -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/20ms-of-silence.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/20ms-of-silence.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/500ms-of-silence.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/500ms-of-silence.mp3 -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Alarm_Buzzer.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alarm_Buzzer.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Alarm_Clock.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alarm_Clock.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Alert_Tone_Busy.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Busy.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_1.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_1.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_2.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_2.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Alien_Siren.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alien_Siren.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Ambulance.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Ambulance.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Analog_Watch_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Analog_Watch_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Big_Clock_Ticking.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Big_Clock_Ticking.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_1.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_1.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_2.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_2.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/CSFX-2_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/CSFX-2_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Climb_Sneaky.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Climb_Sneaky.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Then_Descend.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Then_Descend.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Bounce_To_Ceiling.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Bounce_To_Ceiling.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Dreamy_Glissando_Harp.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Dreamy_Glissando_Harp.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Fail_Strings_Trumpet.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Fail_Strings_Trumpet.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Machine_Clumsy_Loop.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Machine_Clumsy_Loop.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Siren.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Siren.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Tip_Toe_Sneaky_Walk.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Tip_Toe_Sneaky_Walk.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Uh_Oh.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Uh_Oh.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cartoon_Villain_Horns.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Villain_Horns.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cell_Phone_Ring_Tone.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cell_Phone_Ring_Tone.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Chimes_Glassy.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Chimes_Glassy.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Computer_Magic.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Computer_Magic.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Cuckoo_Clock.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cuckoo_Clock.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Dhol_Shuffleloop.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Dhol_Shuffleloop.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Discreet.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Discreet.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Early_Sunrise.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Early_Sunrise.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Emergency_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Carbon_Monoxide.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Carbon_Monoxide.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Siren.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Siren.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Ending_Reached.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Ending_Reached.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Fly.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Fly.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Ghost_Hover.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Ghost_Hover.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Good_Morning.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Good_Morning.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Hell_Yeah_Somewhat_Calmer.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Hell_Yeah_Somewhat_Calmer.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/In_A_Hurry.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/In_A_Hurry.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Indeed.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Indeed.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Insistently.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Insistently.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Jingle_All_The_Way.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Jingle_All_The_Way.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Laser_Shoot.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Laser_Shoot.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Machine_Charge.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Machine_Charge.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Magical_Twinkle.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Magical_Twinkle.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Marching_Heavy_Footed_Fat_Elephants.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Marching_Heavy_Footed_Fat_Elephants.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Marimba_Descend.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Marimba_Descend.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Marimba_Flutter_or_Shake.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Marimba_Flutter_or_Shake.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Martian_Gun.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Martian_Gun.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Martian_Scanner.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Martian_Scanner.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Metallic.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Metallic.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Nightguard.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Nightguard.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Not_Kiddin.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Not_Kiddin.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Open_Your_Eyes_And_See.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Open_Your_Eyes_And_See.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Orchestral_Horns.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Orchestral_Horns.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Oringz.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Oringz.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Pager_Beeps.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Pager_Beeps.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Remembers_Me_Of_Asia.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Remembers_Me_Of_Asia.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Rise_And_Shine.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Rise_And_Shine.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Rush.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Rush.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Air_Raid_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Air_Raid_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_1.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_1.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_2.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_2.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_3.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_3.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_4.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_4.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Computer_Console_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Computer_Console_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Console_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Console_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Eerie_Alarm.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Eerie_Alarm.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Engine_Shut_Down.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Engine_Shut_Down.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Incoming_Message_Alert.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Incoming_Message_Alert.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Message.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Message.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Warm_Up.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Warm_Up.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sci-Fi_Warning.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Warning.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Signature_Corporate.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Signature_Corporate.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Calibration_Needed.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Calibration_Needed.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Device_Muted.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Device_Muted.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Dropping_Fast.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Dropping_Fast.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Rising_Fast.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Rising_Fast.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_High_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_High_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Low_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Low_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Missed_Readings.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Missed_Readings.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Transmitter_Battery_Low.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Transmitter_Battery_Low.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_High_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_High_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_Low_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_Low_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Calibration_Needed.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Calibration_Needed.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Device_Muted.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Device_Muted.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Dropping_Fast.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Dropping_Fast.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Rising_Fast.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Rising_Fast.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_High_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_High_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Low_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Low_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Missed_Readings.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Missed_Readings.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Transmitter_Battery_Low.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Transmitter_Battery_Low.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Urgent_High_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Urgent_High_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Siri_Urgent_Low_Glucose.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Urgent_Low_Glucose.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Soft_Marimba_Pad_Positive.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Soft_Marimba_Pad_Positive.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Optimistic.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Optimistic.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Reassuring.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Reassuring.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Store_Door_Chime.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Store_Door_Chime.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Sunny.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sunny.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Thunder_Sound_FX.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Thunder_Sound_FX.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Time_Has_Come.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Time_Has_Come.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Tornado_Siren.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Tornado_Siren.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Two_Turtle_Doves.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Two_Turtle_Doves.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Unpaved.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Unpaved.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Wake_Up_Will_You.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Wake_Up_Will_You.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Win_Gain.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Win_Gain.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/Wrong_Answer.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Wrong_Answer.caf -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/alarm-notification.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/alarm-notification.m4a -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/alarm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/alarm.mp3 -------------------------------------------------------------------------------- /LoopFollow/Resources/Alarm Sounds/silence-1sec.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/silence-1sec.mp3 -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120-1.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-1.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-2.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58-1.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80-1.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.500", 8 | "blue" : "0.988", 9 | "green" : "0.588", 10 | "red" : "0.118" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "0.500", 26 | "blue" : "0.988", 27 | "green" : "0.588", 28 | "red" : "0.118" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "0.288", 10 | "red" : "0.118" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "0.288", 28 | "red" : "0.118" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/Insulin.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.988", 9 | "green" : "0.588", 10 | "red" : "0.118" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.988", 27 | "green" : "0.588", 28 | "red" : "0.118" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.089", 9 | "green" : "0.940", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.089", 27 | "green" : "0.940", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/LoopGray.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.741", 9 | "green" : "0.741", 10 | "red" : "0.741" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.741", 27 | "green" : "0.741", 28 | "red" : "0.741" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/LoopGreen.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.592", 9 | "green" : "0.812", 10 | "red" : "0.435" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.592", 27 | "green" : "0.812", 28 | "red" : "0.435" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/LoopPink.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.796", 9 | "green" : "0.750", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.796", 27 | "green" : "0.750", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/LoopRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.341", 9 | "green" : "0.341", 10 | "red" : "0.922" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.341", 27 | "green" : "0.341", 28 | "red" : "0.922" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/LoopYellow.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.271", 9 | "green" : "0.757", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.271", 27 | "green" : "0.757", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/ManualTempBasal.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.988", 9 | "green" : "0.588", 10 | "red" : "0.118" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.988", 27 | "green" : "0.588", 28 | "red" : "0.118" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/NonPumpInsulin.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "250", 9 | "green" : "213", 10 | "red" : "63" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "250", 27 | "green" : "213", 28 | "red" : "63" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/SMB.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "194", 9 | "green" : "117", 10 | "red" : "58" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "194", 27 | "green" : "117", 28 | "red" : "58" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/TempBasal.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.500", 8 | "blue" : "0.976", 9 | "green" : "0.839", 10 | "red" : "0.635" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.988", 27 | "green" : "0.588", 28 | "red" : "0.118" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/UAM.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.271", 9 | "green" : "0.518", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.271", 27 | "green" : "0.518", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/ZT.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.937", 9 | "green" : "0.380", 10 | "red" : "0.443" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.937", 27 | "green" : "0.380", 28 | "red" : "0.443" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "extended-gray", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "white" : "0.145" 9 | } 10 | }, 11 | "idiom" : "universal" 12 | }, 13 | { 14 | "appearances" : [ 15 | { 16 | "appearance" : "luminosity", 17 | "value" : "dark" 18 | } 19 | ], 20 | "color" : { 21 | "color-space" : "extended-gray", 22 | "components" : { 23 | "alpha" : "1.000", 24 | "white" : "0.145" 25 | } 26 | }, 27 | "idiom" : "universal" 28 | } 29 | ], 30 | "info" : { 31 | "author" : "xcode", 32 | "version" : 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/minus.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.976", 9 | "green" : "0.839", 10 | "red" : "0.635" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.976", 27 | "green" : "0.839", 28 | "red" : "0.635" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Colors/warning.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.269", 9 | "green" : "0.763", 10 | "red" : "0.917" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "platform" : "ios", 24 | "reference" : "systemYellowColor" 25 | }, 26 | "idiom" : "universal" 27 | } 28 | ], 29 | "info" : { 30 | "author" : "xcode", 31 | "version" : 1 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/first.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "first.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/first.imageset/first.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/first.imageset/first.pdf -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/second.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "second.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /LoopFollow/Resources/Assets.xcassets/second.imageset/second.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/second.imageset/second.pdf -------------------------------------------------------------------------------- /LoopFollow/Resources/blank.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/blank.wav -------------------------------------------------------------------------------- /LoopFollow/Resources/dragbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/dragbar.png -------------------------------------------------------------------------------- /LoopFollow/Resources/silence.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/silence.mp3 -------------------------------------------------------------------------------- /LoopFollow/Storage/Observable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-25. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import HealthKit 11 | 12 | class Observable { 13 | static let shared = Observable() 14 | 15 | var tempTarget = ObservableValue(default: nil) 16 | var override = ObservableValue(default: nil) 17 | var lastRecBolusTriggered = ObservableValue(default: nil) 18 | 19 | private init() {} 20 | } 21 | -------------------------------------------------------------------------------- /LoopFollow/Storage/ObservableUserDefaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObservableUserDefaults.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-24. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Combine 11 | 12 | class ObservableUserDefaults { 13 | static let shared = ObservableUserDefaults() 14 | 15 | var url = ObservableUserDefaultsValue(key: "url", default: "") 16 | var device = ObservableUserDefaultsValue(key: "device", default: "") 17 | var nsWriteAuth = ObservableUserDefaultsValue(key: "nsWriteAuth", default: false) 18 | var nsAdminAuth = ObservableUserDefaultsValue(key: "nsAdminAuth", default: false) 19 | 20 | private init() {} 21 | } 22 | -------------------------------------------------------------------------------- /LoopFollow/Storage/ObservableValue.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObservableValue.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-07-25. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Combine 11 | import HealthKit 12 | import SwiftUI 13 | 14 | class ObservableValue: ObservableObject { 15 | @Published var value: T 16 | 17 | init(default: T) { 18 | self.value = `default` 19 | } 20 | 21 | func set(_ newValue: T) { 22 | print("Setting new value: \(newValue)") 23 | DispatchQueue.main.async { 24 | self.value = newValue 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LoopFollow/Storage/SecureStorageValue.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SecureStorageValue.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-09-16. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Combine 11 | 12 | class SecureStorageValue: ObservableObject { 13 | let key: String 14 | 15 | @Published var value: T { 16 | didSet { 17 | guard self.value != oldValue else { return } 18 | if let data = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true) { 19 | SecureStorageValue.defaults.set(data, forKey: key) 20 | } 21 | } 22 | } 23 | 24 | var exists: Bool { 25 | return SecureStorageValue.defaults.object(forKey: key) != nil 26 | } 27 | 28 | private static var defaults: UserDefaults { 29 | return UserDefaults.standard 30 | } 31 | 32 | init(key: String, defaultValue: T) { 33 | self.key = key 34 | if let data = SecureStorageValue.defaults.data(forKey: key), 35 | let decodedValue = try? NSKeyedUnarchiver.unarchivedObject(ofClass: T.self, from: data) { 36 | self.value = decodedValue 37 | } else { 38 | self.value = defaultValue 39 | } 40 | } 41 | 42 | func remove() { 43 | SecureStorageValue.defaults.removeObject(forKey: key) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /LoopFollow/Storage/StorageValue.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StorageValue.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2024-08-25. 6 | // Copyright © 2024 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Combine 11 | 12 | class StorageValue: ObservableObject { 13 | let key: String 14 | 15 | @Published var value: T { 16 | didSet { 17 | guard self.value != oldValue else { return } 18 | 19 | if let encodedData = try? JSONEncoder().encode(value) { 20 | StorageValue.defaults.set(encodedData, forKey: key) 21 | } 22 | } 23 | } 24 | 25 | var exists: Bool { 26 | return StorageValue.defaults.object(forKey: key) != nil 27 | } 28 | 29 | private static var defaults: UserDefaults { 30 | return UserDefaults.standard 31 | } 32 | 33 | init(key: String, defaultValue: T) { 34 | self.key = key 35 | 36 | if let data = StorageValue.defaults.data(forKey: key), 37 | let decodedValue = try? JSONDecoder().decode(T.self, from: data) { 38 | self.value = decodedValue 39 | } else { 40 | self.value = defaultValue 41 | } 42 | } 43 | 44 | func remove() { 45 | StorageValue.defaults.removeObject(forKey: key) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /LoopFollow/Storage/UserData.xcdatamodeld/UserData.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /LoopFollow/Task/AlarmTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlarmTask.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-12. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | func scheduleAlarmTask(initialDelay: TimeInterval = 30) { 13 | let firstRun = Date().addingTimeInterval(initialDelay) 14 | TaskScheduler.shared.scheduleTask(id: .alarmCheck, nextRun: firstRun) { [weak self] in 15 | guard let self = self else { return } 16 | self.alarmTaskAction() 17 | } 18 | } 19 | 20 | func alarmTaskAction() { 21 | DispatchQueue.main.async { 22 | if self.bgData.count > 0 { 23 | self.checkAlarms(bgs: self.bgData) 24 | } 25 | if self.overrideGraphData.count > 0 { 26 | self.checkOverrideAlarms() 27 | } 28 | if self.tempTargetGraphData.count > 0 { 29 | self.checkTempTargetAlarms() 30 | } 31 | 32 | TaskScheduler.shared.rescheduleTask(id: .alarmCheck, to: Date().addingTimeInterval(30)) 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LoopFollow/Task/BGTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BGTask.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-11. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | func scheduleBGTask(initialDelay: TimeInterval = 2) { 13 | let firstRun = Date().addingTimeInterval(initialDelay) 14 | TaskScheduler.shared.scheduleTask(id: .fetchBG, nextRun: firstRun) { [weak self] in 15 | guard let self = self else { return } 16 | self.bgTaskAction() 17 | } 18 | } 19 | 20 | func bgTaskAction() { 21 | // If anything goes wrong, try again in 60 seconds. 22 | TaskScheduler.shared.rescheduleTask( 23 | id: .fetchBG, 24 | to: Date().addingTimeInterval(60) 25 | ) 26 | 27 | // If no Dexcom credentials and no Nightscout, schedule a retry in 60 seconds. 28 | if UserDefaultsRepository.shareUserName.value == "", 29 | UserDefaultsRepository.sharePassword.value == "", 30 | !IsNightscoutEnabled() 31 | { 32 | return 33 | } 34 | 35 | // If Dexcom credentials exist, fetch from DexShare 36 | if UserDefaultsRepository.shareUserName.value != "" && 37 | UserDefaultsRepository.sharePassword.value != "" 38 | { 39 | self.webLoadDexShare() 40 | } else { 41 | self.webLoadNSBGData() 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /LoopFollow/Task/CalendarTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CalendarTask.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-12. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | func scheduleCalendarTask(initialDelay: TimeInterval = 15) { 13 | let startTime = Date().addingTimeInterval(initialDelay) 14 | TaskScheduler.shared.scheduleTask(id: .calendarWrite, nextRun: startTime) { [weak self] in 15 | guard let self = self else { return } 16 | self.calendarTaskAction() 17 | } 18 | } 19 | 20 | func calendarTaskAction() { 21 | if UserDefaultsRepository.writeCalendarEvent.value, 22 | !UserDefaultsRepository.calendarIdentifier.value.isEmpty 23 | { 24 | self.writeCalendar() 25 | } 26 | 27 | TaskScheduler.shared.rescheduleTask(id: .calendarWrite, to: Date().addingTimeInterval(30)) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LoopFollow/Task/DeviceStatusTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeviceStatusTask.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-11. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | func scheduleDeviceStatusTask(initialDelay: TimeInterval = 4) { 13 | let startTime = Date().addingTimeInterval(initialDelay) 14 | TaskScheduler.shared.scheduleTask(id: .deviceStatus, nextRun: startTime) { [weak self] in 15 | guard let self = self else { return } 16 | self.deviceStatusAction() 17 | } 18 | } 19 | 20 | func deviceStatusAction() { 21 | // If no NS config, we wait 60s before trying again: 22 | guard IsNightscoutEnabled() else { 23 | TaskScheduler.shared.rescheduleTask(id: .deviceStatus, to: Date().addingTimeInterval(60)) 24 | return 25 | } 26 | 27 | webLoadNSDeviceStatus() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LoopFollow/Task/ProfileTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileTask.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-11. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | func scheduleProfileTask(initialDelay: TimeInterval = 3) { 13 | let firstRun = Date().addingTimeInterval(initialDelay) 14 | 15 | TaskScheduler.shared.scheduleTask(id: .profile, nextRun: firstRun) { [weak self] in 16 | guard let self = self else { return } 17 | self.profileTaskAction() 18 | } 19 | } 20 | 21 | func profileTaskAction() { 22 | guard IsNightscoutEnabled() else { 23 | TaskScheduler.shared.rescheduleTask(id: .profile, to: Date().addingTimeInterval(60)) 24 | return 25 | } 26 | 27 | self.webLoadNSProfile() 28 | 29 | TaskScheduler.shared.rescheduleTask(id: .profile, to: Date().addingTimeInterval(10 * 60)) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LoopFollow/Task/Task.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Task.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-12. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | 13 | func scheduleAllTasks() { 14 | scheduleBGTask() 15 | scheduleProfileTask() 16 | scheduleDeviceStatusTask() 17 | scheduleTreatmentsTask() 18 | scheduleMinAgoTask() 19 | scheduleCalendarTask() 20 | scheduleAlarmTask() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LoopFollow/Task/TreatmentsTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TreatmentsTask.swift 3 | // LoopFollow 4 | // 5 | // Created by Jonas Björkert on 2025-01-11. 6 | // Copyright © 2025 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension MainViewController { 12 | func scheduleTreatmentsTask(initialDelay: TimeInterval = 5) { 13 | let firstRun = Date().addingTimeInterval(initialDelay) 14 | TaskScheduler.shared.scheduleTask(id: .treatments, nextRun: firstRun) { [weak self] in 15 | guard let self = self else { return } 16 | self.treatmentsTaskAction() 17 | } 18 | } 19 | 20 | func treatmentsTaskAction() { 21 | // If Nightscout not enabled, wait 60s and try again 22 | guard IsNightscoutEnabled(), UserDefaultsRepository.downloadTreatments.value else { 23 | TaskScheduler.shared.rescheduleTask(id: .treatments, to: Date().addingTimeInterval(60)) 24 | return 25 | } 26 | 27 | WebLoadNSTreatments() 28 | 29 | TaskScheduler.shared.rescheduleTask(id: .treatments, to: Date().addingTimeInterval(2 * 60)) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LoopFollow/ViewControllers/AppStateViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppStateViewController.swift 3 | // LoopFollow 4 | // 5 | // Created by Jose Paredes on 7/17/20. 6 | // Copyright © 2020 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class AppStateViewController { 12 | var appStateController: AppStateController? 13 | } 14 | -------------------------------------------------------------------------------- /LoopFollow/ViewControllers/DebugViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DebugViewController.swift 3 | // LoopFollow 4 | // 5 | // Created by Jon Fawcett on 6/29/20. 6 | // Copyright © 2020 Jon Fawcett. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class debugViewController: UIViewController { 13 | 14 | 15 | var appStateController: AppStateController? 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | 20 | } 21 | 22 | 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /LoopFollowDisplayNameConfig.xcconfig: -------------------------------------------------------------------------------- 1 | // 2 | // LoopFollowDisplayNameConfig.xcconfig 3 | // 4 | // Use this file to configure instance-specific settings for LoopFollow. 5 | // 6 | 7 | // App Suffix: Used to differentiate AppGroupIdentifier between different app instances. 8 | app_suffix = 9 | 10 | // Custom Display Name for Your LoopFollow App 11 | // --------------------------------------------- 12 | // The 'display_name' field allows you to personalize the name of this LoopFollow app instance. 13 | // This name appears on your device and helps to distinguish between different LoopFollow instances. 14 | // 15 | // How to Set: 16 | // 1. Replace 'LoopFollow' with the desired name of your app. 17 | // 2. Save the file and build the app for the changes to take effect. 18 | // 19 | display_name = LoopFollow 20 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | target 'LoopFollow' do 2 | use_frameworks! 3 | 4 | pod 'Charts' 5 | pod 'Eureka', :git => 'https://github.com/xmartlabs/Eureka.git' 6 | pod 'ShareClient', :git => 'https://github.com/loopandlearn/dexcom-share-client-swift.git', :branch => 'loopfollow' 7 | 8 | end 9 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Charts (4.1.0): 3 | - Charts/Core (= 4.1.0) 4 | - Charts/Core (4.1.0): 5 | - SwiftAlgorithms (~> 1.0) 6 | - Eureka (5.3.6) 7 | - ShareClient (1.2) 8 | - SwiftAlgorithms (1.0.0) 9 | 10 | DEPENDENCIES: 11 | - Charts 12 | - Eureka (from `https://github.com/xmartlabs/Eureka.git`) 13 | - ShareClient (from `https://github.com/loopandlearn/dexcom-share-client-swift.git`, branch `loopfollow`) 14 | 15 | SPEC REPOS: 16 | trunk: 17 | - Charts 18 | - SwiftAlgorithms 19 | 20 | EXTERNAL SOURCES: 21 | Eureka: 22 | :git: https://github.com/xmartlabs/Eureka.git 23 | ShareClient: 24 | :branch: loopfollow 25 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git 26 | 27 | CHECKOUT OPTIONS: 28 | Eureka: 29 | :commit: 044e31674d319c8edb19d993a5f8ea4e24641542 30 | :git: https://github.com/xmartlabs/Eureka.git 31 | ShareClient: 32 | :commit: d7a3323a014d41827ee177a92d528786f9f09e75 33 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git 34 | 35 | SPEC CHECKSUMS: 36 | Charts: ce0768268078eee0336f122c3c4ca248e4e204c5 37 | Eureka: 28ad9dec6286cd7cd601fdf8e8df39bb7356a8f4 38 | ShareClient: 60b911c95e73b0ea9c5aad6d194a9c6b5f34b741 39 | SwiftAlgorithms: 38dda4731d19027fdeee1125f973111bf3386b53 40 | 41 | PODFILE CHECKSUM: d241dda366d5454279fe3ff8869458d19e1bbebb 42 | 43 | COCOAPODS: 1.12.1 44 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Charts/BubbleChartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BubbleChartView.swift 3 | // Charts 4 | // 5 | // Bubble chart implementation: 6 | // Copyright 2015 Pierre-Marc Airoldi 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | open class BubbleChartView: BarLineChartViewBase, BubbleChartDataProvider 16 | { 17 | open override func initialize() 18 | { 19 | super.initialize() 20 | 21 | renderer = BubbleChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler) 22 | } 23 | 24 | // MARK: - BubbleChartDataProvider 25 | 26 | open var bubbleData: BubbleChartData? { return data as? BubbleChartData } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Charts/CandleStickChartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CandleStickChartView.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | /// Financial chart type that draws candle-sticks. 16 | open class CandleStickChartView: BarLineChartViewBase, CandleChartDataProvider 17 | { 18 | internal override func initialize() 19 | { 20 | super.initialize() 21 | 22 | renderer = CandleStickChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler) 23 | 24 | self.xAxis.spaceMin = 0.5 25 | self.xAxis.spaceMax = 0.5 26 | } 27 | 28 | // MARK: - CandleChartDataProvider 29 | 30 | open var candleData: CandleChartData? 31 | { 32 | return data as? CandleChartData 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Charts/LineChartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LineChartView.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | /// Chart that draws lines, surfaces, circles, ... 16 | open class LineChartView: BarLineChartViewBase, LineChartDataProvider 17 | { 18 | internal override func initialize() 19 | { 20 | super.initialize() 21 | 22 | renderer = LineChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler) 23 | } 24 | 25 | // MARK: - LineChartDataProvider 26 | 27 | open var lineData: LineChartData? { return data as? LineChartData } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Charts/ScatterChartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScatterChartView.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | /// The ScatterChart. Draws dots, triangles, squares and custom shapes into the chartview. 16 | open class ScatterChartView: BarLineChartViewBase, ScatterChartDataProvider 17 | { 18 | open override func initialize() 19 | { 20 | super.initialize() 21 | 22 | renderer = ScatterChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler) 23 | 24 | xAxis.spaceMin = 0.5 25 | xAxis.spaceMax = 0.5 26 | } 27 | 28 | // MARK: - ScatterChartDataProvider 29 | 30 | open var scatterData: ScatterChartData? { return data as? ScatterChartData } 31 | } 32 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Components/ComponentBase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ComponentBase.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | 16 | /// This class encapsulates everything both Axis, Legend and LimitLines have in common 17 | @objc(ChartComponentBase) 18 | open class ComponentBase: NSObject 19 | { 20 | /// flag that indicates if this component is enabled or not 21 | @objc open var enabled = true 22 | 23 | /// The offset this component has on the x-axis 24 | /// **default**: 5.0 25 | @objc open var xOffset = CGFloat(5.0) 26 | 27 | /// The offset this component has on the x-axis 28 | /// **default**: 5.0 (or 0.0 on ChartYAxis) 29 | @objc open var yOffset = CGFloat(5.0) 30 | 31 | public override init() 32 | { 33 | super.init() 34 | } 35 | 36 | @objc open var isEnabled: Bool { return enabled } 37 | } 38 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Components/Description.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Description.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | #if canImport(UIKit) 16 | import UIKit 17 | #endif 18 | 19 | #if canImport(Cocoa) 20 | import Cocoa 21 | #endif 22 | 23 | @objc(ChartDescription) 24 | open class Description: ComponentBase 25 | { 26 | public override init() 27 | { 28 | #if os(tvOS) 29 | // 23 is the smallest recommended font size on the TV 30 | font = .systemFont(ofSize: 23) 31 | #elseif os(OSX) 32 | font = .systemFont(ofSize: NSUIFont.systemFontSize) 33 | #else 34 | font = .systemFont(ofSize: 8.0) 35 | #endif 36 | 37 | super.init() 38 | } 39 | 40 | /// The text to be shown as the description. 41 | @objc open var text: String? 42 | 43 | /// Custom position for the description text in pixels on the screen. 44 | open var position: CGPoint? = nil 45 | 46 | /// The text alignment of the description text. Default RIGHT. 47 | @objc open var textAlign: TextAlignment = TextAlignment.right 48 | 49 | /// Font object used for drawing the description text. 50 | @objc open var font: NSUIFont 51 | 52 | /// Text color used for drawing the description text 53 | @objc open var textColor = NSUIColor.labelOrBlack 54 | } 55 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BarLineScatterCandleBubbleChartData.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | open class BarLineScatterCandleBubbleChartData: ChartData 15 | { 16 | public required init() 17 | { 18 | super.init() 19 | } 20 | 21 | public override init(dataSets: [ChartDataSetProtocol]) 22 | { 23 | super.init(dataSets: dataSets) 24 | } 25 | 26 | public required init(arrayLiteral elements: ChartDataSetProtocol...) 27 | { 28 | super.init(dataSets: elements) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BarLineScatterCandleBubbleChartDataSet.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | 16 | open class BarLineScatterCandleBubbleChartDataSet: ChartDataSet, BarLineScatterCandleBubbleChartDataSetProtocol 17 | { 18 | // MARK: - Data functions and accessors 19 | 20 | // MARK: - Styling functions and accessors 21 | 22 | open var highlightColor = NSUIColor(red: 255.0/255.0, green: 187.0/255.0, blue: 115.0/255.0, alpha: 1.0) 23 | open var highlightLineWidth = CGFloat(0.5) 24 | open var highlightLineDashPhase = CGFloat(0.0) 25 | open var highlightLineDashLengths: [CGFloat]? 26 | 27 | // MARK: - NSCopying 28 | 29 | open override func copy(with zone: NSZone? = nil) -> Any 30 | { 31 | let copy = super.copy(with: zone) as! BarLineScatterCandleBubbleChartDataSet 32 | copy.highlightColor = highlightColor 33 | copy.highlightLineWidth = highlightLineWidth 34 | copy.highlightLineDashPhase = highlightLineDashPhase 35 | copy.highlightLineDashLengths = highlightLineDashLengths 36 | return copy 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BubbleChartData.swift 3 | // Charts 4 | // 5 | // Bubble chart implementation: 6 | // Copyright 2015 Pierre-Marc Airoldi 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | open class BubbleChartData: BarLineScatterCandleBubbleChartData 16 | { 17 | public required init() 18 | { 19 | super.init() 20 | } 21 | 22 | public override init(dataSets: [ChartDataSetProtocol]) 23 | { 24 | super.init(dataSets: dataSets) 25 | } 26 | 27 | public required init(arrayLiteral elements: ChartDataSetProtocol...) 28 | { 29 | super.init(dataSets: elements) 30 | } 31 | 32 | /// Sets the width of the circle that surrounds the bubble when highlighted for all DataSet objects this data object contains 33 | @objc open func setHighlightCircleWidth(_ width: CGFloat) 34 | { 35 | (_dataSets as? [BubbleChartDataSetProtocol])?.forEach { $0.highlightCircleWidth = width } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/CandleChartData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CandleChartData.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | open class CandleChartData: BarLineScatterCandleBubbleChartData 15 | { 16 | public required init() 17 | { 18 | super.init() 19 | } 20 | 21 | public override init(dataSets: [ChartDataSetProtocol]) 22 | { 23 | super.init(dataSets: dataSets) 24 | } 25 | 26 | public required init(arrayLiteral elements: ChartDataSetProtocol...) 27 | { 28 | super.init(dataSets: elements) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/LineChartData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LineChartData.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | /// Data object that encapsulates all data associated with a LineChart. 15 | open class LineChartData: ChartData 16 | { 17 | public required init() 18 | { 19 | super.init() 20 | } 21 | 22 | public override init(dataSets: [ChartDataSetProtocol]) 23 | { 24 | super.init(dataSets: dataSets) 25 | } 26 | 27 | public required init(arrayLiteral elements: ChartDataSetProtocol...) 28 | { 29 | super.init(dataSets: elements) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/RadarChartDataEntry.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RadarChartDataEntry.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | open class RadarChartDataEntry: ChartDataEntry 16 | { 17 | public required init() 18 | { 19 | super.init() 20 | } 21 | 22 | /// - Parameters: 23 | /// - value: The value on the y-axis. 24 | @objc public init(value: Double) 25 | { 26 | super.init(x: .nan, y: value) 27 | } 28 | 29 | /// - Parameters: 30 | /// - value: The value on the y-axis. 31 | /// - data: Spot for additional data this Entry represents. 32 | @objc public convenience init(value: Double, data: Any?) 33 | { 34 | self.init(value: value) 35 | self.data = data 36 | } 37 | 38 | // MARK: Data property accessors 39 | 40 | @objc open var value: Double 41 | { 42 | get { return y } 43 | set { y = newValue } 44 | } 45 | 46 | // MARK: NSCopying 47 | 48 | open override func copy(with zone: NSZone? = nil) -> Any 49 | { 50 | let copy = super.copy(with: zone) as! RadarChartDataEntry 51 | 52 | return copy 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScatterChartData.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | open class ScatterChartData: BarLineScatterCandleBubbleChartData 16 | { 17 | public required init() 18 | { 19 | super.init() 20 | } 21 | 22 | public override init(dataSets: [ChartDataSetProtocol]) 23 | { 24 | super.init(dataSets: dataSets) 25 | } 26 | 27 | public required init(arrayLiteral elements: ChartDataSetProtocol...) 28 | { 29 | super.init(dataSets: elements) 30 | } 31 | 32 | /// - Returns: The maximum shape-size across all DataSets. 33 | @objc open func getGreatestShapeSize() -> CGFloat 34 | { 35 | return (_dataSets as? [ScatterChartDataSetProtocol])? 36 | .max { $0.scatterShapeSize < $1.scatterShapeSize }? 37 | .scatterShapeSize ?? 0 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Interfaces/BarLineScatterCandleBubbleChartDataSetProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BarLineScatterCandleBubbleChartDataSetProtocol.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol BarLineScatterCandleBubbleChartDataSetProtocol: ChartDataSetProtocol 17 | { 18 | // MARK: - Data functions and accessors 19 | 20 | // MARK: - Styling functions and accessors 21 | 22 | var highlightColor: NSUIColor { get set } 23 | var highlightLineWidth: CGFloat { get set } 24 | var highlightLineDashPhase: CGFloat { get set } 25 | var highlightLineDashLengths: [CGFloat]? { get set } 26 | } 27 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Interfaces/BubbleChartDataSetProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BubbleChartDataSetProtocol.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol BubbleChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol 17 | { 18 | // MARK: - Data functions and accessors 19 | 20 | var maxSize: CGFloat { get } 21 | var isNormalizeSizeEnabled: Bool { get } 22 | 23 | // MARK: - Styling functions and accessors 24 | 25 | /// Sets/gets the width of the circle that surrounds the bubble when highlighted 26 | var highlightCircleWidth: CGFloat { get set } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Interfaces/LineScatterCandleRadarChartDataSetProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LineScatterCandleRadarChartDataSetProtocol.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | @objc 15 | public protocol LineScatterCandleRadarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol 16 | { 17 | // MARK: - Data functions and accessors 18 | 19 | // MARK: - Styling functions and accessors 20 | 21 | /// Enables / disables the horizontal highlight-indicator. If disabled, the indicator is not drawn. 22 | var drawHorizontalHighlightIndicatorEnabled: Bool { get set } 23 | 24 | /// Enables / disables the vertical highlight-indicator. If disabled, the indicator is not drawn. 25 | var drawVerticalHighlightIndicatorEnabled: Bool { get set } 26 | 27 | /// `true` if horizontal highlight indicator lines are enabled (drawn) 28 | var isHorizontalHighlightIndicatorEnabled: Bool { get } 29 | 30 | /// `true` if vertical highlight indicator lines are enabled (drawn) 31 | var isVerticalHighlightIndicatorEnabled: Bool { get } 32 | 33 | /// Enables / disables both vertical and horizontal highlight-indicators. 34 | /// :param: enabled 35 | func setDrawHighlightIndicators(_ enabled: Bool) 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Interfaces/RadarChartDataSetProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RadarChartDataSetProtocol.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol RadarChartDataSetProtocol: LineRadarChartDataSetProtocol 17 | { 18 | // MARK: - Data functions and accessors 19 | 20 | // MARK: - Styling functions and accessors 21 | 22 | /// flag indicating whether highlight circle should be drawn or not 23 | var drawHighlightCircleEnabled: Bool { get set } 24 | 25 | var isDrawHighlightCircleEnabled: Bool { get } 26 | 27 | var highlightCircleFillColor: NSUIColor? { get set } 28 | 29 | /// The stroke color for highlight circle. 30 | /// If `nil`, the color of the dataset is taken. 31 | var highlightCircleStrokeColor: NSUIColor? { get set } 32 | 33 | var highlightCircleStrokeAlpha: CGFloat { get set } 34 | 35 | var highlightCircleInnerRadius: CGFloat { get set } 36 | 37 | var highlightCircleOuterRadius: CGFloat { get set } 38 | 39 | var highlightCircleStrokeWidth: CGFloat { get set } 40 | } 41 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScatterChartDataSetProtocol.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol ScatterChartDataSetProtocol: LineScatterCandleRadarChartDataSetProtocol 17 | { 18 | // MARK: - Data functions and accessors 19 | 20 | // MARK: - Styling functions and accessors 21 | 22 | /// - Returns: The size the scatter shape will have 23 | var scatterShapeSize: CGFloat { get } 24 | 25 | /// - Returns: The radius of the hole in the shape (applies to Square, Circle and Triangle) 26 | /// Set this to <= 0 to remove holes. 27 | /// **default**: 0.0 28 | var scatterShapeHoleRadius: CGFloat { get } 29 | 30 | /// - Returns: Color for the hole in the shape. Setting to `nil` will behave as transparent. 31 | /// **default**: nil 32 | var scatterShapeHoleColor: NSUIColor? { get } 33 | 34 | /// - Returns: The ShapeRenderer responsible for rendering this DataSet. 35 | var shapeRenderer: ShapeRenderer? { get } 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Formatters/AxisValueFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AxisValueFormatter.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | /// An interface for providing custom axis Strings. 15 | @objc(ChartAxisValueFormatter) 16 | public protocol AxisValueFormatter: AnyObject 17 | { 18 | 19 | /// Called when a value from an axis is formatted before being drawn. 20 | /// 21 | /// For performance reasons, avoid excessive calculations and memory allocations inside this method. 22 | /// 23 | /// - Parameters: 24 | /// - value: the value that is currently being drawn 25 | /// - axis: the axis that the value belongs to 26 | /// - Returns: The customized label that is drawn on the x-axis. 27 | func stringForValue(_ value: Double, 28 | axis: AxisBase?) -> String 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Formatters/FillFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FillFormatter.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | /// Protocol for providing a custom logic to where the filling line of a LineDataSet should end. This of course only works if setFillEnabled(...) is set to true. 16 | @objc(ChartFillFormatter) 17 | public protocol FillFormatter 18 | { 19 | /// - Returns: The vertical (y-axis) position where the filled-line of the LineDataSet should end. 20 | func getFillLinePosition(dataSet: LineChartDataSetProtocol, dataProvider: LineChartDataProvider) -> CGFloat 21 | } 22 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Formatters/IndexAxisValueFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IndexAxisValueFormatter.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | /// This formatter is used for passing an array of x-axis labels, on whole x steps. 15 | @objc(ChartIndexAxisValueFormatter) 16 | open class IndexAxisValueFormatter: NSObject, AxisValueFormatter 17 | { 18 | @objc public var values: [String] = [String]() 19 | 20 | public override init() 21 | { 22 | super.init() 23 | 24 | } 25 | 26 | @objc public init(values: [String]) 27 | { 28 | super.init() 29 | 30 | self.values = values 31 | } 32 | 33 | @objc public static func with(values: [String]) -> IndexAxisValueFormatter? 34 | { 35 | return IndexAxisValueFormatter(values: values) 36 | } 37 | 38 | open func stringForValue(_ value: Double, 39 | axis: AxisBase?) -> String 40 | { 41 | let index = Int(value.rounded()) 42 | guard values.indices.contains(index), index == Int(value) else { return "" } 43 | return values[index] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Formatters/ValueFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ValueFormatter.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | /// Interface that allows custom formatting of all values inside the chart before they are drawn to the screen. 15 | /// 16 | /// Simply create your own formatting class and let it implement ValueFormatter. Then override the stringForValue() 17 | /// method and return whatever you want. 18 | 19 | @objc(ChartValueFormatter) 20 | public protocol ValueFormatter: AnyObject 21 | { 22 | 23 | /// Called when a value (from labels inside the chart) is formatted before being drawn. 24 | /// 25 | /// For performance reasons, avoid excessive calculations and memory allocations inside this method. 26 | /// 27 | /// - Parameters: 28 | /// - value: The value to be formatted 29 | /// - dataSetIndex: The index of the DataSet the entry in focus belongs to 30 | /// - viewPortHandler: provides information about the current chart state (scale, translation, ...) 31 | /// - Returns: The formatted label ready to be drawn 32 | func stringForValue(_ value: Double, 33 | entry: ChartDataEntry, 34 | dataSetIndex: Int, 35 | viewPortHandler: ViewPortHandler?) -> String 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Highlight/Highlighter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Highlighter.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc(ChartHighlighter) 16 | public protocol Highlighter: AnyObject 17 | { 18 | /// - Parameters: 19 | /// - x: 20 | /// - y: 21 | /// - Returns: A Highlight object corresponding to the given x- and y- touch positions in pixels. 22 | func getHighlight(x: CGFloat, y: CGFloat) -> Highlight? 23 | } 24 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Highlight/PieHighlighter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PieHighlighter.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc(PieChartHighlighter) 16 | open class PieHighlighter: PieRadarHighlighter 17 | { 18 | open override func closestHighlight(index: Int, x: CGFloat, y: CGFloat) -> Highlight? 19 | { 20 | guard 21 | let set = chart?.data?[0], 22 | let entry = set.entryForIndex(index) 23 | else { return nil } 24 | 25 | return Highlight(x: Double(index), y: entry.y, xPx: x, yPx: y, dataSetIndex: 0, axis: set.axisDependency) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Highlight/Range.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Range.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | 14 | @objc(ChartRange) 15 | open class Range: NSObject 16 | { 17 | @objc open var from: Double 18 | @objc open var to: Double 19 | 20 | @objc public init(from: Double, to: Double) 21 | { 22 | self.from = from 23 | self.to = to 24 | 25 | super.init() 26 | } 27 | 28 | /// - Parameters: 29 | /// - value: 30 | /// - Returns: `true` if this range contains (if the value is in between) the given value, `false` ifnot. 31 | @objc open func contains(_ value: Double) -> Bool 32 | { 33 | if value > from && value <= to 34 | { 35 | return true 36 | } 37 | else 38 | { 39 | return false 40 | } 41 | } 42 | 43 | @objc open func isLarger(_ value: Double) -> Bool 44 | { 45 | return value > to 46 | } 47 | 48 | @objc open func isSmaller(_ value: Double) -> Bool 49 | { 50 | return value < from 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/BarChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BarChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol BarChartDataProvider: BarLineScatterCandleBubbleChartDataProvider 17 | { 18 | var barData: BarChartData? { get } 19 | 20 | var isDrawBarShadowEnabled: Bool { get } 21 | var isDrawValueAboveBarEnabled: Bool { get } 22 | var isHighlightFullBarEnabled: Bool { get } 23 | } -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BarLineScatterCandleBubbleChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol BarLineScatterCandleBubbleChartDataProvider: ChartDataProvider 17 | { 18 | func getTransformer(forAxis: YAxis.AxisDependency) -> Transformer 19 | func isInverted(axis: YAxis.AxisDependency) -> Bool 20 | 21 | var lowestVisibleX: Double { get } 22 | var highestVisibleX: Double { get } 23 | } 24 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/BubbleChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BubbleChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol BubbleChartDataProvider: BarLineScatterCandleBubbleChartDataProvider 17 | { 18 | var bubbleData: BubbleChartData? { get } 19 | } -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/CandleChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CandleChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol CandleChartDataProvider: BarLineScatterCandleBubbleChartDataProvider 17 | { 18 | var candleData: CandleChartData? { get } 19 | } -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/ChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol ChartDataProvider 17 | { 18 | /// The minimum x-value of the chart, regardless of zoom or translation. 19 | var chartXMin: Double { get } 20 | 21 | /// The maximum x-value of the chart, regardless of zoom or translation. 22 | var chartXMax: Double { get } 23 | 24 | /// The minimum y-value of the chart, regardless of zoom or translation. 25 | var chartYMin: Double { get } 26 | 27 | /// The maximum y-value of the chart, regardless of zoom or translation. 28 | var chartYMax: Double { get } 29 | 30 | var maxHighlightDistance: CGFloat { get } 31 | 32 | var xRange: Double { get } 33 | 34 | var centerOffsets: CGPoint { get } 35 | 36 | var data: ChartData? { get } 37 | 38 | var maxVisibleCount: Int { get } 39 | } 40 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/CombinedChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CombinedChartDataProvider.swoft 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol CombinedChartDataProvider: LineChartDataProvider, BarChartDataProvider, BubbleChartDataProvider, CandleChartDataProvider, ScatterChartDataProvider 17 | { 18 | var combinedData: CombinedChartData? { get } 19 | } -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/LineChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LineChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol LineChartDataProvider: BarLineScatterCandleBubbleChartDataProvider 17 | { 18 | var lineData: LineChartData? { get } 19 | 20 | func getAxis(_ axis: YAxis.AxisDependency) -> YAxis 21 | } 22 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Interfaces/ScatterChartDataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScatterChartDataProvider.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol ScatterChartDataProvider: BarLineScatterCandleBubbleChartDataProvider 17 | { 18 | var scatterData: ScatterChartData? { get } 19 | } -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Jobs/AnimatedMoveViewJob.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimatedMoveViewJob.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | open class AnimatedMoveViewJob: AnimatedViewPortJob 16 | { 17 | internal override func animationUpdate() 18 | { 19 | var pt = CGPoint( 20 | x: xOrigin + (CGFloat(xValue) - xOrigin) * phase, 21 | y: yOrigin + (CGFloat(yValue) - yOrigin) * phase 22 | ) 23 | 24 | transformer.pointValueToPixel(&pt) 25 | viewPortHandler.centerViewPort(pt: pt, chart: view) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Jobs/MoveViewJob.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MoveViewJob.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc(MoveChartViewJob) 16 | open class MoveViewJob: ViewPortJob 17 | { 18 | open override func doJob() 19 | { 20 | var pt = CGPoint( 21 | x: xValue, 22 | y: yValue 23 | ) 24 | 25 | transformer.pointValueToPixel(&pt) 26 | viewPortHandler.centerViewPort(pt: pt, chart: view) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Jobs/ViewPortJob.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewPortJob.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | // This defines a viewport modification job, used for delaying or animating viewport changes 16 | @objc(ChartViewPortJob) 17 | open class ViewPortJob: NSObject 18 | { 19 | internal var point: CGPoint = .zero 20 | internal unowned var viewPortHandler: ViewPortHandler 21 | internal var xValue = 0.0 22 | internal var yValue = 0.0 23 | internal unowned var transformer: Transformer 24 | internal unowned var view: ChartViewBase 25 | 26 | @objc public init( 27 | viewPortHandler: ViewPortHandler, 28 | xValue: Double, 29 | yValue: Double, 30 | transformer: Transformer, 31 | view: ChartViewBase) 32 | { 33 | self.viewPortHandler = viewPortHandler 34 | self.xValue = xValue 35 | self.yValue = yValue 36 | self.transformer = transformer 37 | self.view = view 38 | 39 | super.init() 40 | } 41 | 42 | @objc open func doJob() 43 | { 44 | fatalError("`doJob()` must be overridden by subclasses") 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/AxisRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AxisRenderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | 16 | public protocol AxisRenderer: Renderer { 17 | 18 | associatedtype Axis: AxisBase 19 | 20 | /// base axis this axis renderer works with 21 | var axis: Axis { get } 22 | 23 | /// transformer to transform values to screen pixels and return 24 | var transformer: Transformer? { get } 25 | 26 | /// Draws the axis labels on the specified context 27 | func renderAxisLabels(context: CGContext) 28 | 29 | /// Draws the grid lines belonging to the axis. 30 | func renderGridLines(context: CGContext) 31 | 32 | /// Draws the line that goes alongside the axis. 33 | func renderAxisLine(context: CGContext) 34 | 35 | /// Draws the LimitLines associated with this axis to the screen. 36 | func renderLimitLines(context: CGContext) 37 | 38 | /// Computes the axis values. 39 | /// - parameter min: the minimum value in the data object for this axis 40 | /// - parameter max: the maximum value in the data object for this axis 41 | func computeAxis(min: Double, max: Double, inverted: Bool) 42 | 43 | /// Sets up the axis values. Computes the desired number of labels between the two given extremes. 44 | func computeAxisValues(min: Double, max: Double) 45 | } 46 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/Renderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Renderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc(ChartRenderer) 16 | public protocol Renderer { 17 | 18 | /// the component that handles the drawing area of the chart and it's offsets 19 | var viewPortHandler: ViewPortHandler { get } 20 | } 21 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChevronDownShapeRenderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | import Foundation 12 | import CoreGraphics 13 | 14 | open class ChevronDownShapeRenderer : NSObject, ShapeRenderer 15 | { 16 | open func renderShape( 17 | context: CGContext, 18 | dataSet: ScatterChartDataSetProtocol, 19 | viewPortHandler: ViewPortHandler, 20 | point: CGPoint, 21 | color: NSUIColor) 22 | { 23 | let shapeSize = dataSet.scatterShapeSize 24 | let shapeHalf = shapeSize / 2.0 25 | 26 | context.setLineWidth(1.0) 27 | context.setStrokeColor(color.cgColor) 28 | 29 | context.beginPath() 30 | context.move(to: CGPoint(x: point.x, y: point.y + 2 * shapeHalf)) 31 | context.addLine(to: CGPoint(x: point.x + 2 * shapeHalf, y: point.y)) 32 | context.move(to: CGPoint(x: point.x, y: point.y + 2 * shapeHalf)) 33 | context.addLine(to: CGPoint(x: point.x - 2 * shapeHalf, y: point.y)) 34 | context.strokePath() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChevronUpShapeRenderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | import Foundation 12 | import CoreGraphics 13 | 14 | open class ChevronUpShapeRenderer : NSObject, ShapeRenderer 15 | { 16 | open func renderShape( 17 | context: CGContext, 18 | dataSet: ScatterChartDataSetProtocol, 19 | viewPortHandler: ViewPortHandler, 20 | point: CGPoint, 21 | color: NSUIColor) 22 | { 23 | let shapeSize = dataSet.scatterShapeSize 24 | let shapeHalf = shapeSize / 2.0 25 | 26 | context.setLineWidth(1.0) 27 | context.setStrokeColor(color.cgColor) 28 | 29 | context.beginPath() 30 | context.move(to: CGPoint(x: point.x, y: point.y - 2 * shapeHalf)) 31 | context.addLine(to: CGPoint(x: point.x + 2 * shapeHalf, y: point.y)) 32 | context.move(to: CGPoint(x: point.x, y: point.y - 2 * shapeHalf)) 33 | context.addLine(to: CGPoint(x: point.x - 2 * shapeHalf, y: point.y)) 34 | context.strokePath() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CrossShapeRenderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | import Foundation 12 | import CoreGraphics 13 | 14 | open class CrossShapeRenderer : NSObject, ShapeRenderer 15 | { 16 | open func renderShape( 17 | context: CGContext, 18 | dataSet: ScatterChartDataSetProtocol, 19 | viewPortHandler: ViewPortHandler, 20 | point: CGPoint, 21 | color: NSUIColor) 22 | { 23 | let shapeSize = dataSet.scatterShapeSize 24 | let shapeHalf = shapeSize / 2.0 25 | 26 | context.setLineWidth(1.0) 27 | context.setStrokeColor(color.cgColor) 28 | 29 | context.beginPath() 30 | context.move(to: CGPoint(x: point.x - shapeHalf, y: point.y)) 31 | context.addLine(to: CGPoint(x: point.x + shapeHalf, y: point.y)) 32 | context.move(to: CGPoint(x: point.x, y: point.y - shapeHalf)) 33 | context.addLine(to: CGPoint(x: point.x, y: point.y + shapeHalf)) 34 | context.strokePath() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/Scatter/ShapeRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShapeRenderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc 16 | public protocol ShapeRenderer: AnyObject 17 | { 18 | /// Renders the provided ScatterDataSet with a shape. 19 | /// 20 | /// - Parameters: 21 | /// - context: CGContext for drawing on 22 | /// - dataSet: The DataSet to be drawn 23 | /// - viewPortHandler: Contains information about the current state of the view 24 | /// - point: Position to draw the shape at 25 | /// - color: Color to draw the shape 26 | func renderShape( 27 | context: CGContext, 28 | dataSet: ScatterChartDataSetProtocol, 29 | viewPortHandler: ViewPortHandler, 30 | point: CGPoint, 31 | color: NSUIColor) 32 | } 33 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Renderers/Scatter/XShapeRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XShapeRenderer.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | import Foundation 12 | import CoreGraphics 13 | 14 | open class XShapeRenderer : NSObject, ShapeRenderer 15 | { 16 | open func renderShape( 17 | context: CGContext, 18 | dataSet: ScatterChartDataSetProtocol, 19 | viewPortHandler: ViewPortHandler, 20 | point: CGPoint, 21 | color: NSUIColor) 22 | { 23 | let shapeSize = dataSet.scatterShapeSize 24 | let shapeHalf = shapeSize / 2.0 25 | 26 | context.setLineWidth(1.0) 27 | context.setStrokeColor(color.cgColor) 28 | 29 | context.beginPath() 30 | context.move(to: CGPoint(x: point.x - shapeHalf, y: point.y - shapeHalf)) 31 | context.addLine(to: CGPoint(x: point.x + shapeHalf, y: point.y + shapeHalf)) 32 | context.move(to: CGPoint(x: point.x + shapeHalf, y: point.y - shapeHalf)) 33 | context.addLine(to: CGPoint(x: point.x - shapeHalf, y: point.y + shapeHalf)) 34 | context.strokePath() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Utils/Platform+Color.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Platform+Color.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | #if canImport(UIKit) 13 | import UIKit 14 | 15 | public typealias NSUIColor = UIColor 16 | private func fetchLabelColor() -> UIColor 17 | { 18 | if #available(iOS 13, tvOS 13, *) 19 | { 20 | return .label 21 | } 22 | else 23 | { 24 | return .black 25 | } 26 | } 27 | private let labelColor: UIColor = fetchLabelColor() 28 | 29 | extension UIColor 30 | { 31 | static var labelOrBlack: UIColor { labelColor } 32 | } 33 | #endif 34 | 35 | #if canImport(AppKit) && !targetEnvironment(macCatalyst) 36 | 37 | import AppKit 38 | 39 | public typealias NSUIColor = NSColor 40 | private func fetchLabelColor() -> NSColor 41 | { 42 | if #available(macOS 10.14, *) 43 | { 44 | return .labelColor 45 | } 46 | else 47 | { 48 | return .black 49 | } 50 | } 51 | private let labelColor: NSColor = fetchLabelColor() 52 | 53 | extension NSColor 54 | { 55 | static var labelOrBlack: NSColor { labelColor } 56 | } 57 | #endif 58 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Utils/Sequence+KeyPath.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Sequence+KeyPath.swift 3 | // Charts 4 | // 5 | // Created by Jacob Christie on 2020-12-15. 6 | // 7 | 8 | extension Sequence { 9 | func max( 10 | by keyPath: KeyPath, 11 | areInIncreasingOrder: (T, T) -> Bool 12 | ) -> Element? { 13 | self.max { areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) } 14 | } 15 | 16 | func max(by keyPath: KeyPath) -> Element? { 17 | max(by: keyPath, areInIncreasingOrder: <) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Pods/Charts/Source/Charts/Utils/TransformerHorizontalBarChart.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransformerHorizontalBarChart.swift 3 | // Charts 4 | // 5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda 6 | // A port of MPAndroidChart for iOS 7 | // Licensed under Apache License 2.0 8 | // 9 | // https://github.com/danielgindi/Charts 10 | // 11 | 12 | import Foundation 13 | import CoreGraphics 14 | 15 | @objc(ChartTransformerHorizontalBarChart) 16 | open class TransformerHorizontalBarChart: Transformer 17 | { 18 | /// Prepares the matrix that contains all offsets. 19 | open override func prepareMatrixOffset(inverted: Bool) 20 | { 21 | if !inverted 22 | { 23 | matrixOffset = CGAffineTransform(translationX: viewPortHandler.offsetLeft, y: viewPortHandler.chartHeight - viewPortHandler.offsetBottom) 24 | } 25 | else 26 | { 27 | matrixOffset = CGAffineTransform(scaleX: -1.0, y: 1.0) 28 | .translatedBy(x: -(viewPortHandler.chartWidth - viewPortHandler.offsetRight), 29 | y: viewPortHandler.chartHeight - viewPortHandler.offsetBottom) 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Pods/Eureka/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 XMARTLABS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/Eureka/Source/Core/SelectableRowType.swift: -------------------------------------------------------------------------------- 1 | // SelectableRowType.swift 2 | // Eureka ( https://github.com/xmartlabs/Eureka ) 3 | // 4 | // Copyright (c) 2016 Xmartlabs ( http://xmartlabs.com ) 5 | // 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | 27 | /** 28 | * Every row that shall be used in a SelectableSection must conform to this protocol. 29 | */ 30 | public protocol SelectableRowType: RowType { 31 | var selectableValue: Cell.Value? { get set } 32 | } 33 | -------------------------------------------------------------------------------- /Pods/Eureka/Source/Validations/RuleEmail.swift: -------------------------------------------------------------------------------- 1 | // RuleEmail.swift 2 | // Eureka ( https://github.com/xmartlabs/Eureka ) 3 | // 4 | // Copyright (c) 2016 Xmartlabs SRL ( http://xmartlabs.com ) 5 | // 6 | // 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the "Software"), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be included in 15 | // all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | // THE SOFTWARE. 24 | 25 | import Foundation 26 | 27 | public class RuleEmail: RuleRegExp { 28 | 29 | public init(msg: String = "Field value should be a valid email!", id: String? = nil) { 30 | super.init(regExpr: RegExprPattern.EmailAddress.rawValue, allowsEmpty: true, msg: msg, id: id) 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /Pods/Local Podspecs/Eureka.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Eureka", 3 | "version": "5.3.6", 4 | "license": "MIT", 5 | "summary": "Elegant iOS Forms in pure Swift", 6 | "homepage": "https://github.com/xmartlabs/Eureka", 7 | "social_media_url": "http://twitter.com/xmartlabs", 8 | "authors": { 9 | "Martin Barreto": "martin@xmartlabs.com", 10 | "Mathias Claassen": "mathias@xmartlabs.com" 11 | }, 12 | "source": { 13 | "git": "https://github.com/xmartlabs/Eureka.git", 14 | "tag": "5.3.6" 15 | }, 16 | "platforms": { 17 | "ios": "9.0" 18 | }, 19 | "ios": { 20 | "frameworks": [ 21 | "UIKit", 22 | "Foundation" 23 | ] 24 | }, 25 | "source_files": "Source/**/*.swift", 26 | "requires_arc": true, 27 | "swift_versions": "5.0", 28 | "swift_version": "5.0" 29 | } 30 | -------------------------------------------------------------------------------- /Pods/Local Podspecs/ShareClient.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ShareClient", 3 | "version": "1.2", 4 | "summary": "Dexcom Client Pod", 5 | "swift_versions": "5.0", 6 | "homepage": "https://github.com/loopandlearn/dexcom-share-client-swift", 7 | "license": "MIT", 8 | "authors": "jonfawcett", 9 | "platforms": { 10 | "ios": "10.0", 11 | "watchos": "6.0" 12 | }, 13 | "source": { 14 | "git": "https://github.com/loopandlearn/dexcom-share-client-swift.git", 15 | "tag": "v1.2" 16 | }, 17 | "source_files": "ShareClient/ShareClient.{h,swift}", 18 | "swift_version": "5.0" 19 | } 20 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Charts (4.1.0): 3 | - Charts/Core (= 4.1.0) 4 | - Charts/Core (4.1.0): 5 | - SwiftAlgorithms (~> 1.0) 6 | - Eureka (5.3.6) 7 | - ShareClient (1.2) 8 | - SwiftAlgorithms (1.0.0) 9 | 10 | DEPENDENCIES: 11 | - Charts 12 | - Eureka (from `https://github.com/xmartlabs/Eureka.git`) 13 | - ShareClient (from `https://github.com/loopandlearn/dexcom-share-client-swift.git`, branch `loopfollow`) 14 | 15 | SPEC REPOS: 16 | trunk: 17 | - Charts 18 | - SwiftAlgorithms 19 | 20 | EXTERNAL SOURCES: 21 | Eureka: 22 | :git: https://github.com/xmartlabs/Eureka.git 23 | ShareClient: 24 | :branch: loopfollow 25 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git 26 | 27 | CHECKOUT OPTIONS: 28 | Eureka: 29 | :commit: 044e31674d319c8edb19d993a5f8ea4e24641542 30 | :git: https://github.com/xmartlabs/Eureka.git 31 | ShareClient: 32 | :commit: d7a3323a014d41827ee177a92d528786f9f09e75 33 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git 34 | 35 | SPEC CHECKSUMS: 36 | Charts: ce0768268078eee0336f122c3c4ca248e4e204c5 37 | Eureka: 28ad9dec6286cd7cd601fdf8e8df39bb7356a8f4 38 | ShareClient: 60b911c95e73b0ea9c5aad6d194a9c6b5f34b741 39 | SwiftAlgorithms: 38dda4731d19027fdeee1125f973111bf3386b53 40 | 41 | PODFILE CHECKSUM: d241dda366d5454279fe3ff8869458d19e1bbebb 42 | 43 | COCOAPODS: 1.12.1 44 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Charts.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 0 13 | 14 | Eureka.xcscheme 15 | 16 | isShown 17 | 18 | orderHint 19 | 1 20 | 21 | Pods-LoopFollow.xcscheme 22 | 23 | isShown 24 | 25 | orderHint 26 | 2 27 | 28 | ShareClient.xcscheme 29 | 30 | isShown 31 | 32 | orderHint 33 | 3 34 | 35 | SwiftAlgorithms.xcscheme 36 | 37 | isShown 38 | 39 | orderHint 40 | 4 41 | 42 | 43 | SuppressBuildableAutocreation 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Pods/ShareClient/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Mark Wilson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/ShareClient/ShareClient/ShareClient.h: -------------------------------------------------------------------------------- 1 | // 2 | // ShareClient.h 3 | // ShareClient 4 | // 5 | // Created by Nathan Racklyeft on 5/8/16. 6 | // Copyright © 2016 Mark Wilson. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ShareClient. 12 | FOUNDATION_EXPORT double ShareClientVersionNumber; 13 | 14 | //! Project version string for ShareClient. 15 | FOUNDATION_EXPORT const unsigned char ShareClientVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 4.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Charts : NSObject 3 | @end 4 | @implementation PodsDummy_Charts 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double ChartsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char ChartsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Charts 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 11 | PODS_ROOT = ${SRCROOT} 12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Charts 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 15 | SKIP_INSTALL = YES 16 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts.modulemap: -------------------------------------------------------------------------------- 1 | framework module Charts { 2 | umbrella header "Charts-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Charts/Charts.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Charts 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 11 | PODS_ROOT = ${SRCROOT} 12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Charts 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 15 | SKIP_INSTALL = YES 16 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 5.3.6 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Eureka : NSObject 3 | @end 4 | @implementation PodsDummy_Eureka 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double EurekaVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char EurekaVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Eureka 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Eureka 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka.modulemap: -------------------------------------------------------------------------------- 1 | framework module Eureka { 2 | umbrella header "Eureka-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Eureka/Eureka.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Eureka 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Eureka 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_LoopFollow : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_LoopFollow 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Charts/Charts.framework 3 | ${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework 4 | ${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework 5 | ${BUILT_PRODUCTS_DIR}/SwiftAlgorithms/Algorithms.framework -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Charts.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ShareClient.framework 4 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Algorithms.framework -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Charts/Charts.framework 3 | ${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework 4 | ${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework 5 | ${BUILT_PRODUCTS_DIR}/SwiftAlgorithms/Algorithms.framework -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Charts.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ShareClient.framework 4 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Algorithms.framework -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_LoopFollowVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_LoopFollowVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient/ShareClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms/Algorithms.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms" -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "ShareClient" -framework "UIKit" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_LoopFollow { 2 | umbrella header "Pods-LoopFollow-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient/ShareClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms/Algorithms.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms" -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "ShareClient" -framework "UIKit" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.2.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_ShareClient : NSObject 3 | @end 4 | @implementation PodsDummy_ShareClient 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "ShareClient.h" 14 | 15 | FOUNDATION_EXPORT double ShareClientVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char ShareClientVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShareClient 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShareClient 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient.modulemap: -------------------------------------------------------------------------------- 1 | framework module ShareClient { 2 | umbrella header "ShareClient-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShareClient/ShareClient.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShareClient 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShareClient 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SwiftAlgorithms : NSObject 3 | @end 4 | @implementation PodsDummy_SwiftAlgorithms 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double AlgorithmsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char AlgorithmsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftAlgorithms 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms.modulemap: -------------------------------------------------------------------------------- 1 | framework module Algorithms { 2 | umbrella header "SwiftAlgorithms-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftAlgorithms 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /blacklisted-versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "blacklistedVersions": [ 3 | { 4 | "version": "1.0.0" 5 | }, 6 | { 7 | "version": "2.0.0" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /fastlane/Matchfile: -------------------------------------------------------------------------------- 1 | 2 | GITHUB_REPOSITORY_OWNER ||= ENV["GITHUB_REPOSITORY_OWNER"] 3 | 4 | git_url("https://github.com/#{GITHUB_REPOSITORY_OWNER}/Match-Secrets.git") 5 | 6 | storage_mode("git") 7 | 8 | type("appstore") 9 | 10 | # The docs are available on https://docs.fastlane.tools/actions/match 11 | --------------------------------------------------------------------------------