Search: FlightAware backbone, blob catalog, diagnostic infra

route-explorer's /api/token sits behind invisible Cloudflare Turnstile
that requires Apple's Private Access Token attestation. Third-party
iOS apps don't qualify for PAT issuance, and Linux Docker containers
can't pass it either (cross-OS fingerprint, even with patchright /
Camoufox). Migrates direct-flight search to FlightAware; multi-stop
and where-can-I-go remain via embedded SFSafariViewController.

- FlightAwareScheduleClient — scrapes route.rvt + trackpoll JSON for
  real schedules without auth. T+0..2 day window. Tests against
  captured HTML fixtures.
- BlobRouteClient — pulls the public Vercel blob route catalog
  route-explorer's frontend reads (no auth, no Turnstile).
- DiagnosticLogger + LoggingURLSessionDelegate + DiagnosticsView —
  device-shareable forensic trace. Boot header captures device, OS,
  locale, UA; share-sheet export of session logs.
- TurnstileDebugView — live WKWebView gate inspector. Used to prove
  the PAT-entitlement gap on a real device.
- RouteExplorerBrowserView — SFSafariViewController wrapper. Real
  Safari clears Turnstile naturally; the in-app browser opens at
  pre-filled search URLs. Surfaced from Search ("Open in
  route-explorer") and Settings → Tools.
- RouteExplorerTokenStore + RouteExplorerSetupView — bookmarklet
  capture flow (token round-tripped via flights://routeexplorer-token
  URL scheme). Kept dormant for future use.

backend/ — Docker proxy attempts (Playwright, patchright, Camoufox).
All fail on Linux because Cloudflare auto-denies before the Turnstile
widget renders. Documented; kept as scaffolding for a future paid-
solver integration.

scripts/probe_flightaware.py — reference algorithm for the FA path.
scripts/probe_nodriver.py — local-Mac sanity check confirming the
gate clears with real macOS Chrome (proves the blocker is
fingerprint-level, not network-level).
This commit is contained in:
Trey T
2026-06-06 01:09:59 -05:00
parent d122c95342
commit ba0688a412
70 changed files with 89096 additions and 209 deletions
+164 -4
View File
@@ -40,12 +40,23 @@
BB2200002222000022220001 /* JSXWebViewFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2200002222000022220002 /* JSXWebViewFetcher.swift */; };
RE1100001111000011110001 /* RouteExplorerModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE1100001111000011110002 /* RouteExplorerModels.swift */; };
RE2200002222000022220001 /* RouteExplorerClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE2200002222000022220002 /* RouteExplorerClient.swift */; };
FA9911119911119911119911 /* FlightAwareScheduleClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9911119911119911119922 /* FlightAwareScheduleClient.swift */; };
BL0011110011110011110011 /* BlobRouteClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = BL0011110011110011110022 /* BlobRouteClient.swift */; };
TS0011110011110011110011 /* TurnstileDebugView.swift in Sources */ = {isa = PBXBuildFile; fileRef = TS0011110011110011110022 /* TurnstileDebugView.swift */; };
DL0011110011110011110011 /* DiagnosticLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = DL0011110011110011110022 /* DiagnosticLogger.swift */; };
LD0011110011110011110011 /* LoggingURLSessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = LD0011110011110011110022 /* LoggingURLSessionDelegate.swift */; };
DV0011110011110011110011 /* DiagnosticsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DV0011110011110011110022 /* DiagnosticsView.swift */; };
RT0011110011110011110011 /* RouteExplorerTokenStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = RT0011110011110011110022 /* RouteExplorerTokenStore.swift */; };
RS0011110011110011110011 /* RouteExplorerSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = RS0011110011110011110022 /* RouteExplorerSetupView.swift */; };
RB0011110011110011110011 /* RouteExplorerBrowserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = RB0011110011110011110022 /* RouteExplorerBrowserView.swift */; };
RE3300003333000033330001 /* RoutePlannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE3300003333000033330002 /* RoutePlannerView.swift */; };
REGT00000000000000000001 /* RouteExplorerGateSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = REGT00000000000000000002 /* RouteExplorerGateSheet.swift */; };
RE5500005555000055550001 /* IATAAirportPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE5500005555000055550002 /* IATAAirportPicker.swift */; };
RE6600006666000066660001 /* ConnectionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE6600006666000066660002 /* ConnectionRow.swift */; };
RE7700007777000077770001 /* ConnectionLoadDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE7700007777000077770002 /* ConnectionLoadDetailView.swift */; };
RE8800008888000088880001 /* SearchRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = RE8800008888000088880002 /* SearchRoute.swift */; };
T1000000000000000000001A /* AirlineLoadIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = T1000000000000000000001B /* AirlineLoadIntegrationTests.swift */; };
FATEST00FATEST00FATEST01 /* FlightAwareScheduleClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FATEST00FATEST00FATEST02 /* FlightAwareScheduleClientTests.swift */; };
LV1100001111000011110001 /* LiveAircraft.swift in Sources */ = {isa = PBXBuildFile; fileRef = LV1100001111000011110002 /* LiveAircraft.swift */; };
LV2200002222000022220001 /* OpenSkyClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = LV2200002222000022220002 /* OpenSkyClient.swift */; };
LV3300003333000033330001 /* AircraftRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = LV3300003333000033330002 /* AircraftRegistry.swift */; };
@@ -87,6 +98,33 @@
HX1900001900000019000001 /* AircraftStatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = HX1900001900000019000002 /* AircraftStatsView.swift */; };
HX2000002000000020000001 /* EnrichAircraftTypesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = HX2000002000000020000002 /* EnrichAircraftTypesView.swift */; };
HX2100002100000021000001 /* FlightAwareLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = HX2100002100000021000002 /* FlightAwareLookup.swift */; };
NF0100000000000000000001 /* AircraftRotationTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0100000000000000000002 /* AircraftRotationTracker.swift */; };
NF0200000000000000000001 /* AirframeHistoryStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0200000000000000000002 /* AirframeHistoryStore.swift */; };
NF0300000000000000000001 /* BTSDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0300000000000000000002 /* BTSDataStore.swift */; };
NF0500000000000000000001 /* DelayCascadePredictor.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0500000000000000000002 /* DelayCascadePredictor.swift */; };
NF0600000000000000000001 /* EquipmentSwapService.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0600000000000000000002 /* EquipmentSwapService.swift */; };
NF0700000000000000000001 /* HubLoadHeatmapService.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0700000000000000000002 /* HubLoadHeatmapService.swift */; };
NF0900000000000000000001 /* LoadFactorService.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF0900000000000000000002 /* LoadFactorService.swift */; };
NF1000000000000000000001 /* OnTimePerformanceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF1000000000000000000002 /* OnTimePerformanceService.swift */; };
NF1100000000000000000001 /* SisterFlightService.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF1100000000000000000002 /* SisterFlightService.swift */; };
NF1200000000000000000001 /* StandbyStatsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF1200000000000000000002 /* StandbyStatsService.swift */; };
NF1400000000000000000001 /* WeatherClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF1400000000000000000002 /* WeatherClient.swift */; };
NHB00000000000000000001 /* HubLoadsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = NHB00000000000000000002 /* HubLoadsView.swift */; };
NSV00000000000000000001 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = NSV00000000000000000002 /* SettingsView.swift */; };
NR0100000000000000000001 /* aircraft_seats.json in Resources */ = {isa = PBXBuildFile; fileRef = NR0100000000000000000002 /* aircraft_seats.json */; };
NR0200000000000000000001 /* bts_bundle.json in Resources */ = {isa = PBXBuildFile; fileRef = NR0200000000000000000002 /* bts_bundle.json */; };
NF1600000000000000000001 /* DataIntegrityMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = NF1600000000000000000002 /* DataIntegrityMonitor.swift */; };
NR0700000000000000000001 /* bts_bundle_meta.json in Resources */ = {isa = PBXBuildFile; fileRef = NR0700000000000000000002 /* bts_bundle_meta.json */; };
TN0100000000000000000001 /* AirframeHistoryStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0100000000000000000002 /* AirframeHistoryStoreTests.swift */; };
TN0300000000000000000001 /* DataIntegrityMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0300000000000000000002 /* DataIntegrityMonitorTests.swift */; };
TN0400000000000000000001 /* DelayCascadePredictorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0400000000000000000002 /* DelayCascadePredictorTests.swift */; };
TN0500000000000000000001 /* EquipmentSwapServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0500000000000000000002 /* EquipmentSwapServiceTests.swift */; };
TN0600000000000000000001 /* HistoryFlightModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0600000000000000000002 /* HistoryFlightModelTests.swift */; };
TN0800000000000000000001 /* LoadFactorServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0800000000000000000002 /* LoadFactorServiceTests.swift */; };
TN0900000000000000000001 /* SelftestRemovalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN0900000000000000000002 /* SelftestRemovalTests.swift */; };
TN1000000000000000000001 /* SisterFlightServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN1000000000000000000002 /* SisterFlightServiceTests.swift */; };
TN1100000000000000000001 /* StandbyStatsServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN1100000000000000000002 /* StandbyStatsServiceTests.swift */; };
TN1300000000000000000001 /* WeatherClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TN1300000000000000000002 /* WeatherClientTests.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -134,12 +172,22 @@
BB2200002222000022220002 /* JSXWebViewFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSXWebViewFetcher.swift; sourceTree = "<group>"; };
RE1100001111000011110002 /* RouteExplorerModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteExplorerModels.swift; sourceTree = "<group>"; };
RE2200002222000022220002 /* RouteExplorerClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteExplorerClient.swift; sourceTree = "<group>"; };
FA9911119911119911119922 /* FlightAwareScheduleClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightAwareScheduleClient.swift; sourceTree = "<group>"; };
BL0011110011110011110022 /* BlobRouteClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlobRouteClient.swift; sourceTree = "<group>"; };
DL0011110011110011110022 /* DiagnosticLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagnosticLogger.swift; sourceTree = "<group>"; };
LD0011110011110011110022 /* LoggingURLSessionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingURLSessionDelegate.swift; sourceTree = "<group>"; };
DV0011110011110011110022 /* DiagnosticsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagnosticsView.swift; sourceTree = "<group>"; };
RT0011110011110011110022 /* RouteExplorerTokenStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteExplorerTokenStore.swift; sourceTree = "<group>"; };
RS0011110011110011110022 /* RouteExplorerSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteExplorerSetupView.swift; sourceTree = "<group>"; };
RB0011110011110011110022 /* RouteExplorerBrowserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteExplorerBrowserView.swift; sourceTree = "<group>"; };
RE3300003333000033330002 /* RoutePlannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutePlannerView.swift; sourceTree = "<group>"; };
REGT00000000000000000002 /* RouteExplorerGateSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteExplorerGateSheet.swift; sourceTree = "<group>"; };
RE5500005555000055550002 /* IATAAirportPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IATAAirportPicker.swift; sourceTree = "<group>"; };
RE6600006666000066660002 /* ConnectionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionRow.swift; sourceTree = "<group>"; };
RE7700007777000077770002 /* ConnectionLoadDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionLoadDetailView.swift; sourceTree = "<group>"; };
RE8800008888000088880002 /* SearchRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRoute.swift; sourceTree = "<group>"; };
T1000000000000000000001B /* AirlineLoadIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirlineLoadIntegrationTests.swift; sourceTree = "<group>"; };
FATEST00FATEST00FATEST02 /* FlightAwareScheduleClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightAwareScheduleClientTests.swift; sourceTree = "<group>"; };
T1000000000000000000003A /* FlightsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlightsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
LV1100001111000011110002 /* LiveAircraft.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveAircraft.swift; sourceTree = "<group>"; };
LV2200002222000022220002 /* OpenSkyClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSkyClient.swift; sourceTree = "<group>"; };
@@ -183,6 +231,34 @@
HX1900001900000019000002 /* AircraftStatsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AircraftStatsView.swift; sourceTree = "<group>"; };
HX2000002000000020000002 /* EnrichAircraftTypesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnrichAircraftTypesView.swift; sourceTree = "<group>"; };
HX2100002100000021000002 /* FlightAwareLookup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightAwareLookup.swift; sourceTree = "<group>"; };
NF0100000000000000000002 /* AircraftRotationTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AircraftRotationTracker.swift; sourceTree = "<group>"; };
NF0200000000000000000002 /* AirframeHistoryStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirframeHistoryStore.swift; sourceTree = "<group>"; };
NF0300000000000000000002 /* BTSDataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BTSDataStore.swift; sourceTree = "<group>"; };
NF0500000000000000000002 /* DelayCascadePredictor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelayCascadePredictor.swift; sourceTree = "<group>"; };
NF0600000000000000000002 /* EquipmentSwapService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EquipmentSwapService.swift; sourceTree = "<group>"; };
NF0700000000000000000002 /* HubLoadHeatmapService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HubLoadHeatmapService.swift; sourceTree = "<group>"; };
NF0900000000000000000002 /* LoadFactorService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFactorService.swift; sourceTree = "<group>"; };
NF1000000000000000000002 /* OnTimePerformanceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnTimePerformanceService.swift; sourceTree = "<group>"; };
NF1100000000000000000002 /* SisterFlightService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SisterFlightService.swift; sourceTree = "<group>"; };
NF1200000000000000000002 /* StandbyStatsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandbyStatsService.swift; sourceTree = "<group>"; };
NF1400000000000000000002 /* WeatherClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherClient.swift; sourceTree = "<group>"; };
NHB00000000000000000002 /* HubLoadsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HubLoadsView.swift; sourceTree = "<group>"; };
TS0011110011110011110022 /* TurnstileDebugView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TurnstileDebugView.swift; sourceTree = "<group>"; };
NSV00000000000000000002 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
NR0100000000000000000002 /* aircraft_seats.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = aircraft_seats.json; sourceTree = "<group>"; };
NR0200000000000000000002 /* bts_bundle.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = bts_bundle.json; sourceTree = "<group>"; };
NF1600000000000000000002 /* DataIntegrityMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataIntegrityMonitor.swift; sourceTree = "<group>"; };
NR0700000000000000000002 /* bts_bundle_meta.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = bts_bundle_meta.json; sourceTree = "<group>"; };
TN0100000000000000000002 /* AirframeHistoryStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirframeHistoryStoreTests.swift; sourceTree = "<group>"; };
TN0300000000000000000002 /* DataIntegrityMonitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataIntegrityMonitorTests.swift; sourceTree = "<group>"; };
TN0400000000000000000002 /* DelayCascadePredictorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelayCascadePredictorTests.swift; sourceTree = "<group>"; };
TN0500000000000000000002 /* EquipmentSwapServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EquipmentSwapServiceTests.swift; sourceTree = "<group>"; };
TN0600000000000000000002 /* HistoryFlightModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryFlightModelTests.swift; sourceTree = "<group>"; };
TN0800000000000000000002 /* LoadFactorServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFactorServiceTests.swift; sourceTree = "<group>"; };
TN0900000000000000000002 /* SelftestRemovalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelftestRemovalTests.swift; sourceTree = "<group>"; };
TN1000000000000000000002 /* SisterFlightServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SisterFlightServiceTests.swift; sourceTree = "<group>"; };
TN1100000000000000000002 /* StandbyStatsServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandbyStatsServiceTests.swift; sourceTree = "<group>"; };
TN1300000000000000000002 /* WeatherClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherClientTests.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -215,6 +291,7 @@
15676B4BD35745D1BD1DC947 /* AirportBrowserSheet.swift */,
BB1100001111000011110006 /* FlightLoadDetailView.swift */,
RE3300003333000033330002 /* RoutePlannerView.swift */,
REGT00000000000000000002 /* RouteExplorerGateSheet.swift */,
RE7700007777000077770002 /* ConnectionLoadDetailView.swift */,
LV4400004444000044440002 /* LiveFlightsView.swift */,
LV5500005555000055550002 /* LiveFlightDetailSheet.swift */,
@@ -236,6 +313,12 @@
HX1800001800000018000002 /* PassportView.swift */,
HX1900001900000019000002 /* AircraftStatsView.swift */,
HX2000002000000020000002 /* EnrichAircraftTypesView.swift */,
NHB00000000000000000002 /* HubLoadsView.swift */,
TS0011110011110011110022 /* TurnstileDebugView.swift */,
DV0011110011110011110022 /* DiagnosticsView.swift */,
RS0011110011110011110022 /* RouteExplorerSetupView.swift */,
RB0011110011110011110022 /* RouteExplorerBrowserView.swift */,
NSV00000000000000000002 /* SettingsView.swift */,
AA5555555555555555555555 /* Styles */,
AA6666666666666666666666 /* Components */,
);
@@ -269,6 +352,7 @@
B6019ED81F39462B92BDC856 /* Services */,
6E94DB5F9EB345948E2D5E2A /* ViewModels */,
1B20C5393D8F432A93097C2C /* Views */,
NRESGROUP00000000000001 /* Resources */,
D9E26DCDE2904210ABCA7855 /* Assets.xcassets */,
53F457716F0642BDBCBA93EA /* airports.json */,
LV9900009999000099990002 /* airlines.json */,
@@ -277,6 +361,16 @@
path = Flights;
sourceTree = "<group>";
};
NRESGROUP00000000000001 /* Resources */ = {
isa = PBXGroup;
children = (
NR0100000000000000000002 /* aircraft_seats.json */,
NR0200000000000000000002 /* bts_bundle.json */,
NR0700000000000000000002 /* bts_bundle_meta.json */,
);
path = Resources;
sourceTree = "<group>";
};
517CC07B82D949359C6CD4F5 /* Products */ = {
isa = PBXGroup;
children = (
@@ -290,6 +384,17 @@
isa = PBXGroup;
children = (
T1000000000000000000001B /* AirlineLoadIntegrationTests.swift */,
FATEST00FATEST00FATEST02 /* FlightAwareScheduleClientTests.swift */,
TN0100000000000000000002 /* AirframeHistoryStoreTests.swift */,
TN0300000000000000000002 /* DataIntegrityMonitorTests.swift */,
TN0400000000000000000002 /* DelayCascadePredictorTests.swift */,
TN0500000000000000000002 /* EquipmentSwapServiceTests.swift */,
TN0600000000000000000002 /* HistoryFlightModelTests.swift */,
TN0800000000000000000002 /* LoadFactorServiceTests.swift */,
TN0900000000000000000002 /* SelftestRemovalTests.swift */,
TN1000000000000000000002 /* SisterFlightServiceTests.swift */,
TN1100000000000000000002 /* StandbyStatsServiceTests.swift */,
TN1300000000000000000002 /* WeatherClientTests.swift */,
);
path = FlightsTests;
sourceTree = "<group>";
@@ -314,6 +419,11 @@
BB1100001111000011110004 /* AirlineLoadService.swift */,
BB2200002222000022220002 /* JSXWebViewFetcher.swift */,
RE2200002222000022220002 /* RouteExplorerClient.swift */,
FA9911119911119911119922 /* FlightAwareScheduleClient.swift */,
BL0011110011110011110022 /* BlobRouteClient.swift */,
DL0011110011110011110022 /* DiagnosticLogger.swift */,
LD0011110011110011110022 /* LoggingURLSessionDelegate.swift */,
RT0011110011110011110022 /* RouteExplorerTokenStore.swift */,
LV2200002222000022220002 /* OpenSkyClient.swift */,
LV3300003333000033330002 /* AircraftRegistry.swift */,
LV7700007777000077770002 /* OpenSkyCredentials.swift */,
@@ -329,6 +439,18 @@
HX1100001100000011000002 /* CSVFlightImporter.swift */,
HX1300001300000013000002 /* HistoryFilters.swift */,
HX2100002100000021000002 /* FlightAwareLookup.swift */,
NF0100000000000000000002 /* AircraftRotationTracker.swift */,
NF0200000000000000000002 /* AirframeHistoryStore.swift */,
NF0300000000000000000002 /* BTSDataStore.swift */,
NF0500000000000000000002 /* DelayCascadePredictor.swift */,
NF0600000000000000000002 /* EquipmentSwapService.swift */,
NF0700000000000000000002 /* HubLoadHeatmapService.swift */,
NF0900000000000000000002 /* LoadFactorService.swift */,
NF1000000000000000000002 /* OnTimePerformanceService.swift */,
NF1100000000000000000002 /* SisterFlightService.swift */,
NF1200000000000000000002 /* StandbyStatsService.swift */,
NF1400000000000000000002 /* WeatherClient.swift */,
NF1600000000000000000002 /* DataIntegrityMonitor.swift */,
);
path = Services;
sourceTree = "<group>";
@@ -446,6 +568,9 @@
80D2BC95002A4931B3C10B4C /* airports.json in Resources */,
LV9900009999000099990001 /* airlines.json in Resources */,
LVCC000CCCC000CCCC000001 /* aircraftDB.json in Resources */,
NR0100000000000000000001 /* aircraft_seats.json in Resources */,
NR0200000000000000000001 /* bts_bundle.json in Resources */,
NR0700000000000000000001 /* bts_bundle_meta.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -487,7 +612,17 @@
BB2200002222000022220001 /* JSXWebViewFetcher.swift in Sources */,
RE1100001111000011110001 /* RouteExplorerModels.swift in Sources */,
RE2200002222000022220001 /* RouteExplorerClient.swift in Sources */,
FA9911119911119911119911 /* FlightAwareScheduleClient.swift in Sources */,
BL0011110011110011110011 /* BlobRouteClient.swift in Sources */,
TS0011110011110011110011 /* TurnstileDebugView.swift in Sources */,
DL0011110011110011110011 /* DiagnosticLogger.swift in Sources */,
LD0011110011110011110011 /* LoggingURLSessionDelegate.swift in Sources */,
DV0011110011110011110011 /* DiagnosticsView.swift in Sources */,
RT0011110011110011110011 /* RouteExplorerTokenStore.swift in Sources */,
RS0011110011110011110011 /* RouteExplorerSetupView.swift in Sources */,
RB0011110011110011110011 /* RouteExplorerBrowserView.swift in Sources */,
RE3300003333000033330001 /* RoutePlannerView.swift in Sources */,
REGT00000000000000000001 /* RouteExplorerGateSheet.swift in Sources */,
RE5500005555000055550001 /* IATAAirportPicker.swift in Sources */,
RE6600006666000066660001 /* ConnectionRow.swift in Sources */,
RE7700007777000077770001 /* ConnectionLoadDetailView.swift in Sources */,
@@ -531,6 +666,20 @@
HX1900001900000019000001 /* AircraftStatsView.swift in Sources */,
HX2000002000000020000001 /* EnrichAircraftTypesView.swift in Sources */,
HX2100002100000021000001 /* FlightAwareLookup.swift in Sources */,
NF0100000000000000000001 /* AircraftRotationTracker.swift in Sources */,
NF0200000000000000000001 /* AirframeHistoryStore.swift in Sources */,
NF0300000000000000000001 /* BTSDataStore.swift in Sources */,
NF0500000000000000000001 /* DelayCascadePredictor.swift in Sources */,
NF0600000000000000000001 /* EquipmentSwapService.swift in Sources */,
NF0700000000000000000001 /* HubLoadHeatmapService.swift in Sources */,
NF0900000000000000000001 /* LoadFactorService.swift in Sources */,
NF1000000000000000000001 /* OnTimePerformanceService.swift in Sources */,
NF1100000000000000000001 /* SisterFlightService.swift in Sources */,
NF1200000000000000000001 /* StandbyStatsService.swift in Sources */,
NF1400000000000000000001 /* WeatherClient.swift in Sources */,
NHB00000000000000000001 /* HubLoadsView.swift in Sources */,
NSV00000000000000000001 /* SettingsView.swift in Sources */,
NF1600000000000000000001 /* DataIntegrityMonitor.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -539,6 +688,17 @@
buildActionMask = 2147483647;
files = (
T1000000000000000000001A /* AirlineLoadIntegrationTests.swift in Sources */,
FATEST00FATEST00FATEST01 /* FlightAwareScheduleClientTests.swift in Sources */,
TN0100000000000000000001 /* AirframeHistoryStoreTests.swift in Sources */,
TN0300000000000000000001 /* DataIntegrityMonitorTests.swift in Sources */,
TN0400000000000000000001 /* DelayCascadePredictorTests.swift in Sources */,
TN0500000000000000000001 /* EquipmentSwapServiceTests.swift in Sources */,
TN0600000000000000000001 /* HistoryFlightModelTests.swift in Sources */,
TN0800000000000000000001 /* LoadFactorServiceTests.swift in Sources */,
TN0900000000000000000001 /* SelftestRemovalTests.swift in Sources */,
TN1000000000000000000001 /* SisterFlightServiceTests.swift in Sources */,
TN1100000000000000000001 /* StandbyStatsServiceTests.swift in Sources */,
TN1300000000000000000001 /* WeatherClientTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -552,7 +712,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Flights/Flights.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = V3PF3M6B6U;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = Flights/Info.plist;
@@ -578,7 +738,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Flights/Flights.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = V3PF3M6B6U;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = Flights/Info.plist;
@@ -651,7 +811,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = V3PF3M6B6U;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
@@ -670,7 +830,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = V3PF3M6B6U;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;