From 88a3efc93d5ff769f5cc0e369a176974b649154a Mon Sep 17 00:00:00 2001 From: TriForMine Date: Fri, 29 May 2026 10:13:59 +0200 Subject: [PATCH 1/5] feat(expo): add scan debug tooling, torch, and robust local save/export flows --- .../src/features/scan/ScanPanel.tsx | 915 ++++++++---------- 1 file changed, 421 insertions(+), 494 deletions(-) diff --git a/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx b/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx index 2d18587..8566349 100644 --- a/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx +++ b/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx @@ -1,12 +1,10 @@ import { CameraView, useCameraPermissions } from "expo-camera"; -import * as NavigationBar from "expo-navigation-bar"; import * as FileSystem from "expo-file-system"; import * as ImageManipulator from "expo-image-manipulator"; -import { useMemo, useRef, useState } from "react"; -import { Modal, Vibration } from "react-native"; -import { Platform, useColorScheme } from "react-native"; +import * as NavigationBar from "expo-navigation-bar"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { Modal, Platform, useColorScheme, Vibration } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { useEffect } from "react"; import { scannerAdapter } from "@/adapters/scanner"; import { Image } from "@/tw/image"; @@ -17,522 +15,451 @@ const MODES = ["print", "screen", "burst"] as const; const GUIDE_ROI = { x: 0.06, y: 0.34, w: 0.88, h: 0.26 } as const; function getWritableBaseDir(): string | null { - const fsAny = FileSystem as unknown as { - documentDirectory?: string | null; - cacheDirectory?: string | null; - Paths?: { - document?: { uri?: string }; - cache?: { uri?: string }; - }; + const fsAny = FileSystem as unknown as { + documentDirectory?: string | null; + cacheDirectory?: string | null; + Paths?: { + document?: { uri?: string }; + cache?: { uri?: string }; }; - return ( - fsAny.documentDirectory ?? - fsAny.cacheDirectory ?? - fsAny.Paths?.document?.uri ?? - fsAny.Paths?.cache?.uri ?? - null - ); + }; + + return ( + fsAny.documentDirectory ?? + fsAny.cacheDirectory ?? + fsAny.Paths?.document?.uri ?? + fsAny.Paths?.cache?.uri ?? + null + ); } export function ScanPanel() { - const cameraRef = useRef(null); - const insets = useSafeAreaInsets(); - const colorScheme = useColorScheme(); - const [permission, requestPermission] = useCameraPermissions(); - const [mode, setMode] = useState<(typeof MODES)[number]>("print"); - const [verifyKeyHex, setVerifyKeyHex] = useState(""); - const [result, setResult] = useState(""); - const [resultOpen, setResultOpen] = useState(false); - const [debugEnabled, setDebugEnabled] = useState(false); - const [lastCaptureDataUri, setLastCaptureDataUri] = useState( - null, - ); - const [lastCaptureUri, setLastCaptureUri] = useState(null); - const [lastCaptureWidth, setLastCaptureWidth] = useState( - null, - ); - const [lastCaptureHeight, setLastCaptureHeight] = useState( - null, - ); - const [captureMs, setCaptureMs] = useState(null); - const [scanMs, setScanMs] = useState(null); - const [torchEnabled, setTorchEnabled] = useState(false); - const [loading, setLoading] = useState(false); - const [debugSaveMessage, setDebugSaveMessage] = useState( - null, - ); + const cameraRef = useRef(null); + const insets = useSafeAreaInsets(); + const colorScheme = useColorScheme(); + const [permission, requestPermission] = useCameraPermissions(); + const [mode, setMode] = useState<(typeof MODES)[number]>("print"); + const [verifyKeyHex, setVerifyKeyHex] = useState(""); + const [result, setResult] = useState(""); + const [resultOpen, setResultOpen] = useState(false); + const [debugEnabled, setDebugEnabled] = useState(false); + const [lastCaptureDataUri, setLastCaptureDataUri] = useState(null); + const [lastCaptureUri, setLastCaptureUri] = useState(null); + const [lastCaptureWidth, setLastCaptureWidth] = useState(null); + const [lastCaptureHeight, setLastCaptureHeight] = useState(null); + const [captureMs, setCaptureMs] = useState(null); + const [scanMs, setScanMs] = useState(null); + const [torchEnabled, setTorchEnabled] = useState(false); + const [loading, setLoading] = useState(false); + const [debugSaveMessage, setDebugSaveMessage] = useState(null); - const statusLabel = useMemo(() => { - if (!permission) { - return "Checking camera permission..."; - } - return permission.granted - ? "Camera ready" - : "Camera access required for live scanning"; - }, [permission]); + const statusLabel = useMemo(() => { + if (!permission) { + return "Checking camera permission..."; + } - useEffect(() => { - if (Platform.OS !== "android" || colorScheme !== "dark") { - return; - } - const applyNavStyle = async () => { - try { - await NavigationBar.setBackgroundColorAsync("#020617"); - await NavigationBar.setButtonStyleAsync("light"); - } catch { - // Ignore runtime/platform cases where nav bar styling is unavailable. - } - }; - void applyNavStyle(); - }, [colorScheme]); + return permission.granted + ? "Camera ready" + : "Camera access required for live scanning"; + }, [permission]); - const runScan = async () => { - setLoading(true); - try { - if (!cameraRef.current?.takePictureAsync) { - setResult("Camera capture is not ready yet."); - return; - } - const captureStart = Date.now(); - const shot = await cameraRef.current.takePictureAsync({ - base64: true, - quality: 0.9, - shutterSound: false, - }); - const captureElapsed = Date.now() - captureStart; - setCaptureMs(captureElapsed); - if (!shot?.base64) { - setResult("Failed to capture image from camera."); - return; - } - setLastCaptureUri(shot.uri ?? null); - setLastCaptureWidth( - typeof shot.width === "number" ? shot.width : null, - ); - setLastCaptureHeight( - typeof shot.height === "number" ? shot.height : null, - ); - if (debugEnabled) { - setLastCaptureDataUri(`data:image/jpeg;base64,${shot.base64}`); - } - const scanStart = Date.now(); - const json = await scannerAdapter.scanStill({ - mode, - verifyKeyHex: verifyKeyHex || undefined, - verifyKeyId: 1, - imageBase64: shot.base64, - roiX: GUIDE_ROI.x, - roiY: GUIDE_ROI.y, - roiW: GUIDE_ROI.w, - roiH: GUIDE_ROI.h, - }); - const scanElapsed = Date.now() - scanStart; - setScanMs(scanElapsed); - setResult(JSON.stringify(json, null, 2)); - if (json.ok) { - Vibration.vibrate(18); - } else { - Vibration.vibrate([0, 24, 36, 24]); - } - setResultOpen(true); - } finally { - setLoading(false); - } + useEffect(() => { + if (Platform.OS !== "android" || colorScheme !== "dark") { + return; + } + + const applyNavStyle = async () => { + try { + await NavigationBar.setBackgroundColorAsync("#020617"); + await NavigationBar.setButtonStyleAsync("light"); + } catch { + // Ignore runtime/platform cases where nav bar styling is unavailable. + } }; - const parsedResult = useMemo(() => { - try { - return JSON.parse(result) as { - ok?: boolean; - payload_utf8_lossy?: string; - payload_len?: number; - error?: string; - mode?: string; - }; - } catch { - return null; - } - }, [result]); + void applyNavStyle(); + }, [colorScheme]); - const saveDebugBundle = async () => { - setDebugSaveMessage(null); - if (!lastCaptureUri || !lastCaptureWidth || !lastCaptureHeight) { - setDebugSaveMessage("No captured image available yet."); - return; - } - try { - const dir = getWritableBaseDir(); - if (!dir) { - setDebugSaveMessage("No writable app directory available."); - return; - } - const stamp = Date.now(); - const outDir = `${dir}glyphnet-debug-${stamp}/`; - await FileSystem.makeDirectoryAsync(outDir, { - intermediates: true, - }); + const runScan = async () => { + setLoading(true); + try { + if (!cameraRef.current?.takePictureAsync) { + setResult("Camera capture is not ready yet."); + return; + } + + const captureStart = Date.now(); + const shot = await cameraRef.current.takePictureAsync({ + base64: true, + quality: 0.9, + shutterSound: false, + }); + const captureElapsed = Date.now() - captureStart; + setCaptureMs(captureElapsed); + + if (!shot?.base64) { + setResult("Failed to capture image from camera."); + return; + } - const captureOut = `${outDir}capture.jpg`; - await FileSystem.copyAsync({ - from: lastCaptureUri, - to: captureOut, - }); + setLastCaptureUri(shot.uri ?? null); + setLastCaptureWidth(typeof shot.width === "number" ? shot.width : null); + setLastCaptureHeight(typeof shot.height === "number" ? shot.height : null); + if (debugEnabled) { + setLastCaptureDataUri(`data:image/jpeg;base64,${shot.base64}`); + } - const crop = { - originX: Math.max( - 0, - Math.floor(lastCaptureWidth * GUIDE_ROI.x), - ), - originY: Math.max( - 0, - Math.floor(lastCaptureHeight * GUIDE_ROI.y), - ), - width: Math.max(1, Math.floor(lastCaptureWidth * GUIDE_ROI.w)), - height: Math.max( - 1, - Math.floor(lastCaptureHeight * GUIDE_ROI.h), - ), - }; - const cropped = await ImageManipulator.manipulateAsync( - lastCaptureUri, - [{ crop }], - { compress: 1, format: ImageManipulator.SaveFormat.JPEG }, - ); - const roiOut = `${outDir}roi.jpg`; - await FileSystem.copyAsync({ from: cropped.uri, to: roiOut }); + const scanStart = Date.now(); + const json = await scannerAdapter.scanStill({ + mode, + verifyKeyHex: verifyKeyHex || undefined, + verifyKeyId: 1, + imageBase64: shot.base64, + roiX: GUIDE_ROI.x, + roiY: GUIDE_ROI.y, + roiW: GUIDE_ROI.w, + roiH: GUIDE_ROI.h, + }); + const scanElapsed = Date.now() - scanStart; + setScanMs(scanElapsed); + setResult(JSON.stringify(json, null, 2)); - const debugJson = { - ts: stamp, - mode, - roi: GUIDE_ROI, - capture: { - width: lastCaptureWidth, - height: lastCaptureHeight, - captureMs, - scanMs, - }, - result: parsedResult ?? result, - }; - const jsonOut = `${outDir}result.json`; - await FileSystem.writeAsStringAsync( - jsonOut, - JSON.stringify(debugJson, null, 2), - { - encoding: FileSystem.EncodingType.UTF8, - }, - ); + if (json.ok) { + Vibration.vibrate(18); + } else { + Vibration.vibrate([0, 24, 36, 24]); + } + setResultOpen(true); + } finally { + setLoading(false); + } + }; - try { - const Sharing = await import("expo-sharing"); - if (await Sharing.isAvailableAsync()) { - await Sharing.shareAsync(roiOut, { - mimeType: "image/jpeg", - dialogTitle: "Share GlyphNet ROI debug image", - }); - } - } catch { - // no-op: sharing may be unavailable in current runtime. - } + const parsedResult = useMemo(() => { + try { + return JSON.parse(result) as { + ok?: boolean; + payload_utf8_lossy?: string; + payload_len?: number; + error?: string; + mode?: string; + }; + } catch { + return null; + } + }, [result]); - setDebugSaveMessage(`Saved debug bundle: ${outDir}`); - } catch (error) { - setDebugSaveMessage( - error instanceof Error - ? `Debug save failed: ${error.message}` - : "Debug save failed.", - ); + const saveDebugBundle = async () => { + setDebugSaveMessage(null); + if (!lastCaptureUri || !lastCaptureWidth || !lastCaptureHeight) { + setDebugSaveMessage("No captured image available yet."); + return; + } + + try { + const dir = getWritableBaseDir(); + if (!dir) { + setDebugSaveMessage("No writable app directory available."); + return; + } + + const stamp = Date.now(); + const outDir = `${dir}glyphnet-debug-${stamp}/`; + await FileSystem.makeDirectoryAsync(outDir, { intermediates: true }); + + const captureOut = `${outDir}capture.jpg`; + await FileSystem.copyAsync({ from: lastCaptureUri, to: captureOut }); + + const crop = { + originX: Math.max(0, Math.floor(lastCaptureWidth * GUIDE_ROI.x)), + originY: Math.max(0, Math.floor(lastCaptureHeight * GUIDE_ROI.y)), + width: Math.max(1, Math.floor(lastCaptureWidth * GUIDE_ROI.w)), + height: Math.max(1, Math.floor(lastCaptureHeight * GUIDE_ROI.h)), + }; + const cropped = await ImageManipulator.manipulateAsync(lastCaptureUri, [{ crop }], { + compress: 1, + format: ImageManipulator.SaveFormat.JPEG, + }); + const roiOut = `${outDir}roi.jpg`; + await FileSystem.copyAsync({ from: cropped.uri, to: roiOut }); + + const debugJson = { + ts: stamp, + mode, + roi: GUIDE_ROI, + capture: { + width: lastCaptureWidth, + height: lastCaptureHeight, + captureMs, + scanMs, + }, + result: parsedResult ?? result, + }; + const jsonOut = `${outDir}result.json`; + await FileSystem.writeAsStringAsync(jsonOut, JSON.stringify(debugJson, null, 2), { + encoding: FileSystem.EncodingType.UTF8, + }); + + try { + const Sharing = await import("expo-sharing"); + if (await Sharing.isAvailableAsync()) { + await Sharing.shareAsync(roiOut, { + mimeType: "image/jpeg", + dialogTitle: "Share GlyphNet ROI debug image", + }); } - }; + } catch { + // no-op: sharing may be unavailable in current runtime. + } - return ( - - {permission?.granted ? ( - - - + {permission?.granted ? ( + + + + + GlyphNet + + + + + + Align the GlyphNet code inside the blue ribbon frame + + + {MODES.map((candidate) => ( + setMode(candidate)} + className={`flex-1 rounded-xl border px-3 py-2 ${ + mode === candidate + ? "border-sky-400 bg-sky-500/30" + : "border-slate-400/60 bg-slate-900/40" + }`} + > + + {candidate} + + + ))} + + + setTorchEnabled((v) => !v)} + className={`flex-1 items-center rounded-xl border px-3 py-2 ${ + torchEnabled + ? "border-amber-300 bg-amber-500/30" + : "border-slate-400/60 bg-slate-900/40" + }`} + > + + Torch: {torchEnabled ? "On" : "Off"} + + + + setDebugEnabled((v) => !v)} + className={`mt-3 items-center rounded-xl border px-3 py-2 ${ + debugEnabled + ? "border-amber-300 bg-amber-500/25" + : "border-slate-400/60 bg-slate-900/40" + }`} + > + + Debug: {debugEnabled ? "On" : "Off"} + + + + + + {loading ? "Scanning..." : "Scan Still"} + + + + + + ) : ( + + {statusLabel} + + Allow Camera + + + )} + + setResultOpen(false)} + > + + + Scan Result + {parsedResult ? ( + + + + {parsedResult.ok ? "Scan succeeded" : "Scan failed"} + + {!!parsedResult.mode && ( + Mode: {parsedResult.mode} + )} + + Capture: {captureMs ?? "-"} ms | Scan: {scanMs ?? "-"} ms + + + + {parsedResult.ok ? ( + + Payload + + {parsedResult.payload_utf8_lossy || "(empty)"} + + {parsedResult.payload_len ?? 0} bytes + + ) : ( + + Error + + {parsedResult.error || "Unknown error"} + + + )} + + {debugEnabled && lastCaptureDataUri ? ( + + Debug Capture + ROI + + - - - GlyphNet - - - + - - - - Align the GlyphNet code inside the blue ribbon - frame - - - {MODES.map((candidate) => ( - setMode(candidate)} - className={`flex-1 rounded-xl border px-3 py-2 ${ - mode === candidate - ? "border-sky-400 bg-sky-500/30" - : "border-slate-400/60 bg-slate-900/40" - }`} - > - - {candidate} - - - ))} - - - setTorchEnabled((v) => !v)} - className={`flex-1 items-center rounded-xl border px-3 py-2 ${ - torchEnabled - ? "border-amber-300 bg-amber-500/30" - : "border-slate-400/60 bg-slate-900/40" - }`} - > - - Torch: {torchEnabled ? "On" : "Off"} - - - - setDebugEnabled((v) => !v)} - className={`mt-3 items-center rounded-xl border px-3 py-2 ${ - debugEnabled - ? "border-amber-300 bg-amber-500/25" - : "border-slate-400/60 bg-slate-900/40" - }`} - > - - Debug: {debugEnabled ? "On" : "Off"} - - - - - - {loading ? "Scanning..." : "Scan Still"} - - - + /> - - ) : ( - - - {statusLabel} - { + void saveDebugBundle(); + }} + className="mt-3 items-center rounded-xl border border-cyan-400/50 bg-cyan-500/20 px-3 py-2" > - - Allow Camera - + + Save Debug Bundle + - - )} - - setResultOpen(false)} - > - - - - Scan Result - - {parsedResult ? ( - - - - {parsedResult.ok - ? "Scan succeeded" - : "Scan failed"} - - {!!parsedResult.mode && ( - - Mode: {parsedResult.mode} - - )} - - Capture: {captureMs ?? "-"} ms | Scan:{" "} - {scanMs ?? "-"} ms - - - - {parsedResult.ok ? ( - - - Payload - - - {parsedResult.payload_utf8_lossy || - "(empty)"} - - - {parsedResult.payload_len ?? 0}{" "} - bytes - - - ) : ( - - - Error - - - {parsedResult.error || - "Unknown error"} - - - )} + {debugSaveMessage ? ( + {debugSaveMessage} + ) : null} + + ) : null} - {debugEnabled && lastCaptureDataUri ? ( - - - Debug Capture + ROI - - - - - - { - void saveDebugBundle(); - }} - className="mt-3 items-center rounded-xl border border-cyan-400/50 bg-cyan-500/20 px-3 py-2" - > - - Save Debug Bundle - - - {debugSaveMessage ? ( - - {debugSaveMessage} - - ) : null} - - ) : null} - - - {result} - - - ) : ( - - {result} - - )} + + {result} + + + ) : ( + + {result} + + )} - - setResultOpen(false)} - className="flex-1 items-center rounded-xl border border-slate-500 px-4 py-3" - > - - Close - - - { - setResultOpen(false); - void runScan(); - }} - className="flex-1 items-center rounded-xl bg-sky-600 px-4 py-3" - > - - Scan Again - - - - - - + + setResultOpen(false)} + className="flex-1 items-center rounded-xl border border-slate-500 px-4 py-3" + > + Close + + { + setResultOpen(false); + void runScan(); + }} + className="flex-1 items-center rounded-xl bg-sky-600 px-4 py-3" + > + Scan Again + + + - ); + + + ); } From 73d2391d5c5d17691e4c0f7f030dd63b8ab3d27a Mon Sep 17 00:00:00 2001 From: TriForMine Date: Fri, 29 May 2026 12:39:08 +0200 Subject: [PATCH 2/5] feat(expo): migrate debug save flows to new expo-file-system API --- .../src/features/encode/EncodePanel.tsx | 35 +- .../src/features/scan/ScanPanel.tsx | 896 +++++++++--------- 2 files changed, 477 insertions(+), 454 deletions(-) diff --git a/apps/expo-glyphnet/src/features/encode/EncodePanel.tsx b/apps/expo-glyphnet/src/features/encode/EncodePanel.tsx index 52f6936..a921246 100644 --- a/apps/expo-glyphnet/src/features/encode/EncodePanel.tsx +++ b/apps/expo-glyphnet/src/features/encode/EncodePanel.tsx @@ -1,4 +1,4 @@ -import * as FileSystem from "expo-file-system"; +import { Directory, File, Paths } from "expo-file-system"; import * as MediaLibrary from "expo-media-library"; import * as Print from "expo-print"; import { useMemo, useState } from "react"; @@ -7,24 +7,6 @@ import { SvgXml } from "react-native-svg"; import { scannerAdapter } from "@/adapters/scanner"; import { Pressable, Text, TextInput, View } from "@/tw"; -function getWritableBaseDir(): string | null { - const fsAny = FileSystem as unknown as { - documentDirectory?: string | null; - cacheDirectory?: string | null; - Paths?: { - document?: { uri?: string }; - cache?: { uri?: string }; - }; - }; - return ( - fsAny.documentDirectory ?? - fsAny.cacheDirectory ?? - fsAny.Paths?.document?.uri ?? - fsAny.Paths?.cache?.uri ?? - null - ); -} - export function EncodePanel() { const [payload, setPayload] = useState("hello glyphnet"); const [svgPreview, setSvgPreview] = useState(""); @@ -63,15 +45,12 @@ export function EncodePanel() { return; } try { - const dir = getWritableBaseDir(); - if (!dir) { - setActionMessage("Unable to access local storage."); - return; - } - const uri = `${dir}glyphnet-${Date.now()}.svg`; - await FileSystem.writeAsStringAsync(uri, svgPreview, { - encoding: FileSystem.EncodingType.UTF8, - }); + const exportDir = new Directory(Paths.document, "glyphnet-exports"); + exportDir.create({ idempotent: true, intermediates: true }); + const file = new File(exportDir, `glyphnet-${Date.now()}.svg`); + file.create({ overwrite: true, intermediates: true }); + file.write(svgPreview, { encoding: "utf8" }); + const uri = file.uri; let savedToLibrary = false; try { const perm = await MediaLibrary.requestPermissionsAsync(); diff --git a/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx b/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx index 8566349..62e5765 100644 --- a/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx +++ b/apps/expo-glyphnet/src/features/scan/ScanPanel.tsx @@ -1,10 +1,12 @@ import { CameraView, useCameraPermissions } from "expo-camera"; -import * as FileSystem from "expo-file-system"; -import * as ImageManipulator from "expo-image-manipulator"; +import { Directory, File, Paths } from "expo-file-system"; import * as NavigationBar from "expo-navigation-bar"; -import { useEffect, useMemo, useRef, useState } from "react"; -import { Modal, Platform, useColorScheme, Vibration } from "react-native"; +import * as ImageManipulator from "expo-image-manipulator"; +import { useMemo, useRef, useState } from "react"; +import { Modal, Vibration } from "react-native"; +import { Platform, useColorScheme } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { useEffect } from "react"; import { scannerAdapter } from "@/adapters/scanner"; import { Image } from "@/tw/image"; @@ -14,452 +16,494 @@ const MODES = ["print", "screen", "burst"] as const; // Wide ribbon-like scan guide (GlyphNet print profile), centered in portrait view. const GUIDE_ROI = { x: 0.06, y: 0.34, w: 0.88, h: 0.26 } as const; -function getWritableBaseDir(): string | null { - const fsAny = FileSystem as unknown as { - documentDirectory?: string | null; - cacheDirectory?: string | null; - Paths?: { - document?: { uri?: string }; - cache?: { uri?: string }; - }; - }; - - return ( - fsAny.documentDirectory ?? - fsAny.cacheDirectory ?? - fsAny.Paths?.document?.uri ?? - fsAny.Paths?.cache?.uri ?? - null - ); -} - export function ScanPanel() { - const cameraRef = useRef(null); - const insets = useSafeAreaInsets(); - const colorScheme = useColorScheme(); - const [permission, requestPermission] = useCameraPermissions(); - const [mode, setMode] = useState<(typeof MODES)[number]>("print"); - const [verifyKeyHex, setVerifyKeyHex] = useState(""); - const [result, setResult] = useState(""); - const [resultOpen, setResultOpen] = useState(false); - const [debugEnabled, setDebugEnabled] = useState(false); - const [lastCaptureDataUri, setLastCaptureDataUri] = useState(null); - const [lastCaptureUri, setLastCaptureUri] = useState(null); - const [lastCaptureWidth, setLastCaptureWidth] = useState(null); - const [lastCaptureHeight, setLastCaptureHeight] = useState(null); - const [captureMs, setCaptureMs] = useState(null); - const [scanMs, setScanMs] = useState(null); - const [torchEnabled, setTorchEnabled] = useState(false); - const [loading, setLoading] = useState(false); - const [debugSaveMessage, setDebugSaveMessage] = useState(null); + const cameraRef = useRef(null); + const insets = useSafeAreaInsets(); + const colorScheme = useColorScheme(); + const [permission, requestPermission] = useCameraPermissions(); + const [mode, setMode] = useState<(typeof MODES)[number]>("print"); + const [verifyKeyHex, setVerifyKeyHex] = useState(""); + const [result, setResult] = useState(""); + const [resultOpen, setResultOpen] = useState(false); + const [debugEnabled, setDebugEnabled] = useState(false); + const [lastCaptureDataUri, setLastCaptureDataUri] = useState( + null, + ); + const [lastCaptureUri, setLastCaptureUri] = useState(null); + const [lastCaptureWidth, setLastCaptureWidth] = useState( + null, + ); + const [lastCaptureHeight, setLastCaptureHeight] = useState( + null, + ); + const [captureMs, setCaptureMs] = useState(null); + const [scanMs, setScanMs] = useState(null); + const [torchEnabled, setTorchEnabled] = useState(false); + const [loading, setLoading] = useState(false); + const [debugSaveMessage, setDebugSaveMessage] = useState( + null, + ); - const statusLabel = useMemo(() => { - if (!permission) { - return "Checking camera permission..."; - } - - return permission.granted - ? "Camera ready" - : "Camera access required for live scanning"; - }, [permission]); + const statusLabel = useMemo(() => { + if (!permission) { + return "Checking camera permission..."; + } + return permission.granted + ? "Camera ready" + : "Camera access required for live scanning"; + }, [permission]); - useEffect(() => { - if (Platform.OS !== "android" || colorScheme !== "dark") { - return; - } + useEffect(() => { + if (Platform.OS !== "android" || colorScheme !== "dark") { + return; + } + const applyNavStyle = async () => { + try { + await NavigationBar.setBackgroundColorAsync("#020617"); + await NavigationBar.setButtonStyleAsync("light"); + } catch { + // Ignore runtime/platform cases where nav bar styling is unavailable. + } + }; + void applyNavStyle(); + }, [colorScheme]); - const applyNavStyle = async () => { - try { - await NavigationBar.setBackgroundColorAsync("#020617"); - await NavigationBar.setButtonStyleAsync("light"); - } catch { - // Ignore runtime/platform cases where nav bar styling is unavailable. - } + const runScan = async () => { + setLoading(true); + try { + if (!cameraRef.current?.takePictureAsync) { + setResult("Camera capture is not ready yet."); + return; + } + const captureStart = Date.now(); + const shot = await cameraRef.current.takePictureAsync({ + base64: true, + quality: 0.9, + shutterSound: false, + }); + const captureElapsed = Date.now() - captureStart; + setCaptureMs(captureElapsed); + if (!shot?.base64) { + setResult("Failed to capture image from camera."); + return; + } + setLastCaptureUri(shot.uri ?? null); + setLastCaptureWidth( + typeof shot.width === "number" ? shot.width : null, + ); + setLastCaptureHeight( + typeof shot.height === "number" ? shot.height : null, + ); + if (debugEnabled) { + setLastCaptureDataUri(`data:image/jpeg;base64,${shot.base64}`); + } + const scanStart = Date.now(); + const json = await scannerAdapter.scanStill({ + mode, + verifyKeyHex: verifyKeyHex || undefined, + verifyKeyId: 1, + imageBase64: shot.base64, + roiX: GUIDE_ROI.x, + roiY: GUIDE_ROI.y, + roiW: GUIDE_ROI.w, + roiH: GUIDE_ROI.h, + }); + const scanElapsed = Date.now() - scanStart; + setScanMs(scanElapsed); + setResult(JSON.stringify(json, null, 2)); + if (json.ok) { + Vibration.vibrate(18); + } else { + Vibration.vibrate([0, 24, 36, 24]); + } + setResultOpen(true); + } finally { + setLoading(false); + } }; - void applyNavStyle(); - }, [colorScheme]); - - const runScan = async () => { - setLoading(true); - try { - if (!cameraRef.current?.takePictureAsync) { - setResult("Camera capture is not ready yet."); - return; - } - - const captureStart = Date.now(); - const shot = await cameraRef.current.takePictureAsync({ - base64: true, - quality: 0.9, - shutterSound: false, - }); - const captureElapsed = Date.now() - captureStart; - setCaptureMs(captureElapsed); - - if (!shot?.base64) { - setResult("Failed to capture image from camera."); - return; - } - - setLastCaptureUri(shot.uri ?? null); - setLastCaptureWidth(typeof shot.width === "number" ? shot.width : null); - setLastCaptureHeight(typeof shot.height === "number" ? shot.height : null); - if (debugEnabled) { - setLastCaptureDataUri(`data:image/jpeg;base64,${shot.base64}`); - } - - const scanStart = Date.now(); - const json = await scannerAdapter.scanStill({ - mode, - verifyKeyHex: verifyKeyHex || undefined, - verifyKeyId: 1, - imageBase64: shot.base64, - roiX: GUIDE_ROI.x, - roiY: GUIDE_ROI.y, - roiW: GUIDE_ROI.w, - roiH: GUIDE_ROI.h, - }); - const scanElapsed = Date.now() - scanStart; - setScanMs(scanElapsed); - setResult(JSON.stringify(json, null, 2)); - - if (json.ok) { - Vibration.vibrate(18); - } else { - Vibration.vibrate([0, 24, 36, 24]); - } - setResultOpen(true); - } finally { - setLoading(false); - } - }; - - const parsedResult = useMemo(() => { - try { - return JSON.parse(result) as { - ok?: boolean; - payload_utf8_lossy?: string; - payload_len?: number; - error?: string; - mode?: string; - }; - } catch { - return null; - } - }, [result]); - - const saveDebugBundle = async () => { - setDebugSaveMessage(null); - if (!lastCaptureUri || !lastCaptureWidth || !lastCaptureHeight) { - setDebugSaveMessage("No captured image available yet."); - return; - } + const parsedResult = useMemo(() => { + try { + return JSON.parse(result) as { + ok?: boolean; + payload_utf8_lossy?: string; + payload_len?: number; + error?: string; + mode?: string; + }; + } catch { + return null; + } + }, [result]); - try { - const dir = getWritableBaseDir(); - if (!dir) { - setDebugSaveMessage("No writable app directory available."); - return; - } + const saveDebugBundle = async () => { + setDebugSaveMessage(null); + if (!lastCaptureUri || !lastCaptureWidth || !lastCaptureHeight) { + setDebugSaveMessage("No captured image available yet."); + return; + } + try { + const stamp = Date.now(); + const outDir = new Directory(Paths.document, `glyphnet-debug-${stamp}`); + outDir.create({ idempotent: true, intermediates: true }); - const stamp = Date.now(); - const outDir = `${dir}glyphnet-debug-${stamp}/`; - await FileSystem.makeDirectoryAsync(outDir, { intermediates: true }); + const captureOut = new File(outDir, "capture.jpg"); + captureOut.create({ overwrite: true, intermediates: true }); + new File(lastCaptureUri).copy(captureOut, { overwrite: true }); - const captureOut = `${outDir}capture.jpg`; - await FileSystem.copyAsync({ from: lastCaptureUri, to: captureOut }); + const crop = { + originX: Math.max( + 0, + Math.floor(lastCaptureWidth * GUIDE_ROI.x), + ), + originY: Math.max( + 0, + Math.floor(lastCaptureHeight * GUIDE_ROI.y), + ), + width: Math.max(1, Math.floor(lastCaptureWidth * GUIDE_ROI.w)), + height: Math.max( + 1, + Math.floor(lastCaptureHeight * GUIDE_ROI.h), + ), + }; + const cropped = await ImageManipulator.manipulateAsync( + lastCaptureUri, + [{ crop }], + { compress: 1, format: ImageManipulator.SaveFormat.JPEG }, + ); + const roiOut = new File(outDir, "roi.jpg"); + roiOut.create({ overwrite: true, intermediates: true }); + new File(cropped.uri).copy(roiOut, { overwrite: true }); - const crop = { - originX: Math.max(0, Math.floor(lastCaptureWidth * GUIDE_ROI.x)), - originY: Math.max(0, Math.floor(lastCaptureHeight * GUIDE_ROI.y)), - width: Math.max(1, Math.floor(lastCaptureWidth * GUIDE_ROI.w)), - height: Math.max(1, Math.floor(lastCaptureHeight * GUIDE_ROI.h)), - }; - const cropped = await ImageManipulator.manipulateAsync(lastCaptureUri, [{ crop }], { - compress: 1, - format: ImageManipulator.SaveFormat.JPEG, - }); - const roiOut = `${outDir}roi.jpg`; - await FileSystem.copyAsync({ from: cropped.uri, to: roiOut }); + const debugJson = { + ts: stamp, + mode, + roi: GUIDE_ROI, + capture: { + width: lastCaptureWidth, + height: lastCaptureHeight, + captureMs, + scanMs, + }, + result: parsedResult ?? result, + }; + const jsonOut = new File(outDir, "result.json"); + jsonOut.create({ overwrite: true, intermediates: true }); + jsonOut.write(JSON.stringify(debugJson, null, 2), { + encoding: "utf8", + }); - const debugJson = { - ts: stamp, - mode, - roi: GUIDE_ROI, - capture: { - width: lastCaptureWidth, - height: lastCaptureHeight, - captureMs, - scanMs, - }, - result: parsedResult ?? result, - }; - const jsonOut = `${outDir}result.json`; - await FileSystem.writeAsStringAsync(jsonOut, JSON.stringify(debugJson, null, 2), { - encoding: FileSystem.EncodingType.UTF8, - }); + try { + const Sharing = await import("expo-sharing"); + if (await Sharing.isAvailableAsync()) { + await Sharing.shareAsync(roiOut.uri, { + mimeType: "image/jpeg", + dialogTitle: "Share GlyphNet ROI debug image", + }); + } + } catch { + // no-op: sharing may be unavailable in current runtime. + } - try { - const Sharing = await import("expo-sharing"); - if (await Sharing.isAvailableAsync()) { - await Sharing.shareAsync(roiOut, { - mimeType: "image/jpeg", - dialogTitle: "Share GlyphNet ROI debug image", - }); + setDebugSaveMessage(`Saved debug bundle: ${outDir.uri}`); + } catch (error) { + setDebugSaveMessage( + error instanceof Error + ? `Debug save failed: ${error.message}` + : "Debug save failed.", + ); } - } catch { - // no-op: sharing may be unavailable in current runtime. - } - - setDebugSaveMessage(`Saved debug bundle: ${outDir}`); - } catch (error) { - setDebugSaveMessage( - error instanceof Error ? `Debug save failed: ${error.message}` : "Debug save failed.", - ); - } - }; - - return ( - - {permission?.granted ? ( - - - - - GlyphNet - - - - - - Align the GlyphNet code inside the blue ribbon frame - - - {MODES.map((candidate) => ( - setMode(candidate)} - className={`flex-1 rounded-xl border px-3 py-2 ${ - mode === candidate - ? "border-sky-400 bg-sky-500/30" - : "border-slate-400/60 bg-slate-900/40" - }`} - > - - {candidate} - - - ))} - - - setTorchEnabled((v) => !v)} - className={`flex-1 items-center rounded-xl border px-3 py-2 ${ - torchEnabled - ? "border-amber-300 bg-amber-500/30" - : "border-slate-400/60 bg-slate-900/40" - }`} - > - - Torch: {torchEnabled ? "On" : "Off"} - - - - setDebugEnabled((v) => !v)} - className={`mt-3 items-center rounded-xl border px-3 py-2 ${ - debugEnabled - ? "border-amber-300 bg-amber-500/25" - : "border-slate-400/60 bg-slate-900/40" - }`} - > - - Debug: {debugEnabled ? "On" : "Off"} - - - - - - {loading ? "Scanning..." : "Scan Still"} - - - - - - ) : ( - - {statusLabel} - - Allow Camera - - - )} - - setResultOpen(false)} - > - - - Scan Result - {parsedResult ? ( - - - - {parsedResult.ok ? "Scan succeeded" : "Scan failed"} - - {!!parsedResult.mode && ( - Mode: {parsedResult.mode} - )} - - Capture: {captureMs ?? "-"} ms | Scan: {scanMs ?? "-"} ms - - - - {parsedResult.ok ? ( - - Payload - - {parsedResult.payload_utf8_lossy || "(empty)"} - - {parsedResult.payload_len ?? 0} bytes - - ) : ( - - Error - - {parsedResult.error || "Unknown error"} - - - )} + }; - {debugEnabled && lastCaptureDataUri ? ( - - Debug Capture + ROI - - + {permission?.granted ? ( + + + - + + + GlyphNet + + + + /> + + + + Align the GlyphNet code inside the blue ribbon + frame + + + {MODES.map((candidate) => ( + setMode(candidate)} + className={`flex-1 rounded-xl border px-3 py-2 ${ + mode === candidate + ? "border-sky-400 bg-sky-500/30" + : "border-slate-400/60 bg-slate-900/40" + }`} + > + + {candidate} + + + ))} + + + setTorchEnabled((v) => !v)} + className={`flex-1 items-center rounded-xl border px-3 py-2 ${ + torchEnabled + ? "border-amber-300 bg-amber-500/30" + : "border-slate-400/60 bg-slate-900/40" + }`} + > + + Torch: {torchEnabled ? "On" : "Off"} + + + + setDebugEnabled((v) => !v)} + className={`mt-3 items-center rounded-xl border px-3 py-2 ${ + debugEnabled + ? "border-amber-300 bg-amber-500/25" + : "border-slate-400/60 bg-slate-900/40" + }`} + > + + Debug: {debugEnabled ? "On" : "Off"} + + + + + + {loading ? "Scanning..." : "Scan Still"} + + + + + ) : ( + + + {statusLabel} + { - void saveDebugBundle(); - }} - className="mt-3 items-center rounded-xl border border-cyan-400/50 bg-cyan-500/20 px-3 py-2" + onPress={requestPermission} + className="mt-4 rounded-xl bg-sky-600 px-4 py-2 active:opacity-80" > - - Save Debug Bundle - + + Allow Camera + - {debugSaveMessage ? ( - {debugSaveMessage} - ) : null} - - ) : null} - - - {result} - - - ) : ( - - {result} - + )} - - setResultOpen(false)} - className="flex-1 items-center rounded-xl border border-slate-500 px-4 py-3" - > - Close - - { - setResultOpen(false); - void runScan(); - }} - className="flex-1 items-center rounded-xl bg-sky-600 px-4 py-3" - > - Scan Again - - - + setResultOpen(false)} + > + + + + Scan Result + + {parsedResult ? ( + + + + {parsedResult.ok + ? "Scan succeeded" + : "Scan failed"} + + {!!parsedResult.mode && ( + + Mode: {parsedResult.mode} + + )} + + Capture: {captureMs ?? "-"} ms | Scan:{" "} + {scanMs ?? "-"} ms + + + + {parsedResult.ok ? ( + + + Payload + + + {parsedResult.payload_utf8_lossy || + "(empty)"} + + + {parsedResult.payload_len ?? 0}{" "} + bytes + + + ) : ( + + + Error + + + {parsedResult.error || + "Unknown error"} + + + )} + + {debugEnabled && lastCaptureDataUri ? ( + + + Debug Capture + ROI + + + + + + { + void saveDebugBundle(); + }} + className="mt-3 items-center rounded-xl border border-cyan-400/50 bg-cyan-500/20 px-3 py-2" + > + + Save Debug Bundle + + + {debugSaveMessage ? ( + + {debugSaveMessage} + + ) : null} + + ) : null} + + + {result} + + + ) : ( + + {result} + + )} + + + setResultOpen(false)} + className="flex-1 items-center rounded-xl border border-slate-500 px-4 py-3" + > + + Close + + + { + setResultOpen(false); + void runScan(); + }} + className="flex-1 items-center rounded-xl bg-sky-600 px-4 py-3" + > + + Scan Again + + + + + + - - - ); + ); } From 97ccbd930bbae212ff1908760ebc61a7ed94bb22 Mon Sep 17 00:00:00 2001 From: TriForMine Date: Fri, 29 May 2026 17:58:53 +0200 Subject: [PATCH 3/5] fix: progress on app capture scan fixtures --- crates/glyphnet-decode/src/lib.rs | 17 +++ crates/glyphnet-decode/src/recovery.rs | 50 ++++++- crates/glyphnet-ecc/src/lib.rs | 18 +++ crates/glyphnet-scanner/src/decode_paths.rs | 149 +++++++++++++++++++- 4 files changed, 228 insertions(+), 6 deletions(-) diff --git a/crates/glyphnet-decode/src/lib.rs b/crates/glyphnet-decode/src/lib.rs index 8911b96..e4ffd2d 100644 --- a/crates/glyphnet-decode/src/lib.rs +++ b/crates/glyphnet-decode/src/lib.rs @@ -102,6 +102,23 @@ pub fn decode_matrix(matrix: &SymbolMatrix) -> Result { decode_matrix_with_suspects(matrix, &[]) } +/// Decode a matrix while prioritizing likely-corrupted byte indexes for ECC recovery. +pub fn decode_matrix_with_suspect_bytes( + matrix: &SymbolMatrix, + suspect_bytes: &[usize], +) -> Result { + decode_matrix_with_suspects(matrix, suspect_bytes) +} + +/// Rank likely-corrupted byte indexes from per-data-bit confidence scores. +pub fn suspect_bytes_from_confidence( + matrix: &SymbolMatrix, + bit_confidence: &[u8], + limit: usize, +) -> Vec { + suspect_bytes_from_bit_confidence(matrix, bit_confidence, limit) +} + /// Raster image decoder. #[derive(Debug, Clone, PartialEq, Eq)] pub struct RasterDecoder { diff --git a/crates/glyphnet-decode/src/recovery.rs b/crates/glyphnet-decode/src/recovery.rs index 40aa0e1..2a5cfc9 100644 --- a/crates/glyphnet-decode/src/recovery.rs +++ b/crates/glyphnet-decode/src/recovery.rs @@ -1,4 +1,7 @@ -use glyphnet_core::{Frame, FrameHeader, HEADER_LEN, SymbolMatrix, bitstream}; +use glyphnet_core::{ + EccLevel, Frame, FrameHeader, GlyphError, HEADER_LEN, MAGIC, SymbolMatrix, TransmissionMode, + WIRE_VERSION, bitstream, +}; use glyphnet_ecc::{ RecoveryMethod, RecoveryTelemetry, try_recover_for_mode_with_suspects_and_telemetry, verify_for_mode, @@ -13,8 +16,16 @@ pub(crate) fn decode_matrix_with_suspects( suspect_bytes: &[usize], ) -> Result { let bits = matrix.read_data_bits(); - let sampled_bytes = bitstream::bits_to_bytes(&bits); - let header = FrameHeader::decode(&sampled_bytes)?; + let mut sampled_bytes = bitstream::bits_to_bytes(&bits); + let header = match FrameHeader::decode(&sampled_bytes) { + Ok(header) => header, + Err(GlyphError::HeaderChecksumMismatch) => { + let header = decode_header_fields_without_crc(&sampled_bytes)?; + sampled_bytes[28..32].copy_from_slice(&header.header_crc.to_be_bytes()); + header + } + Err(error) => return Err(error.into()), + }; let data_len = HEADER_LEN + header.payload_len as usize; if verify_for_mode(header.mode, header.ecc_level, &sampled_bytes, data_len) { let frame = Frame::decode(&sampled_bytes)?; @@ -60,3 +71,36 @@ pub(crate) fn decode_matrix_with_suspects( Err(DecodeError::EccMismatch) } + +fn decode_header_fields_without_crc(bytes: &[u8]) -> std::result::Result { + if bytes.len() < HEADER_LEN { + return Err(GlyphError::Truncated { + needed: HEADER_LEN, + actual: bytes.len(), + }); + } + if bytes[0..4] != MAGIC { + return Err(GlyphError::InvalidMagic); + } + if bytes[4] != WIRE_VERSION { + return Err(GlyphError::UnsupportedVersion(bytes[4])); + } + let mode = TransmissionMode::from_wire(bytes[5])?; + let ecc_level = EccLevel::from_wire(bytes[6])?; + let frame_index = u16::from_be_bytes([bytes[8], bytes[9]]); + let frame_count = u16::from_be_bytes([bytes[10], bytes[11]]); + let stream_id = u64::from_be_bytes([ + bytes[12], bytes[13], bytes[14], bytes[15], bytes[16], bytes[17], bytes[18], bytes[19], + ]); + let payload_len = u32::from_be_bytes([bytes[20], bytes[21], bytes[22], bytes[23]]); + let payload_crc = u32::from_be_bytes([bytes[24], bytes[25], bytes[26], bytes[27]]); + FrameHeader::new( + mode, + ecc_level, + frame_index, + frame_count, + stream_id, + payload_len, + payload_crc, + ) +} diff --git a/crates/glyphnet-ecc/src/lib.rs b/crates/glyphnet-ecc/src/lib.rs index f78e5a4..1452011 100644 --- a/crates/glyphnet-ecc/src/lib.rs +++ b/crates/glyphnet-ecc/src/lib.rs @@ -602,6 +602,24 @@ pub fn try_recover_for_mode_with_suspects_and_telemetry( } } } + for count in 3..=suspect_pool.len().min(rs.parity_shards) { + attempts += 1; + if attempts > max_attempts { + telemetry.attempts = attempts; + telemetry.max_attempts_exceeded = true; + return (None, telemetry); + } + if let Some(candidate) = + rs.recover_data_shards(&normalized, data_len, &suspect_pool[..count]) + && rs.verify(&candidate, data_len) + && Frame::decode(&candidate).is_ok() + { + telemetry.recovered = true; + telemetry.attempts = attempts; + telemetry.method = RecoveryMethod::ReedSolomonPair; + return (Some(to_encoded_layout(candidate)), telemetry); + } + } } for (index, already_tried) in tried_index.iter().enumerate().take(data_len) { if *already_tried { diff --git a/crates/glyphnet-scanner/src/decode_paths.rs b/crates/glyphnet-scanner/src/decode_paths.rs index cdcc673..7a424a6 100644 --- a/crates/glyphnet-scanner/src/decode_paths.rs +++ b/crates/glyphnet-scanner/src/decode_paths.rs @@ -1,8 +1,9 @@ use glyphnet_core::{Cell, FrameHeader, HEADER_LEN, LayoutFamily, SymbolMatrix, bitstream, layout}; +use glyphnet_cv::{Point, Quad, warp_perspective_gray}; use glyphnet_decode::{ - AutoDecodedSymbol, DecodeError, DecodeOptions, RasterDecoder, decode_matrix, + AutoDecodedSymbol, DecodeError, DecodeOptions, RasterDecoder, decode_matrix_with_suspect_bytes, }; -use image::{DynamicImage, GrayImage}; +use image::{DynamicImage, GrayImage, Luma}; use crate::ScanRegion; @@ -169,6 +170,10 @@ fn decode_fractional_ribbon_candidate( thresholds.sort_unstable(); thresholds.dedup(); + if let Ok(decoded) = decode_normalized_dark_bounds_ribbon(&luma, otsu) { + return Ok(decoded); + } + for scale_adjust in [1.0_f32, 0.985, 1.015, 0.97, 1.03] { let scale_x = base_scale_x * scale_adjust; let scale_y = base_scale_y * scale_adjust; @@ -216,6 +221,140 @@ fn module_shifts(radius: i32) -> impl Iterator { (-radius * 2..=radius * 2).map(|value| value as f32 * 0.5) } +fn decode_normalized_dark_bounds_ribbon( + luma: &GrayImage, + otsu: u8, +) -> std::result::Result { + const MODULE_PX: u32 = 4; + const SYMBOL_WIDTH: u32 = 96; + const SYMBOL_HEIGHT: u32 = 36; + const QUIET_MODULES: u32 = 4; + const TOTAL_WIDTH: u32 = (SYMBOL_WIDTH + QUIET_MODULES * 2) * MODULE_PX; + const TOTAL_HEIGHT: u32 = (SYMBOL_HEIGHT + QUIET_MODULES * 2) * MODULE_PX; + + for threshold in [otsu.saturating_sub(80).clamp(40, 72), 48, 56] { + let Some(bounds) = dark_bounds_luma(luma, threshold) else { + continue; + }; + let (min_x, min_y, max_x, max_y) = bounds; + let width = max_x.saturating_sub(min_x).saturating_add(1); + let height = max_y.saturating_sub(min_y).saturating_add(1); + if width < SYMBOL_WIDTH || height < SYMBOL_HEIGHT { + continue; + } + let Some(quad) = dark_content_quad(luma, threshold, min_x, max_x) else { + continue; + }; + let mut normalized = warp_perspective_gray( + luma, + quad, + SYMBOL_WIDTH * MODULE_PX, + SYMBOL_HEIGHT * MODULE_PX, + ) + .map_err(|_| DecodeError::AutoDetectFailed)?; + let normalized_threshold = fractional_threshold(&normalized).clamp(96, 160); + for pixel in normalized.pixels_mut() { + pixel.0[0] = if pixel.0[0] < normalized_threshold { + 0 + } else { + 255 + }; + } + let mut canvas = GrayImage::from_pixel(TOTAL_WIDTH, TOTAL_HEIGHT, Luma([255])); + image::imageops::overlay( + &mut canvas, + &normalized, + i64::from(QUIET_MODULES * MODULE_PX), + i64::from(QUIET_MODULES * MODULE_PX), + ); + let image = DynamicImage::ImageLuma8(canvas); + let region = ScanRegion { + x: 0, + y: 0, + width: TOTAL_WIDTH, + height: TOTAL_HEIGHT, + }; + if let Ok(decoded) = decode_exact_ribbon_candidate(&image, region) { + return Ok(decoded); + } + } + Err(DecodeError::AutoDetectFailed) +} + +fn dark_content_quad(luma: &GrayImage, threshold: u8, min_x: u32, max_x: u32) -> Option { + let span = max_x.saturating_sub(min_x).saturating_add(1); + let band = (span / 5).max(16); + let left = vertical_dark_extent(luma, threshold, min_x, min_x.saturating_add(band))?; + let right = vertical_dark_extent(luma, threshold, max_x.saturating_sub(band), max_x)?; + let expand_edge = |top: u32, bottom: u32| { + let module = bottom.saturating_sub(top).max(1) as f32 / 29.0; + ( + (top as f32 - module * 3.0).max(0.0), + (bottom as f32 + module * 4.0).min(luma.height().saturating_sub(1) as f32), + ) + }; + let left = expand_edge(left.0, left.1); + let right = expand_edge(right.0, right.1); + Some(Quad { + top_left: Point { + x: min_x as f32, + y: left.0, + }, + top_right: Point { + x: max_x as f32, + y: right.0, + }, + bottom_right: Point { + x: max_x as f32, + y: right.1, + }, + bottom_left: Point { + x: min_x as f32, + y: left.1, + }, + }) +} + +fn vertical_dark_extent( + luma: &GrayImage, + threshold: u8, + start_x: u32, + end_x: u32, +) -> Option<(u32, u32)> { + let mut min_y = u32::MAX; + let mut max_y = 0u32; + let mut found = false; + for y in 0..luma.height() { + for x in start_x..=end_x.min(luma.width().saturating_sub(1)) { + if luma.get_pixel(x, y)[0] < threshold { + min_y = min_y.min(y); + max_y = max_y.max(y); + found = true; + } + } + } + found.then_some((min_y, max_y)) +} + +fn dark_bounds_luma(luma: &GrayImage, threshold: u8) -> Option<(u32, u32, u32, u32)> { + let mut min_x = u32::MAX; + let mut min_y = u32::MAX; + let mut max_x = 0u32; + let mut max_y = 0u32; + let mut found = false; + for (x, y, pixel) in luma.enumerate_pixels() { + if pixel[0] >= threshold { + continue; + } + found = true; + min_x = min_x.min(x); + min_y = min_y.min(y); + max_x = max_x.max(x); + max_y = max_y.max(y); + } + found.then_some((min_x, min_y, max_x, max_y)) +} + fn fractional_header_precheck( integral: &IntegralGray, origin_x_modules: f32, @@ -290,6 +429,7 @@ fn decode_fractional_with_params( let mut matrix = SymbolMatrix::with_layout(SYMBOL_WIDTH, SYMBOL_HEIGHT, LayoutFamily::RibbonWeave); + let mut bit_confidence = Vec::new(); for y in 0..SYMBOL_HEIGHT { for x in 0..SYMBOL_WIDTH { if let Some(cell) = layout::function_cell_for( @@ -310,10 +450,13 @@ fn decode_fractional_with_params( scale_y, ); matrix.set(x, y, Cell::Data(avg < threshold))?; + bit_confidence.push(avg.abs_diff(threshold)); } } - let decoded = decode_matrix(&matrix)?; + let suspect_bytes = + glyphnet_decode::suspect_bytes_from_confidence(&matrix, &bit_confidence, 16); + let decoded = decode_matrix_with_suspect_bytes(&matrix, &suspect_bytes)?; Ok(AutoDecodedSymbol { decoded, info: glyphnet_decode::AutoDecodeInfo { From 4206cd3362c50ba74858cb69c569a99d29169ef3 Mon Sep 17 00:00:00 2001 From: TriForMine Date: Fri, 29 May 2026 17:59:20 +0200 Subject: [PATCH 4/5] feat: add the app scan fixtures --- .../corpus/real/app/print-clean-001.jpg | Bin 0 -> 171264 bytes .../corpus/real/app/print-clean-002.jpg | Bin 0 -> 158587 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 crates/glyphnet-testkit/fixtures/corpus/real/app/print-clean-001.jpg create mode 100644 crates/glyphnet-testkit/fixtures/corpus/real/app/print-clean-002.jpg diff --git a/crates/glyphnet-testkit/fixtures/corpus/real/app/print-clean-001.jpg b/crates/glyphnet-testkit/fixtures/corpus/real/app/print-clean-001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f954bec04424d277d9be37094b8d915d8bd48a07 GIT binary patch literal 171264 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 QwWM>?RMYcZY={s4+3b(uSO5S3 literal 0 HcmV?d00001 diff --git a/crates/glyphnet-testkit/fixtures/corpus/real/app/print-clean-002.jpg b/crates/glyphnet-testkit/fixtures/corpus/real/app/print-clean-002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c363d8255924244fa99c570f1b025bad02152a5 GIT binary patch literal 158587 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

eJfH`^{BoI)!$@wf#Y&>C;BToUL!Khb`Wb9`IdO z%ii`~=Pep4mnAneireUe)UTH`w(T-=H+PR}Ns4FPi7DdC34C;A1a)MWW?kM|me0R= zLngUX9H)o=A0L?Cu_U9sW9KlnQ+sY4a2*E0o#>(jZU zh5Qo;LS}mpok9NfVn&&|FAr0jUMRsK`~ymB$E&-h*};lqo0$>dq{L@+R{ri$CB@~B zzsRa;w`m`K=kFDLL8~L7WD45ELOmy zaKu@Y0QAoM+`mGqAH-g{x~@iu2Sq$-MO@^9LkDJUo8xX?a>|c1$cLvIIFoMVATD^| zxr7^R2qv~smqp#q*?P&tTZku4!y@lF774+MGju+yW{dgK*%0{qbLFgAbK3s$(hk=c ztb11ZSipoyWzZ|zE$O~{Hm={H2rsKXVHnVZuXcBVPv%!LRwaiuW+5TA#eubZU2Qvuvrcs3%M`mpYcks#s^%_tinO?ra%yso^*}v5QXCDk zf*`KWHP|(bPxJOIoc?$F#kVhUfu$2nX0A6#OqZZ{outSdch4h!Sw1NN!J)ZeO=P76Qm~F3<{M%@$D*uNyPN#6{GaSAg+ZPfer zQq`HYGmo#a7hK)Dz4!BzH;~Z(xdIvarL;n~SCeqA>rD_+nPJN5RIk)zAqlq#)gIYW zP6GKADr|EVC}(2y8>~VjzipkCx5}~3I+A0NfY5=EO?Ne5V%h@%-%l*f1aHY+diPw76jG_)f3ZYRcG^6 zB?+~m0~2YaE%Hxs#7CCm*t-|pu4je9G3YJ`OePF(={621?>W*VmkW+lP^N^@4@Q^> zZ^D7UU<1EQl~Big#KAltKjOEoFk)gi7Pn6Q)4s}ro6uwH-=a0eETFUQ5~G)WqJ<;g z8^zs}>lLR(SYeQx&^t%S2=oce_BrObdRV3H>Boe3g;P?43dgwd{z8p|OFu@D*Op3~ zxTJ9Rc^_O;P}SYtB+Z+V>$!THmiPD#0`og?$0DCkC0O90kz8E+?a^XeBA%!L6}H2IuwH-$ziG(scAXWZxvx{W=%JiVXu=wQG;=-sc3C z?i$!qKW@0ip*3}9hk}nTtHbrP;qC9gqip}4uOE$QtlQm%o_}xIuxY$dqAsbWD0+&6 zH&D4mQ`5N2SH}z}i&qNXUU;+aV*c2qifCOD}L?JzV9j-MSs2yr)mY&GIW;iOd zDjgCjV}t{x{c|q!Bk(h+e8>EE83_0tcRSL$$^3+mhqllz#;srUQR!~iiRw-(J_na3 zdJ(L?x}CZy)beD$e21iIUi_qJDtn4>_1&jO04{mcv#kE1(B2$>%wY(!^J-NR&pqtm zIN(aGI}HqddP8ZS?LhhW4l|l2g_{@ZJ2sv?G(;b<9vzq=ty+~yrUfUdpX>9&Mf3Gz z*Bze2Cq5@6uHI-n{NP&M-7T~$S01d}yz!rs_b{u)_Lo-rJueh#2)qjUIe3qf+q0GC zr2HV4R9C-qb}3oy%n@qMD=jK0xU|;tKM*{vOJV752>K7`;<4Myxc?bE zz2ce{O~d88mUZ_x0*EZh{u%PWKtNf4-A7b{cG+3$}`kYc@srJ78V zP7$l9LY?3|XYx2s+03qp`WWPKo*5n0U+sD5t2<1nEw%{^O?5^k%OvwMpZM|4_qnbp zA8N_lz_2Gv6*91CG*e#wQAM<+iktn$o?U&S4i+GlWsf+jj3ex(mz_uncL}ztU=u zFXTh>g7JM?rjW(UIwGv*=EYC;Q=*{uy;>ba&P_@$j%doAjQ3*etWqW}W=KF074!z? zhsJ}ng9VX8?}G{)!pZ98)9BWz!@WPW(f-{Ucb9%SHkRlEG0IOnTe0c(_>n*NTq@t; zlei`0uGxy5&71=Zd)pF*BmObASG>CdB9a9@-h+|fY{5)3qVA*-WXLK>x0o*nPF9#M z3-fZPJAJFq);>oAiHu_H>*G*x?E)F8O^dN*9x0~+P?lv6pFpNmXFX# zzPTd&w1lQ|@B%?xXOVj&PGI$NW-fo%qIIgUdTdc}C8$+i%kDkq@S2((`vgWj(TUZe zg$*;s3{-m;KUf|B4c%t@6jTme&4{<1)9>`P=Am% z9rDdd;z$POce;*5{MR!7#PKk)@garOj}j}Uavb7eFCslB+7`rHzdrE$T?<1x*TPka zKvF3VUiOnt%GysC2w7bk3nZ#Hr%Yx%+a~STb$0di?Syk3{;Uq9Pb7Sdd-kd8^!RCK zQLhl$58vAqHtR|bNb<#BXIBaJcUDh)+SAmaZ=s|UIzYj;Co9eK$ku! zh*0-n0Ezs2UXWnn%ujopM+>~0X^tmqf@bK&5CKY^5l8cKvBmA7Gtb#zgxsc#N~)Tj zN*XM<(RArzN!eJgW`m&t@T&0zn)$>GT<4TeyiY@f^C!q&QVpj z=gDUN3a(?Zl$9bjs?Oc@pTQPW%@bSyq2FSYj~k^ zVkQozd*v3ji&D)>7lGJ?m${lez%IK3ofafU_`mc$cQ%(`=<3bLed%7&okx|kd zS&WM-NZC)Hv%l3aG=L#&Zc>lZn%dc6wbYnF+0Q9y^5^(&oTPn4SJvq z*rrgh+-bsr5oQWVf=ZG|L4?;0uM0#!e9HJ7gsb(Ko>qCd4{;QP#UFm6`{S4ec3?)x z@9#61d*qs~gLlo5@O-ifYJP==T>csYik2$zyn*Ut?giHt0yMXB?>3FDq3&}Z3e4ne(g+>QbFqBmfXf4t{M8$u{$X2GzdT)Nk)N{>ei*- zOUP;+UeQw?TnWvtbycY zC#e7wE@OTcE)i#IEfkKo)ezovP%mBIzFj_XHMmJ3#?q7I^z#U-)Bk7vN{#7>#ctz; zjG?-M)lCP1c{awCP zF-TZS7ijynO__eco9*L>SXLOEYf^)oSeNqAa$3y%A7x^Bx~+e9z|zxY8A$+xZTf#R zddm|t(I%fBELeWPx@E~V3JG3@gq@q+d>u~)Uu&A)0_4Vyekd)c=rHoNR`HQPaOPmJ zTS>tKqQTzVCKmR9uh6ef7l5o;i~O7;Cqgi2VK{ZfIM>k4crjF9*S| zC#HwKx_FnfzR%QRBr`>zRV)4b*K+Du+QQ5{bV^Nlh*MDMf#-XRyY}t5y%=$P_|3y# z&%$qPG+c0N;NRsJwuCQgUHJFYyJidOtgn9V(YPC3rZAf->8e9u+Oy8is`4w>6qF18 z?~`iPX)y0`H;y*f`n{MV8L9v8&6%}AO9^ha&WKTJ+Krozg{Uqhd6eFPU4@5AkVfi ztAX>qx3kt;oD}+{hcrd6mSe3Zm(B$~yF%ab;5rHkPjbZ~Vg8*iHR^I6PD0^(+47kW z2;LM>+KLW(KV}uj&{Ap7;evtHUqGUiu&8mflmvG#->=-bNYc~F<*g3z*9 zerb1PVlqf^urZrL_>IDRVz$qA_Jw~cm^JH_bZpbDR{zYDm1CTSA zP4ucQtY8UDH3as;eX+a!{(~4HWvWlzUnZmU$K@fK?Y_9Utqr^!)CjqAr3ntFCCGwk z`Hu(}7~O+)3{ITN0VV6SkyqO^H&=FHaK4ar7i}(lwK<6fH|hRyFlTCcMOS>Q`JQ{HkXI)5{gr8-+xX!3 z?80672J_#mPfzwLLeOpD;fe4FM7}J&s8{!go(!j#*9Txp5`p1Dxw}iova};H+eh%p zBnE?;TXIA-E}Tx@O8MrSlm4y%4oo-KV{Jwg3;3(gRll=uaBIjuVYdM)LXm)ar@osg55imVGEhPt5%l`2R^+_|N7_2?td3}t$lJb z?UIG<)CEDXx?fui;WgUg(((f3;pN@6$7UBzQI3z=)|RGSkGZN=G~j&|6SeSI_S^M3 zL(g~l!da^CTf(U-R5Kwf@jUUKHe@Vx*?$JPAih;H7HZR!Eg3KUXMPe+p^F`M_Tl5b z(Ih*5C?=>BVH15Y%Ns^=Zp?|CE+2!R$=zbQ?#DK>UqXOp&jnI!rzwieq}X1Fu^DB_ z;{%YO(nHF*QL<4NHfUr|igl3kYA`C0hs6!{&1(P8z?-wd>21?<3NNxy8$U(3IcG}l z_0%rOn6s|!TV{3N9`dfmf$yHycSvWiUS;eGi+mjUa4a}DTQt8oYr9-ujOR!3WYqzl z`F+ZH&dwQIbOXgV-1?V~RSP&v=6}2IIGM1DHW608BmLs#%9Amfnl0%g}oKNtw7-qBNpYC;Edn!y72eba4J90VUtWzP`0$tQ=6mz`>-w?Fr0tFJT0 zx(DghN_x#uPKku(isOm{5^Ax90CZavWarRLr<}=NbTQjDaL4{H{1`8ZaBK2tT{!yN zhi|`rj-IuulCk1++-eyG<>hN0lStvn;j2*KXHKlgnnUHyVHEbSogriWDYjx+QfJ?E z+T@yK`|i*^1$3_d--#p=%ysYbcO{w9kjX^_TTA|a(z_@&eM`oU1rBi+Em8%uR>3L+ zv2XX)N4Ky0pkQ#{)XTHhdnm~@J8V%6J7tPAn=(G0nO}p7=IBi*n@zL_o?qw*1{}=v z%&hL7Nny`6G4_~1@Sg!~Kxeo-;H!F~h$a_7qFfoNqM7La^?x+neK{3%w6S;98F(S$ z%7q1IZ!R%EW_%;y&2qQ<$km%yUEWplsh(5(+I(us!~A7_FNc3AZ!P?|^3iWM{(7GF z`tZTf1c%*g3YWk8@^EJ}>@IY>GD$|O!OGNg#V!3%@#mTS-`-gn%F)O&xogEQ5%_ug!9#dP*-*!)noAOCV6j{xfKh>2d=;Mt(Gp`dB_td+>C= zHX~~cU^3*Hg@hrH7;~a>y?n2$2dhWW~Kgi-^U?;@P+mAVd7@f9f4EN z2F^$Qwz4dLW>GUv|F>n>I9QL@Z@4Gy<2clEzcwR z7qsbrv0Q(KaCxjhBvx(9vqhcbBEOo)`y{oSnYN(%>vZO%t4{%JELcw6>T7a#$*qa# zxWnz?CR^(7AzBfajLt>|VsbbBdHC+_^nl5Y7px+r)xxqT^f;Mg&FIG`Zg*g73bpUb z5ug~vbQweS)1#b|aCj)ywJ5}?n`|Pgo4q{y9q5s}CKT#uc)b2Zz-;XYD4oA!vr1#E z0F;}{No^(m@1l;*5b4Fch+mxaF+a@9yZEjoF)D(Ow*6AD)Hvh4^FVP_9HD~|IP0Fe zJ4qU54zqhllClqcOh`OhcJTK6$^~Z-o3h(`uWZ?CxY5hnxcM*oaOtm?t;bh}y@`Ee zVrX65b#CL1<~5$`jSBvu3CGKfx%HE($eS;)#3V9_5ujC4qad~ug`=#&dtC}AUcRIF z1P>pWYj};Z{A{X~h!m|STImHdHe(sYe)9Mm%N-m3EKkmg*531;{?9-UoiP@X%-`|< zGq@oD+8Jtb8-BVlG=4Hj9MA^!Ijzuo@9$2k75puGDw+4qA2N(yHStS@r(6DEvtOEN z!`VmA#@I26jmnq_OaRuNZ=OY?#o-J_KQ3s5-Ky=!d@^f2X@|P@{%ajsF=$6_dTy;>@B8Sf}v0ROZ)DrW;cpt@2nB z-nwVw&f$XW&do3P@ADrneK$PvhwaVvzwbL#IBb|qh!i_Uh;SQbAf~R2$r!gSgp#CU z08etg-hvlnJ0w3I_*PcVYfaKACDd9kMSospy;VTOZL#-!N9~|t9wYzhpV6%G8TS+F zQ=kqn>eGE8B5|0{0nsy;M^s{TQNsWmN#%x9vqTN1pb>U_L?p)bQ$$a9WnSGcUy)oZ zObJU12ae3ZN1cA9TVWgi_^ssCnm13D&(DF6_l|QRya4_yJ;H>zmf~O1GA4^Gm1~P5 zF$1bWUsKr5smyeNHAuhQsrH1gbJp?@_Fa{JN<9^HDg1 zM~`*>+NFRZA%a;cvEzX>@?cMGpa!3A(eNF|PK;0b(h250>POJO82OCel736ZWH~F2S}8i5^ln2OaU*+7=AAHyMlmoCrrV>u z`^R`QwWl4s5@@J(O5a!2?4D+ON4X#EKU2!}SjPmeZas@>;U?tUb|(hg*hPrVfadtr?V ze*cSgNmd0&n6&p(9U(F49XS5b+^=cMGiBEoI~cyVFW2Du^R+0GuvjGMO2nQY_zJ0! zlCEmt5&1p!2vml8CLnM=%ZaYWX_>@wMXc-Y$y~{BxOeW$D9fxa60iM8qPHUxT?2%n zF(7Kp1yQB}{+=U|YdSr{|D$tw!>r-G6_`y%%Jtz4!O!i%XD>2lxG+d%<*K zmG33vN-Z2J?~C1d)gTLbqO`nN4gSdh7V`!CNHe+vCd zh!qv5;LIG+u>&|xj=In_f-av6Rml1wOdS8)jaBCzkACTnDAP&{UC391+3`X9Qjg&76cGIW!j9 z*N%}pB>uhimxHUfIVCuE&;Rq)J-LY7hQE2PQRcVdYpSSEqVdR~DWG`j7)N)Ky>$Nj z4nGrKgXgV8rDPe@Z`HI^CU{`U?g*KhXSgL_8C|8ISEp**z%ayB+iM z-RaI){by0H*vEQXPIsTibsk;ULjabV0>66M>H zVvEkLM&^0D1Go^l33QBZ6Q5_Zf*pGPuE!Ry@%>974~*CBc)H*=%i8$0*N-c+OV@q` z5X@xAJ}bXscv87gif#m9;YHoHeBT*&FZ&7MS9r`q=cm6Wa!ek>*T-+(z3@RR;!*0Y z1A$BTJ-O;;e(d$W<^Mcdw8L-FEiZ%Z*7df{|E#A!_izZNU{nC_vOI6w9P@{33A=*B zkk7FL)l?EOEC*!)X*OlBew8rV6ab2M}Bh!$<#uSK<3;tl|_A5LhacQ zb-y#BvjT@@2@*6Ectn5{lGCYP1xb>jf=IB$_xFyZTJ0)Russ20>!g-}^!ci>a8FUE z#P+{J1$Hm$Q0P#EA{MfO<$au(&Pg~IpmTM7a`5Inc7{?RbdiLyz#n>}{ zJ)AeD_5eIau{kd&0NPDyxc6P@j!G_iS8TzsqY!;Lt&(238Ot=e>&A4f)#46oWeAp? zaDzd+xHKe=e?)}rVE#`xGBcJISQ}g^mQrt>r@L9k-EoK=aZZ!QWe}0++ozV#X_{!f zI9)mE2FQ0Prq0wfbrIe+C;v%DeDX9^2HM zxeRt~jQH|{B7(;EQd9#9*hFJ7&ep@h=^p_dTZEzO^WR?#EnZR%CooegF*L#5kbXp^ zmYp(>C+uAl&1~Z(M4=ZwK#7sbCNRV7|wy)6%-VFpi3U3Y_rDaHsMyZ7(#f=coCmbGYPiHVWb(^bd!pF-7jjh&?~mAZALl!+HRH zK2H8{(FumL#pw5I-8-$G8VfWTRo?TX0B#O_R#2&JBYp?nG4OGJSe6WrJIfV$8}Wlz z748RV0bX~ol$nnqzCaDox%xdftzXK+G0e+uI#RRF3~f5MIenPIY27(>e8h+mI=$!( z&M9b!MXz~xBi+JzHxA`^^aq)t1tpmex~v(GRmoTMSz*Z?Z4q{{s1d8Z_2Ji2R)~uO zhzDPQ5x!a559Do3nyz5puTaX=RyDmAC@#wgjW`#UEAAT%IJ8mXKZy5rH|PC|k8obD zWkqy&zc>0qMrj~?*Oc!t@Cq^!O~0;a8k8A*rd@W!bqhjk&OW#-Z}6xQr#+^jj?03e z^Bg!K`cXZ;s0S4PJ51?^=G)=4CrZB!7mw3(gN~ng|G=lK_OJpSIhB2i}tg> z>-M-zu!LTZLcyNdYgQRO?h(M?bEa@7+z0Kt(f#rbAr52ls8B44fo>Wlu6PqPoIJc~ z*5bXH==PVtjaEfa2lHS3e_eA)#AG#w`Z>4(6@oBg%tenSTh`SRMi0ilWWg~#Pb<#< zS@iCJd#ncwtn&3>%afsRA$GgICNo3hq)FklZvnwdT~^0wxWj{zqAqD_7Tx|9#LL8E z=F0(o#lFe9gf7IT-4g@B)nZhvU0{CaPNpU;BgDcr)pXG31zjvH9KdJ3Qp(mMy>3ma zK9iwO=7(&LEl?2AK+EtD`c2R~>1q=$)L^k?xvD|RDVg87@mc7eo6Q6G2(hGR9ChG4 z1N&pCZp|964QuHptwBK_VIRJ`PKIC_W|Tk0+ltZ`iAyKBd1i5HmDjr8(aA$GGf?{= z5jobUEsn5HlhFg3^Qy`D$Z0D{2gSWhE4?_zb?a--(Y1JaH%De@C5YtGHEbfTt+2PvoF2FBng@a1w{6 z#cIz)uu$pBbAG8gM4KCj_cR1gpnHx`yW`lQm!QZSrz5$aH!V2W=jzB(#8~VAvZVkJ zAEC2DW(ozj;7*1k#lB)C8UeaNP}bbR{)^PrV+GaV?9gw--Z|G4<~SDTd_;s%)D3<_ z$p&)V{w9?bBycgM9$&s05Lm%GkhgZLb0vP69cB+C@MS2sCwtENJ6(>wmi6XWmvOhu z4R0*0!ZfQ&^3c2TXvrGiROG*|S(30K{biu50@fKZKL3@{BE^5QJ;VxU+~!&s_~EKZ z5ElO6v{}#SoVhNUV>Pt`Tthcn^On(Nmlfn{a8-}drh5rIbk?k?ezV@NfWGrD$wqvZ zBo$njH$w2MCI17f4=qdGKpkA@UhLEI07^g##nw%OFpdpKo0l z|LjZD0_)3vKb{I(uy)$|uOkcp^@yO<)(ewxig=Y@JBhqhn`lGQbY!scxQs?&lC+xJ z{q@-otfsM?Gd)(_vKG06A5VWUR;?Gh)nCl@E!?Of)@U=6f}oQ(m8==iGV%t}i@K4h z^Cu85-h?o8I1%lR>66jP`tBq`^$8|M)(%=OpSYH4@_n(OPN7>C_gSon-=c5zr<0w| zx>tPIkorezRN>pUsDqHu3_Kcw&k)~})rP`*~-@~WfACLeI#S&Yfj?}{V#Z5}C)CB&){`6qepE8ErlF8)jjdzuW^p5E zjN||@8qOZnCodYL+#?@FIxPmJulNXR2WdivC2fU^h79us%9x-YP@3%$C*L#Ym2M&Gqc@8d@|qnbYDo7?)*itf7C}#?`^szQR~nsxCt)>(_Th{0{PMC zZ+nS8p#JFJmn^)-z|DJq+o;>HWmPMp&eM8R_Wgm&f0CEx3_sb*d3&?jX2j&frRlB2 zLYuw6nw?4TN!%1Pb#8DX*^yzxt9xbvBGrPgdJ~w=LbO(X4q3Vtp}3gQL-KCQ*J?rJ z3Rlh`DNuhh;BRM_y!{-y`N%A;y8? z4=7_!7;W_H{U&boNGp0d5&$wm_go&x0kgoNgMO0q7K;}xlPKy^!Qt= zSmP%slNWfjsZf%Ho$!Vt?`X&9`%nkT-cEGdP{FyLIohys1V2hh)-Rz=WAs~eQ9{8K z&I*W4+z$QNc3Cx4g-;?r7wOydo3x`ppZcjoaYNL(ZFFZV3;a_1MEVZsOTZ|P*GH5C z9g3UBvZ@6W#BkS>2%uo>i~RXi67hwI(5AP!@$Z{q<8#^}VY%M&=dsobeQ}4GWCr}z z-`1_WNdImGC8}!OcH)6Ky#k!?^Z(uoxE3EJ%|SzFDhxSXOGe#OGAZ!rvJBCB;fh^xR^4@OqGp8PZjL_av<+85B1zR}iTPKGNo3oD;ghS;%@ z=O?L9LQ5h%j^aE;2$1r^h@NW1p#fe>sa(l(Z-qGJ78+uY*gDKE|IicTthI;6FrHM> zZVk&7nrIlpNU8q_qCkT+jcZFf>(c}_d9gp1&gAov-4g>r_IX`y;zLevCt?Rs6qF+d zi}W5btu^GSV^eC9;zub$c&z`>R{Qr`{)}!uwXbnKCjX`GS;Z&O5Sv<$Qfe3uLjIwV z7jC1~9%6Zt8VNnANE>n^R{kyqaP~j|#z%eg{EHtZw5ze|w;d7IePp0n&RyiwAcQpp zL1$Ig!}}qC=yr_8X&d}2Yx7uY0hWoxG^zq~B05U=C$4OzVNx@Fh8q{&zT3WWNxk)A zhizr#qfVF3<}hf>;$A9rFq9O;w%0vqU}V}38(ARe+EXQ;%T@MIdUUy+le_7f6c`hS zC#QISb#o7L3}2tQFhnkOETu|9Q=HkRN!7Y6y4%H)72Rfz!X83fKQS6@%)e+kbJ8Sg z<&OKUwr7^b<}TXKiTfozh{q+P$$9E{=o6iT-&@=K?N@BJ zEjl`UwEoFziN=WiP_9YFIy+2}9mgGB<$UC^a0gd}7-*^vdBy}7#xNy4wrC^WA@5({i1Hn51leRU|*pS0#z7?-&Gp3uOAGgqpc zt4O()Z&n;%;-mZE;aDn8O4~!6b@BKf2ohbQk7#AW=>HoZfY^!*Q)n}1hpY?(8X7a! z@N1PRhdvd1>OXwh!FhWKqen>R%aX?Qf^2$mQ{T&w8P-lWAi+9!oG(g)i< z-GV|}E3xLWkosS1yFhE+Tlf(hr<<;W+eHrJCdD!cw7F83H;=Hc3N4b}OhiF3q3}j_ z%U6$3x@zD6f4WFi?1Bm{D`Ev8&!dEE(#-YM<#Hw9w{Y{|$4No;--$_Sp)CZ>WJ6Pb zO~qr$<8Agm&|r1nE50Wf$TnS6jTKysri#t%%eW7$(c7V8=YLCFDFTKY^LLc;_W?2n zmwqwuai3Tak_2wCSLp;@1E8U`VkfW=GgOBso$Y%wP`1B$*&5S{hNcR+me(e8E(^osrSE=DhBld>Hg0%xJv9wV*W%{VvqobZ zzYY0D4yTy(Fp!A7JEs(l(0yuM+k`q6f@@SHy-s^TEH&-hHEUY8=F*Y_^ZN`=&a$*h z3y)5z!tRzdkLOX|j&CZ;114(Wc+dwUEFWEgFb6fmC$V_87y1=E*ztYQyx;GZ?jJ{% ztXL!Pt542ou+LYZ0s>!n+pJ0Q$i|7gty0f2v4vk#+LxwNQ~q#zXt?F>2g?se|9E~_ z@rUuT;YIg<8+Lzn#_&aTdOUU3yCX8jKMlPfMjC9tjy6o*gz27|6P7Cj4*Wls z-a4+S|9v0d#zvQbgw#}8N1ZhD^5r#|| zNQ+3<`+HuW-|xRYcHr!B>Ur+_x~~XsbH85NzDSE|rHtwvmrjH8zD($iG6GEZ4V7R@7$&RU+sf?;uInemnQ_ zPsuZZeo{%+Bqv30`er`mNwMf2W$7rLx*c!TwkH20fViIh63Z^g8ORcU+P)@WP=;=8&r8vJ+ zz1U7P4F0^J*uI$d2Aw})wvr=7cY1xzSLr62$fTZHhL^C4mB!Op&D?&=uhH9K*Ud1r z3`8rGTiJ$GR|M_616o5D6>z6Kgm zUxLCf-umsT07=bFoU0Z!F1|P0-jSjC`A)PFC7G#Kx{6QBS+O?{uJ~;p08NMy$7+GD z!j#d0nP*jE+P)`{0pOilTT|3|(`I(3Q-AvQNPGO+qZd|l#CTdl!^~w=Q;Vj5 zoMVwr4CS9aOXd2uUCEE?n#Ph+{)yBlZdfH6D*zpT-y2erWVv8rQAj`^cxu@KU#)FL z4y*ZDZJZ=ddes$GY|bzdD&l-{+;_XtCYJ4oThN+`i~e569jVA+mbyA%8t!#)>A2J0 zsvMJE)wx$*Xpb!0-k;0+%VTsdY+KtrHFusGh&JZ9U;x(r{Ij8b4ItfNqe<|WeDmtL zyRGMz^w!DtgbJn&Se@l1&20%;X=`mJGvYcsAe$Wz(4{~v#)6DKkpN(7W%|duaj{c8 zYd#?Mh>ByrNhedv7JqC}WdHfY8-&6U+|B$J?mhMQ_<1bXJ=1_c4!`xkwO83InGg!! zVTS)hb#QH8+jE8&Ol<<+|4OHWbR*N`MORKD8>VM~7JOyl@$%4CyL4AoB+gfVZlc33 z`ui@MTf|$Dc%Gg69hTKA%N2l@Y#lFeER0K%Ydm=pGBxK&((|11AUvM3i6ZG=cUGZF z+*6l1uobKY3^s*;?&|w_>?1>!#~?h~SiKQd?!ZZ-p{2Izl_V6`_+FCl%Io-ePoSu9 zJ!Ms@T-&FYnJfGS-1LS$XYZ#R&-uHDa&>Iib0R`FN)0g`Av4CP8M(!kr;C;L4^AEb z54R~h6dY2&`9IKv?OF6*WZI9Qph)kX|A8uVoTC6W(BG*u>O9o`+ioM%Q{Z6&)%dpS z-?e?Xb>SU_Yk#n)?~^OIpI9-b7ZxE(w=TrOC8|?Z}C_ZELFXbK5nvrn}=7Z_(7b^nxeex%tEN*f{8KD~w|T zh*cA}m~2KqGhuG12)0$1H`%ri{2`9_L#xe1)_!eXs8Y}LSZa4XiQf9necAjcSLN-P zMbpwV!iC7U%HRpWef+^cr|@^#sXajQ_sQ$IvH##B;giMbs9oU9ymRckyzS@{)b3?C z`4zp)j~O=!%6iw{)lcC4m02L*wclIz516oF&XB+-phfZMcB}bCQ(QDW) zH|KQ)8IkGb`FvDBbidbeEYI{<^Vf~9>RLVz{!=(bZ!egpy1DH9`Kqpes-C!brghTm zs64fH4qVDt0=sB))PN{DYAQnF+_%MzAmOK8O;fP{THUhOBgCQf?}Tbp-CSyr*JP)3 zCSDb|Ee2eR)=rG+y^tQLxzDCj=cdICaAR%30=Wao_Z)|ssZJTIkct+m+g{}(LCPtO z-zfp`AWee3L;wc3{@R_wlfVB55~oNXWU7*Ak^jzgKEx>ebyC z5TpqdYh0Fj811Hr3+}Lr^KtDnj-Wh3r*LOYWgN;YgUwi&80Uc`V} z^xYSRg^;ww#Im3&7L><&`Fs#vBC%BLBa8dL zbw4~&aL8NByg}HiFdB)ct z;5wcA@fhF`m!mhN3v<0a<_?Ub%JtiAWPDA_w4u*7$Kx^HYC;Atd z@p+d{@d=>vU%EJ6P<-1X?HWDVZM643uc5WO%aO3a@8`L6ajIHq&VvZ*CUo)x$SLW( znPsw*C+esDdBMhcDxAcpKe)D*GL8KE*MWkD#tyY6+P ztK>g$VQSt8h=MSb6z=&cSb4i>{5w!Tx&norW;MTMU}fY8)uPUO-ISgh>wV32k8WTK z8*mlF&vWyDhX5Wv^pw+voLAXi%DK03+7!ih9a{E8~F~ni{&Cy)glL3O%>Qwi3 z_b<)r2-HnKOKe((2TE+s$8q9JDdHz^`&H(DKh#)%aHK7;d-zm6hSE~$?*yEA5Iln=VPb|Kvy$Qbc0F zCHEQ8F0-PBc~Q>`vJu?#6n>KsMO4b@z9VLK(o>?YxanZu>=&VgRUr9p@=|(Lb(9m} zkp+0g+&>TQ)ZA47uG|GNR9%1S9#h2O0daC_yz17LY$?6M(@pa#X07A#{^_BDB{~w!zZP-Np4>TSHye(@50ju1U zQ~Sjs!BEq^Mbj@1B`2649mq_3Keu4P>gs^0#iQ;`nXfYefPVNmYL>-Ovi7myH_Nmj z9sm#q{y(w0)%eH z8S!&d-51z@EEAcb&FwX_u+>eN2s>NAo@4L!zm2 z25lNm+BveWzwKh+^yRuw-qwufwgA33S{Pb1a#3b%5FT3J@9hEce;}cg`x4Y9`0l#3k;R$4jUpc?q!2NaRly+dF zs;XP7?Nnbe&w6#E93Ap$KJc*Dpy=(1+_x)VyMYr#>P7)LsBhHIqRHy#Msx2hydz7^kIthejx|Mf#4OhzwUt6xVc)kP7zzwC6OY3$wnt-^9oW&VnqREh% zS8Fv*;vnztKN&ZbZA`znB+hdlG*xqgtT-KHJ}nD6*F@D zbZ+H4G)z4z?mW(qY^=>y2#xZ9`sV4*VniM40R{jnc@=oQ-t$rCl$@H^rDs!H?zUOu zH?%70F!EDW_7He!3QR(q0K|t-R&Mn0M()j8%^06!T8IqJOxekZbAYqL*b4)&-2m+( z>MX(j{VkgJZL1p?%Z1y+?_^w7O*BgRHC{I?95#KP`e{y6J`VcrtUof<9+_1#d&(~* zo0axsUw*?FV)M+}fZnn%9S5gryB3}fQg-IK=4ASmyG>U~YR321b|D}F(EH2EMw2uB zL?3DIGdpeNp~0^{0NB3@PJRR2zV>B)J@L?{ahz_k>;GWI4J&q5taqDJ?kMGdR>`d?!LNGxGzpS=cLSquUNyYgJsP(^F-q$aH|dA704y zWt)4~Q5$lPZ`a!TVHU)>$EAT6Y&a9F@f^R-rSYwEuJy27Jg;CbHH>PcTi@32BH}-q zT-^Rc^&3T#jwSo^?;NYs6-o+Z3Vz(7ce3>s)H;%zqR_0H4LKo(T-9G5zSv}WR<`$6 z#{Bdfy5yH*d`fx6!~r3&=|2j`hUvMfG119U5tthQ;ti!1Bt2-nW zbRQo8q+LSP^j^{?h~>QJiVxnB{(A050Zc+o!Ur zxtV(*O&k*C?&7|OR0SPt#+QR{)%?JR^+Ohm+anZ3?Kfudz0XA>ztAVBa{72|0ojK1 znc~(4%L7+i23@x~x}DyObPj{+k)&e08eBAKSTO%F1ovK?nrOSDMU4LEWkGN`%2Ak{ z7K+H+Ti{UnPC4QW)d%zWrZ1pNhce#<^^rynR6NTi>gsQX+{0W;5Vc1$H+zsu7FsaD z&O9ZVS?_e*$EPnxq}qCvqKB#C4+!UHwpk%($I3ZO!k2Fy5A97EYr4;_TkC}@<7548 z@lqJ(lJn)9ssW?gb>nbB{@c2Md{D(*y_5geR6HTdtm1CoBf`?6^EAft%IrHSi`wrM zsTh=@Gk8Z@kMZ{c(1J30+5L=k@wPPlzZUz7)V+f9ky~q#(}mLs%vq%srg)3# zf-aUCZ%!Mn%f7peAz>{3Vndm0@1CbTmho5nUEUsXZW$c`Bu$mowAF|vo(ueXj4vHJ zNjuF}Qh1{JF4S(y9Q_aW*?3?j{?iZfsAN?obUN}ZaZ)p-JsijsZ}tc}r~f!PaZI0l zOsEU!{spk9y;p3cil~+_8JWdw<8mP92}2TV|sm?FOBI^7TXq?CCqE1@kUq0 zxLvIHZUskp=|93uZO=6wW%iI+BA2G>y`^VC<@w`aV%`nu|O?1KdCfSHe!o0h`-8b<#Q;e5~m4|44pYK zsW7Z+UvI%!*p<&1dpy1kbkQ5xc?5;b_;QR)kgH8YdxOVQ)N7Qc%)NU@3XP%n&ZN#+ zrY?rZZ&h6k3)VNZH~9e(N|6ur;wdZf>0h=^LXA70w0pGZEJ_}1FLa-^Yr4`Kis2<9 zIq2(N-?|w7%()V7!7KJs(&?EBWx^!T1`;=Wb=0u9v!7nRPeGO5x<>)bCaw=nI*U$w zXTUFB^>!C6#-g;|l^$+W+~Sb?5)(r3YYKe7HQu5nNte&O(NB2*@gQjP7%XbB*TjxPxe!m z%Q%fTqB!#?c7v3~2K8W|{+pm1FW(R-kH8u{?tWVyqN!@fl~>ICP`KC!xZ&i@i{A&Jpnk^UUM^iTfa@}I=fbDceY zt^-xUpM~c%y5|YN@-~l19Mu?ZosS9xrpw*(dw;$t$V71FohfJzom>W{ln)MA1v4U^ z1L;7Do#b<+V^zez6aJd-f|LcC169X*ATaIAnrHQT2>^q&06+_M&e|TQ_w@3FiShj8 zT4h_q{RNiK3dMoDx_z%nE?6PwaLV(ipgSDBg4kmeOht_N@oZ$4g@40G_*=MXnMI2S zYR#|LJvjWA88~fHz7vBg>e*l=^ejsej~)bHz!5 zf0bo-*QX~B@G?Lpf4W(AwuQE$oy1qFXlkF|TQmG0=wrr3w*p`8r$1k z_C2pKvMMO=EE7;hyLLVG@atV3Uq!zyK>`S z-BwQG7e{%H9^#_o$IBu9?jHjz(f;b`yPa##A|_JgRP3 zN)g2DuH(Y2As9Mbl9I~M9iDe&cM{FIbr{rf{|cu8BVwX;I4YH~fkAkI#Omqt8ACMJUdn zTbWd$maUMHU&g0BJvtK;b*CDi&^xZCU1r)o^jnXxXo0Z^UrpW`WN_{>Vxw62gDpKG z?`cYWo$bT}&b{UMikz+H<6P630zI3*UMCJO%X(*QFc^~=Nm)&q@Za~%X;z~Mo&TK* z(s{u-1`uEzV=m^Y{f_9eK^4o;VguZ2|+QF5=lq{Ed!#Ex!L{gBnT! zB0SD&o3%NwP{)6%^LWhe(-Y~pQ$bc5Q>GL*%e55{#1CpYMfW;sqj_N(mqEQ zANaDpY{LJ6rxgP(YiJzc7G=T3g%al6+w=hGn$!;z{YZ8 zSE{#(6Y2O9xkaP@+nFhV478nJsrf5$0gnu9;V5t&I=Q{qt?Rfq6S)9Pmo3|64(@dW zqh?l3rBqLLRIcd+SIKSpfRh_Qt6%d=ld!;hs_58aCYU3&8_uHbQ9WN|6-ltawH-pR zT`o^)1wt6E#J@ut%sY4ihfzKUfVpNs@{lf2&LPz<_q(?AL(?gllSjplt=o1}y2ihoOA<6^ zd|%6-sGFYtIl{4MuG(@rns=00bk|z~$`oE-Q~y+#r74e156LNaV;|eX9Gpr-yiEQr zNmU0jHzn&GZKmCed9XGQb!i~-JGT45(t4v+Xz}{iJ#=6NMgq0mvyaS(c_(B=$*E3T zt5QTQDAtAyh^{@^em2!~82R-)qv{WaS?D;*;ZI3uTa4aiYg&VTm6-8tN?$n)3|>pFVG1$ zI-Y&o5nUb2I|ugi-zI@fdy{uY5&vFkT1=ubw^bELew}83f9IY+_Szf+VT-<_X{w=h zDzRYxJ|bS+hL5WBJ*a|`w1lOSA?29Y74{N&a&?iUaPzxzEL7_!(os@hw?*gH?DH<2 znZ(J6o$Hi6RLC*<=2jBtwKHA&ZF)^&FXY|K4Xc3gkP`D>OFW35;`$906PZD!djJUS z%olWm*2~6JS4Zs$(Ilm@D68kKhh$b(`8d`lAOTH*c`zpAe55=|?;2udFLbW!_2J6p zUQf-M!m@)Vd@*&%j%wKLLbY-6JN!57sC>2c2IHk!adjLUClMKx+hts z7xO^>&BF6aJ+WZsTgh~L)~VvXEz_4nBYqQe5?&@NC0kw}4GkC98V?jg#2ZQrfXI3w z-N297UXqKbDp+3#Co=309cH(oqlA(m%G#*c{=$^nqiYlfaw)3`JDqW~zL4BqDt9Q0 zOu#z|xV%R@hU5g6bP5}xiAg1P@n}*dXg?K!6e_`EAj72OK-*|7^+CQ{kR5?uF(pU_ zCHK?jM>N=MSWAO7S|8N^*tv`B2-{JXBieDv(hG%xJRLw`v<`^$<5VH*q({9F0f_pD z3&a$x3>TN#XQ~A~%(#}s_*#+*5)Ntvq4+Yt8z_VOcwB6wIn~$&Ky>71aJ!-Vw0KtQ zYlnc*PFFr}y~x=$aH{c+Bf^DV(%XnO-x-2H*!6(@VLdLiuiX&F)mo>_D$*c32I^Nrg@j*@FG-l=DV?VD{+2Ze5EY|gJlzuWxFv<}f z4*^UKZ5@UA5-n$LdM+3rYutF}(DtZnnW<;5w=m<8NH}5sDtG-_?p)P!=Xgn0kR;kj zc?*5Gg0CAv7G^Hbv|4)B)Ook4s1n|24cOB!n|>$H$Q8{p-{XynyMFuiv`wMsY`Jeu zG+_adwN#blCEb1!_##YbauyF|xL)hsuO1_lGZGQKX)#O^Pq1m18x0Kn@&WuK2y>KI zH@6$y$*+6a^jRHF@pYt5jBAoGCAUXlX&(~K)#fWk#rK99N=L=R3@V|w;9xf+!$~wUf)3o}B?R-B5U4 z$$1M3XBM*Tn-Idn`V!KEhm1*p0wwsXb&KDM&Zui2kpoq21w*>BX2SIVd z+lH>UR5!7}`~^31*?`Jlu9A%PtS!7_MnUlHyp~Qrrlxi-#r1DpiKFn#?LdE$Z&Jb^+#iUMAhPtRk*RzQf8(|s zkj-)#JYfL_D{`{WPr>QCNQ%?dBovz}73vUVG{V#rCY@VoDba zlf;eI#XvkD&s&$AjI03`Zp$0uM=drjXKL8Bt%vy|BAW06`jklRsyLCJe3@8rWnY-L z3gy`|bM>q|Cc~Vpq7IgngerBZZQ~m&br{2PjdoAd7aZS9QYJ9Cw zOr(y?x0ZVSHhPdjZn}PyYnomI-}lOi;d(zJgSt3kr9?9&1NbOyXmM?IPUKIZ~fCgVy(Cjsioi z*a@GJ-*fLTY^2MC^cq6HE!Z0oTv6RO8)8p!rqAM^YyWVOs2UUZF4_o2rM7A?=^kvv z-@^u%{4BY@EVmn@B398}mNQ~TD2c;|>X3hJ`f?OMvN^3fU&B`1y_kD3<%w?_UG;D? zxlz5`(fPH^oX5jA;@0{p(&NI(A8m^{Xr6SJGd~x(u!*mnUiVS(m_V2Q@ux9|%_qBp zIYe8BI6;~xpIoliA*@XwWPbm6s8Z!kQ?Q0S&df^z3LW{SHG)FJa-Kuq!y5ls6oSs* z><*aeW->*vmJ7DSlg&)Dqrj3_n|VMACSh{LUjg)1oQ&n8X}cN~j7rM9hs;HCY02iD%CqQUcE(5(-nWyrgGxV=2RMl=AO7mk0R}Gj z($21rcKX&6vYu4zo>@*9ovXVz_y7LApjqbS^EGpNp+a+#VCpv&EMrq#(w=IWt?6$y z{dIYsHiT#hg9&{|GvXO^eJO{cFgW+6j*-t_DT&>L$B~)julH!iJm+``+kue$ZA23c z)xcND!hzygQ>tyVR}j9@v`{vPv7UL6isCB}9}T1#lE{~!!^gsleSmXirt*%yH8u80 zS)|@j2RxcSebt1!kr>jKW_S~F!hUqkpW0b2fYpR+nm0+zJ8bYN#}2e#eW=>d6wVx` zn>-i+vivTtE4&L63!{O-(Y(7?yH+RrL0!*hch4et>fsD0y|F+0im( zg&7azYdOgi!nlkD4rGsd^JOTj=v9dFPmm->wSI7|eiH3yiCT}Oul#Ye%VUxAp73a; zY{rxXumJ-}tuA~UV{{TN@v?*3;)uTm0j$if8hs@p5Feb+wX~gqW>&7iXmjxV+t(Uo z@%x6OIP0VYGv;-=N-h1?k7C2-(OeAosZ?*85*22DOm%R=Gq777zTQ%8rp0+?*0w@@Pq<3z5%c0$#$3@VaE}n9XwZ zFL#KIA=SWvO!>#$K;kI*r7Im2>8au#XRO= z^N=p|7v1|2f9lfN(%G>=5oLN(Q_uU+G|J&D#P!X6b3GT^7&_b?5*d57b68Fo%=tph}_6n^6Bg7F$c7oG}$zP&a zM6DV%j;Nv*x)IswS2}fm*|Bf?wx(mtbjeImMd-J^ zr)Q9k>}MqLG><}vUFy)IXh#qo%XC31NNyaK2Q~AKd73B$*7!(?>$(Ke23AcuzA&Z? zE^es_DSSGJb;y8n9d!3Kxs&*s)FuLZ)dPz5pZL9Ql=V*Aw&Bav2Z4}EhgQO`lAC;? zem6X(kIsLO=+&5qw3>(?=+D?I%t-ahi=$&xB;@PUj)&T-#rjPc0H=GYv#jlsilBqW zFFf`OYb(rNfF-MKsHdTx=+JZZ(#ubD%c?!A@$iTZ4Dz|Lbong0T*ZhZ?^Zg}GPeoY zh6(Dv@!-$t?WeVsGXY8rd5?Zg|7g2=&}wkn0i;Rs{QFU0U-e0nC7SWQ^@v*m)O<*& z=(@6G7euIy@k8pdxE=UG$fLP4B<1I^zItL`Os905URp}to9x?m9%YF%3d#5(HwMZ$ z$ZHk!8~4T+)&^Z+;DsyVjv-E70>~6`W)*OfE4YEm@R|qw4zaE;G2|K~U{~xasknq* zyXO8i+E;0?r(h8|Eh5LzfPD)}sh)XN%Ry$EpUd2&zREb$-okG2dk*IIjksRp2$so? z)H?<;4FET*=m2Sx$TJ1#*_sFs3)&X?2kItg&jn45+cHSYc;R~FPxd=zZiMiZLnUf^ zq*IOfxjvWENVcq0D!R`Q!fioDf3#HJ; z-9lIkSqt+;s}+z-<9Hx%e08xem7Q+Bos|o0Wrco{ms?@$`Jg~GXhIFf?jl|wij^Mh zIIhDOJ6|W0K|0B{V7aTNSh^vf+5w=7iGl$+$Z*y{1kKeRr}_g3?ua`3C$ke(fN*nf zANJ0!AxHd2u)}f-OiZZYF}W7SLSj(Ua*1~sg{iUo#iZFqhX%ml9|dc9vlGsEN*n}M zzgmMi*m6Nd(9X|r4>jxnm`V9^0$t-Q&yY@>&W#~a3f*1GWM#_ah>6WZ^DW zT8VgBUbW~(haERZsCoHdgXW6(pmtu;p>CT2m9L(;NeE1ix+7WmJxv1LE#jj_h>c>5 zKe2h1Z|G_uxNBMVKuqK;`j)(iYrK=;Z<1?j>XLV~K~0M43X@TiNax79Y`(w|Ld7<< z8?0gOPARf|(WeH^-j=7toq|J^U$LvCAeBL*iLDWON!NTfG2Vh^m$$h&YR!k8P_5e8 z`Mtv8WO|{rUiKl7{)(gd5@Q!=6u&M1HeTRJC@)F;fF@V&g|c^p>?@esn{v`E;(dSW zEJMx*SW^`)IA2eh0iZsz_ywv}ec^(J3=8et?ZV!Lr8hvvae3ExqZxThT&A!PT#u~W z@91G2+H7gWNWYPL%;F0kEYD!eEBRz&(BBwxscc-m7*Q>?+A+?tPLV);oZl3zD1A zS->5NkQridcYb<o~AtChrA?y++~MCmxi1)VwT}xM_3R1>Ve#M1A2cGmoDTi zxNx|~DFvLJM)?^Vt<-bvVcHR7aMO`T4#Fm>ft72PTX72H0W%))_j5xvj2I|ccA)U& zK6>>r0msm64di`z6Ruk@d7Vo}4adSCp>J-$euIV~&Ss20hrC&P!aI7j2Z5+Jc zsoI>iRo-3{`(%8^H|29jck_6Q?v%n4`g@ae7GwKrE&Ci19RCAlEZy(XPpVkARpabi zjA4*-SpGNo2&8F7zD}|P!D(=y!TclfAzg^^DJzHtPDEyC?eXk@cOgsbEFedyVJe08 zeRw`lLM83W1z^frj3aQTAMQkdM&9NlLR~#^1U|%a%Jzd~4bS!)&isdCiEI9(A=LE@rq?UR z@ru<%k4}$>PFbzXoIF$(H!`ib+nrmw@Js+VCTZ6BwmgO7e!Nv(`E}j9$9zXD1$P6X z%iZ@W$sk4C{QYDQN__-Jdq8!Eoe>`f#>KG&LS9H-D!0RGUDtDL)e$QddL=<|p+}&5 zB6Qxc>ZRP-#p1Cl&wh6XOd&n;kbwyd&0Ul6+V;v8h4#b4T*ZZ9l`VZRrgRsx4SdU6-RG2(3N$4jfSbhSE$2 zCRqw->mhPO#A2kr(0mEht%tn&9gq!81BLdezh*-xUB&VcIaO%S`pxgcX@}gXwW3X6 zw~`|m#F#{hT2ho^>WH{*SQ~<4SZ@CAq=VrAh{5OO`)db~6M&}ep$3+dewsw*L~q6{ z3X7v1qcgY?1y*B=?3D#G#)9DT?QW$o0g(F8%|zi?Gebkao;xa#;oj&2-L7BFu~^RU z(0;n&X3(e;`duo$aAp$S)$CNb{6epGuD@(?z#vaJE-czZ3$T-nrwfB*h`XfM7NLw;{&|!4g7VS^S;8Qyav(41s%>YMlG5o-XADlB-{2t0OZn@uZ+E1 zcZ;6;S13@|OAPbqw(^t+&6t1WXux?9A?4nmTCL@8xW%;)c{9+U#oDLrFJDkky{pwu znyocEW$Q88l~;xgQusKEsTh(D=+JHX)R5V-xLt6MGG}r~zWhG7SESxme^EzcYu1`uK{S&(aWVxWki1mm!ed>!=%+4)NM25J7%Ly8pvy>&LPrT;y{tWp z?>FOghkn;#G+=njL-`t#gd71cffjMuWC>p&8gYvlh{`X~WMz@#-j$0N^{0*Q&06^d!H)09A0Nh7g;g&3=iEO=~4({LKpEH95P&mhl|@E%tS7zx1{7dU0- zi~9`DG%HE9(nTT~TAdsWiO`mwr;MewI`G^@p=>(EB%$8btIS3+`Gv0*a743ThWg1T zoa0WCh`Tqv$Ns>jYQW;&))fO z@4y&waF{$_N{lu5fLT}V86?p9Vdt#T4(x68#ov$Q7SL?1ln~z_m9D@Y>=+FhIPYLJ z_@WTvj%^xfV(j>j=KTE|M`bDOmr5hR#?>CD#X4Q1wxhz;Z zg^HTs{Prv%F7|WN5JzPz@V>L!mzc1x?oXR+vzL}2l*W!-q^JDbZYr(rCv06V$ts`u zcm2|Vrd6xqRhFO@$-QXo7k$lmQ5M0t?&|QWA#Oxru7dAmpCCLxV z2TcbH(>;wXm+S;sMuOVouv(5KA(%2&5_-jajt{KqpQ;R!lr@ydGDMOd2xDnd@ZSI) z`-)|e=wlkw>8k#E)B^Y)sw7>MVG32T?SCeylLsmD@wT|1iF+O=9~_EWds@ktFtylZ zunKl9^MHfcl>IptbC?)KFYz*A~MHleupx`W22PttqghdilHKjKe40_U&_0 z@u7c6$i-x4*#JUELd(rz1FL6so6xFdZ}v4PYePoTI1i_B8B z#m6a;Bc8dw9ex^X9UgDT$u15tI8~_KHhcQ;WDk8%L6KI!mM|Q7$>bKxDxQz+>7^oN zo>bT%Z9iD^8dmk`n`<~SJ;PgKix%gn!G0xLFfr!UqD5V+U+pszwfcy! z78hL3=53ssx7;O}M|w1BFmv3)Qfw~BS_Y`yAUtm~2zg01QrU%o56Yp;KG1l2%VATz z+)PR-cuoq}qo>K7prpUGCjQ2?LUWJxQc@YN*J;=DLWaUYr}1(~f6fmH%3Av}{@l8t zX58;2@t<#!l}YrLy{%4oe<&PB@HcHE>aLKcrDxT&NCDQ zx2yd2jaY_KKS=)ikVr0_A6Dv6Oy|Y0EVU)frHz|X_#&X*>coaR{bcwxcExa6?nrGx$j zAp*^Z0ztw;HW^N~X|!1gRGbiUaEVAGe1rHt3NH77!yS}S{1xFw6^SGllu)P5$6hn` zR>s8y%JZi8q{}3hT}fS+`-a_I&ZHf6bNTvMFmQAeys&9_YH$#%M^s*>@ywPR9g(~R z6EwGV<+1&lY5JB};Qt*!_LozIVA3I6ygg#C#IfQ%uFozvlhvMboW_nrie2u$sBMI2hlRG5N=)TgB#n}aEjCNKb6;z+#hZy* zMOZ3TW$;QKn69#L-YE}c*2VAxc?s7~M5{r39z^>$OCs1J&CYn)Ck*A>>@tGzVcW=~gS{E9AofjVmPgWXrduC)o-6a1aZ?$nd=$*r zm;1tIyqqcn{X6LU3*oHw{?VpKrSGM_Xo-3+YGCz;o&cA~>p>WR&fj@U-i2rfP_lFq^S(2guV%R_FrM0KVBe(55&D%^xf{ zqLOf#e1T7T#730}6X%-dGk|Iey~2j}_%y&15P@bWwdf3PomM^2b!9d!3B(IDQx~4d zvE;-VC(K42=mn$YW-MV0;H7o|1&{^wxY98CaOeRY8Oyz6+AA53{RKfu8X9mgQ}L!E zA!Oy~BS3L}HGxT9IY|s>O@2;+$jurIwCMx=yn4M_4}u!GoRSL`fnAkvJ*O)MkM;I{ zqGO;^-eJ#)10Y{|6DG@-hE>SDEDqA!7Dvh>;vm1{`XBv;|5!5;fXW!Z*3QpwKWDGV zfjReCT-lBAPE{x3IjLDed{=TrvaIxdOFk=cwQD2*3(SUQ((O9{Jqdk^iDF-!+S_8r zRc~ozE?kbfCx4uWMtp%veM*}Zh4REcj8}{137ee`1JTkdm}BLk$<+v|K(FN3T0!mC z?1S10SjMvi8*Lnx!?iMDPy=hn!3Bl&gC0A>b*bv5{=v=6V)R#`!RMxz&8_NYhj*Ux z+Zea2lfcuM;PX-`zCF9Jv;d%hx&g+R%5Y0)w9Fm)?aE^~K8OHsK~Cv*!b|cpP&k{D zQm8nljOFShI44V8o^D_NYdGY&Zp1^QFfy!R96UT_aj$ndPupWAjv;NWniqI0cm!Ly z*YC6Z4`hCD+x3H(hU!d6*9_8+{Od`MeamZKLL}&@P}fLIJOEeVLxbb5hj#X{EA|sD zmQMwJ!VpSA~P?aBB*=;C81Y0yp>v@wnu`-4vG*bTy{{OH45JytX;c%QKEIQEi^oYrCxD!!J7(||j1_8Qm6oM~QEel5 zr0LaC`iTba&%^^|Ay;7_HBNf1ZF6C=zeC@@K}HTXQZc<6mzR;@Ew97qTv=*7E605! zI+ITzsNLWo2S@lD;RY$9d_Dg&k|iQb?t6{Xi&h9Z`t%w&@?%>n!|ark^$tv=6_f~t zLtb6o`J@Tg2JEN8qjiMhBZh_OFX`YCod;=r^>5rCyerEgIXc)96IZ82n?4OYVoVtl zPQ(gJJ`iS1ak7c=Qg)SWPz4K9oV8qP!LVB3eof*rV=I22jjd0Fia`XEZJn}rT&1nA zI0{`D8enzA_;wMr+NfDX=C!D+aMfKN#x+E-}QO2q45(9kN;V&A%^^`jrXKoKV&&o;EBt1-3>G7dQxz7%G` zQrEii`hV^b#>%s5QspI$zko?8KQq7aNQEOiI-I>n2lrwZc6Zl=ik;cmd6U|b>CUEW zi9DA3udqf>1~iij7r^RTx@q)S>RX$3%JP+u)^erEOCVKBy}O1X(l)v#L^}RHFbf?jk93uI`H{THShB=lV$OS3^IlZvF}R`(&=fnDAPH4%E`HR%wkKd#{$`xIpK6o!mnr#q(iQi#OX_B z(&i8gpuexroxM*Sg$a%L>iB$CCdUjeJ!Wc=M6d^Jv&V5GLFd@)_ix@P3+0K?3)X7? zFnXF|y%24*%Nt`NXR`zO8E7Q%DV7bg^K2m=U+Xo*QAWc+#gxinL@yfn$`x)48orzz z{jQCr=V`Pagh7oOQ6y3%5@|iU3E|tc5q|`|61TwPVKAoiCi*GWp~!EnlifgaE@J^g zm7@maRzf5d_GQ@8+ki#sj%i=W7SnY*alajzr5AQ8A{Hhf;7{Qc+ zKpROSmom2;-i^s0L z_0%q|Nh&0!s0`Vca#F|OJf~yk&D0ShJ9>mEBVB;33(FW3`31^6l-85wfw@Lu9Qx<~$9g-1-@%d^ Yz>%^$=F7UUu#3t%zu*D>!PI4VscNvymuZ7GxjDvp;k z^Buk?Cf+A2LbYT1kV>_F3Hn+9VZ@M30p;WU9YMSti7@V2h-rHH$|sp#jh4E9UTfQv z-EK5!Z3nqgjIQ*D$v|y`U)2u@Kscu{Y6qv`S!GG^nHf*XYO+{veq??>bItd6paJ7r zS(Q0AAz~bF_H~W7$#=53gFW$)HTn$*O<$=X&s&Q}%O#hjZoQaSb4{4we3+RxPPF^H`3) za!IV`5Est3-NP%TXIGNfo7z03teK1p*$c$IrU@uTo`w6T#sXF z2F@_W^+@O(n?iO2ITEQ{cT59cfznj2CGn+EOlPUB>BFea@75)8LSVocvKUZ+43?&W zG@(3qfu*X@5w3O@Y@+W3=iyFu^-D1T6><&sND-T50>uv?jPVa6i1K87i5z+pWSyM` zzmmj*U|pncUUH({@nCy+uP^_abFMy|-X#b!G0Gew4(n=({;kz@x>c|Bs{d45z~X|Nj|| zy&XhCvW~2bkac9maU2{oGqXe1$;j-GC@Jf7tZWD8$lfbQQpbq0GwM`FMaW0lZT>x_hj)NF3;ve(l5LoHK*%!AH0rpz@_8^OcZu~P zH-&%L;)Yz7pk6x6E%j=atee*pRt|d2;ENp$5Fw|k2aN+3WM5b&048p@@iN~NywtSC zd`T^cR>H9iVi!%ch|9pElamJXG9@p2CoF>&{8HHCc|O!oYc>FR)B#eokt`(JPdzIH zP^}}qO1)Z$wUEX6)$Azcg%Y?L0qixjsSuFcv!xC23jGyW+>+1*xce1vz!i|3Min7+ zNq>0|Baiguq*`GyZ*H-ygf5pCgrUzt^q{o_P(i~gZ-!O1Wr;5r9Pxr(OpBrR%bU$z z9?N?!85oc=nPp)pMY@0LCGx3gl66u|sSUVaVU?DV*I4~fG_@&qR+q)uDl40Vw*Z$+;JPy%6VWqe$}QA z=Z!T4vPb6}0gaO%(E~*2Qg?xlMx$T6Uwgv?a&Dw!fj=xR#t~vb(x1nPDH^L;N=?B# z%3fn2iQ3x7YRi2gpcA9~OqrEc-=e%M*-F-{J0an!?B}T>n%qNoxaAA#?${(~}2HvID;PRS7 zz{_KjC;Yxb`lHU#&<+SE_DR?IJe>G^R{*7YPp(S@i+-AF2^T0~xzbgAA_P~vk|8{k z1%`=GLYsJxdA*prlE*h(+<->BkRnb#%>PCdJD+t&PAPP(N*Pq z#t{Y3O@WR8HEA7EaT^d3xs22stbG1g#U*jURHfy-Y47o*c-$CGZ69|I;Z29M%LwV^ zCLcj>fES*40}7<)J?rHMy|l3<#I zV&NuP7q-(@pINP-z1vrTQ?sVF6jO}9`i6e{wU(kAi=Skh_zIOA2$L1h_b;}EJKQ9m zzRMdNF`2c}E`isdokNCT&^-lL0yAdb6YcKBCCQQu;*NT+2HuaEb=tKFBsV}R*0z|h1ZfhRWk3Ns|&wtZf0@E`L8*HZd8TOyT7uNXn|BydSq^ z^rl<6k%--^|HmTzM8dS~GAOc0WEgI@f31H02dsMEv*6Gtq(;+zDXwF3pl04(SkT_V zK~rvs@A5zQ)Ufzsb+luR8M*7#&QKz%UitcC^}V*2konY1opt4!yQU#Uj&5!}O(!an zv2wL7FC3y$POjyMhJGTw?lnH!F;oqnN0U3&NqrsrI{)62r>mW2Od6*Rh;M&7e28>X zagJ)xatg$MdC+czVp_ue%+3dmAYc@R2u)*2F9l;k6#c-%5a<1=AD3pFz1c#B-`zKZZsz>5vFF0*iY7=#gi^knJ;(zvvkmT8>yyIr+8AZmhn@*!vv zA~Wa>kV$#P%;ysWR<89Wk8_KdH}Qm9(VBR8SXpQW51yHMvF6gMR4GMv#t< zc#f22DpO4}g6GyZKs5(r38pggLnUBrCXfefw4x$!k9~55m)RYa3men9M3Z71tF@JP zTkZTb+jy|?z^i>sLolm2G-#`Y*>8hAZ381S2G)i4Kh?Ax%T*dXCgH3TxvERXBuTk8 zW$ak=20Eks1t0;jXw|9c=txmIP@9S?yj`g+KN?mpnmAsq^#JyhmHDRU54CiAD}E}+ z5@)WWQ6NtvmJAZRsj7_;*46p^j3g^!uP zoRm=|W-UMI zV9;_^s#FHnB)fJa*A^!1y<>S5u$8E)T&-5)l>%Ju77a2@OWxcDYmZp7X)iZ@00l;i zvqNt&{bWou^8XYFTYkxUv;$O0LUtw{+{khJibF7*W_P84>fJs`U)Y43_^>uVAYXa? zvaP}0ib;26VB5$8))EG;4)>bgn*}|F4#>9-Mm5zj+4X^+-MFxA^j5?wDcYENmHvbd z?pA71`#j8kg)1jCi$#&Z+ef=J$V7aZ^DrkaRRtYd4}4|SNn6^^xaO9naC13InuhD`Pj*VmS2S{nYbw1J;_;?`fl01g zo92pc!U7hzJ#Q#=vfWLAZ#G*sVz<~zYeg+gR3lnG(OSEpa4oT`K^-wnfSSQ8$OMZf z&b$vzlI{!AUu488-Xw)9;={CYuK^g8V*f+)WK0;&=r#Qnf*+#I{pS*6QSq|7$i*04 zWNg_~=467qn64)?R{mFIHs28RS7qQX16PW*89dii=aHhIGgw=kgDpS}aT}0{edMC~ zPmv1FxzN2l78nNNH-Y3YyXlV~3&CgZsdJmT(eOLKi=5N<`{WkD^l+y2IJngbZsT11 z6RI>pl3f_W`Irt)w!8iVFsY-$$Una_mFW@)PBN5HETYNf1ILynMl5zB^&|BS&Hl{v zl0#q~&Jv!twOAhYuRkL>y#3W}3jGh|9Tu*F-u1f~=}}SDS<~#x6Z2|#J2FAIZhBVn z+H?Ip`4jt*MOg^1HKf#_*CEuD*k~KBh16yIN0h3%tcqW9SWhHk{~oiiwVFf8=+h0_ zsqgyQ*sPqGZp6=h;Ge*-^Tl$;ze`6g7W*x$cQ0RQ)va0uwjbnjDjTf-(c9Kg#02ms9 z7BI!WIz6u`g?d3hVLCm>%&(_hozUZ;sb{4cmbY@_Qf4#SZQ|!uSjURmlJ@fK+v|;O z9YxlF;9BIYZeesz*jm`LYnQt{Ty^gAQzevJ2HMl*M_v3Q_Cg$-uqoO99IhW*FAOTc zrhgO`O%dTPGnyqwNeqwCeq`2HP#vT~3BdzwRwtuiM!-v^Njk!Ad9HcELOGkcr zEB1OCdhc3Xpv&h7^8F%GcKE`Lc;P14wxBn5RKSPdQ}R4kl?l|x(*(N1C4>k;gr(ci z*d!GuIYX$5&2|y0-j5J!eR2=66C!4uUu9??)CB9uU_Rx+-Qp?c*F=pU(eK z*J~WNf5s(LjJb39u1aa{FV+zYL5J%kjR=FXU(bJUqOsFwvCFS_GU4fNw93DYbmg+r z&(j`9Hj|y^AKQyZOFuTC|JXfPjy7d? z@1Z=GLbz16zobE#9%#9$k{|q#&bSiGuqmplWWW8&Gh!BvgHfxImdT7q1Y-`x@-0TF z1pir#=gy8rO!D|2oS3=vnnQ@~mVW&Xgw2ns`?2yD?B)rj*nV95oY6vOT>2wG>SuPY zFfJHawfme013nU_*M|=RrgdMZ6@p46^P>u%`Qm8A5o0K>=8@FBn5-dZ;PY(@Vv~*$ zPV;i`m{$h0N%Qg`Dwp915vK)VUqi$Z68Zdzlxl<+J92|k4g5J`oQ#Lx>Q5IC%9XDf z1K^#50P`s>#kfilqn)S32m1B>l-v~S24I8lj3w34^@f~|@nY32UZk8=!4m7#qf{}j zYv-Gn#llIH*JS7HvSN-e+uHW)j(ll6ESSiN($k^0S#fW0->_njqDTeu z&9pE`7n%e2X+%#Lpe$werz_V2cQr>5de5YvQV#VIkzsWKG6H=_GZ$}F<}mH#?_MrI zdYO34IflT?kJaLD3A5QGfgD8&hcUf}c#=nqC`)Uj4rC*1am<9k$ zwvj3q0nT)Y;uEm0-;Mxn=Bf=4LT$=Of@|-fK5bd}GVAdVCK%!R$7s-WP$Fkkz};W~ zpU+#Pi<1Dp?1l3qRvTbLz@lH5-W>=BBLzb1fP2v0=-pW`WfN&ov{Y!)5crA;Efp%H z2Lub{$aR6)_M{ShIqu*OU^zIZ?AfDC3r6XEEh;b4u{1*2cJU<-MS|ewfOdBu8DBm3 z#`pBH?bK0XMZ@n!*GPx42k9k`8CJM9$JH3Z%}hgvs|(gk>RSt3vXGtI*lin!T>Zrm zwe~n@H1IDhhnWhnyqj&CbeaxXtkg7VEZ=*}xe7dddUT=pseK{oR&{tsKZAnvOT($| zPd~BU9aTuO`ktUt6MV##Nn~xmGRyNmJKAT6cGDsrg@1>jkSA;h0YCEr2 zKX0+*x|NNd80KchRRc*9BrK5E=Ckuj0iB)Cj9mu?=i_!B+vXEtJTYeZT)~Agy~t&n z63${iO-FpiV}aYo5OJE30T+Np3VsGCOM8&0VPAr!g*Zt#ixYqN> z*}CU)!qT0=hHST9!~cR#tE2kWPLG`g?LT*`pZdq|9a%R!6bVZVb8a4mTFf|wM=z37 zIwR$iD`zoV2@NGrGNW3sA{Ea=Ry34ylJKU12-?`9sTF`;CX-18b5;lG5$=HyOsn-{ z-XOI2>wPv!sEs`CB2N=RLh?MgU^yXKf|J9rfD>%RW&D-kBx@HG6)2n~Pp?tq%VtE% z@mRlS0h}z4a4-=nNTa;q07{wDmRB@mkB8bOJznNmj0R@#d*(Ni%m5tNaRSArkKd}Q z8-R6;~Gqduf7gSPmL`NrN z2P`gbL9NJwNRM=mSOdzbI>uRJUalk)yk2I|XAAiiDg>=pFK*WbcUY~+q2FZ+OE4lpX7L-NQxvJW4G|kj__ffRH&Y!hY3VN+ zWn*dg8D0_RZLaF4z}U9>`XnXZL)%{=t~`=m1g+e0Hkl4Y4@!UMWyT9}lD4lL;=a}= zOYkFo?^5_v%UfPEm$EgdGGjk;!7@^G@WYK^usAhS{wnmQ4X9JjQV|?u%4sgMgjn$s zxD!{y4_HG$E7Hbff3ju3nbd8N+C!XW!mmuFfy;9vN!5hGrHm_~=L;r(fEVX4o=b&k zW=ACDThKg)T6SPqX7pF6{(EBomZ5RvY)*!Vp{f+C%*2N zz;CHp@){qg{jjX}y7xfmtvCB2<&5HWxM`g}Iml=#*{VQo1MI*K}^sf~ z12~FfS@xdz>`$4NK_h7!xR_Uz2_Ky!L*S4~(WvoCPr!A{Ca2cmVR31Zs4G%h_#t2Z|*W{^Et5&8$ff`7WG@SycH-wGM@wt-xwrYJgyI%L+zHL-{E?Ryv+hdjL zYv`4+rAp7Y$Hbi@V0^jb;>FXhS6cOd`dPn~Xb6QyY~4F%_^dy#V&L z+#M`Ug(b0LQYwIy0+AGm3I&nvfPzfGjYgndAZOXdh3c!)OQS#+T8rIBe=Xp5;I6zp z&{?pQIq?C7>e^~1KpYPnKx|dm3|L7Jxf0 z@tMuAr#N+BDL>}>MP)z>^1xJmB#tWN$=Pe>YAXrh=Qh>S^_qDLAHBEZX?9^OH84Dj zr=K>esUx%&C<@5y%=wh_aLa(^dLZH^lJZy4Zi1%1fj$of5dnmFs77+UTDq-PGNIGT z!Gprqp14c0c$OQyHFw$9dIYvV&km6=MXcv zXi&B%M30+S7?@8T+h)YE4S2_BjH(&;G5(m@EB6LVghZ^DgU4_xsE^|cZ&1b-ut0;L zrKZb-bQoI5eV((NP4Xm;)Fqdz_LDV$AFyu!&BzTEAO|_y z$2WOTk>)CFSr$t1N~tmMWko6n;q}dJ*Z{L@BHXP%U&cu)uU8@pSPJ2Llrx^W1#ll$ z`iVX8IrmsnY&#o9Fa2Swq6pl#7D2ccI!gnJ;_$C{2OcOl$}_uJvZ12fN3i@Q)b#2w zUY)PZzFgrrM#7$6;$hz1zK`~T>Bz}qB4rAohhAtJbmzTUl=2r&+;?mqUFHq^r7z1b z!Fw$B&_lS()A7ASOi-F$1ao6^_pvjQpc$ zB1`vy9|0}>k?|z4lrm_TB{Y<5d!FzI!t9%9>Gg`&NGAK8{JVnMVAleAC)%&tJ>{@=u%XK#%oaW5SrGl zd=+$X>y-|hSW;DAc7adFS0Q>Xz1ryHp&@6HvZ{4r*}0XBvb6K;&XOfjtoy>aae#?F zHSr;Ui*`}7TYnUw|5%Yx`i1f-_E%Mj{Q;;APUdVWZ3CN8$$?t8&UE^v;sY!OK6(*wAb zde^%j9^)W0uW^JX0H7!dei4S@l%z0!qjVR5V*I!{xS%*xa`qQ5j2X@DJC=1@(peJw zKxu=ygWG6Cnqv2pT2;lw-C0*n?l>tU!-(d5S3y zbtoqj`vzAQmIj#fg&51j^O#=2Ex}SYRe3Yr%8c!hmv<}&bSv2pVB!Ygq<6Cp-p?1! zp=SYT5);OMWu8(J&2u#!b0Bt!fG;yi*Y3X@xH9>H?SSiHh_;uT1(xfbtUD%T>L`hd z6bsz!W^hf-e_%9brtL^E*6_vUPBk)>dVbLB^@t9Q%aT@}MlIthui`Dx#)+7G?E~53 z)tD0*D+7p^-P?x|xT<329c6QaCP5G6UAZqoKsz_eg?w3nOg5Ake`Ms#`4M>V<(!qT zDfi&a6<5?Q{|YF6%PWcmF9b?-Y;8z?~?9pt8 z+3Hg-E|W-6)>iAy)ocaHI?Kl=$!Z6RDiOe8N_ZZi#HE~M`;7Y6(&gcj)>4)>jo2Z; zV;^=)#}Bq!%t_S;EEyTK%V50+|A8Mb&t1AGf+)~v-Q_f~UhR}r3bSD9U|jyinOe`| zEb_+-Z#Ut>_9@z^D4VKVSV)qM-&9pMPBSg*c4-H@2ZigdEPh8M=+<{hlr9+k7-F{w zAyWB?O3S&HVK#jQ7+gO+moU!)@|O;)$J>2=n4MlFuKlA4HK3=0Y_llToS^_^+M|! zWF$rz(TR4D8<-s28!MG`|2P;|j?qsRqj8d7?ICM+SzvdPti}N+(4R6Yl%cpP2y8<^ z4!em^Rju?+R!=?>8dmQT3gDc|ml1{zX36>2yKL{5dEPh-&D!-a# zcK~}zdm*p@F_irNi_Mrm(*|te)V#FZ;XRK7J*K}(bMUOamT&?2%YFWH)9w?dbMJXJgoK7v96Qh3sKesm|tAUzY)XgN)?D?+Ro~*sH(!fW+4OtIl?#(WWW2M zWDKalt2?*HD?p*zreb_RMZJs%VP!;BSkAJJB2MFg^`YX_zM}r?mJ(J!PFZGq%2v8q z7E9m`oAjZOY9Z)5WaCQa-77C}hL9c18z!Kakh*SO(6WOn-!;Mq-hyhvrqCtt%S!j4 z%{lpToKyjeA4cE3F>%SBGA2v7+9bJVmN}S;WYz}L9OsbOpyH0LR@TI~Gcb;`k0&%IwZ-Nn z%cdszVB~M0CWA>|sIeb1)iBqL2>9?q5wO9dn;Y}sfy2wGHHGrPP;~Iz*+&1U&K_*X z&%UtmCT4?in}SlSyU)GlXm3h4negWe?t*G1E3bA(E0uvblHPS`?*Q15mNc9W8})lK zKyBLW!3$uaH1i83rBsaJiY zgU&X-fi8d@<-R+g^p`=9tqKmCD6G!?DHl_RuIlQ4mh;=DKRK|4l==+OK_V{^o$|KA zT`_+y+2uc$SNs$k>!;;_iZ3Gd90=k4TD41@*5rQGrtAza~I!jNug zBZQG^EX_%QyRyZl90Sd>p8=^bARQafeIODKsHX~8b%Vw(zQ_{3DA1G!@PttJvLS=% zC0tehZxr^Qd&Mn^}om8E|_gXp_C!^D4PM>RIn)u8q@4!RVUx zjk#Y9@3E!H)vbZMt2c|<2mYwf#ol)fpQ(4NpGCSN=zn7q1lP&vknV#3@~`5ntJMuF z*7y!omQT+u$0@fHeAp1`iA%z#R`-!%Xiw>f?bwO(+WF6spBoxJ9k)&J{b`R4?QC_g z{?A>>kn~McpU0ip_sg+(6g_OelRoiE;fkZ&Uwz^0b1Ti*=PJ!z5ycKAMPvs#hxGpe zWMd6-r<7$IJc-kmf2mh~b*6Tk0yk+`Q<$_Ki!^h_Ul2cJ1j`f8kD`iV@Mf0bIayLr zR2Xo`gx6-&2k~QDyGynaBK4^HFo;MYbyR3c3PfQ=eKou&apkSCaniK z{=@gHg`5tj%)#^$7Jv6f)#U|7I-v2h9(PBj$x5NBs>EYc80KiNecQhzVL+ttEwsi&CMi$eS>XO1E0g0h@iN1*{vAB666vOUCNpBfeYUDJcIOeB7lm(Z1~>; zBo1-wtVx z`D7W0lV&1L)h+*c#+*Hc{ivax?3052>|Q`R{h7^6$9%)bq0s*vX8x_8;{OM@(N-E* zI=pf39J#QNq%oaZ3W#=RXwDacMgj&R3Xl-Hjb1-fSVj!oA&SG)?q-%k6_ zN~`y*Q>YVCXw7aZ;Ihl$-{1cnds5SX5RMYsUuq8Ru%zs=cy!Nf^*R<+A`q|7I(rSc zm|Jbj29T$kA%%qBsr{#EwYM3{Q}@_lQ^VN2v{OI&AwxNJvl_n?!td6?^RdU!bt>}m zg<1Q0kMe}0^O<9#dIPmbo9>njieg~I+U=P8hnbV_9(4ZlDCjgRtm`*2Z0j|)pCSh} z8$Ls6&i1%(<&vX95FHH2=+3}n^GU|@>4!kfKz04JyW#(->MC|uwCu}m7TZY(4XuH} z!xfE=!$|$?jeecA*;}>^^LA&8{wq93hVl<)MqQH=f9ayfZqEm++IVw3N_zO3v%Uqm zxMxC?ry?yz(e$}PuuWg$&U4!2N0r)d(SDrx1}x7db^zM7frE4O=z(<@^DJTq=30;@ zb)w1|>QA#b(Ue^M=0fbS;YU0?9^<3E;?>kksztH{#;eW)~o`R;MDY7DR4T-Owgc0#}FY|$V7V}1Jz;*@)~9U1iJa$gU_A5EHep9;L(%qZeV=#?3iEEuUGr0tl$TJxs%5iFJ{}QtnLLLxwv+Ha9r~G_6 z;`H*3mo8}Z`^Z<$622Wx0!&j!sU92bSOJ-ooy))AwU6#8ZagZY^4}@+u=<(mLT3#- zWE(Nj0b3}$XsheMviM} z^?;AwU<_{FY@Amm$&JJdOl&9sJxp80M6)=lO~J=Go|3ToApwD|*J@MP$_SR{yK?Yew7egU)nFs zn)aR;DCmRk7U=QR99@{GOz`X~z7{JsvGP7F^S-5h6@dz2!Yah`P(_rv;!?E%3%`#h z9owh=t;}jVtmiFPemS_1AsZoH_3M7M&2DT=G|7cH@MhqV_+hB&jrjinp0g20T*7OD z_H~geUAZMc?p;Xi*teOPjk84u_o=K`&PGaD-K?uwsxkYrd z$+@YeoZLSvB7gTVzg$1xUGx3D;YOUkLG@=wE9s77T?H|<;IJbP73Wf0JSN;kS5hKs@bI<8SJ|b7eUHLv z_vwfy5gx>8bVzNyTn_h&fH<3+8Z?X-({u-P5z5mARPcMk2Au&IhUNQrvZ4t<^qb_M zTbMAu*T8p>ocuvwHax9N2e{AKa`!wh^q$%@ZH8hA7#q9;r_4ojnwiF@0OO(AGRpAp zGXcn(&v*=DYf?J&W$fPz%8lyHm6JmptnR!His;F~XHBhRm&`#8T@Oud=_~5z)t)&P zO@I-&@CL-Ti3n;INNZe|Eh2Q1?ZzLni6(N?p&lnn7a+jlHTRP0N}i zrL-W@H}ZXrz(RMu#Pnt;f&%BU2Hx z*U}TMH`_0U`||#mEGfb+56E$SVr{8r)4k0`N)3`^qBcYDkin~u%GeW#%v`<_T_P{& z(Q$=CrkPAkad|S$2;ghj4nI3lbyR4_g23?tK)u1r9^@6etd=pe2-hFOXpr5eN_)+X z=dTgn4c;tSER%-S2UnFNt;?~U4mZa}2G(ch4;d=D?~Jzl68+>aa;Cj)u5?W+@UXsh zAtE^8y?evbClV~n$=`&W$T@3|1uxeqv6HU`ILt(=@gseiok`;dXu#gueTpI+aLtkbHCBzJ@+6QjqL=P3J%Z&~YA zsR>`Wk)OqR&h+`*Hq&CqB#~r~${N(xf_-C_du!Js zFv$m(-uhxLVLRoM3SWz^px^Ooi-nlV9;|a9Fnj|S|Rr6%55OyfKMDZ7uxC< z8TP!(tkW2O%bKUpG8-ew*Mb`sg(HvVSBNiF!VD(L=OX%bR65Clq|-$qSA+hm)pHHQ zTK{$xNOk-1rTHHH(YCR5^XrlG=&^t=Q?b>RHJ`WImdei*JjO5mGq>}U8+*BaRf93R zF%5kFuJ_vSv+|GA(*uZvQPQTpnY;Ou^$XV-9l;sh&h`HRrcux`L-VzxQ$yRYuWnfP2naKDnUv3jeMqoC+pq0zwzq3BT*3{Gzx|nVvyT{{1R{eeKo^iLPxpYA zSD0WF0m4A>VQxQFl_Yf6fB33V{0`3d{GFK;JcqK`75VggfV+oj)USQH9yAm+yoq#2 zG)>ZPUs+3WE70X`GqYb|{<)`;nw&>il84JTgZ3}KhpcYK^_3Wx z9~FOGs$O?M>Y^k6+lgHa+$wi4Mrx*(&{V&NVY{;PI;0)%fzwwKHfvy&6~8|h+&neC z_EgZ`wHJLBsg<5rn)_jo*kZb*N0E@TTI-1Q&vt3HVr(N9;%6r7<0{anz6vpEyYh*K zF{Wh<6aTyISN)5#*lj7Ds4 z`{Hzs~Ip zQ8xO?tHmW0%%ukicxzzMMeXocc%g8Y&hE)FLRv4>S0;ZZoK+MmuY5B6J~$uwKY-26 zwST>$QFXJLoxA#5MdWZB-%$CCDY^xQwOAr@y=CiE|{!FZ}RN=bX>W)SCsDHU$1+G$ERfhqH zEOcFg+AODizW$kG5deL~Rx{|QmI{2{m6M$XNh2sk7i6dV=*ZhPF*`bsdQHb^iyeTl zrpj9K@jx@9iMN#uwwybDgh5vFCO_Bcsl(XeJ3dnnLxWyT6p|y+NDWf(_PvJgb=?&+ za@(Fl1SU7bXW;aq_&cMyqo`h6kCNfxJ$y&b{i%bUD5OmDpOT`I#RSZ=#$&ivxH%B;wv}l&O5&~R^n>b+uPTa+>iftAve)`@g;X>5-S_g4zU-w ztczfK^LGQBItPE`MmQELRd>6w8{Q=3k8d#6hf|b!uxKLD4iy;kDiP&KMoIF$$k0%# zlxG)kq5qvfRjFyLn3N9fjhS`LNu0KvD&lN8k@IY7ZiD7Jydf$;#3QP ze5!A->+l}6eAG#2yat%OvYpx8O7E#Jbgwb({nsuyOWO?e?WbmD68|k-P`7-^IKI7) z{EIf|Aqt^~3_L0uny1^^12r8?VZ*Rc^mcOl%h`nwYvh^0%bOLYpG7Z3mDV~twaxC^ z9mF-3AMQJ@$37#~9wQp$J(Cyj5${XfePY}&^Y3_ltK>Veex8TUGwnCY94Y#Qp$d!s zGehdUPWUtzF==yqxA5B5=Y}FJB~n9S>0yjsp8IdDo_5Cl^{J-HmhI1#g3N(X7tC{y;9QjUbJX?t?Sg6ZwKs~ojzP_ zC~?b-4uM>o$HZMp{_rM0(Gbp2!qWc$UMjiYJ7*)b+9NSafiUu}Zq=mWx{B@P^m+;F z#`A7HrCa9D%NaPAhSXV$uQgeQj-{Y#l*-2hq-kKWp)Co0^L5YOeS@F1))?zN*aoG@ zPg9X_FKJSh(M>S(?S8G21-qM6D(iv(W>UjIui)j-d*|Lzt>NmrPoD9GGvAeT$#E?l z2U)ROS`go^iY57N*<4<(hBseSEbs>SYqOK>ZGLy#*%OrxjIcfbAEt@6v|9>i{ZG8& z_iRv5th*8tvlbI{6nX&Mh&bxMO3rg6>5n>A+cqbeK(!E%WL#cF?I|THqqL~XORG4P<5+hC=L141-Cq5vVSw+0a!Hw9OH2Y-OW$T`1|_ytW(4lV z)?$_P?g#UW7?vDcAVo+(mZ=Y?tx~RWk`5?kI>~I--)6Zmis?44SY_|=SR)x|eeChU z{<}JGDYJf;F`%xhB|6129_qh}`#0K0`Y$;JH--%3^n)7;%9=eFZ%*B;Xm5R*S@xe} zg2PO0SMg8NMV*>%)Xlx?0d<`H44ROR~ErgKHddXrMI} z8)@y4Ix}#LApf4Xo;t0!-*-Z%!-_xAcg1VhpU<65tP16&-$tFh)_?e_xU$ubJdyKW z30rHfN8iRD<<==YcL)@;jEX>)j)>P(?pnr{6f8emTnl$MVAqAAyT%|L-vkpl3^?S~ zz`1%Gmusy*x=S zIzBgb3AVCu0|#~$pU~-JSO~+;nId{{K*|(cVZYxA_M*tFAj-W@ly(HcwO4} zIw(C)h~Ux_Sale3+G87x-u2(`oN>KB`O!R7(~=^AbdWKZsd+@|9x2MJjR-{~j;|7L z1#khiQ2g#SEa$#r#u=ELE-dG7Wv`=2pDw08`DqrWz_ z6 z|8THC7$^yzY^r9;=Vq0LyAE1~2xJ8V;|ib4+Iiey@#TLg@CamW3(%r*sd&GWHP=fj z!w?Q7l|jNX|Cm2;()~a|NvRNN8zd0%K#)|!Ov^#S#Y1Nj)b?6tweBRWZ+7m-m!LP4 z$rW{xc5^$K(^D23NlR^?gKfU_%kv%n$VEChH1@0>i@&S9T{pcHtt=lYe`BLpspd(9 z9K(0RDw*2Nj<58|1VpTa8hLaYyORxtey@rv)XP?{Sf_6|l3h>d5{u6*7(CfwJ^78S z>|1|N{+Zb`>GbhhWK>~)Y{|l>3o|mWPacoS2aGAJO30R_>-J?*&6|mQoMlH)oeSAY zElkN=VVoc~8XC3-KsKYLkT+OnsQR(7wIZqhj7&-}S<@ z{eT=$vwlGs)z}}hiQ4#GzDhjEd(hk(GW#TOmh7OxKrH-jPdINHSJN-mk@Kx~G!Zqq z+rzPV!S80=%xa?WFk<8=*P{MeCpltF-)z*OVF}+|(M}Q9B1ZJ~^pc-MjKvMGbg!*k zduQDag>}t;uA~0j6f9;gc5Ng6bs{8$QJP<~**42@`T})m7P*g>BrOE(tIO+0G@EL& z^t8y=M5k8jT!|G*_WuLCAga7RDds8)>16XEB-X^v3fGcX-V|%f-yOa7taxoj`3c%# zk$im90d1<3DDjQu-3NVx=Njwnc%N9MfxiJY&)b9}2ymh(@{*1Rdjc-%2;a?Oe~C6Q z*OTzn@0#oUb1j9_FDf`)5$=t_>zmK$iq7wuoJ?U(a<0E7X21TJb83Pvr%}_JlA0U$Gg% z0o-ZP|4=rBWiDj(u9l8=#rb_Lk(+ft{|_}yT z&D2tyA#7-r{-eXA@|2v$^w^%h1N37^dhkcf z>U4YQW>y}-^@ilO*~H??jncx|UzhlihUbtZ7BoX(-%gxEdc= ze3#_%_p5fFT(_&iKJ4*Azo>XDcJd@Bh1tP?3-+mO>qcCzGn_k5n{xs!(cdRkm@nKc zy)pAZNOT>%ldfUYJV_KM^ zXn|_t29|6`i31)E+*}jB=2+MK-cf!zK2Y*CSdwTZ(Ic0PZW5wDp}ERCEs>vcugPfd3kuO248`}pxx>F8=t zZ_hjAQiQ|F?B&wj8RMl;HlXo=2glPiUA5GbVJ58(i1tvf^OsYjAwcLk8Qm@P21d`9 z2ev-(XiK5z8R2pL{kMqc^#7*!J8qwb|38k-J&?)w|NlGK<}inxLeiAOCUZU(8gkg2 zhaz%5T{vXl4#MmRVEEp_~tMhz(IrIZRE4@CNj|RE^>JigOK4<$o$&vOhY@6!*y2};av(Q`oIr)0T z)k}9?s(iAKcr*7wnfgcNNQ@l!Z<6@@tS5n-zaDlYjnoJJ2P#m5jpV!}Y_p7RwWu&86G0jTs zb2H%Z7p^G3F@TsX&!OQ_5%B>Q^qBkk!o9Ow?g+||X-Qc8T^kGsEb6ul#;P)dZz9|( zvX2t;A@?xHc7s(pG0-5;ZCY%~;H-it+!UE=FCZ)R%wE`XlGu5dWk{-DSI@e%5>U|C(XHbsqmRiL9w< znTan7`Jz}gcrhEc-g>3u`kG|J)aElPpJJEs2h&e3@rx$!|G3sS1pk{|IcoYzC%&U2 zmXhpz@%tn3=e#?l^=qIporl^)52>rDEa;-A=)T6nH67?~@XJ7*X0F%dPx{9mn>SuW z>eDIwa&Di*>EFT!auIDR!gDHhWwdy%`JJTm4f*X{J=b|xwEXVUU*WGRhE*qcj$fl* z7reAdn++|zfQrK{^*sM>{6ba5MWNBf*{)MU@-tTjpH<8|<(WxacHovVQJ!ysHP*HPxg3zg%a| zhC|0S{Io+5;f*;w_LajMK7mExDzOM6j+x+9xBs+=6Nts-z`x51ON7QIa%YUEc$W*&0Pn;TZ4@3V&R=gWCR+qvgo^y)7Slzp`KLxprsn7Qj6etjG6~T&|vZ=H1|0M|my&KY#}(lkNSti*62cJnLOe4rn~*pN zrQXlVko+XjCIwfOFNd}Bw58uxC?>|xf#Tvx0Mf1#&I`N3ZiZwF2F#$}7Vlw(;hcAK zrhf=F9Obje2%~^oT#Laug+0Qg;;E%$jo{bUTdWe=EbDVGyVNI#-V;8#rk6icW>2oi zPVHAZWPCaQ`QquTtSM*p!LUDsKie;lRgO$aK6ym-tgpZ1`c7x^H1F1@PZdhJMJ`t! z7rkiZW_b=>b-0dV5^+JXQ6@{US8Cuk1n0$$|3{tnoVjx4+2Yl+cCE$PiD4v)m&1&A zsN-Jcr-SG5m8I9ITo$$vwF?LMv+{yfcRk;7zRT{+omr)ZcYMhsTV3jsi4t(!)h@9;yWLsc16BjaA4@DZB!WjlYZw zne)8o{ytSG|LOaO6D?obcif=8XF^;(Z)w7`nj$+dh0Jto-zs z1TQ7KAnO*b&|~*zNwdZi8n?c>?sph+FMA#z{ttjTQ_oer;$5FD28ZZhC>x^w4Czxw zkLgTbeL7%xHslLcQC1gu)9y6n=e5mImw&;tuHrp!i+_^TJ8)No(+!kX6-YGXNI^C^ z)>23@lNbn0c|eU5?Jz_?tv*{>P#h6aaVI;)7=1(6c`vom@_rmqv^wrrMsdzj6LvAe zu+VzqBPj5x(9k@npW3dKw*zex&R_ydhL~3E>y}bdx6aD+>v+;d&s)ngB(YDe>*Lxx z{eu8R^8#+THzUI~04%^1qXV_pZ3+r>oC=&9IZ(OPMH^o>$aug|S6-CoEvEQQbrv@H z4jdyk+~4}q5lV@4EHU46+5sQQ5%M#A2s8_l_64+(#rTpXd128diaRRGgyUnrPCuYf z^3dBNR9Va#cRtNj9;_ad?cifqEjq%@*EE9Lh)M8!!5rW!q&U-UO-K*pmnh~`32&|$ zinP4ABNd0_!P{{r9I3Lvh9-HNH!jf`Dd6AXujy>Eo@~r*V9!3^+U$*gmn^SWEb3 zQu9M}s`EwXh58xYvi6!AV#6+*9UdK*?dz9{os+_Un$&;l3$N_5vHJGn`3B17tNO=8 zRvTYn`ln9e$2*_8;(xd9xGk839Q-`n+p>9Fuh72F;@N|D&rmhW&3hBKs^evT%sy!= ztb3)dd&6Vl_~heGNY`(i+7)zt6?ZuR4}0}pb4}}7%w2Y!*;`nQ_v*S)ci}Ou zi+t?0;P%&@tH&Gc&^pt9?oB?5PhPhCT~{Qo{>sD6TKJ95r7oH6Gkw(dddk1`RM~)E zFD{*xIgZv-bryfxHWqyDEGbkY=u)EEx_gw5?9NCI7wC@$(s)Z5sj#aA?VIgGH0$CH zYAf5fjOtfqs6a}0?R8fwOV1A&`vgEG$-T7(zdX+qeK*Kl3+kVqiSIyxh03?=kb3Ki zDBd){>OizgicEcWkW4JS-liXE!>ck$lHP;<1G{qfwnQR|KC|jJpdRM@{T~3fvH03< zJLqA9WgXS^s!5{p2<^;qWBZZCMel!hoqpy26xqA3Z(Vge!|Ytjb@r9+O+Nhb+6vdT zq_$qs*AvnAzFT|#J$Lruo&BZ7$ZIN1cCu~k-HNky?>8^ihr3b#2XOVoC!;S?z8A$` zk1tES_&9ZR)noR{7A$WwmD@+c&vyOJZT=rX&n`Bdr^^&jZVk~-hVl4oBbGryY@&%Eft4|Y+WT}G>XPM%u$IULOV z`u$mH-RJ93O-(je&y9HeD>Qj`&&fi>y*%?tzwgdyP82z8tu$xhA=sHvXgvA*=~PJp zy4ijA$T%rE-DcN1Vbm_$YZE{PUbry$_Y2D|PT|7Q^pVD&gUB_2&WCiDUxMAmGY>;6 z){4{;h+%{sHb0I1h&-C2tFTIhn)U_ZTQkD>-3@$x4*s8g!5f^T)y*{bQJ2pdJW*{5 z6uM?nrKo5^_Yi*=JyV)Qmx%+cBWn6;!X?5zZy9A)9)UjC%@ig$x7T|D4SX7ZD%&L2 z88_`goA>DvKVV-@)&TV0_1{agcsgFJ#nUs=5uKSq7q8_`8arjU0^{z}{h4O&QPC)! zUfYdyhi|}nUlUW4kM?r(_`f$A7C)0Ko}e$*(|m7ST&{%v9V>qBny_u(Rb+TozhgVq z?#*0-Ys1v^pTDQSO#cn&oB3*|>s-M&`~KGE*-k~fyB^n6qkmEV=G#2`uM@3wGc=^j zZiG8iGsPY4O8`~L=F_+L@-KXc#Aj|!Wq-(fv!ch0yTefqr1`NkcNu=Mk}5AQZZ zXF@|Gsm&jYR*n~+{~`FV0^gQ28)ttIrSs>w#ec4g?b|F${paZEmGZymOm95i3~BN! z?|XGo{JFgMqmZi!x^u4E#;-057xjNPvw<K9bUb-GVJyYLEgzqZlH z=Mf7&>?;z;qroJ)j(DD=xjguM6i# z7)q&OS|EK8l0BvsIydFOIi*EUa6YBvxnm;-m^nEA2PPzix=W9))aRXKDsG+C5W+U` z7AQ8EA@9C9=Yu5t&UJ`RPEUm$Yi1n-?GtiXjr*!}{>)RQtOp<@Jik#`B;XwYn!woj zhVCEjhrq`?%O)XPP|x8N)g^3cHbJ|63+MHz%*V+Pwx`LFk0hK@Py^D&0me7Cgk>c$ z3Bomx`55Ao~;_+ryoJN7?;)120E%BuyZQ6yf7=c_d-ph-siwIR+zG?0*Rc=3 z(eT8~oy$Me2l9y}^*7I+uq5xj7N6QA+;eDYxM&m8(b=UQTL?c zb;+}-Itu;?^!VnLh(S$z+Qkbl7}?M3N_MXNc`lrf7bU;8pIOEkAP+wBV;-6*p&ldq z@dZLcVad#aHgeph{{b|NVfJ-8(`!{O+L`8e6;F?u*1%=RV0{zEkU)4L;L$$gQ9O zMZbku;9%nCo;dgSy>nj{r``vinq7MKfc&|=l?I8LFGM2QP~Rh!c36ua(%M~&#^d93 zW@Ify6H;p)Q{@?Qvt z6Hbzi0-=*W5=O-eq!!0oaK*^l{Q!Ya(h3_;f~cxBccWq<+&Kv_`yi`@YUl=^maUUG z_CUlM?;}XrLLDF-a*)|z6D&$KR-`=<7%OdFqP6x6b4}GAj4A_J&rGaqRpP4kxTWuC zMTu>h0|Du%nW4G|6htf^mT~nI0ODTA2z*?(^F+1e;N3B}>@z^DrAM074xz$iO}18A z3OGr)E&jDU(+g0xv%qp0yKy_dkHdxo^MDE~}Nz-FwB|+Lv(LHF=#~Tm9$Nc|)W_ z`t~rufJxEJ4$ga60>%a-R>EzPJPU8pMS?8MhTv8NUPWxfm~5lL;U%3G&P-yU99zmw z6>h)P3S4HlvPevwU&x9SZME9DBfi{12B7vyhZLB-#Q0`{>3vwICCKg}Q1i-iEMwdC zS`n-D72{`8WG9?rRE30tj;Ql;LR`M8jXbk__5^f8hc%A;Z z$}g+gcd|=Y*OHAhaQJo@x|pw=sK}ujfTO;c7kg6Ju*gzaVq~_q$=T$%-y7sp z<=Nmxj?I^mq{|<8;lX#6?Kxc!b|YR&^UOq#Y%fdCl!~WdD>*YyOUGCDv->Pj!6HkB;ezaw=3IN&QA^h$T=Xz2;CH#WduCej4&# zJQzxa?4bI53|6M;oc9M;CRl)RI5XRu2jbk1eNHP-omfLfisfmesdQOlyD#(R=~G%i z`4{_*^R5L17s#gKJc2yq7}Pv0SOPur@{2-CM|~MC06w$GTD>~sI=2~}?z{szS@zxn z->SI{<8v&**(m5t};g9%X5TCPjeJ&*yg#EDBQzuQfW;|SV# zsLJ^_T<79tTOa&BYRA9kJ)!*fMEv!8C;8=pd-2<3e)9)- z;&*fke+;WT8O__8cg{#`y_hDwQO^(WhdmWCc@?hVwL`41Blj8C^^%@ zr%9fJ*p68Pll)eQoCmuAq7oLRyhTv(OXAJMs$s^1!3ATA*?|3_Td{=^htk-dH{w(# zdk_DM|qNx8wt|rHtnWs%Gn?>dX}}Me~7$W|9QgsLoqi|I;?%0 z8Bi_2k;Og@7hV8}eUMg7CO+YcX1373GNMObT4MBt=2=sBGdBrjeYl=+3*&q^Xtf|B zNy@v_pAMUGj^=V42++Zdan6G@fb+VU*hIf@0!HHzoY@PU1n`KAUZ96TJ)^BFqd~QX z#9M=WVJt!GaGW<#uu+MrE4Q}9!LI?V+EWAwztgqR?elNVz`VipegXnS;C7?Au6DaM ztjWCMHBMUt=%Tgc%jRaO8*&b_8G<-MayB=q3h~LXFiZyO^ByH86X*F2l@-D9(`BeMj1{0oPha&Nx~0Hlyx`yeyxQ+Y1hnCHv^->cgB)5O=Teupn#<@7z449`C zS@dq<68Cvk{x~UK<}cE{Fy@d}_TP4WnXBiqE<3w1YvIDJSsSgGRFWReL3!$s$aQkZ z&fyF`QR@9_cca>tU@A^M)~oel4bv8mu*gOV-9qXl3Bns>pfx`Va!7XoYW`5#12YY@HTGWh6{zltl2=Xo z1yuRDKXZS&V>^(MmDi}O5$#2J!QR+m=v1=P;%0TOeee8lVp}5NokxAyBOwQJ?r{gc zD(c0c*~R3@rMj0Zk8b_a$FTn03Qgm`zxq4!-r5pr+5+8S{H!v+Y5Hx%+Env}txHXJ zF3=vPobnkc(+T1|ZHKUz70xRm++_Ot-yj9)+r!L2|cObp$I zEq|D|`$lZ+J-=pq9EpoMr*SB}iX{Z~L~#W(Ik{c?6{j_q0FK3T z22$XO$myTTEXM<165%23l^WkOd5CIGA86HP4pa16@R3 zTObUfU+FVc$kXz@qnJzOq~s2Te|et3z_L;8o1ElkNb4sqw@c`Y50W@!YLf@PYJUNw z+Iy69{I!hP>NVBVnughq+U&EEyWDy*BR2FXQ}H&-pDw+WQ8cQw$h-3afU;+F`L5YW z4=KG3+@lkdDPRdBIxQpODIhSpw0KR%p4wp)1UUM(>_FS-jspSKal|ZCHeIRJW6wZ= zxD-2ygn$Eyu@ZWJq;qsWl=D1S!4Napg&zZs?Lo4ofAjR)_RwbzK}?-}Ot*+ehc+tq zEYIK{B*aE*J^ED}PqZbtB^ z?&6&J%k-kVi#qjQ=1t@DGcK#qx=K{29{!b~8$Wk;c*HezIFz=xQQ8hve7W7Qw4p)C-JZTI>(jl3~MfS_%HTG6c; zbTOK$4!=yrEqIsX`HgJ5Re1rjV~P0Q<=0#HEu)QT;lR={(b)S6`#z4N+=OWH1m}Wx zOU6b@8TRA=8|3e2fxOr*`AN$zF>s5E6eXw6^jeC%fRv00?MT`gAha*Uo@QNRodmQn z?Ga5oJJpN6c6Y#i^U2uwTn*O>i6eLs)Vbzyd9sCVMOj%0TJE3tCP2yc%wv& z9!1ZlJEz+!hKo?6b${>?6?_uhlCU&QM_!n}g8G-1U*P|CIyc0N(ferY ze2CI3L#;;7B4GttxCTsD32Oxw$x%l*#FS#D+0CFrQZahVReFyc8yx>nRjl6sedd9e zeHYEG{@=YHotmyLFZvKh>n$^#OU3n${3PT#w16w=m=H9v^!b;xe@o`A4o*gSY~1 zyyoZgu_NxqT3G+L<(h8bdS~C`FHYAROmgbE&ah`nCz@ve2T=W?U)<33tAAuxr#Qaz zaCBR^wR72Jc1?SO>j@k1J5v?VjwQ%uX*q@9XRO0bDen+6pO~f0~E50C!Js!d5pq~ghgDPZH zEGk$Bp0JZv-{Vbv6@a?^Q$!YnBL+B5HYq`N!KZF(?`d)AZzmxA;q;g$|3YqCfrrS5 zH3V@_g-4M5meE0?9=TwgoVz}IyhHUDCe-N~LgF4kfnp?VVBHS7?Z%}yi|bvk4s}Li z`^%~K>0omRgATREvt=-DiWk$fJi<$0@x*KUumQNE?S1;Y&<=b-F;AFPEm;f8VJk3HdI53(L%E>7d+#!+5Fm zQID+0bQyDvpM@w&@9KA;dr)2ti6=Bgn&iw7NU6Kr-v==q#zdPU6TC2rTc}p4D0z)V z3z^~;*zWP^LDeW#m>5YtCHzQURtMNwfagI<@f#O3p=AI$Y}?8lT}Y>1kgqf(O9aE)MBC;z%%7(~ioI1Evnqa}-sA2(xV7DM@t>eW``30^ z<7d%hr{ljL>MUBjUG_pxY_JXUS3qz?=mx9ksuz=PaQ+9N+FMrQ*Bw zMkew|<(KHNWiG3!Gqj+@cW0h(4V87*oK@8n0E3U${Ne?zTWJ;=DuFf_K{%DDc%0c& zE?W{MCd-E4*p(MdXAQ2HSR<3iG0w}C8;ZqDiZelb-y?65`Iudo=zTvp8W53OHpx{x zG0Au17(bO@Cp5uJIhlpcf+{{j61Zd~ou%>?vVw2=t0g-ly%2T(7-IYe9Nu}6X(^bn z>gPgfmkN=JSMHx!ktWgE2_FPt#~xBhsdkE`ytbJfy90ggOyZNUOtd9HvEfd~fyC~B zD5!Mu6q?6fk4j<;1vX8VYh<2f_U$P`OaL7)^jcOfVEEOM(*DP=yM(Tm_NVJ` z^M6EEYOP>kFL=IHryA_%QRoFe3#^V)xT67ShM;9&$254oY|{8)fsNwOV9?AC)*k>@ z)X#J*3Fq+3?s!Cw-R++w$if@)YR@70Ohke#t>gd`X|M#eKZ0j!(e&{G$InZury4$( zuP7xu@v2fpI$7LcP_ibldKI9#b0_>{$T?y*&}0>z70^N#k5j6<*lvZ^q(jZu%93G? z(i!Q=#5y^QWQycbu-q#+{P|g#B`qg|z{TPMM8H3ODgG;sVBu)kJxei8dL8{iw(}_| zrWG&9V*vA6wwfUwl7!rsT%14l)5p9I(etMEJ>B#)F>rWDEUlmZB_qV1Ej=$E8G+nT zx>TU`<}Y7=;Fd&rqQBg^By-O@_FD9D#dJ1e%7zS0GWu}ghwi1Yor&C8iG=Q1&$U0N zrggQ7QB~zv?R1y*n%BBsyx5TYbm~i5!{&{*ZB%dZzW;AQEL!fdYlx^1*@=GgNMO&X zRdin)N1LJ5aA^TRZ<B$AB<%2GlKjn0fzxKsXe{9A}bjc)#uB{zZc;K&v zY@GHV`d#G^`_8E=w%$8pM5hno`I_WVl zJiUFnZo4zA=Cv-$N+rc~?z_!3G<*aEFI;ia~0q24@~6%{L?;Qz0$Ul7Z6-Z6W0sKVQX9d1OALam7$^yW_2l zJP&H?-DW>d=gBOvID61Fqmd*s7)+m06>pKfU`Y8s5F4U-PamnbRPcmG-L>X!l@~qxu6eN zC_cqZAf%cbm2K}j0sNE|EA1@xk%0YzZHG9gU0G|{qc3D^zWh4Wc_-&I;$ZXn`@iGp z6Wza8x;ghvBXiMeV=gKev+mL@qdAyn!GP&BULk?bNP5wW-`I3Hy&a4E-MrR0~7;j zQ?%_kia4PtO;WMuJD>O0wz>E$VaK=^zK_Zt_V-ch&c#7J!Ik{H*fP=qeApDl;TugG zw6|(CYP@P92F9Xu4j_dXP%Ez)kpq=nZA`XqRJ$gz<>xuf*X|QCGNU;rTyW(Pw$`x( zeb=E8Dj?SQ*oOt!($O9Ao!s_Kmm&6p6l+5VXkio_x#c zk8NxzMgZ!L@TSInn<&8L$t+y$pUn4iCKky7r?Ags90R#UJv(euGxJz-ZeoFA2hB1` z>1(?Ht@?{|qfL%Y*Cy^pJ+!O1BZpdQIkm<-<0xHM9~>0cNgn?gmwteWj27c9?y$;& zh&3hDI^o^>$p;Rb&{nqcD501m-*%Sp@tW3V+{nyj)J{!SVm<>^>d1WTEMN3RUU(?W zm?=HB@lEy|MEc~@XCU7VXiIbW7-hn@kAT_@CB0v<(@j2x-E&GU+q-;!az~<7DwrXT zVvKqOJSye7nOq$}#SG;&(g855MH+p;7ihqcDPdEjSGk7wi01y{+k1FSYqtj7M#VFV zA%+(gFud;?5OfjX=a2Z%^ztLT&re9NTMJ9c*7e`SA;7ICAo-{8BsnHf$S7-qf&T@V z_=I0;3ZVy+p_D}E;Nge%OZ%mO(L}lRHjGoLk6P_}i|{~I16c|{Q?+J-UHdL<54cn@ zEHz-mLufr&kevS5(#I*dKt1CCJ*{2B;n%{qD~dQ(5EMzRKXs)txGTitdFA;S4Lc3= zoVkghB3QOs^SgNM6kfvC445p<8+SiH8X4w?h^+)r#KIC~4|sj>RY2i%te8WzLb+{b z6yq?@TAK2BRGOJU=?_fB9IKD!4p_Acvjrd;-k4C#gNpIi5B-m|rhyJTC6?zQ-M(T^ z2$e^GHmESwrXM`tUR0~Clxi(5pRDrHKb>)-eKG-&TsV||4M_<1lulEC1|BhEH?{); zSmI<%8;Tx)k7*abZyJQ5W(+8AiP4WDHkb|^dtN~m=tA1)%dZ}WFP4R= zA!;hyZe`>NszySD&*~%+7H(>9&Nf6W#@d1Iz6y@!#XEXL8>RpvFFz+Dkc@#{3px){ zDB7YE#Fl!=Zec*JM1&bP9*ZZb(}F-!;-toH;=0u#Drni=Wz-H9Nk|COoLR8GB~z#y`7|Uj{^+i~~^i`9VsK>(TeeZc$=<%08un$>5n-yX(#1pzWdUoQD`PJErS@CnE4r7>A%@fy|qbE|% zWlRkBniou;6*{LC4HPS-2a3^{X9`3s`DOc~NY=cz0nX9T9)|^(+s+rNKW-%)3*j+-jV+CX$arL@9Mw<( z^xACN7Glmnm~TYz>C(S6*`N#H$viFYc_d)P$fkTNpm1F0EYU97osfP=qP{32y)gq3 z^GL}gbL1ngTmgSSvY9Zhq;U=(2avWcHQ&=7#Mlf;4qypNKhp=GV>zJT`O-rCn3_Ab z0p+`ZY=p_99Z2h7C!#zWjAMzBu}z>Wii|N1HJd0L%yaz+Z~# zkP&rk2eR0mrA2O6TR#Ai$*<7tIs+7-_=V=-z&yY_h-g!+Xu?O>b4!G2A}Q7ATyLaH z(`vLfYe`oy)0xN+yXV2TkKPaD*Pz!W!nCu(T21Q+6A2;W=gxsuH5_SPc7fT4c>&;( z><|MB^@?H4+4ocY9;}&X2*p^?MwUC#Aw8TA>9=lXDD>HJ3GBY>?wL_3F5E?D_?A@-5zDlcg-S6>e3pkjlRldaa3QutFkN&FuGp=+|Hh8Rv% z+NA2L0=QdUNoH8;YZWR%)8z}O%dsy_5$&KpS2F<84M2mOM;RrZV~eDG1f3 z+ZIy#K1wL-2FfIA+M&-W{Ug}vQMB+DOF3ko#bk!ffv!NBjS*co_Pyv0rO*3EUC;%% zPz=Qu!%%uKA43d8|-99FS57OYvw7u5~2ho8JL^ofV)VC$|#(C4u z$qKz0OUp{`N%MkgpLiuM@_Z!&dPZa$cNDtHTcKa2wB}+9e@kBQ&5tK26e@407co-b zDUsU*q4c7iuumf|zc$u;eeuzlQ^G16<&yTDw!%^eS{DEK$V>?8j2ZxLTY7i&F`RF9 z7X+#bOQS082WinMC-<$X^A$LN)YHH4wo^#(Oa2jfx#iaQq@v6|w_Wi;No>OIOt~*0 zul=@0717m(CAij|rL@-SzGwHfn+twHAK+zoaz+tK&jY;i8>;1MfSFaOUjizGKZ-6D z8?3FYbj;^nHbZ-2N$5X+w230WkA~oGsVib17||d2Fh7nl zN(?|ciR;k}W<9t|=h~)~D7tI~kX1yEt^%l+uN~#bbw2sCDjb>5xHqQ3hDtUJEl4}x z-#!V4oioeAx2w~jfy%r}*L3-VKw7}lnQ?^eIxU=0x&txbE$%K| zfy%1Gi34mKLsaYBJezVDQgJ5>ulNr_ZnX=CgY!==ep4X&@GAtu)!cx#TXw0iz^o&x z@Uju09MF=EK9nwE8i|Imq2gnKLYDGF;7UNtps8xr7sVZdd>eS_E^`Z;?o)2bmqiy1 zn28N_UVtG^IBv@cXd*;jHSSzFQ3Cp18q~93yT!E(IW#?`>lY||YwWCK!ni{RlMwVy zb#T9Jf#9KNBI?hmI8aZpFs5Ib@QBlXwA~1RV=3BWS3pZXs#u+ys$xEY>T#j)7Ynq0 zo<9%EGZRnd#x)uBywM;vai9Y8ic~O>|A?=~I?e;Md>_U3F3{TlCBMYd257YkXGyaH z8-@KA=sN3G2!lxA0lIk~-p>@I-0>-9)PA&`RkX+ly)C^$m6x6Sh_|Zy z96x+7rRBA|caj{{>MmMfUiV%Q`xs{4C;+le$XDz?7p)ETTCXk}PgmxVibY_5NqLl} zdjt~Lfq)3Q%ngLa1SZ$+e3n@$u$*M=Pyb5bP0#ocn@0#g-G6eFA!aesVXrl|3HdH$ z{3;xMGEb|}O&K6dWIbXP@WGm*!R_Y*%5xbYf7Tzky}(O6a7U|6YR{3N3|=-+MHl!1 zoMkP|E)sXxj{|o_-*d{O|FR+4#2ek(fKW^COnxt)nO%BdR^F&^ITw**mF^+F%hRYe z$h{u(Rf{!%^#a~1&7CwylIbB7$Z$VP3nItw8(?^J517I3P(>&@G7QqQz=%zhbuU3H zy*Z4S25=#j;lj*eWnNsuTZ>sWX$yK`3cw&NIoD?GmCVGKv2&@^#Ln241ENl zkUyn25n=DGpo#s_(A_!HXEua9Anl5YJGyZ+ts2V-w2o@YxQRelN2?j0pIQN2Gf>-! zz1&WADu0-n;HXhe0xE*YK{)3%GQgu>sf^bqCVCDavnI6Cx?T%Di=mYl(o9Lv2ig-( zPff`iqR_fTg_^aUKvftbVl_x~0k>xh_0C9h(_==I6L1bOI|Vm~Bwq>8YFv{nJt+TF z;ZyIHL(*v;FGf@I)Ye~{-zF%0V|P_fX$r8UWa^SI@4Aq#ewGM6Eid{;R*3nk38wh~ zl@Ad=B-t+&ggC$_0%#Q_6Z#ewvX6{k8<)%2HRZV5s;H4 zteBs!+rMr_V7Kmh>I4BqqeV7&7w3->o(`7R+%y!YR*lP)2Y(Xj-aB@Rzbqv2;<@hE zx<-Wk=l;eE3tY97N8S8KZ6xpoOTorKjms1MmHU@1RFeGeUqE3LbZ+TZuu;1C9xmAL za6$14LTfaMXZRukMiRR%Z8tReCV@*y_1X(j6N5jX`e=Os5A6wE4*qdgfQX0OdK6Q@MFVNPJU^Mbm)*oi5q$v)||a^5(}r-lw^ zs(9}3C70R4x7jT#GB*t|GrK%XoF*wV;=)58mw~~6#eL|vCaZQCN>i0m0?WCGAYEz7 zOn9y+oDG!Dw$sdy-k#XvKSBH@H0K5!j6tw`YR)Nq@@$3J6k1+b5~l&lGX{#g_#Ayr zfNP4>)pO9rA%+=X$Nz&0LO!a)gxeHs8%Qr&kv>4~vjqJ~t~%Cb4DdX0C@;~pT@qn< zRN*Tf94o~os^Ohffx!x^`S0EK70BNdKsamvq2llWcxhFpL$CtPDa)x`(>ghoU7?u+ zQplE?Y=XK?@Fx-g$&pfvg6Es_0a)asd*ynoW0(oNBad(`$&AWWiQ6*3c&%S{bY_JGDSHsT_`|&_&>qPKqAKLzv#G*?nLzht?G82sW2cQfbv&Rr&yjB*n~|?}c#7FU%2r@RFK2fO`)>25kO*c;|Dk z(;Vx;KnetpQZV|tsky{l|S{U6IF>MAMk|eYkNhPP-j%(a4a_ zW9n!Zu;HDygKSRrF{5;{WewI+gE0Olr>IgNmQnu$EF-RYaU}oa=IkyDg*@?h1fHZ8qAAR8n=j|$TkE?L zD0bpI^xuVyoxP;w%IA~|vkj-}E04RLf6&5BzdgQgfxEGv^&D6F^n}`-i&5@j+vvw( z*S%p=1+I5*0RA9&wbk^$=O3~7cAP54*OTPlbrU#p?pEYbfaKskQ)EyX zpx=xO1rcrm1uDu}0^}?;EbK5&YdH>$K>**#w>V_9Hv(_%sgV!o7dW}$GYQaolb0%S4CE)jM78wWnNA{wz1D$B0<1^8)EYv0Jv*qC26Q*}yGB%qU zoN3C*ZEg)l$O%>sTQ3Ik$0+h7>K4Sm>^IK??0Bo$e!X8HG#^_#=heSlLM;CRKtIF9 zG`>96fuwB%uu53ke6nV?$SOj8p)_V(NR&K^#}|nA6pSqbbq95td;g>J$80$)DlgNO zOQaam4qeA*99qK5_BKALT}odpH3jXKjG!}U-x|LWR46wr8n+{Cb${q;HL}NcegSYM zbt{xxP5IqzoT-5^P+i^bl5~o6jCMiXfKSNbEc~oznmUWG=fR)X*G$CI%byx5%*aIV z=Z_CfYud9z^arIq{|6|&9d$o1ozlzsI`r4c7X>%sqTF{+D~YW;>s1jDX*+!TNfsjj zp%^|`RG|%E=8%v;d5P{b99z=>3&!d>2`u{qt(%4)yPp%by2-(pS|Hfvru7`;~7(biVPFCxW;_g?*VypUGIT z`bmD#-|wkJ{oqHzIadCG^>>2ya&~`SuQIEYj^Ws;a;g_j&Yg> zfMHU+SAz7FFMw1E<5$WKc?cFK3z*b!;27j9`C+CVn+jr8 zNZ3fo55A93Wxr4(fH~%^A%}2^r?{P=(nAQ`$}tKc{#2qe1i}h6a+H`1@jd{h`Tj3N zAjV2dY9%`n?8MNryDeo|wkJ9QhqtpIF(2>A0-~C9e@H{=(TxsqS}e%Yi%V^;V@2GY zxlI&7Z?$0G=*Q%R&&Y;p`?Bp2BSW11xpx9$6%s?;`v~JxEV4r(^~Z62$Cq5JS#L;k zUFr=yh);C~ow3%_0ZN8t)^3{AO?}$wN@(bsRW6C{(_Zyz@%|qm>VE*Pbk4`vT$`^V z%I3eaw7Lo%^_KRwhjj_~KM;-H+BcDcbYX-T7q|+yw(2-J!9FLiFd)N$rXXUmz31V~ zXTUmH<*N)OFt_~!KOLZ}$BY>a~bWKsza2^=Y`v|zS10^pY^5ZaAd(*;iid;DwQQgNR zxuxTyv4yKcy{^juC4u=xSCCxkz{8v3l&sJ=AXV^Ho}9<*OP7WP zivHpz^S^p(SKP|F6}+l{8rcP`Z1 zH<;7ZeJpzn?QVp)x^HbWKRl1ie)Z&1GH$tuFYQ~YhU71;_f`a?R4u3qp@@n`6ZoMA zzQjp@W42qY5n;#aKIJGv=z_DNsz-+V1l^INAJhv*Nbg}|9bY9^i@UFsW@AG7Vj;3E zSpR7F5urrDe2m=6cNCp}_*0_r<1Z~-5a)sHmNaN5VkBy&^<XO;aF zu9nV`+SO{eP(i?hH{JDB^i*{Vv{gy1A(n40H>_zW-W`&!H3Dd(O$7h)p8y0pFaw)z zb?7b9B~yf%3jeT1;XLnZ-{o^~>oaQV!#l$e@<`6k8lAPHbb3W%7Q{v;$94kr891}Ur zVNwn`<PZXwhV~y}h3OB)I4<1-Ijp1xZ0cS1))~X_e_qL#;*Q!1Jh#$!ZQfFi#|RarW<*?v zI!|{4RE!GCMnq4Dh1VCsKa{xjBpgE6JF(w(9C!Wkd4Sz3Vef4{i}BCnAIwg-N{)R+ z?FOqcUw0K#1jpEN+J!gjDHf@_;@63MCW7BzLI&5IO^d@El+QTsV&85GZlz6w9!$Kt zfqz86GPH*sXoV3J-X+^FPdiO9B?d^V=zQ0vkztib*&pbSK9dV~pCDQl9!=RtC%8=Pgjyp@0R~gnh%|_87 zZC&+N(qbG}5db=GS1gd*=plgEkJrn8+7Gi7o(N3_md*rAey<=}&d0TiXKj=W)t40b zz(HEV#j|ga*P&idbs)V)Ms0^8zK&Yk4+@aUl5s=G4K0BX7uOHGowid$mTge%%|zX0 z84oj-ucP{|b#a%4=Fn47i6nX#HxBbzoL?$iNPsKA6=*c#=d=ZcE+M#&(u#`1%jl1+ z=-3$G5*9-bMim2%UWm}=9EO5hQ9Q}z2fmJM4Y3Q|qc z4}~b&JqLINSjU7U^X~fzY{eDU&$?2eQ=9@1l5e!J025n;*`4qUJikF=>IkxD-l z=ws^z1F>VUU7AW@dLpIi!4y2SW2i9=D+QjSg0BZuh(u(Dpl6BqUWA0=qFTCv(FuqO z!Yax>A)nKPM>fre6A&T`lZp@y7fCJ)i^RJw`pax^o2oSxwTd{3TYL1kyfb1#wXnJ6 z-?^}@oKm9a%X9_4^8J5B&_Adyn8MNJi;niNNlr6O&$Y7bnStXivD;T8QjmMyJkR^% z-<0)Q^nKXw#1*lnI?v&${@9#HiCW7O|8@=%y5qZDOR#%k{{vhmX(czm|9J3W`J|Zh z^*7Zb><2@UlupO3uSqXuP&d70YdpRYyU0g2ovCd4%F)pB1uwsJHUoaap~2Vn(T^KF z25W`B{k5zUv)kcYGxjE*1tR7L&P8~ntjv9O^>+B7NRpNO74_r$hyMYB)8606{wl9Z2TgH(?&uli<_Rc=cX|Y>yJ3h6%iQWurO*oBDHJ2|8L+aCt_;xrW z=0vxzk|D_Oq(7JZn?|GiPwy&yCU0Skn4z0)V;OGxjAo`syvpmhVecjf**F$L^# z&%9QK0)kO!Of7s$#wH)J6CMZkXPu+)j;;04s)>HU=U^?CBU)b>gDn7LF&^O+cj=(! zdup}xk2hPyvQHhZ#x0dQca;B3X@t)!Du??;n0Jl)h^e2d_dvUGcQ#<#|8<($5uBiSv@f!*5fUgWz@F=I)jhoifd zR0AgI+OqI42Q`pC4_+o-A~)SDrwmv^N3@^Xfhg=tgA+i6$n%T&{9mp7S}8ITW-=eF z^EqY{byZ;c7Ohf66MDh?j{HHv_G3W}aD94uG7-OFbgpEg!YH=|Uy~?Ki6SuL@^vA~ zCg8`E4_^whK!4F6=eZSGb~sAwXN%gir0e;jTkIsd8$N8_sfanrPF6q9HdISP>q=2) zI2n+O?1?p{{KK@~WFg|8OOHOKwS3YkjXvf#@C%Jp^r(;wGs+wXSjS)cIDfibd>`$5 zR)Uaf0Gf^#0iWw_8l%E~%$P@>yQhIJOyxF65;FJHI&;7Y)Ss}$PdadHSAd*)hLg0E zum5+Yt^{0)pQfCC8LUd6IB)~H*YmCI6w;nZ>#mh$^>>9EsQm|#7-dFqNAsuTxM{+} zi}!7Ddl1CqM?fa-ol3W(qFWEc6-L!MJ0gUIOvItxz;KD3SxJswF!^Zs6c=_ zKCS6fc0x>e5f5)S4K@vau*o-6Vy_Q!dZ{a%yC!-BSim&=^D0KA!T32#r`!gpK0v9~ z^RAg54eo;QW=`u@NRgid2+2S!SFi~W9N8T8$>s?~Tpf^_2IQ*1zm>G(@7`|qa|5zxpV*?Kx zoi2A;lgLDC6T)^w+*Ir?tczv}PNl|6ceX{n)MXUIc-+jY?h! zvUiPnQ8XQBO{-UUY!!*Ar8S<7=d1kr`%EuaMV9erAsdddM!;%77Sr9+%H~tFkPWv@ zp|1jA1~-bWLwsR@G$7^`$&F!P z(J?J)H%7rSJ!swZc)%S)jz4CrctBBwaI=(1w*Fl_cST`1&dPjPS{H^NS=2h`P^{Gu zqivm(ca&%Klo%kITb&9-(0O944K7zFsKH^uWz7a58yf7GBrGYTO0jJSeHnB5Tv}Fd zSqYbNvC);6*kE2iZYRQuAEDCXISiN(F#GtPg1yLen%{ZPbF1lop@yR8mIE?BT;aliT8XoF2|i8{DhQx`QuBIXp+l~U*F9;Ri2Fta{9LX zmUWo*j$iJLuUp$g$o3z|HvckxKj(Y0I?8g}8kAg)d$W>*Ph^-zHk8ThiQ*A8|?}!kh!&KG(dDV5XEaJ7d4wU61Q@(PO1veN>}L+Ay#^ z(X{k-35$IBN~Buv;;*;D7@2iEKQGOP3pQENnp9+UCFzQbf%;IV37f#p)>%yki;f-P z4OVy}MF`Pi0NX)7V%rcj_(>J?K-r0qyN~E;*s(8SIsSn^@?muGTNr#w)4!;kIH7|F z#4on)`$0e_IZ7x_v1e!H{PVbwOan^LY>+*{Bk7j-aWJLTs zSzX7_2bnS`L7mcf?6926XN=A6=}f2dRLK>c?fnCB~&q-UPX503|6jEbrG zl7CN*Y-$fu#Ei1=DX(Xw@ndan5byL0$FXz^}BL? z!SqhJgaOEgqe%g+;?}d3Eo}G4&mbQs%s@}=pL$Wa8h};_1Qq$1S4bA)aXB^uY+c%j z(jYjE4piGHj}Q;BNDK0tOca9@{LwBp07cn5S?6D$D2oH&M5+|A()g*n-1tM{i!Na5 zmkfo55NLJFB7G{V<&G&Fj@|LXe@96@Y`biv#sAr_y*r>z63Ff*XC z9xI~`Z}tY1KIv%<#`V{p(%It*Xv%g%CTUw8__HZkY1Ah*iCXiUR>RY2Jx;<6j2hFr zk3;u%A1E2&H*s(DuZ<>WzJLzYks1n(-|Rk6o6Eni8UGh(lv95`a@L0G#21X3UXRmt z;3HIe0vGS+rtd;)H*NckdUOV@8`hLqfQm03=8GnK|5^WOG^}9oUAXF*r-yp%HR3bv zC&%=v$?EglBD&N0%#t&z2dx9an%DgJlpl;UU;5Yh!YRVj@>YuM!>Duri$U9$AAg}J zjLA>Wn~`=KTa5LosfV?Nx5LD*@qJMQ1+5=h7!cnyCgzJZ6rOW2Y%+iK>yh*Uo}<#4 zXyX3TS3pi;il=bA_q>W+N%)GMRRU;uEhmvtOY7z$slQtv(pAM>QPm*sD?cDSEQqB! zZTV%u4C6AaiH=*$@lDal_Tajov^VjC9_EknlcZy!Ic@nt;lo1X=ZDm@H|wg?i%FMG zNA3>RwRT+r&K{h~f(%+6XTb*dfBPpESlMre*Jtm?u>?hzpJ^Mk?2O4#*_idN8_6OKG{SATR;@B3K`pZjN=g!?qXfac)H=dMsV*-&M+I&0 zj~JD>!{F_h(q7ssOx&PeRz$mK5^lT-Z~z-c1BLn&?su~1AJ5&9XoS5CyH2ZGxybhu z%pJ{8vC}QEPENl@Iskh=?K3x|>TLgI&)GQX8iJhI=pA(?Xkb{D!0^XkO0l}wIOcBI z!#my+ZKvQ7E+~Xd)E?Vh8xseo0`;oO;3Ykh*~h1JF55P-)c=!nh-6dfcdYC9-onnt zPAFF>i~iRZ7{iYnmYaT*Wc7FtV3kyuRw;Mqn&VPw{pHxAg71W#eXuc8>wa(B_XjzG z7k|KiwvPHu3%M@R`hs&DCPHE+Ic+0tVzUpprl&ycHKUwVLlryEFsw?O`UEp$-|^4l z#LF;-X_jplgK=ml`|q%4V3r18khIjD2vMM^1@VfsX~ogYW56uFaXDC@7k+x3oy88K zviDaKT~XG=eIQs%WdZ0Z70@~ z9!~%J%K1Y2(%z#z@?Xvu*G{QUa8`UXDZOg=uTyi+GcVE`ow;^n5J{~(yHZaatl=rT zL^-+`fc|#j6}od?^;VSIo}15c{f*!Mn7fQU`?#Q!BzC5s$yxI55Yz1Tt+#o=;>PR- z_R>aWarr4EV(95vyVkRd<$hK9V#6^4YQ!|%4W?rQ?v5!$23;YqsXUkMSc_9tu^N|$ z`Wr986z+e;3dmEyLF+N>{shJS@f&+R?IlwH#<9RZo!$D~br%!H2MATnOuMzYu+Ub1 z1S*w7;}c@{T)HE^R)GGqx~YIqxwO#~f`H0OOpL2NIR& zIC_nh5%qfysDXADvkOGX19{M`?N<^P0rPbw1lv|@F=U2o5Q0z6p5#I+NpagK?{egr zf5m|4*o$nCH`8fIG?OprUi*mhz+{j-MN2k6&F*XxP%U!YNIXLEod`1K(k2=)!%k~k zAP<3O^ZzK1xl5KU_7<8#;MdY|Xha?e2gh8SPDH>Xf(abQxd%Xsb%fuRe<>Zpb<2-* zd74X{Y7N*DW{;dMu}|F`v|THDYC80?P4_s02TkG$M_G&iY!$8qGn@j@)4i0Yh&ZbR zMH29FwmIR()D#%YXjl}}8t)yWaQ_V<4gxj(r`ZK{h(NIicO1&`cp}BJm;Fp=V)^3m zo~}BcY9B8HY()ZxjCywgf9nQ%kwrb~d!Xq|y*DS~$8bp3EwknIZB*f1wFEzFzuLtZ zw9I<1^{y2OuQ)K`Piw7$TTMIzR5PyQi&t!A@nqYiJa9lcRZQ#a6h7E> z_itZ9`^d1XngaO}saDCEE%b&(s1b)f+%qZHej0YkNMFS(I?p;-`C1St^$G1s(+p3( zsQ%_{)FKHk9aS~$k3fa?Ey_|a&yLnlj51>zMhYHox7IgRh*}Rt)>zqQIx(^~f(ZLO zZ|vCdNy+c~ND}atb1@aQt4-ir*-Y}S+G=Lx67af0B(?}-`-cHyz!1K=+&z@_hK4< zMiYrR<2RYTGw1{kEXxBBL4B&8kj*86J0m}2IIJ0P69o=PTy+fFmd+_NhSiz$n1Z9x;(=$5v);Uz|pTA)i9J(|-} z8P+}(UAyi0`CpcY2k>tAEOv?|ymKKtyp#e=g9(x<2__$<#TG*n(_Iu!)_*eubzeL>k8*%7t# z<%Ng93WDtizYfEC2qlyx?DoZC?UvC)Q!^J}eP2Y%sl!I^)}OR4&x%AgKmkqy|$B9H%0 z#7z|Dvz8MbmYh4uj#fK!M!2H`WJavhCICHYzKVgA5jqquk-Wn<4tLx_^!%7`0Pwxw z)$l4$N-qPhbIl~@9^tWa?8IwuF#de0MKK*yqAuyl5pb^Of^T8ODttRm20dwS1FFHP zGgP?^6f2@lovfHb75~Av3JdxrCa1t!b_Zh83fNie-9T>$4!YSb(FrR9nEEjl-N8FyfQClfze$=$$+A4aG% zatO(}Nf`%l+>;-(}mSI0PcD+(mha|3nDoYxA{#Kc#*4xE|nG zOB*B!?gMV*njvT0**V|-Y#+X4tyGFodWO{jiUHytR%1t40Z*^utko!G+JWMQKw3lw>L` z@9bvbiOgu~v-=oN@{a1IeW)b2(C%RGFgdS(?u)e^8e523!-SWF-$!jnbv%fl-z6VY z{@^}?_sfSbj)Bi6S9E=_*Efg?d15SHbsIuu!SOXkb(; zx15Cxn)AU_D8gWoM;dm{g2Fk$wk5^_FrJ(fksx6PcEb8GzA!9Dn~L9i#tpBi#pLi? zEf5%zGXT;wcd6jL_5y7gdc-P%IqAg-IJcH9r1{wjSq6f(>l1K*llxlswY%G=uB|l`CMc{J5=P*&gbYxf@5>Vk39Cz3`D)qBWlQF9E#W6*)8?b}(_O;>r}` zfzc+QK+N)bJ{Q-nk(eZdJ1JYt!j$TQWC4*31Ks7(jCupmItM}7Z#J31$xGyWYuaxZ zM>OsQ5i9f}`UHdh>A^Fic)ieGHL2{Mfc?qiNy)28f<{N65emP1wXbP#VYrM`9Z3qFE(6uTp5tWXo`(bS3TcS=WI3i5cH~u!4d9(Dp`) z2Wv($jReyw>NUeIy;lY?Q^6*DlerQVbZ}<|$(}DHNGi7uA~2=ALF}OwK8)etq6ZJ; z@7sTqE9$xUcyaAGgY2ldB?u{-sAuehameSP^2m+!aWHp(ntznM zfwHnge$(ihKzL%XgtQ5|)haVd5vdIP67+VSY;y~H2=`z?Ti=-_5S*9-$$&l52~xew zx3n>6MOB?@p`nL#Vqrc(&SJpj{U}u-kI6mSg#sW z9-iUom~h{Uvid}g?Gy^*j;j>cZHNu&nMEg)qYCPIy)f+gb{V-md=IRGom%V;=8pOs zs5+fi+>f(L5}A4D+^XIo+k+@_+2l<%Q~1>6>7R+{)vtiq=!dXcLwm8U4R9sm*fKWO|Yj>UMxcv7|_0}ze0Qtkf7C{H&4$5{2VIv#Nmvqg|pYP zV(YfD)t`l7q5|>J#jGc=`pON}QGu0Rtj!7sPiOmtLnd;zQb?!X>|R`#_2n?uloY^b zP2?VR!px6HZ206;RNEDBIBZ`t&TH5A77;%^L%o_L85UWf;+BspT%+t8m)iO@$k5&I zW@x-b>@N9e{l56ecwb+C8m|q3)9L#QEHq+1`jfhDNCsvDn@0aVoLd0 zgRtj~C)OCAN))51DH2r)l80++MuM>~PhnDrXgwfn&J5$(pYpVRVEH3=g}-)zqj$7` z#k*me`uvyO%7CSO`x-F+gcxD@JB&xR3V& zmi#`$2W=p(p^JTW^FzjU8OER8XHqQ?3AcTGvX*G&Px=rYp}Yz{BVH62e_;P z==xn`DkM^q0o&A58@*?o-tKiQCU{E$tiRaGo&g9&z~)85fThAj6i1;)XytFvkB{Ha zSsP2!zaGBsb|ro27rb$J^%;3ZboplTK;GEYvm$<)_J!LW9X8R=`%mtDbh*x7H-Oib zjQ;V;R;BX5C0o?Y5aE%*)93xQh1nHVmmi;xMNIKNv&axGG*#5k z$@-e0`H()#;-1P=esP|QLV<*ej4~Q;?02qHMy>q*F?NBpBsW+G1w^#a!U8OM{fX~S zRKEE-s-Ydy$`hVdP4~I;>uG2HwL?r7qJv+EUz#9EG-(zCRcuVmuKCW@{?uLia%&%C zC-{YZxz!ez2)uVn2oM|?=gUz`8D%TE0x1e=;Ct7q|7bRm93|+zx=bk+sGcXehWeBV z+_l#WYzH7-oQ{T|Rsiutu+NSo&%QYq_Z3k@<>h1;hnCD2rma-);0BE4?!jfDk5{xh zIGe@bjQPYg5(AJj9v7JUgGxOVm)(^RgVWqsGP%SyAm_3%{S59#zFoto46RCvA$)4l z^*w|?2J~LpXH7lvlops)39r%P=+)I<1m;BCfsAq}Kuf6oA+`?EIr+M*DPb=6(}smr z;>r&4zrb2mX?GKNs$+Csyc0EMl=KsGTakO5mAvvLJ3z`Y(Nb>dLkJqPDAW2?)%`vJ_FQhh5^HwGy;z3UQ~(gvaK&2_S6BFjtXOYrekBk^FTFT5 zHg_AW6{)>q#1VXfe5}L9u{>`g6QaX&BLhg9fCy$cv1+m)vr^dRleqJsUHsS%U$Ox- zqw`YD^hR18iK*2aBm5DpKY7tQvpX1>$kC8#A4ub58ZOczh`v{g$-iHd6^-oO_Yx56us)$ZDNs4TK7e_~bp0M(N zviYX*_^L=YX+>G_l@{NA(Qo#U?>*h+EySQ6X#K`C`}I4SFbi zb{DBHK5$?VzJ$^$kNBt0j^8;bxE#ErzvqX=#}u!#1k>55anli0U}wXAUIP0}ajz+o zUrmZM$DAOCz}6DM1h@Ps70@^i&wie?=Xp~xd7jF(J>g6rVGnFUX;6msY$km~+sVT~F4Uz4R3qYvl%#2dBhm~1V+m3j`TSC$rQDILrlVfSqT*jtz;PaOf zB1F7Qc}$_tU@`THr$58c?lMZm2&m$sz%olmH8m95DGxPP!Bp5As@#xinq9TSqN>)U zc+WM%SYc3YDYOK#gfvb^Afa$fSg&*fz)H`t&PzQ9LzTEuzae%xPGOA&s5BzJh4Ao5 zN8`&YVLhHq56@oBCn7V`CjYhEd%+GjT+3acLtYT;`0K0;SawQd=t9p4yVQfuQU zV1V(^j`|o?F&;#`v`%oqb19Fl%WUyoZBge}o&Q8?nQJ+#S{#T_;#mk&AtM()MeR0Q z%45sWs0)|?Grt7QSQLp}W&X?{{d{}lafE!u*%! z^T^a+ty5oTeVUwW8dPa}-Xb2}N6`x(HHwf&GKQ87ecq!@oj&nLPxn$}FUHwK(O%ZP zEJp68ueYTRxj42*u;tb^;h;hO>gKE7x>E~L){(nQ1F6qFV`&5bG+q~N;MUAozGep4+;d-(HQxX%8WzOH}mOV${Q&2B37q%vdK%OAZu{vnd1?+l<4mtD8Xb$z~! zf1>Zt{_uMCsA%?UHE!O@vLVY<9-m8>=ip`W^BM`4PJu4>;4L0ge5}D~SAgHsJVhvt zNdW!Z=z5p!2@E(iCC8UN=XDN_9rE+PhyYk8ARmu2B<&bARRMQ~ zqVCEl@B-7ZhWz?~Xqn|=BmVU~cL{>ErLbd<-<8-kP$e%M({*;sf1EwPh<#}RDg=D- zu(ukW2#itc8gqK_jS*7P?#In9KD=wE+scvDerGs{{6(UP1$CxQ$tVJNjU=KIGj2nD zKhwCAtZX9Gx@e^Ht^DUl)F<75TF`H&uU;9C*UrFH(!-o9U3q(>WB1jcV8GFJA#PmN zkyZv2SfXMrB%8%I0<@bOx^kuGD_d5fp;Wo%nMbg|JPBBW-Nk&iK#YnB za_E*`F3InjX6N|g|KfpY89Uf&A zIYpaEq-?N2zUXX}5DD1jehYcjNMcf&idXFVcNzj6k2xl#nahB%ny^7<*ef9KXLO%* zbck$0G^zEiI>7vAf%E+2Rf#CHMBKE1l-8%=dJ|G50&ny9iItLpZFxkvC+J~p*=Y7B z-0Feoa{y}3f~u5ejc%AIQJ=mar4LY!?Fa8Se(YF0cj8!skhsy=XQ@!%rOn6SH?HJU z_@h&gs+MRL;NqTh<7jG%exu|J4OIrdpMG-V5$+_%s5SS3Gj!~;tL^Ahc(n^%>pu-U z%hs1zPot#F0PTu$y9DKktY3lcR44FKH%%@Y^WmLf*BrHOi8y575hz%Xo?@1Y_VdK` ztY;2Cto9fC0l~(#iuMriYc3j=&VHt=xSm%bp-M(G4a(c09m2v>CKBc=z^7wtMP-N; zs$Q|&Uq7R0?t!wv34PWpt-10&w;x>e zB1@xW6Dk*6%G4n}#ow9Yio28HKuDjg&I$uvfZ86tLEeh5Xk zcgSU2nTqxY+QSuYIZ@HVQ`Al#Gue&ak|Mm0zEP@ zp8Rqt%0z%0=WW-ue0}0j$?e;(-)EFQ?OWW~EKZ1Wu-+DnUa-6B`Ap{5?9y##i<`{Q zgwU2>B~AnJkIFqeU-q58sopy_UjEOSP)VEr0oFR^{_(8a))_c#F}vY{E3MD-%b3F) z_394gIKvK<>D#xqXMg?sk-ZDLns}NTE_nCG|90_e`iM=uX<%wO?{W39aeQ>t)r{er zG7q24g{#y*I<0}#C+B!pQTd<678UmWdh0Y0=zFFd%6npMptk5t8anOo?H9^kIRDFm|gRWh07`? z-s-0mmq?bvDW`PpwU)uoCxN8g>7Py{%DRsWPAP@Wimv`akKfn_En3$|gbu~{I&uZgu}nsReCp#`WzUG<6~d zi_Zus_F~#{oViq0ET9HKjnL15$I!8iw%^*yu_$PR1k$gZ5zBtJ?>JLOnUnhYNSPlo zi&|h5-yjGopO4_)iD0sE?y2ae2^}!4@U>3Eu6_MV zqZ$}L_geJt719ZJGBFlzGj;YFx`e8;k2KeS!-h!o4u%0R4P6B`0knn|B&t0FBr3@n zELJnY+&H9F@dHFIz&YJR=ksf!KCsVl-5`(5hFCIj;DKcuK#l1uFN>f+ska0I?&t%D zgH49prFK99xI6My0Kq@vLm}2mD2|ecjjdL@zDfC-1$prE<}mI*+JcyO&-2y)C}tgJ zwsOrtg4&UA>6|I5dbh?>10Rr6UVx|yz|z}y4bM#jiDj3X(gMY4u=ux%;q^upSulPb z{j&2*m7B3I0MTs1=M>j1uzFCRI~|j+UC;o|eEpOvitAQ;#<{`nVo?Nc?C{rl_dg6` zvQOH@#zXQ}qQRsNEYthNP`$O@H6WJbn~mC|wX=t8e~FFE{9drol%Mx%kJcN1CcgrY z5p+@bA>1Q@b>>;T+EK>!DX^VxG4BdbLh-O$&neIBK(K@|p8LUsF7@Qo^qrOKp$BQ5 z(q&O%N1|6muHV3_!UvhdRa%gx%3xHueAk^H1*3HIWP`S@W{7&z(#4)6;yNILPq=|5 zg5_mNCvpWY8al_%lWylv;N0r?Abf`xZJy>g*9fr;V(AER0U}&LA zJzWYK^mt9u{+8o(zT{S98M)YMAOi&~!&Prv#VpSR`2D<}E;|@9**4TF4N%|;Vn)&&v@5Pa& z7qh$Rw=lXFr_$?*z5Y^;!fB%nViXKwzKVNG z7}BdzfV_&+sQH88HlUu4+s$$@Y~OK+S1F={>KQX3PFcBWB<+JDD z{CQjXvZxYKGhodOf)U#? z1Xd`FoVSF3Eav#QnIle4MkRoj<20T_YvLJ(&LikhcJUaxhLcU~M@vL3wm~b#ECTH-9~3>-@l&CHX}x6*?c3^}B;XIufslPTE-wr2t7w_=!gTDyAH zbbu-br+AgMdXQNZSWS^4`&={KgIChd%spYeq3Qt0$;C2L@+@(JN~R-0iK9FZ&_*$^ zfmO93Dq6Wy&4NAvn;399NeqMB71hhVP?d30-uRUx2Q4?#oVrdCIZzXmI8RTv_PTh% zi;$?XrH>Yp%9F582->Yj8_41v7TqPHD2f`ewC5}shfRt6LjX)fNAM&2)g&A+Fckup zE;jQSt^@=tgoJKmD%Vx<{Pya;$B(zZ6yt1orv_h7Uj1Bpw*RDR3v)Z1uwm~&@|b;@ zy60OQaNqg8Jy)b;Mc#!+09SACY~i$w@ePH1n3 z{r2An`sciTXM!6;-^8!q93~5cvy>-wcoAAqLPq!3=7UM{-h~|8%+FeE4jJ6G!cL+C zVdOxl`-VU~YM5V3WG6zvuWUtBf<__+;&LM?g?q9Dth87tTuo*-6F(#50851SWFYIKLCw#DyHoKxeybLR8u@x!If;c9$|%w++D{L zig30QwVMDk=bcEZiJJmtF^8eN+dvt?%w7qqVAiDyyv`(#bKxHFo{|V4M;isYM_H%D zAK|Bq0W*WH5eBWgJ3BpN>lhPp-CP4W%s+ke`1f= zcCtrogIf(qmpAh4&uG-oJo~uh-rO6v6Bh&cVr5wYaZw3lHq{kxy{-TF?WS9JXTUa@ zoYD>69)}6zJY&4y_wdf}T%{c}ZeOte?OZeO!$-^Bz?dj^|{M>TumlCKW7 z)xBS>dA+p!tYzK!6+B*?LGa4b#k%m2uab*fhtX`)Lx%8i8`G%_Xk9lnHXW>+cJ%xP zG*h|N4#!Zh?R5sBtM&O-GfGG7B+W&d~v?>cbIb1rqWGLbbwx)6NC3wxk74L z@?W8fl5%s2^>#{w6l7foM*YCI>@I0-aJ4R-q&B;e45U8tDhyA&AoaKD{o=N&&EmgZ z6>k5Ob9G@sq(eSI;=p-1@R(p^ZbSAhHX1jhlTeIt}ENG8kYVC5ID-Z zRlyWe;xEBQxCJ~q{Ab~Y^DFs+o+X^KasTXU?=6KdwN3w?!M(L<=>Ch?FEUHgjQjTO zvHeHqx#seJzI^dbUGRdWyupr~(C2J~m;!^QJm|u|ow6^W)&Hf9ea~c<+R4h z?sUZKy0Yxt^XyCVQKI3AN&N@%>+?@t?BciGZ=W#OlX~l&$!8y`Yh9NJz4*b{D#9Z5 zzGQgVtE;zXLQbiU9&r5Jfg>Xstu zk~kSls~5vTJLu;OVEtyw`(UgM9ia)~4(9PX;AtCywug0jMG7hwPTvpf&972|_IWhC z3nS0_l98Sop1Yjy@0Ka9ha~z`ZFk3cx=1eHa0=+&S0RN|70xNyIg^{3Ulx!F`_cUXS&8!A0j?1m$3iDPbH9hM$ z$VJZ1B;7(ga@b85ZuMoqC~{y(Kz)y6V#_UZQ^)+Z?gofH$DTf@VJ+P_Xm0v*jeAtp|!k)_`|6${jc+fB_asHR;2k zFdR?$t-_7%3rA-RZGWsb{|{hiH2=1+_V>zpY`Nr->eM0MkN+6_Z~GLsFITAVhHS(? zy-NPRRHTC;b?u>brgT0E-*{{~zhoRjZZWoQcIYLmG<|tazm?ye&x2+CB_Xgi<=!qY znn*TLJ2&EuvDLlvs&g(5!Q8LUOTG4`@b6(+j-kCeY%OBtyYS+EJSARn%okkg&KYiP zfcmy)z$*mz$0|QYM!!LnDVF4GFBS(?sAn}X&QT?%;y_)}(vmCQ5BQ6l5ATS!l&Jp! zSD65x;%*LTJ`1~0Hy8X;L-VUEYi0sT10saqC{z`mSLqI4anty~ULWe+f_YVz+uqOy zH8j_ZU)X77NTyhxil-Twpp0k;SlTLK=u5;;d3gF)%EMim8ypJ^AMWI8d2oI6Ydx8=@cV6M1l1_0AxJTSb*PM)JYe&V|e5B z5TOHrZIQw|9LN5d^k5hq+A40%NAAhcRoj8OZjx|8ZBqH3ndY<@cR(~s#GoKbB8Clf z3FqbG&|2i1&^55-k!En)TZ9^LGOzH`yT#Rsz!-LWP6myzf1RyiS_AN6RAPOw%41); z!PQM9tbMRv?1EFcO880GZI3e2OY$F-#<7K{i(4VzhrRYK`bMw!jiu(D)m8ex&%!%b zRtEn2#dElN`Wmj&zFtc- z7O-`yt5U1|w+y`p^|-6@?1!>qg77d`8zl(G13;FYmn&0C1a09;=*d;*4qevv4C`yEe^vtzV^}ikgze;pcS{j{#Ef+B(%GR@fy-(rn)y?< zoaWIGR*-!fe)I!ctcTIe3Z07!Rijgo*UMhPa?g$zWFiY(FHkc~to96NQ(geVDRnoK z-&?|;wjUVH?AH1uZT7N!Yo>GEU+!aySV-<`*={n&w{M6vF9zlTy!Q`F!bJwV`YaYLYGOc2qGF%XSYGaZ zjL;TXL+S6}2Mvy$Hbbv?IAHgnx_w?8?$Ll_0PF002|`3E1qGzZ_FMA6S#P};95{jML|~92s^txWGF%eAVkz1C zmZ3}lgUuGZKE^42J=M-67^N-+loL={yCEEhltb}*rD-j&%{)g7nSr*V1h)5_8Ji#`x?^4oZQMh{-Rz z*z1dKI>ivyM$w^$W31`Mx+jE7KP`FOyqwo=`3X#F#=@gDxO+WgOI|*)?fJur*h1tz)tOE!4U3;f-qCZlEV!XNK5aOgK`g9!;F$lPDs6HjE^Q9PS9NShjP(bL{ZfLtB)pn;i86Cw{@$ z<5JNH@)RC_nH(L&P!7K^FJyK*aF`B&vr=V41qIQ7NobJ-WXDuJ?OniF6?Iw~5LU?{ z8_)hoQN)Rzysf*O&f+I?R+EG>pGTUa-DAlEB#aj{_uHx{u{sGau*wSK1w6~=&R!vf z%oELkSn08K@qa(KbrJHDQ zZUTQEw zzSnT|g%K`mF&YuhKKTln!<1`5%+|Jth<6le6U1r>XMZ$Rx;`~Gwp)!;8>oy`CJ$kf z&N!O+Q7>5PZszDq?0<4BXGtVdC^av z#N?Rkr6F0NiI(HnWQlBXx`Pwghio_y`3f4IZ|zwFt>g$uO(YB)?mvjTZS%Q?MF$lb zi)?Im@?edEkV%g4_S17%VSzh5jZF{p_}*p~;y`XHYXZ;Pgkkd*oEUsH|1YrDf^s3R zd{ax^Zg7!qs3r-+7wpx=l49buCRUloxIsQPu>%Q@tp4H`RJ~%Py3W379k?&=!?~=R zFt|s(W}ac{lHcTmJtx(H!=z`FS03B~m9X%|aLSGj1abK5-i8!SKTVNP+5!p8Ywa59lDdG_=P=LHyrwo z)+V%EI7fTc!x9^kLU}CKs)9TBo%)dq7P5~6dq?GHU+Mvn$^e0e4{mw{);kKK(M zzxy;ixjjbLPi5r#4vtIY^aRYBprd%bDCS}7o|73!oNn$Y)aarrr0X1VY<$D`mh-yw z4;!Ze@_-*1geS5HrILkptfi_aG|qg}iM(v_uM3tsWN9aJbT(7E*i=) zs;*_hevo{Jx$6=K!Pdz1UNg0JED<}KQUG}}(M_;a_Ci?l;PP|)TaI#x+8cXVY{U^t z!h^(?6N!C4)mo2!jI&LO_=YZ~B;gRkvZ`5lqNRHG=)`Q1ax@(5q6aZ;9uX(K9H^?N zs%G<99zTI6i%AAVPf1F>K^;sBqZMVbPo)+g)sin6G5qV~M$XRLvWt6iS8h-4 zwt2bhdABH_H^tdyO&VM5qdBBp=Waf>8$t1{LG%~EJOs#FveRk-JH+B%73Y5dJ|S?r@ogKkE>*f8#HR-RIf!_`g4^@xS#P6*Xl3Ma7>tmVRk+^c|D zl3>Gm2*@>j5_hGza3X`J1ByV#!IjhCn4mO+w} zf24-Ii61v$5$;O^j-IomR2JOhJO0@(7IO;|(?VnuT#NI%MT6=e@w2)DRsC3Cjtljy z0fRovzuh}^9p_u>9)?Ah|Z@_#TKwnx>}Bd{lNN$zB@VyjOb`Nu4=&D!vA_%^-Q&$2FAZ^HfOfl z#_$20X=6oTLbx-9W^w5rXe|m(AgaYx;t~W&RZWk-&${{$qo^rn3B03ZlqF&kE>GtK zqz=dZk=mAcuZ-h6aD847O3G1wrI&t`-*`t139G({eOtoC0rRCK9q9t|AmX!$pdB}l zqm(XZe|X$hNINp5w~hJbs$t`nJg*z(85VHEx!&S09m;kdUxiz@AGj0wK`TtQn{6H? zvOIt#Kc-*zHS%7Yb{_~3_&ls^1j<-BeU#T5F?iT)gbF8T(<_N)18>H}tLLim{=&K< zAJix>@lXob52Hi_3BmX}8>chNre!#sz>r-oeiZk!7&!ES%VhC1i?{Qs z95o5*QVsQKN5OZ!Z=SYXy;w~Y4B_bL6|Os^H(|u*yD=sKaO!MtWB9pE{*G1Jc zO=B@%F1!kgT0O!%bY@x06QPQ@g&7L3!>*!%?n*klD2f93SC~;)L3yjiU4#vJ1}m{> zZmxf}a(#HXu76~X>E4sW@nksu3v2q}mOI<#K0e;eMf)@3aQ&5ZUZ+(IKI*q+eA}ov z`X#)&p6XN4U!3n zGqA+L{Y~16q2PvBkYpzr^9nCJ#e@=p!6#Mok}!#?!Aj*5W%Hf_FGDuJDler_jo`~y zvGgZa6nW|=MV42hX&(4&9{9&@0kgzm*^yDpA_&a&!nD$!H~m*c(L2mygqeVHFV7l~(=WJPlS{yZKT=!L&2zGcLb6zB zV<;!E7cY>f54Tv@k(Xjpb2XRM^F{0R{DBbUI&j<)zy2n9*&;x4n5mvxJ(V|3Njm>) zM`ZV9fqycoj1rdmDCB2Po;u`cPUCDuIen%maq|u<#Elml^wX}_=5y{c#UK0hTydj7 z-y{D!UH)tXTS%s55x}61P1;)IEU<#$6^j%I@86%O2dHI!Yqb|yfDXgS-@jZLr$fjD$a=3}fU zh%atULBImnWS|Hj_dz#UxBhb*n2ULk(rRNzkbvN+m3^}$VJ#OL(exp~wqjY%2wRI) z-JA_bq;|ix9Ca1xQ3rH6C}ao(v`!W;{8lTel-QC=1)`|$xYZd@Wcp#aM}Zv0s+@}H9(|QzH7fOVC z)NHZ9VC@a{0QyWjZr=+lT+nj3d#gE$(jK6&_3`S#cSmiyqaMJ2gkZi?)j zjOB!-@^2%Hn*3)tqG2Ijk<fVw{^~JKOK<*;4Uz z<%}&pibw#nL)ID4h@VR_-b>L4nKC##On)HD2Nf{i^p_VCPY=O)Ilzy-W*sU`gF(Ym zLwjBD!2Wk^WUdm>h8BZ^Zi4MJ)Y=TLsk_5Zygr*~A2BI=^X${d9?8g1XA4`G9bwY2 zM$jXbCqji$DfcHf9n^&*%v2wq^o#fu6#!yKPN*(!P0=-y9?vqQ)yTNyPaJr7;O^?a zi5-^~#ckk|~Rk+i!1mf;!7`(0d z+U+mB(`t`D-H?J>D=dD=(1eT?xJh{@zwbW$Vr5Hq=h^9PnuT`=PoH!Y-90dI`K7vJ z*p6pGQZv--bEF@jtOp4#hIY3E0&p+6x(;_?%{ByPl}4ve{vDB+g(9pXZ|HG`agtdN z)ikBv08B&5WpB8_WE1zyig!cMyjuIgh%weW=Yr`NzT^$Vth-?qYTj39Ci`Lky_IO!faD6&`!~QLPk=ByyNe`FTu=(0aCc*|9o1{ye2i}sAIHqpCS-qzy0ca6_bmazYU}>)yp1Kydh`! z_SC%{>(~t4V;>V9hh`joMp8bv`1}h(tb?Py<;v%I^_gMWP0lpKP!H}JQuGCc`-+g1 zPjbXnX}o<`(x-(%}Mql3E&wuMsV_EvV>ioHaYy55$5c)L0dHK?EWc35KYv zB+m7JK@L^O9xw@MwugHV43ljh&06O9vCxyle%$(goeKURDPO8G{HaZCeeO3Wa<^{k zV@oyTN;1P^9R!PFu3uZwsY(PF~YUczPo^e=iU=o{x&Y@}}X6y-B_K z^1(BO&i^jy9nG>j?0-n()I_Ou*^|s+Dc8Rt6CH!ao|oi~9n8vkqdh4_%F`Gsy5BJ> zr3~f1Mk7MXYy!~%HIQHIcNE6+QCv}{afYQZtB*1hN}6>cFB>!o){nkMyL3dNA`eP) zFkxBYmB=DF$M#!}{)ZNA{U7%1Eh5v06iIoj*Ym|i8y%8t?1xcwM(nZ1VNMyZ%!Ngw$@d}CmoL8!E zv%4}})FNHj49No9Y3&M?KFEH=b7WRm;JS3qe!^v{wnUZcGe_^Zzy=>6*R9$LU~^hvwXLLFGx?)lkj@f zR}_J2Y^)y(Hia7>TsC7lp5&Kd;bvMpjJBv4c=pJub-)HdxC)jVYf?R^+J!AH!N?h! zyZT4j_~4`VJ<&K-yJE<{!3t{8!|F<=jTJ6VWNUBV87TYaRRrK6kgTxek$1RctKw(- zBLC)eⅅ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 Date: Sat, 30 May 2026 09:10:09 +0200 Subject: [PATCH 5/5] scanner: add adaptive real-image crop/normalize debug pipeline with OpenCV fallback --- Cargo.lock | 189 ++++++++ crates/glyphnet-cli/Cargo.toml | 1 + crates/glyphnet-cli/src/main.rs | 352 +++++++++++++- crates/glyphnet-scanner/Cargo.toml | 2 + crates/glyphnet-scanner/src/candidates.rs | 391 ++++++++++++++- crates/glyphnet-scanner/src/decode_paths.rs | 243 +++++++++- crates/glyphnet-scanner/src/lib.rs | 498 ++++++++++++++++++++ 7 files changed, 1643 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b88747..731716e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -359,6 +359,26 @@ dependencies = [ "half", ] +[[package]] +name = "clang" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c044c781163c001b913cd018fc95a628c50d0d2dfea8bca77dad71edb16e37" +dependencies = [ + "clang-sys", + "libc", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", +] + [[package]] name = "clap" version = "4.6.1" @@ -587,6 +607,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "ed25519" version = "2.2.3" @@ -787,6 +813,12 @@ dependencies = [ "wasip3", ] +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "glyphnet-cli" version = "0.1.0" @@ -795,6 +827,7 @@ dependencies = [ "clap", "ed25519-dalek", "glyphnet-core", + "glyphnet-cv", "glyphnet-decode", "glyphnet-encode", "glyphnet-render", @@ -900,6 +933,7 @@ dependencies = [ "glyphnet-testkit", "image", "js-sys", + "opencv", "rand 0.8.6", "rayon", "thiserror 2.0.18", @@ -1373,6 +1407,39 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +[[package]] +name = "opencv" +version = "0.98.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c607a407be5ff2484f55d2eb289bffd01de84f962779b8470e76f035dd3563d" +dependencies = [ + "cc", + "dunce", + "jobserver", + "libc", + "num-traits", + "opencv-binding-generator", + "pkg-config", + "semver", + "shlex", + "vcpkg", + "windows", +] + +[[package]] +name = "opencv-binding-generator" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833f00c6deee8dd615249af42fa35ff030c5c73ee3c13e44baf1135a4d57af86" +dependencies = [ + "clang", + "clang-sys", + "dunce", + "percent-encoding", + "regex", + "shlex", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -1410,6 +1477,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "pin-project-lite" version = "0.2.17" @@ -1426,6 +1499,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + [[package]] name = "plotters" version = "0.3.7" @@ -2162,6 +2241,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -2331,12 +2416,107 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -2370,6 +2550,15 @@ dependencies = [ "windows_x86_64_msvc", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" diff --git a/crates/glyphnet-cli/Cargo.toml b/crates/glyphnet-cli/Cargo.toml index 0ef7533..68c20c0 100644 --- a/crates/glyphnet-cli/Cargo.toml +++ b/crates/glyphnet-cli/Cargo.toml @@ -17,6 +17,7 @@ path = "src/main.rs" anyhow.workspace = true clap.workspace = true glyphnet-core = { path = "../glyphnet-core", version = "0.1.0" } +glyphnet-cv = { path = "../glyphnet-cv", version = "0.1.0" } glyphnet-decode = { path = "../glyphnet-decode", version = "0.1.0" } glyphnet-encode = { path = "../glyphnet-encode", version = "0.1.0" } glyphnet-render = { path = "../glyphnet-render", version = "0.1.0" } diff --git a/crates/glyphnet-cli/src/main.rs b/crates/glyphnet-cli/src/main.rs index 0471cdd..234f509 100644 --- a/crates/glyphnet-cli/src/main.rs +++ b/crates/glyphnet-cli/src/main.rs @@ -1,14 +1,18 @@ -use std::{fs, path::PathBuf}; +use std::{env, fs, path::PathBuf}; use anyhow::{Context, Result, bail}; use clap::{Parser, Subcommand, ValueEnum}; use glyphnet_core::{ EccLevel, ProfileId, SymbolGeometry, TransmissionMode, profile_catalog, profile_spec, }; +use glyphnet_cv::{VisionProfile, adaptive_threshold, grayscale, warp_perspective_gray}; use glyphnet_decode::RasterDecoder; use glyphnet_encode::{Encoder, EncoderConfig}; use glyphnet_render::{RasterRenderer, RenderOptions, SvgRenderer}; -use glyphnet_scanner::{CameraFrame, Scanner, ScannerConfig, scan_still}; +use glyphnet_scanner::{ + CameraFrame, FailedStillScan, Scanner, ScannerConfig, scan_still_robust, + scan_still_with_diagnostics, +}; mod auth; #[derive(Debug, Parser)] @@ -682,8 +686,30 @@ fn scan( ) -> Result<()> { let image = image::open(&input).with_context(|| format!("failed to open image {}", input.display()))?; + let debug = ScanDebug::from_env(&input); + if let Some(debug) = &debug { + debug.dump_base_steps(&image, mode)?; + } let detached_signature = auth::load_detached_verification_input(detached_auth_file.as_ref())?; - let scanned = scan_still(&image, mode).context("failed to scan image")?; + let scanned = match scan_still_with_diagnostics(&image, mode) { + Ok(scanned) => { + if let Some(debug) = &debug { + debug.dump_success(&image, mode, &scanned)?; + } + scanned + } + Err(failed) => { + if let Some(debug) = &debug { + let _ = debug.dump_failure(&image, mode, &failed); + } + let robust = scan_still_robust(&image, mode) + .map_err(|_| anyhow::anyhow!("failed to scan image: {}", failed.error))?; + if let Some(debug) = &debug { + debug.dump_robust_success(&image, mode, &robust)?; + } + robust + } + }; let crop = scanned.crop.map(|region| { serde_json::json!({ "x": region.x, @@ -744,6 +770,326 @@ fn scan( Ok(()) } +struct ScanDebug { + enabled: bool, + dir: PathBuf, +} + +impl ScanDebug { + fn from_env(input: &std::path::Path) -> Option { + if env::var_os("GLYPHNET_SCAN_DEBUG").is_none() { + return None; + } + let input_stem = input + .file_stem() + .and_then(|value| value.to_str()) + .unwrap_or("scan"); + let dir = env::var_os("GLYPHNET_SCAN_DEBUG_DIR") + .map(PathBuf::from) + .unwrap_or_else(|| PathBuf::from("target").join("scan-debug")) + .join(input_stem); + Some(Self { enabled: true, dir }) + } + + fn dump_base_steps(&self, image: &image::DynamicImage, mode: TransmissionMode) -> Result<()> { + if !self.enabled { + return Ok(()); + } + fs::create_dir_all(&self.dir) + .with_context(|| format!("failed to create debug directory {}", self.dir.display()))?; + image + .save(self.dir.join("00-input.png")) + .context("failed to save debug input image")?; + let gray = grayscale(image).context("failed to compute debug grayscale image")?; + gray.save(self.dir.join("01-gray.png")) + .context("failed to save debug grayscale image")?; + let profile = VisionProfile::for_mode(mode); + let binary = adaptive_threshold(&gray, profile.threshold_radius, profile.threshold_bias) + .context("failed to compute debug binary image")?; + binary + .save(self.dir.join("02-binary.png")) + .context("failed to save debug binary image")?; + self.write_binary_text(&binary)?; + self.write_binary_grid_image(&binary)?; + Ok(()) + } + + fn dump_success( + &self, + image: &image::DynamicImage, + mode: TransmissionMode, + scanned: &glyphnet_scanner::StillScanResult, + ) -> Result<()> { + self.dump_attempt_regions(image, mode, &scanned.attempts)?; + self.write_decoded_matrix_artifacts(&scanned.decoded.decoded.matrix)?; + if let Some(crop) = scanned.crop { + let cropped = + image::imageops::crop_imm(image, crop.x, crop.y, crop.width, crop.height).to_image(); + cropped + .save(self.dir.join("03-crop-hit.png")) + .context("failed to save debug crop hit image")?; + } + if let (Some(quad), Some((width, height))) = (scanned.quad, scanned.warp_size) { + let gray = grayscale(image).context("failed to compute gray for debug warp")?; + let warped = warp_perspective_gray(&gray, quad, width, height) + .context("failed to compute debug warp image")?; + warped + .save(self.dir.join("04-quad-warp.png")) + .context("failed to save debug warp image")?; + } + let telemetry = scanned.telemetry(); + let payload = serde_json::json!({ + "ok": true, + "mode": mode.to_string(), + "auto": { + "module_px": scanned.decoded.info.module_px, + "quiet_zone_modules": scanned.decoded.info.quiet_zone_modules, + "threshold": scanned.decoded.info.threshold, + "layout": layout_name(scanned.decoded.info.layout) + }, + "crop": scanned.crop.map(|region| serde_json::json!({ + "x": region.x, + "y": region.y, + "width": region.width, + "height": region.height + })), + "quad": scanned.quad.map(|quad| serde_json::json!({ + "top_left": {"x": quad.top_left.x, "y": quad.top_left.y}, + "top_right": {"x": quad.top_right.x, "y": quad.top_right.y}, + "bottom_right": {"x": quad.bottom_right.x, "y": quad.bottom_right.y}, + "bottom_left": {"x": quad.bottom_left.x, "y": quad.bottom_left.y} + })), + "warp_size": scanned.warp_size.map(|(w, h)| serde_json::json!({"width": w, "height": h})), + "attempts": scanned.attempts.iter().enumerate().map(|(index, attempt)| serde_json::json!({ + "index": index, + "detector": attempt.detector, + "layout_hint": attempt.layout_hint.map(layout_name), + "stage": attempt.stage, + "decoded": attempt.decoded, + "error": attempt.error, + "duration_micros": attempt.duration_micros, + "region": {"x": attempt.region.x, "y": attempt.region.y, "width": attempt.region.width, "height": attempt.region.height} + })).collect::>(), + "timings": { + "total_micros": telemetry.timings.total_micros, + "full_frame_micros": telemetry.timings.full_frame_micros, + "grayscale_micros": telemetry.timings.grayscale_micros, + "threshold_micros": telemetry.timings.threshold_micros, + "quad_micros": telemetry.timings.quad_micros, + "candidate_micros": telemetry.timings.candidate_micros, + "decode_attempts_micros": telemetry.timings.decode_attempts_micros + } + }); + fs::write( + self.dir.join("diagnostics.json"), + serde_json::to_string_pretty(&payload)?, + ) + .context("failed to write debug diagnostics json")?; + Ok(()) + } + + fn dump_failure( + &self, + image: &image::DynamicImage, + mode: TransmissionMode, + failed: &FailedStillScan, + ) -> Result<()> { + self.dump_attempt_regions(image, mode, &failed.attempts)?; + let payload = serde_json::json!({ + "ok": false, + "mode": mode.to_string(), + "error": failed.error.to_string(), + "attempts": failed.attempts.iter().enumerate().map(|(index, attempt)| serde_json::json!({ + "index": index, + "detector": attempt.detector, + "layout_hint": attempt.layout_hint.map(layout_name), + "stage": attempt.stage, + "decoded": attempt.decoded, + "error": attempt.error, + "duration_micros": attempt.duration_micros, + "region": {"x": attempt.region.x, "y": attempt.region.y, "width": attempt.region.width, "height": attempt.region.height} + })).collect::>(), + "timings": { + "total_micros": failed.timings.total_micros, + "full_frame_micros": failed.timings.full_frame_micros, + "grayscale_micros": failed.timings.grayscale_micros, + "threshold_micros": failed.timings.threshold_micros, + "quad_micros": failed.timings.quad_micros, + "candidate_micros": failed.timings.candidate_micros, + "decode_attempts_micros": failed.timings.decode_attempts_micros + } + }); + fs::write( + self.dir.join("diagnostics.json"), + serde_json::to_string_pretty(&payload)?, + ) + .context("failed to write failure diagnostics json")?; + Ok(()) + } + + fn dump_robust_success( + &self, + image: &image::DynamicImage, + mode: TransmissionMode, + scanned: &glyphnet_scanner::StillScanResult, + ) -> Result<()> { + self.dump_success(image, mode, scanned)?; + let path = self.dir.join("diagnostics.json"); + let data = fs::read_to_string(&path).context("failed to read diagnostics json")?; + let mut payload: serde_json::Value = + serde_json::from_str(&data).context("failed to parse diagnostics json")?; + payload["used_robust_fallback"] = serde_json::json!(true); + fs::write(path, serde_json::to_string_pretty(&payload)?) + .context("failed to rewrite diagnostics json")?; + Ok(()) + } + + fn dump_attempt_regions( + &self, + image: &image::DynamicImage, + mode: TransmissionMode, + attempts: &[glyphnet_scanner::ScanAttempt], + ) -> Result<()> { + let profile = VisionProfile::for_mode(mode); + for (index, attempt) in attempts.iter().enumerate() { + let region = attempt.region; + let cropped = + image::imageops::crop_imm(image, region.x, region.y, region.width, region.height) + .to_image(); + let state = if attempt.decoded { "hit" } else { "miss" }; + let stem = format!( + "attempt-{index:03}-{state}-{}-{}-{}x{}+{}+{}", + attempt.detector, + attempt.stage, + region.width, + region.height, + region.x, + region.y + ); + cropped + .save(self.dir.join(format!("{stem}-crop.png"))) + .context("failed to save attempt debug crop")?; + + let cropped_dyn = image::DynamicImage::ImageRgba8(cropped); + let gray = grayscale(&cropped_dyn).context("failed to grayscale attempt crop")?; + gray.save(self.dir.join(format!("{stem}-gray.png"))) + .context("failed to save attempt grayscale image")?; + + let binary = adaptive_threshold(&gray, profile.threshold_radius, profile.threshold_bias) + .context("failed to threshold attempt crop")?; + binary + .save(self.dir.join(format!("{stem}-binary.png"))) + .context("failed to save attempt binary image")?; + self.write_binary_text_named(&binary, &format!("{stem}-binary.txt"))?; + self.write_binary_grid_image_named(&binary, &format!("{stem}-binary-grid.png"))?; + } + Ok(()) + } + + fn write_binary_text(&self, binary: &image::GrayImage) -> Result<()> { + self.write_binary_text_named(binary, "02-binary.txt") + } + + fn write_binary_text_named(&self, binary: &image::GrayImage, name: &str) -> Result<()> { + let mut text = + String::with_capacity((binary.width() as usize + 1).saturating_mul(binary.height() as usize)); + for y in 0..binary.height() { + for x in 0..binary.width() { + let pixel = binary.get_pixel(x, y).0[0]; + text.push(if pixel == 0 { '1' } else { '0' }); + } + text.push('\n'); + } + fs::write(self.dir.join(name), text) + .context("failed to write debug binary text file")?; + Ok(()) + } + + fn write_binary_grid_image(&self, binary: &image::GrayImage) -> Result<()> { + self.write_binary_grid_image_named(binary, "02-binary-grid.png") + } + + fn write_binary_grid_image_named(&self, binary: &image::GrayImage, name: &str) -> Result<()> { + const CELL: u32 = 4; + const GRID: u32 = 1; + + let width = binary.width(); + let height = binary.height(); + let out_width = width.saturating_mul(CELL + GRID).saturating_add(GRID); + let out_height = height.saturating_mul(CELL + GRID).saturating_add(GRID); + let mut out = image::GrayImage::from_pixel(out_width, out_height, image::Luma([220])); + + for y in 0..height { + for x in 0..width { + let pixel = binary.get_pixel(x, y).0[0]; + let start_x = GRID + x * (CELL + GRID); + let start_y = GRID + y * (CELL + GRID); + for dy in 0..CELL { + for dx in 0..CELL { + out.put_pixel(start_x + dx, start_y + dy, image::Luma([pixel])); + } + } + } + } + + out.save(self.dir.join(name)) + .context("failed to save debug binary grid image")?; + Ok(()) + } + + fn write_decoded_matrix_artifacts(&self, matrix: &glyphnet_core::SymbolMatrix) -> Result<()> { + let width = usize::from(matrix.width()); + let height = usize::from(matrix.height()); + + let mut text = String::with_capacity((width + 1).saturating_mul(height)); + for y in 0..matrix.height() { + for x in 0..matrix.width() { + let cell = matrix.get(x, y).map_err(|err| anyhow::anyhow!(err.to_string()))?; + text.push(if cell.is_dark() { '1' } else { '0' }); + } + text.push('\n'); + } + fs::write(self.dir.join("05-decoded-matrix.txt"), text) + .context("failed to write decoded matrix text")?; + + const CELL: u32 = 14; + const GRID: u32 = 1; + let out_width = u32::from(matrix.width()) + .saturating_mul(CELL + GRID) + .saturating_add(GRID); + let out_height = u32::from(matrix.height()) + .saturating_mul(CELL + GRID) + .saturating_add(GRID); + let mut out = image::GrayImage::from_pixel(out_width, out_height, image::Luma([210])); + + for y in 0..matrix.height() { + for x in 0..matrix.width() { + let cell = matrix.get(x, y).map_err(|err| anyhow::anyhow!(err.to_string()))?; + let value = if cell.is_dark() { 0 } else { 255 }; + let start_x = GRID + u32::from(x) * (CELL + GRID); + let start_y = GRID + u32::from(y) * (CELL + GRID); + for dy in 0..CELL { + for dx in 0..CELL { + out.put_pixel(start_x + dx, start_y + dy, image::Luma([value])); + } + } + } + } + out.save(self.dir.join("05-decoded-matrix-grid.png")) + .context("failed to save decoded matrix grid image")?; + + let data_bits = matrix.read_data_bits(); + let mut data_bits_text = String::with_capacity(data_bits.len() + 1); + for bit in data_bits { + data_bits_text.push(if bit { '1' } else { '0' }); + } + data_bits_text.push('\n'); + fs::write(self.dir.join("05-decoded-data-bits.txt"), data_bits_text) + .context("failed to write decoded data bits text")?; + Ok(()) + } +} + // Auth/keyset logic extracted to `auth` module. fn scan_burst(input_dir: PathBuf, mode: TransmissionMode) -> Result<()> { diff --git a/crates/glyphnet-scanner/Cargo.toml b/crates/glyphnet-scanner/Cargo.toml index 7928565..8a322d0 100644 --- a/crates/glyphnet-scanner/Cargo.toml +++ b/crates/glyphnet-scanner/Cargo.toml @@ -13,6 +13,7 @@ readme.workspace = true default = ["std"] std = [] async = ["tokio"] +opencv-fallback = ["dep:opencv"] [dependencies] glyphnet-core = { path = "../glyphnet-core", version = "0.1.0" } @@ -26,6 +27,7 @@ tracing.workspace = true [target.'cfg(not(target_arch = "wasm32"))'.dependencies] rayon = "1" +opencv = { version = "0.98.2", optional = true, default-features = false, features = ["imgproc"] } [target.'cfg(target_arch = "wasm32")'.dependencies] js-sys = "0.3" diff --git a/crates/glyphnet-scanner/src/candidates.rs b/crates/glyphnet-scanner/src/candidates.rs index caccd9b..3686fd1 100644 --- a/crates/glyphnet-scanner/src/candidates.rs +++ b/crates/glyphnet-scanner/src/candidates.rs @@ -75,10 +75,12 @@ pub(crate) fn still_scan_candidates( } else { 12 }; - let max_generic = if !robust || large_image { - 0 - } else { + let max_generic = if large_image { + if robust { 8 } else { 4 } + } else if robust { MAX_GENERIC_CANDIDATES + } else { + 4 }; let max_dark_bounds = if !robust { 1 @@ -88,6 +90,21 @@ pub(crate) fn still_scan_candidates( MAX_DARK_BOUNDS_CANDIDATES }; let mut candidates = Vec::new(); + let precomputed_dark_bounds = dark_bounds(binary); + + let mut border_trim = ribbon_border_trim_candidates(image_width, image_height); + border_trim.truncate(10); + candidates.extend(border_trim); + + let mut roi_group = ribbon_symbol_roi_candidates(binary, image_width, image_height); + roi_group.truncate(8); + candidates.extend(roi_group); + + if let Some(bounds) = precomputed_dark_bounds { + let mut anchored = ribbon_top_left_scale_candidates(bounds, image_width, image_height); + anchored.truncate(10); + candidates.extend(anchored); + } if !large_image && let Some(bounds) = content_bounds(image) { let mut content = @@ -112,7 +129,7 @@ pub(crate) fn still_scan_candidates( if candidates.len() < max_total && should_try_dark_bounds_fallback(image_width, image_height, candidates.len()) - && let Some(bounds) = dark_bounds(binary) + && let Some(bounds) = precomputed_dark_bounds { let mut dark_bounds = ribbon_dark_bounds_candidates(bounds, padding, image_width, image_height); @@ -122,28 +139,249 @@ pub(crate) fn still_scan_candidates( } if candidates.len() < max_total { - let mut fallback = coarse_ribbon_grid_candidates(image_width, image_height); + let mut fallback = coarse_ribbon_grid_candidates(binary, image_width, image_height); fallback.truncate(max_total - candidates.len()); candidates.extend(fallback); } + refine_candidate_priority(&mut candidates, image_width, image_height); candidates.truncate(max_total); candidates } -fn coarse_ribbon_grid_candidates(image_width: u32, image_height: u32) -> Vec { +fn refine_candidate_priority( + candidates: &mut Vec, + image_width: u32, + image_height: u32, +) { + let image_area = u64::from(image_width) + .saturating_mul(u64::from(image_height)) + .max(1); + candidates.retain(|candidate| { + let region = candidate.region; + let area = u64::from(region.width).saturating_mul(u64::from(region.height)); + let area_pct = area.saturating_mul(100) / image_area; + let top_edge = region.y <= (image_height / 32).max(8); + let is_large = area_pct >= 60; + + let reject_signature_window = candidate.detector == CandidateDetector::RibbonWeave + && candidate.stage == "signature-window" + && top_edge + && is_large; + let reject_full_band = candidate.detector == CandidateDetector::GenericBinary + && candidate.stage == "horizontal-band" + && area_pct >= 80; + let reject_full_aspect = candidate.detector == CandidateDetector::GenericBinary + && candidate.stage == "horizontal-aspect" + && area_pct >= 80; + !(reject_signature_window || reject_full_band || reject_full_aspect) + }); + + let has_non_top_ribbon = candidates.iter().any(|candidate| { + candidate.detector == CandidateDetector::RibbonWeave + && !is_top_heavy_ribbon_region(candidate.region, image_height) + }); + if has_non_top_ribbon { + candidates.retain(|candidate| { + candidate.detector != CandidateDetector::RibbonWeave + || !is_top_heavy_ribbon_region(candidate.region, image_height) + }); + } + + candidates.sort_by_key(|candidate| candidate_priority_score(*candidate, image_width, image_height)); +} + +fn is_top_heavy_ribbon_region(region: ScanRegion, image_height: u32) -> bool { + let near_top = region.y <= (image_height / 32).max(8); + let very_tall = region.height >= (image_height.saturating_mul(3) / 5).max(160); + near_top && very_tall +} + +fn candidate_priority_score( + candidate: ScanCandidate, + image_width: u32, + image_height: u32, +) -> u64 { + let region = candidate.region; + let mut score = 0u64; + + if candidate.detector == CandidateDetector::RibbonWeave { + if candidate.stage == "border-trim" { + score = score.saturating_sub(140); + } + if candidate.stage == "roi-group" { + score = score.saturating_sub(80); + } + let expected_ratio = 104.0f32 / 44.0f32; + let ratio = region.width as f32 / region.height.max(1) as f32; + score = score.saturating_add(((ratio - expected_ratio).abs() * 100.0).round() as u64); + } + + if region.y <= (image_height / 32).max(8) { + score = score.saturating_add(120); + } + if region.x == 0 + || region.y == 0 + || region.x.saturating_add(region.width) >= image_width + || region.y.saturating_add(region.height) >= image_height + { + score = score.saturating_add(60); + } + + let area = u64::from(region.width).saturating_mul(u64::from(region.height)); + let image_area = u64::from(image_width) + .saturating_mul(u64::from(image_height)) + .max(1); + let area_pct = area.saturating_mul(100) / image_area; + if area_pct > 35 { + score = score.saturating_add((area_pct - 35) * 4); + } + if candidate.detector == CandidateDetector::GenericBinary && candidate.stage == "horizontal-aspect" { + score = score.saturating_add(260); + } + score +} + +fn ribbon_border_trim_candidates(image_width: u32, image_height: u32) -> Vec { + if image_width < 220 || image_height < 90 { + return Vec::new(); + } + let mut out = Vec::new(); + for pct in [2u32, 3, 4, 5, 6, 8, 10] { + let trim_x = image_width.saturating_mul(pct) / 100; + let trim_y = image_height.saturating_mul(pct) / 100; + let width = image_width.saturating_sub(trim_x.saturating_mul(2)); + let height = image_height.saturating_sub(trim_y.saturating_mul(2)); + if width < 160 || height < 60 { + continue; + } + push_unique_candidate( + &mut out, + CandidateDetector::RibbonWeave, + Some(LayoutFamily::RibbonWeave), + "border-trim", + ScanRegion { + x: trim_x, + y: trim_y, + width, + height, + }, + ); + } + out +} + +fn ribbon_symbol_roi_candidates( + binary: &GrayImage, + image_width: u32, + image_height: u32, +) -> Vec { + let mut seeds: Vec = dark_components(binary) + .into_iter() + .filter(|c| { + let b = c.bounds; + if c.pixels < 60 || b.width < 20 || b.height < 10 { + return false; + } + let aspect = b.width as f32 / b.height.max(1) as f32; + (0.6..=12.0).contains(&aspect) + }) + .take(120) + .collect(); + if seeds.is_empty() { + return Vec::new(); + } + + #[derive(Clone, Copy)] + struct Group { + bounds: ScanRegion, + pixels: u32, + score: i64, + } + let mut groups = Vec::new(); + for seed in &seeds { + let mut bounds = seed.bounds; + let mut pixels = seed.pixels; + let sx = seed.bounds.x + seed.bounds.width / 2; + let sy = seed.bounds.y + seed.bounds.height / 2; + for other in &seeds { + let ox = other.bounds.x + other.bounds.width / 2; + let oy = other.bounds.y + other.bounds.height / 2; + let dx = sx.abs_diff(ox); + let dy = sy.abs_diff(oy); + if dx <= seed.bounds.width.saturating_mul(4) && dy <= seed.bounds.height.saturating_mul(3) { + bounds = union_region(bounds, other.bounds); + pixels = pixels.saturating_add(other.pixels); + } + } + let area = bounds.width.saturating_mul(bounds.height).max(1); + let area_ratio = area as f32 / (image_width.saturating_mul(image_height).max(1) as f32); + if !(0.01..=0.85).contains(&area_ratio) { + continue; + } + let aspect = bounds.width as f32 / bounds.height.max(1) as f32; + let aspect_penalty = ((aspect - (104.0 / 44.0)).abs() * 100.0) as i64; + let top_penalty = if bounds.y < image_height / 12 { 120 } else { 0 }; + let score = pixels as i64 - aspect_penalty - top_penalty; + groups.push(Group { bounds, pixels, score }); + } + groups.sort_by(|a, b| b.score.cmp(&a.score).then(b.pixels.cmp(&a.pixels))); + groups.truncate(4); + + let mut out = Vec::new(); + for g in groups { + for w_scale in [1.10f32, 1.25, 1.40, 1.55] { + let w = ((g.bounds.width as f32) * w_scale).round() as u32; + if w < 120 || w > image_width { + continue; + } + if w > image_width.saturating_mul(80) / 100 { + continue; + } + let nominal_h = ((w as f32) * (44.0 / 104.0)).round() as u32; + for h_scale in [1.00f32, 1.15, 1.30] { + let h = ((nominal_h as f32) * h_scale).round() as u32; + if h < 70 || h > image_height { + continue; + } + let cx = g.bounds.x + g.bounds.width / 2; + let cy = g.bounds.y + g.bounds.height / 2; + let x = cx.saturating_sub(w / 2).min(image_width.saturating_sub(w)); + let y = cy.saturating_sub(h / 2).min(image_height.saturating_sub(h)); + let region = ScanRegion { x, y, width: w, height: h }; + if !region_contains(region, g.bounds) { + continue; + } + push_unique_candidate( + &mut out, + CandidateDetector::RibbonWeave, + Some(LayoutFamily::RibbonWeave), + "roi-group", + region, + ); + } + } + } + out +} + +fn coarse_ribbon_grid_candidates( + binary: &GrayImage, + image_width: u32, + image_height: u32, +) -> Vec { if image_width < 240 || image_height < 120 { return Vec::new(); } let mut candidates = Vec::new(); - for module_px in [4u32, 5, 3, 6, 7, 8] { + for module_px in [4u32, 5, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] { let width = 104 * module_px; let height = 44 * module_px; if width > image_width || height > image_height { continue; } - let x_fracs = [0.06_f32, 0.115, 0.16, 0.22, 0.30, 0.38]; - let y_fracs = [0.08_f32, 0.14, 0.20, 0.233, 0.28, 0.32]; + let x_fracs = [0.04_f32, 0.10, 0.16, 0.24, 0.32, 0.42, 0.52, 0.62, 0.72, 0.80]; + let y_fracs = [0.07_f32, 0.12, 0.18, 0.24, 0.30, 0.36, 0.44]; for xf in x_fracs { for yf in y_fracs { let x = ((image_width as f32 * xf).round() as u32) @@ -167,6 +405,29 @@ fn coarse_ribbon_grid_candidates(image_width: u32, image_height: u32) -> Vec Vec Vec u32 { + let x_end = region.x.saturating_add(region.width).min(binary.width()); + let y_end = region.y.saturating_add(region.height).min(binary.height()); + let mut dark = 0u32; + for y in region.y..y_end { + for x in region.x..x_end { + if binary.get_pixel(x, y).0[0] == 0 { + dark = dark.saturating_add(1); + } + } + } + dark +} + fn content_bounds(image: &DynamicImage) -> Option { let rgba = image.to_rgba8(); let mut min_x = image.width(); @@ -346,6 +623,11 @@ fn ribbon_dark_bounds_candidates( region, )); } + candidates.extend(ribbon_top_left_scale_candidates( + bounds, + image_width, + image_height, + )); let expanded = expand_region(bounds, padding, image_width, image_height); candidates.push(ScanCandidate::new( CandidateDetector::RibbonWeave, @@ -364,6 +646,77 @@ fn ribbon_dark_bounds_candidates( candidates } +fn ribbon_top_left_scale_candidates( + bounds: ScanRegion, + image_width: u32, + image_height: u32, +) -> Vec { + let mut candidates = Vec::new(); + if bounds.width < 64 || bounds.height < 24 { + return candidates; + } + + let est_module_w = (bounds.width as f32 / 96.0).round() as i32; + let est_module_h = (bounds.height as f32 / 36.0).round() as i32; + let est_module = ((est_module_w + est_module_h) / 2).clamp(2, 16) as u32; + let mut module_values = Vec::new(); + for delta in -5..=6 { + let value = (est_module as i32 + delta).clamp(2, 18) as u32; + if !module_values.contains(&value) { + module_values.push(value); + } + } + + for module_px in module_values { + let width = 104u32.saturating_mul(module_px); + let height = 44u32.saturating_mul(module_px); + if width > image_width || height > image_height { + continue; + } + for margin_mul in [4u32, 6, 8, 10] { + let quiet = margin_mul.saturating_mul(module_px); + let x = bounds.x.saturating_sub(quiet); + let y = bounds.y.saturating_sub(quiet); + let region = clamp_region( + ScanRegion { + x, + y, + width, + height, + }, + image_width, + image_height, + ); + if !plausible_region(region) { + continue; + } + // Keep only candidates that still contain the detected dark content bounds. + if !region_contains(region, bounds) { + continue; + } + push_unique_candidate( + &mut candidates, + CandidateDetector::RibbonWeave, + Some(LayoutFamily::RibbonWeave), + "top-left-scale", + region, + ); + } + } + candidates +} + +fn region_contains(outer: ScanRegion, inner: ScanRegion) -> bool { + let outer_right = outer.x.saturating_add(outer.width); + let outer_bottom = outer.y.saturating_add(outer.height); + let inner_right = inner.x.saturating_add(inner.width); + let inner_bottom = inner.y.saturating_add(inner.height); + inner.x >= outer.x + && inner.y >= outer.y + && inner_right <= outer_right + && inner_bottom <= outer_bottom +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] struct MatrixFinder { x: u32, @@ -923,7 +1276,9 @@ fn generic_binary_candidates( continue; } let expanded = expand_region(component.bounds, padding * 2, image_width, image_height); - if plausible_region(expanded) { + if plausible_region(expanded) + && plausible_symbol_roi(expanded, image_width, image_height) + { push_unique_candidate( &mut regions, CandidateDetector::GenericBinary, @@ -938,6 +1293,22 @@ fn generic_binary_candidates( regions } +fn plausible_symbol_roi(region: ScanRegion, image_width: u32, image_height: u32) -> bool { + let area = u64::from(region.width).saturating_mul(u64::from(region.height)); + let image_area = u64::from(image_width) + .saturating_mul(u64::from(image_height)) + .max(1); + let area_pct = area.saturating_mul(100) / image_area; + if area_pct < 1 || area_pct > 45 { + return false; + } + if region.height < 120 || region.width < 260 { + return false; + } + let aspect = region.width as f32 / region.height.max(1) as f32; + (1.8..=3.8).contains(&aspect) +} + #[derive(Debug, Clone, Copy)] struct RailRow { y: u32, diff --git a/crates/glyphnet-scanner/src/decode_paths.rs b/crates/glyphnet-scanner/src/decode_paths.rs index 7a424a6..b193da3 100644 --- a/crates/glyphnet-scanner/src/decode_paths.rs +++ b/crates/glyphnet-scanner/src/decode_paths.rs @@ -3,9 +3,13 @@ use glyphnet_cv::{Point, Quad, warp_perspective_gray}; use glyphnet_decode::{ AutoDecodedSymbol, DecodeError, DecodeOptions, RasterDecoder, decode_matrix_with_suspect_bytes, }; -use image::{DynamicImage, GrayImage, Luma}; +use image::{DynamicImage, GrayImage, Luma, Rgba, RgbaImage}; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; use crate::ScanRegion; +static NORMALIZED_DEBUG_COUNTER: AtomicUsize = AtomicUsize::new(0); pub(crate) fn decode_candidate( decoder: &RasterDecoder, @@ -18,11 +22,23 @@ pub(crate) fn decode_candidate( { return Ok(decoded); } - if matches!(candidate.stage, "signature-window" | "coarse-grid") { + if matches!( + candidate.stage, + "signature-window" | "coarse-grid" | "top-left-scale" | "roi-group" | "border-trim" + ) { + let region_area = region.width.saturating_mul(region.height); if let Ok(decoded) = decode_exact_ribbon_candidate(image, region) { return Ok(decoded); } - if let Ok(decoded) = decode_fractional_ribbon_candidate(image) { + if let Ok(decoded) = decode_forced_normalized_ribbon_candidate(image, region) { + return Ok(decoded); + } + if region_area <= 700_000 + && let Ok(decoded) = decode_fractional_ribbon_candidate(image) + { + return Ok(decoded); + } + if let Ok(decoded) = decode_with_padding_variants(decoder, image) { return Ok(decoded); } let target_module_px = 4; @@ -42,6 +58,9 @@ pub(crate) fn decode_candidate( if let Ok(decoded) = decode_exact_ribbon_candidate(&resized, normalized_region) { return Ok(decoded); } + if let Ok(decoded) = decode_with_padding_variants(decoder, &resized) { + return Ok(decoded); + } return Err(DecodeError::AutoDetectFailed); } @@ -55,8 +74,49 @@ pub(crate) fn decode_candidate( if let Ok(decoded) = decode_fractional_ribbon_candidate(image) { return Ok(decoded); } + if let Ok(decoded) = decode_with_padding_variants(decoder, image) { + return Ok(decoded); + } } - decoder.decode_auto_with_info(image) + decoder + .decode_auto_with_info(image) + .or_else(|_| decode_with_padding_variants(decoder, image)) +} + +fn decode_with_padding_variants( + decoder: &RasterDecoder, + image: &DynamicImage, +) -> std::result::Result { + for pad_pct in [4u32, 8, 12, 16] { + let padded = white_pad_image(image, pad_pct); + if let Ok(decoded) = decoder.decode_auto_with_info(&padded) { + return Ok(decoded); + } + if let Ok(decoded) = decode_fractional_ribbon_candidate(&padded) { + return Ok(decoded); + } + let region = crate::ScanRegion { + x: 0, + y: 0, + width: padded.width(), + height: padded.height(), + }; + if let Ok(decoded) = decode_exact_ribbon_candidate(&padded, region) { + return Ok(decoded); + } + } + Err(DecodeError::AutoDetectFailed) +} + +fn white_pad_image(image: &DynamicImage, pad_pct: u32) -> DynamicImage { + let rgba = image.to_rgba8(); + let pad_x = (rgba.width().saturating_mul(pad_pct) / 100).max(2); + let pad_y = (rgba.height().saturating_mul(pad_pct) / 100).max(2); + let out_w = rgba.width().saturating_add(pad_x.saturating_mul(2)); + let out_h = rgba.height().saturating_add(pad_y.saturating_mul(2)); + let mut canvas = RgbaImage::from_pixel(out_w, out_h, Rgba([255, 255, 255, 255])); + image::imageops::overlay(&mut canvas, &rgba, i64::from(pad_x), i64::from(pad_y)); + DynamicImage::ImageRgba8(canvas) } fn decode_exact_matrix_candidate( @@ -121,23 +181,25 @@ fn decode_exact_ribbon_candidate( if region.width >= 104 && region.height >= 44 { let module_px = (region.width / 104).max(1); if region.width == 104 * module_px && region.height == 44 * module_px { - for threshold in [160, 192, 224] { - let exact = RasterDecoder::new(DecodeOptions { - module_px, - quiet_zone_modules: 4, - threshold, - layout: LayoutFamily::RibbonWeave, - }); - if let Ok(decoded) = exact.decode(image) { - return Ok(AutoDecodedSymbol { - decoded, - info: glyphnet_decode::AutoDecodeInfo { - module_px, - quiet_zone_modules: 4, - threshold, - layout: LayoutFamily::RibbonWeave, - }, + for quiet_zone_modules in [0u32, 1, 2, 3, 4, 5, 6, 7, 8] { + for threshold in [144, 160, 176, 192, 208, 224] { + let exact = RasterDecoder::new(DecodeOptions { + module_px, + quiet_zone_modules, + threshold, + layout: LayoutFamily::RibbonWeave, }); + if let Ok(decoded) = exact.decode(image) { + return Ok(AutoDecodedSymbol { + decoded, + info: glyphnet_decode::AutoDecodeInfo { + module_px, + quiet_zone_modules, + threshold, + layout: LayoutFamily::RibbonWeave, + }, + }); + } } } } @@ -217,6 +279,147 @@ fn decode_fractional_ribbon_candidate( Err(DecodeError::AutoDetectFailed) } +fn decode_forced_normalized_ribbon_candidate( + image: &DynamicImage, + region: ScanRegion, +) -> std::result::Result { + const SYMBOL_WIDTH: u32 = 96; + const SYMBOL_HEIGHT: u32 = 36; + const QUIET: u32 = 4; + + let x = region.x.min(image.width().saturating_sub(1)); + let y = region.y.min(image.height().saturating_sub(1)); + let max_w = image.width().saturating_sub(x); + let max_h = image.height().saturating_sub(y); + let w = region.width.min(max_w); + let h = region.height.min(max_h); + if w < 80 || h < 30 { + return Err(DecodeError::AutoDetectFailed); + } + + let full = image.to_luma8(); + let trims = [0.00f32, 0.06]; + let shifts = [0.00f32, -0.04, 0.04]; + + let est_w = (w / 104).max(2); + let est_h = (h / 44).max(2); + let est = ((est_w + est_h) / 2).clamp(2, 24); + let mut module_candidates = Vec::new(); + for d in -3i32..=3 { + let m = (est as i32 + d).clamp(2, 24) as u32; + if !module_candidates.contains(&m) { + module_candidates.push(m); + } + } + + for trim in trims { + let trim_x = ((w as f32) * trim).round() as u32; + let trim_y = ((h as f32) * trim).round() as u32; + let base_w = w.saturating_sub(trim_x.saturating_mul(2)); + let base_h = h.saturating_sub(trim_y.saturating_mul(2)); + if base_w < 60 || base_h < 24 { + continue; + } + let base_x = x.saturating_add(trim_x); + let base_y = y.saturating_add(trim_y); + + for sx in shifts { + for sy in shifts { + let dx = ((base_w as f32) * sx).round() as i32; + let dy = ((base_h as f32) * sy).round() as i32; + let rx = (base_x as i32 + dx).max(0) as u32; + let ry = (base_y as i32 + dy).max(0) as u32; + let rw = base_w.min(full.width().saturating_sub(rx)); + let rh = base_h.min(full.height().saturating_sub(ry)); + if rw < 60 || rh < 24 { + continue; + } + + let sub = image::imageops::crop_imm(&full, rx, ry, rw, rh).to_image(); + for module_px in &module_candidates { + let total_w = (SYMBOL_WIDTH + QUIET * 2) * *module_px; + let total_h = (SYMBOL_HEIGHT + QUIET * 2) * *module_px; + let content_w = SYMBOL_WIDTH * *module_px; + let content_h = SYMBOL_HEIGHT * *module_px; + let resized = image::imageops::resize( + &sub, + content_w, + content_h, + image::imageops::FilterType::CatmullRom, + ); + + let mut thresholds = vec![fractional_threshold(&resized), 120, 136, 152]; + thresholds.sort_unstable(); + thresholds.dedup(); + + for threshold in thresholds { + let mut bin = resized.clone(); + for px in bin.pixels_mut() { + px.0[0] = if px.0[0] < threshold { 0 } else { 255 }; + } + dump_normalized_debug(region, threshold, &resized, &bin); + let mut canvas = GrayImage::from_pixel(total_w, total_h, Luma([255])); + image::imageops::overlay( + &mut canvas, + &bin, + i64::from(QUIET * *module_px), + i64::from(QUIET * *module_px), + ); + let candidate = DynamicImage::ImageLuma8(canvas); + let full_region = ScanRegion { + x: 0, + y: 0, + width: total_w, + height: total_h, + }; + if let Ok(decoded) = decode_exact_ribbon_candidate(&candidate, full_region) { + return Ok(decoded); + } + let auto = RasterDecoder::default(); + if let Ok(decoded) = auto.decode_auto_with_info(&candidate) { + return Ok(decoded); + } + } + } + } + } + } + + Err(DecodeError::AutoDetectFailed) +} + +fn dump_normalized_debug(region: ScanRegion, threshold: u8, resized: &GrayImage, bin: &GrayImage) { + if std::env::var_os("GLYPHNET_SCAN_DEBUG").is_none() { + return; + } + let base_dir = std::env::var_os("GLYPHNET_SCAN_DEBUG_DIR") + .map(PathBuf::from) + .unwrap_or_else(|| PathBuf::from("target/scan-debug")); + let out_dir = base_dir.join("normalized"); + if fs::create_dir_all(&out_dir).is_err() { + return; + } + let idx = NORMALIZED_DEBUG_COUNTER.fetch_add(1, Ordering::Relaxed); + let prefix = format!( + "n{:04}-{}x{}+{}+{}-t{}", + idx, region.width, region.height, region.x, region.y, threshold + ); + let _ = resized.save(out_dir.join(format!("{prefix}-normalized-resized.png"))); + let _ = bin.save(out_dir.join(format!("{prefix}-normalized-binary.png"))); + let mut txt = String::new(); + for y in 0..bin.height() { + for x in 0..bin.width() { + let value = if bin.get_pixel(x, y).0[0] == 0 { '1' } else { '0' }; + txt.push(value); + } + txt.push('\n'); + } + let _ = fs::write( + out_dir.join(format!("{prefix}-normalized-binary.txt")), + txt, + ); +} + fn module_shifts(radius: i32) -> impl Iterator { (-radius * 2..=radius * 2).map(|value| value as f32 * 0.5) } diff --git a/crates/glyphnet-scanner/src/lib.rs b/crates/glyphnet-scanner/src/lib.rs index 7324755..9d0ad8b 100644 --- a/crates/glyphnet-scanner/src/lib.rs +++ b/crates/glyphnet-scanner/src/lib.rs @@ -41,6 +41,490 @@ pub use detectors::CandidateDetector; use detectors::ScanCandidate; use rectification::{scan_quad_candidates as build_quad_candidates, should_try_quad_rectification}; pub use types::{FailedStillScan, ScanAttempt, ScanTelemetry, ScanTimings, StillScanResult}; +#[cfg(all(not(target_arch = "wasm32"), feature = "opencv-fallback"))] +mod opencv_fallback { + use glyphnet_decode::{AutoDecodedSymbol, RasterDecoder}; + use image::{DynamicImage, GrayImage, Luma}; + use opencv::{ + core::{self, Mat, Point2f, Rect, Scalar, Size, Vector}, + imgproc, + prelude::*, + }; + + pub(crate) fn try_decode_with_opencv(image: &DynamicImage) -> Option { + let luma = image.to_luma8(); + let Ok(src) = gray_to_mat(&luma) else { + return None; + }; + let mut variants = Vec::new(); + let mut page_src = src.clone(); + if let Some(page) = page_rectified_variant(&src) { + page_src = page; + } + + if let Ok(clahe) = clahe_variant(&page_src) { + variants.push(clahe); + } + if let Ok(adaptive) = adaptive_variant(&page_src) { + variants.push(adaptive); + } + if let Ok(clahe) = clahe_variant(&page_src) + && let Ok(combo) = adaptive_variant(&clahe) + { + variants.push(combo); + } + + let mut roi_variants: Vec = Vec::new(); + if let Some(rois) = detect_symbol_rois(&page_src) { + for roi in rois { + if let Ok(crop) = page_src.roi(roi) + && let Ok(crop_mat) = crop.try_clone() + && let Ok(gray) = mat_to_gray(&crop_mat) + { + let crop_img = DynamicImage::ImageLuma8(gray); + roi_variants.push(crop_img.clone()); + roi_variants.push(white_pad(&crop_img, 8)); + roi_variants.push(white_pad(&crop_img, 14)); + } + } + } + if let Some(warped) = quad_warp_variant(&page_src) { + roi_variants.push(warped.clone()); + roi_variants.push(white_pad(&warped, 8)); + roi_variants.push(white_pad(&warped, 14)); + } + + let decoder = RasterDecoder::default(); + for candidate in roi_variants { + if let Ok(decoded) = decoder.decode_auto_with_info(&candidate) { + return Some(decoded); + } + } + for mat in variants { + let Ok(gray) = mat_to_gray(&mat) else { + continue; + }; + let candidate = DynamicImage::ImageLuma8(gray); + if let Ok(decoded) = decoder.decode_auto_with_info(&candidate) { + return Some(decoded); + } + } + None + } + + fn detect_symbol_rois(src: &Mat) -> Option> { + let mut thresh = Mat::default(); + imgproc::adaptive_threshold( + src, + &mut thresh, + 255.0, + imgproc::ADAPTIVE_THRESH_GAUSSIAN_C, + imgproc::THRESH_BINARY_INV, + 31, + 7.0, + ) + .ok()?; + let kernel = imgproc::get_structuring_element( + imgproc::MORPH_RECT, + core::Size::new(3, 3), + core::Point::new(-1, -1), + ) + .ok()?; + let mut closed = Mat::default(); + imgproc::morphology_ex( + &thresh, + &mut closed, + imgproc::MORPH_CLOSE, + &kernel, + core::Point::new(-1, -1), + 2, + core::BORDER_CONSTANT, + core::Scalar::all(0.0), + ) + .ok()?; + + let mut contours: Vector> = Vector::new(); + imgproc::find_contours( + &closed, + &mut contours, + imgproc::RETR_EXTERNAL, + imgproc::CHAIN_APPROX_SIMPLE, + core::Point::new(0, 0), + ) + .ok()?; + + let w = src.cols().max(1) as f32; + let h = src.rows().max(1) as f32; + let img_area = w * h; + + let mut scored: Vec<(f32, Rect)> = Vec::new(); + for contour in contours { + let rect = imgproc::bounding_rect(&contour).ok()?; + if rect.width <= 0 || rect.height <= 0 { + continue; + } + let area = (rect.width * rect.height) as f32; + let area_ratio = area / img_area; + if !(0.001..=0.90).contains(&area_ratio) { + continue; + } + let aspect = rect.width as f32 / rect.height as f32; + if !(0.8..=14.0).contains(&aspect) { + continue; + } + let top_penalty = if rect.y < (h * 0.03) as i32 { 0.15 } else { 0.0 }; + let width_ratio = rect.width as f32 / w; + let height_ratio = rect.height as f32 / h; + let mut score = 0.0f32; + score += (aspect / 3.0).min(1.0) * 0.45; + score += (area_ratio / 0.15).min(1.0) * 0.35; + score += (width_ratio.min(0.8) / 0.8) * 0.2; + score -= top_penalty; + if height_ratio > 0.70 { + score -= 0.10; + } + scored.push((score, rect)); + } + + scored.sort_by(|a, b| b.0.total_cmp(&a.0)); + if scored.is_empty() { + return None; + } + + let mut out = Vec::new(); + for (_, rect) in scored.into_iter().take(12) { + out.push(expand_rect(rect, src.cols(), src.rows(), 0.20)); + out.push(expand_rect(rect, src.cols(), src.rows(), 0.35)); + } + Some(out) + } + + fn expand_rect(rect: Rect, max_w: i32, max_h: i32, ratio: f32) -> Rect { + let dx = ((rect.width as f32) * ratio).round() as i32; + let dy = ((rect.height as f32) * ratio).round() as i32; + let x = (rect.x - dx).max(0); + let y = (rect.y - dy).max(0); + let r = (rect.x + rect.width + dx).min(max_w); + let b = (rect.y + rect.height + dy).min(max_h); + Rect::new(x, y, (r - x).max(1), (b - y).max(1)) + } + + fn white_pad(image: &DynamicImage, pct: u32) -> DynamicImage { + let luma = image.to_luma8(); + let pad_x = ((luma.width() as f32) * (pct as f32 / 100.0)).round() as u32; + let pad_y = ((luma.height() as f32) * (pct as f32 / 100.0)).round() as u32; + let out_w = luma.width().saturating_add(pad_x.saturating_mul(2)); + let out_h = luma.height().saturating_add(pad_y.saturating_mul(2)); + let mut out = GrayImage::from_pixel(out_w.max(1), out_h.max(1), Luma([255])); + for y in 0..luma.height() { + for x in 0..luma.width() { + out.put_pixel(x + pad_x, y + pad_y, *luma.get_pixel(x, y)); + } + } + DynamicImage::ImageLuma8(out) + } + + fn page_rectified_variant(src: &Mat) -> Option { + let mut blur = Mat::default(); + imgproc::gaussian_blur( + src, + &mut blur, + Size::new(5, 5), + 0.0, + 0.0, + core::BORDER_DEFAULT, + core::AlgorithmHint::ALGO_HINT_DEFAULT, + ) + .ok()?; + let mut edges = Mat::default(); + imgproc::canny(&blur, &mut edges, 60.0, 180.0, 3, false).ok()?; + let kernel = imgproc::get_structuring_element( + imgproc::MORPH_RECT, + Size::new(5, 5), + core::Point::new(-1, -1), + ) + .ok()?; + let mut closed = Mat::default(); + imgproc::morphology_ex( + &edges, + &mut closed, + imgproc::MORPH_CLOSE, + &kernel, + core::Point::new(-1, -1), + 2, + core::BORDER_CONSTANT, + Scalar::all(0.0), + ) + .ok()?; + + let mut contours: Vector> = Vector::new(); + imgproc::find_contours( + &closed, + &mut contours, + imgproc::RETR_EXTERNAL, + imgproc::CHAIN_APPROX_SIMPLE, + core::Point::new(0, 0), + ) + .ok()?; + + let img_w = src.cols().max(1) as f32; + let img_h = src.rows().max(1) as f32; + let img_area = img_w * img_h; + let mut best_quad: Option<[Point2f; 4]> = None; + let mut best_score = f32::MIN; + + for contour in contours { + let area = imgproc::contour_area(&contour, false).ok()? as f32; + let area_ratio = area / img_area; + if !(0.25..=0.98).contains(&area_ratio) { + continue; + } + let peri = imgproc::arc_length(&contour, true).ok()?; + let mut approx: Vector = Vector::new(); + imgproc::approx_poly_dp(&contour, &mut approx, 0.02 * peri, true).ok()?; + if approx.len() != 4 { + continue; + } + let mut pts: Vec = approx + .iter() + .map(|p| Point2f::new(p.x as f32, p.y as f32)) + .collect(); + if pts.len() != 4 { + continue; + } + pts.sort_by(|a, b| a.y.total_cmp(&b.y).then(a.x.total_cmp(&b.x))); + let (tl, tr) = if pts[0].x <= pts[1].x { + (pts[0], pts[1]) + } else { + (pts[1], pts[0]) + }; + let (bl, br) = if pts[2].x <= pts[3].x { + (pts[2], pts[3]) + } else { + (pts[3], pts[2]) + }; + let top_w = ((tr.x - tl.x).powi(2) + (tr.y - tl.y).powi(2)).sqrt(); + let bot_w = ((br.x - bl.x).powi(2) + (br.y - bl.y).powi(2)).sqrt(); + let left_h = ((bl.x - tl.x).powi(2) + (bl.y - tl.y).powi(2)).sqrt(); + let right_h = ((br.x - tr.x).powi(2) + (br.y - tr.y).powi(2)).sqrt(); + let width = top_w.max(bot_w).max(1.0); + let height = left_h.max(right_h).max(1.0); + let aspect = width / height; + if !(0.55..=1.9).contains(&aspect) { + continue; + } + let score = area_ratio - (aspect - 1.414).abs() * 0.08; + if score > best_score { + best_score = score; + best_quad = Some([tl, tr, br, bl]); + } + } + + let quad = best_quad?; + let dst_w = 2200; + let dst_h = 1550; + let mut src_vec: Vector = Vector::new(); + for p in quad { + src_vec.push(p); + } + let mut dst_vec: Vector = Vector::new(); + dst_vec.push(Point2f::new(0.0, 0.0)); + dst_vec.push(Point2f::new((dst_w - 1) as f32, 0.0)); + dst_vec.push(Point2f::new((dst_w - 1) as f32, (dst_h - 1) as f32)); + dst_vec.push(Point2f::new(0.0, (dst_h - 1) as f32)); + let m = imgproc::get_perspective_transform(&src_vec, &dst_vec, 0).ok()?; + let mut warped = Mat::default(); + imgproc::warp_perspective( + src, + &mut warped, + &m, + Size::new(dst_w, dst_h), + imgproc::INTER_LINEAR, + core::BORDER_CONSTANT, + Scalar::all(255.0), + ) + .ok()?; + Some(warped) + } + + fn quad_warp_variant(src: &Mat) -> Option { + let mut thresh = Mat::default(); + imgproc::adaptive_threshold( + src, + &mut thresh, + 255.0, + imgproc::ADAPTIVE_THRESH_GAUSSIAN_C, + imgproc::THRESH_BINARY_INV, + 31, + 7.0, + ) + .ok()?; + let kernel = imgproc::get_structuring_element( + imgproc::MORPH_RECT, + Size::new(3, 3), + core::Point::new(-1, -1), + ) + .ok()?; + let mut closed = Mat::default(); + imgproc::morphology_ex( + &thresh, + &mut closed, + imgproc::MORPH_CLOSE, + &kernel, + core::Point::new(-1, -1), + 2, + core::BORDER_CONSTANT, + Scalar::all(0.0), + ) + .ok()?; + + let mut contours: Vector> = Vector::new(); + imgproc::find_contours( + &closed, + &mut contours, + imgproc::RETR_EXTERNAL, + imgproc::CHAIN_APPROX_SIMPLE, + core::Point::new(0, 0), + ) + .ok()?; + + let w = src.cols().max(1) as f32; + let h = src.rows().max(1) as f32; + let img_area = w * h; + let mut best_quad: Option<[Point2f; 4]> = None; + let mut best_score = f32::MIN; + + for contour in contours { + let area = imgproc::contour_area(&contour, false).ok()? as f32; + let area_ratio = area / img_area; + if !(0.01..=0.65).contains(&area_ratio) { + continue; + } + let peri = imgproc::arc_length(&contour, true).ok()?; + let mut approx: Vector = Vector::new(); + imgproc::approx_poly_dp(&contour, &mut approx, 0.03 * peri, true).ok()?; + if approx.len() != 4 { + continue; + } + let rect = imgproc::bounding_rect(&approx).ok()?; + if rect.y < (h * 0.04) as i32 { + continue; + } + let aspect = rect.width as f32 / rect.height.max(1) as f32; + if !(1.5..=5.5).contains(&aspect) { + continue; + } + let score = area_ratio * 0.7 + (1.0 - (aspect - (104.0 / 44.0)).abs() / 4.0) * 0.3; + if score <= best_score { + continue; + } + let mut pts: Vec = approx + .iter() + .map(|p| Point2f::new(p.x as f32, p.y as f32)) + .collect(); + if pts.len() != 4 { + continue; + } + pts.sort_by(|a, b| a.y.total_cmp(&b.y).then(a.x.total_cmp(&b.x))); + let (tl, tr) = if pts[0].x <= pts[1].x { + (pts[0], pts[1]) + } else { + (pts[1], pts[0]) + }; + let (bl, br) = if pts[2].x <= pts[3].x { + (pts[2], pts[3]) + } else { + (pts[3], pts[2]) + }; + best_quad = Some([tl, tr, br, bl]); + best_score = score; + } + + let src_pts = best_quad?; + let dst_w = 104 * 8; + let dst_h = 44 * 8; + let mut src_vec: Vector = Vector::new(); + for p in src_pts { + src_vec.push(p); + } + let mut dst_vec: Vector = Vector::new(); + dst_vec.push(Point2f::new(0.0, 0.0)); + dst_vec.push(Point2f::new((dst_w - 1) as f32, 0.0)); + dst_vec.push(Point2f::new((dst_w - 1) as f32, (dst_h - 1) as f32)); + dst_vec.push(Point2f::new(0.0, (dst_h - 1) as f32)); + let m = imgproc::get_perspective_transform(&src_vec, &dst_vec, 0).ok()?; + let mut warped = Mat::default(); + imgproc::warp_perspective( + src, + &mut warped, + &m, + Size::new(dst_w, dst_h), + imgproc::INTER_LINEAR, + core::BORDER_CONSTANT, + Scalar::all(255.0), + ) + .ok()?; + let gray = mat_to_gray(&warped).ok()?; + Some(DynamicImage::ImageLuma8(gray)) + } + + fn gray_to_mat(gray: &GrayImage) -> opencv::Result { + let mat = Mat::from_slice(gray.as_raw())?; + let reshaped = mat.reshape(1, gray.height() as i32)?; + reshaped.try_clone() + } + + fn mat_to_gray(mat: &Mat) -> opencv::Result { + let width = mat.cols().max(0) as u32; + let height = mat.rows().max(0) as u32; + let data = mat.data_bytes()?; + let mut out = GrayImage::new(width, height); + for y in 0..height { + for x in 0..width { + let idx = (y * width + x) as usize; + out.put_pixel(x, y, Luma([data.get(idx).copied().unwrap_or(255)])); + } + } + Ok(out) + } + + fn clahe_variant(src: &Mat) -> opencv::Result { + let mut dst = Mat::default(); + let mut clahe = imgproc::create_clahe(2.0, core::Size::new(8, 8))?; + clahe.apply(src, &mut dst)?; + Ok(dst) + } + + fn adaptive_variant(src: &Mat) -> opencv::Result { + let mut bin = Mat::default(); + imgproc::adaptive_threshold( + src, + &mut bin, + 255.0, + imgproc::ADAPTIVE_THRESH_GAUSSIAN_C, + imgproc::THRESH_BINARY, + 31, + 7.0, + )?; + let kernel = imgproc::get_structuring_element( + imgproc::MORPH_RECT, + core::Size::new(3, 3), + core::Point::new(-1, -1), + )?; + let mut closed = Mat::default(); + imgproc::morphology_ex( + &bin, + &mut closed, + imgproc::MORPH_CLOSE, + &kernel, + core::Point::new(-1, -1), + 1, + core::BORDER_CONSTANT, + core::Scalar::all(255.0), + )?; + Ok(closed) + } +} /// Result type for scanner operations. pub type Result = std::result::Result; @@ -550,6 +1034,20 @@ fn scan_still_with_diagnostics_inner( timings.decode_attempts_micros = elapsed_micros(decode_started); timings.total_micros = elapsed_micros(started); + #[cfg(all(not(target_arch = "wasm32"), feature = "opencv-fallback"))] + if std::env::var_os("GLYPHNET_SCAN_OPENCV").is_some() + && let Some(decoded) = opencv_fallback::try_decode_with_opencv(image) + { + return Ok(StillScanResult { + decoded, + crop: None, + quad: None, + warp_size: None, + attempts, + timings, + }); + } + if std::env::var_os("GLYPHNET_SCAN_DEBUG").is_some() { eprintln!("scan attempts: {attempts:#?}"); }