Public edition prepared 2026-09-12. Personal/account/contact details are visibly redacted where present. The original SHA256 identifies the captured unredacted full file, not this redacted extract. PUBLIC-SHA256SUMS.txt identifies downloadable public files. This material is not a signed declaration or proof of an Apple-received Build.

# S16  Optional Apple WeatherKit and MapKit data

Project key: watermark
Original relative path: WatermarkCamera/WatermarkKit/EnvironmentalContextServices.swift
Captured: 2026-09-12T18:57:15+08:00
Original full-file SHA256: f9e65dcf1453a9e95d2ef063e08a3a76a98bd337c4d3e4470ddcdcf7ee5a4c2c
Evidence level: local source excerpt
Build correspondence: not yet established with an Apple-received binary.
Line numbers refer to the captured original file. Gaps are explicitly marked. No source code was changed.

## Original lines 51 to 74

```text
0051      }
0052  
0053      func snapshot(for location: CLLocation, now: Date = Date(), enabled: Bool) async -> WeatherSnapshot? {
0054          guard enabled else { return nil }
0055          if let cached = cache.freshSnapshot(for: location, now: now, timeToLive: timeToLive) { return cached }
0056          do {
0057              let current = try await WeatherKit.WeatherService.shared.weather(for: location, including: .current)
0058              let snapshot = WeatherSnapshot(
0059                  capturedAt: now,
0060                  condition: current.condition.description,
0061                  temperatureCelsius: current.temperature.converted(to: .celsius).value,
0062                  apparentTemperatureCelsius: current.apparentTemperature.converted(to: .celsius).value,
0063                  humidity: current.humidity,
0064                  windSpeedMetersPerSecond: current.wind.speed.converted(to: .metersPerSecond).value,
0065                  windDirectionDegrees: current.wind.direction.converted(to: .degrees).value
0066              )
0067              cache.store(snapshot, for: location)
0068              persist()
0069              return snapshot
0070          } catch {
0071              // Weather is optional. Missing entitlement, connectivity, or service
0072              // errors hide weather elements and never block capture.
0073              return nil
0074          }
```

## Original lines 99 to 132

```text
0099  
0100      func snapshot(for location: CLLocation) async -> String? {
0101          let name = String(format: "map-%.4f-%.4f.png", location.coordinate.latitude,
0102                            location.coordinate.longitude).replacingOccurrences(of: "-", with: "m")
0103          let url = directory.appendingPathComponent(name)
0104          if FileManager.default.fileExists(atPath: url.path) { return "MapSnapshots/\(name)" }
0105  
0106          let options = MKMapSnapshotter.Options()
0107          options.region = MKCoordinateRegion(center: location.coordinate,
0108                                              latitudinalMeters: 650,
0109                                              longitudinalMeters: 650)
0110          options.size = CGSize(width: 600, height: 360)
0111          options.scale = 2
0112          do {
0113              let snapshot = try await MKMapSnapshotter(options: options).start()
0114              let image = UIGraphicsImageRenderer(size: options.size).image { _ in
0115                  snapshot.image.draw(at: .zero)
0116                  let point = snapshot.point(for: location.coordinate)
0117                  UIColor.systemRed.setFill()
0118                  UIBezierPath(ovalIn: CGRect(x: point.x - 10, y: point.y - 10, width: 20, height: 20)).fill()
0119                  UIColor.white.setStroke()
0120                  let ring = UIBezierPath(ovalIn: CGRect(x: point.x - 10, y: point.y - 10, width: 20, height: 20))
0121                  ring.lineWidth = 3
0122                  ring.stroke()
0123              }
0124              guard let data = image.pngData() else { return nil }
0125              try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
0126              try data.write(to: url, options: .atomic)
0127              return "MapSnapshots/\(name)"
0128          } catch {
0129              return nil
0130          }
0131      }
0132  }
```
