From 1ec831a6c9bc8047966d924ca083dd3d9fe4658f Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:01:23 +0100 Subject: [PATCH 01/27] frontend: improve rule options UX and visual styling --- .../src/components/Rules/RuleOptionsRow.tsx | 4 +- frontend/src/components/Rules/RulesList.tsx | 69 +++++++++++++++++-- .../src/components/Rules/RulesSection.tsx | 4 +- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/styles.css | 28 ++++---- 6 files changed, 86 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/Rules/RuleOptionsRow.tsx b/frontend/src/components/Rules/RuleOptionsRow.tsx index 66a4a4a..09f860c 100644 --- a/frontend/src/components/Rules/RuleOptionsRow.tsx +++ b/frontend/src/components/Rules/RuleOptionsRow.tsx @@ -64,8 +64,8 @@ export function RuleOptionsRow({ onClick={() => setAllowSubwords(!allowSubwords)} /> setIgnoreAccents(!ignoreAccents)} /> }) { + const pills: ReactNode[] = []; + + if (rule.kind === "regex") { + pills.push( + + .* + + ); + } + if (rule.caseSensitive) { + pills.push( + + Aa + + ); + } + if (!rule.ignoreAccents) { + pills.push( + + ëà + + ); + } + if (rule.kind === "regex" && rule.multiline) { + pills.push( + + ↵ + + ); + } + if (rule.allowSubwords) { + pills.push( + + subword + + ); + } + + if (pills.length === 0) return null; + return
{pills}
; +} + export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; @@ -30,13 +84,13 @@ export function RulesList(props: {
@@ -53,13 +107,14 @@ export function RulesList(props: { display: "flex", alignItems: "center", justifyContent: "space-between", - border: "1px solid rgba(0,0,0,0.10)", + border: "1px solid rgba(47,63,134,0.12)", borderRadius: 10, padding: "10px 12px", gap: 12, minHeight: 58, maxWidth: "100%", overflow: "hidden", + background: "#fff", }} >
@@ -78,6 +133,8 @@ export function RulesList(props: {
{kindLabel(r.kind)}
+ + {r.kind !== "selection" ? : null}
diff --git a/frontend/src/components/Rules/RulesSection.tsx b/frontend/src/components/Rules/RulesSection.tsx index 66cee81..84bb28a 100644 --- a/frontend/src/components/Rules/RulesSection.tsx +++ b/frontend/src/components/Rules/RulesSection.tsx @@ -37,7 +37,7 @@ export function RulesSection(props: { const [draftCaseSensitive, setDraftCaseSensitive] = useState(false); const [draftMultiline, setDraftMultiline] = useState(false); const [draftAllowSubwords, setDraftAllowSubwords] = useState(false); - const [draftIgnoreAccents, setDraftIgnoreAccents] = useState(true); + const [draftIgnoreAccents, setDraftIgnoreAccents] = useState(false); const [editingId, setEditingId] = useState(null); const editingRule = useMemo( @@ -90,7 +90,7 @@ export function RulesSection(props: { setDraftCaseSensitive(false); setDraftMultiline(false); setDraftAllowSubwords(false); - setDraftIgnoreAccents(true); + setDraftIgnoreAccents(false); }; const deleteRule = (id: string) => { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 8354e0d..362c615 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -26,7 +26,6 @@ "rules.option.multiline": "Multiline", "rules.options.label": "Options", "rules.option.subword": "Subword", - "rules.option.ignoreAccents": "Ignore accents", "rules.label.searchType": "Search type", "rules.label.options": "Options", "modal.edit.title": "Edit item", @@ -71,5 +70,6 @@ "rules.badge.request": "Request", "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", - "rules.action.censorPage": "Redact page" + "rules.action.censorPage": "Redact page", + "rules.option.respectAccents": "Respect accents" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 9f40163..4957e73 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -26,7 +26,6 @@ "rules.option.multiline": "Multilignes", "rules.options.label": "Options", "rules.option.subword": "Sous-mot", - "rules.option.ignoreAccents": "Ignorer les accents", "rules.label.searchType": "Type de recherche", "rules.label.options": "Options", "modal.edit.title": "Modifier l’élément", @@ -71,5 +70,6 @@ "rules.badge.request": "Requête", "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", - "rules.action.censorPage": "Censurer la page" + "rules.action.censorPage": "Censurer la page", + "rules.option.respectAccents": "Respecter les accents" } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 5b24599..ee627f3 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -3,7 +3,7 @@ "Segoe UI Emoji"; line-height: 1.4; color: #111; - background: #f6f7fb; + background: #edf2ff; } * { box-sizing: border-box; } @@ -31,7 +31,7 @@ body, .topBand { padding: 10px 12px; - background: #fff; + background: linear-gradient(90deg, #1f2f6b 0%, #2f4aa0 100%); display: flex; justify-content: space-between; gap: 12px; @@ -40,7 +40,7 @@ body, position: sticky; top: 0; z-index: 20; - border-bottom: 1px solid #d8dce8; + border-bottom: 1px solid #23346f; } .topBandLeft { @@ -52,7 +52,7 @@ body, .topBandFileName { font-size: 14px; - color: #333; + color: #e5ebff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -62,14 +62,16 @@ body, .headerRight { display: flex; gap: 8px; } .pill { - border: 1px solid #ddd; - background: #fff; + border: 1px solid #c4cce3; + background: #f8faff; padding: 6px 10px; border-radius: 999px; cursor: pointer; } .pillActive { - border-color: #aaa; + border-color: #2f4aa0; + background: #dfe8ff; + color: #1f2f6b; font-weight: 700; } @@ -78,7 +80,7 @@ body, grid-template-columns: minmax(0, 1fr) 420px; gap: 0; align-items: stretch; - background: #fff; + background: #f7f9ff; min-height: 0; height: 100%; overflow: hidden; @@ -87,7 +89,7 @@ body, .viewerPane { min-height: 0; padding: 10px; - border-right: 1px solid #d8dce8; + border-right: 1px solid #d4dbf0; display: flex; overflow: auto; } @@ -303,13 +305,13 @@ body, .input { width: 100%; - border: 1px solid #ddd; + border: 1px solid #cbd5ea; border-radius: 10px; padding: 10px 12px; outline: none; } .input:focus { - border-color: #aaa; + border-color: #5773cf; } .row { @@ -337,7 +339,7 @@ body, border: 0; border-radius: 10px; padding: 10px 12px; - background: #111; + background: linear-gradient(90deg, #1b2f6d 0%, #2747a2 100%); color: #fff; cursor: pointer; font-weight: 700; @@ -350,7 +352,7 @@ body, .buttonSecondary { margin-top: 10px; width: 100%; - border: 1px solid #ddd; + border: 1px solid #cbd5ea; border-radius: 10px; padding: 10px 12px; background: #fff; From 74881f63b00efd362aa451b0ef0b8863bca8deec Mon Sep 17 00:00:00 2001 From: theodubus <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:14:57 +0100 Subject: [PATCH 02/27] Update RulesList.tsx --- frontend/src/components/Rules/RulesList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index 7b53f0c..c89bf17 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -87,7 +87,7 @@ export function RulesList(props: { border: "1px solid rgba(47,63,134,0.16)", borderRadius: 12, padding: 10, - height: 300, + height: 270, overflowY: "auto", overflowX: "hidden", background: "rgba(255,255,255,0.75)", From 21b5822e5b949c305c575d4fee44483bddc07412 Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:18:54 +0100 Subject: [PATCH 03/27] frontend: adjust rule list height and accent/subword option UX --- .../src/components/Rules/RuleOptionsRow.tsx | 4 +- frontend/src/components/Rules/RulesList.tsx | 69 +++++++++++++++++-- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/styles.css | 28 ++++---- 5 files changed, 84 insertions(+), 25 deletions(-) diff --git a/frontend/src/components/Rules/RuleOptionsRow.tsx b/frontend/src/components/Rules/RuleOptionsRow.tsx index 66a4a4a..09f860c 100644 --- a/frontend/src/components/Rules/RuleOptionsRow.tsx +++ b/frontend/src/components/Rules/RuleOptionsRow.tsx @@ -64,8 +64,8 @@ export function RuleOptionsRow({ onClick={() => setAllowSubwords(!allowSubwords)} /> setIgnoreAccents(!ignoreAccents)} /> }) { + const pills: ReactNode[] = []; + + if (rule.kind === "regex") { + pills.push( + + .* + + ); + } + if (rule.caseSensitive) { + pills.push( + + Aa + + ); + } + if (!rule.ignoreAccents) { + pills.push( + + ëà + + ); + } + if (rule.kind === "regex" && rule.multiline) { + pills.push( + + ↵ + + ); + } + if (rule.allowSubwords) { + pills.push( + + subword + + ); + } + + if (pills.length === 0) return null; + return
{pills}
; +} + export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; @@ -30,13 +84,13 @@ export function RulesList(props: {
@@ -53,13 +107,14 @@ export function RulesList(props: { display: "flex", alignItems: "center", justifyContent: "space-between", - border: "1px solid rgba(0,0,0,0.10)", + border: "1px solid rgba(47,63,134,0.12)", borderRadius: 10, padding: "10px 12px", gap: 12, minHeight: 58, maxWidth: "100%", overflow: "hidden", + background: "#fff", }} >
@@ -78,6 +133,8 @@ export function RulesList(props: {
{kindLabel(r.kind)}
+ + {r.kind !== "selection" ? : null}
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 8354e0d..362c615 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -26,7 +26,6 @@ "rules.option.multiline": "Multiline", "rules.options.label": "Options", "rules.option.subword": "Subword", - "rules.option.ignoreAccents": "Ignore accents", "rules.label.searchType": "Search type", "rules.label.options": "Options", "modal.edit.title": "Edit item", @@ -71,5 +70,6 @@ "rules.badge.request": "Request", "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", - "rules.action.censorPage": "Redact page" + "rules.action.censorPage": "Redact page", + "rules.option.respectAccents": "Respect accents" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 9f40163..4957e73 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -26,7 +26,6 @@ "rules.option.multiline": "Multilignes", "rules.options.label": "Options", "rules.option.subword": "Sous-mot", - "rules.option.ignoreAccents": "Ignorer les accents", "rules.label.searchType": "Type de recherche", "rules.label.options": "Options", "modal.edit.title": "Modifier l’élément", @@ -71,5 +70,6 @@ "rules.badge.request": "Requête", "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", - "rules.action.censorPage": "Censurer la page" + "rules.action.censorPage": "Censurer la page", + "rules.option.respectAccents": "Respecter les accents" } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 5b24599..ee627f3 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -3,7 +3,7 @@ "Segoe UI Emoji"; line-height: 1.4; color: #111; - background: #f6f7fb; + background: #edf2ff; } * { box-sizing: border-box; } @@ -31,7 +31,7 @@ body, .topBand { padding: 10px 12px; - background: #fff; + background: linear-gradient(90deg, #1f2f6b 0%, #2f4aa0 100%); display: flex; justify-content: space-between; gap: 12px; @@ -40,7 +40,7 @@ body, position: sticky; top: 0; z-index: 20; - border-bottom: 1px solid #d8dce8; + border-bottom: 1px solid #23346f; } .topBandLeft { @@ -52,7 +52,7 @@ body, .topBandFileName { font-size: 14px; - color: #333; + color: #e5ebff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -62,14 +62,16 @@ body, .headerRight { display: flex; gap: 8px; } .pill { - border: 1px solid #ddd; - background: #fff; + border: 1px solid #c4cce3; + background: #f8faff; padding: 6px 10px; border-radius: 999px; cursor: pointer; } .pillActive { - border-color: #aaa; + border-color: #2f4aa0; + background: #dfe8ff; + color: #1f2f6b; font-weight: 700; } @@ -78,7 +80,7 @@ body, grid-template-columns: minmax(0, 1fr) 420px; gap: 0; align-items: stretch; - background: #fff; + background: #f7f9ff; min-height: 0; height: 100%; overflow: hidden; @@ -87,7 +89,7 @@ body, .viewerPane { min-height: 0; padding: 10px; - border-right: 1px solid #d8dce8; + border-right: 1px solid #d4dbf0; display: flex; overflow: auto; } @@ -303,13 +305,13 @@ body, .input { width: 100%; - border: 1px solid #ddd; + border: 1px solid #cbd5ea; border-radius: 10px; padding: 10px 12px; outline: none; } .input:focus { - border-color: #aaa; + border-color: #5773cf; } .row { @@ -337,7 +339,7 @@ body, border: 0; border-radius: 10px; padding: 10px 12px; - background: #111; + background: linear-gradient(90deg, #1b2f6d 0%, #2747a2 100%); color: #fff; cursor: pointer; font-weight: 700; @@ -350,7 +352,7 @@ body, .buttonSecondary { margin-top: 10px; width: 100%; - border: 1px solid #ddd; + border: 1px solid #cbd5ea; border-radius: 10px; padding: 10px 12px; background: #fff; From 286c4d9d0ba0d4702fcbf9da7ba2edf2b5ac675a Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:24:18 +0100 Subject: [PATCH 04/27] frontend: make accent option default state visually unambiguous --- .../src/components/Rules/RuleOptionsRow.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 69 +++++++++++++++++-- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/styles.css | 42 +++++++---- 5 files changed, 99 insertions(+), 26 deletions(-) diff --git a/frontend/src/components/Rules/RuleOptionsRow.tsx b/frontend/src/components/Rules/RuleOptionsRow.tsx index 66a4a4a..c4c58fa 100644 --- a/frontend/src/components/Rules/RuleOptionsRow.tsx +++ b/frontend/src/components/Rules/RuleOptionsRow.tsx @@ -23,7 +23,7 @@ function OptionPill(props: { active: boolean; label: string; onClick: () => void return ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..aebc4fa 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Page", + "rules.page.pill": "Page" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..0fcf468 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page", + "rules.page.pill": "Page" } diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..f3d32dd 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,11 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; }; From 5254661908b61635c02205a6d8ede19f3d832ae2 Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:41:31 +0100 Subject: [PATCH 19/27] fix(page-redaction): align page rule labels and ensure full-page apply --- backend/app/redaction.py | 4 ++ backend/tests/test_redact_rectangles.py | 29 +++++++++ frontend/src/App.tsx | 34 +++++++++- frontend/src/components/PdfViewer.tsx | 64 +++++++++++++++++-- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 31 +++++++-- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/types/uiRules.ts | 7 ++ 10 files changed, 168 insertions(+), 21 deletions(-) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..76e8463 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -29,6 +29,7 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -79,7 +80,7 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => (r.kind === "selection" ? r.rects : r.kind === "page" ? [r.rect] : [])); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; @@ -90,6 +91,7 @@ export default function App() { if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); return; } @@ -97,12 +99,14 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); setRules([]); setPresets(EMPTY_PRESETS); }; @@ -135,6 +139,31 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + if (!currentPage) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === currentPage); + if (exists) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${currentPage}`, + pageNumber: currentPage, + rect: { + page: currentPage - 1, + x0: 0, + y0: 0, + x1: Number.MAX_SAFE_INTEGER, + y1: Number.MAX_SAFE_INTEGER, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -192,6 +221,7 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} /> ) : (
0} onAddSelection={addPendingSelection} + canCensorPage={!!currentPage} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..9463e46 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -53,8 +53,9 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,6 +66,7 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); @@ -89,6 +91,7 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); @@ -109,6 +112,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +125,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -205,6 +209,37 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { const selection = window.getSelection(); @@ -265,13 +300,14 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange]); if (error) { return
{error}
; @@ -283,7 +319,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -355,6 +398,17 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -393,7 +447,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..be4d394 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..bad3fed 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..4af1a99 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page" } diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..f3d32dd 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,11 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; }; From 85935e7b25e73c44e60a35fff3bce834819a69d2 Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:56:56 +0100 Subject: [PATCH 20/27] fix(frontend): force image/graphics redaction for full-page rules --- backend/app/redaction.py | 4 ++ backend/tests/test_redact_rectangles.py | 29 +++++++++ frontend/src/App.tsx | 38 ++++++++++- frontend/src/api.ts | 7 +- frontend/src/components/PdfViewer.tsx | 64 +++++++++++++++++-- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 31 +++++++-- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/types/uiRules.ts | 7 ++ 11 files changed, 178 insertions(+), 22 deletions(-) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..4706055 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -29,6 +29,7 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -79,17 +80,20 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => (r.kind === "selection" ? r.rects : r.kind === "page" ? [r.rect] : [])); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); + const loadPdfFile = (pickedFile: File | null) => { clearNotices(); if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); return; } @@ -97,12 +101,14 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); setRules([]); setPresets(EMPTY_PRESETS); }; @@ -135,6 +141,31 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + if (!currentPage) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === currentPage); + if (exists) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${currentPage}`, + pageNumber: currentPage, + rect: { + page: currentPage - 1, + x0: 0, + y0: 0, + x1: Number.MAX_SAFE_INTEGER, + y1: Number.MAX_SAFE_INTEGER, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -157,6 +188,8 @@ export default function App() { rects: rectsForApi, rules: rulesForApi, presets: selectedPresets, + applyImages: hasFullPageRule, + applyGraphics: hasFullPageRule, }); downloadBlob(r.pdfBlob, "redacted.pdf"); @@ -192,6 +225,7 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} /> ) : (
0} onAddSelection={addPendingSelection} + canCensorPage={!!currentPage} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 360248a..ee9916c 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -70,6 +70,8 @@ export async function redactApply(params: { rects: RectInput[]; rules: RuleInput[]; presets: PresetKey[]; + applyImages?: boolean; + applyGraphics?: boolean; }): Promise { const form = new FormData(); form.append("file", params.file); @@ -111,7 +113,10 @@ export async function redactApply(params: { searches, regexes, presets: hasPresets ? { presets: params.presets, scope: { pages: null as null } } : null, - options: {}, + options: { + apply_images: !!params.applyImages, + apply_graphics: !!params.applyGraphics, + }, // audit additionnel facultatif : on laisse null (audit_plan gère déjà search/regex/presets) audit: null, }; diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..9463e46 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -53,8 +53,9 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,6 +66,7 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); @@ -89,6 +91,7 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); @@ -109,6 +112,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +125,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -205,6 +209,37 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { const selection = window.getSelection(); @@ -265,13 +300,14 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange]); if (error) { return
{error}
; @@ -283,7 +319,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -355,6 +398,17 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -393,7 +447,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..be4d394 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..bad3fed 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..4af1a99 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page" } diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..f3d32dd 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,11 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; }; From 8a61158b0c6d5f2fd940fd7a4012cb7520d05307 Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 20:05:52 +0100 Subject: [PATCH 21/27] fix(frontend): use real page dimensions for full-page redaction rects --- backend/app/redaction.py | 4 ++ backend/tests/test_redact_rectangles.py | 29 ++++++++ frontend/src/App.tsx | 54 ++++++++++++++- frontend/src/api.ts | 7 +- frontend/src/components/PdfViewer.tsx | 68 +++++++++++++++++-- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 31 +++++++-- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/types/uiRules.ts | 7 ++ 11 files changed, 197 insertions(+), 23 deletions(-) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..e2e7ef4 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -29,6 +29,8 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); + const [pageSizes, setPageSizes] = useState>({}); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -79,17 +81,21 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => (r.kind === "selection" ? r.rects : r.kind === "page" ? [r.rect] : [])); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); + const loadPdfFile = (pickedFile: File | null) => { clearNotices(); if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); + setPageSizes({}); return; } @@ -97,12 +103,16 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); + setPageSizes({}); setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); + setPageSizes({}); setRules([]); setPresets(EMPTY_PRESETS); }; @@ -124,6 +134,7 @@ export default function App() { const trimmed = pendingSelection.text.trim(); if (!trimmed || pendingSelection.rects.length === 0) return; + const newRule: UiRule = { id: newId(), kind: "selection", @@ -135,6 +146,35 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + const pageNumber = currentPage; + if (!pageNumber) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === pageNumber); + if (exists) return; + + const pageSize = pageSizes[pageNumber]; + if (!pageSize) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${pageNumber}`, + pageNumber, + rect: { + page: pageNumber - 1, + x0: 0, + y0: 0, + x1: pageSize.width, + y1: pageSize.height, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -157,6 +197,8 @@ export default function App() { rects: rectsForApi, rules: rulesForApi, presets: selectedPresets, + applyImages: hasFullPageRule, + applyGraphics: hasFullPageRule, }); downloadBlob(r.pdfBlob, "redacted.pdf"); @@ -192,6 +234,14 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} + onPageSizeChange={(pageNumber, size) => { + setPageSizes((prev) => { + const existing = prev[pageNumber]; + if (existing && existing.width === size.width && existing.height === size.height) return prev; + return { ...prev, [pageNumber]: size }; + }); + }} /> ) : (
0} onAddSelection={addPendingSelection} + canCensorPage={!!currentPage && !!pageSizes[currentPage]} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 360248a..ee9916c 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -70,6 +70,8 @@ export async function redactApply(params: { rects: RectInput[]; rules: RuleInput[]; presets: PresetKey[]; + applyImages?: boolean; + applyGraphics?: boolean; }): Promise { const form = new FormData(); form.append("file", params.file); @@ -111,7 +113,10 @@ export async function redactApply(params: { searches, regexes, presets: hasPresets ? { presets: params.presets, scope: { pages: null as null } } : null, - options: {}, + options: { + apply_images: !!params.applyImages, + apply_graphics: !!params.applyGraphics, + }, // audit additionnel facultatif : on laisse null (audit_plan gère déjà search/regex/presets) audit: null, }; diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..e59caec 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -53,8 +53,10 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; + onPageSizeChange: (pageNumber: number, size: { width: number; height: number }) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange, onPageSizeChange } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,6 +67,7 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); @@ -89,6 +92,7 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); @@ -109,6 +113,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +126,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -140,6 +145,7 @@ export function PdfViewer(props: { const page = await pdfDoc.getPage(pageNumber); const baseViewport = page.getViewport({ scale: 1 }); + onPageSizeChange(pageNumber, { width: baseViewport.width, height: baseViewport.height }); const scale = containerWidth / baseViewport.width; const viewport = page.getViewport({ scale }); @@ -194,7 +200,7 @@ export function PdfViewer(props: { return () => { cancelled = true; }; - }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys]); + }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys, onPageSizeChange]); useEffect(() => { for (const [index, textLayer] of textLayerRefs.current.entries()) { @@ -205,6 +211,37 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { const selection = window.getSelection(); @@ -265,13 +302,14 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange]); if (error) { return
{error}
; @@ -283,7 +321,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -355,6 +400,17 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -393,7 +449,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..be4d394 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..bad3fed 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..4af1a99 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page" } diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..f3d32dd 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,11 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; }; From 52924a60c1d138ab8cc8e86f80aff9f913a5450e Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 20:15:35 +0100 Subject: [PATCH 22/27] fix(frontend): stabilize text selection by memoizing page size callback --- backend/app/redaction.py | 4 ++ backend/tests/test_redact_rectangles.py | 29 ++++++++ frontend/src/App.tsx | 58 +++++++++++++++- frontend/src/api.ts | 7 +- frontend/src/components/PdfViewer.tsx | 68 +++++++++++++++++-- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 31 +++++++-- frontend/src/locales/en.json | 4 +- frontend/src/locales/fr.json | 4 +- frontend/src/types/uiRules.ts | 7 ++ 11 files changed, 200 insertions(+), 24 deletions(-) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..58b8e78 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useRef, useState } from "react"; +import React, { useCallback, useMemo, useRef, useState } from "react"; import { useI18n } from "./i18n"; import { redactApply } from "./api"; import type { PresetKey, RuleInput } from "./api"; @@ -29,6 +29,8 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); + const [pageSizes, setPageSizes] = useState>({}); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -79,17 +81,29 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => (r.kind === "selection" ? r.rects : r.kind === "page" ? [r.rect] : [])); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); + + const handlePageSizeChange = useCallback((pageNumber: number, size: { width: number; height: number }) => { + setPageSizes((prev) => { + const existing = prev[pageNumber]; + if (existing && existing.width === size.width && existing.height === size.height) return prev; + return { ...prev, [pageNumber]: size }; + }); + }, []); + const loadPdfFile = (pickedFile: File | null) => { clearNotices(); if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); + setPageSizes({}); return; } @@ -97,12 +111,16 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); + setPageSizes({}); setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); + setPageSizes({}); setRules([]); setPresets(EMPTY_PRESETS); }; @@ -124,6 +142,7 @@ export default function App() { const trimmed = pendingSelection.text.trim(); if (!trimmed || pendingSelection.rects.length === 0) return; + const newRule: UiRule = { id: newId(), kind: "selection", @@ -135,6 +154,35 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + const pageNumber = currentPage; + if (!pageNumber) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === pageNumber); + if (exists) return; + + const pageSize = pageSizes[pageNumber]; + if (!pageSize) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${pageNumber}`, + pageNumber, + rect: { + page: pageNumber - 1, + x0: 0, + y0: 0, + x1: pageSize.width, + y1: pageSize.height, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -157,6 +205,8 @@ export default function App() { rects: rectsForApi, rules: rulesForApi, presets: selectedPresets, + applyImages: hasFullPageRule, + applyGraphics: hasFullPageRule, }); downloadBlob(r.pdfBlob, "redacted.pdf"); @@ -192,6 +242,8 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} + onPageSizeChange={handlePageSizeChange} /> ) : (
0} onAddSelection={addPendingSelection} + canCensorPage={!!currentPage && !!pageSizes[currentPage]} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 360248a..ee9916c 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -70,6 +70,8 @@ export async function redactApply(params: { rects: RectInput[]; rules: RuleInput[]; presets: PresetKey[]; + applyImages?: boolean; + applyGraphics?: boolean; }): Promise { const form = new FormData(); form.append("file", params.file); @@ -111,7 +113,10 @@ export async function redactApply(params: { searches, regexes, presets: hasPresets ? { presets: params.presets, scope: { pages: null as null } } : null, - options: {}, + options: { + apply_images: !!params.applyImages, + apply_graphics: !!params.applyGraphics, + }, // audit additionnel facultatif : on laisse null (audit_plan gère déjà search/regex/presets) audit: null, }; diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..e59caec 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -53,8 +53,10 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; + onPageSizeChange: (pageNumber: number, size: { width: number; height: number }) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange, onPageSizeChange } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,6 +67,7 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); @@ -89,6 +92,7 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); @@ -109,6 +113,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +126,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -140,6 +145,7 @@ export function PdfViewer(props: { const page = await pdfDoc.getPage(pageNumber); const baseViewport = page.getViewport({ scale: 1 }); + onPageSizeChange(pageNumber, { width: baseViewport.width, height: baseViewport.height }); const scale = containerWidth / baseViewport.width; const viewport = page.getViewport({ scale }); @@ -194,7 +200,7 @@ export function PdfViewer(props: { return () => { cancelled = true; }; - }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys]); + }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys, onPageSizeChange]); useEffect(() => { for (const [index, textLayer] of textLayerRefs.current.entries()) { @@ -205,6 +211,37 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { const selection = window.getSelection(); @@ -265,13 +302,14 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange]); if (error) { return
{error}
; @@ -283,7 +321,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -355,6 +400,17 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -393,7 +449,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..be4d394 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..bad3fed 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..4af1a99 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,7 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page" } diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..f3d32dd 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,11 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; }; From 4f3603988642a65d7c21527e679ed0bb9ce11c54 Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Sun, 15 Feb 2026 22:37:26 +0100 Subject: [PATCH 23/27] feat(frontend): add draw-rectangle redaction workflow --- backend/app/redaction.py | 4 + backend/tests/test_redact_rectangles.py | 29 +++ frontend/src/App.tsx | 90 +++++++- frontend/src/api.ts | 7 +- frontend/src/components/PdfViewer.tsx | 198 +++++++++++++++++- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 46 +++- frontend/src/locales/en.json | 7 +- frontend/src/locales/fr.json | 7 +- frontend/src/styles.css | 38 ++++ frontend/src/types/uiRules.ts | 15 ++ 12 files changed, 426 insertions(+), 27 deletions(-) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..b653fde 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useRef, useState } from "react"; +import React, { useCallback, useMemo, useRef, useState } from "react"; import { useI18n } from "./i18n"; import { redactApply } from "./api"; import type { PresetKey, RuleInput } from "./api"; @@ -29,6 +29,9 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); + const [pageSizes, setPageSizes] = useState>({}); + const [isDrawingRect, setIsDrawingRect] = useState(false); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -42,6 +45,7 @@ export default function App() { } | null>(null); const fileInputRef = useRef(null); + const nextRectangleNumberRef = useRef(1); const clearNotices = () => { setErrorInfo(null); @@ -79,17 +83,33 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => + r.kind === "selection" ? r.rects : r.kind === "page" || r.kind === "rectangle" ? [r.rect] : [] + ); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); + + const handlePageSizeChange = useCallback((pageNumber: number, size: { width: number; height: number }) => { + setPageSizes((prev) => { + const existing = prev[pageNumber]; + if (existing && existing.width === size.width && existing.height === size.height) return prev; + return { ...prev, [pageNumber]: size }; + }); + }, []); + const loadPdfFile = (pickedFile: File | null) => { clearNotices(); if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; return; } @@ -97,12 +117,20 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; setRules([]); setPresets(EMPTY_PRESETS); }; @@ -124,6 +152,7 @@ export default function App() { const trimmed = pendingSelection.text.trim(); if (!trimmed || pendingSelection.rects.length === 0) return; + const newRule: UiRule = { id: newId(), kind: "selection", @@ -135,6 +164,53 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + const pageNumber = currentPage; + if (!pageNumber) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === pageNumber); + if (exists) return; + + const pageSize = pageSizes[pageNumber]; + if (!pageSize) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${pageNumber}`, + pageNumber, + rect: { + page: pageNumber - 1, + x0: 0, + y0: 0, + x1: pageSize.width, + y1: pageSize.height, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + + + const addDrawnRectangleRule = (params: { pageNumber: number; rect: UiRect }) => { + clearNotices(); + const rectangleNumber = nextRectangleNumberRef.current; + nextRectangleNumberRef.current += 1; + + const newRule: UiRule = { + id: newId(), + kind: "rectangle", + value: `${t("rules.rectangle.title")} ${rectangleNumber} (${t("rules.page.title")} ${params.pageNumber})`, + rectangleNumber, + pageNumber: params.pageNumber, + rect: params.rect, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -157,6 +233,8 @@ export default function App() { rects: rectsForApi, rules: rulesForApi, presets: selectedPresets, + applyImages: hasFullPageRule, + applyGraphics: hasFullPageRule, }); downloadBlob(r.pdfBlob, "redacted.pdf"); @@ -192,6 +270,10 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} + onPageSizeChange={handlePageSizeChange} + isDrawingRect={isDrawingRect} + onAddDrawnRect={addDrawnRectangleRule} /> ) : (
0} onAddSelection={addPendingSelection} + isDrawingRect={isDrawingRect} + onToggleDrawSelection={() => setIsDrawingRect((prev) => !prev)} + canCensorPage={!!currentPage && !!pageSizes[currentPage]} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 360248a..ee9916c 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -70,6 +70,8 @@ export async function redactApply(params: { rects: RectInput[]; rules: RuleInput[]; presets: PresetKey[]; + applyImages?: boolean; + applyGraphics?: boolean; }): Promise { const form = new FormData(); form.append("file", params.file); @@ -111,7 +113,10 @@ export async function redactApply(params: { searches, regexes, presets: hasPresets ? { presets: params.presets, scope: { pages: null as null } } : null, - options: {}, + options: { + apply_images: !!params.applyImages, + apply_graphics: !!params.applyGraphics, + }, // audit additionnel facultatif : on laisse null (audit_plan gère déjà search/regex/presets) audit: null, }; diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..4389c8a 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useRef, useState } from "react"; +import type { PointerEvent as ReactPointerEvent } from "react"; import type { PresetKey } from "../api"; import type { UiRect, UiRule } from "../types/uiRules"; @@ -28,6 +29,15 @@ type PdfDocumentProxy = { destroy: () => void; }; + +type DrawDraft = { + pageIndex: number; + startX: number; + startY: number; + currentX: number; + currentY: number; +}; + type PdfJsLib = { GlobalWorkerOptions: { workerSrc: string }; getDocument: (params: { data: Uint8Array }) => { promise: Promise }; @@ -53,8 +63,12 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; + onPageSizeChange: (pageNumber: number, size: { width: number; height: number }) => void; + isDrawingRect: boolean; + onAddDrawnRect: (params: { pageNumber: number; rect: UiRect }) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange, onPageSizeChange, isDrawingRect, onAddDrawnRect } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,8 +79,10 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); + const [drawDraft, setDrawDraft] = useState(null); useEffect(() => { const el = containerRef.current; @@ -89,10 +105,12 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); setIsLoading(true); + setDrawDraft(null); (async () => { try { @@ -109,6 +127,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +140,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -140,6 +159,7 @@ export function PdfViewer(props: { const page = await pdfDoc.getPage(pageNumber); const baseViewport = page.getViewport({ scale: 1 }); + onPageSizeChange(pageNumber, { width: baseViewport.width, height: baseViewport.height }); const scale = containerWidth / baseViewport.width; const viewport = page.getViewport({ scale }); @@ -194,7 +214,7 @@ export function PdfViewer(props: { return () => { cancelled = true; }; - }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys]); + }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys, onPageSizeChange]); useEffect(() => { for (const [index, textLayer] of textLayerRefs.current.entries()) { @@ -205,8 +225,44 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { + if (isDrawingRect) { + onSelectionChange(null); + return; + } + const selection = window.getSelection(); if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { onSelectionChange(null); @@ -265,13 +321,84 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange, isDrawingRect]); + + + const clampPoint = (value: number, max: number) => Math.max(0, Math.min(value, max)); + + const beginDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect) return; + + const layer = event.currentTarget; + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + layer.setPointerCapture(event.pointerId); + setDrawDraft({ pageIndex, startX: x, startY: y, currentX: x, currentY: y }); + event.preventDefault(); + }; + + const moveDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect || !drawDraft || drawDraft.pageIndex !== pageIndex) return; + + const layer = event.currentTarget; + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + setDrawDraft((prev) => (prev && prev.pageIndex === pageIndex ? { ...prev, currentX: x, currentY: y } : prev)); + event.preventDefault(); + }; + + const endDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect || !drawDraft || drawDraft.pageIndex !== pageIndex) return; + + const layer = event.currentTarget; + if (layer.hasPointerCapture(event.pointerId)) { + layer.releasePointerCapture(event.pointerId); + } + + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + const left = Math.min(drawDraft.startX, x); + const right = Math.max(drawDraft.startX, x); + const top = Math.min(drawDraft.startY, y); + const bottom = Math.max(drawDraft.startY, y); + + const minSize = 4; + if (right - left >= minSize && bottom - top >= minSize) { + const scale = pageScalesRef.current[pageIndex] ?? 1; + if (scale > 0) { + onAddDrawnRect({ + pageNumber: pageIndex + 1, + rect: { + page: pageIndex, + x0: left / scale, + y0: top / scale, + x1: right / scale, + y1: bottom / scale, + }, + }); + } + } + + setDrawDraft(null); + event.preventDefault(); + }; + + const cancelDraw = () => { + if (drawDraft) setDrawDraft(null); + }; if (error) { return
{error}
; @@ -283,7 +410,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -297,7 +431,26 @@ export function PdfViewer(props: { }} />
beginDraw(pageNumber - 1, event)} + onPointerMove={(event) => moveDraw(pageNumber - 1, event)} + onPointerUp={(event) => endDraw(pageNumber - 1, event)} + onPointerCancel={cancelDraw} + > + {drawDraft && drawDraft.pageIndex === pageNumber - 1 ? ( +
+ ) : null} +
+
{ textLayerRefs.current[pageNumber - 1] = el; }} @@ -355,6 +508,29 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + + const rectangleRules = rules.filter((r): r is Extract => r.kind === "rectangle"); + for (const rectangleRule of rectangleRules) { + if (rectangleRule.pageNumber !== pageIndex + 1) continue; + const rect = rectangleRule.rect; + drawPreviewRect(previewLayer, { + left: rect.x0 * scale, + top: rect.y0 * scale, + width: (rect.x1 - rect.x0) * scale, + height: (rect.y1 - rect.y0) * scale, + }, String(rectangleRule.rectangleNumber)); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -372,6 +548,7 @@ function applyPreviewHighlights( function drawPreviewRect( previewLayer: HTMLDivElement, rect: { left: number; top: number; width: number; height: number }, + label?: string, ) { const width = rect.width; const height = rect.height; @@ -383,6 +560,13 @@ function drawPreviewRect( highlight.style.top = `${rect.top}px`; highlight.style.width = `${width}px`; highlight.style.height = `${height}px`; + if (label) { + const badge = document.createElement("div"); + badge.className = "redactionPreviewRectLabel"; + badge.textContent = label; + highlight.appendChild(badge); + } + previewLayer.appendChild(highlight); } @@ -393,7 +577,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page" || rule.kind === "rectangle") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..6e28fb7 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page" | "rectangle") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" && r.kind !== "rectangle" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" && r.kind !== "rectangle" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..714abb1 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,10 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page", + "rules.badge.rectangle": "Rectangle", + "rules.rectangle.title": "Rectangle", + "rules.action.stopDrawingSelection": "Stop drawing" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..2eb43f8 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,10 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page", + "rules.badge.rectangle": "Rectangle", + "rules.rectangle.title": "Rectangle", + "rules.action.stopDrawingSelection": "Arrêter dessin" } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index f076b77..bd7c0e6 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -281,6 +281,44 @@ body, box-shadow: inset 0 0 0 1px rgba(32, 93, 220, 0.24); } + +.pdfDrawLayer { + position: absolute; + inset: 0; + z-index: 4; + pointer-events: none; +} + +.pdfDrawLayerActive { + pointer-events: auto; + cursor: crosshair; +} + +.pdfTextLayerNoPointer { + pointer-events: none; + user-select: none; + -webkit-user-select: none; +} + +.redactionPreviewRectLabel { + position: absolute; + top: 0; + right: 0; + min-width: 26px; + height: 26px; + padding: 2px 8px; + display: inline-flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 20px; + color: #1e66c2; + background: rgba(255, 255, 255, 0.6); + border-left: 1px solid rgba(32, 93, 220, 0.5); + border-bottom: 1px solid rgba(32, 93, 220, 0.5); +} + + .pdfTextLayer br, .textLayer br { position: absolute; diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..e7aa355 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,19 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; + } + | { + id: string; + kind: "rectangle"; + value: string; + rectangleNumber: number; + pageNumber: number; + rect: UiRect; }; From 9fc664b0ee8190e4cf79bdf63023055f1964347f Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:08:47 +0100 Subject: [PATCH 24/27] feat(frontend): enable strict redaction options for rectangle draws --- backend/app/redaction.py | 4 + backend/tests/test_redact_rectangles.py | 29 +++ frontend/src/App.tsx | 94 ++++++++- frontend/src/api.ts | 13 +- frontend/src/components/PdfViewer.tsx | 198 +++++++++++++++++- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 46 +++- frontend/src/locales/en.json | 7 +- frontend/src/locales/fr.json | 7 +- frontend/src/styles.css | 38 ++++ frontend/src/types/uiRules.ts | 15 ++ 12 files changed, 436 insertions(+), 27 deletions(-) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..765714c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useRef, useState } from "react"; +import React, { useCallback, useMemo, useRef, useState } from "react"; import { useI18n } from "./i18n"; import { redactApply } from "./api"; import type { PresetKey, RuleInput } from "./api"; @@ -29,6 +29,9 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); + const [pageSizes, setPageSizes] = useState>({}); + const [isDrawingRect, setIsDrawingRect] = useState(false); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -42,6 +45,7 @@ export default function App() { } | null>(null); const fileInputRef = useRef(null); + const nextRectangleNumberRef = useRef(1); const clearNotices = () => { setErrorInfo(null); @@ -79,17 +83,34 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => + r.kind === "selection" ? r.rects : r.kind === "page" || r.kind === "rectangle" ? [r.rect] : [] + ); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); + const hasRectangleRule = useMemo(() => rules.some((r) => r.kind === "rectangle"), [rules]); + + const handlePageSizeChange = useCallback((pageNumber: number, size: { width: number; height: number }) => { + setPageSizes((prev) => { + const existing = prev[pageNumber]; + if (existing && existing.width === size.width && existing.height === size.height) return prev; + return { ...prev, [pageNumber]: size }; + }); + }, []); + const loadPdfFile = (pickedFile: File | null) => { clearNotices(); if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; return; } @@ -97,12 +118,20 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; setRules([]); setPresets(EMPTY_PRESETS); }; @@ -124,6 +153,7 @@ export default function App() { const trimmed = pendingSelection.text.trim(); if (!trimmed || pendingSelection.rects.length === 0) return; + const newRule: UiRule = { id: newId(), kind: "selection", @@ -135,6 +165,53 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + const pageNumber = currentPage; + if (!pageNumber) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === pageNumber); + if (exists) return; + + const pageSize = pageSizes[pageNumber]; + if (!pageSize) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${pageNumber}`, + pageNumber, + rect: { + page: pageNumber - 1, + x0: 0, + y0: 0, + x1: pageSize.width, + y1: pageSize.height, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + + + const addDrawnRectangleRule = (params: { pageNumber: number; rect: UiRect }) => { + clearNotices(); + const rectangleNumber = nextRectangleNumberRef.current; + nextRectangleNumberRef.current += 1; + + const newRule: UiRule = { + id: newId(), + kind: "rectangle", + value: `${t("rules.rectangle.title")} ${rectangleNumber} (${t("rules.page.title")} ${params.pageNumber})`, + rectangleNumber, + pageNumber: params.pageNumber, + rect: params.rect, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -157,6 +234,11 @@ export default function App() { rects: rectsForApi, rules: rulesForApi, presets: selectedPresets, + applyImages: hasFullPageRule || hasRectangleRule, + applyGraphics: hasFullPageRule || hasRectangleRule, + sanitizeMetadata: true, + removeAnnotations: true, + removeAttachments: true, }); downloadBlob(r.pdfBlob, "redacted.pdf"); @@ -192,6 +274,10 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} + onPageSizeChange={handlePageSizeChange} + isDrawingRect={isDrawingRect} + onAddDrawnRect={addDrawnRectangleRule} /> ) : (
0} onAddSelection={addPendingSelection} + isDrawingRect={isDrawingRect} + onToggleDrawSelection={() => setIsDrawingRect((prev) => !prev)} + canCensorPage={!!currentPage && !!pageSizes[currentPage]} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 360248a..fecc924 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -70,6 +70,11 @@ export async function redactApply(params: { rects: RectInput[]; rules: RuleInput[]; presets: PresetKey[]; + applyImages?: boolean; + applyGraphics?: boolean; + sanitizeMetadata?: boolean; + removeAnnotations?: boolean; + removeAttachments?: boolean; }): Promise { const form = new FormData(); form.append("file", params.file); @@ -111,7 +116,13 @@ export async function redactApply(params: { searches, regexes, presets: hasPresets ? { presets: params.presets, scope: { pages: null as null } } : null, - options: {}, + options: { + apply_images: !!params.applyImages, + apply_graphics: !!params.applyGraphics, + sanitize_metadata: !!params.sanitizeMetadata, + remove_annotations: !!params.removeAnnotations, + remove_attachments: !!params.removeAttachments, + }, // audit additionnel facultatif : on laisse null (audit_plan gère déjà search/regex/presets) audit: null, }; diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..4389c8a 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useRef, useState } from "react"; +import type { PointerEvent as ReactPointerEvent } from "react"; import type { PresetKey } from "../api"; import type { UiRect, UiRule } from "../types/uiRules"; @@ -28,6 +29,15 @@ type PdfDocumentProxy = { destroy: () => void; }; + +type DrawDraft = { + pageIndex: number; + startX: number; + startY: number; + currentX: number; + currentY: number; +}; + type PdfJsLib = { GlobalWorkerOptions: { workerSrc: string }; getDocument: (params: { data: Uint8Array }) => { promise: Promise }; @@ -53,8 +63,12 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; + onPageSizeChange: (pageNumber: number, size: { width: number; height: number }) => void; + isDrawingRect: boolean; + onAddDrawnRect: (params: { pageNumber: number; rect: UiRect }) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange, onPageSizeChange, isDrawingRect, onAddDrawnRect } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,8 +79,10 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); + const [drawDraft, setDrawDraft] = useState(null); useEffect(() => { const el = containerRef.current; @@ -89,10 +105,12 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); setIsLoading(true); + setDrawDraft(null); (async () => { try { @@ -109,6 +127,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +140,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -140,6 +159,7 @@ export function PdfViewer(props: { const page = await pdfDoc.getPage(pageNumber); const baseViewport = page.getViewport({ scale: 1 }); + onPageSizeChange(pageNumber, { width: baseViewport.width, height: baseViewport.height }); const scale = containerWidth / baseViewport.width; const viewport = page.getViewport({ scale }); @@ -194,7 +214,7 @@ export function PdfViewer(props: { return () => { cancelled = true; }; - }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys]); + }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys, onPageSizeChange]); useEffect(() => { for (const [index, textLayer] of textLayerRefs.current.entries()) { @@ -205,8 +225,44 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { + if (isDrawingRect) { + onSelectionChange(null); + return; + } + const selection = window.getSelection(); if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { onSelectionChange(null); @@ -265,13 +321,84 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange, isDrawingRect]); + + + const clampPoint = (value: number, max: number) => Math.max(0, Math.min(value, max)); + + const beginDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect) return; + + const layer = event.currentTarget; + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + layer.setPointerCapture(event.pointerId); + setDrawDraft({ pageIndex, startX: x, startY: y, currentX: x, currentY: y }); + event.preventDefault(); + }; + + const moveDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect || !drawDraft || drawDraft.pageIndex !== pageIndex) return; + + const layer = event.currentTarget; + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + setDrawDraft((prev) => (prev && prev.pageIndex === pageIndex ? { ...prev, currentX: x, currentY: y } : prev)); + event.preventDefault(); + }; + + const endDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect || !drawDraft || drawDraft.pageIndex !== pageIndex) return; + + const layer = event.currentTarget; + if (layer.hasPointerCapture(event.pointerId)) { + layer.releasePointerCapture(event.pointerId); + } + + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + const left = Math.min(drawDraft.startX, x); + const right = Math.max(drawDraft.startX, x); + const top = Math.min(drawDraft.startY, y); + const bottom = Math.max(drawDraft.startY, y); + + const minSize = 4; + if (right - left >= minSize && bottom - top >= minSize) { + const scale = pageScalesRef.current[pageIndex] ?? 1; + if (scale > 0) { + onAddDrawnRect({ + pageNumber: pageIndex + 1, + rect: { + page: pageIndex, + x0: left / scale, + y0: top / scale, + x1: right / scale, + y1: bottom / scale, + }, + }); + } + } + + setDrawDraft(null); + event.preventDefault(); + }; + + const cancelDraw = () => { + if (drawDraft) setDrawDraft(null); + }; if (error) { return
{error}
; @@ -283,7 +410,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -297,7 +431,26 @@ export function PdfViewer(props: { }} />
beginDraw(pageNumber - 1, event)} + onPointerMove={(event) => moveDraw(pageNumber - 1, event)} + onPointerUp={(event) => endDraw(pageNumber - 1, event)} + onPointerCancel={cancelDraw} + > + {drawDraft && drawDraft.pageIndex === pageNumber - 1 ? ( +
+ ) : null} +
+
{ textLayerRefs.current[pageNumber - 1] = el; }} @@ -355,6 +508,29 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + + const rectangleRules = rules.filter((r): r is Extract => r.kind === "rectangle"); + for (const rectangleRule of rectangleRules) { + if (rectangleRule.pageNumber !== pageIndex + 1) continue; + const rect = rectangleRule.rect; + drawPreviewRect(previewLayer, { + left: rect.x0 * scale, + top: rect.y0 * scale, + width: (rect.x1 - rect.x0) * scale, + height: (rect.y1 - rect.y0) * scale, + }, String(rectangleRule.rectangleNumber)); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -372,6 +548,7 @@ function applyPreviewHighlights( function drawPreviewRect( previewLayer: HTMLDivElement, rect: { left: number; top: number; width: number; height: number }, + label?: string, ) { const width = rect.width; const height = rect.height; @@ -383,6 +560,13 @@ function drawPreviewRect( highlight.style.top = `${rect.top}px`; highlight.style.width = `${width}px`; highlight.style.height = `${height}px`; + if (label) { + const badge = document.createElement("div"); + badge.className = "redactionPreviewRectLabel"; + badge.textContent = label; + highlight.appendChild(badge); + } + previewLayer.appendChild(highlight); } @@ -393,7 +577,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page" || rule.kind === "rectangle") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..6e28fb7 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page" | "rectangle") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" && r.kind !== "rectangle" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" && r.kind !== "rectangle" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..714abb1 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,10 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page", + "rules.badge.rectangle": "Rectangle", + "rules.rectangle.title": "Rectangle", + "rules.action.stopDrawingSelection": "Stop drawing" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..2eb43f8 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,10 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page", + "rules.badge.rectangle": "Rectangle", + "rules.rectangle.title": "Rectangle", + "rules.action.stopDrawingSelection": "Arrêter dessin" } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index f076b77..bd7c0e6 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -281,6 +281,44 @@ body, box-shadow: inset 0 0 0 1px rgba(32, 93, 220, 0.24); } + +.pdfDrawLayer { + position: absolute; + inset: 0; + z-index: 4; + pointer-events: none; +} + +.pdfDrawLayerActive { + pointer-events: auto; + cursor: crosshair; +} + +.pdfTextLayerNoPointer { + pointer-events: none; + user-select: none; + -webkit-user-select: none; +} + +.redactionPreviewRectLabel { + position: absolute; + top: 0; + right: 0; + min-width: 26px; + height: 26px; + padding: 2px 8px; + display: inline-flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 20px; + color: #1e66c2; + background: rgba(255, 255, 255, 0.6); + border-left: 1px solid rgba(32, 93, 220, 0.5); + border-bottom: 1px solid rgba(32, 93, 220, 0.5); +} + + .pdfTextLayer br, .textLayer br { position: absolute; diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..e7aa355 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,19 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; + } + | { + id: string; + kind: "rectangle"; + value: string; + rectangleNumber: number; + pageNumber: number; + rect: UiRect; }; From 698b61c3814e08ad31c07600b279d0922a992537 Mon Sep 17 00:00:00 2001 From: Theo <80580619+theodubus@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:37:14 +0100 Subject: [PATCH 25/27] docs: expand product, security, contribution, and deployment guides --- CONTRIBUTING.md | 72 +++++++ README.md | 177 ++++++++++++++-- backend/app/redaction.py | 4 + backend/tests/test_redact_rectangles.py | 29 +++ docs/DEPLOYMENT.md | 124 +++++++++++ docs/SECURITY.md | 61 ++++-- frontend/src/App.tsx | 94 ++++++++- frontend/src/api.ts | 13 +- frontend/src/components/PdfViewer.tsx | 198 +++++++++++++++++- .../src/components/Rules/EditRuleModal.tsx | 6 +- frontend/src/components/Rules/RulesList.tsx | 6 +- .../src/components/Rules/RulesSection.tsx | 46 +++- frontend/src/locales/en.json | 7 +- frontend/src/locales/fr.json | 7 +- frontend/src/styles.css | 38 ++++ frontend/src/types/uiRules.ts | 15 ++ 16 files changed, 833 insertions(+), 64 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docs/DEPLOYMENT.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..382690d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,72 @@ +# Contributing to RedactPDF + +Merci pour ta contribution ❤️ + +## Objectif du projet + +RedactPDF vise un caviardage PDF **réellement destructif** (sur l’export), avec audit post-traitement. + +## Principes de contribution + +1. **Priorité sécurité** + - Toute modif qui peut impacter la suppression réelle des données doit être testée. +2. **Ne pas casser l’audit** + - Si l’audit échoue, l’export ne doit pas être livré comme succès. +3. **Reproductibilité** + - Favoriser des fixtures déterministes et des tests automatisés. + +## Setup local + +### Backend +```bash +pip install -e "backend[dev]" +cd backend +uvicorn app.main:app --reload +``` + +### Frontend +```bash +cd frontend +npm install +npm run dev +``` + +## Tests + +Voir [docs/TESTING.md](docs/TESTING.md). + +En bref: +```bash +cd backend +pytest +ruff check . +``` + +Frontend: +```bash +cd frontend +npm run build +``` + +## Pull requests + +Merci d’inclure dans la PR: + +- **Contexte**: problème observé / besoin métier +- **Solution**: ce qui change techniquement +- **Impact sécurité**: texte/images/graphics/metadata/annotations/attachments +- **Validation**: commandes et résultats +- **Limites** éventuelles + +## Zones sensibles (à relire attentivement) + +- `backend/app/redaction.py` +- `backend/app/audit.py` et pipeline associé +- `frontend/src/components/PdfViewer.tsx` +- `frontend/src/api.ts` + +## Bonnes pratiques produit + +- Préférer des comportements explicitement “strict” pour les usages sensibles +- Documenter clairement les limites (PDF aplatis, scans, OCR, etc.) +- Éviter les promesses de sécurité non vérifiées diff --git a/README.md b/README.md index 84f73d4..ad9bca7 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,178 @@ # RedactPDF -Local, verifiable PDF redaction (removes content instead of masking). -## Backend +Outil de caviardage PDF **local et vérifiable** : l’objectif est de **retirer réellement** les données sensibles d’un PDF exporté, et pas seulement de les masquer visuellement. -Install dev dependencies: -```bash -pip install -e "backend[dev]" -``` +--- + +## Pourquoi ce projet ? + +Le mot “censure PDF” peut vouloir dire plusieurs choses très différentes en pratique. + +- **Masquage visuel (overlay / rectangle noir dessiné)** + - On voit du noir à l’écran. + - Mais le texte, l’image ou l’objet d’origine peut rester récupérable. +- **Aplatissement / rasterisation** + - On convertit la page en image (ou en forme “figée”). + - Peut réduire la récupérabilité du texte, mais dégrade souvent la qualité et l’accessibilité. +- **Caviardage réel (redaction)** + - Le contenu ciblé est supprimé de la structure PDF exportée. + - C’est le mode visé par RedactPDF. + +RedactPDF suit une approche “sécurité d’abord” : appliquer la redaction, puis auditer le résultat avant de livrer le PDF exporté. + +--- + +## Fonctionnalités actuelles + +### Censure par requêtes +- Recherche exacte +- Regex +- Options de matching (casse, sous-mot/mot entier, accents, etc.) + +### Presets +- Emails +- Téléphones +- Cartes bancaires + +### Censure visuelle guidée +- Sélection texte au curseur +- Censure de page complète +- Dessin de rectangles (click-glisser) -Run tests: +### Prévisualisation +- Surcouches de preview avant export +- Numérotation des rectangles dessinés pour faciliter le contrôle opérateur +### Durcissement de l’export +- Audit post-redaction (bloque la sortie si fuite détectée) +- Support options de sanitation (métadonnées, annotations, pièces jointes) selon configuration + +--- + +## Limites connues (importantes) + +1. **PDF “aplatis” / scans / pages-image** + - Si le document est essentiellement une image, les stratégies de redaction fine sont plus limitées. + - Dans certains scénarios, un rectangle qui chevauche une image peut conduire à retirer un objet image entier (si mode strict), ou à un masquage partiel visuel (si mode non strict). + +2. **Censure partielle irréversible d’image/vectoriel (fine-grain)** + - Pas encore implémentée comme workflow natif robuste. + - Aujourd’hui, on est plutôt sur des modes “supprimer l’objet touché” vs “ne pas le supprimer”, selon options. + +3. **OCR hors périmètre de base** + - Le pipeline de base ne reconstruit pas automatiquement du texte OCR pour scans complexes. + +--- + +## Démarrage rapide (développeurs) + +### Prérequis +- Python 3.10+ +- Node.js 20+ +- npm + +### 1) Cloner ```bash -cd backend -pytest +git clone +cd RedactPDF ``` -Run the API locally: - +### 2) Backend ```bash +pip install -e "backend[dev]" cd backend uvicorn app.main:app --reload ``` +Backend dispo sur `http://127.0.0.1:8000` (par défaut). + +### 3) Frontend +Dans un second terminal: +```bash +cd frontend +npm install +npm run dev +``` +Frontend dispo sur `http://127.0.0.1:5173` (ou port affiché par Vite). + +--- + +## Utilisation (opérateur) + +1. Charger un PDF. +2. Ajouter des règles (requêtes/regex/presets), ou utiliser: + - **Censurer la page** + - **Dessiner sélection** (rectangle) + - **Sélection texte** +3. Vérifier la preview. +4. Cliquer **Censurer et télécharger**. +5. Si audit KO: corriger les règles et recommencer. + +--- + +## Installation via Docker (sans build local complexe) + +Voir le guide détaillé: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md). + +Résumé: +- Construire les images backend+frontend, +- Exposer les ports, +- Lancer les services via `docker compose up -d`. + +--- + +## Installation via installeur / exécutable (utilisateur non technique) + +Voir le plan détaillé: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md). + +Résumé: +- Fournir un package “un clic” qui: + - embarque backend + frontend, + - démarre les services localement, + - ouvre automatiquement l’URL locale dans le navigateur. + +--- + +## Médias de documentation (placeholders) + +Tu peux déposer ici des captures/gifs/vidéos, puis les référencer dans ce README. + +Exemples recommandés: + +- `docs/media/01-upload-and-preview.gif` + - Montrer: chargement d’un PDF + preview. +- `docs/media/02-text-selection-redaction.gif` + - Montrer: sélection texte au curseur puis ajout de règle. +- `docs/media/03-draw-rectangle.gif` + - Montrer: bouton “Dessiner sélection”, click-glisser, apparition `Rectangle X (Page Y)`. +- `docs/media/04-full-page-redaction.gif` + - Montrer: “Censurer la page” + preview pleine page. +- `docs/media/05-audit-fail-example.png` + - Montrer: modal d’échec audit avec détails. +- `docs/media/06-audit-pass-download.png` + - Montrer: succès + téléchargement. + +Tu pourras ensuite ajouter des sections du type: + +```md +![Draw rectangle demo](docs/media/03-draw-rectangle.gif) +``` -## Security +--- -See [docs/SECURITY.md](docs/SECURITY.md). +## Roadmap / idées d’amélioration -## Fixtures +- Censure partielle **irréversible** d’image et de graphiques (sans supprimer l’objet entier) +- Import/export de listes de requêtes de censure (profils réutilisables) +- OCR avancé pour PDFs scannés +- Plus d’outils visuels (édition de rectangles, regroupement, templates) +- E2E tests de bout en bout sur workflows UI complets -See [backend/tests/fixtures/README.md](backend/tests/fixtures/README.md). +--- -## Testing +## Documentation complémentaire -See [docs/TESTING.md](docs/TESTING.md). +- Sécurité: [docs/SECURITY.md](docs/SECURITY.md) +- Tests: [docs/TESTING.md](docs/TESTING.md) +- Contribution: [CONTRIBUTING.md](CONTRIBUTING.md) +- Déploiement / packaging: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md) +- Fixtures PDF de test: [backend/tests/fixtures/README.md](backend/tests/fixtures/README.md) diff --git a/backend/app/redaction.py b/backend/app/redaction.py index 91cb0f8..e00e54f 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -37,6 +37,10 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: if h <= 0: return rect + # Les zones volumineuses (ex: page complète) ne doivent pas être compressées verticalement. + if h > 24.0: + return rect + target = h * 0.60 if target < 3.0: target = 3.0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index 8528600..b03f718 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -130,3 +130,32 @@ def test_redaction_does_not_modify_original_fixture_on_disk() -> None: after_bytes = SECRET_FIXTURE.read_bytes() assert before_bytes == after_bytes, "Fixture PDF on disk must remain byte-identical" assert SECRET in extract_text(after_bytes), "Original must still contain the secret" + + +@pytest.mark.integration +def test_redact_rectangles_full_page_rect_redacts_target() -> None: + pdf_in = SECRET_FIXTURE.read_bytes() + original_text = extract_text(pdf_in) + assert SECRET in original_text + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + try: + page = doc[0] + bounds = page.rect + full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + finally: + doc.close() + + payload = make_payload([full_page_rect], patterns=[SECRET]) + + resp = CLIENT.post( + "/redact/rectangles", + files={"file": ("input.pdf", pdf_in, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + assert resp.status_code == 200 + assert resp.headers.get("x-redaction-audit-status") == "pass" + + out_text = extract_text(resp.content) + assert SECRET not in out_text diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md new file mode 100644 index 0000000..afeb7c1 --- /dev/null +++ b/docs/DEPLOYMENT.md @@ -0,0 +1,124 @@ +# Deployment, Docker and Desktop Packaging (Plan) + +Ce document décrit: + +1. comment faire tourner RedactPDF avec Docker, +2. comment livrer une expérience “un clic” pour utilisateurs non techniques. + +--- + +## 1) Docker (backend + frontend) + +## Objectif +Avoir une commande qui démarre l’application complète localement, de manière reproductible. + +## Étapes recommandées + +1. **Dockerfile backend** + - Base Python slim + - Installation dépendances backend + - Exécution `uvicorn app.main:app --host 0.0.0.0 --port 8000` + +2. **Dockerfile frontend** + Deux approches: + - dev: Vite dev server (simple pour debug) + - prod: build static + serveur web (nginx/caddy) + +3. **Reverse proxy / routage API** + - Le frontend doit appeler le backend via un endpoint stable (`/api/...`) + - En prod, servir frontend + proxy API depuis un seul host/port est recommandé + +4. **docker-compose.yml** + - Service `backend` + - Service `frontend` + - Variables d’env + - Healthchecks + +5. **Volumes (optionnel)** + - Si besoin d’exports persistants ou logs partagés + +6. **Sécurité runtime minimale** + - user non-root dans les containers + - images pinées + - surface réseau minimale + +## Commandes cibles (exemple attendu) + +```bash +docker compose build +docker compose up -d +docker compose logs -f +``` + +Puis ouvrir l’URL affichée (ex: `http://localhost:8080`). + +--- + +## 2) Packaging “un seul fichier / un clic” + +## Objectif +Permettre à un utilisateur non technique de: +- double-cliquer, +- lancer backend + frontend, +- ouvrir automatiquement le navigateur sur la bonne URL. + +## Architecture recommandée + +### Option A (recommandée): Shell desktop léger + webview/browser launch + +- Un “launcher” desktop (Python/Go/Node) qui: + 1. vérifie ports disponibles, + 2. démarre backend local, + 3. sert frontend buildé (ou lance un mini serveur statique), + 4. ouvre le navigateur par défaut, + 5. surveille les process et les arrête proprement à la fermeture. + +### Option B: Application desktop embarquée (Electron / Tauri) + +- Embedding UI + process backend intégré. +- Plus lourd, mais UX plus contrôlée. + +## Outils packaging possibles + +- **Windows**: Inno Setup / NSIS / MSI +- **macOS**: `.app` + notarization +- **Linux**: AppImage / deb / rpm + +## Points à gérer impérativement + +1. **Cycle de vie process** + - start/stop propre backend+frontend +2. **Mises à jour** + - stratégie de versioning, migration +3. **Logs support** + - emplacement clair pour diagnostic +4. **Conflits de ports** + - fallback automatique (port alternatif) +5. **Durcissement local** + - bind localhost uniquement + +--- + +## 3) Validation minimale avant diffusion + +- Smoke tests: + - chargement PDF + - redaction requête + - redaction rectangle + - redaction page complète + - audit fail/pass +- Vérification export sur documents contenant: + - texte simple + - images + - vector graphics + - annotations / liens / pièces jointes + +--- + +## 4) Notes produit + +- Documenter clairement la différence entre: + - masquage visuel, + - suppression réelle, + - limites sur PDFs aplatis / scans. +- Prévoir un mode “strict sécurité” visible dans l’UX pour les cas sensibles. diff --git a/docs/SECURITY.md b/docs/SECURITY.md index de634b6..3a7ee85 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -1,29 +1,50 @@ -# Security Model (Draft) +# Security Model ## Scope -This project provides a local PDF redaction tool intended to permanently remove sensitive content from PDF files while preserving normal selection/search for non-redacted text. + +RedactPDF is a local PDF redaction tool intended to produce a **new exported PDF** where targeted sensitive content is no longer recoverable through standard extraction paths. ## Security Invariants (Non-negotiable) -1. **Never modify the original file** - The tool must always export a new PDF and must not overwrite the input. -2. **No visual-only masking** - Overlays/black rectangles that merely cover content are not acceptable. Redaction must remove underlying data. +1. **Never modify the original file** + - Input PDF must remain untouched. +2. **No fake success** + - If post-export audit fails, export must be blocked. +3. **Prefer real removal over visual masking** + - Visual black overlays alone are not sufficient for sensitive workflows. +4. **Operator preview before apply** + - UI preview is required to reduce human targeting mistakes. + +## Current Guarantees (high level) + +- Export is done as a new file. +- Redaction is followed by automated audit checks. +- Backend supports strict options for images/graphics + sanitation. + +## Important Limitations + +1. **Flattened / scanned PDFs** + - Fine-grained redaction can be constrained. +2. **Partial irrecoverable image/vector editing** + - Not a fully general “pixel/segment-only rewrite” pipeline at this stage. +3. **OCR completeness** + - Not guaranteed for all scan/layout conditions. + +## Operational Recommendations + +For sensitive usage, prefer strict settings: -3. **Post-export verification is required** - The tool must run an automated audit after redaction (at minimum, text extraction + pattern checking). - If a forbidden pattern is still found, the tool must fail clearly and must not produce a “successful” output. +- remove touched images/graphics, +- sanitize metadata, +- remove annotations, +- remove attachments, +- verify audit output before sharing exported files. -4. **Preview before apply (UI requirement)** - The UI must provide a preview of the redaction areas before applying changes (to reduce operator errors). +## Reporting Security Issues -## Out of Scope / Limitations (for now) -- Perfect detection of sensitive data in all PDFs is not guaranteed. -- OCR on scanned PDFs is not in scope initially. -- Multi-line / complex-layout matching will be improved iteratively and must be covered by tests. +Please open a security issue with: -## Reporting -If you believe you found a redaction bypass or data leakage issue, please open a security issue with: -- a minimal reproduction PDF (if shareable), -- steps to reproduce, -- expected vs actual behavior. +- minimal reproduction document (if shareable), +- exact steps, +- expected vs actual behavior, +- platform/runtime info. diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 941088b..765714c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useRef, useState } from "react"; +import React, { useCallback, useMemo, useRef, useState } from "react"; import { useI18n } from "./i18n"; import { redactApply } from "./api"; import type { PresetKey, RuleInput } from "./api"; @@ -29,6 +29,9 @@ export default function App() { const [file, setFile] = useState(null); const [rules, setRules] = useState([]); const [pendingSelection, setPendingSelection] = useState(null); + const [currentPage, setCurrentPage] = useState(null); + const [pageSizes, setPageSizes] = useState>({}); + const [isDrawingRect, setIsDrawingRect] = useState(false); const [presets, setPresets] = useState>(EMPTY_PRESETS); const [isDragOver, setIsDragOver] = useState(false); @@ -42,6 +45,7 @@ export default function App() { } | null>(null); const fileInputRef = useRef(null); + const nextRectangleNumberRef = useRef(1); const clearNotices = () => { setErrorInfo(null); @@ -79,17 +83,34 @@ export default function App() { }, [rules]); const rectsForApi = useMemo(() => { - return rules.flatMap((r) => (r.kind === "selection" ? r.rects : [])); + return rules.flatMap((r) => + r.kind === "selection" ? r.rects : r.kind === "page" || r.kind === "rectangle" ? [r.rect] : [] + ); }, [rules]); const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); + const hasRectangleRule = useMemo(() => rules.some((r) => r.kind === "rectangle"), [rules]); + + const handlePageSizeChange = useCallback((pageNumber: number, size: { width: number; height: number }) => { + setPageSizes((prev) => { + const existing = prev[pageNumber]; + if (existing && existing.width === size.width && existing.height === size.height) return prev; + return { ...prev, [pageNumber]: size }; + }); + }, []); + const loadPdfFile = (pickedFile: File | null) => { clearNotices(); if (!pickedFile) { setFile(null); setPendingSelection(null); + setCurrentPage(null); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; return; } @@ -97,12 +118,20 @@ export default function App() { pickedFile.type === "application/pdf" || pickedFile.name.toLowerCase().endsWith(".pdf"); if (!isPdf) { setFile(null); + setCurrentPage(null); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; setErrorInfo({ rawMessage: t("form.file.invalidType") }); return; } setFile(pickedFile); setPendingSelection(null); + setCurrentPage(1); + setPageSizes({}); + setIsDrawingRect(false); + nextRectangleNumberRef.current = 1; setRules([]); setPresets(EMPTY_PRESETS); }; @@ -124,6 +153,7 @@ export default function App() { const trimmed = pendingSelection.text.trim(); if (!trimmed || pendingSelection.rects.length === 0) return; + const newRule: UiRule = { id: newId(), kind: "selection", @@ -135,6 +165,53 @@ export default function App() { setPendingSelection(null); }; + + const addCurrentPageRule = () => { + const pageNumber = currentPage; + if (!pageNumber) return; + clearNotices(); + + const exists = rules.some((rule) => rule.kind === "page" && rule.pageNumber === pageNumber); + if (exists) return; + + const pageSize = pageSizes[pageNumber]; + if (!pageSize) return; + + const newRule: UiRule = { + id: newId(), + kind: "page", + value: `${t("rules.page.title")} ${pageNumber}`, + pageNumber, + rect: { + page: pageNumber - 1, + x0: 0, + y0: 0, + x1: pageSize.width, + y1: pageSize.height, + }, + }; + + setRules((prev) => [...prev, newRule]); + }; + + + const addDrawnRectangleRule = (params: { pageNumber: number; rect: UiRect }) => { + clearNotices(); + const rectangleNumber = nextRectangleNumberRef.current; + nextRectangleNumberRef.current += 1; + + const newRule: UiRule = { + id: newId(), + kind: "rectangle", + value: `${t("rules.rectangle.title")} ${rectangleNumber} (${t("rules.page.title")} ${params.pageNumber})`, + rectangleNumber, + pageNumber: params.pageNumber, + rect: params.rect, + }; + + setRules((prev) => [...prev, newRule]); + }; + const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); setErrorInfo(null); @@ -157,6 +234,11 @@ export default function App() { rects: rectsForApi, rules: rulesForApi, presets: selectedPresets, + applyImages: hasFullPageRule || hasRectangleRule, + applyGraphics: hasFullPageRule || hasRectangleRule, + sanitizeMetadata: true, + removeAnnotations: true, + removeAttachments: true, }); downloadBlob(r.pdfBlob, "redacted.pdf"); @@ -192,6 +274,10 @@ export default function App() { presetKeys={selectedPresets} t={t} onSelectionChange={setPendingSelection} + onCurrentPageChange={setCurrentPage} + onPageSizeChange={handlePageSizeChange} + isDrawingRect={isDrawingRect} + onAddDrawnRect={addDrawnRectangleRule} /> ) : (
0} onAddSelection={addPendingSelection} + isDrawingRect={isDrawingRect} + onToggleDrawSelection={() => setIsDrawingRect((prev) => !prev)} + canCensorPage={!!currentPage && !!pageSizes[currentPage]} + onCensorPage={addCurrentPageRule} /> diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 360248a..fecc924 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -70,6 +70,11 @@ export async function redactApply(params: { rects: RectInput[]; rules: RuleInput[]; presets: PresetKey[]; + applyImages?: boolean; + applyGraphics?: boolean; + sanitizeMetadata?: boolean; + removeAnnotations?: boolean; + removeAttachments?: boolean; }): Promise { const form = new FormData(); form.append("file", params.file); @@ -111,7 +116,13 @@ export async function redactApply(params: { searches, regexes, presets: hasPresets ? { presets: params.presets, scope: { pages: null as null } } : null, - options: {}, + options: { + apply_images: !!params.applyImages, + apply_graphics: !!params.applyGraphics, + sanitize_metadata: !!params.sanitizeMetadata, + remove_annotations: !!params.removeAnnotations, + remove_attachments: !!params.removeAttachments, + }, // audit additionnel facultatif : on laisse null (audit_plan gère déjà search/regex/presets) audit: null, }; diff --git a/frontend/src/components/PdfViewer.tsx b/frontend/src/components/PdfViewer.tsx index e69dc85..4389c8a 100644 --- a/frontend/src/components/PdfViewer.tsx +++ b/frontend/src/components/PdfViewer.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useRef, useState } from "react"; +import type { PointerEvent as ReactPointerEvent } from "react"; import type { PresetKey } from "../api"; import type { UiRect, UiRule } from "../types/uiRules"; @@ -28,6 +29,15 @@ type PdfDocumentProxy = { destroy: () => void; }; + +type DrawDraft = { + pageIndex: number; + startX: number; + startY: number; + currentX: number; + currentY: number; +}; + type PdfJsLib = { GlobalWorkerOptions: { workerSrc: string }; getDocument: (params: { data: Uint8Array }) => { promise: Promise }; @@ -53,8 +63,12 @@ export function PdfViewer(props: { presetKeys: PresetKey[]; t: (k: string) => string; onSelectionChange: (selection: { text: string; rects: UiRect[] } | null) => void; + onCurrentPageChange: (pageNumber: number | null) => void; + onPageSizeChange: (pageNumber: number, size: { width: number; height: number }) => void; + isDrawingRect: boolean; + onAddDrawnRect: (params: { pageNumber: number; rect: UiRect }) => void; }) { - const { file, rules, presetKeys, t, onSelectionChange } = props; + const { file, rules, presetKeys, t, onSelectionChange, onCurrentPageChange, onPageSizeChange, isDrawingRect, onAddDrawnRect } = props; const [pdfDoc, setPdfDoc] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -65,8 +79,10 @@ export function PdfViewer(props: { const canvasRefs = useRef>([]); const textLayerRefs = useRef>([]); const previewLayerRefs = useRef>([]); + const pageRefs = useRef>([]); const pageScalesRef = useRef>([]); const pdfjsRef = useRef(null); + const [drawDraft, setDrawDraft] = useState(null); useEffect(() => { const el = containerRef.current; @@ -89,10 +105,12 @@ export function PdfViewer(props: { let loadedDoc: PdfDocumentProxy | null = null; onSelectionChange(null); + onCurrentPageChange(null); pageScalesRef.current = []; setPdfDoc(null); setError(null); setIsLoading(true); + setDrawDraft(null); (async () => { try { @@ -109,6 +127,7 @@ export function PdfViewer(props: { } setPdfDoc(doc); + onCurrentPageChange(1); } catch { if (!active) return; setError(t("viewer.error.load")); @@ -121,7 +140,7 @@ export function PdfViewer(props: { active = false; if (loadedDoc) loadedDoc.destroy(); }; - }, [file, onSelectionChange]); + }, [file, onSelectionChange, onCurrentPageChange]); const pageNumbers = useMemo(() => { if (!pdfDoc) return []; @@ -140,6 +159,7 @@ export function PdfViewer(props: { const page = await pdfDoc.getPage(pageNumber); const baseViewport = page.getViewport({ scale: 1 }); + onPageSizeChange(pageNumber, { width: baseViewport.width, height: baseViewport.height }); const scale = containerWidth / baseViewport.width; const viewport = page.getViewport({ scale }); @@ -194,7 +214,7 @@ export function PdfViewer(props: { return () => { cancelled = true; }; - }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys]); + }, [pdfDoc, pageNumbers, containerWidth, rules, presetKeys, onPageSizeChange]); useEffect(() => { for (const [index, textLayer] of textLayerRefs.current.entries()) { @@ -205,8 +225,44 @@ export function PdfViewer(props: { } }, [rules, presetKeys]); + useEffect(() => { + if (!containerRef.current || pageNumbers.length === 0) return; + + const container = containerRef.current; + const observer = new IntersectionObserver( + (entries) => { + let bestPage: number | null = null; + let bestRatio = 0; + + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const page = Number((entry.target as HTMLElement).dataset.pageNumber ?? "0"); + if (!page) continue; + if (entry.intersectionRatio > bestRatio) { + bestRatio = entry.intersectionRatio; + bestPage = page; + } + } + + if (bestPage) onCurrentPageChange(bestPage); + }, + { root: container, threshold: [0.25, 0.5, 0.75] }, + ); + + for (const pageEl of pageRefs.current) { + if (pageEl) observer.observe(pageEl); + } + + return () => observer.disconnect(); + }, [pageNumbers, onCurrentPageChange]); + useEffect(() => { const computeSelection = () => { + if (isDrawingRect) { + onSelectionChange(null); + return; + } + const selection = window.getSelection(); if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { onSelectionChange(null); @@ -265,13 +321,84 @@ export function PdfViewer(props: { } onSelectionChange({ text: selectedText, rects }); + onCurrentPageChange(pageIndex + 1); }; document.addEventListener("selectionchange", computeSelection); return () => { document.removeEventListener("selectionchange", computeSelection); }; - }, [onSelectionChange]); + }, [onSelectionChange, onCurrentPageChange, isDrawingRect]); + + + const clampPoint = (value: number, max: number) => Math.max(0, Math.min(value, max)); + + const beginDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect) return; + + const layer = event.currentTarget; + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + layer.setPointerCapture(event.pointerId); + setDrawDraft({ pageIndex, startX: x, startY: y, currentX: x, currentY: y }); + event.preventDefault(); + }; + + const moveDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect || !drawDraft || drawDraft.pageIndex !== pageIndex) return; + + const layer = event.currentTarget; + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + setDrawDraft((prev) => (prev && prev.pageIndex === pageIndex ? { ...prev, currentX: x, currentY: y } : prev)); + event.preventDefault(); + }; + + const endDraw = (pageIndex: number, event: ReactPointerEvent) => { + if (!isDrawingRect || !drawDraft || drawDraft.pageIndex !== pageIndex) return; + + const layer = event.currentTarget; + if (layer.hasPointerCapture(event.pointerId)) { + layer.releasePointerCapture(event.pointerId); + } + + const bounds = layer.getBoundingClientRect(); + const x = clampPoint(event.clientX - bounds.left, bounds.width); + const y = clampPoint(event.clientY - bounds.top, bounds.height); + + const left = Math.min(drawDraft.startX, x); + const right = Math.max(drawDraft.startX, x); + const top = Math.min(drawDraft.startY, y); + const bottom = Math.max(drawDraft.startY, y); + + const minSize = 4; + if (right - left >= minSize && bottom - top >= minSize) { + const scale = pageScalesRef.current[pageIndex] ?? 1; + if (scale > 0) { + onAddDrawnRect({ + pageNumber: pageIndex + 1, + rect: { + page: pageIndex, + x0: left / scale, + y0: top / scale, + x1: right / scale, + y1: bottom / scale, + }, + }); + } + } + + setDrawDraft(null); + event.preventDefault(); + }; + + const cancelDraw = () => { + if (drawDraft) setDrawDraft(null); + }; if (error) { return
{error}
; @@ -283,7 +410,14 @@ export function PdfViewer(props: {
{pageNumbers.map((pageNumber) => ( -
+
{ + pageRefs.current[pageNumber - 1] = el; + }} + > { @@ -297,7 +431,26 @@ export function PdfViewer(props: { }} />
beginDraw(pageNumber - 1, event)} + onPointerMove={(event) => moveDraw(pageNumber - 1, event)} + onPointerUp={(event) => endDraw(pageNumber - 1, event)} + onPointerCancel={cancelDraw} + > + {drawDraft && drawDraft.pageIndex === pageNumber - 1 ? ( +
+ ) : null} +
+
{ textLayerRefs.current[pageNumber - 1] = el; }} @@ -355,6 +508,29 @@ function applyPreviewHighlights( highlightPhonePresetMatches(textLayer, previewLayer, layerBounds); } + const pageRules = rules.filter((r): r is Extract => r.kind === "page"); + for (const pageRule of pageRules) { + if (pageRule.pageNumber !== pageIndex + 1) continue; + drawPreviewRect(previewLayer, { + left: 0, + top: 0, + width: layerBounds.width, + height: layerBounds.height, + }); + } + + const rectangleRules = rules.filter((r): r is Extract => r.kind === "rectangle"); + for (const rectangleRule of rectangleRules) { + if (rectangleRule.pageNumber !== pageIndex + 1) continue; + const rect = rectangleRule.rect; + drawPreviewRect(previewLayer, { + left: rect.x0 * scale, + top: rect.y0 * scale, + width: (rect.x1 - rect.x0) * scale, + height: (rect.y1 - rect.y0) * scale, + }, String(rectangleRule.rectangleNumber)); + } + const selectionRules = rules.filter((r): r is Extract => r.kind === "selection"); for (const selectionRule of selectionRules) { for (const rect of selectionRule.rects) { @@ -372,6 +548,7 @@ function applyPreviewHighlights( function drawPreviewRect( previewLayer: HTMLDivElement, rect: { left: number; top: number; width: number; height: number }, + label?: string, ) { const width = rect.width; const height = rect.height; @@ -383,6 +560,13 @@ function drawPreviewRect( highlight.style.top = `${rect.top}px`; highlight.style.width = `${width}px`; highlight.style.height = `${height}px`; + if (label) { + const badge = document.createElement("div"); + badge.className = "redactionPreviewRectLabel"; + badge.textContent = label; + highlight.appendChild(badge); + } + previewLayer.appendChild(highlight); } @@ -393,7 +577,7 @@ function collectMatches( ): Array<{ start: number; end: number }> { const matches: Array<{ start: number; end: number }> = []; for (const rule of rules) { - if (rule.kind === "selection") continue; + if (rule.kind === "selection" || rule.kind === "page" || rule.kind === "rectangle") continue; const value = rule.value.trim(); if (!value) continue; const ranges = diff --git a/frontend/src/components/Rules/EditRuleModal.tsx b/frontend/src/components/Rules/EditRuleModal.tsx index 36ef724..f7323f6 100644 --- a/frontend/src/components/Rules/EditRuleModal.tsx +++ b/frontend/src/components/Rules/EditRuleModal.tsx @@ -21,7 +21,7 @@ type UiRuleNoId = export function EditRuleModal(props: { t: (k: string) => string; - rule: UiRule | null; + rule: Extract | null; onClose: () => void; onSave: (updated: UiRuleNoId) => void; }) { @@ -35,10 +35,10 @@ export function EditRuleModal(props: { const [editAllowSubwords, setEditAllowSubwords] = useState(false); const [editIgnoreAccents, setEditIgnoreAccents] = useState(false); - const isOpen = !!rule && rule.kind !== "selection"; + const isOpen = !!rule; useEffect(() => { - if (!rule || rule.kind === "selection") return; + if (!rule) return; setEditKind(rule.kind); setEditValue(rule.value); diff --git a/frontend/src/components/Rules/RulesList.tsx b/frontend/src/components/Rules/RulesList.tsx index ebb8509..6e28fb7 100644 --- a/frontend/src/components/Rules/RulesList.tsx +++ b/frontend/src/components/Rules/RulesList.tsx @@ -78,7 +78,7 @@ function RuleOptionPills(props: { export function RulesList(props: { t: (k: string) => string; rules: UiRule[]; - kindLabel: (k: RuleKind | "selection") => string; + kindLabel: (k: RuleKind | "selection" | "page" | "rectangle") => string; onEdit: (r: UiRule) => void; onDelete: (id: string) => void; }) { @@ -138,11 +138,11 @@ export function RulesList(props: { {kindLabel(r.kind)}
- {r.kind !== "selection" ? : null} + {r.kind !== "selection" && r.kind !== "page" && r.kind !== "rectangle" ? : null}
- {r.kind !== "selection" ? ( + {r.kind !== "selection" && r.kind !== "page" && r.kind !== "rectangle" ? ( -
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 362c615..714abb1 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -71,5 +71,10 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Draw selection", "rules.action.censorPage": "Redact page", - "rules.option.respectAccents": "Respect accents" + "rules.option.respectAccents": "Respect accents", + "rules.badge.page": "Full page", + "rules.page.title": "Page", + "rules.badge.rectangle": "Rectangle", + "rules.rectangle.title": "Rectangle", + "rules.action.stopDrawingSelection": "Stop drawing" } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 4957e73..2eb43f8 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -71,5 +71,10 @@ "rules.options.summary": "Options", "rules.action.drawSelection": "Dessiner sélection", "rules.action.censorPage": "Censurer la page", - "rules.option.respectAccents": "Respecter les accents" + "rules.option.respectAccents": "Respecter les accents", + "rules.badge.page": "Page complète", + "rules.page.title": "Page", + "rules.badge.rectangle": "Rectangle", + "rules.rectangle.title": "Rectangle", + "rules.action.stopDrawingSelection": "Arrêter dessin" } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index f076b77..bd7c0e6 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -281,6 +281,44 @@ body, box-shadow: inset 0 0 0 1px rgba(32, 93, 220, 0.24); } + +.pdfDrawLayer { + position: absolute; + inset: 0; + z-index: 4; + pointer-events: none; +} + +.pdfDrawLayerActive { + pointer-events: auto; + cursor: crosshair; +} + +.pdfTextLayerNoPointer { + pointer-events: none; + user-select: none; + -webkit-user-select: none; +} + +.redactionPreviewRectLabel { + position: absolute; + top: 0; + right: 0; + min-width: 26px; + height: 26px; + padding: 2px 8px; + display: inline-flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 20px; + color: #1e66c2; + background: rgba(255, 255, 255, 0.6); + border-left: 1px solid rgba(32, 93, 220, 0.5); + border-bottom: 1px solid rgba(32, 93, 220, 0.5); +} + + .pdfTextLayer br, .textLayer br { position: absolute; diff --git a/frontend/src/types/uiRules.ts b/frontend/src/types/uiRules.ts index dae1d51..e7aa355 100644 --- a/frontend/src/types/uiRules.ts +++ b/frontend/src/types/uiRules.ts @@ -31,4 +31,19 @@ export type UiRule = kind: "selection"; value: string; rects: UiRect[]; + } + | { + id: string; + kind: "page"; + value: string; + pageNumber: number; + rect: UiRect; + } + | { + id: string; + kind: "rectangle"; + value: string; + rectangleNumber: number; + pageNumber: number; + rect: UiRect; }; From 1705231640ef4bdef67d4a32f50b0c8ccd9c87f0 Mon Sep 17 00:00:00 2001 From: theodubus <80580619+theodubus@users.noreply.github.com> Date: Mon, 4 May 2026 14:38:51 +0200 Subject: [PATCH 26/27] stabilize --- CONTRIBUTING.md | 72 --- README.md | 216 ++++----- backend/app/main.py | 439 +------------------ backend/app/pipeline.py | 10 +- backend/tests/test_multiline.py | 101 ++--- backend/tests/test_redact_images_graphics.py | 3 +- backend/tests/test_redact_presets.py | 59 ++- backend/tests/test_redact_rectangles.py | 54 +-- backend/tests/test_redact_regex.py | 84 ++-- backend/tests/test_redact_search.py | 79 ++-- backend/tests/test_sanitize.py | 15 +- docs/DEPLOYMENT.md | 124 ------ docs/SECURITY.md | 64 +++ docs/TESTING.md | 53 --- 14 files changed, 345 insertions(+), 1028 deletions(-) delete mode 100644 CONTRIBUTING.md delete mode 100644 docs/DEPLOYMENT.md delete mode 100644 docs/TESTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 382690d..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,72 +0,0 @@ -# Contributing to RedactPDF - -Merci pour ta contribution ❤️ - -## Objectif du projet - -RedactPDF vise un caviardage PDF **réellement destructif** (sur l’export), avec audit post-traitement. - -## Principes de contribution - -1. **Priorité sécurité** - - Toute modif qui peut impacter la suppression réelle des données doit être testée. -2. **Ne pas casser l’audit** - - Si l’audit échoue, l’export ne doit pas être livré comme succès. -3. **Reproductibilité** - - Favoriser des fixtures déterministes et des tests automatisés. - -## Setup local - -### Backend -```bash -pip install -e "backend[dev]" -cd backend -uvicorn app.main:app --reload -``` - -### Frontend -```bash -cd frontend -npm install -npm run dev -``` - -## Tests - -Voir [docs/TESTING.md](docs/TESTING.md). - -En bref: -```bash -cd backend -pytest -ruff check . -``` - -Frontend: -```bash -cd frontend -npm run build -``` - -## Pull requests - -Merci d’inclure dans la PR: - -- **Contexte**: problème observé / besoin métier -- **Solution**: ce qui change techniquement -- **Impact sécurité**: texte/images/graphics/metadata/annotations/attachments -- **Validation**: commandes et résultats -- **Limites** éventuelles - -## Zones sensibles (à relire attentivement) - -- `backend/app/redaction.py` -- `backend/app/audit.py` et pipeline associé -- `frontend/src/components/PdfViewer.tsx` -- `frontend/src/api.ts` - -## Bonnes pratiques produit - -- Préférer des comportements explicitement “strict” pour les usages sensibles -- Documenter clairement les limites (PDF aplatis, scans, OCR, etc.) -- Éviter les promesses de sécurité non vérifiées diff --git a/README.md b/README.md index ad9bca7..789c4be 100644 --- a/README.md +++ b/README.md @@ -1,178 +1,144 @@ # RedactPDF -Outil de caviardage PDF **local et vérifiable** : l’objectif est de **retirer réellement** les données sensibles d’un PDF exporté, et pas seulement de les masquer visuellement. +Local web app for redacting sensitive content from PDF files. Targets manual +rectangles, text search, regex (single- or multi-line), and presets (email, +phone, credit card). Every export passes a post-redaction audit before being +returned — if any targeted content remains in the output, the export is +blocked with a structured failure report. ---- - -## Pourquoi ce projet ? +For the security model and limitations, see [docs/SECURITY.md](docs/SECURITY.md). -Le mot “censure PDF” peut vouloir dire plusieurs choses très différentes en pratique. +--- -- **Masquage visuel (overlay / rectangle noir dessiné)** - - On voit du noir à l’écran. - - Mais le texte, l’image ou l’objet d’origine peut rester récupérable. -- **Aplatissement / rasterisation** - - On convertit la page en image (ou en forme “figée”). - - Peut réduire la récupérabilité du texte, mais dégrade souvent la qualité et l’accessibilité. -- **Caviardage réel (redaction)** - - Le contenu ciblé est supprimé de la structure PDF exportée. - - C’est le mode visé par RedactPDF. +## Requirements -RedactPDF suit une approche “sécurité d’abord” : appliquer la redaction, puis auditer le résultat avant de livrer le PDF exporté. +- **Python 3.10 or newer** (CI runs 3.11) +- **Node.js 20 or newer** (for the frontend dev server / build) +- A POSIX-like shell (Linux, macOS, WSL). Windows native is not officially + tested. --- -## Fonctionnalités actuelles - -### Censure par requêtes -- Recherche exacte -- Regex -- Options de matching (casse, sous-mot/mot entier, accents, etc.) - -### Presets -- Emails -- Téléphones -- Cartes bancaires +## Install -### Censure visuelle guidée -- Sélection texte au curseur -- Censure de page complète -- Dessin de rectangles (click-glisser) +Clone the repo and set up the two halves: -### Prévisualisation -- Surcouches de preview avant export -- Numérotation des rectangles dessinés pour faciliter le contrôle opérateur +```bash +git clone https://github.com/theodubus/RedactPDF.git +cd RedactPDF +``` -### Durcissement de l’export -- Audit post-redaction (bloque la sortie si fuite détectée) -- Support options de sanitation (métadonnées, annotations, pièces jointes) selon configuration +### Backend (FastAPI + PyMuPDF) ---- - -## Limites connues (importantes) +```bash +cd backend +python -m venv .venv +source .venv/bin/activate +pip install -e ".[dev]" +``` -1. **PDF “aplatis” / scans / pages-image** - - Si le document est essentiellement une image, les stratégies de redaction fine sont plus limitées. - - Dans certains scénarios, un rectangle qui chevauche une image peut conduire à retirer un objet image entier (si mode strict), ou à un masquage partiel visuel (si mode non strict). +`.[dev]` pulls runtime deps (FastAPI, PyMuPDF, `phonenumbers`, …) plus dev +tooling (pytest, ruff, reportlab, httpx, pypdf). -2. **Censure partielle irréversible d’image/vectoriel (fine-grain)** - - Pas encore implémentée comme workflow natif robuste. - - Aujourd’hui, on est plutôt sur des modes “supprimer l’objet touché” vs “ne pas le supprimer”, selon options. +### Frontend (React + Vite) -3. **OCR hors périmètre de base** - - Le pipeline de base ne reconstruit pas automatiquement du texte OCR pour scans complexes. +```bash +cd ../frontend +npm ci +``` --- -## Démarrage rapide (développeurs) +## Run locally -### Prérequis -- Python 3.10+ -- Node.js 20+ -- npm +You need two terminals. -### 1) Cloner -```bash -git clone -cd RedactPDF -``` +**Terminal 1 — backend:** -### 2) Backend ```bash -pip install -e "backend[dev]" cd backend -uvicorn app.main:app --reload +source .venv/bin/activate +uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload ``` -Backend dispo sur `http://127.0.0.1:8000` (par défaut). -### 3) Frontend -Dans un second terminal: +**Terminal 2 — frontend:** + ```bash cd frontend -npm install npm run dev ``` -Frontend dispo sur `http://127.0.0.1:5173` (ou port affiché par Vite). - ---- - -## Utilisation (opérateur) -1. Charger un PDF. -2. Ajouter des règles (requêtes/regex/presets), ou utiliser: - - **Censurer la page** - - **Dessiner sélection** (rectangle) - - **Sélection texte** -3. Vérifier la preview. -4. Cliquer **Censurer et télécharger**. -5. Si audit KO: corriger les règles et recommencer. +Open the URL Vite prints (default: `http://localhost:5173`). The Vite dev +server proxies `/api/*` to the backend on `127.0.0.1:8000` (configured in +[frontend/vite.config.ts](frontend/vite.config.ts)), so you do not need to +worry about CORS in development. --- -## Installation via Docker (sans build local complexe) +## Use it -Voir le guide détaillé: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md). +1. Drop a PDF into the upload area. +2. Add redaction rules in the right pane: + - **Selection** — select text in the viewer and click "Add as rule". + - **Manual rectangle** — toggle the draw tool and trace rectangles. + - **Whole page** — censor the current page. + - **Exact / regex** — typed rules with options (case sensitivity, + whole-word, ignore accents, multiline). + - **Presets** — email, phone (libphonenumber-validated, default region + `FR`), credit card (Luhn-filtered). +3. Click the submit button. The redacted PDF downloads automatically. +4. If the post-redaction audit finds any targeted content remaining, you + get a 400 with a JSON report instead — fix the rule and retry. -Résumé: -- Construire les images backend+frontend, -- Exposer les ports, -- Lancer les services via `docker compose up -d`. +### Phone preset region ---- - -## Installation via installeur / exécutable (utilisateur non technique) +The `phone` preset uses `phonenumbers` to validate candidates. Numbers +without a leading `+` are parsed against a default region. To change it: -Voir le plan détaillé: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md). - -Résumé: -- Fournir un package “un clic” qui: - - embarque backend + frontend, - - démarre les services localement, - - ouvre automatiquement l’URL locale dans le navigateur. +```bash +export REDACT_DEFAULT_REGION=US +uvicorn app.main:app ... +``` --- -## Médias de documentation (placeholders) - -Tu peux déposer ici des captures/gifs/vidéos, puis les référencer dans ce README. +## Run the tests -Exemples recommandés: - -- `docs/media/01-upload-and-preview.gif` - - Montrer: chargement d’un PDF + preview. -- `docs/media/02-text-selection-redaction.gif` - - Montrer: sélection texte au curseur puis ajout de règle. -- `docs/media/03-draw-rectangle.gif` - - Montrer: bouton “Dessiner sélection”, click-glisser, apparition `Rectangle X (Page Y)`. -- `docs/media/04-full-page-redaction.gif` - - Montrer: “Censurer la page” + preview pleine page. -- `docs/media/05-audit-fail-example.png` - - Montrer: modal d’échec audit avec détails. -- `docs/media/06-audit-pass-download.png` - - Montrer: succès + téléchargement. +```bash +cd backend +source .venv/bin/activate +ruff check . +pytest +``` -Tu pourras ensuite ajouter des sections du type: +The test suite uses **versioned PDF fixtures** — see +[backend/tests/fixtures/README.md](backend/tests/fixtures/README.md). Do not +edit the generated PDFs by hand. If you change the fixture generator, +regenerate all of them in one go: -```md -![Draw rectangle demo](docs/media/03-draw-rectangle.gif) +```bash +python -m backend.tests.fixtures.generate_fixtures ``` --- -## Roadmap / idées d’amélioration +## Production deployment + +This project is built for local single-user usage. **Exposing the API to +untrusted networks or multiple users is unsafe out of the box** — there is +no auth, no rate limiting, no upload size cap, no regex timeout. If you +plan to host it for others, read +[docs/SECURITY.md → Production / Multi-user Deployment](docs/SECURITY.md) +first and put the recommended protections in your reverse proxy / +container. -- Censure partielle **irréversible** d’image et de graphiques (sans supprimer l’objet entier) -- Import/export de listes de requêtes de censure (profils réutilisables) -- OCR avancé pour PDFs scannés -- Plus d’outils visuels (édition de rectangles, regroupement, templates) -- E2E tests de bout en bout sur workflows UI complets +A typical setup is: build the frontend (`npm run build` produces a static +bundle in `frontend/dist`), serve it from a reverse proxy that also +proxies `/api/*` to the backend (Uvicorn or Gunicorn-with-Uvicorn-workers +behind nginx/Caddy). With same-origin serving, you do not need CORS. --- -## Documentation complémentaire +## License -- Sécurité: [docs/SECURITY.md](docs/SECURITY.md) -- Tests: [docs/TESTING.md](docs/TESTING.md) -- Contribution: [CONTRIBUTING.md](CONTRIBUTING.md) -- Déploiement / packaging: [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md) -- Fixtures PDF de test: [backend/tests/fixtures/README.md](backend/tests/fixtures/README.md) +See repository root. diff --git a/backend/app/main.py b/backend/app/main.py index e024a3b..7fe6eda 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -4,14 +4,12 @@ import json from typing import Annotated, Any -import pymupdf from fastapi import FastAPI, File, Form, HTTPException, UploadFile from fastapi.responses import JSONResponse from pydantic import BaseModel, Field, ValidationError, field_validator from starlette.responses import Response -from app.audit import AuditOptions, audit_pdf_text, build_audit_for_search -from app.multiline_regex_engine import find_redaction_rectangles_by_regex +from app.audit import AuditOptions from app.pipeline import ( PresetsRequest, RedactionOptions, @@ -21,9 +19,8 @@ audit_plan, plan_redactions, ) -from app.presets import available_presets, find_redaction_rectangles_for_presets -from app.redaction import RedactionRect, redact_pdf_by_rectangles -from app.search import SearchOptions, find_redaction_rectangles +from app.presets import available_presets +from app.redaction import RedactionRect app = FastAPI() @@ -64,10 +61,10 @@ class OptionsModel(BaseModel): apply_images: bool = False apply_graphics: bool = False - # Étape 09 : sanitation "anti-fuites hors visuel" - sanitize_metadata: bool = False - remove_annotations: bool = False - remove_attachments: bool = False + # Sanitation "anti-fuites hors visuel" : ON par défaut (secure-by-default). + sanitize_metadata: bool = True + remove_annotations: bool = True + remove_attachments: bool = True class AuditModel(BaseModel): @@ -84,12 +81,6 @@ def validate_patterns(cls, v: list[str]) -> list[str]: return cleaned -class RectanglesPayload(BaseModel): - rects: list[RectModel] - options: OptionsModel = Field(default_factory=OptionsModel) - audit: AuditModel - - class SearchOptionsModel(BaseModel): case_sensitive: bool = False whole_word: bool = False @@ -110,422 +101,8 @@ def validate_pages(cls, v: list[int] | None) -> list[int] | None: return v -class SearchPayload(BaseModel): - query: str - options: SearchOptionsModel = Field(default_factory=SearchOptionsModel) - scope: ScopeModel = Field(default_factory=ScopeModel) - # options de redaction (images/graphics + sanitize) - apply: OptionsModel = Field(default_factory=OptionsModel) - audit: AuditModel - - @field_validator("query") - @classmethod - def validate_query(cls, v: str) -> str: - if not v or not v.strip(): - raise ValueError("query must be non-empty") - return v.strip() - - -class PresetsPayload(BaseModel): - presets: list[str] - scope: ScopeModel = Field(default_factory=ScopeModel) - options: OptionsModel = Field(default_factory=OptionsModel) - # audit optionnel : le backend fait un audit interne cohérent presets - audit: AuditModel | None = None - - @field_validator("presets") - @classmethod - def validate_presets(cls, v: list[str]) -> list[str]: - cleaned = [p.strip() for p in v if p and p.strip()] - if not cleaned: - raise ValueError("presets must contain at least one non-empty preset key") - - allowed = set(available_presets()) - unknown = [p for p in cleaned if p not in allowed] - if unknown: - raise ValueError( - f"Unknown preset(s): {', '.join(unknown)}. Available: {', '.join(sorted(allowed))}" - ) - return cleaned - - -class RegexPayload(BaseModel): - patterns: list[str] - case_sensitive: bool = False - multiline: bool = False - ignore_accents: bool = False - scope: ScopeModel = Field(default_factory=ScopeModel) - options: OptionsModel = Field(default_factory=OptionsModel) - audit: AuditModel - - @field_validator("patterns", mode="before") - @classmethod - def coerce_patterns(cls, v: Any) -> list[str]: - if isinstance(v, str): - cleaned = v.strip() - if not cleaned: - raise ValueError("patterns must be a non-empty string or a non-empty list") - return [cleaned] - - if isinstance(v, list): - cleaned_list = [str(p).strip() for p in v if p and str(p).strip()] - if not cleaned_list: - raise ValueError("patterns must be a non-empty string or a non-empty list") - return cleaned_list - - raise ValueError("patterns must be a non-empty string or a non-empty list") - - -# ---------------------------- -# Endpoints -# ---------------------------- - - -@app.post("/redact/rectangles") -async def redact_rectangles( - file: Annotated[UploadFile, File(...)], - payload: Annotated[str, Form(...)], -) -> Response: - try: - data = RectanglesPayload.model_validate_json(payload) - except ValidationError as e: - raise HTTPException(status_code=422, detail=e.errors()) from e - except Exception: - raise HTTPException(status_code=400, detail="Invalid payload JSON") from None - - pdf_bytes = await file.read() - if not pdf_bytes: - raise HTTPException(status_code=400, detail="Empty PDF upload") - - rects = [RedactionRect(page=r.page, x0=r.x0, y0=r.y0, x1=r.x1, y1=r.y1) for r in data.rects] - - try: - out_pdf = redact_pdf_by_rectangles( - pdf_bytes, - rects, - apply_images=data.options.apply_images, - apply_graphics=data.options.apply_graphics, - sanitize_metadata=data.options.sanitize_metadata, - remove_annotations=data.options.remove_annotations, - remove_attachments=data.options.remove_attachments, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Redaction failed") from e - - try: - report = audit_pdf_text( - out_pdf, - AuditOptions( - patterns=data.audit.patterns, - regex=data.audit.regex, - case_sensitive=data.audit.case_sensitive, - ), - ) - except ValueError as e: - return JSONResponse(status_code=400, content={"status": "error", "error": str(e)}) - - if report["status"] != "pass": - return JSONResponse(status_code=400, content=report) - - headers: dict[str, Any] = { - "Content-Disposition": 'attachment; filename="redacted.pdf"', - "X-Redaction-Audit-Status": "pass", - "X-Redaction-Audit-Matches": "0", - } - _add_report_headers(headers, report) - return Response(content=out_pdf, media_type="application/pdf", headers=headers) - - -@app.post("/redact/search") -async def redact_search( - file: Annotated[UploadFile, File(...)], - payload: Annotated[str, Form(...)], -) -> Response: - """ - IMPORTANT: - - L'audit "interne" est construit automatiquement à partir de - (query, whole_word, case_sensitive) pour éviter les incohérences - qui causent des faux échecs. - - L'audit fourni par le client est ensuite exécuté en audit additionnel (banlist), - sans jamais remplacer l'audit interne. - """ - try: - data = SearchPayload.model_validate_json(payload) - except ValidationError as e: - raise HTTPException(status_code=422, detail=e.errors()) from e - except Exception: - raise HTTPException(status_code=400, detail="Invalid payload JSON") from None - - pdf_bytes = await file.read() - if not pdf_bytes: - raise HTTPException(status_code=400, detail="Empty PDF upload") - - try: - found_rects = find_redaction_rectangles( - pdf_bytes, - SearchOptions( - query=data.query, - case_sensitive=data.options.case_sensitive, - whole_word=data.options.whole_word, - ignore_accents=data.options.ignore_accents, - pages=data.scope.pages, - ), - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Search failed") from e - - try: - out_pdf = redact_pdf_by_rectangles( - pdf_bytes, - found_rects, - apply_images=data.apply.apply_images, - apply_graphics=data.apply.apply_graphics, - sanitize_metadata=data.apply.sanitize_metadata, - remove_annotations=data.apply.remove_annotations, - remove_attachments=data.apply.remove_attachments, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Redaction failed") from e - - # 1) Audit interne cohérent avec la recherche - try: - internal_opts = build_audit_for_search( - query=data.query, - case_sensitive=data.options.case_sensitive, - whole_word=data.options.whole_word, - ignore_accents=data.options.ignore_accents, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - - try: - internal_report = audit_pdf_text(out_pdf, internal_opts) - except ValueError as e: - return JSONResponse(status_code=400, content={"status": "error", "error": str(e)}) - - if internal_report["status"] != "pass": - return JSONResponse(status_code=400, content=internal_report) - - # 2) Audit additionnel (banlist) fourni par le client - try: - client_report = audit_pdf_text( - out_pdf, - AuditOptions( - patterns=data.audit.patterns, - regex=data.audit.regex, - case_sensitive=data.audit.case_sensitive, - ), - ) - except ValueError as e: - return JSONResponse(status_code=400, content={"status": "error", "error": str(e)}) - - if client_report["status"] != "pass": - return JSONResponse(status_code=400, content=client_report) - - headers: dict[str, Any] = { - "Content-Disposition": 'attachment; filename="redacted.pdf"', - "X-Redaction-Audit-Status": "pass", - "X-Redaction-Audit-Matches": "0", - "X-Redaction-Search-Occurrences": str(len(found_rects)), - } - # On expose le report interne (cohérent) en header - _add_report_headers(headers, internal_report) - return Response(content=out_pdf, media_type="application/pdf", headers=headers) - - -def _build_presets_internal_audit_report( - out_pdf: bytes, - *, - presets: list[str], - pages: list[int] | None, -) -> dict[str, Any]: - leaks_by_preset: dict[str, list[RedactionRect]] = {} - total = 0 - matched_pages: set[int] = set() - - for p in presets: - rects = find_redaction_rectangles_for_presets(out_pdf, [p], pages=pages) - leaks_by_preset[p] = rects - total += len(rects) - matched_pages.update(r.page for r in rects) - - matches: list[dict[str, Any]] = [] - if total > 0: - doc = pymupdf.open(stream=out_pdf, filetype="pdf") - try: - for preset_key, rects in leaks_by_preset.items(): - for r in rects: - page = doc[r.page] - rect = pymupdf.Rect(r.x0, r.y0, r.x1, r.y1) - snippet = (page.get_textbox(rect) or "").strip() - matches.append( - { - "preset": preset_key, - "page": r.page, - "rect": {"x0": r.x0, "y0": r.y0, "x1": r.x1, "y1": r.y1}, - "snippet": snippet, - } - ) - finally: - doc.close() - - return { - "status": "fail", - "total_matches": total, - "matched_pages": sorted(matched_pages), - "options": {"mode": "presets_internal", "pages": pages}, - "presets": presets, - "matches": matches, - } - - -@app.post("/redact/presets") -async def redact_presets( - file: Annotated[UploadFile, File(...)], - payload: Annotated[str, Form(...)], -) -> Response: - try: - data = PresetsPayload.model_validate_json(payload) - except ValidationError as e: - raise HTTPException(status_code=422, detail=e.errors()) from e - except Exception: - raise HTTPException(status_code=400, detail="Invalid payload JSON") from None - - pdf_bytes = await file.read() - if not pdf_bytes: - raise HTTPException(status_code=400, detail="Empty PDF upload") - - try: - found_rects = find_redaction_rectangles_for_presets( - pdf_bytes, - data.presets, - pages=data.scope.pages, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Presets search failed") from e - - try: - out_pdf = redact_pdf_by_rectangles( - pdf_bytes, - found_rects, - apply_images=data.options.apply_images, - apply_graphics=data.options.apply_graphics, - sanitize_metadata=data.options.sanitize_metadata, - remove_annotations=data.options.remove_annotations, - remove_attachments=data.options.remove_attachments, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Redaction failed") from e - - report = _build_presets_internal_audit_report( - out_pdf, - presets=data.presets, - pages=data.scope.pages, - ) - if report["total_matches"] != 0: - return JSONResponse(status_code=400, content=report) - - headers: dict[str, Any] = { - "Content-Disposition": 'attachment; filename="redacted.pdf"', - "X-Redaction-Audit-Status": "pass", - "X-Redaction-Audit-Matches": "0", - "X-Redaction-Presets-Occurrences": str(len(found_rects)), - } - - pass_report = { - "status": "pass", - "total_matches": 0, - "matched_pages": [], - "options": {"mode": "presets_internal", "pages": data.scope.pages}, - "presets": data.presets, - "matches": [], - } - _add_report_headers(headers, pass_report) - return Response(content=out_pdf, media_type="application/pdf", headers=headers) - - -@app.post("/redact/regex") -async def redact_regex( - file: Annotated[UploadFile, File(...)], - payload: Annotated[str, Form(...)], -) -> Response: - try: - data = RegexPayload.model_validate_json(payload) - except ValidationError as e: - raise HTTPException(status_code=422, detail=e.errors()) from e - except Exception: - raise HTTPException(status_code=400, detail="Invalid payload JSON") from None - - pdf_bytes = await file.read() - if not pdf_bytes: - raise HTTPException(status_code=400, detail="Empty PDF upload") - - try: - found_rects = find_redaction_rectangles_by_regex( - pdf_bytes, - data.patterns, - case_sensitive=data.case_sensitive, - pages=data.scope.pages, - multiline=data.multiline, - ignore_accents=data.ignore_accents, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Regex search failed") from e - - try: - out_pdf = redact_pdf_by_rectangles( - pdf_bytes, - found_rects, - apply_images=data.options.apply_images, - apply_graphics=data.options.apply_graphics, - sanitize_metadata=data.options.sanitize_metadata, - remove_annotations=data.options.remove_annotations, - remove_attachments=data.options.remove_attachments, - ) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - except Exception as e: - raise HTTPException(status_code=500, detail="Redaction failed") from e - - try: - report = audit_pdf_text( - out_pdf, - AuditOptions( - patterns=data.audit.patterns, - regex=data.audit.regex, - case_sensitive=data.audit.case_sensitive, - ), - ) - except ValueError as e: - return JSONResponse(status_code=400, content={"status": "error", "error": str(e)}) - - if report["status"] != "pass": - return JSONResponse(status_code=400, content=report) - - headers: dict[str, Any] = { - "Content-Disposition": 'attachment; filename="redacted.pdf"', - "X-Redaction-Audit-Status": "pass", - "X-Redaction-Audit-Matches": "0", - "X-Redaction-Regex-Occurrences": str(len(found_rects)), - } - _add_report_headers(headers, report) - return Response(content=out_pdf, media_type="application/pdf", headers=headers) - - # ---------------------------- -# Long-term endpoint: /redact/apply +# Endpoint: /redact/apply # ---------------------------- diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 6414f44..07baa66 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -17,9 +17,9 @@ class RedactionOptions: apply_images: bool = False apply_graphics: bool = False - sanitize_metadata: bool = False - remove_annotations: bool = False - remove_attachments: bool = False + sanitize_metadata: bool = True + remove_annotations: bool = True + remove_attachments: bool = True @dataclass(frozen=True) @@ -142,7 +142,7 @@ def apply_plan(pdf_bytes: bytes, plan: PlanResult, *, options: RedactionOptions) ) -def _presets_internal_audit(out_pdf: bytes, *, presets: PresetsRequest) -> dict[str, Any] | None: +def presets_internal_audit(out_pdf: bytes, *, presets: PresetsRequest) -> dict[str, Any] | None: """ Internal presets audit: rerun presets detection on OUT PDF. If leaks remain -> return a structured fail report, else None. @@ -270,7 +270,7 @@ def audit_plan( # --- Presets internal audit if presets is not None: - leak_report = _presets_internal_audit(out_pdf, presets=presets) + leak_report = presets_internal_audit(out_pdf, presets=presets) if leak_report is not None: failures["presets"] = leak_report diff --git a/backend/tests/test_multiline.py b/backend/tests/test_multiline.py index b3ac9f1..ab48e9a 100644 --- a/backend/tests/test_multiline.py +++ b/backend/tests/test_multiline.py @@ -20,106 +20,81 @@ def _load_pdf(name: str) -> bytes: PHONE_REGEX = r"06\s+12\s+34\s+56\s+78" +def _post_apply(pdf_bytes: bytes, payload: dict): + client = TestClient(app) + return client.post( + "/redact/apply", + files={ + "file": ("in.pdf", pdf_bytes, "application/pdf"), + "payload": (None, json.dumps(payload), "application/json"), + }, + ) + + @pytest.mark.integration def test_presets_phone_multiline_two_lines_is_redacted() -> None: - client = TestClient(app) pdf_in = _load_pdf("003_phone_two_lines.pdf") payload = { - "presets": ["phone"], + "rects": [], + "presets": {"presets": ["phone"], "scope": {"pages": None}}, "audit": { "patterns": [PHONE_REGEX], "regex": True, "case_sensitive": False, }, - # options exist in your schema; keep minimal if your API ignores options for now "options": {}, } - resp = client.post( - "/redact/presets", - files={ - "file": ("in.pdf", pdf_in, "application/pdf"), - "payload": (None, json.dumps(payload), "application/json"), - }, - ) - + resp = _post_apply(pdf_in, payload) assert resp.status_code == 200, resp.text - pdf_out = resp.content - text_out = extract_text(pdf_out) + text_out = extract_text(resp.content) assert re.search(PHONE_REGEX, text_out, flags=re.IGNORECASE) is None @pytest.mark.integration def test_regex_endpoint_multiline_can_match_across_two_lines() -> None: - client = TestClient(app) pdf_in = _load_pdf("003_phone_two_lines.pdf") payload = { - "patterns": [PHONE_REGEX], - "case_sensitive": False, - "multiline": True, + "rects": [], + "regexes": [ + { + "patterns": [PHONE_REGEX], + "case_sensitive": False, + "multiline": True, + "scope": {"pages": None}, + } + ], "audit": { "patterns": [PHONE_REGEX], "regex": True, "case_sensitive": False, }, "options": {}, - "scope": {"pages": None}, } - resp = client.post( - "/redact/regex", - files={ - "file": ("in.pdf", pdf_in, "application/pdf"), - "payload": (None, json.dumps(payload), "application/json"), - }, - ) - + resp = _post_apply(pdf_in, payload) assert resp.status_code == 200, resp.text - pdf_out = resp.content - text_out = extract_text(pdf_out) + text_out = extract_text(resp.content) assert re.search(PHONE_REGEX, text_out, flags=re.IGNORECASE) is None @pytest.mark.integration def test_multiline_does_not_cross_columns_trap_fixture() -> None: """ - This test requires adding a dedicated fixture, see instructions: - 009_cross_column_phone_trap.pdf - - The goal: if a naive engine concatenates adjacent lines globally, it might match the phone. - Our engine should avoid pairing across columns and return 0 occurrences. + The geometric engine must not pair lines across columns. + Tested directly on the engine: the API audit re-runs regex on flattened + page text where '\\s+' matches the column boundary newline, which would + spuriously hit even though the engine correctly returned 0 rects. """ - client = TestClient(app) - pdf_in = _load_pdf("009_cross_column_phone_trap.pdf") + from app.multiline_regex_engine import find_redaction_rectangles_by_regex - payload = { - "patterns": [PHONE_REGEX], - "case_sensitive": False, - "multiline": True, - "audit": { - # audit should not fail; we are not trying to redact this doc, - # just ensure no accidental match - "patterns": ["___definitely_not_present___"], - "regex": False, - "case_sensitive": False, - }, - "options": {}, - "scope": {"pages": None}, - } - - resp = client.post( - "/redact/regex", - files={ - "file": ("in.pdf", pdf_in, "application/pdf"), - "payload": (None, json.dumps(payload), "application/json"), - }, + pdf_in = _load_pdf("009_cross_column_phone_trap.pdf") + rects = find_redaction_rectangles_by_regex( + pdf_in, + [PHONE_REGEX], + case_sensitive=False, + multiline=True, ) - - assert resp.status_code == 200, resp.text - # Check occurrences header if your endpoint sets it: - # If header name differs, adapt in second pass with your current code. - occ = resp.headers.get("X-Redaction-Regex-Occurrences") - assert occ is not None - assert int(occ) == 0 + assert len(rects) == 0 diff --git a/backend/tests/test_redact_images_graphics.py b/backend/tests/test_redact_images_graphics.py index 80300cb..79186e8 100644 --- a/backend/tests/test_redact_images_graphics.py +++ b/backend/tests/test_redact_images_graphics.py @@ -81,7 +81,6 @@ def _post_redact_rectangles( "apply_images": apply_images, "apply_graphics": apply_graphics, }, - # L'audit est obligatoire : on met un pattern improbable qui ne matche pas. "audit": { "patterns": ["__NEVER_MATCH_123456789__"], "regex": False, @@ -93,7 +92,7 @@ def _post_redact_rectangles( "file": ("input.pdf", pdf_in, "application/pdf"), "payload": (None, json.dumps(payload), "application/json"), } - return client.post("/redact/rectangles", files=files) + return client.post("/redact/apply", files=files) @pytest.mark.integration diff --git a/backend/tests/test_redact_presets.py b/backend/tests/test_redact_presets.py index a4e989e..d718f81 100644 --- a/backend/tests/test_redact_presets.py +++ b/backend/tests/test_redact_presets.py @@ -18,6 +18,7 @@ CC_DIGITS_VALID = "4111111111111111" CC_DIGITS_INVALID = "4111111111111112" + def _digits_only(s: str) -> str: return re.sub(r"\D+", "", s) @@ -27,10 +28,16 @@ def _load_fixture(name: str) -> bytes: return path.read_bytes() -def _post_presets(pdf_bytes: bytes, payload: dict) -> TestClient.Response: +def _post_apply_presets(pdf_bytes: bytes, *, presets: list[str], audit: dict | None): + payload = { + "rects": [], + "presets": {"presets": presets, "scope": {"pages": None}}, + "options": {"apply_images": False, "apply_graphics": False}, + "audit": audit, + } files = {"file": ("input.pdf", pdf_bytes, "application/pdf")} data = {"payload": json.dumps(payload)} - return client.post("/redact/presets", files=files, data=data) + return client.post("/redact/apply", files=files, data=data) def _extract_first_phone(text: str, region: str = "FR") -> str | None: @@ -54,13 +61,11 @@ def test_presets_email_removes_email_keeps_phone(monkeypatch: pytest.MonkeyPatch phone = _extract_first_phone(text_in, region="FR") assert phone is not None, "Expected a phone number in fixture 002." - payload = { - "presets": ["email"], - "options": {"apply_images": False, "apply_graphics": False}, - "audit": {"patterns": [email], "regex": False, "case_sensitive": True}, - } - - resp = _post_presets(pdf_in, payload) + resp = _post_apply_presets( + pdf_in, + presets=["email"], + audit={"patterns": [email], "regex": False, "case_sensitive": True}, + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Audit-Matches", "999")) == 0 @@ -85,13 +90,11 @@ def test_presets_phone_removes_phone_keeps_email(monkeypatch: pytest.MonkeyPatch phone = _extract_first_phone(text_in, region="FR") assert phone is not None, "Expected a phone number in fixture 002." - payload = { - "presets": ["phone"], - "options": {"apply_images": False, "apply_graphics": False}, - "audit": {"patterns": [phone], "regex": False, "case_sensitive": True}, - } - - resp = _post_presets(pdf_in, payload) + resp = _post_apply_presets( + pdf_in, + presets=["phone"], + audit={"patterns": [phone], "regex": False, "case_sensitive": True}, + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Audit-Matches", "999")) == 0 @@ -111,17 +114,15 @@ def test_presets_credit_card_luhn_filters_invalid() -> None: assert CC_DIGITS_VALID in digits_in assert CC_DIGITS_INVALID in digits_in - payload = { - "presets": ["credit_card"], - "options": {"apply_images": False, "apply_graphics": False}, - "audit": { + resp = _post_apply_presets( + pdf_in, + presets=["credit_card"], + audit={ "patterns": [r"\b4111[ -]*1111[ -]*1111[ -]*1111\b"], "regex": True, "case_sensitive": True, }, - } - - resp = _post_presets(pdf_in, payload) + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Audit-Matches", "999")) == 0 @@ -141,13 +142,11 @@ def test_presets_email_no_false_positive_on_secret_fixture(monkeypatch: pytest.M text_in = extract_text(pdf_in) assert "SECRET_ABC123" in text_in - payload = { - "presets": ["email"], - "options": {"apply_images": False, "apply_graphics": False}, - "audit": {"patterns": ["SHOULD_NOT_EXIST_123"], "regex": False, "case_sensitive": True}, - } - - resp = _post_presets(pdf_in, payload) + resp = _post_apply_presets( + pdf_in, + presets=["email"], + audit={"patterns": ["SHOULD_NOT_EXIST_123"], "regex": False, "case_sensitive": True}, + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Presets-Occurrences", "999")) == 0 diff --git a/backend/tests/test_redact_rectangles.py b/backend/tests/test_redact_rectangles.py index b03f718..55deddc 100644 --- a/backend/tests/test_redact_rectangles.py +++ b/backend/tests/test_redact_rectangles.py @@ -19,12 +19,10 @@ def pick_non_secret_token(text: str) -> str: - # Cherche un mot "simple" qui n'est pas le secret, pour vérifier qu'on n'a pas cassé le reste. words = re.findall(r"[A-Za-z]{4,}", text) for w in words: if "SECRET" not in w: return w - # Fallback : au pire, on vérifie qu'il reste quelque chose. return "Fixture" @@ -48,6 +46,14 @@ def make_payload(rects: list[dict], patterns: list[str]) -> dict: } +def _post_apply(pdf_bytes: bytes, payload: dict): + return CLIENT.post( + "/redact/apply", + files={"file": ("input.pdf", pdf_bytes, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + @pytest.mark.integration def test_redact_rectangles_removes_secret_and_preserves_other_text() -> None: pdf_in = SECRET_FIXTURE.read_bytes() @@ -59,15 +65,10 @@ def test_redact_rectangles_removes_secret_and_preserves_other_text() -> None: rect = find_secret_rect_with_pymupdf(pdf_in) payload = make_payload([rect], patterns=[SECRET]) - resp = CLIENT.post( - "/redact/rectangles", - files={"file": ("input.pdf", pdf_in, "application/pdf")}, - data={"payload": json.dumps(payload)}, - ) + resp = _post_apply(pdf_in, payload) assert resp.status_code == 200 assert resp.headers["content-type"].startswith("application/pdf") - # Audit OK attendu assert resp.headers.get("x-redaction-audit-status") == "pass" assert resp.headers.get("x-redaction-audit-matches") == "0" @@ -82,49 +83,38 @@ def test_redact_rectangles_removes_secret_and_preserves_other_text() -> None: def test_redact_rectangles_wrong_rect_triggers_audit_fail() -> None: pdf_in = SECRET_FIXTURE.read_bytes() - # Rectangle volontairement à côté (décalage horizontal) rect = find_secret_rect_with_pymupdf(pdf_in) rect["x0"] += 200 rect["x1"] += 200 payload = make_payload([rect], patterns=[SECRET]) - resp = CLIENT.post( - "/redact/rectangles", - files={"file": ("input.pdf", pdf_in, "application/pdf")}, - data={"payload": json.dumps(payload)}, - ) + resp = _post_apply(pdf_in, payload) - # Avec l'audit, ce cas doit échouer : on refuse de livrer un PDF "censuré" si fuite assert resp.status_code == 400 assert resp.headers["content-type"].startswith("application/json") report = resp.json() assert report["status"] == "fail" - assert report["total_matches"] >= 1 - assert SECRET in report["patterns"] + audit_report = report["components"]["audit"] + assert audit_report["total_matches"] >= 1 + assert SECRET in audit_report["patterns"] - # Le secret doit apparaître dans au moins un match (champ "match" ou "snippet") assert any( (SECRET in m.get("match", "")) or (SECRET in m.get("snippet", "")) - for m in report.get("matches", []) + for m in audit_report.get("matches", []) ), "Audit report should include evidence that the secret remains" @pytest.mark.integration def test_redaction_does_not_modify_original_fixture_on_disk() -> None: - # Non-régression : l'original sur disque ne doit jamais être modifié before_bytes = SECRET_FIXTURE.read_bytes() assert SECRET in extract_text(before_bytes) rect = find_secret_rect_with_pymupdf(before_bytes) payload = make_payload([rect], patterns=[SECRET]) - resp = CLIENT.post( - "/redact/rectangles", - files={"file": ("input.pdf", before_bytes, "application/pdf")}, - data={"payload": json.dumps(payload)}, - ) + resp = _post_apply(before_bytes, payload) assert resp.status_code == 200 after_bytes = SECRET_FIXTURE.read_bytes() @@ -142,17 +132,19 @@ def test_redact_rectangles_full_page_rect_redacts_target() -> None: try: page = doc[0] bounds = page.rect - full_page_rect = {"page": 0, "x0": bounds.x0, "y0": bounds.y0, "x1": bounds.x1, "y1": bounds.y1} + full_page_rect = { + "page": 0, + "x0": bounds.x0, + "y0": bounds.y0, + "x1": bounds.x1, + "y1": bounds.y1, + } finally: doc.close() payload = make_payload([full_page_rect], patterns=[SECRET]) - resp = CLIENT.post( - "/redact/rectangles", - files={"file": ("input.pdf", pdf_in, "application/pdf")}, - data={"payload": json.dumps(payload)}, - ) + resp = _post_apply(pdf_in, payload) assert resp.status_code == 200 assert resp.headers.get("x-redaction-audit-status") == "pass" diff --git a/backend/tests/test_redact_regex.py b/backend/tests/test_redact_regex.py index f256131..4373c45 100644 --- a/backend/tests/test_redact_regex.py +++ b/backend/tests/test_redact_regex.py @@ -21,10 +21,23 @@ def _load_fixture(name: str) -> bytes: return path.read_bytes() -def _post_regex(pdf_bytes: bytes, payload: dict) -> TestClient.Response: +def _post_apply_regex(pdf_bytes: bytes, *, patterns: list[str], case_sensitive: bool, audit: dict): + payload = { + "rects": [], + "regexes": [ + { + "patterns": patterns, + "case_sensitive": case_sensitive, + "multiline": False, + "scope": {"pages": None}, + } + ], + "options": {"apply_images": False, "apply_graphics": False}, + "audit": audit, + } files = {"file": ("input.pdf", pdf_bytes, "application/pdf")} data = {"payload": json.dumps(payload)} - return client.post("/redact/regex", files=files, data=data) + return client.post("/redact/apply", files=files, data=data) @pytest.mark.integration @@ -42,19 +55,15 @@ def test_regex_email_removes_email_keeps_phone() -> None: email_pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b" - payload = { - "patterns": [email_pattern], - "case_sensitive": False, - "scope": {"pages": None}, - "options": {"apply_images": False, "apply_graphics": False}, - "audit": {"patterns": [email_pattern], "regex": True, "case_sensitive": False}, - } - - resp = _post_regex(pdf_in, payload) + resp = _post_apply_regex( + pdf_in, + patterns=[email_pattern], + case_sensitive=False, + audit={"patterns": [email_pattern], "regex": True, "case_sensitive": False}, + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Audit-Matches", "999")) == 0 - # If you add this header in the endpoint, enforce it: assert int(resp.headers.get("X-Redaction-Regex-Occurrences", "0")) > 0 text_out = extract_text(resp.content) @@ -77,15 +86,12 @@ def test_regex_phone_removes_phone_keeps_email() -> None: phone_pattern = r"(?:\+?\d[\d\s().-]{6,}\d)" - payload = { - "patterns": [phone_pattern], - "case_sensitive": False, - "scope": {"pages": None}, - "options": {"apply_images": False, "apply_graphics": False}, - "audit": {"patterns": [phone_pattern], "regex": True, "case_sensitive": False}, - } - - resp = _post_regex(pdf_in, payload) + resp = _post_apply_regex( + pdf_in, + patterns=[phone_pattern], + case_sensitive=False, + audit={"patterns": [phone_pattern], "regex": True, "case_sensitive": False}, + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Audit-Matches", "999")) == 0 @@ -100,20 +106,15 @@ def test_regex_phone_removes_phone_keeps_email() -> None: def test_regex_invalid_pattern_returns_400() -> None: pdf_in = _load_fixture("002_email_phone_one_line.pdf") - payload = { - "patterns": ["["], # invalid regex - "case_sensitive": False, - "scope": {"pages": None}, - "options": {"apply_images": False, "apply_graphics": False}, - # audit must still be present per contract; it won't run if regex parse fails - "audit": {"patterns": ["SHOULD_NOT_EXIST_123"], "regex": False, "case_sensitive": True}, - } - - resp = _post_regex(pdf_in, payload) + resp = _post_apply_regex( + pdf_in, + patterns=["["], # invalid regex + case_sensitive=False, + audit={"patterns": ["SHOULD_NOT_EXIST_123"], "regex": False, "case_sensitive": True}, + ) assert resp.status_code == 400 body = resp.json() - # Be tolerant to your error schema (detail vs error) - assert "detail" in body or "error" in body + assert "detail" in body or "error" in body or "status" in body @pytest.mark.integration @@ -123,23 +124,18 @@ def test_regex_no_match_occurrences_zero_and_content_preserved() -> None: no_match_pattern = r"THIS_WILL_NOT_MATCH_123456" - payload = { - "patterns": [no_match_pattern], - "case_sensitive": False, - "scope": {"pages": None}, - "options": {"apply_images": False, "apply_graphics": False}, - "audit": {"patterns": [no_match_pattern], "regex": True, "case_sensitive": False}, - } - - resp = _post_regex(pdf_in, payload) + resp = _post_apply_regex( + pdf_in, + patterns=[no_match_pattern], + case_sensitive=False, + audit={"patterns": [no_match_pattern], "regex": True, "case_sensitive": False}, + ) assert resp.status_code == 200, resp.text assert resp.headers.get("X-Redaction-Audit-Status") == "pass" assert int(resp.headers.get("X-Redaction-Audit-Matches", "999")) == 0 - # occurrences header should be 0 if you implement it if "X-Redaction-Regex-Occurrences" in resp.headers: assert int(resp.headers["X-Redaction-Regex-Occurrences"]) == 0 text_out = extract_text(resp.content) - # Byte-identical PDF is not guaranteed; text preservation is the meaningful invariant here. assert text_out == text_in diff --git a/backend/tests/test_redact_search.py b/backend/tests/test_redact_search.py index 5800cfa..89d708b 100644 --- a/backend/tests/test_redact_search.py +++ b/backend/tests/test_redact_search.py @@ -13,6 +13,27 @@ FIXTURES_DIR = Path(__file__).parent / "fixtures" / "generated" +def _post_apply_search(pdf_bytes: bytes, *, query: str, options: dict, audit: dict): + payload = { + "rects": [], + "searches": [ + { + "query": query, + "options": options, + "scope": {"pages": None}, + } + ], + "options": {}, + "audit": audit, + } + client = TestClient(app) + return client.post( + "/redact/apply", + files={"file": ("input.pdf", pdf_bytes, "application/pdf")}, + data={"payload": json.dumps(payload)}, + ) + + @pytest.mark.integration def test_redact_search_exact_email() -> None: pdf_path = FIXTURES_DIR / "002_email_phone_one_line.pdf" @@ -23,18 +44,11 @@ def test_redact_search_exact_email() -> None: assert m, "No email found in fixture 002_email_phone_one_line.pdf" email = m.group(0) - payload = { - "query": email, - "options": {"case_sensitive": True, "whole_word": True}, - "scope": {"pages": None}, - "audit": {"patterns": [email], "regex": False, "case_sensitive": True}, - } - - client = TestClient(app) - resp = client.post( - "/redact/search", - files={"file": ("input.pdf", pdf_bytes, "application/pdf")}, - data={"payload": json.dumps(payload)}, + resp = _post_apply_search( + pdf_bytes, + query=email, + options={"case_sensitive": True, "whole_word": True}, + audit={"patterns": [email], "regex": False, "case_sensitive": True}, ) assert resp.status_code == 200 @@ -52,7 +66,6 @@ def test_whole_word_does_not_match_substring_in_word() -> None: - query="CAT" with whole_word=True should NOT match "CATCH". - Fixture must contain both "CAT" and "CATCH", and only the standalone CAT should be redacted. - - Audit uses regex with word boundaries to avoid failing due to "CAT" inside "CATCH". """ pdf_path = FIXTURES_DIR / "007_whole_word_cat_catch.pdf" pdf_bytes = pdf_path.read_bytes() @@ -61,18 +74,11 @@ def test_whole_word_does_not_match_substring_in_word() -> None: assert "CAT" in original_text assert "CATCH" in original_text - payload = { - "query": "CAT", - "options": {"case_sensitive": True, "whole_word": True}, - "scope": {"pages": None}, - "audit": {"patterns": [r"\bCAT\b"], "regex": True, "case_sensitive": True}, - } - - client = TestClient(app) - resp = client.post( - "/redact/search", - files={"file": ("input.pdf", pdf_bytes, "application/pdf")}, - data={"payload": json.dumps(payload)}, + resp = _post_apply_search( + pdf_bytes, + query="CAT", + options={"case_sensitive": True, "whole_word": True}, + audit={"patterns": [r"\bCAT\b"], "regex": True, "case_sensitive": True}, ) assert resp.status_code == 200 @@ -89,10 +95,8 @@ def test_whole_word_does_not_match_substring_in_word() -> None: def test_whole_word_handles_punctuation_and_email_subtoken() -> None: """ Regression coverage for whole_word=True with boundary-aware regex: - - Must match 'DUPONT,' (punctuation boundary) - Must also match 'dupont' inside an email local-part ('.' and '@' are boundaries) - - After redaction, no whole-word 'dupont' should remain (case-insensitive) """ pdf_path = FIXTURES_DIR / "011_apply_search_and_email.pdf" pdf_bytes = pdf_path.read_bytes() @@ -101,23 +105,15 @@ def test_whole_word_handles_punctuation_and_email_subtoken() -> None: assert "DUPONT" in original_text assert "alice.dupont@example.com" in original_text - payload = { - "query": "DUPONT", - "options": {"case_sensitive": False, "whole_word": True}, - "scope": {"pages": None}, - # Audit cohérent avec whole_word=True : regex frontières basées sur \w - "audit": { + resp = _post_apply_search( + pdf_bytes, + query="DUPONT", + options={"case_sensitive": False, "whole_word": True}, + audit={ "patterns": [r"(? None: redacted_text = extract_text(resp.content) - # Aucun token whole-word restant assert re.search(r"(?i)\bdupont\b", redacted_text) is None - - # Non-régression : du texte non sensible doit rester assert "Texte non sensible" in redacted_text diff --git a/backend/tests/test_sanitize.py b/backend/tests/test_sanitize.py index 649e5fe..2f1b38b 100644 --- a/backend/tests/test_sanitize.py +++ b/backend/tests/test_sanitize.py @@ -70,10 +70,15 @@ def test_sanitize_metadata_and_annotations_via_regex_endpoint() -> None: client = TestClient(app) payload = { - "patterns": [r"THIS_WILL_NOT_MATCH_123456789"], - "case_sensitive": True, - "multiline": False, - "scope": {"pages": None}, + "rects": [], + "regexes": [ + { + "patterns": [r"THIS_WILL_NOT_MATCH_123456789"], + "case_sensitive": True, + "multiline": False, + "scope": {"pages": None}, + } + ], "options": { "apply_images": False, "apply_graphics": False, @@ -94,7 +99,7 @@ def test_sanitize_metadata_and_annotations_via_regex_endpoint() -> None: "payload": (None, json.dumps(payload), "application/json"), } - resp = client.post("/redact/regex", files=files) + resp = client.post("/redact/apply", files=files) assert resp.status_code == 200 assert resp.headers.get("content-type", "").startswith("application/pdf") diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md deleted file mode 100644 index afeb7c1..0000000 --- a/docs/DEPLOYMENT.md +++ /dev/null @@ -1,124 +0,0 @@ -# Deployment, Docker and Desktop Packaging (Plan) - -Ce document décrit: - -1. comment faire tourner RedactPDF avec Docker, -2. comment livrer une expérience “un clic” pour utilisateurs non techniques. - ---- - -## 1) Docker (backend + frontend) - -## Objectif -Avoir une commande qui démarre l’application complète localement, de manière reproductible. - -## Étapes recommandées - -1. **Dockerfile backend** - - Base Python slim - - Installation dépendances backend - - Exécution `uvicorn app.main:app --host 0.0.0.0 --port 8000` - -2. **Dockerfile frontend** - Deux approches: - - dev: Vite dev server (simple pour debug) - - prod: build static + serveur web (nginx/caddy) - -3. **Reverse proxy / routage API** - - Le frontend doit appeler le backend via un endpoint stable (`/api/...`) - - En prod, servir frontend + proxy API depuis un seul host/port est recommandé - -4. **docker-compose.yml** - - Service `backend` - - Service `frontend` - - Variables d’env - - Healthchecks - -5. **Volumes (optionnel)** - - Si besoin d’exports persistants ou logs partagés - -6. **Sécurité runtime minimale** - - user non-root dans les containers - - images pinées - - surface réseau minimale - -## Commandes cibles (exemple attendu) - -```bash -docker compose build -docker compose up -d -docker compose logs -f -``` - -Puis ouvrir l’URL affichée (ex: `http://localhost:8080`). - ---- - -## 2) Packaging “un seul fichier / un clic” - -## Objectif -Permettre à un utilisateur non technique de: -- double-cliquer, -- lancer backend + frontend, -- ouvrir automatiquement le navigateur sur la bonne URL. - -## Architecture recommandée - -### Option A (recommandée): Shell desktop léger + webview/browser launch - -- Un “launcher” desktop (Python/Go/Node) qui: - 1. vérifie ports disponibles, - 2. démarre backend local, - 3. sert frontend buildé (ou lance un mini serveur statique), - 4. ouvre le navigateur par défaut, - 5. surveille les process et les arrête proprement à la fermeture. - -### Option B: Application desktop embarquée (Electron / Tauri) - -- Embedding UI + process backend intégré. -- Plus lourd, mais UX plus contrôlée. - -## Outils packaging possibles - -- **Windows**: Inno Setup / NSIS / MSI -- **macOS**: `.app` + notarization -- **Linux**: AppImage / deb / rpm - -## Points à gérer impérativement - -1. **Cycle de vie process** - - start/stop propre backend+frontend -2. **Mises à jour** - - stratégie de versioning, migration -3. **Logs support** - - emplacement clair pour diagnostic -4. **Conflits de ports** - - fallback automatique (port alternatif) -5. **Durcissement local** - - bind localhost uniquement - ---- - -## 3) Validation minimale avant diffusion - -- Smoke tests: - - chargement PDF - - redaction requête - - redaction rectangle - - redaction page complète - - audit fail/pass -- Vérification export sur documents contenant: - - texte simple - - images - - vector graphics - - annotations / liens / pièces jointes - ---- - -## 4) Notes produit - -- Documenter clairement la différence entre: - - masquage visuel, - - suppression réelle, - - limites sur PDFs aplatis / scans. -- Prévoir un mode “strict sécurité” visible dans l’UX pour les cas sensibles. diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 3a7ee85..65f20e2 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -40,6 +40,70 @@ For sensitive usage, prefer strict settings: - remove attachments, - verify audit output before sharing exported files. +## Production / Multi-user Deployment + +RedactPDF is designed for **local, single-user usage**. The HTTP API has no +authentication, no rate limiting, no upload size cap, and no regex execution +timeout. Exposing it to untrusted networks or multiple users without +hardening is **not safe**. + +If you deploy it behind a reverse proxy (nginx, Caddy, Traefik...) for +multiple users, address the following at the **infrastructure layer**, not +in the application code: + +### Body size + +Reject oversized PDFs before they reach the worker, otherwise a single +upload can OOM the process (the entire PDF is loaded in memory by +PyMuPDF — streaming is not possible). + +- nginx: `client_max_body_size 50m;` +- Caddy: `request_body { max_size 50MB }` + +### Rate limiting + +Each redaction request runs PyMuPDF + audit on the full PDF. A trivial loop +can saturate CPU. + +- nginx: `limit_req_zone $binary_remote_addr zone=redact:10m rate=2r/s;` +- Caddy: rate-limit plugin or Cloudflare in front. + +### ReDoS (regex denial of service) + +The `/redact/apply` endpoint accepts user-supplied regex patterns and +compiles them with Python's `re` module **without timeout**. A malicious +pattern (catastrophic backtracking, e.g. `(a+)+$`) can hang a worker +indefinitely. + +Mitigations: + +- Set a strict `proxy_read_timeout` on the reverse proxy (e.g. 30s) so the + client connection drops, but the worker can still be wedged. Combine with + a process supervisor that recycles stuck workers. +- Or run the backend in a sandboxed container with strict CPU/memory + limits and an external watchdog. +- Or switch the regex engine to one that supports timeouts (e.g. + `regex` package with `re.TIMEOUT`, or `re2`). + +### Authentication + +There is none. Any request to the backend is processed. Add auth at the +proxy layer (basic auth, OAuth2 proxy, Cloudflare Access, Tailscale, …). + +### Container isolation + +If running in production, containerize and apply quotas: + +- CPU: e.g. `--cpus=2` +- Memory: e.g. `--memory=2g` +- No host filesystem access (PDFs are processed in-memory). + +### Scope of these recommendations + +These items are **not** implemented in the application and will not be. +RedactPDF stays small and focused on its redaction job; operating it safely +in a multi-user setting is the responsibility of the deployer. + ## Reporting Security Issues Please open a security issue with: diff --git a/docs/TESTING.md b/docs/TESTING.md deleted file mode 100644 index d237292..0000000 --- a/docs/TESTING.md +++ /dev/null @@ -1,53 +0,0 @@ -# Testing - -This project relies on automated tests and deterministic PDF fixtures to guarantee -that redaction is verifiable and does not silently regress. - -## Test suites - -Tests are organized using pytest markers: - -- `unit`: pure unit tests (fast) -- `integration`: tests involving PDF processing and the API -- `e2e`: end-to-end tests (API + UI) (planned) -- `slow`: long-running tests - -## Run tests locally - -From the `backend/` directory: - -Run everything: -```bash -pytest -``` - -Run unit tests only: -```bash -pytest -m unit -``` - -Run integration tests only: -```bash -pytest -m integration -``` - -Exclude integration tests: -```bash -pytest -m "not integration" -``` - -## Lint -From the `backend/` directory: -```bash -ruff check . -``` - -## Fixtures -PDF fixtures are deterministic and versioned. - -See: -- [backend/tests/fixtures/README.md](../tests/fixtures/README.md) - -Key rule: -- if you change `generate_fixtures.py`, regenerate fixtures and commit the updated PDFs -- the test suite enforces this rule \ No newline at end of file From 9095e1cfeeb3bc32ec2d387322787fc5ca1c7e2a Mon Sep 17 00:00:00 2001 From: theodubus <80580619+theodubus@users.noreply.github.com> Date: Mon, 4 May 2026 17:20:06 +0200 Subject: [PATCH 27/27] add partial image redaction --- README.md | 48 ++- backend/app/main.py | 21 +- backend/app/pipeline.py | 28 +- backend/app/redaction.py | 40 ++- backend/tests/test_redact_images_graphics.py | 279 +++++++++++++++++- docs/SECURITY.md | 74 ++++- frontend/index.html | 4 +- frontend/public/logo.png | Bin 0 -> 523291 bytes frontend/public/vite.svg | 1 - frontend/src/App.tsx | 21 +- frontend/src/api.ts | 8 +- frontend/src/components/ImageModeSection.tsx | 36 +++ .../src/components/Rules/RulesSection.tsx | 15 +- frontend/src/locales/en.json | 9 +- frontend/src/locales/fr.json | 9 +- frontend/src/styles.css | 33 +++ 16 files changed, 545 insertions(+), 81 deletions(-) create mode 100644 frontend/public/logo.png delete mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/components/ImageModeSection.tsx diff --git a/README.md b/README.md index 789c4be..2fd25bf 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Local web app for redacting sensitive content from PDF files. Targets manual rectangles, text search, regex (single- or multi-line), and presets (email, phone, credit card). Every export passes a post-redaction audit before being -returned — if any targeted content remains in the output, the export is +returned, if any targeted content remains in the output, the export is blocked with a structured failure report. For the security model and limitations, see [docs/SECURITY.md](docs/SECURITY.md). @@ -53,7 +53,7 @@ npm ci You need two terminals. -**Terminal 1 — backend:** +**Terminal 1 - backend:** ```bash cd backend @@ -61,7 +61,7 @@ source .venv/bin/activate uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload ``` -**Terminal 2 — frontend:** +**Terminal 2 - frontend:** ```bash cd frontend @@ -79,16 +79,38 @@ worry about CORS in development. 1. Drop a PDF into the upload area. 2. Add redaction rules in the right pane: - - **Selection** — select text in the viewer and click "Add as rule". - - **Manual rectangle** — toggle the draw tool and trace rectangles. - - **Whole page** — censor the current page. - - **Exact / regex** — typed rules with options (case sensitivity, + - **Selection** : select text in the viewer and click "Add as rule". + - **Manual rectangle** : toggle the draw tool and trace rectangles. + - **Whole page** : censor the current page. + - **Exact / regex** : typed rules with options (case sensitivity, whole-word, ignore accents, multiline). - - **Presets** — email, phone (libphonenumber-validated, default region + - **Presets** : email, phone (libphonenumber-validated, default region `FR`), credit card (Luhn-filtered). -3. Click the submit button. The redacted PDF downloads automatically. -4. If the post-redaction audit finds any targeted content remaining, you - get a 400 with a JSON report instead — fix the rule and retry. +3. Pick an **image redaction mode** in the right pane (segmented control): + - **Aucune** (None) : images and vector graphics are not modified, even + if a redaction rectangle overlaps them. Only the text under the + redaction is removed; visually a black overlay is drawn on top, but + the underlying images/graphics still exist in the PDF and are + recoverable by anyone who removes the overlay. + - **Totale** (Full) : any image touched by a rectangle is removed + entirely; any vector path touched is removed. + - **Précise** (Precise) *(default)* : only the pixels inside the + redaction rectangle are blackened in the underlying bitmap; the rest + of the image stays visible. Vector paths touched by the rectangle are + removed (per-path, not pixel-level, vector partial redaction is not + supported). **This is the mode that makes flattened / scanned PDFs + redactable**, without it, the only options on a scan would be "lose + the whole page" or draw a fake black overlay. Re-encoding may be + lossy on JPEG-backed images. + + The mode applies globally to the redaction request. **Exception**: any + "Censurer la page" rule (full-page redaction) always uses strict mode + for the page it covers, regardless of the chosen image mode, so a + full-page rule cannot accidentally leave images or graphics under a + black overlay. See [docs/SECURITY.md](docs/SECURITY.md) for details. +4. Click the submit button. The redacted PDF downloads automatically. +5. If the post-redaction audit finds any targeted content remaining, you + get a 400 with a JSON report instead, fix the rule and retry. ### Phone preset region @@ -111,7 +133,7 @@ ruff check . pytest ``` -The test suite uses **versioned PDF fixtures** — see +The test suite uses **versioned PDF fixtures** : see [backend/tests/fixtures/README.md](backend/tests/fixtures/README.md). Do not edit the generated PDFs by hand. If you change the fixture generator, regenerate all of them in one go: @@ -125,7 +147,7 @@ python -m backend.tests.fixtures.generate_fixtures ## Production deployment This project is built for local single-user usage. **Exposing the API to -untrusted networks or multiple users is unsafe out of the box** — there is +untrusted networks or multiple users is unsafe out of the box**, there is no auth, no rate limiting, no upload size cap, no regex timeout. If you plan to host it for others, read [docs/SECURITY.md → Production / Multi-user Deployment](docs/SECURITY.md) diff --git a/backend/app/main.py b/backend/app/main.py index 7fe6eda..f945890 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -2,7 +2,7 @@ import base64 import json -from typing import Annotated, Any +from typing import Annotated, Any, Literal from fastapi import FastAPI, File, Form, HTTPException, UploadFile from fastapi.responses import JSONResponse @@ -58,7 +58,10 @@ class RectModel(BaseModel): class OptionsModel(BaseModel): - apply_images: bool = False + # "none" : ne touche pas aux images + # "remove" : supprime entièrement les images intersectées (mode strict) + # "pixels" : noircit uniquement la zone intersectée (caviardage partiel) + image_mode: Literal["none", "remove", "pixels"] = "none" apply_graphics: bool = False # Sanitation "anti-fuites hors visuel" : ON par défaut (secure-by-default). @@ -164,6 +167,10 @@ def validate_presets(cls, v: list[str]) -> list[str]: class ApplyPayload(BaseModel): rects: list[RectModel] = Field(default_factory=list) + # Page-wide rules. Always processed in strict mode (full image + graphics + # removal) regardless of options.image_mode, a page-wide rule is meant + # to wipe the page completely. + full_page_rects: list[RectModel] = Field(default_factory=list) # Compat existante (single) search: ApplySearchModel | None = None @@ -197,6 +204,10 @@ async def redact_apply( manual_rects = [ RedactionRect(page=r.page, x0=r.x0, y0=r.y0, x1=r.x1, y1=r.y1) for r in data.rects ] + full_page_rects = [ + RedactionRect(page=r.page, x0=r.x0, y0=r.y0, x1=r.x1, y1=r.y1) + for r in data.full_page_rects + ] # ---------------------------- # Build searches list (compat: data.search + data.searches) @@ -255,13 +266,14 @@ async def redact_apply( searches=searches_req or None, regexes=regexes_req or None, presets=presets_req, + full_page_rects=full_page_rects or None, ) out_pdf = apply_plan( pdf_bytes, plan, options=RedactionOptions( - apply_images=data.options.apply_images, + image_mode=data.options.image_mode, apply_graphics=data.options.apply_graphics, sanitize_metadata=data.options.sanitize_metadata, remove_annotations=data.options.remove_annotations, @@ -303,7 +315,8 @@ async def redact_apply( "X-Redaction-Search-Occurrences": str(len(plan.search)), "X-Redaction-Regex-Occurrences": str(len(plan.regex)), "X-Redaction-Presets-Occurrences": str(len(plan.presets)), - "X-Redaction-Total-Occurrences": str(len(plan.all_rects)), + "X-Redaction-Full-Page-Occurrences": str(len(plan.full_page)), + "X-Redaction-Total-Occurrences": str(len(plan.all_rects) + len(plan.full_page)), } _add_report_headers(headers, composite) return Response(content=out_pdf, media_type="application/pdf", headers=headers) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 07baa66..3440768 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -15,7 +15,7 @@ @dataclass(frozen=True) class RedactionOptions: - apply_images: bool = False + image_mode: str = "none" apply_graphics: bool = False sanitize_metadata: bool = True remove_annotations: bool = True @@ -52,6 +52,7 @@ class PlanResult: search: list[RedactionRect] regex: list[RedactionRect] presets: list[RedactionRect] + full_page: list[RedactionRect] all_rects: list[RedactionRect] @@ -74,11 +75,13 @@ def plan_redactions( searches: Sequence[SearchRequest] | None = None, regexes: Sequence[RegexRequest] | None = None, presets: PresetsRequest | None = None, + full_page_rects: list[RedactionRect] | None = None, ) -> PlanResult: if not pdf_bytes: raise ValueError("Empty PDF bytes") manual_out = list(manual_rects or []) + full_page_out = list(full_page_rects or []) search_rects: list[RedactionRect] = [] regex_rects: list[RedactionRect] = [] @@ -126,15 +129,36 @@ def plan_redactions( search=search_rects, regex=regex_rects, presets=presets_rects, + full_page=full_page_out, all_rects=all_rects, ) def apply_plan(pdf_bytes: bytes, plan: PlanResult, *, options: RedactionOptions) -> bytes: + """ + Apply the plan in two passes when full-page rules exist: + 1. Strict pass on full-page rects (remove images + graphics, irrespective + of the user's chosen image_mode). A page-wide rule is always meant to + wipe everything. + 2. User-mode pass on every other rect. + Sanitisation (metadata / annotations / attachments) runs on the final pass. + """ + if plan.full_page: + pdf_bytes = redact_pdf_by_rectangles( + pdf_bytes, + plan.full_page, + image_mode="remove", + apply_graphics=True, + # Defer sanitisation to the second pass so it's applied once on the final PDF. + sanitize_metadata=False, + remove_annotations=False, + remove_attachments=False, + ) + return redact_pdf_by_rectangles( pdf_bytes, plan.all_rects, - apply_images=options.apply_images, + image_mode=options.image_mode, apply_graphics=options.apply_graphics, sanitize_metadata=options.sanitize_metadata, remove_annotations=options.remove_annotations, diff --git a/backend/app/redaction.py b/backend/app/redaction.py index e00e54f..af54753 100644 --- a/backend/app/redaction.py +++ b/backend/app/redaction.py @@ -68,11 +68,26 @@ def _tighten_rect_vertical(rect: pymupdf.Rect) -> pymupdf.Rect: +_IMAGE_MODE_MAP = { + "none": pymupdf.PDF_REDACT_IMAGE_NONE, + "remove": pymupdf.PDF_REDACT_IMAGE_REMOVE, + "pixels": pymupdf.PDF_REDACT_IMAGE_PIXELS, +} + + +def _resolve_image_mode(mode: str) -> int: + try: + return _IMAGE_MODE_MAP[mode] + except KeyError as e: + allowed = ", ".join(sorted(_IMAGE_MODE_MAP)) + raise ValueError(f"Invalid image_mode {mode!r}. Allowed: {allowed}.") from e + + def redact_pdf_by_rectangles( pdf_bytes: bytes, rects: Iterable[RedactionRect], *, - apply_images: bool = False, + image_mode: str = "none", apply_graphics: bool = False, sanitize_metadata: bool = False, remove_annotations: bool = False, @@ -81,18 +96,16 @@ def redact_pdf_by_rectangles( """ Applique des redactions à partir d'une liste de rectangles. - Par défaut, ce comportement reste conservateur : - - images OFF - - vector graphics OFF - - text removal ON - - sanitize OFF + Modes images : + - "none" -> ne touche pas aux images (défaut) + - "remove" -> retire intégralement les images intersectées par un rect + - "pixels" -> noircit uniquement les pixels intersectés (caviardage partiel) - Si activé : - - apply_images=True -> suppression des images chevauchant les zones redigées - - apply_graphics=True -> suppression des dessins vectoriels chevauchant les zones redigées - - sanitize_metadata=True -> nettoyage des métadonnées (Info dict + XMP si possible) + Autres options : + - apply_graphics=True -> suppression des dessins vectoriels touchés + - sanitize_metadata=True -> nettoyage métadonnées (Info dict + XMP si possible) - remove_annotations=True -> suppression des annotations/liens/widgets - - remove_attachments=True -> suppression des fichiers embarqués (embedded files) + - remove_attachments=True -> suppression des fichiers embarqués Retourne le PDF redigé (bytes). """ @@ -107,14 +120,11 @@ def redact_pdf_by_rectangles( if rect.is_empty: raise ValueError(f"Empty rectangle: {rect}") - # Option A: amélioration de précision (inset vertical léger) rect = _tighten_rect_vertical(rect) by_page.setdefault(r.page, []).append(rect) - images_mode = ( - pymupdf.PDF_REDACT_IMAGE_REMOVE if apply_images else pymupdf.PDF_REDACT_IMAGE_NONE - ) + images_mode = _resolve_image_mode(image_mode) graphics_mode = ( pymupdf.PDF_REDACT_LINE_ART_REMOVE_IF_TOUCHED if apply_graphics diff --git a/backend/tests/test_redact_images_graphics.py b/backend/tests/test_redact_images_graphics.py index 79186e8..50c29ff 100644 --- a/backend/tests/test_redact_images_graphics.py +++ b/backend/tests/test_redact_images_graphics.py @@ -69,7 +69,7 @@ def _post_redact_rectangles( pdf_in: bytes, rects: list[RedactionRect], *, - apply_images: bool, + image_mode: str, apply_graphics: bool ): payload = { @@ -78,7 +78,7 @@ def _post_redact_rectangles( for r in rects ], "options": { - "apply_images": apply_images, + "image_mode": image_mode, "apply_graphics": apply_graphics, }, "audit": { @@ -105,21 +105,21 @@ def test_apply_images_removes_overlapping_images() -> None: _, img_rect = _first_image_rect(pdf_in, page_index=0) rect = RedactionRect(page=0, x0=img_rect.x0, y0=img_rect.y0, x1=img_rect.x1, y1=img_rect.y1) - # Control: images disabled -> should not reduce referenced images + # Control: image_mode="none" -> should not reduce referenced images pdf_keep = redact_pdf_by_rectangles( pdf_in, [rect], - apply_images=False, + image_mode="none", apply_graphics=False, ) after_keep = _count_page_images(pdf_keep, page_index=0) assert after_keep == before - # Now enable image removal -> referenced images should decrease + # image_mode="remove" -> referenced images should decrease pdf_removed = redact_pdf_by_rectangles( pdf_in, [rect], - apply_images=True, + image_mode="remove", apply_graphics=False, ) after_removed = _count_page_images(pdf_removed, page_index=0) @@ -146,7 +146,7 @@ def test_apply_graphics_removes_overlapping_vector_drawings() -> None: pdf_keep = redact_pdf_by_rectangles( pdf_in, [rect], - apply_images=False, + image_mode="none", apply_graphics=False, ) after_keep = _count_drawings(pdf_keep, page_index=0) @@ -156,7 +156,7 @@ def test_apply_graphics_removes_overlapping_vector_drawings() -> None: pdf_removed = redact_pdf_by_rectangles( pdf_in, [rect], - apply_images=False, + image_mode="none", apply_graphics=True, ) after_removed = _count_drawings(pdf_removed, page_index=0) @@ -172,14 +172,18 @@ def test_api_rectangles_propagates_apply_images() -> None: _, img_rect = _first_image_rect(pdf_in, page_index=0) rect = RedactionRect(page=0, x0=img_rect.x0, y0=img_rect.y0, x1=img_rect.x1, y1=img_rect.y1) - # Control: apply_images=False - resp_keep = _post_redact_rectangles(pdf_in, [rect], apply_images=False, apply_graphics=False) + # Control: image_mode="none" + resp_keep = _post_redact_rectangles( + pdf_in, [rect], image_mode="none", apply_graphics=False + ) assert resp_keep.status_code == 200 pdf_keep = resp_keep.content assert _count_page_images(pdf_keep, page_index=0) == before - # Now enable apply_images=True - resp_removed = _post_redact_rectangles(pdf_in, [rect], apply_images=True, apply_graphics=False) + # image_mode="remove" + resp_removed = _post_redact_rectangles( + pdf_in, [rect], image_mode="remove", apply_graphics=False + ) assert resp_removed.status_code == 200 pdf_removed = resp_removed.content assert _count_page_images(pdf_removed, page_index=0) < before @@ -201,15 +205,262 @@ def test_api_rectangles_propagates_apply_graphics() -> None: ) # Control: apply_graphics=False - resp_keep = _post_redact_rectangles(pdf_in, [rect], apply_images=False, apply_graphics=False) + resp_keep = _post_redact_rectangles( + pdf_in, [rect], image_mode="none", apply_graphics=False + ) assert resp_keep.status_code == 200 pdf_keep = resp_keep.content after_keep = _count_drawings(pdf_keep, page_index=0) assert after_keep >= before # peut augmenter (blackout) # Now enable apply_graphics=True - resp_removed = _post_redact_rectangles(pdf_in, [rect], apply_images=False, apply_graphics=True) + resp_removed = _post_redact_rectangles( + pdf_in, [rect], image_mode="none", apply_graphics=True + ) assert resp_removed.status_code == 200 pdf_removed = resp_removed.content after_removed = _count_drawings(pdf_removed, page_index=0) assert after_removed < after_keep + + +def _render_clip(pdf_bytes: bytes, page_index: int, clip: pymupdf.Rect) -> pymupdf.Pixmap: + """ + Render the page region at 3x DPI to avoid sub-pixel anti-aliasing artifacts + at the redaction boundary that show up at 1x. + """ + doc = pymupdf.open(stream=pdf_bytes, filetype="pdf") + try: + page = doc[page_index] + return page.get_pixmap(clip=clip, matrix=pymupdf.Matrix(3.0, 3.0)) + finally: + doc.close() + + +def _is_all_black(pix: pymupdf.Pixmap) -> bool: + n = pix.n + samples = pix.samples + color_channels = n - 1 if pix.alpha else n + for offset in range(0, len(samples), n): + for c in range(color_channels): + if samples[offset + c] != 0: + return False + return True + + +def _has_non_black_pixel(pix: pymupdf.Pixmap) -> bool: + return not _is_all_black(pix) + + +def _shrink(rect: pymupdf.Rect, pad: float = 1.0) -> pymupdf.Rect: + """Inset a rect on all sides; lets us sample interior pixels and dodge edge AA.""" + return pymupdf.Rect(rect.x0 + pad, rect.y0 + pad, rect.x1 - pad, rect.y1 - pad) + + +@pytest.mark.integration +def test_image_mode_pixels_blackens_only_intersected_region() -> None: + """ + image_mode="pixels": only the intersected region of an image must become black. + The rest of the image stays visible (modulo lossy re-encoding). + The image count must NOT decrease (we don't remove the image, just rewrite pixels). + """ + pdf_in = _read_fixture("004_bitmap_image.pdf") + before = _count_page_images(pdf_in, page_index=0) + assert before > 0 + + _, img_rect = _first_image_rect(pdf_in, page_index=0) + + # Cible la moitié gauche de l'image + half_w = (img_rect.x1 - img_rect.x0) / 2 + left_rect = pymupdf.Rect(img_rect.x0, img_rect.y0, img_rect.x0 + half_w, img_rect.y1) + right_rect = pymupdf.Rect(img_rect.x0 + half_w, img_rect.y0, img_rect.x1, img_rect.y1) + + redact = RedactionRect( + page=0, x0=left_rect.x0, y0=left_rect.y0, x1=left_rect.x1, y1=left_rect.y1 + ) + + # Sanity: l'image originale a bien des pixels non-noirs des deux côtés + assert _has_non_black_pixel(_render_clip(pdf_in, 0, _shrink(left_rect))) + assert _has_non_black_pixel(_render_clip(pdf_in, 0, _shrink(right_rect))) + + pdf_out = redact_pdf_by_rectangles( + pdf_in, + [redact], + image_mode="pixels", + apply_graphics=False, + ) + + # L'image n'est PAS retirée du PDF + assert _count_page_images(pdf_out, page_index=0) == before + + # La moitié gauche est entièrement noire ; la droite a encore du contenu. + # On inset les rects pour ignorer les artefacts d'anti-aliasing au bord. + assert _is_all_black(_render_clip(pdf_out, 0, _shrink(left_rect))) + assert _has_non_black_pixel(_render_clip(pdf_out, 0, _shrink(right_rect))) + + +@pytest.mark.integration +def test_image_mode_pixels_via_api() -> None: + """ + End-to-end: /redact/apply with image_mode='pixels' on a PARTIAL image rect. + The image must remain referenced (only pixels are rewritten), and the + redacted portion must render black. + Note: when the redact rect covers 100% of the image, PyMuPDF removes the + image entirely as an optimisation, see test_image_mode_pixels_full_image. + """ + pdf_in = _read_fixture("004_bitmap_image.pdf") + before = _count_page_images(pdf_in, page_index=0) + _, img_rect = _first_image_rect(pdf_in, page_index=0) + + half_w = (img_rect.x1 - img_rect.x0) / 2 + left_rect = pymupdf.Rect(img_rect.x0, img_rect.y0, img_rect.x0 + half_w, img_rect.y1) + rect = RedactionRect( + page=0, x0=left_rect.x0, y0=left_rect.y0, x1=left_rect.x1, y1=left_rect.y1 + ) + + resp = _post_redact_rectangles( + pdf_in, [rect], image_mode="pixels", apply_graphics=False + ) + assert resp.status_code == 200, resp.text + + pdf_out = resp.content + # Image still referenced: pixels mode keeps the image when only partially covered. + assert _count_page_images(pdf_out, page_index=0) == before + + # The redacted half is black ; the kept half still has content. + assert _is_all_black(_render_clip(pdf_out, 0, _shrink(left_rect))) + + +@pytest.mark.integration +def test_image_mode_pixels_full_image_optimised_to_removal() -> None: + """ + When image_mode='pixels' and the rect covers the whole image, PyMuPDF + optimises by dropping the image entirely. The end result is still secure + (no original content remains). This test pins the current behaviour. + """ + pdf_in = _read_fixture("004_bitmap_image.pdf") + before = _count_page_images(pdf_in, page_index=0) + _, img_rect = _first_image_rect(pdf_in, page_index=0) + rect = RedactionRect( + page=0, x0=img_rect.x0, y0=img_rect.y0, x1=img_rect.x1, y1=img_rect.y1 + ) + + pdf_out = redact_pdf_by_rectangles( + pdf_in, [rect], image_mode="pixels", apply_graphics=False + ) + after = _count_page_images(pdf_out, page_index=0) + assert after < before, "PyMuPDF should drop the image when fully covered." + assert _is_all_black(_render_clip(pdf_out, 0, _shrink(img_rect))) + + +@pytest.mark.integration +def test_full_page_rule_forces_strict_even_with_image_mode_none() -> None: + """ + Option D: a full-page rule must wipe the page entirely, regardless of the + user's image_mode. With image_mode='none' on a regular rect, images stay; + with image_mode='none' but the rect sent in `full_page_rects`, the page + is treated as strict (image removed, graphics removed). + """ + pdf_in = _read_fixture("004_bitmap_image.pdf") + before = _count_page_images(pdf_in, page_index=0) + assert before > 0 + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + bounds = doc[0].rect + doc.close() + full_page = { + "page": 0, + "x0": bounds.x0, + "y0": bounds.y0, + "x1": bounds.x1, + "y1": bounds.y1, + } + + # Send the full-page rect via `full_page_rects`, with image_mode='none'. + # Expected: image is removed because the page-rule forces strict mode. + payload = { + "rects": [], + "full_page_rects": [full_page], + "options": {"image_mode": "none", "apply_graphics": False}, + "audit": { + "patterns": ["__NEVER_MATCH__"], + "regex": False, + "case_sensitive": True, + }, + } + resp = client.post( + "/redact/apply", + files={ + "file": ("input.pdf", pdf_in, "application/pdf"), + "payload": (None, json.dumps(payload), "application/json"), + }, + ) + assert resp.status_code == 200, resp.text + + pdf_out = resp.content + after = _count_page_images(pdf_out, page_index=0) + assert after < before, "Full-page rule should force image removal." + + headers = resp.headers + assert headers.get("X-Redaction-Full-Page-Occurrences") == "1" + + +@pytest.mark.integration +def test_full_page_via_rects_keeps_user_mode() -> None: + """ + Sanity check: the same full-sized rect sent via `rects` (not `full_page_rects`) + keeps the user's image_mode ('none' here), so the image stays. + """ + pdf_in = _read_fixture("004_bitmap_image.pdf") + before = _count_page_images(pdf_in, page_index=0) + assert before > 0 + + doc = pymupdf.open(stream=pdf_in, filetype="pdf") + bounds = doc[0].rect + doc.close() + full_page = { + "page": 0, + "x0": bounds.x0, + "y0": bounds.y0, + "x1": bounds.x1, + "y1": bounds.y1, + } + + payload = { + "rects": [full_page], + "options": {"image_mode": "none", "apply_graphics": False}, + "audit": { + "patterns": ["__NEVER_MATCH__"], + "regex": False, + "case_sensitive": True, + }, + } + resp = client.post( + "/redact/apply", + files={ + "file": ("input.pdf", pdf_in, "application/pdf"), + "payload": (None, json.dumps(payload), "application/json"), + }, + ) + assert resp.status_code == 200, resp.text + + after = _count_page_images(resp.content, page_index=0) + assert after == before, "image_mode='none' on a regular rect must keep the image." + + +@pytest.mark.integration +def test_image_mode_invalid_value_returns_422() -> None: + """image_mode is a Literal; an unknown value must be rejected by the API.""" + pdf_in = _read_fixture("004_bitmap_image.pdf") + payload = { + "rects": [], + "options": {"image_mode": "BOGUS", "apply_graphics": False}, + "audit": None, + } + resp = client.post( + "/redact/apply", + files={ + "file": ("input.pdf", pdf_in, "application/pdf"), + "payload": (None, json.dumps(payload), "application/json"), + }, + ) + assert resp.status_code == 422 diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 65f20e2..52baae8 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -19,27 +19,77 @@ RedactPDF is a local PDF redaction tool intended to produce a **new exported PDF - Export is done as a new file. - Redaction is followed by automated audit checks. -- Backend supports strict options for images/graphics + sanitation. +- Backend supports three image-redaction modes (`none`, `remove`, `pixels`) + + vector-graphics removal + metadata/annotation/attachment sanitation. +- The `pixels` image mode rewrites the bitmap of the targeted region (and + saves with `garbage=4`, removing the orphaned original stream), so it + works on **flattened / scanned PDFs** where the whole page is one image. + +## Image redaction modes + +The UI exposes three modes (FR labels in parentheses): + +| Mode | Bitmap images | Vector graphics | When to use | +|------------------|---------------------------------------------------------------------|-------------------------------|---------------------------------------------------------------------------| +| `none` (UI : Aucune / None) | Untouched. A vector black overlay is drawn on top, visually hidden but the underlying pixels remain in the PDF. | Untouched (same caveat). | Text-only redaction; you don't care about images. | +| `remove` (UI : Totale / Full)| Whole image is dropped from the PDF. | All touched paths removed. | Strict policy: anything touched is gone. | +| `pixels` (UI : Précise / Precise) - **default** | Intersected pixels blackened in the bitmap. The rest of the image stays visible. | All touched paths removed. | Default. The only mode that makes flattened / scanned PDFs redactable. | + +The image mode also controls vector graphics: `none` keeps them, `pixels` +and `remove` both delete any path touching a redaction rectangle (per-path, +not pixel-perfect, see Limitations below). + +Caveat for `pixels`: the modified image is decoded and re-encoded. For +JPEG-based images this re-encoding is **lossy**, pixels outside the +redacted region are not byte-identical to the original (visually +indistinguishable). If your threat model cares about cryptographic hashes +of image bytes, this is worth knowing. + +### Full-page rule overrides image mode + +When the user clicks "Censurer la page" (full-page rule), that page is +**always** processed in strict mode (`remove` + graphics removal), +regardless of the global image mode. A page-wide rule is meant to wipe the +page completely; if the user picked `Aucune` on top of it, the strict +override prevents a fake-redaction trap (where images and graphics would +otherwise survive under the black overlay). + +Other rules (manual rectangles, selections, search/regex/preset hits) +continue to follow the user's chosen image mode on the same page. ## Important Limitations -1. **Flattened / scanned PDFs** - - Fine-grained redaction can be constrained. -2. **Partial irrecoverable image/vector editing** - - Not a fully general “pixel/segment-only rewrite” pipeline at this stage. -3. **OCR completeness** - - Not guaranteed for all scan/layout conditions. +1. **OCR completeness** + - Not guaranteed for all scan/layout conditions. Text inside an image is + not seen by the search/regex/preset rules; only manual rectangles or + full-page redaction will reliably hide it. Use the `pixels` image mode + (or `remove`) so the bitmap actually loses the targeted content. +2. **Vector graphics are not pixel-redacted** + - When a redaction rectangle partially covers a vector path, modes + `pixels` and `remove` delete the **whole path**, not just the + intersected portion. Pixel-perfect partial redaction would require + rasterising the affected vector area, which the project does not do. +3. **Cross-column multiline regex** + - The geometric engine deliberately refuses to fuse lines across + columns. The text-based audit, however, runs on a flattened page text + and may match across columns. Multiline regex on multi-column PDFs + can therefore produce a 400 audit-fail even when nothing was + legitimately to redact. ## Operational Recommendations For sensitive usage, prefer strict settings: -- remove touched images/graphics, -- sanitize metadata, -- remove annotations, -- remove attachments, +- choose image mode `remove` or `pixels` (never `none`) for any document + containing images or vector graphics that overlap your redaction zones, +- sanitize metadata, remove annotations, remove attachments, these are + ON by default in the UI but can be turned off via the API, - verify audit output before sharing exported files. +When in doubt about a particular page, "Censurer la page" guarantees a +full strict wipe of that page (see "Full-page rule overrides image mode" +above), even if the global image mode is `Aucune`. + ## Production / Multi-user Deployment RedactPDF is designed for **local, single-user usage**. The HTTP API has no @@ -55,7 +105,7 @@ in the application code: Reject oversized PDFs before they reach the worker, otherwise a single upload can OOM the process (the entire PDF is loaded in memory by -PyMuPDF — streaming is not possible). +PyMuPDF, streaming is not possible). - nginx: `client_max_body_size 50m;` - Caddy: `request_body { max_size 50MB }` diff --git a/frontend/index.html b/frontend/index.html index 072a57e..f1c4c09 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,9 +2,9 @@ - + - frontend + RedactPDF
diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bbde413d145349edc2ebc4f3e13f994ab292df GIT binary patch literal 523291 zcmeF1^;4UD(C%rWxRyfEgy2r0NRa>qin}|-id%646pCwbC|ca11S?)ji@OK+;K73w zI6UW_^G}?4Gjk`C`_3=f+3)VPpKGJkRpkh9sc_NI&h3NX~jz9;I55a0guiiRrN$hx=^zJOR{0;PJ9ewT?qorhvn2 z6_t)*nS0PGv6O0p#FN`R zh{SzqMwm~pDExqE=9~?MYmohcI}F-fYhm$9q{+nx0RLVfGh+T=?oMK*Bc!oEETOrb zTb$1ImYAm`{pQS0aG4e+?<=}}%v*y{o0xgTvW_d&THZGCXZ>(rP3gp9>E}}B4y3|+ z73BB0_E$W5gIA#i2ffxu%>UGqiUS)|o31l%2 zBDcxa?;x(gK@&S~Lxd0?O$YuQM%K;67>E^o5ld8oixg|0%jWj|%*eF*uYME@EptjH zNwJEUBr@Z~B=e>e=&3sk*#jzg9k%aq^l0L3S(jz=>tfS&^dOT7%yuX>{T1Zc>pzWn z>Q44e{$AA9D8E-3%1x@>k@6xCv&8+A5^SRl-)*?OIWv*+sySFm=Q7*x_hy*;d2X_N z%#)aNd;bjXUqGeBa;#Kszmed04D1~YN^G#SO5bvQD5cQ-cdM~ocPS|O9gVPy zqnH|ba@Q&chrEquv6&o%D)lH`Pu(Od_n0q@Fm|wF_Qr~U2~b)grxAHoJJ!I-J=lEQ z0YQ*2&L8?2RA*lHO_cM~q*WuRw6>{Akm+3gwv>vb?>gG|EwlRPICYe-vxZ-1#+1<} zj&o2%6@EIN)?7sA@6^y?Jwf|h$PUQwv=~N-Jt7sZyspC4Im+vpHiQYM3~d#dEvIs+N2+a1H)9;YPw5HTD0{6 zc}7>DUYI@Vs(*OlIBqSWjBphW#-%m~4uz z_EU(|1oRv!P#TI9fq{rDhkHuw09l{Tv0059)Ze`z25M?uy6ywDFEupU*-LPe&B(<5 z#jcQrCUDq*sqjIeGJ$t(673=L5Z+eLH_ZwY!#m-FU~)-y{})EV@aI3t_Sgzi`Eb7D zLbaF!E|c#*P^u`l(t*Kx)O7X+GjI0P0L06D+JkLdW?oa9r_rU-N$INaUKTkBvoa~H z7=Hqr@9LFB$HMm+3=62Ee7UqzT>mUoJ-!%P@}c<4v1h8s5hC|Q?|5SzS(Hc1gJ9i)7vbyG!Zpq--;y>T}7ud!jn9+lp+ed zL21Es;^K-_iX|$mw3QeOVLb2*!eq-=1IX-CzC*bP@M96SV1i z`U6Ra4|R2UO=?ZGq&XZ$2WlB+K!eCP4XC_CwN?DfMdt;&QqHW1k-!MwIsm2Fr%`Y5 z4o8_LUEn8sNTGXl;aN@^8Dq=sdX@16tB?l|7ebi3QnC-7K2=)Ovt-7>)4Aio)cHYk z#gJjoBQvuh<+MQzsIhg1$-^8>5^@n_V5a-5%vLyb8O#y>t4w=|bPB=lH&*@=%kQpkv`nJfds3@2O zwlM|E%r#^S4?aQEf3}T1V(sYpuv;UQV|9lac?Lma)7F&B&&~88^FE5-Sk}u9_6IOQ z>-_KRdNyZZ&qx+knl4U?6yZ)n>w|$?vi^8V+|l%- zQd+i{-`ce(W7z$We|wd-%EvALo(Ki_0-Bp9M1*dUtuR*5^0VjgVyX8m)ayGLj@1HiKsz+^xyMne zzt5WX>HKVcI3Gbitf^MVWr>%@QF5X!KX29PcPd_T>af5|G@`(ZjN8}S#>LZC>#^OQ z2y(RTm&K~>_Q?mVV4;UPQSmpu7pEsS=_ld@;n0x|{)h~Y3?87?nNvLL^hdG6UyiYG z)W2m%PUycJG$Ox>P~9>t9*lHU#Dg(8IVKsn+e#VgX|<$zmft2Jl;u~GE%BKEmd?9e3bd-=IfzP;rY&bU zw40K<6lS?n%Yiwa1yicGQ3oq*WT_YGO?iTxJxfl0w@X(8x^_DEvv-@R=SK*K0@Ye3 zXm%+b=axe*gI}%s^mt^d{Wnwl_$lq`9-w{17zh^av>{) z?Mwd9EphwWMQ2e|(iy~jXh*ymS}{o8>o{}36-2`h7MFZZ7PYUd#sr)g5hY#N#UZv>$8@5+DgPGIa*?~2H`~qew=K^_=!gRTs#(Za zlE%C9bI~D_fN&CX89s6SHr3?DpS3kt-%(C8&n=ep8R^Um+7xgC(w3T%3;6<%=4OSa zb`jd*`kCK`9Om9D@^dI8){ChxHb|0>ohEID-#|iFP|0)ZjyeXg?-tzvNUOeuo$|$U z)d3Syhthp}t%j1qVzZGaOC<+8!qx}}H3jmV6tI6$mPdKu7L^sxrvf#Jer>Z^lEf8+ zPk&<7?cNyE;^T-9k&e>noA_KNBX%PZSVYTclTh(5Kskbw&8Tw6eOolyRFGSgNf^8X zNIHTRdJ@VtPIbU6leDZel8%b?TuOS|Jh()9$;z!E#Zwu1vsjUvAN$ZW?oE~0K3}j_ z2T}sl&PIDg%>wlsN%o2e`VNh0UPKpjwo~CW;SHFQl{F;)E5u?2e7GPP|Dn{xo;`=v zW(NSB#RFc3CNO=Qq{abR35wtKNwlMH2|B&XX{Vv_aF|||9;W^19O7jQ`%3Yu`UFD- zxAIko`8vsO?iMR$NrP9oU+iYs+Np|4-GbU(H%OS*sA7o$fUmYeZ_M5I#rk&HlGs12 zE8Dx5;wyN0tnhJV4YH(41{#4YGEz+wueV}T&PtGeFyZP!Z$({;rIiNXwd|>4xb=&5 zkz0BJJxWIL;FQiKvv93JypM-|rkX4EZW|f?ces){rXznjf=|z`tf8YQN#C(iRL~)> zo!n5a+j8;avMc%W4Qr1}s~s%iFjp+i7=zmA745-L$r)|`AP%f_E5`a@UD%q(UXA3a z!_=epP@$`V2ciJGnxR$%ULUz|L!g9ej8FhLhvSlb;pD){Rx2=tZ>Wo93`HEQrhIcC0KexDLwH)^Az+? zi|N19T~kGoTo=ELDnV?tnQP9Th6}aKAq95bz!3H#=UUT>8C#euNfbo#<^wPuG(N1BV-n%u zp$U%8bJ2Z`_;TOJuSzV%ZK*857@81seF%~G8B*8$gS=us`ntMe>G^YDfYJ=!w8M#O zMPtpw-$Daqg4Ri&kwL#tPam_Pwu7uHjDc&be~EJR412Lo!GRNbopG5^mlmbNA9!IE$&;_ zB0x45l;JGFX~N;2la@E5&p(1~=~B!bkJki2iVFnZ(5 zgN|BpFVX6$gA=w85$N7|T;cfu73cSKu8FHj3AyP_?OW~4BJa05SwpuZLy#jUB$ZX$ zCGi6-M6yakNGdg)6)SNxn{GSlDp1MNe`MuA7g5cM8EVLS)gjE)x;QkCEcC}+P3b@! z1Q2OZ(OPZa2y^1CmQH6?2Nav z*m1ZJl}z9}9Uq|J9j={5RK=@_lf`3F5Ss~E9U2?HR{wiHwHNlcP94|4u1X<>q1sfw zEUO_coH?zl4>O} z^KVP6OQ8ZO;7&kIe%$wpMTa&lQOlj@Fq=yVu#HD4rxgH#$oPu(``ijNOa&Tt4*6{^ zms=j!ZSEGs?AnzB;7dn#$4%bqV|zJ90cR0bOiVP%$W8}?QsC)FdBhQplNDiy<6cv9 zv$JY~%G~F(;N-v-=E221r~{mx_BjPFNZYSl{dDT!Z%FX+n;j%M;!8%f6 zzu`;yacbZ)_Q!<5tg{4TtelXG_*6t$@w-&zlW-x6ud48G)a>^6e4%L{0uy95Li{9Y zr{DPtYKn1uf9Q6&!$tygyn{sEA%X30k&j1efk?F{pdt5W{HZc;5t~ohZmAT;{hcjy z{IEq%Z$wi6;;UXrG@6|nmb~#UkvU5T4=8o=fzZ0gjI^=vm8pERXcbyCg`h(6V)gGz zHA5=<+Q^HNw>PoLg+N@L4PfDSs4sg>+e=RG zA=53ut5c|1rzSh<~QLhm$^SQ7?JNX&F6%Kbyn3xXw0ljfvvS!GS}W2ymtzE$8P4| z-jseHK(s5IQz5FkDk?iBEU^0TQ}0=c)M$Qsz*3WUzGL>#x1x9QI)@b#M_K8y1JT%2 zi{I-6{kURHfC>>ZkA{r!?p%SF~LdZXYypG9XFV;Q)A1;B9q<(V5QX>AbEodOCV*hi9M7tIOspDl7+#+Cs z#-J`>#M`~Aj$Hk&k*q8mSu}?}fll8^Uul4LHpR@A_r0|^?ic?<7WrxYGkRzGYPR7- za>{D2+R-j7sbO{6!3w=Hl)>1{MQ!{SLLekR)t-qGd;7fDaoaI^vIU6>*(|=e&DLs6 z1(H=F*1FIM;Q?U*qrT{6tkK}b?nJ#h+` zn`0^H$n7BM1NIND?YZ?rN9vT^X(s8<3bvZ$#@ z+q7db#RCvuPk-Gh>T>i*U1dhbTn%6czx;~hEB)5v)z4ceTG5}me^@r9J-p0|8KA?&O-6HP-%{OEbmWl{BGlh=j> znpSE#N_g-tLSI3TCtBn{$>Dbx438mySHzCYzA+VEuBc`S;4p_G23xi|y-6nL-@4am z&DO{4axIvE%f~uK+5T$Y_Y3r!hL7^K6V$Zs`rMLfLQnhlgMg#eNa&7QF z)W~g6K#E@(9_pR>;cn;pOTbL8+!j~1Vb&61?>t6=4tZ55J*veSTi1^n z6&TnXDwb@{kXyRr?&+p_m`^1}V~-w6^4{n82lecHCC|Ata=jxY^ltY(1~O;Pn|`E? zCs5f1TdH5=LRzZ-?HOF+p->cY=yXf-{O+SeFeGe+&2=$~ugH2m-;#fP-`%gB{uoL8 zs=(Ig4JN%{Ym4kA`Xqp)`{b#upM!=I&IwmUulI32>kyTShkBfWh7(cZj+#dy7Afr* z{we2hEqY%fTO9OMheE%X6_$FDQ@YitEQ)lM$@e6&cv~2DZk_5@Y)iae%5o zcE7NyZ8S!M$?YxOnAQS^U-gJ1GHZ<}*hi+DfwjgEtIF|z$-dde5_{{XpQnwU2v;t~ za0W8T4_bB^=?jJy(#JN9U3e0 ztKMd!#LJw6x2jqP;QsmS7NskH7`eUZtG-h5ESx8 znG{q@NJWPYLJL}bSRp!&U0GV?_u{Z{0i#`-^UgsW$;2HQxfD=J%W}RW;W#RwjKPgJ z%AfJL_6+9cV6SC(jbCk#-Ps1on-ar&x?f03T?IwvCnxcdblbwrYE+P~cFIk< zD*_!exsE(XKODWk3h8wYT)Q6j{tWSFnJfwX!nzs)3;AG^lLi(vV>{Ai4*a6rdHLHO z;Ui+wT)MqjeQp($@pe@jR&P4=*81(et8t;Q35R<{qI+Kb#Y*jm?U|JWvHrCY&K4ac zbaCr$^3Hy*bDe1@?X;AG*T}3%ebIz4=bwkk9A9-AIZ@;Rx64iT#sIL<&29RK&^gkW znF!0XAh^><(ksfp^a2)qNMaYVx#!VxmF5j~1RIVn%kC42=!Q>EL&yZ!vUWZ<&b4Y6 zCRx<>$#xyhJon9w43-p^-pf18ede_wsS!(}0OW=Mna4tQZ$1{Cn|w2((x=8Jo)oh9 zvuceVs<8KWEm2B5)xm5;<+mvjoLD2!L9?vbpH}nY8Do#i+0tuY;t)9wAAHcQn6?qx z@t+5ar>%ki*#+o^JU)yCUbNv)$@FuWbJg=o^*{fgZo28RXwpVDQQe;faS$^4wepE4 z^cw5cU)6JrGS0H}ksrTNf3xUXV+~31@x?>6KR2d-b-$^HX4w?qzf9uW^oJ{R1RyuG zURMABjT#_!X;yaaZ?GA>%S;xU%d@;h`>!miG~qD5BuvKb7Tm^H2W45vpN}74wo3 zWZf3+sGrqDLC`9{J8YtMoyk zJz@7bmwU-EgWKy+M|KzXVdDUURd?&rCcOx+5l;ZMrk$E$AgfM``p}$>=8!GIs`y+s zd=DZIg0|jxLl?m%8;E)v@O1ZY*a3Y!R&w^s+Ne|5LO|5g62*9Gop78Qg^k?A|wQzHH^%N z06xY%CYq9jwyVeQvEYDsLZ7%Xmbd+3^^5PAMhvja>aKv#&Ij#|)g3JYJDAU779z(5 zBxPp!J7k#zSVI-8t1dSvoCoCJ(7b!v1X-BP_vG$uvR(YBeA4M7ZoAS45;q7g8^6FO zHXX_(&Uw!ASN*F-H{-U-hA(4)X0VvkC~P@Fc9%7lNn3L{>Q>Q>leB~#L#w9Q{;L2z zUJ6d8E=)@eqj*r44cEO|`E_k-N;3_}Xd_~F`$$<=c66NrE;4$zeN%F!Cq{RR8vyoQ zP8Uq;bfFK=J=DG}bKHLRZ1;M~WUuf3BEU0w5E6RmcB81ac5*Yj*Ec;<2OxeucSAN9 z&Qt02CZSWx0wLthcHZEpJJMhZ%P`nBDFd`Bai4GJ;+LNr&{cBk55+=kL$v)dznw#xH}d}^ykt?vVT z$}`BK!xuN=m8NMc(`vh8b5{j|CKoWRg*_|Z%@wNhVa*yy(wufpMsCxXC?|(p8mM#X z9)|PGV)c8W6yMqL8@44EcDWfX`c7~w1z7x^|o)?e6 zP($!2$}I3wtMxiA0Vl*1a7ktKKNR%~F{OFTk~iR_c#@R*kF1is6h#Di$uBj*IP1n| zf$|Wspa0t0c|H6yM-jv-ZWfi7X4d}lxF+C;UDmRh4c%-LQNYBSeM#H^_%soqK}acW9YZaW4CerBcB(uwIl zb!t4I^lZio<{p7R)n`rSTPGWSgqcx>)oltNm3hKq5B?E&G@F=__m{59%drtmqD_D~ zt}ICMsBFXx{vAbH(sGE`<2S^wr2S9vq)CaWWF`FF=KZh73Pa2D8c&m$QP**K1Zib? z=N#bxV6@q+%hO1${NN`RG!=Ytr)5>U?!OrUKkL}&wdjvdHs=ZRZ!t@!KVR@p6!=jR9SZtbu$m%^TGonGi zt*ofh$fL%sLABP<W4{oIo-@<1(mkOief0gEe3T3j17v ziuf^s_xnN&H2l#FxBM!*?6>f@S4nLCd40kBdbNVhx|cyBp(f0`4&r=`Mj z@jQeK>S0`H`=wg2=yErSXhln8MWV*a>mFG?E9}W$Q^Eb*@>lQcIMj+>jfEQnTkze! zmPM)suuc9pEbF=5`<3s=?X+E~Ir0L;R%x=9JtZ#oYO)LHplr3v-5Fa8|r zn3Bb?%AYt8gMI%(aIeGbz}sJ^fX9IyUB=GRGsnA@sp294wk)yi-g)`82LyKp8)vwb zdNJxL<;;Rt&7btV!9aA%ogy8?ny4vJ0Uj{-gvnZJAbL&y>4J>NB_Gxtm)aaJukLp3 zrdF2tgc-&;;n{CDUZX9Ga)30j`igQFuxtvtN8LM=Q1iJef#k^u>GVHns1UQf@1m)| z(zf$7#pEkn#eqv7l}nolZR4l4)DohEl?DL&?y8C4TAr-tRSqWv)h%B(ov3$Lvm8%M z9)c=wENNyxHaN z#LmueEp~%jQ70vP0R!Iv7#1t1{khy3C>oP!5@r&_GkC0TrX|?+PaXDK(=BHis5eeU z*dQ4R)l%x)j?aoBrbYTj>~1hA@2rOfM@vl(>m4=~7WhRw74Hr2$qJ?6LKahwuIHaZ zMm|m5i&L_(7fQEsZsSYeD?SjhMLtJ+eHApmMnKX_K%|X%NMoydLN|`G*v@$d_)G0< ztkNGX-1M3$v?_G%hz@08g}0^~T#eNfw3KGFLPtsaHR+{9%*dYkZf(J|UUUt+g-;QM z=0Mv=8P|b&P`Kvg+VXf)H}<-}{#I=V{qGg?Q}EfVy24J3uoC68DMm&Puz_ZNh-9a< zwQhZt6c|?eLDx?fOt*gwtL-O$@me^*>i4v8TVSWyZWM~QY2zZws~ZJeJ2g` z%*tv#R(R+aN%tdJOS$4_TI7OV9o&8Fymto-Dn9DlG(ApPK@~*xyv!h(iU-YM7t6c> zJ#4V_3*nB7C6=*yp{+ab_=6Rfu6r*p=S~xYk<}5mfbl!$3YW-L1uBQDZ6hn`<;(;T z?^Vc;K%S0T!hz8lpmVU1@+Lp9J&j4re#niY#JE!sIfZt{|&)A!%0#_3PC1y)d z18Jwn7VwaOQR90%k)4(RM%b|H@SlDJ!uIiQQu7uBW*N+xNmoflC3U{m5pIB#Cx~gN z+Lba@w4 zZ8yCR!eE!!zfwF$U&S@=%+O~Zl*<8{4hJPFh?t*qU&FBuCYy6W3VwN7M}IcA32HYV zh)(CTO1gJ;Ftb!hdpMY&5o>H3kIaZv!Z|n(J*5Eg*uV#uNWp);Shn+rhMNFiJ3kkU zH{?W^J{T7y6+|lsg|AV^rC)}}l|!rI9?ITh8}N3WLjzA{(Yz}@*S;|dTY4@@%OcUP z03aIZ0To5*|I(LyA--=v(9>NR;cfjToJNq1ie`{`(yqQ7_RYhGy^v3wE~SF=Gf^J4 z!YgYhsr3Vn{yQsoMa_N^va#G}1!wjh+*d;{DB%2T%Vyz8 zUQ)h|Jdph@&#|I4Y-GG~Ur3Zf7mYzGK)6(zbn?N)4@O%X9dP-h*7YF=hwz|_@fBDffz0k)tfedEl3l;Ak?czEPqa@L`J6)Tvu z_=obSfgx+RdG+DGwYFUg#&(m@Wb_!g+A;&Xzi?l8%sAu?Kp)3R2q;4y`B3Nh5n94F z?~!k+KlMUR7~$m)U$_n8*zAlew{N$>b#c4u7EP@aVP{8B7db9&9yaQ`G+uaz<&Jg0 z7Jct@yrV>Q9#SB-Q0dBgx5S1UNL_j>Uu_LJg?Ok#KQvtsT(;!Q=E_>%@rGg|1X2T) zCCpIPTAqQ*z8vt5?d7?vt8_ilJ;=UBUtldO(N7#qBAa~3W$BQYv9D)BZhY>7+^t|E zs{Be+lW4{+{y3av*=$xgHr(;+)`@a&rbTun<_l_x(g2{y7hQI>D2f%f2*>AWM3)2D zBvQO~KCQfY@_rb66ugsUI=^;9d>*l9ya8tqV-MRB*0#)2x-w=)bWerGB@p%4?y&A+ z&V`0|3L|4ciBr%y56!wXZe-=EvjT_>T1bL3o@|_OESa9*A?gigJU z%+Wep3X1Ks+{k>2B-V2irmDv*bHe+j2t^z0oM}D7(m=CPhg#zfe>rBcp0nJyZ1XIO zdMh?bBS0JW+G*=~7RceBx(Ch!HkUOtfh{VqeH8i{`Ic3}(O#`C*6e=Wm(>Q9rXv!SKUKqgTe-$t{-0QmIPC}ny)Pmj9bp6C5) zx_?npPEDVArzPy(IJjY)``y1EQ@oq*UHH;B54&J_nV%y?gKs@jCr?x4LEjt~gbJdv z^o0lmo#m~j(by`5&TPP$GtZ^NUla?jVd%ZOTQL-Y2Hlh~>oeEYnbC8Tfg zm}8C&b}2Qr1iSx`DSe~b??wK;80B{q%QcN=Gt)y4yU+44yXS8Fb;|o%H9XekotV;S z&)kH5&zReCdJ?#lNA!c2*{b>wVCd|~F4MFN?a+=0xYtT_yCOof(RgYcplV!0Ssi|U zW>PU`Zr0S`7@%f6j|4lI2|h`Iubqx`qSbk`kY917Iq692?VO~Jnwy?=;c>Q`_*4fR z_yfYh{z+ZEMCpmESZvJbTM|S`d}H-EPefU=8oA%gCaO%V}e+! zqWIwW9GuhvRHvp>-x`z+Bf@;ph!dxJ_p1#Hu}z}8dVc|Z6eb`EH3rRzJe{Q2lQ@?z zfh@AeTwA6uyouej1fi;+6h=RxqPd0n1OT`E7t`RacZVH)qhTtA9ZKOCe~6U;;#BnQ zDB414K`|eocJR+UDUHFYqV`Pw%Q?ZZ?|=SfH&eIO;5-U&&T@k|NMra}_-?Hp48sME zI_5Yy`~s2z6|2zYT-8)Cbo=#D1?sgbT`kn6^Y}H2VD4j(JhHah<(K^ZB-(p)8Hw8T zg>+h_RWvvKhfS2V5+&W_9mnAirt(4QGI(OY!Tgr(hPy{#*Rb@$8t6WpBL%5FSex{k z-Ggaee0AJprPj~7X7T-kMH+|C9AT^&9<{{>TlxI$A%i! zTxU(Y&g+&6Oe9tvobVhh9oL;zsw!Q6nxg-4SD)+gZ>bqWn;1hGE*}5pEI>@xI&3c7 z!TN&_(k`!qMI@Awh!&pJxnJFWts)hIZP7!z?3Wfqk^7-KjgCX=L)d4sGdU8Z9rS(> zsUnZWlf@FdA8`J8N5P4c@7-nQh2CN1_%xdM#1**LAA|ZK@;>PVFMDM+!xOPCj|!)j zMI*(cHzs<({-=ejg}h%Apu_B~+ES(rUFXYVt4&T2o4+gJ0hCq;=1tF2?rAGVit14z zQTgc>*d?%U{A&fLbdD6&>pDG{Q=_6{M_%(sUap-B^&qO(NvHWMi|_LpqJ6yUz`o+c zPC@;5Lb1K5&NmJp%bZ3Mk^NIzwNT-_=SFu$G!y|A7xq3lm!b>{Su#AH34fudRQiQ_ z+Ig231Z@002h4v5a(Rb}Z)vWq@#;f!r@nMC*R=3d3i~h1cF?sxW~U+@)?C3RqzC+x zp}e-L=rSyKV$Sk_yJUo!Z|Z*l^reNebrJSW(LE?r1)U)%l{j-?VeNyt3f%HHb^%Cg zqpr=Acz+7;^2toWr^C)A*$2FOAlV0!-Hw0veYBCdwOMM&On~5!OcnYdPf9>-5b;Ls;aN1Q!UxL}e?+EV&VtN@9mJDU z8*q2$9VgiQiNWaI^1{f@3PoF(tV@KWKbkfZ5}6>FA&Xld`U4SCGOlPEGAGR^-e3-m zfF*kHOWOK4ncyK7i2c~uqYQnY+xBsM=e$)4gGG-X$tz|*zX{UJSkVquIaxDIzt zvv0f^<-%Df@t%6eL7R&Tov)NUKj%C}?f`S4jFw=%^Q7s^34M}w4n_)4Lsg(W{}W`N z*_mAzpk)6S;`dm#zv7!J_p~VCgF5*OrOb>jt@&(oDN5H zW8oDWP4(vd>Q_F*cw59ub_{zPduwFyw(h@glt$UwV^)Y7*FneI30LmwmnY+gr|J@= zeABdTihna;6X{u_!I+VAm;}TQVVIHEd%u@VdkdCtf978Ci>>(OKPym0C$!@!wG~nN z)#->$KwLU_JY=~%j>ao-kbz!3hei@jZqrv!MK>vq&-@8~8I<8C?`E&^-G3A+yaQ$^ z5|ql=crpuRQpT07q1dE(eZyJ$a_FHYBOLspwl8H|B7aPteqRBzFBOVBexDUzm~Fq? z=(~ufv$CuC$-%U>ebzW8-bK1LyE0$>;y7z$XOsfM(fgZY{Fuh8jeI3y9bQ>rC-_4J z-I9tCT?V^uYn`8hYQa|D)+oY+U$8-S-H-?=l~HWvFHf!hI_!N2#LB-)GI2VjZs7E% zlm<1uz3inb__HDR6wEFUkBV-#?+i22o!l=iEdWRQSpUA{LrmS1tp&H74BzW9x=s>2 z<0C(s?Q?G~wX~jF7V;n<1{NYauEY_R7uHj-!=do1DKxh@Czs^_N=fuTFRLsG8^qCN zn&qGH6mR{twqN#0dYgy~r;~+Wo%nP*zsc%_$n31BdB)~S@=BX(88dYpiQQv_MUd@a zCrPS}45{?H?UBmDXTRwVealxOI_T76i3jw9trFA&PF5r;p1iMJ%Y(~hvq^@p34ee7 zu1QHqA93+NAX;f^Bl4b|Uo2^XI}2u2I~{V-1yQ`KeF};fqJTw;;vlZ>M^msopBP=Z zJ}$LF^JsUY`0@GLc9#7uOwlhhvj~+3rhf`ifKbz}${Mn!O`8 zuqx!=(fr>IhcHpF-%Q*=XqEgM@e45BEwWD>+H~i0Y#MNV&dpegMM)BeozzYBfT%lzNM^!56mE#d^2a@#UfdS>*&Uzg!;ssfGcn z@0mzQu-R}}edx~N_2U^`jS=vk#VibwDF%m%M}t!RePNRIB`>$M$(*Q#lCBm`gXA%> zpV<0!CO#2-H>k{DOH89Fi8Ugs51`dB#3y}k(j+WzwoLJ@s3gVEEpe}5;6fF<i5u;U08dX3G+yFNCr?GX(zS=iQ|Za zc8~&8tlDJsKE&OH0%xNOYJj7-Cw29B@TCOwHR0Qut9<|Of44#sUCF&G)QLwsJ0k)0 zaL4M#W|gV$%PqUbYa6))fQo+f>Y})kzbOIKh7qNuv|eqr3$vc609%u*XxCGLqf=t} zOt}FG2^`|C{Yt}4?!LP*Uw>evsZWWefC!w0qhoH!9J>UuUKsXq@W{^bc}K(HQ#Y8R zm!bCrSng#Qc&!%nu|3V)n^vB5p985C7GDqsDw2PSYMN7%kn`$@ldS0ag@13yf>N?Z zT?&`>cb+^&*56FgOqc5?m&OGGuN%WyZPCbxf#Nr@@_Bu@u)56^-GWk1Udv+78ew+f zF5DskAn>zjB%M%5*5j*{+KZ7d;x%E~v)_N-G?ZTjVfSKBEs}2R{0HJfgoK3pL1};V z{GxT|p32XJqHf{)o?lew;}qxf`o5_3p;Ebk&&bZ}Q{?26LJezQNlZuxyIFV&p|mA3 z$K6Qas?$!;$TG{w(g`4+bAG~o_%{JaLu@tIvqiG5v%c`L%65@lO-;0+jl3E!4N?oD zN%ppO!7?M*`JjW{+%C^2Ui33&eG!J}3EZ|YL?!I6?&oaTQ2J5QY9wl5M#gJOqyJgR z_(ESoiVPn8(>|5kOEs5qIREFt7%uKW5q^i@^Kypl?}YUq3rW%>x?FnNOgJkC5{y^~ z(7=W8C-aP&#zd&z&!N>J{Gs~{wKumk6G9&2`^}!6p0{S%-`;zsQ}4^R2af5&-@`zM?oR&d zGc+%xDy35{ag&9rYs{FOkCh2#FiB2ak>6r+u{(KRGEW@{PH!n|o0mh)b+$k# z-&qV85-1MTV+SC-MRCO@2PX}X-_FfF$956RHF3G50II{Aj%V$)@=Qr}`4n_PMc7Pw z^1zaIh#yw9B|{vWXoz<}4~7ULkbGz!XdC3ioR*aVEJLt`%(@Tm0HkZ!yhyAqv@)xq!ZLIU%nlcyXME;9mPq^)ZW)lvL$y1)AC^pfZIRy z_?E=knRF)Gpo~0$;b4!8tR5}RRxWW2 zd!6qjFJ=ju1!pi*y!2lv1W^zrF_{(N$68Fvs!1+3%^w*adWnjG!GF6<2p6|HjstEv z4NmV?p6@Aqy%1lY=_^HpS>4yae;_sUz{e}NYo(-QRl3`)GVAZxVtadG%P%QLG^9K{ zwc4n)D*BX_2OppU(?~v#QUBSymWB{3b!PXMi%vGofqyw0nkO_P8PWgX?t8tDe%l>; zsUDYn{@j zv2s#5BorFs6+HWGEggy?+y_rXenIp#^wD%rK7IgvI8oIGJK>ZI1qF0z|G7Ons*d`78?iQV{L~X2Uak>dKryZ za89V!M(gEt>S4QRf?d58aH;33A@5!ATF@C6si~Mg_>N=`!#=6zP@jAZZNcOGLO-&Eg63@{vC*y0B;~2!S2DXq(02YiVG4XWH(Nt=T?>0T;mtMK=EP9b z8${xS_zdItehC}=KCa`Dd{#R%g|!^9GD-S^4S#z4^gU)rm^Nulu;DiX;tz=w6}fl# zM9WBf8?2Gz9}8J?v0}JxgnLmjlrX}#!tVF!^VoDpUc*-jGOdi>`O2T6}IOl9`5oYjZJY7xw7<@Qnm-LoC@sl z1+!HCIY{|gn#ZNU94>;?i3%ssp9iJ>hzKR2JERWAs#QbgppY^b%daI$gfKvNK7ScN zAjJ896F|srhwVJ#{U1lrj_${`S0{iIcH;Wrc>=U#p$NiHAy2euvlInT;~kz%Hw%o) zd)#<^{g)>&c((Cmw8t0A!70|nws0h0_hV~*iqu(u=$p2;x`R@eofIE#O?rM*%7e0d z&lC*fJ#vjREcW#;8Az-ZsUMCgfkmbtTk*p``T^32x;?5dRnY$!mJ|GZjd<~~owh0; zTtz@dm&Ww;{4Zvt@Ljl@)okMvN|z?*l^I71eku^p!arvIPo33DWk=7qE3qmb&f88n z)VR_0ljfJ&!om&<9~O67z%G$1#{#P9!FeqfLh+4(3o(SWc< zNb)*uDQiEwJe^yA$4m|S`fTILT~Q$wtZ^0uiD_ZS(JED$Yp_rNG05M~@usdY6sS7^ zvlqdBPOIhng?a&~`n-RDC)yYLfBVMR<0J|#*e0q$FK93#kDX%3n3)@aeqtT zpP868I~RixM~B zaBKRazW>^kaAIx1)xBtBN3-m)N_|U6rV--R=>K8tEr8%yPJ(N2AAE2K1PCs{-Ge)X1P$&QT!Z_4c;ELs=ljk*xBkCss$ixl*w5bGt5>h? z-MG5YNxu)!uXOdxnQG;ssvMmGyez1ft;&G11&3%0Sjo)#Sih&Z9 zRqEmHP5RJswr%VS_ps>9B#|}YVJX2)&EfABtsGC4Rft0jj0!wXEJSI5&4U9{Qz;Ol z%n(3Tz2teRUwnmWErBUQgA@okJ5+&;O_t5nQ}Os2sD{|%NpbkayRJXtJ6G>5%nNE;Ii&lUaj1-$gztru`3hZzCeF@{r&^EEC>AST}5IJ{WrxQ zj{*{uURAw(WdaF1=6MnE$ZMpS~aHPSYXN-=@-M7(!I`59QS9&n~t{TZ+0Fp*&n$I} zfP_3<02+n6^raC5G#$4mRB*M^tX86q#h*vKW7bCu8K%x!9dbl`(r%tw9Cm_O-NrTLxqm9q>+ zi5Sg0)51>OxuCuj9r?H_(JvsHHd**2m`YKGLjm<%bDrc7=AzeFVDwh8F|je>Z>Jqu7BkKTYd3n=g?HfqB|~J<)4N}U+uXFxjC+3L zG~Dl+EJilrzwv8z_n9bL;$pO%f7!u!jKqVx@vT0LUICg?cmJYZ~wISq4sOn#2o1)e{P)pNP zct`xQmT>}5mAC;#e_W;3;$0qK(y!4aIm8>aBSHm5ZHlg3R_C{?E1#oF>ORnT8*LJV zg^Zo4pSJE7z=J;7{`rStQ((GtNlWJlO`tA}BTHNs6lkVg;VL4eA+Vo4wi8qQwE{I$ zFLmDaxOrj=RpfQ(wNmdmmFO|uso*aZ4yDOOZkA2Et}Tva%g~{D1yww#(Zw2wZhQaF zfhHbxFGe&T2^u`JyiLQed-|MAgv#ikw;wBQ*3!1pES&=*rr;;j3t!Vd6k>Xz7~q-% z&1fwI#}mTleMxo~LjMJ<86*w=&PmiryK^IFv~N{er`%=rN8eW7kE1P!W5A;9+qzt) z6%lU;&-tDAEvo3W15%AdLwWmH*YZQro#;d>W-J67%yt`Yhf_)HVmSZYbY zG+8^Ox_Y{GI&9m*@Pp^n79Ny~J&N8{V)>I&QyM#5D6}Zdi|OHh&SiMz^wrbaO45g& zrUsYYAmTx!aKKQNvvI^6F|B!i-?Ix5^|3N!OhwGWfr-W-_B>u2di&y&w8l2?)6Z`Y zKEJhAxHL$!|IFG*G>UH5@>bFagBXH#HZQgiJn_=z@F0HnYht6)PS0}``ibs^s~yNZ z+NC4Okz?r}nfaA**ZlUUn&cy`8n{FfOu>LYIKE_7+YtnLdw#*z+{xB_jes=h9J?_~ z2fatU@>`{UD0$a#*q_O^q=g54Y@6NXW>-{@I-xT8q@~5&^voUWmyy1EFE>71fm6o>0!H^(JmrpB6lNpMsZ#8TKZ;QBUji;hee&om#{G8GrER zL4z^@)ed&s!;JZ$k1e`P!}^NiFXQn$Nao$Eo=cY6mIOq;&3v=&jCB%>DFI3^NMr3& z$8^JeSSvkyYIFBv;qF-UcC6*f`z_xyab1j2FgVy_1sJ)K_-9uagy z>RaAs{1!wQ6Ami2D0iO*%0#zLR#ffJ^WmzCp3{cQP&@x&)lxli? zQpf=h6V9~5>~iZZ8bLPx;C6kWb%PcIH3m6cjf!m!k z|E$RihF5x$An#2ShDX*SG(vQe7~OC1%85@GXSqn_jE1=It$FZy`X9N-bUIRum5pc3 zORV_iD$q3vd%Oq{BKJFkUW|y|#dvp@$*!snd+eY=KjL4nIeQ(bh0SYP?Nzst3VIjn zE-k0!3(*&ozdH6%z`qiJSwovK8blq@{r#xY_sSYm3h$UfWYu>&Z9Tw-6o~Ukx*h&}9s~==NFvqlZs5JHB3K0v_FbB= z_e1PE6n2H{o4X}QjqY4S8V4hhD-$~gk?YCzwCMFst(?)kc>jddYJAg=T>4CePiJ^` zc=-iM)HgE!o)Rmg@7a*4gM;HGY#`&Bt_jG&&m%qn4ECl>#%LZA)XqLu8gKub7P`99 z_VX?4BsHn=2a?8AsO+|p)k#^&uM(&lyC#ce{rmnRtEalSEV920FCvSw!-~_wihKOe zemm<5drYecP_i^$?(8lmL$-xnJzv74GkqAWZLPKrY{93T5b=tLF)r*v_9L!Y2EX^d{cORpU>K@4K2qTlji$5*<-gPQ4Qq53}U zzZ7SW?pmaUhE}K~kOb;$@fPL>nL}Q_VB02WlhhS{vQ0(q8yr@iSbo0snu;3~f|{8` zpk4A34N%NuUtY>=a~QQ0o`ow|EqUOMk#+~N%Z*c7Cd%Of?GS)02Izt1_?9EBT2vj+ z=mP^kBF=_3fd8;wxToFR&QQ&GG&x>6 zuAjsg&COCa_`Eu{MX=C9l^SX9)mmY|+RhJ-i94PJM9DPF5fs}WhzKk)?PD{>H!ihK zow>1huO25h2YAV@d6*(#L5zgKV?z;uv7Yd~VN?8Sk6!Uame! zriI>|wN`Ot#pds55;oFgmS^(l=dB5gjNB3>MwsAniDZTN#JFznAn^F6{J#OuF0SKhIHFZAZxG)!f zq$D~99t^D%>@LK&fM0j4(nt#!+?fc$$48cGR*BS9>;%F~3#n}xw=xS8qf`oyb;ll! z{=3})oxdN8ifPAHr%Bpz9z6+=i!b_89o}WJ#E%EvJc$MI_I#-FAS(tZG8nE7O&@wj z6BuwAI#oAGFqYJi`$RWl9kWPUV@?*-zr8EGJGD5!yS>pH0*mQV?bE>SJqUR$rv z-dIn}@2Ae{*dO)osyF|swLMyUVw%!Za&kb~0qbg_{j@GIxlO-!cJMp?{7(l6(0nqi zX1+~GP$U#p+reJX6Zg8KO$iV<@QS}_nIjv>oabFm@MMtp!vg;bpig)eNS{Cod?i@F zpwyHTE_&McBT*mxsKQ)roEPv}3L|c#!?B}A`UJ$`$)}252j{l~UJ2WV4&Z$$6l8Z3 z%=e|_C(dp|qK@ZHb#-n1NxUxh_I~}3{7ovlV{K)J$||cbq4pA7oxMZkpI!?Ubx9Z< z-1b)Qk2V07c7BD|E2)cjjDVH;E}W0=w~#DuBRu8`uRpcV@+47lCGnOyq30shgC){~ z)pnrP`Hs)2=zc9&Ph>h0Y<1*F^je62-R~cIHxz#$(nTyg|KNiy^^CvP5S`6BH+(b@ zixTzWH&Js&qmeZ305M6%vOH8CxDa3V zdMR9dsWM+uVcf1AYvjWmNWn$#^vi*Wl@h*xluX+ZJ^yR?la*X>=l5LbMS;5W%wF^L zmiO%w04KZwdKd)wj#Mk{=SCMmSxRfcoSjJ-5e%p!F@qTz>|k|U!yZ`)72DDt6xhyp zRMT2*x2IWjbpIM&X{&yge5OFRjE43ho%6E+{jA}m?kgD%kWWc=3va9HC>4|0Z(%~L zdVYXJ@&j&!>IRR(6NZrn&_aWbJi?1|Xw^<*j}p^C7@FJwOl+Wvb!+r%c$_@lN9Cx_ zaBy3QrwM&A{LIEhwNn_jxYF@ebzVtL9;MSUT|d^;(l4jnv*#U}B< zK!G1&00)?saG5^yzzejVN~?W!OxxXD$*}Kr8gu724}Cud;2~SwU!5IhtIdS=cfW&9 z_sHm+YP&5D*80`U>Ri#0K1Wz06j-nW-Es?>)M?U&T$0KwuL}b`1p8qexa2UUDd714*Tta(9uEuI;o2;%rVM%V?!7h<@TqELMY9hU_(ivQ z_j2L-1wOR3iqO!q=|e%|fS`-j(wKTijht?z*s+6xo)Caf;~E5N@h6nL2L;Pcps_*hw^ zlq-i$I$Rkhdtai+|&TVkG$z|E$Hw0uzBUxLi;;v_Cz{>iGROD}sV{ zjqaOYEl?3>?D(&6{QrVQ0~T~iZ#tyJzTk(g-8M}$amIaSpRYHx%gw1sNM(*N?WaRA z&ueNg0OuE3kqd5H}6?p7YTfrl_IFZhrN?@xG^1{ouf8i6He; zP*ZCI6x#nCMvf61)azl6F;%tbP;rN#GbS|Yo>xA^?brsz%%ZMZG;BAt4|sFbT-Mvw z4>Q!l4U$wy5>H90N#)pu-k0LSMNZ^fwr1vXz1P)m8+I2i#!8oLZaegZbT#Dsg{T12 zC+o2BT!$>+00%eAvO1oCbuXvzLXFZ{r$*ZN=^80Bt1mY5yMl6c*hTn2>%tyY+C79X zY@VhR%~!vp<(lpmbeDb`XNnz^%VsJ+C%y`f#FN_;VkqeV?ou-rCNUu z42FBPLXAfjjqUH19!gw7pEFu3Dh3C>bfK#=zqA2Y;7n$H z8aqmxbYCE|sMwz0Zx}Bbxp_6{gm);szgj5lB<$(C#h+Y6j96II zXuMD``A0qNtc`X=w0>)+KG^jkJApPa*qU;SMaj3&2@xHz;S7KHr}S^%xGdBhsAnE} zQ$3c}>^#9DgnC|F=;K+y$svSK#I3kA2)8uL8Ah*WJdjUw=t$K}onC7Yni~y2wX`f_ z80{txts`AVnoWT^YLpg4QCNSi5XBI2-PI5PmWWK&fq5-@x9Dr4KlC3d|mx< zfiR=gd&R=rvMWE_JyHrz9=aBO_s9EN5$l01!lY%*q@~3<6xRDQs%cWL3SF*_qRO5>o7i}Q{Ls;RH_(%p_b5kas|cGE z)xd#Wl^sWx#@N_^#*z?vR9@w!F+Tnrx~*@Nk+4N6V{A6DoXu{6le0bkbLVGl1g_k| zI`J(3lGFf#kV+rsIoPTH@le>l@>$)jM1&Jmk-6&;BT4_GOyXxti`tlo#NHx$Fyn^} zFnLDKCT=BUDoYZErX2J|Qv;NQZYUBr4*5AfjcG_@`IJ~$$Ef$| zu2v)QntWUALcI6c4FR*cE9qTkKKd}Y)-3K*7JaU!xw+q(614YSMwi>AQ${1}a4gVZ z=|acpoM&1ovd&th_Sm)r&7OpYP9M39*J{L^aD3k@yNrxq4uNXN2r1zE>% zrphXdL#1!ql+X#i33jG;*RsW)K@`uWo>s{R@Vr6eU#6F{efBuJB9s8h!@yv?1{P_Z zpmp4(r=QN%W|eFb;BVX9WJxGA&MY#Oy}&=v{H+%GwqR=~UiTu5pFYezlphw>by!z> zdtG7JjOS~wsO3k|M}mC9++{eD3E#~^&-Ade&oHA?nBc%y#&frCTK=qD4C&#N<)+}vsyLH1|tw%FGi;uIA*$yq)Dtr?<+aVhCJb3(y!$N}PGjhdNCz1x%A z^Wn1=GkNgJya55&h@6zZWJEWU@I_u6N|+3ARg0tUn|m`=qC$#>qzmM1|X>;{4_5E+rS)IOK@KL7X~r zMgT^M`_}b3zbd7(MXo07SL83g$8Un92IXUG%0Rr9PLlM2+TSy>k|E8|O=7x^90-Zn4YWe0MyB=|2Sh&|)6IWeGog9kk0>{IY zP&K+0%832=x?CN7>C5uJUCqV6KLc@2+WJ*xeZ=xSZmMifHwEW zkQY;Hbe#}>Ie zOPvlnGxADF>uKn4PT>%DX1?BrH>Tj`g-dh*PSPI48`1d@f zjv5p2;1{987?c-f%8@}eu_cbdZXW|YLd;F$6yNmv^Ki!?b1omeN_~Kq@hosR0d-MU zk~U~@P~`FlFoa@XQx3f1rB47}(LK7Ty}SM-`5b*?*1d=X&*@2-U@%KOk{-zt?@Ko7 zC|g}MWnG?c)D%<<0n_Jbe@Zrj#A3PZ`4{6WKRC(gwdqGSXpBu@CCAJm;57ORz2?4@ z6Y!9R!>2pP3$qj%|qf#Cm^2!b$w(cmX zlBDBAqY(0=kF12)ot7`0Q{N8%;-EM~0Zj5NPV_oU!%{1F&`)2-9rXyOM8Ky|O@Un! zTZ~J9uF-~pjwgT8fyQuE0xA_ny)r~_5Psy7cQp6aot~dPN1N#D@AWQiHQYW_gX4d& zsas%DgE^=EUn~A#2zZq>X%;pOsFPk<-kBdZ%|luEQ}S6A^#!c=BE3Lin4ycfI-nrM z&mK=*Re{7Gn$BRWosv?d7UGro<6pf1kzZ_2qt!($xaq^lA^;$A?_FQG1q`6+y?RRM zFM)9@SXp7KH6{ayEhH*bc7is^EmUqdsY*tKBqI*SpF&H#yXZBN8E+MU-1Ao0(pEv~ zQ&cuH{{OLTBSI*8kmLkbl_;9w`VW-OH-sTO9`K@*bgj{>@25|#bqDzK!09*)U#nz2 za)x@Aw<{wX|4=lZHQ6K*wYwMqJYq%naEh(jU0#-~z^zR?<;kHIA?^+e8jLiF6e>xq zOFR#<^ptI?k~53nntq6cb3;Zy#7fBIwhnQVUrYB)XAtw(^0E0FkO%(PYnZ)dn-RpH zC;b>BRGiuPR>4Y{olp>pn?Um1WDACsfNE!j1{u-{hBhv9-d(7tA+7I9ZEhMwF9vo5 z4atR{qP2hH_1G(RW|O*BUN6YqDTpL&aFnlPMGQ!?p= z=Uk?lN6rr1{T@@6m2ZZD`^BG?*{e@v?2jenmxybh$TeZwTXNOVD=dZ~X+tloG49UQ zZ({~iZ#J&HEry}pDS$bx=pI~%ULFC5FU0S9TqVGN!`CqO#TP0r+w`>)<^*LL6)Vd} zubHX06FHyGI^`AzLxVBhrrk#D6xJA8bPG1^p*Q*sbvK%^UcW*hl{eue~BzZ$?ML4v_J>*RfS0qsF3 z!yDgh`%DJvsteWLB3E}NL{0>}&UIvZ-_OzjsG`f4=Ds~AgZBKb=<(9g*6MJ*R*LU8 zU$XQP%#aNan0lLgoAGw}lqJ==gpT{@eAX!{gWaMP49)H^q+}`3YqeuiZaB8*QUTQI z+5F9k<>$j^CWYZ&IR55y|EuH0WnxRt+6hrt%w^x0Dm5n%%3wgVY@g#jq>|p1js3-u z&*KCjYJpapY8VV{Usw`zhrDnMXRM&zyjtL0N~%!F_U_b6(F@A?t5hj*a%aCW;31ex zy_X8(=dXUojP=&}PKY7W(Fnu&_n;$e^vo(~JTsI@{iI1&;ZR~R#%6H`kyrvu245%X ztr|+dwc+|Ozw{eB!qJOF={Uz0IsP+Jdmo*FV#L2}yZfdyY&X!(xzDkgWIVgOnX@TJ zNx)`;VE9&6o%K$E^^u&FF~sUjS(VTiK9;)y3Ou8gMHu^p#JOYw~4F^M2{A z6BUH^ANo?{7am|(Aox#I;eOM{V)Q;P3tQ)1uYnqg)%!DUx!;8&(iJA36`^ul*>U7I z=}>GiJ^ke#ciElw~h(cJ(>X7+@H|yLMH6EGSMKDMZ9k?>QfaC_?+f3JM02?IUlD?N4RWT=3Nr zrW1$&H*+4?);r(I4z%4=d%RvEp!tLvj;AUPl_P`<6Dqp5)s&P^jZRwDPFmN>6@zxa zT=?+xetL9QB95xMde^N3<@)p7D|2#EUvBt<{iGpvhd#xS{ES3d|1Z+`f9*P|!F#~+ zhZ#EgJVG0k6@sed5%MV@afn2k;q})PcUE*ke2$h56rM?|zw;@Lt z_k9ZXpDwGD)d>(`WB$aUXW~ss7OzgJq3}e>LT2;NTZ_CM3r-V{D7Ui$p`V`m@d?l- z+v`6UfBvhUORYi#eS?E@0H7br|AZYr0X6^WZ=CnUNymIhCMd>!nP>L_7ghla)I!8m zwvIRjLhGp0;SSl)S`o8vOEngH9wNg#5HyZDobl`|Dt#|ru7f!AHhuq90@7_LBStL$ z^Y|a$vt#pjIpr?^lK1z^dhh|>{^?WGMm*{(Z3|y8!HZ>TjVsjYukRSlCkQ8U1JD^} za$MLoYgz_m!KlmVNbEN#9DYjm*(AR)6zxdFjNaHQq58DRS_C3A4ufp&_;2G&Zzce9 z;bR4|)LCqs>tQ|Z7fVXPgQ&Vsz+$L$hUw&rcos*1!z#E(_VbLp=QZv7M>&d*AyOWC z+!gY)&^n4l-W2p5O?XLkH5`JGy`T5rS(Bd;j;Q}HRucZS4b_fJLzMhW9oN#i08bn+ zO#7J2N=2e)JT`?O-?S>H#dAhgcYHyLl}Aw(RuGk(n4F2Q4=d2>LV^w1IT*pdXZbFU zRptCnCZ7vwOIZc3Iz{h1uNU`kry1zOvhK49r`v;F(T4YHGU~+xB#mmetWS&cnov4n z>+nvw@=ZCNm5VW~!IIRDAe7JKKcOJ$=k5J@6u(J66bC);P>~ruVmR}bco?7fYjdbM zt&tH(09`29J^vTWnL|>{KOBchuYGWU<1tc04vDMZfakK9=0{NT~P_ zjN^-=f{7E5hk~I}(q14C%neg|^JriA+9`BVg7wWVz!cRA$EJFFdspg92EBfN9$cnt zx#9(~+6Z3&eKaqw-|g#$d}p$AELn7nN-%s45G;;AV#Ik(om!BjXC*xOiw?V}=@g8? z;88ma(|sGN>>^>t4!`iMNtiTRBxL4HBtZ2w&wQbMGj&G3(&6NL6ZZobDDZ3&X z%c(}9{(c|`#q{AO(t^JtLUCPm$D_Js>WE#m?L${nCs`~4#I~D!APyG+R%?sTvs*7A)g6;;-S}tx0>qlG`HSobk zJh#7R?r!RUzW47b6T0I#X~_h`hwunR{y+$-qfS-{dI=Ae<<_&B8OjG}d@lvreG-g{ zF|9y@$2k<0*ceRVWXRa8;1K5EW54e5qWqNdWVayDG{xUct$TJgc}OOj8}OE}K8>|t zquUZ}mTw;#jQ0GEKJ9A4H$A>jOpFKr8l3hyZqQX!v8wce5>oRc_@?Wb1t@D~o^dg6 z#Q+C_W8mof*+|7Y;71pB0}RHTE(Y~QDX^#&XwrAuM?W8k7Ho4tXkhqrP|@9lFEj`V z^LtVf(=Aw{o72JgyAd>#{3?Yp8!q3bm#2=_T~4oY)CbdgP?b=7sD;a)-!eI*KnkWw zv3_{R1o6Iqc%DAs!{QU6l?u(?pDL&VhyN?I-|ehm+7y5lDU+ASF#G_ zS?};6j_pB0{`w5Zj5Gc-J)$*}__~u<;cQs;@V-`t?!ackma6U{f7!bR;R>!(cl}1; zov7WGC`-8@4!(u_yWLk;u+=YRT<5YW?^nL3Vb3kBJC8cHbBU2AzVK$}wOaEXeSy=X&y2E;E&(qs*kZ~PAj_`)ii+2#V3_w{ z3pQyjTvAeVFQ-*b={FQ-@$zJ=Yzfd2Gnnc$1@w?j|Ljx88xOZ+o6ZPx+xTwygG{~& z_w69MaCxG!s#EC){pKqP_cD$>od33gWUfjp_OLhP)0J9kdg%Usu(Ul?<3 zBHTGe`MVi=`@deYQWGWG&?Qb24mam~H?HR6;G6J&74XpTMs*!dJ;H}M#t9WR9-1n> zG4V!tSG@wS1WuB)^0Ah-oQ(Y(+gkkv5+Uo-`i$}sW(Wq;gT)mrdAI>us-9$3aHr65 zHI%Z`Rm@30VF@RYKtCJTc5$)MU+b50mwue&7)LBqT1hE55-|Yd`<+_(?TeF4mK`f) zcZJ5ZhA}yfPrGSxX#}D~)9uzWVK$(M;ws^y3+u z^v?z=4bt(JHN-0oHuBJJ;=hu1`?A3T$w{->1ev%;qQpOCAFkE2Ri<(aB#4t^{!|I# z5R~!Oyl{TI+5vZ(sLy#HITq6}9UNn2)0`8n7qRnPQFP+v6~kK1IEMXp*+$YL9IEOM z9Wd7uB`|P54K4M+61|=0efFUJ8!3{xvW3%k2pfrN6`UE?n*d_kJ5^`xa`x5 z!5HSmg-(z>@5g+F9pMtja?BR?>WMNW9IQO#doY9Cq z%4{w{>TKNY%}K|-!knUyV?g{=ohB!Fs-Zbe`7}Y8|ASx1!Z7USS4L?Ek6&|r?-B2`?hdHkqFcke^2O|1OnRJFfvWahooJI6kb3D1w3}?-3=k9*EK~sKTVO_q{ zr3-s#=xIrS^gr<}HZn6ik)HWUTF}XWm zIog9dzn?}}x;eoRKh7>VYk_z!r~HtN3WZP%nED!rvVLClaqsZQFhE*Qi1%-r0I9Zv z9prEK1TYYpc*$=Vhy2KiK9b~jsQS#{2gD*6E`UNyJ7X2TTO+OWa$N$9S|G5DFkPtC zBg~rB3mXv zm-RduIUz}~qh>pXt%CYl=KaFTX7>Ah}O`{&Zt88`M4)=wdcL2#3y#E~!fz4XbMsvV+T9>q@0r7*Dadrw+Yz3r+M;+lh z6PunM!LO({aMn9)4^)|n;U(u$46xQ>LG|4i7Oi_V`UJ?Ze?QhWga+5Y?^PcO>Tt~r z`E0$JbS4?SJoUJ#Gg0*XtRC89!4xBDRaM&oRMw%`UjK9xnCH_Bk*kd-rGSul;|{DY z=6=t3N}Dch1~C7O){QCmj8Xnj2rk!@B#;xrjtwz~rM!Au zZ6G5>k!OjI63T-^#lWc5ktcMGXL(IQ5L9}wB-&TK^9&gN`~KXv-zp%R|H>rpzgh87 zmgIXcq4SY_HC{Z4OI8d+H$>MMqR=w@r9=$oC3#=^co48x#ASna?ruEF4~ z96cqPl!~9!j|s`TV3dNu$VEj1yOnc!CMnUpuRs}4Fv2Wx0J&LST5Cdgv6_20f7Waj z4V4A~nK0<6u6Di-W2K@%eo(6XR2PZ?D_ESx5ku_ObRQMs^UTz&`9aX=#QRv{mDm(N z3Y6LFThri$ABmBqGe{}-Tqp?8qcn_C=Af-1zW*C|a{^{4Wptmh-b08iOpv(tJjRB(Ixcj2;6{GQg3LuSxruoG4)f5V74`ZWbS=d7Svs zdEU+J)7gN+vz41R@Y&@3PvKF}EDCblP6ZN6i%65f)Q4c0 z*pd{~H>XObZo`49zqQW{VF}XhFPW5I%T6wg2w9bVt^blWciT`}`(Fv<{jnQqnx1(& zv3|{jP>wKVW4DajX-MWu#bPtSku42@?UWY4p%Syp%XxDa%FpL0JbbV%Wk!;;*Yl~6Gq9dqpE66Hj z8YLeoC*QDYxMapU3(*oFN)+Iy?r1@}-A-yFFI^JQ4KpSUIOpX4V`B-Sq4!k>!8YP{ zW_CvnT6^LQtf5hNQzCXn2fp{Y=!%s^eNR7y%Jb@Rb2BIjoWxoOCnVJuAKFKJMQ+Qm zjBl!oo&er*rWQMm1RQ$uXQ7S9rjlwJTKS#?G{9GB4g{hD^aPz@Oz`}?~P*ffJV!vmnV>95j8I#r>Sw!m( zU@p14%T2%Yb1}Eqw(B@rz(CqP)IfU@73>*-Me_!!U87aMJRU-**hkuIu2!b?4)!x` z(Het3&ZO*12=5xg<>3F`&HuSl4?^foSHMlNEuU%X>bu01JXu%TEXpcoC7Q<%UcSWS zdH2W zjbbpz&8PHJ+QBqEdN2w*oP#V`TuG+)C(agL8Gme{PE=RSb`1qqj;0m$$-e3Ta@DR@UpX(XUExzsMpN{T8Q=@IAmNN@C_{C?G>$ z<~H|$Cr`3TBD>CLXn+jjXmZY%^PaG5bWxP05G)ff`V*|49f>UU`_PM}wOr)vT~n_GRzU zzfm3v0H>sY^2FavCqdw8q|r-wo;hcEd|p`>cQj-eJz9s@b6p}-#fe5`gUsuO`?_V}4iXo#i3%WyQEQ=1qy1)=-UDFiRixp5 zaS!~y`%H2N1!2&Eiht^*K#>tX2;@YPpq{7p`O@>OizXU#pmxDzg9cOEAh2PT?4f{9Dnmk(YFV%m*WB!aZ-j zFF8l6L6zw61NuetO0iu}>d{Nu3EyAX^bCF~vi$F#V%I7XIZx94hjH7L1_w}~n8pyK zum~{ljeY2+MI#AkBUybf+mRPce!(7xCX56;y9@a3)Prd@i+=Dn1$M@kSST@ydY(LO zvFP!JsK6P$cJt+Un(n;g1UVZmQ2(LyI_r04qd6K$Kjzr)_=5E1lNN=x_Kl4*xI3JPOuZ?fr!p6grO-0FvB}p_Gb!$O_^g@KgVPy zmObBF`(m+q{le8&c~yeVp^pKE=gz=6*RR1Q37o`_c7hp~=EA>cbcPutR}Rkq4+R;JbzP` z*S$Qdz-~yR;Y6ScP&)-xe;5?oj;U=V=Iu4X{9RjZF>NP$n>m~u_8AvV2YMtx04G3^ z_)Lhl*reZZlIMv4dcI_2Yh&B}+&SK_+ zCk#+gdOj#WoZ?e^p=2g{=BWq)tuEjalFG4?r=OK#%wJ0?VN?B!(1ax!oY4J6W)rA; z)YNrTr4W3mVvCw^;>_YG3VmN?ETUFf!~;{|y5m(xNDXfaG_{htqX|-55Y-M1px4n@((Tgx*); zJ*#QSXXfq3u5W5O_=5R!?H{*)DG&*?6xFz!w(&lQxx2b^xkEH@lOo3uE{N-KD!qCY z{CN6tGkOgj&g`bVx5aPndCWhC`Xf~Y&`OMCwl#M0 z9GR+$A36J@y&(=z;vo)ZQEjDel|AS~!JfqSC*S!<91yx~poyzWhR_m5#*>F4T=W}H zyPO9;pX3*~Z=sLFNhHz~#3TtN6|WHWr<3FN4K~v~(~wWpkT)otektf2*+~Cm8sY*| zdvpkGUl97jb8pKlk@cvb+m%48O)Ejtrgghp2Dx|mZ-bzI4a(6ABkGtgX}Cty&d81`Jb1(Fr5tNcud3O681)4l7V<^e5XafqXsho-#O7>( z*V0N_x9E-En4b$pIT#rv?fCH!`IaqJbf&~_)XWxX;t35n^PL7+HrY@^=sP!py6>ha zJOzBz?F?9@Q*JQviDKd@Z3^V9|1M}Hgl7ppwlc1dX4$2E$>pbc>~~+0-Z9)sY!IaD zZPtq~UNugvlIbPL>lgUtC~ER%I2Q351sm-xDm8f@Dg!|Qiv9+$5j|8D2K3p8NQsO(&NTu}3WRy) z$67CX+DDQz>2QdPV=`S^X*`E$MB?xoi&FB+$KS~SLVOsofeyR|P5Spa2|*GEClAk4 zWS0~ipfQy5V++k6M&6;^|JdJ=kv!#f$A&i_7ptM9p~DLVsrt27SJ1KG4@cVNBNk=F z#(FXq!pGG^fZm0Ap?|ZTc6%QHYk)ls2FN9--KP0sz_qDKz^8rw( z?|tPkEJ;Ct!rIBx+H0(VRQZs}FC7L3$NsA5F$Md8Ve~L|`ttr)78e4r*{Jt`9(7y^p9H2J8YGPy<+R5%CgvS0H zHs!?PUQ+Msn`!H4A9a}sl*5aw?y|oB^Aa3J;T&Z4+vDXX0yA~cFO9r{YFCw2=1=iQ z(EoBCh_>i7D%_;R_HmNi({mg-MMyZ@CeZfFaWG0AGcg*WFNWAFsr)Zsktu=zrDMiA z4e2+iB(7+`9|!H1mSfz5XVM}jB!4P| zc`zAQnKK>da}@y-9Q~%f$D8c#7;-m{qtwC(NH|8D>~**z{7nkKPn@U}CQu9f3j|OX zVVQZJrXliIP$*zP7${I~bcqNAJj55;Ipv_Ff-qI$q9HNYGmlpTc9zAmyVii*2q@C` z$)u(_tg0zj)%?}h!3GT<#w$Ske9bF>|M74mnvSVQ9DxzJDBM_@)H_JuNi2us%iQ$} z`vXcNmfE_4@LfMZU%Vz7%=`SZ_1$_ecG();ds{K{+?H9Sd6=PZEm0-EvWU>OyFV48jIF||w@tfjkcb41us^FL{C zOi1kyb1dDQlwI{o*}XN3Q={Xl~e?RfIhu0qq&xcy$ zP8(~9CxMxarGR;J6T6c>EFXZ|mY&H@Z5$bfjdwC>9yfk;-gim+`*SWUx&Vu2<9Opx zZs^>$I*y8Gh|qBmKTiiM88w8L)}N;21tn+UOLkTIuN^Y+!vY`1m{WUN^KuS7Px(8H z_lT?Z*BSM_wZF5eH@^3Cw#04S&$-EvDdBXCS0P@e?;_*Gtdj|>xS7Md+Zao%E}g;& zA=PL4POy)8)PB@GPM@CYegDo&-VlxV^w4&k7fmj zzc*Y-Hu~x0?cD7A5*CyknNp7|-wFta^cX`??ZRbib*$Z@K7PG&RC7=3`5q5X)AiK> zt~}>=B+o9CTRQwSyUnzldtK-s7%pvcCK@r*)g4RL{h~=ag5# zYHZN!Bn|V-J*M-%<~%fY;0l4-uPJ;Bs)0!ch45??S-wL700 zOzqkL(LsH`#>zZ*rLk|@RC%xU4&)#AR@ya+K4S3Uv`AQ_2&3sjew2uXD7EEQ^f*ug z0f+KiUg2=6xIMum}PvOF;-I$%JJ$N8-G}k?#azj5SIX#?AvOO=Q6BNJf zfimrtGKg&_8ad-wvo+tlce4~rVPHJfCY=+nWG_#BHJcz9FsZchxM+^v1vX(9zH8%h zR;zquo4YT$9`A{Lyva0)x#E%_FiWDm@-vk3r}X>$Co^e#?|wMNqtXnbqQb0Fa3#qf z8SV4Kz-CJJQ*I06@j`f}`!uZUWdfRQ{L($vnICf)B46JCD$n7<&0>$}d0e)k7IU2M zCev!|{CREsR!0Ej7=sa}#*RL~AN9`Q9cXlZ1<)YHl*Zhc;e9Afk0mLA%}a~Ny2^96Xj;Fr0dDOc3t!G}`{m4HT%=W+9`V7#(Gi*wKd&!Fpq(q5Uz_UqPXf z&{%|Zjw_}$V}wZ(7{#fFr`0a7nl@b`UEmIu$ml9bP9157oNYvV3w2p6HaAFDBxQ#$ zR*904jmY|fUm6hIoDvvOWY+yZ7u|e6IO$!qm!|mWV&7uA0$PBYMrH_pNY0KgcBZ`w z{i-*=7|(P*q14D*&pA+i`9$I(9UL^k-s`vb)9xX#W&uuR6h??D}eX?3T(SEzZ5d zN2TS-&9m?@FCxU*Nl9J@G7?WdN%<6>E3)!j-}>skwAPHfHulw+CU?#hkljgXaRpDPbw&tZRgDg2ihpKDb+mj13`y=FR(h4krsnDf83{n zf6_M&x6+NOT-BPgCLV3wvjxAIbOI(xSOZ}Xj82Sb67PR+Q)t?L_iWBg8>(WIsDjNO zy2lvWF#n41r5){1i8K%rx_}%&cK6C_oO{KV;hUU-<<#xIk1A-$cY2iwIic zzIxetoDhE#iW@S;ib}(T|U}|6oZ9CvKe<= zaR>SX%j~dD#vs#~a^f~HAxxF)yTda)v86_5N319%`I?!w&ra}eS=Q>gYK20=-)ep0 z_`Ur_M}b0cy-q8e&7KeHKjX^qk$WW;cAX4+P9Q=}Fu={hDB=L-h%Gx{`RWpIVpPLk zT5KAYVbNip>247!F(+JMF*6i_auyl3RiC|exkJ7!zMr!N25u^XANeBE_nnd<4^Y$n z9xvOaZ7oV2eI^nRP*7Dtd9BUx?9^jgUp|@p4L~n5wEwUev@J{4?-YH z<_(DG2Emoly=CcIB>~)(HDG^bYeT2zS3Z!2}ss?l$GS zxkla>GS+8HW}C2h->-E0L4Y$Qi>+x zi;+&?T9DT17gsITPRF78^iC=bTK>Ccgb={&!QI{RVg+E$i=K9iLW z-!)!2!k5fi;D8-+6U6n&n8J4_1-LU}mnl`Z=CBtk|3m)KYALc#=m}>KzMC)#uebA) zya}e)Yjy2DS>V%7#s@RgbohPx{RYP#UzIop$FQ&%dDtY<00qR-`?KfExgfR2_Da0y<|STBrVPLopC2iiYV^l@GxkfdrF`hy z>hHPFB)*KfE@E!Cyv_W?hHc%Ph5iBdA2koUzP8bKB`b5b=NaTwF)wyuGDEV2v@>0P z#ZaF5V(>KKRsV}GYwlRt004)XhXU57Eg5~db#5_al^;?!o3Bzplo#8aZA|hMgdM6U zN1#j2?{h|u!w>$8QXE^WlxsEG*pTu-xrDKVdx>{)(9Sb>UqL>=>f)C8%2HvZ7(m(* zD13b06{;-?I2aLgc)8khPQjSUa(os3K&4rd`8*TIu>?SHM3D8)iKh&Qj8YF zI3vLJJp)7dXf3zB*;y}0&8JLAJ);XSyPZlf(bR<;{Y(1eww*d);Gwc&416aF}Fj;8G3Ipq00W6~Fgnz~D$10(Qf+kc+O z@k!VIN*mif!o|3+id>;6reEI^J7i=K_u*}8P2?Z{WWiB0a`qyiNJi)7HQ~^d{X1-8 z4>)4jd9Dluo~09pK>-1+)T)uhW_X1@Jc1=sGz>EiRBV7Ess17~J#J(9nJV$Y`$DLC zU2DP1`qHO=%SxdYYlSlyD^0`MwIGV05`g$AS|EYnVtb?!dot@v9A!HH_Qk)%fYfir zSY^mxwO!D*n4OptZ8j zdF^sEW3!peksYZ*w5&8W&?6fVeb`Og*q(eZDo&RCX|b^?rPyNwZEc!$c`Q5EtcBJ6 z@Y$EA$xl^Y0D3f8!1QT4xlLhBHL?V?CMG9TgUpa z-uiiup1=Di*AX87gevv~!VFiUUpP{g$5c4obN|RU`&kM{4LBg- z!+hLQ{nnXN&U_BltF^_fh-d}vBiKy#ml4mg2mXhsdW{BiQgrh+`=TxNwPl6CNf3oL zH7R$I1;grU{nd>#gO&q7TcJp4sc*w}%G88!eMU!1ZO;}k(}=IGQ)z|sN3Ja((Vj2a z!#rX3vmTVRc9>LKH}2Nw^8oIY2{mJCAg$u++BQEbY-}Wyt5ZF{y2l@gwa1~K{7ui< zy41mg0UhF>pL_eNxX;Aaxfamr=PXAyb{rUFe%Ibe^lkB6S)EOw8(JY2r+htVy3k3O zNJvcVxDtIH@l@iYXgRK=OR$hni{Ckuu)Ku4`hy^n-YPcSOrc}Nyo380*OV3UBC|Yy z?Nlr>-9un3S7ge#i}BN#ked}U*UN>G@&z678RyMBAiP+d^PAj;D^DD=3T!;UqH_Ia zvBJy6HVfj2q_$}R*M*%a`j>(g#7k0*%t{T7WKxral^W_0py9z<0}Hfam%L9fA}Ue= zh9)Q~=f}V=I{PB$NNBjWkUWD6Lno+OFk}cK{zfLVD;)%Zimd6vbfUYJ)06YJcP=>J zSUQrp<1)EAFR>>{KPZX%8GC}R`vgS=AsGMkh_il>qb-V^vwpI`XzwBC=N{KBNc6oCXl#$-g~obeB3`hGyzq&J5JhFJX2Dmlbl8B zpDKJU=G*RRS?Y4xczNC4sU0vUXv=hyaj+%Bn(bP|c8j`fx+^!CuUj#e^R+;Q`-YU{ zc7!D)wos1-7cWTVAS{OY4B-Q;xtn7Prqb1uT6JL0L|-)Oj~9EQVf-S%5yEP65dl`f z**WUcRA#68)VIoY80rq`#Edb$%7Z&Peu5qxJ$<=lb1@%0D*`txyxl&|CugW9W#c4+ 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

gbM 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

hxaO z3^S-Tk~N`q{E(OXL7T;q9P|aRMJRW&<(z+bxRMb`U%sr4u9=d2AW})TSPg}(H&ZX# zntg=V+pzq*^k6XYk46Xu|9}<&v~n}M5T5};4fwN;e8t}>Q^INK*7L@hf(rsLB-dUC zG&E>IwhKHNnQWMk7T<|t`IR7aX?AbV5$5__P(T}*3ZxT5X)Pf935a>YMm88!e2!yI z8{vDSQ&RA|c)7LyW8*L#4*2rbB>%oVuI{+GKkGJM%FFtGly-dFa13OLZP#2dblA!B z9{>;yP+~#8o?r?Fz$Cy)gS2bSs@Gewk6U}am?)n9tC4HS>#qaG7>fr_pE*dWm`4re z0=@3PIVNP$21;*8H~>%{i-wFnNx7wCKRovV_$uDKNr+zo%&j((@E%W(Edj(wQz|Y< z>dgf|DJGa(fe$3pez>uqBqT662l!j*JyQIs_ZOkCxTpDnN}0owJ5BcYsC9OLF%;qk zN$HW+$W~vC@NB!epet3Ch50vgNvU7#N1MUByeWfk~&`c38~lb9{KP)DPf2MR;~z(+k7n*)%u8YHjz(f{daerh9m{ zoPDOZ&iq+`d5H@t&YpsG(gme-FRk2#8T;RUjUe1O7H~q4rvs|L><^NI+YIT>8)jC& z=VN6G|7}PEDn5#S|JLgJk2P;r3i zwv~ODml_0%L4n{&8>TUGX=uH0Umoc*!Skl*6Qo!ZEC~yHfJzHW^-JS4UI%9o082yn z+T?twVMU-oOd?rpvsd-dOLJZ_Z19I(*uU-&yVGf;FT8y=LMYBOL?c8X3aE2MCSOIo zDRO=H8>VqO4akwH6 zp0sBn~6&+j2e1{-xP3o$==9`=fr(3IKA-w~b$gPF_yG+SS7j8Pe z2i`$~o6n~ntGoNj1rk$+A#AOJb*gYk|WK zGx`0}o&EI>?Rcv9WtA&PiOBzVvp$8*bPxQ-EKQaIL_J`;cX$ni=VlXa)zPphNTvq1 zA2ph?9s}@)T2#&4FH_d5M`z{@LT!M)X>KkfLLX#C=cJ3vGOeCMzw~D3&i7$c-kszf zQ{5j^wVog-EU3e2Yt|{6>tXvS_o*zF8$WgzVx2sw7L)|1{yU_9hmD-`z*%8|of3&t zaJJskH={$0`Uzrf76iCOdLNB)x)OX)Qvp>>B;Z?tC!8@?Rx}=;TFJLKQ2Z{k#|u7!)2;Q#G!n+U9rU|gjwN-_St~M8|X=a@ZG&?uMM0T z;KO*G4^)1OwuM00kZM?eASXolkqR8>U_Cp5nHw0kg46|>mVhu##f{zNW%vHG4EyqqU zAgkKFID4-RRY`LH%87_ZtmU5i8Vc)td0LqSVu?5u*~EkeXsGtd|DF;eIe>}C)>cXR z+UUiL*<|dOY*pHujmM|&N|KpxPq%XTA5H|Mz}iu(Kc8_}@*utJ-kGu>BlxO&XTZV+ zI$u$-C|}#yV1O}zW_dar+Ba0rv*bxlM`tNGh(C4>M2~~E{AzP909pcNCj=XIfywgv z)@T|qn+n@&&F4cMLD&xDbv5cd?7k2I5{2?lzFtIn49S&7L@m*JtI+F2{=bWJ`U_z>&f6|JAWTw^6oEhO^dBAGr3IfaD7tV0fsZ zY*=960ZOm*+hYkr4zw>=@kkX%uR)Y0IK03g4vt_h;>TQA+g4oBi1LC!q7Ev4c%$1( zI_UKE>Oh%vb0OqQ(O=(@jV z-p%`if}y4Ap`>>l#K9B964W&a$oInn2t1gnL1S+atEfgN0(K0XqP}R!j22cT*JG7t z1amG&rs+7{q77&Gh~|$JYX9Ehn!Cih6wpWj_l*Y+4y5=C*evK;~0&l}ivufjkYK1K>J=(+=`l_1SXQev%${_4k&vYOm*$YG9qR zK3J-Sv`@S_np|hGE;!wNfgu=d5P;STg!EvJ1LnR+fVz8mwUY;3+JLx3jRr@LfQ0^N zll%{gFTE|CUIr5`O-t}_7Fr_Wkhh$|F2lpu4Ot4^5C8!C|4)7dMXuexNYzv5ngD(y zBn5$9BJs6=&m03MiFZe@sm+q|J;WpV+-jBo&BN>j;0S=U_b(P8UA5HF05#SNPc2Wh z|Nge?o(h`nO&W>F*USeWUc)sGBgCmt@eoz-Neq%olG8nsmWe7sv;^#;%S_u@gL??X zU5kDgi|57apx8~Flq}&RHLwBKKfJl%Qz!dnS{pv@9s*IrW_^-p=BuTqdbVk)cXtaP z=-tO3)tnOX0UZZR?eu@hi>SkI?8w`Iwgo&4AhZWp5U7yoxQ=2_e$aD86(Vbxe0^G` z`MeP;&hSM`ME$M5N?ZZ;cb!dN7^s9jSJ3(ADHbG2ph5z4p-|KefOX&e6@ZnD)jwD% zxB)kXYzfIljAY5@{P{bct!#$ZBA2ZpCYDGs&~&psR;ej7+3VK@l=pVC*L8#8chP=0 zb#U>;l5bT&wK_a_cnEn_=*jwQLPQfk!*frRLze3G!L2zR^Q9_hp8bPI=MDd5PuF*( zC0naJanV6lZ((`2b#lYP5ExqF^uh?S=j=hc|1pR)66-T=d%T_WQU%+%$CLmEzlc?I z3S+pYRnC{2kayG9DqD08b4|wh`L6tuDy9faDNSvj$;f=ZQFSu&KYtS&=-XH(S^wT- zyhnHb3o0oL9?1yjki3V+J?(DBsic^25;+k z?}2E00k0&#!6JS8t%x}b=#2m`1#p`FC&W@oq5uwHfdJf{cXOddT&c+cqCWcxl(mwy z{Z*1je!H$hz~in7hyDLC^%g)?ci;Cg9nvA)ASEr`-AIYjAs|Rgcb7DRfYKlcNK1F8 zaA}a1x***R|8xERo_F4vJ37W(K5@=Id#|wLs@aIci(=$`GRM_AZ@J@sw3C-Rq^d{!(gO*7+pp$~P zU^&v?H4G&)GtoXM)vWnlts1U#`R$k47PN9GXe-{5#}Dt8?8BZvEeOs)HtSHtTc~A2 zdqO=B4QCnqIoghW<GexqE3&w>C1nKedPcq zF#P)Cf^$OGvzD?k{0y2zz1!6JdNF+KLFYq4{7`dTFii!rR0IFNF7{|=?Ib_sPkl`G zMxpwiroVPRfo`>Q7nCQM=2^)a4VShUzZ%kCzs_q-RzFM9-u9vr&Wuy~F{__WcnQ)J z#-5VW@H`YhciG=1iq$_>|YX6u!^kT290gwZsj{mDWLq+1Xo|Lak8obQ#;)s=Y zp+FT85dl3XWBQ<>6jAZ3di+2B9^~|3Qhnx2m)}^TtfkD(BjOGm_pLPDx!WHA1N!&C z_|l?(w(t8BL7r>iCj?~P5x{F5n=CiWNR&KfkKcx3zllQ>0(>w59u2}cIE6voBZW)i zQ~6I5kEnPfq@l+^rl2V+#`#lr_h?TKyi#J`6tI(M@MME&Byo|Be5paw{MiQiX*+@> zZCug`m%9mi7P6GsGeDLFuA1LZIV;S@^E@ueyOu*t>v(Td*{1_p_rqZNefxhEOt2GF zb12Apm_CZRYvi=$F}qd3F^)o@t{11HmS3sWdwyMnN@4MGZRzmQ$YGKA&`P8wM(o8B zdvWcQJpR=^JVTmnP{G8!mUb-E*?^k$082>(K+Ai3&(a>~4`!!B4xfI(mkPw0- zk9<2~AI)9ZvlfCNvv1dOOIWAeu*&#ShMxgC4pz-g+l2l2@jTh`W4+_bnn(LB<%wv& z1rORI>=|Tz zpyW4IC#KZpqOBp4Es;fz&dn$nwp4g>M*zDD@^D;S@H>s?apeqp-PcevA%31z%a5Qb zCn<>l94*#m-D`2sV8v&DqvIPPfthsFeHLG>4O&P~7#8bB}ip zqSA@2MTShR)JWWy)n3Tk?c%@mpq!t9ym^7Ozq_eP-J-tj`;(1)DqT5?@^Uj|#0O=* zwyMBb6VW~Tb|inYcHx(or8gTc8j=Z?v?LmMzN@`pNb=;DjlAbGUDNvcY{Qb`HTKaX z??U$7qd_r76fLUSF7Z;hqt= zr`u=`=@e=M*P+fLaDeOS1eYG^PJ^%p+#jx%4*es5!EH4g>Nzl{h9<4*e~STi|ArlFoy6G5&7xSi41%QR?$565oe@%D>NR_ugDyT zV5*Zn8C$nc*yNS;?{PAP27-G+=wvpI8eh0U@~KJKh#nJUF-@^#9>#Yw0;95Ajfl_O z(hJeSf?He*)8CUL-rbwHc(pRVmdwdkY}5=rOD(VhewJ$av_Z{DSqes=b<0 z>~d&&-ZQ~3T#7xv=;?GNL)T2?<6l!)eu~NI^*5)EbKC6j}ZcQNP~J##PE!w7dOIiWHwM}EwRk*j}b$MIn6*nXXMr5Wd`8m%Cv zsE4#(3K-BPrx|K7QG9JcK`X`33$u9ub|ucv!LtB+29@-`fofoUGMKso+L&nClcQWC z2V<%fgXgY8lkhSml?I(zAH;ZTE}UQLOR-=fzVK#iW1r?ME?Pm2(9)+e^sJ;g;YlsRI)X<5OgDhUV;1@AuCkzD$rU3Dy@giQrt zDhchm<+f99nK8VZ?F)5slf2doL@QF9D!kg&p%8Ow$WhYhP}_9$Y~-$laq6^ zwxSpUl35ArBM5Ne-02wBoHGIkcreUGcg)x^+3W<8->mg-XsHq=c0$YIWyEnCJ7x)n zK49@z_0jAUERnen`>W|@+j*}fm=z~@OZ{Mhg$zS9cv{#crs8Z8@g7e+tG$}iN2Oc_ zu>-1R}+4<;&)|F$eQ zt?c<^2<9mvJkV(aR~^^~;3Avb9;%WW*p;vuh0s$;i)2eueEFmo$}JL*KOOljMQR&P zUHNp12p>i2$L<&)r|^SPE5~S&SvjWAjVDcBm4`{XTOTE>RazV!lJfTwY`fy*4Llgq z!Z)YV_$N&XR!ULG-J!nR*s=PnK5$tI9pVZ^5Lw-YZ1X5XJlJ*pUx2(u!{BWfj}&XQ z9`8>&0rE7Mru*^SOrnU>HF=M!`7u*#j1R0-QttG{!(=jzL=^I)ZX3<+J zs@oHbiuSd@hYi5CbkM37&9kZ=dW?qCLER06O?hw#zbAuvPh28>EZ^w9573jeMhDww;lJ>IT`5kO=~aaH zajee%NN}A22@c#IEt?hu0y(}uwc=F^*>wI0VrQMb2O8Rej=Zr&l`MhDU7xW-%U;@d ze;YhOBD(AebfQHZ@H(mgcfz%Br5FmI6Of;ydu8F|8Ga1Zt(c|7&tp@0rStS5Znw~U z@~+x`fh*$IsV}Y?o=9a610oa6w&Re!=5#rhj!{0da^vVMBjaVV%{hhI8W!ru2ypJ2X;WH+Yao51&l>ylV38Gxo55skGDM-t zq28eM^^YLLC$w^kaFVlbw5UDat$pX`d?h7MNXyM6G26uw7*m%6pkBif1+ z73ODDTw9q+VH-Adh*paA=IQ+Ao=6IMd`|O`i4+vT06Rf_wgl*D=C?WXZ>ozNe`g5~ z0s@{FCE#>*>6aJt3XYi)6th2z4=_#gz1bD1`9kZ2-F&Y5AQcV|wyL5u+P?$Z7x4&# zRg4!dCM;zV3}5};9~v$mkd4-aDuYfFNX%e`hUK+$iC*b0gKu>Dqj zAfo$2YTG+hvbnTP(=E;&>ga&)&i{#wP^V@zZ` zQVeg16AU0mWn%GsYa@=jIgWGORyAc_@{q@tK{#a*oU{(6thRKe&pIA;#|QLKKVH#) zEtJws5fl(6L@(f7q(q7e)R9#fm zAqo1XeM%+3epJyCK8C{>x!JR58;{ll7JL?ZbVmzrr|3O}kHo)UYf?0Ng6st{sCW^X z2jAq7rVzxGQn;?gz?NNqY~EwPu@W!0U6|nL4Auu5ux#TuFf`$;YB83!BCQ5-r}29C z`1nKG&y#PzB@ant?DGduU#7+U;g91y@NuUi985?s)l!CM=>PV1h}LfT4|%Z0Bs?T5 z%#Vb$(4Z^sm=m^^$V30XJhbo1=~R4?(kc3@D8z#(?3m655DqZeuCI7M=sf~>TS*CM z&0+y!MHyKncI9=XpbTb3rSqOFs|*cAuW1(u@A5lZDr}i3r>I!02QoAY8m_v?&@uN7piO_{JI9`Thg6qnBqIYU2yEazIADSJ1OT|5zJiRhk%2iEV#0Ljg_(z?Ow^H~ zb6%kbS%_=f6>)|~={rx<(Q z2fg~;uimX7XgU*|DdN2}pUrYypS4kaCk0zP!7@%OUz%I|CKN}$AFw7Vo+68Tq~v>jOZKDSbS!7Yt*EA3YypdC6F>K$PY z-sQW}Sugxm;Slu(BT`Z+vR@R8e)Q|#JBR?8jpVqIabDiYK zFd=#FGr)6+lGRl$?E_gC;zYGDB|!84`EPNHg2~cHm6hX=+)We4v{osv%CLK0<{)a2;G05`E^3OvVhMu;CMfNt8u9B#) znRc(0C2hX-NR8x4kMsF<+VaDW;V@j>VB)wb6`}jQlxj$so#DY)b&GN5$koLlD%_Yd zy#IK;V{R95kmzw%Ek7GYEO$d&TOVlhaRP4yaHT*2g(POgQ7;=UGK3|yz?_l!_hll2 ztn|@+k^K}Aov3G;FNHirY`dZAt{yY%jC;nD(b+7f=%Z4kF8y8oay@K&Bvap{sqBLG zf%-=k*4tQGzOtvjI=XN}`g6=CfxSoXU0m`p^;t-4%}UX4yXTqvJDePzLKoMNkW$(6 zoJD!MNM59wOgymkG@3WgM=K8jrZ+ENV`1!fit86v(6yq}<@4={OlY?~$MzF=f)u<$ z28x3gt~s&nOVYN>)*}bjbm1*{%cp9(*u|+2Tb7r-&f>3rlL&mK+;!Q7T=HA~soURs z``djb{FTHq*WrBT!#74*kFZVlMul2)5ytXO-P6m9ZqIIaBB9*FTM2e2mw{u-%4Q;E z0@a!N!Dmk9D!8@H05MUvomESG=U9qJ;q$q7`DmlI&bR_qLQXShw<+`6jKyADKE-_9 zQlk0V{{K1rx5*MUxWNMdXc-cnTQ-F!2*|Evb^tYqi-25db z;_YD{d};RVHKf^tC;jlcef|32<-%PH*XVC9!O~i@IO0PUZ0rxte+lt$A?$r8+Mz3Z zzC+brcKmKa!+)RXr8Hmfx<_xG<1gg1H`PVs%u#pi>zbRYQMV>S8*P8e(b#_S<8?Ma zbdcDCuY7=an!Js4)^JF=B`xM`{C!|@fGrX8ns7!&BS#f`{ah2ve_7({c`IbwBkG>p z)3Qi|VfybMgLifrTjt(|!!pTB_DYYx4}9(pKK7S*dQe`{Ij!D88&|iAvZ_8n(T@|h zzO69B-l@jicD=G)v_ixbIIHwZZm}(&1`NiP`D4F-W9Ytey=u{v zDk$M7`ZeSD^Pv%Xt%|br6^?t$+PhiyN~;LUlfSF)VyXJy&JBkg?hn+*Uj)Yvh7<{% zjbn=qH!Rx*hmgGNAfU3Up8q)nXN<8x5RS{QSg}TCblC^|^^fRQtF`*T?_bB{4h%WRqYnPyE^3F-gi)k*|s%tNwPDr^|6f83f`7Yl^6A8B91Rr z-JwsEXyo9>Dlb}(NF_Y{s!#$sH)gm#LAr0h`R7V!bt_)O&WeiHb9OV<=_rM}Ik|8J zOQ8$;9St|N&L;(APq>KcUIc!4=i=9G=o}Lo`C*ctNd3pFZ33I>V6CPVqWb5xG!4bb zKI!E-rNKI;{%#&V7gr}q2gm)MQ63R3RmVOnbrGyS1I@=_BL(dDm-aE85On_Iof*%e z;S*`cKTsr)Y;)rJ7E-l4YlrW7-r5iM^+zdWk`Em`qdm}fj7c9lX}Ub`)=m*SyXmoX zL=cIKx+GUFKFgk*-picy#`^u>dvL-y|1(}|rvk@&=eUhrB5rdd#B%fVIYv{zZ~hPX zW888LL5W@T$WhKS9*Zw1IUYnbBDU^~UOn_rnHj_(r$JMApK}x3;6UkeonBNNvo&TyQBgFX)^MT7;>2nr_gA9f z(E1@B1xDRn3ahXCGX%H?R<-(O&C7xadHbfH!)sBV%;RCrNa{)2A{X#LR7ldw53^;^ z!~M|eU7V#X`!nkaQCyY;iREoxQrd`lF4q~1&K?{{ETl%g(YckXJp+yRvS*j}T)qew zWsq>06`7dF;`#$MOB}Cw@vgg@@xnc#3#qKg@0}_JjTB!Yvat`xp)~k!oU8yk;0YgT zwRcwf%0|BGz~|&+hmes^HUoiGgD~X?)A!m4o7X z__1J>h`2S5(}1=Eu1-Mw)EdFq>O_!@&J1La&4+C=3w5CU1Ulb-P>6jk>~wFYWXOqg z!8kI+67>$5g=~Ia>zOXzuOfuQ!+I6>Ep-i;w;v$hv^r{1Kt(*~WJA?4XmOB&zjv$E zEzco!uFTZ4qzfOkRj=P3{4`vt+j{l8%6t9rP@BI`&9dM7p2L#BFCTyN!e~3uM*eu! zlD$4ooTD#=AR@)mll#yzz3u3%rl(M;_hEji8(TTn+~YAl>+#Q?R{)e6UrZ>apSB#p zQoPT)Wl!5gA&F3-p=wzj9a@3kcKqGDvlYh|K#k#l{)DN&AJneQ!_^RjcWkBZr%i@d zmGfOBobV-QIabssR4Qc*cV8mZ{b--2jJ!Yf=*nfPBHEip*{Lle^Hq%9eWJn8xRFmQ zuW#YSXEvvz!WTwn=WA%{k+E2R^i#>UG%O0=AYi}V!O&e75}7ldN&E95HNxPTHg)Ug ztfNe3+hHFWG_+2PE;XDxKdZ|X>EF=#^7NrN(veGhA6kq`g=}oOq+KqItaHF}k zeQ&EefY&fgLIu;n0Hj@QGRNM)4%D3QvV|o$E@hR_cbl*!(nlDlqnjQ z)3a3MhPx9zRJZ9PWU%iV^Z;>7%cz&r#*qqu!VUt!!Rz;Vhwx#QE#0} zMIq8>_Op%GmK0LAt}f!eDXf1#a%kKvdLtyduIe|vSx^>AFTx7#;0DsKMRc9V5; zkC&Qw9wvEY5Dd%yg2gz$Lz}QaUG4-m6Pf2nQOx{u?SNue~GC*a6mjppoPs?L(nHqvIP5EisRYGy!H2&a)^nP7SYYoms_ zAUp!G;yABbWGL7Mpoj<&E~4`H_sWWBvieCH*ZO82=+wRzlHMgSXt$uL;^Af((rSfn z6oA2enuLgSp`f0Rnd%Z~dkKm)C$x!&TnK3~(MsXDN%5Y`_UgA(hrd3eD;$34lLN#L zPud0_zdXj_`SgkRSt?(rNw}sa(Lc$a?PciEok9{Sz&+NO#p=jCC<}P%As62`{YjAEA2-?FKKWoF#iYs99cxhKFZ>T zCfH09V9i`uC})^Ru^ifOOnLNg zQHH*)T|HQ~^TPxh+6)RAhi_v76*qt2=7BnGk=UZz%OQWzUuM+B?ikC{eZ&&$ z$wjk*%|^(=OqP+=a$rQe3H6~?0qe_gZ2sf-mlf&tD_HSj2u>e=HE*P>O=Q_Ggg3sO zb)T~%)5W;kHF=cIg2KWbsG7kR0;MDf9d`T}rw~A1bzsx+Sc{X2Otp{{bHWOu7LxzN za+%~ZUO7fER0akKRGM#d^C#G8#d&Hd!;?zS<7Sn9@yQ$yj>IBUpJ1QNm&ZGkOujc~=#MwE?MD)i zrxJ4x^?)Kp!%$;2ndO_YP1SI!)kof8^SU01HMkshP*$-z-cRT67sIOzLHqxzoy!)R&$ z4_wN^^u?3MU@3D&tHoJKHztbo@9&X|)JGdUU3~jd0c|fjkVc3uDv)L^P(d0d^o;IB zfC=Y5xVwh~R1GGZX*68Bxe?xo%c0h9z^i7H(a`}r6e#HcbOWvhra1c-;eZMjNGoB^ zC6$I8A<3V#p12tS(@ADr`ebO(yy|^NKL7Tj7K6&&Pn?X%Twwsitu9E-i`=@)k5m|4 zdYKM3uY-EqtWA$lF2P<{SU9+r2-qLMdW%ym zt-n6;dbz&??Oya!_y;jW{D&iJ?Rf^Vw9}kLD?89Y%~o$)s$xuJ^Fej9 zzRj^;NN@}u>Q%yAAM?Kvc~(z&m@ZAh-BpneTfV-c;dpPjdN90AT5<~87%=HErbh3c zkYvAEj5GBV6z$Vo_r;+&rV!9c$)on9;wn8zQ@|6zX6?b1w`7V4=C-nP4 zefqAu5xgx{GFd8TD}hDPzl9L-f8Z2PXz%A#6|DzqxOzqI`?na|AK~?xpAlEmS|K68 zgW#$-uPTdlzjb@+t?f4XAS(};B}x1vq1>1V8dX zd(MsFBfU|(PRz3}anPKqSK4d^N~Z<|Erg%lls={J6WKJ%>gl9S@!3ec(NPW?&=WU7 z#*K^+g_x?2#<`^Z9HPw`zTY?2gKhprl>g&Q2XTocycsZ8!ld?Ah?|v)KaN$prztv` zh^(ztRb?ij$Ql#M;n9&X)6zUcUUaAzImiDkxl%D}3)lgeZt~xz2Esd7C(!P>uxEpw z?Km$M9Fo@C=A{GA%5kV5+1s(~OG8QjVH6lDO+r^7RdL~aSv%a(PS8XBQrD_K*%!UT;m%axtGA$m^ z3gE1n;WD*?RtIasFEs0UA6uH5x}cEk55U*Gd{-l-0D_nc&uopQ`=bTnHR`P-j#9%` zl%vl<>pu*+9~{8oT%+;iaZ=|j_%gntz&*yA}XGUQ+QQN4&)*4zv3ps)8HZyev!PUiL}VsMjQGKR1Pw9I{*=af$5+#4bTd(LqXjC zF7n*FHA(gBUm6G>++bvEGlRh58~&$8w6XxezN+g~D>%M@>hp&|H7<^E3DAqwF^@4r^mY>1SM*!MQPwN!@uwS6*wunK84ig}p^wOMDO9*i66RNQ9M*RHr3f467s*b2_H@+lTZ|%!STbLkpVA(G zN*Mai$5`Ms&@!C(bUV}Cm#R9CIYI849I$Wz5*w>y=TFCiTLt_hpjnlBkwWG6Ht4{Q zLFkl``X3D<%F>nBhtT&Gz8J2d7ndy@4?l77(+N6OZ63p{znt zS2_ws{*QkP?y!DLKl#7Op@8TsFE2+CqGS#_0~0qi@n>gYDHSb?n{u|mC@EgHHd`Yh z=W863mibHo4@e%BNy*oLms3WvQ6>4yZ;5)lw3f#>%!n2p;c#eA$KEzwg!$A@dD92& z8gr3)(2oiOQUE#pnjQV~{meYg^m~%xaW_hEPvEVZmi2-;-LOV7HX@7-uehe=5wYW( zjgTV}*!n&C@2z4ZBb#FhPj-@#51>T3!nv$I!JuC!mY*LK*kp~ECi*ghGFa+$B0kan ztSgAzDb*J=jNtmZ|Y7>p{MM(TeK7XeF75!SG$S?-H}s?$gCM=8QgxEegJjve258Emr0^TNpRd z3<=33r`F)MIv#q4UCux#Kmb6%1%TfVdEcsv5gmt;Z0_rEnZ2}E$9-vmbfMCEnFOFTsW10!rn z%oCtq)sEDE+bZ`0U^jSI_g~gQk@6r%yP{lN`GhGrSbAvPFTGA`AtB>a(2j78J+VcS zXP(v22uKuA@o--~f(;4QB}~r_q_RLcWN2h$)@p42^EXm8&9lVhq3I6dpa{0TwO&hB z3S*Y17U|npiwpKO6$D5jxL6>Mprxgc3OwQ&h)9j?_gtpBD@n}2S3=UHLWA?`a=UET zDv1w8&PKg?EJbD`ox8o4{$#WH`1iB$El-N0mxJP&cLo*x9rUq|NclQ+{6XYKAFwLo z=1@wwfojaYG#YMY{2apr?GuTAc~uq7|46$wVU%$M|8q+_PBTJ$&7XI8Mzdx=-J*-i z-8N)?+8=EW6T>1Xu$lO01_e7>KuQv1m=lRy^2SyyGKOX%C=&IPW1hP+y*M5`%T7Kw z{#wEcOT2`#WTvHF3R|?8izTbseEyygM1gK~KW+eeEPK!F+RkDpBV5 zt(4O|Gj~ZBPQL1%WaR0y4K&NH4{UpZ<8uptZ?i7gbMv|{pq8ZR_}|yxv5ccYD?UqW z5;BA2#RNW7sAh(&FD(d@B|Zap4dn4?Nb%_Zl^RaN9Rs&3kCVzcZ9fYyPf!CzhkbS! z*PVqlM#JANm;ytjR()8K1v?-7Z+4jOPO~3-VEtrwH@g*rVq&0o=r_%)RyGwNd2kj< zNXBP+dSLF`&W?_EBU}7!N(;ztm`@{7#p7FYS<4cw^wMTOC1DCJSeKcVQEtdbpGKjh{}X`x|IW|g zAVt*t5z|&;%*RT^ibu9#xUkjfbCC7_yEm9*-O#tO$45hw(RktYtteR=!NHe|J-lN^d1wev2O`8jxKL}Y){U>k zr(uN5+vvTH!tKK)n}i^1-!lGvC63=y?ftbb%&5%!``2>B(y-$V8NiT(hVqx+gNopA z2hhJDK7moE|E=9D3R=?I*JH17V)wtD+D25%7X3gdGKwA}EC!)bkxNT1;)x!A{#BQajfnUa=u4>JI6Jp5UO7MKM5aA9L`uJ-=kF^V zO=7p2GS$vATsur}a=>NvkG9>3ZqIoB6Lsp`#EAm>zm zGD4uyzj=L_{#VT_CW^RN^610~4euu7uV3lsm^L zb_n{fqkHK-Q{`W_`|BC;&CB;yhVAo}V#B;Aq6#USxv^)X?i0a%hlh+3ok29>FK@O{ zYsRYiFAj~!%MOw!#`LfK|5B28Pr5CBUmh6A6Z|~!aLcWy(7QKu;Jb6PmqA+lMPJx` zhp^V+n@C!V`k_S=a50h}^bZ9ko|9%j0_;NCU7_V`}p=Z|Ldg9$OCH-Lup>F9oVWA3{N&9lZA zD19Qa%w>u1u{__8%;AL-aGJfOP*AC?KI@KGIscR&W#%Uxv79fTLdzFyWkEF0h< zG(G$IllYnh+?X9X3=#;q-ZeRTd{}wxHhDN9z5{@L|M@iEOnPk6`?vP_y~HM0{YWq@ z1y0JcI4)iBW5fUsH&KDpY?D`dm{WsD--%01qKrrJt+?CbW?J!jVcb36d}@~;F?LlV zv=ei#eleg_En;t2%&?zfw(oCjer^%wWk#$ebnRBWO+jncqLj@qHHulpHD>L$-~2@F zl9v>EKd~=w0EQ0SYO7CGPC$6YgKLOr%#%QXNWzg9Kj_9>0i4! zNTvX3>(dxWfkl~I%6kjFzU7Z7eY&noomfV+JK1j)Sf zAmyk5L=smYIIkq>L#CZ9f)5DZ7}&y@XD%jHm1qC{XuYK3)iuXe*aU4no#i>q*AV++ zcGt>10|6W<^OKDS4?V&;yZV1*R6WQB8kt_LeS^SBJ5;nVcL^fGu@9@r`zeoie0Yg! zLmi+#)~c8C4A#p9`XSc??kgU{B!FNTh-Ny0(YGE^TO8v?*nk*%a#UX{yOz3LOKHyG z`ZZ^)*Rda;FZI4S!bXRyKnOoQwd4;8K0^oWQK>MVD6$^OeR5ot@ zcRc*ukR6JaG&g1c5QCC=OR}X!_2^3;XcW)Y(7W*an)Kl~KHz`msn?JI5Yiq5RISF` z-bwOn7+Jt6k@gQ5#P}qQBOEZE{1NwL(^{v!AjZT>XIW z5>tE10rfQ5d%;+UxyaJ9j{fL7(Aaak^tnZ`_HeAJA!0WTKBk^ehx0O_fJeEQvN~n9 zyI`@QicOrF&R*M68;TcyF0f?4f-g+9uzqpmeSLMPawhL`7Ou^MVD$w%d?l!g`iZ^} z&b|}2hbP`7VW49CF)LjNmy1WWKgS=6lFtHKmnwvG)HQ_waIIsSJ6$B@TB@C}Uf`JG zww5{+;4TWdY9(Va_al##goE>NWNvVOD);fX9ZdU)=%n-^y%3mQsZHkDi&*G6-g(?S z+D}<6pDBz|oB3k2W*!(>n%O%hjGj_xJn7R9BrW?qF{T%u#|#F&E|GKnvGB>~W4ab4 zHDl)~)7(G?(K_Uv=i`-7!E4fLRh$Jo5nVn8k%3$}7A#veYUD(5m4HVpM1CN z^o$n)5ct3yVcr=8AGAm|h^Efdp^~m11v0i&6IoQ`LUz~ zCHxVH&-?tp{%EqA6C=(@L-szAs;YahF4^LLPX=qEdjQbiKeazl7y*<#Di7__VWBS9 z9_J}?r`mADl+`_)!s7gql_JBTU;Ko}r8siHqsx|*7dltlmbNJ(BR%<^lVMXp{F659 zjUjY2$N=uCG%Zq(ea_rjEcZ%qMWoSf)oR!ue}cv4L|mT*T*jLFo=*xSxTxF>=W_?F z%L(E%aKnr>JB8Q_PxspA+WxwJv*P5!4E$x^*%ht?Zll&a$h!NRE}Vwwx_2XPUIt$S{KLZN3|h8 zf1VxykasqtF7vXnTFR!nFm9trNl+z=b9Pdk_9C42Qh22RA+enRkm#BGIaxy>P9=U= zcDsGoNRL@F@rThBQW5<+*S5ed97x$-7tovdeJ3{`s|5;XH%+wV+w3tn%K1JyR7~jo zLENtsipfEwq#Z)g#KE5qnnGc??AjW_@Fou~E?lK?8GyP_L!EVIgBn)*SM2x!mQVYn zi-h1W9YS#A5}@9G*S#ORQVg$V=KAvT7-pu>PaV($!`oq~6yQsWia5Ji_VIsRqF|-_ z`)cl8V=`nEe2C5(_m5qj?|^P}U&bLz|BXk@%EN}h)1L-cwf}xW>*+0e<}J535+8xu z{yN?_#_@yN)f6tmnxsWS6%33%z-ZgXiniK(CeOut*KYymW&NQTEj76jk;iJAhF-Z} zdh5FC>TUD|RJK<;5hu96-;XiFyl*DLFhc^l6VE3uo^()~>g>aHm9qflqqu$iuHd&v z^L1C%vn5$+iutYNs&_F1LN#p-M!d!+r%GmazsO!peOLV0Q0{m6Zn56{o@B-3gMrUF z^hjSjlb2sRnQVp0ZJDL(8-(1{hrFh$ljg_g7j&Occ?S0c5erEb4@iEJm-W-Dc4euD z{ig-k)1`Z(Zj3~JiWMJUOEf9~S{wVq&EHQCBfQT9DT3?F@aPqyD~bk}1`1jt+H!LX z^OJ2=k)48+7M2^ua3eai(nK*S9{CpLvdmnnI7zN~Ii&4hgIIj_(EtD$C9&hT1w2&g z48U!7^T>3dEkEH?Wr+=YCccCeBTvn^elpuN=xCK=i{Y!xq!&liO95!$h8}ii`Sd)`XcItb?_q`;MrD5L8 z`|P^48SPtRrSlZ5)S|ybwe`%Vv7O#O``)$ox$h1nyju|bLMP80%8z8uA!+gP!t$eU zE*co$J$f(p3Pq;zc05QG;YTWgvZYRLi88gHX?|mBrz=mdop`@*TgO{&z;8K)n(kUe zzW(vFyrRO%&o4HblenR&tq&xSCtVU4dRqfv{_3j-37d-O(jraumf7~VC#DZx5Vvq$ z?|~8SOwAQBR%7RWiA%36(5?h1NECca@oa#dm^K=|Z8eS%f29n=Qd*6hDX<=LfBazG zu%>yd#1gjezMJK^^-5+oI28~Ypo8y(o&ME!%L>R|V4lM;=`qM#e8oW}Nh|$vI5Y9v zoJ@zl;CD50f@!-w(@S58y33V)>Il1S1z6Q38t@+rhnR?1laPnZ7DQCgcM;Cy5SkZ8 z!mgEpS8%%Q*lq5F^FqHT)l$eB=b6Aa@5{jq(ACq2nSFOj+Yp<3Us!#c=Xf9^z4wBU zV$Cb-ghPF&v%kMdEggsN-QH=;3bdH|P~;tMJl58&=%u6d(41J^ic!UBn=Rg~-@+jd zEiYi0{L+QLr(v#+@r~{I)Oip2 zoqkQ3{A3MW#`vrp38vd+t@Aj+sK^oudK!E~#1-vq_P`Uzz^zb_5$GMX>BYsLD)*6&bNmao{p{OD<0f&22^lYZMhM*IMhf9#ReBw~ zT!5~vw;sdHTS_`+=WIy#px{%vKQT+ujl=00(_Dq%a!F6z= znp{T=huO$wJ}0?s!=^12ti+ufI-irsS)UWi#Z|Ml&@Mb9WO7Cy5)&AG-;-COJmvQE zQ(U)+ws(2qBq>oeGEp?Wy5uiS!h(P}thxm(u$X6dpFZ3lW*;A~!${M?Bsw8yPL~2V zB8$EgQ5l`-qFr>Lgm(QK8C+7*g4cdzUOGIC_ics*j|?qxM$FtdBM)lB^92dNE3+E` zki%#w;*cc}r9G8cq>X0(L=3SO1T)~L)~$!))^?J>8smUJ16t&$io|E}lODO$UoCr| znjLsKgvi^l-NXg06OJ#*r;a$NKV``hVYidh&t-S{0Adym2?zB*z)M3JgbH2z+!v{W zW0e|ywxtH!+Qujaxh|aJ7VO|!0o@9dQQVx{0^5RQOFW`JhA=o&+`97Q$?+wJ`j88! zU_=sS54iQL-u7oL8>bRIhETSeb2(E1-zm)Bnot)l``O)VJm-Les$AKJEV~D)a?I^(QgiAQN ze%bS-Ja+>3EP2JxUxWL|)nDZVH4JJ-Tg=802vt@WQ+?LWww}2=e?QLlk`W>mO|Ls$ z-g*`PbBgSq zTz({OA`evu@Aw*HnH%y3?F81zEt9(T{Ub|Ver>tf@h>O&EFk5JdqpSx!j)FJI~F5< zt23b6arV3HP(@%xgK$50&JR1bnpIQBflBiY-_XR)v11*%T|K!#_7SuS^jmCfkN`hg z<|r^kJ;zogBP-kNgL~A-JMyg;NlLLhzXnf9%*{kVZ?dz{?#R4EfNQ|XZGY`^$cyC9 z^za!{i%aoL6>%SYo$)cxb#(G~y%FBlf-w2pv{pZY8QE&iU6Z$u#4a60?I#wJpX&l$O#u@{DK_!uXP zQ(t^F75+j4d_{NIzP^htDX&^mO@ux(Zubv?m4mdx45vJ=IKH%qD3s|?S7{O!DbJ$N zu_9=`H`KBl$%|P$-NHA}4tDK5AoXPV!8Qz1>5>w8ok<8%0Uz^^At>XiIm3-2@=$Xg z;obQUAe4z@gb%FS*Qj9+&Ul(}mrAeeOnv;PkInnSt1VJen8+bc^J!&MwoUbGG zYd`mZH8{J?hMF8+C25QK)zoRLF?1kDuFqaUyeKlz zDc#4sL8K0S(80(>$NF_U`x&d=MvFrIWV}G1QZMgJ-Yy%V{-wjKCqhcUUe!jk=~lEv zw8||A9p2Zue3B=GA9JBC&;HD3%+Y%mtC=jj=;cJdOGhY_DsB7_2-^Vg*)Dl(KaPwA z`a10Dw}m~Hn(9J!Fr)IM#Xg(}rjHOUj1cWkll?fye=|GVd25K=&84ztSG=CwUU7p| zr3^nN-jD1$u)li6L3}KE@@n!o=Bd}=Gvm*r!>FO4Z-eTtsve|2bR=IgrG z&Iq=^f7v$GQI}M;(M8lX7ZW1%>N4of!a(v;_AoL!2o@a=6(3BD(p$FU;gqyOhJKGIfsRrgQ6y?)QLkDI=tnA*wT1{+Wrb zn&!PMq;!IV=Q~K}?4fxqB@;~E^*LzIZdjraEHzQ$@2lBzYOqhGvldpbHl{lo84~>d z1pO_WpC?F3{z*Tqc%glM=`x%9BD0l}%Cyz$A>(MSRO!P?5t~`-n?2E@>Fz>c6sTD`Z`Iafer#pCa!~zeO zC>N)Uauhi-O|kXIeS&xUI*?3jNHf~4GjcK8=*6awl;8Go{6I!iH6Mvok7G2 zbk@Q=#;&de8J@GXSRjODof;BIwR^?as4CY%ao=a&u2%i^e`$QP!lPBqb-aS})DLgg zhXC(GQUBvC-E3bT`P<*r9GR}#eje8k<<(jr45*`g=ZI^$UT3KUe;a}$A(bXfCdqychi2dj^vVqPUr+A%5ED5_nb8SrgpXL96%Cxm7X0Rb~3G zISsp37C-N#jmH_8SnWYHQl2spu8xRY>Vg>$1f;x%!5d z#Rmf7xS?UdFW4R_+9KN{m;iS>1T9%a0C{tCB%6BVSw@5}C(h>`Os^EPD&5uXE41kR zuor!|Xpz(2VNc&*+%~UH@4gvDUmLL{Y&@+zoF~#T$}MHJtB<7@$)gZIa*|r9Cle*kw6@lv^wNWk)5%6HO;+siX62#63|rMeSQvV z`-%_>i2F}B9wp15#bIhaLC&l5`ORqNA5SI+r&Qp^fBwmOK}mkdM^9cvUE8j}j2})% z^OeXzU6Rm}^U+fE5O-~3RG%?3IbtB{C`SADr-7(N1)~j`>ZJJYgNUufZZAqPciJc2 z8vZ!)l9g475VdRFVRYP2EG{oDfLpq zggEZi##yTJA?_l{?s?EF@xyKgYrFNsG)c0HM{T4~`lr_4mol7M?9Cn|Rl7~8xMyOe_v;D^@pGH4sI)9IRW_C|k;}4lCYoK=&2x)&CSmhDLPJ z%ES3%X&K+%k*aw?C0x_j>-On``_RI!nvS-ATrFPB$)T{fsUK}$$`?hn3dJ9$$(GQJQQ(z;huGBr`OzNAF(@OoPXngn5;jS2D0U&0 z^4D`8c}`nG67M89!kL-=%Pp1LqLLZYMX>UyN940Pim?urs2&ex$HEG10F8=E2(SVC zXH8O7#ESE`Y0!jMB*lzNi)h>2As7hScX&L**a5}ZtL#7~VQe44?9lAt_7O8>tjNi} zxXN$}SB&FG_L&bw?_J+)S^(F7vO$66wBs@PYj$F9QqhvedsvEib)+Kt4@~6#vzrOFz)# z)wn~J^p!*GzFYvb$6w5U;crd&d}gmp?Yw$%oq~@b_NLi(|EJ~sDVhXPsJPfImp?aC z8Wc&R(8|K}8h;5lxZ&k&PKr`OMWvOnfWN=ia3r-w zP5B*l)Wlhb6Yj1iL|1+sJVeNLhkX9mM1X`N(vR2c;lzz9lOcwP`oR%BiBOg?UJ_Z>j!0@7a&^5e*Ycg#=HWV)~6W zKxlPD1Jz(_VpIyYD~r9Wbvq(fVr6%7RU@pHMNDnLCZf}K*SBWSBTSo3=TkNoD>*a_dS?Vj?TsH@_|phLKu_w%dhnE4G7WS+$5a|>74-*JVf+S@DdX~)Ls3L))>)zS(a0sis8-T$HF+@E?69thznFkaj z>TZwy!3B0A7vwpRS_Q6OaR9ATbz!(3=}>>t=X#eDFW<29aZ2VeI1|5D=p=e5B=zh3 zLeCOP@tu!#W~k3UCzg0z57obEvSz@GztS+E*k;<9v8--jWQ4whN1!*O+3s>Z?Ba6W zjg-h^-bI5k6}afX_`coY>gel&T&8cfM?y2HEF$0Vfj>#?ys!=MT&wNT)UDZ!eW79E zFkZi-^LY!atMWFoFpIY7I8|75Ie+8CxhouW=Il4&`F2nM-qzGV0w9!}T=s84o!%yT zdo;jdrGm94E0u(eSnJ*UQ1f6vS%pj@Ge0%%VT3r{C|Ycl69~3STueXA#!;#kDPnzU zITZY4T6_daKnh4ca}DDU@>KnoU*nxjPDlt|E%XlIzyp=f;d5VDk|+bOLugEMlaL>^ zxZ)3qB!+1eW{|vPQ103s8mL*G>fVTE1mg@}A_l1iIGut7#FQ>;69;t# zHfGYK_v~Isc0=FYbv{oo9cJrt)O6jjW*w7J6Zr~=CJpSlF}&X@!lkCJ^iXtJ>yW*y zCrbPHT~atRfmI-&JAQ32IaK^`z7E))7Ik`R+?JV~ zmGO&ChOs~iMu7hXcn4Z^z;(2<2B(^AU|r(G*{PoB?~zE7LR=ofrrRrE^q+pmxxWS( zvm_WAn8-Jb;iY=}CvwgYw)lawlokp6W7y&=%VWU$1b!c?2`%&wDP4^`&w9Iasu9?J zdli^hKP~ZD9jg;oQcIgMbHBMq z{&)lGXyU!>?wR!`mDD}~oFQN!(p9Ume*_LC-*f@1=yz&;cb=igKe#%&dOQgO8YOr7 zSi?~aqHbwTh^?5{4E-i-V*KemufA4>+fF>r=fA#RulGrqnXG)eXOf|oDtvi_ob+GO z463WJ_jV56EuhTo@C*S&ylo)eFJCpHVXbB*`@?B|j#h0fncClTnUp5AgbWQW=+J*S zlqenaHudExD`Ys+zS^tbA%(ZkKcAps!JJ2NyT^^sNbdWeUcu2RQ0gks9;`kNK*{mu~F3W+0mgUIXKhGMyQk^~>j%!_o$ zby8tVnR{@6;U45jay)Ae|5elb1oC^N#^)NJj_vL*I7bXg$C*%x9B*I0AUt~_b$a!4 zJ3dk(_ejWSAX@e0QwHM2U3@L8C(ZHf3yx98Iu)r`u!5arD+P)2rOde317a?W4@Jn( zF&-t+&Sv}WZK{ku__UdaDI}$_QZZx zE(U!#lvMxgjLJqTfSDNhajrSYZH;!HlQueVO?Dj`X6{oodCI+*R7QD3wC5S@pK>PU5wcRv(pc95i z@bIB4&JX4l>uvR4VME>|p@Y|ydJi238AI-TkDBNmbVd?2g0nL+7kKZpwGfO2vN^J8 zB{f0ExhD*oQf|YIbj}3O&Tv38HajwH9`e@`+LVJQM+SW3#+4__kSCp|z@;8J;zz09 zN92SjA-pglX(6_v#$@fDD%i~$PznJU#s?4M4+K!5h~fdub}`}W>l^*gJ9gg@KS7bc zNO*n=NI7_Oim0k_@$>fo*@v#GV&V@l$ZZ_^^3zKShb@73-R~?s>K|Zs8DH1WPRo74 z1JjudmWs)z$=yQEm=2P}BR+?PesC%;LvT^e%l=@{D5|-T1zwL6(=*F7*qk6ed2C;x z-o`UJBgwV$zuXi`T1vrQ2X;L5^1t~I8wlbE9bTx?P*XygoAId=EI`Puh92QVFOtfw zK0eF$3-?a@Y`Q2Gb}Njubb{+y5i)FzVlpU>CMp$wokS(6%x*azLa^+*R+eK*m69~z z6Q-lHD{_nfMy#U(5hLS3f^C53@G~~@JA-oIFjNt5&TsEju%g;QDR-q{$i5p}AF5ax zmYfjQJ}q2glZv}pIUil1PKO1CLV$_Tk6rhvtB_ZLbYuYe?usZNo1?592vIe!W))65 zY~EP0iSu3VekO)|;m1nsd_JHrb$sb$Z^2Qx>+0UWpYeQH^G9#}aG1Ia{O`#*QUsU7 zTWJ87SMfQwPfST%_|s7p$YKI&xQ5iY+<{8`!ZlqsMqu<#BLYg>@RYf4tGcRZw-Q4Y~Rvl7-pK%@U{y58#yJ( z{><8opuRT1GEkFcs=q0QmeNETB<*21XZqW>-Sj&VkNNZ?n|>99v^=a{vPvbS8hXm? zm=nRL+tlWGHWqEA3#?5ZK9;OQi0o*~Lf7&ND*n9Nm_IN;AQo@j#npE;!+P8Xvuvo_ zXBc$%BWjY+rcn)WeF5}Fdz_Df7X+*NtW1?)#<`DW+SE2ZHvWO39OfwoM2`&)` z;Nbr3z(qYmL=`{->!}d+YJJ{T60Yj!f?Z=kSq2sf05V{h?Tljq`A0oBu;=}J2L+rg z901w0{Di(iE~@H`XhboY+!H2SV;B(^SuweY_iYExRPzZgR$wtmnaNL>Kb>p}(T-J3 zV5TmSc?T+ZY@~-m{YXoEAhDD#$tC7-2EfAudW@>-9Vii$)+{hy2+}bFA!P>eG_FH1 zDFpesns;rVJ6xz%y9;0;7GUK@$JJSjtiO=Bo`%M8`cr<6PF-RXSZ4J&CA7+`gqik$ z=!Ien%xB!$yNc}@HDrY7?a5KkJ`6y*rs5SxN9nJnf)s;lw1KT;jCP<3rIa*+ppcVn zGpmX7Rg}&<(V4{AjUXygZTbA_dv4TrIJZy5I$yaEk1D`0f{EtQl3j%wFu5dT+2(uM zFZT253WOzA7rYA^^r{RGx8FsI4-{o_Ty9fAfhF*wnXRCS{OLr!ws|x(FyBtiu_znA zew#7Opg|aZ-XiNAbM#dZRz4HYxUW4p@h~oOhF0X)t$d2fg|%C@8U^u(T@U}i=o>!# zK8Ru1cJ0+LdEV-V+rE^s#G`0F2Cvjco4GB(wSIVb2+VsZb+WYmD;gOOo5mYmfnm`4 z;U!2XL~$;RMhWCa1>VD*XoS|^Hw8^HxCdi-#rq1QufiH!HXqMc-+qQmf%&dw3{NCc z|C19{_151I)r)TAP_-?e* zj7PwthMXCpLS3d}fgV?GE2b3K`i?jUN}a*MNw3Jdq*Wopm=---@q8e-+Pon@yn&D7 zy13bF{^YrS0-v8&YTY<>droszyy|#+_QN#*JADEN8vH5>1-W8X*iPxy~?0HsO-fTF}ZgYbSbdCG|i|-Mb2$ zc`VJ8rXf^KelR?oGT2QpRj-yQAyimi#jhI~<1WA1O^eI82*23pTC=Ex)H!bL z6Rd>jMv>>@Sw#Z!{J@8BJ$>14rAX4x!|NeF{C+c$x50(In)C^LM+`0uJYwEcva z>zSj=zq54E+3~X~-&s#R#$Zh1m3@38$ot^$eC)zDwd>wJm1k-pyxsI*U)`m?q}BNS z9y?DUo%hAecX)EWP0b{o*C*v=I2?xkO7HTlX|5oI&W#~~0=7g>;l2k>I<)Hp>U7(2 zn^@xIaaP>XMNho!&|47@x4+p`fO(4^&|l9Zj;%rQyLHhZi;cwVxCyC1gX@wS)_U{! zznDUjemGsZ!4^COBHpdxsW&S&j-P!fYQlKULjH|jN-8eye|*uP?ssAUKlu^4aSAbJ zJDtzcKpNzxf{F_hL29IpyUnPn_O{+5rg9sos@-j(8pu0yha(cMIJ1%{vqSyYKGe6= zD31ubO zeGL3A^#|k5nGJbhz_tDl;5=bsuHN1=Co;5e;OaAS2xb_o(PFICs_dAL{qoWV2PYBU zvYV7WZQ-N5qn91FmkmVjG*y3(j>hxhx2x$@mD0$J<9yKoyICf>SzbeDjiJno%(n+l z?FMWa`4+nGy)CY^l{yK=IR&{^#P|?Hlw@=1iPCgdsbM{yk7PNpeOk=?4K~v*oRTb! z8_%6L+?+|So0>EdaPA7AsvC43-LNJr;^iI+?O~b?R~VpN+yon4gEa#Ct4wNEX zvj~%3)MV8;#4Gj*kL?6@w{_OjzCy7?Fb=%5n0B~awe^3!06f9?``CDoTS!|fsIbfX zkgCGFNrI?FIyrg9Qt2Ew$|Yuz!>~Ky3|mx%e3U!QfX%k?l1+rbql#aFg(3t;KD;m{ z^bq}t6VDUdIi=o8)D)>gm7R!;^IDsiigOL^5Dr#imOG-*5aW28(V!B+rG1k?^M~OX zi$y1;j=A;Ms%jh9-3z~mEAHgq%fx2t_lz8a35Gdu2e}}zQevw zy7XT(X|V^Fs{0dkY|D4PCl_#WQRrXPh5fA#2&)xxjI`xS@&TFC7Xm z#8MtyQ^A)P7zhnXqV`;StL2PqbRdndv+G`^IIs7Cd2Lx+jJ01{6qKTkgv|cS$~-^M zvFX-n*9QB~mw=Mo-IlP6xaapF?U{s|3QHmtoQ#LhC z(Zvnl5U?2Zb_mX=snOx-Z@-4JUv1*`8HmH*%+OurhUn8WFH+oVm9agY0?7YDOjCzW zA5{q#o817gwb%Lhn)$sIl>q)%0q z_c4D2N>w$V0dd~t3_cul{Kt1dB{fl1E9Y1^K^}%HPnrT}&4N(O_SZn^s6T1zGufd4 zv_jErTt$RzJWG+=AXZK^G&)Hq?rYOdP2*18uovVS`$ExTrIb&x2l7>=Ux+_E5-I9T zBekiFdy@x|ZysS_G=K)!Aa}BtZvBqpj82iBNMcFYkfjiabSSmyN^Cs`gv%R7b5%np z@fxzenK2~QO`1$ZpETGl;y2iY*~}TNat=F(@;M1=ZYO+$6atoe&B*JbOt{csa)-I; zy(GQP5nE7p&o-CplW8b`Pt{5rmsUvM-$nJ{M)Gto3M_M8S+IIW6DHY0!rXm?vW#&J z6uA!a|B{;_uqm{~kd(^S$AT~tA0JDVSGcBMU(eu46bVLnSGh^VXyqaUP7$|Uq}`yTz%jtl z)WgHg;M}R1iHTO~_L+2Q_hxT*T|+N~RU&=9-Gl4LO2A$AQ$%xo+!-tSWSq#g9#|UI z@*MsO%%ObTQfG0tZw>rfbElaPa5C<3ckj*mzm?k{LGB%io2+mIa|#w#^u3pD51Rme5vCm%1d`f$9&5f@Z+NHd0}bl5<`WP6oir!GChWo}aJ9{_MWV(nSXt zOSP+K5QtIp$ELj}J6M`itV!c>AyESMfn2I7hq8TB+@C*-D;tf;goCwJm6avj;a5i% zCjYV!9!q6x)N+L5&Uxa4mfyP7WGrHUeIWg7w>didp!NMM@Oq@unFC52GbwS9kYq75 zm0L^&oz)!f900-*9$HFT+5NNUBGR#j0}BwmnCDPVcbA3teQn^!Av^NkBl%rM_wq7U z{qexEcXEn)e)c-t2_Muo3P2he8rC5sT0-kxknWFNZnLRv?dn}$uSE3KQN@lOf@xpJ zX8eKc8IZ2GadXk(c-x;kLrw|AmzmSMPb z_BhrK7}YjZg^l0oR#w+&Fip^%=Qq%=$t0=9lr2n}M%7h?L_gzUdI3RX7#uWHRmf2d zG@`haJ(bbNBD;!*>88qB6l?I`Fzv4-ZO~dv8W7TXWtLct?s(a{Sl(4#1m z14B}yIs4$)@Py|b&e3&&6!g3r4EU?Cxs9#rzvP9|-PINK)F{f+`k*d)Kj0j1wSWx+nP5m-=J{AbwM{0EJ_9?_1c>`E za_$QI%vnG_p>P1Y%Q2yP<#6Dk^h6pSg*LDowS&)F)z_QkJTl@sdi@JBI=SP%0x@nB zS}BlOAy!#4?)J<=Ge`C@GizzG9jE=(C+wBG{T;dA;4tCXwYK`Q}h9G9cT|%(7zpgGG0fP_I zwJG4@Kc_3ncWB=rDy;g{nz@MLxQJrK-G5gas4V_IfiBDM+in?pGgz}ZbM+#MD}Ir) zS|j)dDbdg*7cWCDGMOKu>ta`d*61=O+80!xWG-hkCtz^W3y0Wt*_WU!`t-{`r{sj`SQ)u{O3plXNar5|hsBv6?nWTW+`$_f~fJ=gZ|CQBpuv zPPi$3*JBITwub1p=s97CM0d|Fr(WS&?OA31zP4=&o1sWYKr8r#3TAFhd19@T)U1e9 z;i{vQxwC!J^Lq7U*q6W?`1berD1@nn4qG~%fl(4C1(~1zwSC?Pd0zvyaN?cqV z_)JOu2-iD*($?z+O9%^QJO0)d=8gsx-m2EtCy@7WZE4-?MHi3czSHO|8BD7>AhPvF zN>Y?QUWqAb;Iby4AntkPv~QN4tfU4dDt73kJcKlrTQAd%w`~4#>8(!2ycX5FVGq$= zj}_g#I}z*WYt(l?h9k)i^;PCM>sq4U-NWHcogGw_RB~@77fMBwxuVno;}BS;cN086 zKmX8Q0WVQ2`|3K1wv~;Li*Yan2HB~!mw9RlWqxvPq$Wd(1`}?T+%3>B^tu6$h9$T? z<@fgGZSnod@1yx=_vDqIgoO0!^5JLz-SWG0R~;3&a0pN;6~1m8w{B|%74CNNK_XdO zPj5j`)!beps$D&=*}SOLVRUeDF@+GN7a_B<8EaWBD2ws>4PnOto2W3;Q6PPu5F})V$qr-I;Ep)Rybt1(tYna5yN_qr{kfvi=YS;wpV6aZ(+wSaFcsdu9b*Y=`HgNVb5Y3#iV&&Qrp~~7+ zi`AH2QIg=sgy6dwn^c_Mw=X^=ZmOrWZcEr2%CDv!r z_4H6UfVmifSw8Ifx4_6#z!2)e)Oain(wtwQry-Ot%MYu~_vrKQLQY@c+T=|ksuPnF z@aG=5|MB*DeWOTtMWRCW?Yv*k*GPr}g`C6NP#V%ZyjID+kg$xwcExSBuXUx8na4-C zk*YiW(svbfLE>tYHS)yIb+0*bt9-*rtlawM<9<* zdTnEE=cAQsnjP8q{nhOh`Krl&1K*5)SZ$#l->IMmJlP6?nWfCL#(q zI)%%4>2;1%j&Zy}G-pB`iDU#KH~J5n<2F|&?<1n2U3B2NlhrejWbB3xTw zs=q7O-PQna8&`vbW*_E&)AcLor^QN8IgQdSLZHyAjB`~Ok2h7fkeWz9_d+n0+ADL5 z6E0t&_p)g)YAv%$5(@x8BRPI=(C_zl@1d)!+F#Ed79B;ezsd!@`o^8PS{aFJKzO!l z8JY%hV3KR9V*}z4pvkxTdg-@-eKQ7zouxC-l6GxDnH9q^f#BOM0JC@s{`-VLBh8RP zZ(U`VnG9Rm$7$@jhY@<7{K`ub$K-$K+30xoGm0KKht0HQmf<3b$kyX%;1pY%YC^0G zaG2|4Q1aBX?1)%}gMbgm^qiPFxY4D2md=z~Rz+`tsp98`)))-*{s49nnC`DZ!^ur| zw$%f(a5qYnw12ygaRtV(3f~2tPk8?T}63XW#uNtn#qmQx*-1jFg=CkELK{tV%R~Aae%$ zy>{ei*$W7Ec_>k~ZqgaDK4_TkfTzl-f?9{)?4w({{uN{|c&F>?S6@7(m$j5q_68>r zkXD8`YDeKu#lWT8+hFbxz0SmEYYxfP1sLQatq-;qF@|Vzo#Lm*dCAIa#b;*=1TVx2I?G)>2b?&KGN0#NUpl3CC_8Y7i`$+T=3m^$ zE&5THJ8ep}KA;g1WOpc_DJmVy-%okV$w#0E%Jf+T$daKU1;L>~&VU_x@{$CuQ5GqH zd~H{@RL^6Iu;Ii5QE<8oUEO?dZYlgak;)Wl3?uSF!_hCwQ{b3?LD*YCx1qOjyd|q{ zQ+t>y?O1m9o}Cc`E5eT;92gi%7$gY^$>qZX9vm7wdO>a#*qSIR8u$(eYY5zo8%iIy ziSO|Ppe(oYIqePN?LZp9o&N`mvpZ=TK2`uvFg~ff_!;ctN4>)yG&Gj4r>A3icj{Qt zznsifr-2HWW8o@Vh8ZiJn1+RmPGOlsqcNRyjfJpiZDVJ*MB(9XQEfBG{%noNXNx}wFWCfg>N@q zy7?-ynM%bm#|uw|%p+|ggw4TnL6p%og|QM1F%FG|E>j=*KLu(6KKhpeX#*GFdJ~#Z@IM5|C!E1c)8t-R;1SUqz?M;&@;+?i{-i(TVIvIwgTN<|*lBdV(^h=dr8 zjaU(%hz-e*T|Z zX=aAfv6t;BKRHV$6wed;evvj&LdWPECeCh%>1ZSx-}^vpK(#Kj5zEu(l0ZbE;{!PT z&uE#5=wy=t3lXYQGnlehXII8*V$aG!!!omMPE7SaQ*n z3mfDUpI>7SY2(BzIq0#c&-?!a@tk^8fhL|p;?>ezn!h7M^RqZ)aR)LrXMK*KIW;LW z9mqYPGT{2A1{Xp4g_d;zLsc_ROI3q$aWd!8wz(gOR%YD+6oHTh9((#kiki*HOZ!Qe zz0X~bkjm71kISL}#9~ujLwWMHcDNGE0r^b^^kPj|L|KQLn|zvyP;lcJ*thPMO&TB4 z(Qj6@8VBwQ{Tc77H(~Bg_|cnVOO4)%r&r+x(G6yk+IP8)-XGNt4<-fb~o!2dJht+A9XnkRJcCtAyx;%W)nG~+&Sde z4TRy1#1*PaOCb~$g4z_DXkKb?V3jb8O5EiLyR(Ba+|t|>ZH-m-d{P$2eQ>OwM)RGa zjPelXT|!m{F=;A=q`xYk;Di-8T=eg5sU&OCYX9A6D^NuEkL-cb-2Bme>e~>?5`E z%CjiD^)A3etn%|ZNwf9iJX;B8UV(wP#S5^2SCLtAlXx}vO(0?x263stC=Ajm<`i2s zwm}nT{YKpcMYoqP#6RXfxiKrO9E_Z->cb~b{5hER-RCR1i{lks82AGBCG2u4DEIBm zy=Vo85iN<*J;_z_v4&4YU*+%la;}^;Tuxw&+e+IRLU2HCa4%O`B^Tj5E;HtOCRBX2 z?%RvbDDjYlrTSyLDtBm(h{Q9;76V?(rO=^2CLE(CN&#Y{tUpVHHrR%i ze|AHr4zslnL7d5LzCu9ps}FhY_Y+0y=}LGe`4nc8yF$fQH>Gnn0MBlXeEAsB9t!o3 zq+4r-pW`Li?&b$x;Yj8bZX}fBpWv&MJL;1JCSN~7WQXeLC+>0r>@z{wUN7qsC5b<9 zkpn#0#qhcJuj#m9-PtvpZ&>FO>>bRf4<^_--!CGL)AyPt(9)Go9u+%!p{Ru)GXKK8 zye%Kbl3s=tLU%4@r*pbY%u);no%^bzU9}qTUyq7iZMDHgy*0qxrG3FD!o$;zn5eDHOnwk+XhByGJ=OLvX6o0qj{iV^qYpy@FJ=0;&@*rsto=hNy{ws)H zwdS$>63ZdrbG+T{V#YecN6epDsIl^}SH@b2^D? zjY7SOY;uY_)4m#1FB-i4=KUGE%QI17p_Lv?%g6lMyg**EkarA=N+V5R6kehyesn>C zC$k+}O~AAjqUa@Z-+XWtS=jOk+wc0OnqZ}>rAjdcI#w>|z+9bh^`yFN7GoUPvJJ-9 zn3}@b3vs{S7TaXJ9Cevj2KD@D1xuhkLD35F01|Z*2f%%R5VtTD&falk7hWH8SlwzD zBW$e$50S!Y>f=FAN{S2)tspxaoVA#4WYYtEMJ1dAeeO*EyRpfnA&|0}V-4Xxh^Ot5 z$j2Od_xLxBQtN$LmRHtnn~0;Wdy=rOss_V&a>D-n*U(43; z(C$oyuplQehiX)(aH7bWo|~y^3+L$A;Vnvw7Msi2`pK@cJHUGLh18X0(kLf?Dr<98 zgC-U9?g9L~wOaUAkV_6Vz;X4sCdpE3ux3xGuGm)?YTWp#dX`JQ^&<{&{-8eJ|%+@4v zm4uMLi9QQ@(qGm}%4R}h)@W&7mH*A|yEgf<{|}bD$Y4atbI+>51`?Bf zWH`i8it)bq%HMLc=?1B#q}`#BqhA~n@-eSAt#GDg2OD94tt(5~VaX04L4kv+Av#ZK zy3`>FY%cSqs!e`a2UXK&*ex-%P5J#1EM0G}rSaalXB?iU;uC$eRGVxelIPkHjk#~k z1#fuq=_L{INgu7Kw4bcjT=v~23}r^|K4?Lvp*UNAE%4ohFwe4Lr}XtSTKl9wpgs%ofS%?trsxYLXY15kaVBYFzhJ zz$+Gq6Re3?A@85fXa^bX8T8%!%dz*sZcuyPj6m`OClOr>C@9umx8{4^sa{LdXb9YN zM}pl|*b*$>%Th_8!$}d`6VYmM{_9Pkuq*U7zPksC#cz|zrg2-A`L{24WZze9c6ZL0 zC8NH~KC!aWWEfB!9o63)p=bKTp_v7eEVw?#u8S-DZmGWsvw8`RA|*5~ltUIMnH_vq z?))LS;;x-JC266FJ@ljd&?u!Zs3$-Uf30b<9{)Ds_d4hy=F95S>1w7`(bY4Jpd`6Y z8XEbdFE4x_uKTak!VQr%4yad&`jKx;b`)Xydh&;x_&kaFEf|@fM?d$Nohjq*3?q$E z3BBA^`~CS~q-{-HUT>#FmB?D)X zJ^a(xo1!O{dht^+qq}nKAhH|WSUnBa@e0O->n9#uIJ%Qrpt0Ssd6oMr>P3XU$es^R zxt&3p;WX0ufrgz}Hzu`VITUo_wZQQ3vy&4-YfkZCbL|PJaEz!w7(j-& zcAyQN?0)I&Ufz9+$u1hqVc^YPG>ogzvzAIOZ+sM#&msV_ko{}Z5}B-Ke*?a#+iins zj$BKCnQUqkc-7`V;<|4(*JQo|Bc??j8#ea(6ENR*zBP%9U~ZZN?p0bdH?V3xqFjXQG2?wFUU@k#vn*jDO&@A zg*Y&i>)YqBz)ni2b#4da)A}uwH?4xd;sN&MGrT3y&kM8` zVS{lBT{Y!MmrF>>WMG(LMkBq;TU3y4Wpm(e1T!O02z3xV2;~+49MLH$!ki0Ht*;w7 zi7EF*qsh`4qp3dG8Jq!5YOh^oM=Z;wU7N7d?5Gi>e~bSXx1qE(iZl5rd$=_%kLyNJ z^?sWR&LPHh$!I}BIL$Ju0GYb?StKo>yZBXlkP>R-X1_KFr`X*Lz-JBlDQHp;_@sMB zHUFm><^%rq@Cw?z@&iy;9OY@Kus~xBkQ{$m{w~n4l39&+uy?U08gZDEs@8h|1(#a# zDF8ucspUzS-DnPKyfLe7=YPEba%dcDI!l#gwn0xW^iLesAp0Dr&BC)WkLfVv5he5P z>rH#obt}q6xMW=)JymS>Ee51;cR>=A(50qYDRaTh;Ymm!+)W#`4Af{UtZ7vlU5mbG^iQ(>S9#3ze}M~Hh~a?xz1go}Uc)x% z13}fNAso@3N^zaD_V0nLUd;Z2k9JQt2Fgdy3R83m<_FUlhN=?J73Ae>eGRy0xme67 zJX+|bh1RZHCxh%Ov!&Hvdv!|3A9R}l8nk?!B#`1Y&4eihwirRhf_j1~&*ih&HR2R-PtON3vzc~p=i zEL%awo}px|Qw`}qYpyNY1HqW>Iy&u&DlfvW9(`Kdf;B%^KL7H(51E>B#(!#l>=^Pu z&-;;wT_Ka9QkK^$)~$NnrXPFigZj>$rNE}&S94e^je_yddBANiF$|>Yg7{Zz)rPXP zY3A$UY4Kkk@38CM1l8$39Oz!X?Y9vP5p!*4=dHpQgVycW|JJnYXBDT-Z5YUNVBt@Z z8xGV0x4mRu_^Q&#HY(K#{9dlEj1V(&wI}dzL3U6efoEU5D6fLN3!Z$34dj^7S7bU& zuQ)E!{y3#9=En^*@8g>1t3~y&f@H9m&n%@J{^UX*f^G6 zD+-%Wl#<_|!j&A#b`J@DFyDC?S}^D71YQu2;1quLT&wel&48t)XJ5h%Bxf!fXznP6 zxp#~P7Vm)U*phH5rDeoc)TkeG|IzOXh*-R_Lj~~jZL1%^MlK?hmhNu1@?r26c*=b- zQ4Y61Utq`JC>EZA3AzLiZOKmpN8|@+&6%LZoq?i0;jpb{!Bod@G_B95Ob=KyzP^0j z)V?m>?j%m{{&noN$Y9QrkVRMvCynI4s%2R=fsIkI#pUg7@Vaf-(2#^W?iz(*_oi|8 zCTwu8QR@Iu%m`RGeY+)e7r`U+Q%uQ(6g_lS=Y*8-di}KzFCCqlWkj9P{(Wi|Buj z*lOC|2HYtDJE$dLT%JXzhH-^Rtf6+3uudKVu0$YgVsUbPnPP>41|r)7r|!@2T_Yy< zR8m%~=S9DtG<(lk(k*OcxD>Z&2*FNI&c4%~C*ktoN90G>jo*6lHRp+$9^DgHHh@o* zFS>dE8abl#&AZ*hSqxl3{>Cb1ZZN%Qa4K*0#g$++Z8yt+*XN@D=WBuBB73yguh`^~ zQl4E9xBgdMBSEpBl=b}0Hs)RZ5ulq{6y|DW1nBV`5Bp1N?^O;AS^p&C*`*=dH);&>MUiNyZ6hT+yFH}PBF7A3z$&?3j}3oVMN;SKsg z>8v-~oXk%1(?(Ko+v9gHCc6=uydSN&6Yf!9!o%E-JR8ihx777bV`GK`i+p-!ViDU4 zKzFEzV%@=mS6G2VTi{ThOYj2yn2cF7PAVZPCkT5Q3P1+0PiTx0`>=%V<6x5u7q*w;Mos(k{ zyRk|ss;x&)$6Bwq7Nn$<#M$ldd|00!T6Y?}wO<@(sf7j#Ep?<_^3upJTOPNC! z2+Yx2*&RO_=3M!J?nrDUC>T9w2M-An7Od4RC07g|4_5zy^>L)9#C@w#)2ldRz2;}I z%+D%5Z>1P3rP(|sy#D!Y4F6(qIb3)KNBC+18N-SuH-1N#ZC5k#qSEWiB-{Xo!08LY zB!K?Y=kul6OA#X4p*ylWapAM5&~=0SYJuOv+C>KcR!=&?`8dcLF~R8jV3=IE80^+F8J? zyGP<5V3=<72V)=yJHcJSNnJzG)ve4^*_J#@@}iQ~SH;HsUcnK-NKJj(`tw^Z9=P1x zmJs;l2t>Y3OtO$>eg$3q)H!uI6xe5&0dgd^th$aoHlTxE$Ua<`0bEFT5!m7Z&Kly6 zhSLu`&HX)2j-cNlfJp}oL(wk1j_`FvD;FSlPtU%&In1V28!{oR_q`&=SxZmP%}yX#7IQXp=1p9y}_|%WyX#SEY@9$f*A1X&;PM3_a z?5&)BpBnfB_k@b31z)qv>r=&&6Z!DH-% zIRR{JZ~cF-oF9n4wo=6c@;MWGKN<}W4q#ktbS{A#QL|Czun|}<-Q5zKf8xATHrF8i z-GdvG;^o;DsgP*5gG>)2{t=Ncc7tQ$7bdKqG&LFwHLGU~+zM32h{(H51*$fOYgfmQ z8j1n7Ga8FD4UzR#0D)e;_t@_oXjZS*I#dG#fc4xY6QuPlTfNkI9ImdMa;%iV;)a0G zMH_O^GlVd5;wF=GseI?gTnMulvepdxxmVYb`y;W6km z>>Y+PO$aFOE?fOy4aE&rFlk=Dw$7<+4bQu>=VJ8`m<5hx1Hv$#N*jg?V@_(BH@luO z?fe21bCX;c)w4B2-x{(J?x_L@$qc|ekI_LCn3Z&OBD|%fjhT_T%~b>27*NU znU`X4Q$?^sMoew~Pe=5eFbZnd%&&dDO#?BkA3f|9ypl5@;5*RSdOP$;U$l0bo;CAs5bq8WD85xBC;if+x=6rnoA70k4U%ysuWM^l8OxM7V zsfhskEN~&byggq4jw`F5e!7dl@s@=lL_1k>#`b69Su;=NH5<`9`gQ5R_58^o!Uixf z;#%lw>k9uhe2;44*i+Y3)0ju3mmCZ(fW@_w*94!|K-V{x<~u%d<70f~A95K&yM9#3 zo^r+Qd&*s%m)h;-v1E7RY1Z#=FWs`hPSc3zf{%}8A{NX$Cqchy$ZCjuL-kk{{q87Q zzFG{~OLgluHJUD2uF^7?qAwrqGyvP>b842EUo?S<76N{_u{`G{OzaaU7MwIa-F$)N zAwBh(LiTxfDCS6IrNwrt)$g$((|w9`uK7Y`rR$oH+2**)tM*&HjifJX+?Sj|Y>HeJ z@Jc!Ba(8m*h~>3c(&o1U!Sm44sbd@I%;Upq`q+V2rpEO*wbKiTE1i?D@05Q*AtCuuAO zRmt&d7rp&;LzAWDx<^II3OYv3szDBt<*JBAW?t1)2b&S6_t=N78s11Jk70DuCkoz# ziO(J)m;s;W2L!a*1^}M2=A6u$acqSG19Io=a=Ygvj;+qZVCxwG5_3S^zjK3Z;hSn+ z#W;056CaKUDflRK(o&>9?CqY-jy+e4>ma1XP(D(eM6OUk7Gm=!k|iTtDIW-7X}Fzy z(NWJ&e?uQzcfI5v52mRZ3MUE(b zFkWWcqa}EGv((UQVa!1;O;~N~_O7fYF5%McJR7>0EHA_TG<8%{I#8G@+^-qhiY(9l zZzD(kl`cz;P~ev%)WOduxgvg-%_$2?f6lxhGOn(R zyi%I|kH$c24Ye8BFO43C!$ECGnxgj2i7#29*)lFB=#mTGS6rb+3B+Tg|@+M%t7F= zdFOcs1xI1#)}Fk1WNh(0qR~KQ3ovkR1BeU2 zQwu!k8G+Y_IkJ1vZ)olwsCVu9F78YEy)Uv}+`N&J4}1I#7_D|$Z~Ld#LDo6hmr!Y2 zdkPBf?(X&`%?kt)^fX{URDH+Pig{<3BjMU?X3UXmTt#+(jw21NYd@erqPGa%RMSX_ zQSmPaLbBTxX5zh$`A5~dfcL|e5kCN`G;Y;#9Y6v5K%sPYifN`i{6C`JDypug=^Djl z6N0yExNETB!GpWIJO3i@^PR)UU|-~d-m6zvSIwGp*7*h` z@SgzH_u!J^D6!Nk=cm#v`^P8#Tlco6RpzQDemITvth> z{VzeUX@hsGiK+q#Xnk8+0C#h6WN48wDyOwkSKGhC&+3J6UO`pR$L%8tC%hLH9J1X#|kivIY!~zm%7qmJZPxHTm>ckjs)vUt2`5L?K8O z8oq7|gba3*?le5In9P~8FJ;Kw`A6Rf5h5wixGLtES0ex00Dx@3!`L933J#GL>(dQJf| zp+U8fpymkdgsAh3nS?WgLi7}}ySSm5dc=rLcUsmQ%+NFD$Zwz>~49KEN<@Rm7zAQR?%P6o1%hx^S8H*!mKk?3`P5 zFpfq|tpORi^4v_(Lqoc_hh_@crrhHyn|e}KGDJw{AyGBnl+8{~G6YC; z(HodGrB*Q4P(;^2!}+AGzb@35ug|HbmrYsEQRSsF5uldd+>Ms0ov!88N3jgXAgTL1 z_L|>icK4r79`-D!FS{^?xvYMl@X|Q)VLIkLb3N-g_N86!4U5>=LzcFTI{66D6-jcxCE6TUnh4w;eu||@W+Q^57G+w zWdcPtHSikQZO)_-yQNJakpYsyQ$irQ#Y%UoF7ZX9YB9Yfx!*i3y2~>Duk<6>6%&r3LD!O zZ1CW|oLc%Ho&|b@+dNUHL|Q_M>-MNVLs=nTXDiF|BP}=5SX|FSwlw)C?}`+uM?h+3 zkjA1d4{dx`rK9Im25DimSya}Qp5KL@W=a61 zfi}~<^SQuY7`F4;myrqg0qVDVUWJMNq?~4Ew(9Yk*gJ&59L9&g4XEoleW5E>#tUT% zC2>;4!VjI~3|PeaS=DPJz0OF;BrtHu0!|z!bp;I__$wHA!JhcXc`emcQ!ummvzZb+ z2JFms60)GrM*<>((lT2biD{{YKEfSVp96oUaH~#1qYWlrhFiJ)dkrc=~8I8pVyf_pS8Nt1}}Wj0vONtoV6aCW!Utu_I%oZ?o44d>5?)Q4%hp^;$&e4 z+SxB^VaTy8n@gYLQlS81E(=j8xPKXKZ%H%~Skjz1gp{!LNNwM{dD6v}B%lY8YEn_-GI0}tV_K4+a@0a%I*w}h>Hau0XHYsZ7C&uYJ)tdlT!{2N`ISf{{iG{ z$AH-B`w$GgbnCCLtI)w5-w%wMvwM+Y&_#noA+^0cx$wcdSLj4RoYc~_ir*N5bYZHz zzA?P>tpKnQKpF>uH-+vD&(aIME9p0Odp&mJ5)ZHZ)q{_rj6{RW|mtW+rwo$iIlNk`5UwW!pq8Rz=kq zjbotQwhLzX|H$15Q3i#9LJ|j0Q}&x`tl^?cxvD~}kSfXY@A*f5As}&Msj?`|I=Rh| zG(JsW*ebQK2t!+0;=Qe|ph6rm=$CigHg^J{|;r-ZVaq}5il0w}TM+KMff?7UHED)4BcdK4wg3&rR79$FX0ysxfSwm!rfY|GGS5A&Sg zXX3tX9mT<2XVWYFc`52Vfj-lylqnT-f|!Gyj8A)b6Z>3Xhyrr<`G)yw=O z^YSD8s3WN;WL0w-ng(9;GS^Ekta-)2z{U~pgGI8+p}lSXq?Pb{FfivQG}J>OsV|P{ zn%a;Nzy8cg!e4>DWhR;!7l0Wu#sL#|nA`BUox zg`~#%UxMCtjf0Wu3KhwJFdJhjE}LPcCc&bWyc!<%2M~F$v>Q0pkTe2=^K!58iwCmm z!+r%`aI6m83r%xa2__o9jrv1lG;1qG)ms^bOj#4`_1tA&-5a|&@1hImk~ynh^Yd}k zHxA{>m^JoWSyfAn%=z9K!S!&{z*iu$R0XfEO_X2NOmD{4GciH7h)%bT6)S9{SejhH z$SxDWV)$m9Sxxb0&)MU*ncbfXL5j3PmN}>~+HH2PgV1HZ9`It>7afhY$MmQ9J$o4v z=IZ;Be{c1SRoHO@i6+E6U16VQlm-zo$*rC5z+)=?>{_?<7wlqZgV7N?4>>;H_qiia zCnE&_wPxG@(%Qcv%Xf)jJ$m5m|ES3Tn%{KTNiVaP++~Hk=O48^J869mj7!Y4DJ?Wr zA|iozrApe9rQMpnuenD~t~TFkcMpb4*b-WT0PkJJ)c*W-eQm0~a~3-*syDAmk2Q(A zaOSaa5Ep_-Vf;+HG*dI%^ET=CZR-PjZ}`G z-(a#R>nYb6BZepvTbK&Ldf?qw)nnC$QI;xOn2s8pX2ohyhuAS!IQ{vBPO8_wSj$b{ ztNoRa975x)@gZBSY8H>D@!8sRLXNVCw7&YhUnN!2{#zSdQCi1&5e{dyLuunMVUf+F zA3dLpkrzpwaNfhVB;_!>MXk{#jLdjpC#RL8j#oZefRgZbv}WakE7zhC3bN^DhxfH* z^Mw2|x2R1S(@BMoNuER;zxEU2GRIrJ`SYpF8y_{8KqsQ0M@4cmbgZhjz?^*W$80`k zJ%h#VXqS~bUcxdqwh7&c3qt3K`cwC@TaTydl;AaAdRpug`~2V17k9E{dXxziG3oct zUHvz0Pv7l0@fP~a_oDcK0MY63-&X6#N-Hizt#E(0b%7feM-xSqWQA~qfJ_>#FY2HM z(Wj3P6QA2Rxg<|iu=?NpCVEX7l5;n?D6F<0?~trMCyg$D6gR1GUi9l?DqL5p_Y zn{MN9N#m3fII?c)e*+$E{r}z93g)jUeyw zRG-~Z*Do8tMQkA5Y<4~&wfM_gPtbuua{OiTPSy`TmLmOB)1^aKvnB)Q)8l31(g|lx zswiLh^sQ%&L=MuMFHK&yf^-Hx+1gdl8d++fWtFO_z#istw%P&BGj$kpPfD zp7Z~g3bfNc!rko!!{M$Rc2l(}8_~bRML?l%LDJ*bJ#Fo+?I!>I2JdXdjBT5;#W!HB z=Ct(_6lXr$o})GDn8riXTxFm#Xw|^^G0WE%P9-1k-vP)Ny6m2+Z-=-?vmlLZ zz)E}L2f3_1G^oUud9T5xS`56L|FbXcCKC2UgqLX1#gB$!n+;t~jK%0z zC1>-w7z7knF&LNACrUzv8}`;Y)koc|nX`F_t_VG4$_Ca>-}^rfncF{9YJAlKW_IgKbhp; zkiUJZ=BxFd*DWQsC(K*^Dcv4g}SSeJq=NnNL-04U5$L)6Xp92qd04kD1FKwFBb^SL*6c! zcum=@{9XLAN~RRh@0Uh)7Sdx13KRrFRfUVjl%2lvn&X+*8UEO(hs3Mv9bQ#x?j$m{ z%Hg^FNWh*=UQkE%xMYRkuglO+v*imni}>ur2M^TJnyl}FM&K8^vJT)Ee#tHunp~Lm zgkAbCbzC@GT~po{r9h)vTjHJ|xPa(7A<|xJGYHJ4R^e$5Mt2x^ zG^fO!)+*k?FE(G-@nz6Pg5v3dd0P{^NL@oyVIeWFOU#2K-(ZWP^NkF1k;{#>FuJ{e2!jQ2RJ(fMl z9IK~_j0?V(%?WQ~XOHgw!9%~Rh8?~MWVM88rlna^E~d1Qfi4C{uI{-DchQ;p3YG&l z)6|=Pm`dbvh;N=9T=C;O{YeW{tGcuW_nLgyW)b?V9<78FQL_+>D>SbMMfxxuXJhF= z*i7fLm&?<1*v8H!9=BN@Sy%WMkBbYx!CbPToM8_s{Rt9sSkX+DLN$=MY1DfB|mabZ5k}O*8>I(X@xHbq}1NzrUR44r*b@z~ zc1;0$dg?&Rf-e^MzGuP^0(_?n8OGunBo&}vSapW2u6Y2T3dkIRo`-?|1GIvI!orFB z`#<}p(nmGj>u-0R6jwfb-2%^)R7wuf2LS=?+zGT|0gUVE6DAy9n{ubP zng$~SbYN#|E9eKskhW2aE>BNLwPE!UZjATF59;Lx8V4t#Im8+>39S@xlF>?}_ggt&h2m>|7@;JAIRMCA0Z0%BSpANdDj!6)rW?rCVdF}qd z3@QbDbtzGQx#IX^;nb~hc4f0(6%X8=Vw?m%e1tV?XMj+#azPa^YSIvplhH=N$f061 z(Up&Hw!Ls_>AGL^^mlrByuzX$fdJ^18p?7)S&7J4o9i$#pkc{H42ml}r z##cy!WYX&hS<|QC--6su7&^?8{@Ug8mc^jD;KJu`j#6qQbdg z%WEzoq#S1OnP|J8$62w9jnOo6OI2uDg*23R6_Ix?3rw67@e#UBrPw2SJz+%J)LVCr z<~vx)aR#2Aa)s{&=rTnSGyM$z-1~scou^IpIyX1#6rsx@dJ)z02V4OCtkT^l9w${h z_Y||6Vt&a&-{UVAj{XF9u`@j$D>NrGe>QVa`x@LIGhUw`mVCUs9O7TRtO&|*^39Z) z@zbXG?b?|jm#Ew99HfhNE%XR2(esOcBr|Gfl)4WZV2eD&XE7W(?9D*(lPQ!O2slK5 zVEv4*Q#OC0pUtR{X1F{4beiw<%o!gcxNUztnNzqUP@!lnlX14@q`5ISHrMBLUEhc* zHPlY>G?KKLPhZ&2<=@#^aRDGF;z+QI50fEM!YvVb%G1bh0Mvj)n-ys(s6(_&mdYP0 z@Rt_TQzS~)-I4WUTAJD`Ris!^K%t+b)=M-Uq}#p19=`y({5QhCF;xO}xGp=MmA@0{ z99H=eP_6)59#O3{0F531gcwZEM+R@f%Al^dS6(3G0?OUUUmJ;fMyuR6-8Qir&MucJ zQiiC4n|`JZLZ``GQF*o2#5KUF-2|NEvd1VR$AHmTdftRCK~T|}#RY1w;)OZby$saN z`@&|&iEq*^wU7he;D)5ZZK)*iRSjjFCcT0kJY#Ly&NqmNYWH^Sz8qv804#Cwi`mTxsr%T^Sh(lS;r6R5q&4pdNpK zZ`NMeiPA%d-}1Ut4g^OGIO6Vt9#IpRq>NCds*Dn8A+QbNW1V`!hUG z75Tp5lUNC=3rDUC618+*<~Zjh+XFW<V3VP9bkA81Iw+Kc@S3AFD3Qs*FY9->^wA-7xQ?weSunX0e%KU!wDZo zfywFo-Q1pHR{ye5guQnV8Wz}8{PQT*l)9?yU)DrH>vAN9R`{tOOMXx%>X}cE4Vsnw zr7J`ua*f!ZVe^_7i>_6p*Y`0r^Vv!NCG?^2?9WI?t*J2mCNd6B5_BJ1WK=g}B>5YF z`@91@TNjaCFDDN7OKY#;fZX{FV0^h^qL2$Y(nShj;q65to1zH4zC~2HAKK&)l2BMr+mTZSrzR*bkehLC>|_=u}Ma z@F)h3wU5W4>9!;`AGYd)S$a|(QUlf5d1bRw^ob{j6ulV^WtWTb;Y#}~apSAAt|hVZ zrsS|INcKS$FWZtL_yn4}i&W_|E6ehp?<(fNC0ws zCM?L@ zgaU9l+a?`8e*TS%3zYZk@a#?)Y)!S3yNJuN=hv%ppFj(}cBOiJ0hMqtJr01TIQjU* z939zMBz0eDRjQ9y1nICU#)dECqDG;U8#yiak9{ELXPl`DKiSrXWJO;S z%|_M$PFeQge!#~8zpSp^Ef!yauH(KfOrK5%DTiu51V(rluK<67^HywwZcc-zBOgz` z2(GJFkHPcdQDao`x#Zj_If_(M5IK+xV8OhXNw6 zeqH?k05&0Dw*e#sjBpOtYTQ~BU~pm~nzoUZ@R8?Ke*(pVfp7oro^%-*ERwAD-u0?8 z1hlKU>B|fZm@(_m%LFRJ&YLOhlIyjw8+#dvpIe2PHAd5Y^I$h0JGN_-7lYsFXh79Q zjP!3s$31!kG>uNWqSieWqBcT0K_ob)3q^K1fI$qvKm<0&;z6hg61tG`PKs~;)0=Dy zgEVv?K=!`>x+UdG+$7c1)Fd1m4lJta1>hVI3HWvcOF~0!w)qC!R=#kk8k^qhH$5SG zW%PW$xtD9WtBBKF$QvX`W3M}F?Zkc4rDsu-K`g}*9~f7}r&2t_X3JCxRE}|Ue|?DN z(i!^tZ*(_A&xe0p2Tz?LS?`EuQ`Au`Kvu2<6AT_CrBe$co|i;Vd^|XS2Usw$|E8h? zWD>AIpo0mpW4MkW?74w)J%&o%3?KHN00Kc(qA>#0sk>E&e%o0&-%!WY%?;p{*1#*M zhXs#VMVPTf{wQaq(i83SdiRS5-@teMZpR0U)VX011Lv6_Qe@@H&-6xcLy>brNp*YQ z=}gx^KVAM(0q27W{kCqMo;9yIi)(Ox`YI;W^d{<(bu4#^()$AsZhAMHc#mB^)FlPd zXvYi~hUsWmW?DQW@3;r>pnae3|Gb<4z;sdMGI6CkovPXn6a*^lezGy$)Zfb(odttUkh1~sI@WULGSwf0@!lXYSm#0Xd88-=xoIIAg5sU0r^8Q? zYlhQhp%J=(|>eYsIv> z_UIf1zuHH))=$OdBbA2^#mGs>Y=DXI!X}!~N&%n=ATkmD@4H~xcXrQ%4_d+W1^*i&!@ILI7TcNJOTzB817_4jW$c5gVs^+6I&2Zch_ zniC(voQg!1Z52Txff2L`Z|=kf4A$W7<631a58EA~QExUQ(~?%UIBw~(V}Q-v7b_n= zN)BN-gh^o=_mKWOZT~xTz!7_IgE6~YCp!t;impz#mb!(X5|P~R!c?-m;(fVh@fvAL zqN7B`0%+cVZR`7k1$ZyU0_O`z%ih6luDFlw zhao;A3vLSJ=KnNs;=)=6w0?;GErk=B)foF0MEX5<^+U>oBzRCam@E7(*R6;xhHyS$ zYJ3a}LgEhEQ2haeO42MYLXUfXU2gOB<>Cg3hG`-se|qODd0uyu&{_v393uiNS8Re; zf9*wL476eRxQ)GX#=7*>im3}ELMN3OdfEyNk;1s`9l5$RoEQZXGekQ9lqCxb@HEIpI0NZlNn96Z{+8zpKE2{b8ZSyl25LgpVwRlj zpnw3nHUGPC*yN^3?xWhv&X(;^Uj*N0>Wc+cPbjeJ!Nme8hu#oc;<|YzP#+}^h zBjElUGPb3o)N&<5j)nbq2QCdHY9hOA(LfUbIxBTfO0X7+)$bL~RjG?}eM|+!Gp08M z4FeaRu0SS-qii3)**)pEUl&?%#yt|bV5V%V*8`1^7anZ2XDqipEZ)`9A4&4F(l7Bk zStGbi|`WmylAVP(tHCN4t1jII7HA7a%1p79bDwhe4bZyXBI4FD=?@Un)_GPbxV78 zVN60-U-`fxE&bxx;3EbwHEJvqQDy?y^Ree#SERu{*vgDo<{(98@jQs0BjEw&pmjAv z1}clI?!5is`nO+NWvkFK!iZpr|#xjIr?siQ1d+N=w!FCR?mtg9`!S{~{E$Gty$yWtEsq zoJ)1YYP9m8-sQ+|A&;JrOD{S*;$G~g1g$suV3sS4kH>MF+h1zV2;bufl@t7ED__Y6 z)xC5NY1ZvZvLD$S)gd5hIvY8oS7q`p>6AazA8lv7Nc%?$iq0+!Xjizs#v#QE3lxR1 z^17+M2bHqWAuG>;ZCB8Iq#c`v^r|VEzzUGvfE|-~z?`-~5$-bi9=ZUXq71TI;<+Gk z$4jlXj-0@XVJE27>6mreSu*~iF?;{|`KM(NaTurUIvi9wRG3$b;TNNg)N|d74OA!j zCwHJ>o>NzSYCf|!-aFa)_2Dd|9lnyVeY@4~G{=D0Qx7<$`@+$aV@d5U(n}?93T1Ib z@(wh1_D?0NBPv{bCBIq?l=&r@11Qa*o16S6$tBL~7u)Yci;LDIbjrNg_v;+@(a2FX z0)C%q!lR3WtA#TL53!@PXl|ZHaVZhOI`7WGwFpi1cvusG)iVfN&$c#VGVfYY6Q5&a z__5$L$50Z&Wp8TrEqUenRejs^#1c3Sp%`+r@e0jkk3|?{*0SO1YhR0yXaayU~yV`^KSiq2oxnKzx|ncXt3&$v!NiL`w;k2B5by8Ay~>q>bBF1YL-Qx@+QmO`Jq0}un+tS`Zobea zq-&2*CWaM0?&hm|=q5#jld1@HgAAw7ly$o}MU>v!zH5%`Jn0&r?k@2hVmQ8yx))C$ z65CzM;hc6@D|R}4xgVo`_8wQE<%$`99qOLI+H9)x;-~R?_}e&MOqN%@jmzT$`&o`k z<>C9@jMlTnsGy693)e(U%(lSE4Uc5^Fx#y(P&woT}zl+8S^0oR_@4ASWcJ@ zlvJ`uTJ_Q6ah|f7$J8PlpWU8-=`eE&0(S%_cZ`X!!izqaxti@XN6Hf;HV6owm`;O* zJ@oABaY-C*r=9f|!~yVDTY%F!$JHgL*P=^P%?X=RRCRLlaBhTS;*_5YIqQVPbmx7c z9UAxMMEh`J17v@ldZnNpvDjq&QYjfkMq?Z5(e>Z$`TR!b798tLcAL9*CNGYMI}r=o3uL!5TcV1I<-b8}y)#9wmz z0GlP`22LISF-o>7-9^qR`L^j}1A{90iVsn*%CZy!vNs~%8YD*g!FD^PmnKvOAsz2V zyuN7E&ElHK^L@%H-}U z+O~W8mk~{=vLyTyL8;o`heGoJC%?V}H)lTSd1G3Pu3zO&_o|FM4|`Q{7;@m|r&A~- z&vk0$+a?@bx#m0gqV!TNr3A3Hy~*1!&TA3QB=lO=;h5J>sh@2EJO)BoniKa*;{>1L zv1DO(1V9r{!T6b=Jx) zWpfGG6+iwB-{Q@#lZ2f1g5?1Iy`vsrIENC^~`E>bIm} zPA5N55C4?ik%6t+qo)AXS9oS7j8wr;j1kq8IXCW9LB{*cF3CT-7vhdDM%(7QPk%je zlJA91YrzaAu1ODnSfiR1p4HI(=)A{I@pvW+Q1dUypnVNF^hFs3S8@7f-VP5dUpXC| zxfC!!Z#N^rw{x7h3NBH(UuZgC(k<9F;OpV29`vbarp9C77;T#Lg%SPq>s>*H>aN2` z+0a_v=GawgUY*B3^YYH~74n4Km=Y(y{#^BpY4G}q zhXwpaDDlwap_EL!^4Rc{0d43Kdzv>J=i;WrE)$5ygrSe9x4AUS)VS~^*9Lxa8PDl& zxW$Tuy?8okzUt1X_Jqe`C9jltTtLrvqCLUZ9h$M4rsy&q-8l&_C<@q9983prgifCi z2OJmc9#&Q=NYOH~*}SjZRuL&js8ggh3?3a)+u0*z$*OLhrdP*4>zV1CTq81%Ghiv| zx)xkXGF5hEhv%95eqRY6E&0^m)_7IBY1|^cci=e*PC%Q2=lE2cD#~bKs?3`fu+-{b z8(07K)348cy5?QY1DO-TBEvqDpQ#pHrKh+>`$9u}Y_ml3Rdw{XFFQC8ezIfy8bkST z6`$S|cxc=%E#FWh6V7zT<`r;u!%V*R`Z_d-DM)m&2njTbv*wtXu^(mm-*A?xe)Ne9 z=fLLN^W;rSP4&tKWT_kscDLL;res`vaT!H%NaFl#R8b!sBMe@^pLy8!PF(&#MiYTN z@q)k@!|gXp{qeu9Vl)LVaJnNU<)-XRpHn zd0h0L%CD}E?Iwn;RUC2yD%VX1hqv_(S2De^;VYjna7o49J~0xC$}eNfnS^pMGN?6c z8t#8$_gCPmuHKpIq(Eh*5RrAV6Ag`K85a)NBODaWcUf(kA=GbuQJ(H}Z-Gh&S0Zvo z1~-QIPdKT7YmdUF=fnkQc7%R{(l&+g)vWkiX31lTJ7dPslRU&{?ZxMF;G;bs(_ z?26?abV80n-ZQS6BVK`)n;0>%pZ5caR_*z0$pM(izx*3W&m}ILo%@m1{4wzRFDA9W zBI?GwYV2+2!=v@(0StTSDw0ctcam3wBuAQqB z)ok7srUxJVK#@WrVV!699E+0s+Q!AZQ=Wti@qefd`u|#aL55)U>|^uSD_WmiqiW+H z_~p`4!>1P8uCfAs&+_k3AN+Rx&E$e4I724UW+9nV)f5(2WTmeQd^V!K%-k`bEFdcz zFtd+iutwNZT{<7b@X6&f8*l40lH*60tM86m(evKq_zCQiJA+^U$X@RV!uv!;%Tuq* zKDd4BGBQ)7XlN8P=DvSS5en|(_i*2t<1^qtx<~jAv|&bn&wc?sFQ(>qzDvk`2b6zs zrT|v{hg$Kb&rtmo7d_+ORgz`H>{t0RxKpBaed59Qho6p?xf6E^UH=%X)Vgq;mzLf*f3qm z<8kor3XYn9?q+Jn-Ur3&h=uoxt@)h6F?#OKk-sPN=PUo}ZenCpW-_9$Xef_-&CJMh zw3S)RGlGuDj$BE1fYRDCyoEmU)`tkn1l_?=D-Ws5+vz$-AsTsW=Sf*NeBy8e8H?_! zubji3cEP(Ucf3+T${<^VKo+qa0VDD9>n?u3I#24YnEkB*v|P<%&MXuI2aYq!Ftm(d z$D~9a(C-l)ToWdN|$2zNs_@HRYuPVY&qz_(I#- zF?LzvhiR=}vSdQr%eL@P!51vzMA=gi4)P|wsyEDKJV5ndIg4KX@wCH6$_I~J$nq7Z z?a4X1@BEp$vZ31jO*#M#*peRK|4;n;H5onYa_pGPNgsn!`k2!RpE?h+Ko=i&$N3yW z3cFfMeD|Ibv(M(CUVt5(kWYBdTfJxoJ=tY!QER@bLB2R{OUSj!DfTbJuDL98(PkOhpt67<%J#o<>--;11_$K;HI0hSH~0*0AP*x`ca~h zuro`nXHLc%-Yy-}kOhZ9fiRfjLiAwD0&A(`v;;~dn_(tOkj7J%=2lj@n_QHT?On}~ zFrP}GP&)bY%VGfKF|K^cSZZOJt(Fo=JUB}!hM2^U=wRdBPRMG}ZymcW1KrERblBml zd|3j{-XI8GwX~Y0zxbiB@9(RdqXQ1!E;K6GK&M^V;xCsFWjv=s;slvx?=aoT{~`2z97}Ss&IXJ5lL=-BkkoO)pz`~r*b?Y9%-0446J8550zN? zhS0%h&V5Fe`MYUeZBuwzsPv7 z6e>BdzUqhWk4R|f)W54#0>~}-)V)xVVK4-_%V&FbjH0#j$WHUA2UCStC)&)A+xFQX z16&tPi~};xGWl5YvD43#D;;+4RpHDaX>H8ncub6GCQczchZM8SIqL)In!?<(ph z$r`hQwme;0dUmS>Es&VDItcXAnDt6;)Nc&ne3Grqv0QHoTWeUtPU4QfebTC|6O5#s z|0+baJ0YFTv)7r3K@lJIo2zmn<1mkc@cRq_*9a!T^Cmp&pw~9Ng+5Fw<3zv67?5#Y zIUSz5+kGuPz%pt2BnUAUhIkCKL;$&{-e=n0_5rD`SG7qd-_r(|L;p2(jps?HGN=*y zI2g4ycv4+zU6Ka+8!2X=?P6oYrnn7eDf(`QZ8L}0W2NJlc*=K3yr=KKzyks1AJ!QG zBPW8mhUlj4ThNTM8oE~9=w|*D=(5!}H%v90oE=&^okwmB@r94{wBaol=?o6JrKqIw zuGGxT{lK_}g#7+#`q9LdbL*hMK*XxzHzsQysWl_~=N@@xybr8_Ty$e>FTq2DH9EN5 zZP}2n*WBK_XsUhq9ZY_AFvw`}dj}Re3$T6$3TrVlKJrV}TqHp+!gxl(^qgvi1={vC zW>|LhSz3acSh5q&ZXDz=gFdz zmn0ZvZ=3Qr0*(dCE#&kq3FY43u*vGsFDNDF$v%=?+?gdV0;bcw2ynva7Z$~F6OY5T zW5{pYe&l`Vz-_$!Dfej!a}+@|SX$8HZTYb;XH&?r>(<1?{?3k8iXV)pMQFXmD^Jk; zLo1eq&wgJ3^O-C|it@O)%5(W~Tl8nSx$M`KKkehDvMOqOG4Ejs$^rF%*@94F=KUWi zv`P0b<-yyy=KVQy-GE5A#%gr0MtBL%F@$R9!yK*@Pid-?-u?$ zX#7r+CvZgL&UR}_CGDed(F~w@Ohao*^9=j^qNq$Q9^4LN#f>#(Ev>A|j2Pay<`Np& zaudZ3j}%G+)zz}nRL<5Fk0eqTC7j}E}w`F9q;q)=ul$Ln)bO4~843L4CxB1}Sl86~{D2EOHY z)Hyg1&dzp(CfC=Q=bybXOz_OF+DuGyu zjhmv6Z$h9Wi`k0Wn9?yp(mQJLv_@?=E-ngf2_pEj7wSJv)NI!Pwd-6t^-Xc8|PQ>E3wolaT>e0TA za?%e#=-SSAwVW)FAjPjl4IpZYRoH#x<1BoUsAaiye#*^kGO5%>q|QGm8@M~sLq|5# zvFwjr>1C>pxF)pMLAev?YCBWAIh8wQd0{kX4ev+|(NM%Ly*dypo6a2H`_$2{yMO6i zXvOo#^h2hVGj|_%a6q*hA}8Gv){aiito$=ht~OPgUD_LQya$WUGdgR-?*DY2>0dp`j*d6csMYH zUW*i@mBec*JV^0fwhUS6$TPq5kfls!t4Wtw~IQ`6(8Lv-@q2qiWlV3Dq&v5e-ypnwSS#xZ8pJfi)v_EOz&5iL?i00L-sJAsv`c>mO0 z`oQ*zWD>SZK*4#2+1)JV+Og0ozPx0fKuxUN$kT_8Cpx{Y%NT`GySeF`TZ$%E7R8v3 z@G>9pA{Q{S=Gp@H`$5dYWRr_Gt@-xHK|VY9)1MI^QjR@4CAvCQfzXMP?yN0?73+Ej z25!3jcD9-xv3|9x$RX=)I-jdOV&Lv7&5~5O3`A-2DLk;s>e(*kvB1r ziHNQz-d;uD&eq-%UeADe2(B&Uq^<(_2d+FQpQi2HYe;kjfU!0+!TQ3!by1|{+V%@< z+KqL~ZdceR8n8S>QH^(%6IZ-hBVUA$8YkNbB`guTFEDO+wGCjrlMpQPadqOO^mqkw zXtfqpr~S=~iFg-U>UM5nb<{#8u7Pd|)M@lr;K@Hd-a# z+ll@|5py^n)9mEi0$kUxc-TRgj!?s6s(7-Fnvu^pb<?C|<{wEhd*T|PK;NIRS1aIz-%TI7pY-oc|&Nt56ixrkE^wz0VE^fg%@ z?0yV57#QG91P4SALs*oeqggHf_O7n!{3Z`?pMWyXlE9&{!IfHiJC=1{cm*~&N{@h4 zKLPD=0Z?R#-3N9Rq57r;;wHeOA9=;9hDn zgh+3%Ta+~HizNDhlNCx-Lz;j<)%(}}(O}vEvAMGo#+WW6dla~a11zKqkD3_xcs7(K zyCEoR+xg=^WmP$O;{Fxz+x~Z;+B^O%J@Iw`>%8$Mv+02B?1kw4eEOFTpNp2ndBcZJ z^idx|7es=-v^%m0>(#crf*ybz6k)-J5a~1ajI;xX0H+{GG7C2xk!bLA4@ErL zXs9|+8@P@f^Evbf2C7q9r3`eR7%2xWan(Fs$BP#kZ`(ccIO$xAF;A{MZ9vh})7{zk zwvM}9%`-J%trKAA$iRm`*BuQ3rsR>DeZcBIF!3S^6M3A-k#H^OuV+wB0{(U?vOM#a zE;Gf|YZ_X!KH98*UUH%?$R z>(q)uz{frGzL2AsB$Yd<*c>GS+@AkI+-f_7aUO$KHahYEwlR?}GZZoUFavRKzKRH2 zm!d&hY0JaJT$r5jvW_{ywl%4V>}m+HBYBV>(nd*}ztyYkHL%H}ej@QVs9Xs%n1Np{ zUPPRroMDuOLN78=*yGXI{mDS{y~io&Mz+|-f?T1DOjubKI=pgRcs;!cU|`)2kpEt| zuFxk9OxS533-f@l2?gwngg@{ojpbPgJ;mV&Z|_{Vry08p%l^n=FHo$p zKoQ0#4dd>s?dpqUCWZ2UZTWdHkD0@2p7O+jdy*fOl=5wz4qNg;s92BWP-t2U#7YU} z*yNNX`qL6|&V5w2=_u|PpI)z}DC0Z7kB!@nuG>BLylkcwEf`p!0qEZzcEbpR8=c5D zEydY4ac3=}B{g|V%^}(E=sH)Um+5S7(P&mL{5)+-NPBkOR}K@J`HD>WLWUfQ`4vuE zlGets{xV)n0ZZfSN|Qclhwz&E$n$huC_us+OQqr4qPX$vN+Js?2J)PC)*iQ(n5N7e zj7=2FVFA%rJtVMIFMvf`Dl1jECu5{ixN*bduH4*S-hvU_>!aTbb(2pquyIne2JtM)=DNUyCjdT4}-O9 zpI;}1Jyu72G_M{{o@D`{C-#>f+#u#84AR?02o8JM!GUIBYhpAK~foGrU|Iu`nQE@HJb|4TuIDz2q9w4~8 zyGxMZ7Tn$4-Q9g~2n2U`3vPqEzRAt^ehq8QV$SLA>aMC?dskZ#9A#5m)&;voKgb9? z0?>@;A?;3t)_nRztRivqaCQ<=cQG(T7HEl5mt^{cjD>z#{Dco()@mE)Xxp%H%pay# zDa%fZn7p}}OGGxBrvkrb><4Hl@JFrx-3jgor1%W%5VGtM%Z0E??B=Fr|q${pYnRIQV?(F7giUQ#eHW-v=;H&Ldgc|cL z(oG2?k_hgt8$Ga&flUJZjR6awJk!@Z_h^X2s8UK&8f<@ZsFJPO!n-)wpi=!m`m{o7 zR*k*}zrTh}C1%n4@F|_2elDci3-F!{kDQ_XJG0XNo7pLEuY#*z<1+Kc%tc5&F#(4D z63+D5OcPw_ZC`r?>^5+?(qNZn>4* zdUBbXIFe2xUG**YuqQz1Y!li8L9m0z_B%Y<=@ioR;tIU;4fi();xolx*H(nVljRG+ zyr~O*55QL1v|njIOxzs=LFV3vpkeB`rg%DX|9s+)CHtw#L`3KCPzJACwO0+oU7Z3R zhcIW_`6(pDFr8NfplrWv$54}5d=O;V{1QDixX8~~IPF8Mt0XX{`E*x=7j!9w2ms{r z*7|~ z$F4}lM5U2_3Pmp~v_yp2L_8YkJ>f4dMXCBRG5z7DD(y!3=hNpzL~P*kPeT4P7RZLb zvF)Q{v1CmksiObc6UG!=L1?CQvEkkW(Y1X(8A^X58j2#;j&Z1GSki(W6j##c`zl5u z5ce?Ecf3OH_9kd1hLNjlYU&(_um}mAmx@9SDtescaF~%h*;$c;>$GC?kxG-3gYoD$ zKG5H#pF;iTcLi2lhuMOU9MjGCa)x9Q^!L9Q%bF)?yQzWvsS}MX>sP|{+)lP4d3{%- z;||I3juLGhUD!jJ+O^&6H=odGaswoLm~IhzsHb?^ul&qFI8!4bOw}v(W>lEy1K8=s zVR9wtIOrHC&j;hI^9+?@M=;l?8Cr=i1JPw~6@R!mDdR2b zZfE3y{1*Ta70vu{kb>n1b4;k1HJ5^bBk%KI+UQhzazKy{3Zz5DF~Q11BKhdhKWEJ| zKfLLc+B8Z8$xPw?Cge^g(}c^hL1YCILVo|2Wp0D{b?FxUkpx-A#(Zreuv4M?L;b@H z(PZ=0JoUS&L{qvBsw zd?E8c7**baS0g7{jmt{*8c0tRnHDN(HUke!f>wtih9meWFm1>uqa*yKnf{9~I18Yc zG_lNJWqnrF1ue?EXmWm5r*lS2<`5lM%4tnS{ym?q#p9zb0C5SO3-_jEx09msWTwYewY>Jmc8a*+uj$-8zsjE?9yGpM2bp^O z`@WISY@9AXKvFyYv)Rd3-xY!y0e%tC6qeNGAd zlbQ7+F4Lr=^1A)ZUn-Mg)x5ouoG;W_c4|A!G_S+Ey{g<6Duz>Ymmta|lCB+1Tlget zH!FQ9+j{xn3U5>tzrk@f#V%ye@iixGy{KCrVh|Gow5&P#V%{P@xf*m~@%~h-FiT@q z;?jo3FLqtciiD2pQ0Z_|MM4L+>{gr+gZ{lA4So764wpP7*o<$UuC^bGesZ zbsJuoC~t+otsVDeffW~xMMRDs6Y1x5{ewQ8`RSJ{gY_@*>H3BqRMi2agjHvM7Ca5D zH&NMEq>=%M0fc_iliKZ|Gd%nJg{@?5 z_&&$F`p~D*g`CV=-?E_oP4Ca&pE3e7O#+kBY?{;d-HKOv1_MubM7}k6aKITjCoF#J z0YxdQH#xO^NRZKc(O%WhJli4{gHRajiy)Z4%qe4B7%2@-a6F4OO-+g>`3a(GkbdMa zj?_}UDPOf2nYe31%P&m9J$iFH_q4vI21xeS?8ExYKU5Y9d$a6Kb}C$E>m(OQd7ft z^YkR;^Li^)V*XPKS~5ajBdqwwFxsVb!bg)k)dumi_20pZAD~+&pdLKUEYD{*EwhSq6VU1($ zU?FdCM1bB*C#}|)RL(B3GfDOP`)k5!qm&u9tbNx*jJ)Eof7;Q{)~QXO_lVGr`QIQZ zvUB4D+;tmumH}DzCG2iTS^3n!d}tButUyhKW=p}ci5uug`Xu*FH208V!eThOBub@Z z&Wn-O@<;SR)nH;qhM-IN8&{{e=e}_7e1!GFd-yfrZLVspFv?RPgV5`p3&X8rmf9Hm zWYcG_0Z2vIWy!kffH=sRpO$+c$a_3ItmiHjFIlH`P=!Srjhy;aHuY^Y{wz0bG!@6@ zg)JcjL^b=PoD9&C2&vJHH%NQ1o2HMYO_-MWKGbx-7cVY;=8~n@uc9{?eNK6rH2k=& zKCAYFq7cS(@}dRQsZI6_%x2d@^{`Cvs0L}^^gfuFFvMcccCH6zt(akjsWFiaKM`wj zJb3hO4~$wNqH;qAw_l^x=pBm=VUT5xoA(Ovsq2`)41n;lMk+53V+~8e{c#aA(Z7ha z%3-+Idw!x5VYWd;oqoCP{{s2X%c2qBEHU929eVOj@BPf{esc$7ujc6#>BYmEB1Q}{GGvi1@^>~11+(VjVi1!cPmguqMW)ZFMVtU~Pt^`FTkkAJOU+?SxrMZ5M_){$C|3Vu*{j7Yy zv?EVv^l@_*$403~rdAeD;oQ>kh zC_<->-d~t>aZ%mf%`NZxNG5@~U&E~6V=yMcyW!kYXNOaSb{V06`4#aEVC7ORZ81MV zi+dHDO4=SUU~&n>wWYi17k~gqXa?9fBbAda=+g-8SHDf-ipMsw!OKuLkR_S}2V=rh$Pj88A`ne8Y4;HimRCOj0`J5ODSyX1wQ)iE;Nt+c2Nl>7EtUVDpv^Pano+8JGg^;Oj>j zMn=ZVb5Fima5GFSlsbM`8&Q|)qPA|8+{3m?5R7i9HHU}Fy6Y;xXd)0RW_6}R>flSx z(G)^e8PSP$#O80RdNr6q0AiogBjC>OFA(qxx$u>0O;eBwRkqJFZ`M5jdb!58J@e@G zHEUyI0}RXu*ffKWWRCg`ot)4PevO0A?3FgDJ9yXe5o(h$ z;Ve)3%~0g>VRw?O@gbcb=1P@CXho3QZ;j@-WsNF@svfQE7<1?ZomX`#krL$AEj9;} z9IC(ES3IupMvuzV{|S8WaqketAchFA*Puo6?J`IoT2-e z4)29M@jqG$B!z~HWSr+}tpL3=H4I|$p65msJUDE+#S;*pvt4XJ?h$X{>%B-8mAwrjehTL@Qdn+{c*(A2G$S}TXH=p%b7Z|hn zbq@6(jKrVV8Ma)PW@lGmjF->b0hBo1a%VIB+k=hchx3-#s;FrcmexI~}F&gGhTulZl2w^*F!t;KWV!~i=igEQQN74UP9Q>rY5q&<}ZUL z@UXfkJxiaQ4V$3+yx5}!lA3)5pMl_=sVo3h5dyZ#+1*M4|1085mqb2r)(bd9`Y%(- z4)%ch_E;GGd*JuuS*ycO!9r!=h7lTS+U{e}dL08wlf&@M6X#Wzp~-u`EDV_y|9#kSJzU)m)ocK1k)wtlX_U8dn|hk)K>bWh+83e>zjVQUsS; ze!qCY4tZz@phOk8!UnckYYrC7`|WEcF)O{$Bzab0poj<(7dhxD8-(xxXIYqWSd5oS zcSczfS6d|7=`2IllU7!Z!lPU%-n)$VF)R8e?PH+({KlwsR>8+23p&n^J%8#fN(}+B z`-~$-E9CH@Z$NH^fyo#T;b+jSJkJR$c$y4!{=-2oiVlZ0m7TpHd|0GKISCy`V0OCo z&CqK1esI6NV0=lB*S3x zR6feHT^H|yItWVfF_Et_R{i4ehI`O-b#a#AgVRC{>7<9pbLh{3HmiKq^&5%jwL?=@ z_?knv8lihZ;b4{{C=8TnQ%pTI%S6etllg&u#hfNsvjQ0;G5?Y5x}Tn!!Q!)L)G`+4 zuc+H8f)AH5l{D4oC7RDl@UW)ew~w3mv6!ho`%WghuZn|B;lbvt8?+ClCapEBn}<5(->Xh(gvxQrfmy(NhWyASVzI)sgml&a%RAq7Tr=Zu6iD5 zF=Nt2+gu5J4ejWu+I9qEV9C9{rf8vFS+N~WJi87*b1=zOn;Y+UFLgxhm(Xd68%vql zLriIRIUt||jj*8uErwdr{AtslR)9$$G!`EnMHCQxWs4}1TKJBWdll8U{3R4acH^<# zK~l>--f}z1=gO?3AExKwGxTa;Qc*yYpR?1Ac_L&l@&Xl&XQHaIY)|cvpi8z%>oTUl zU}`que}R@Kr#^iqEP8L#b#Bp zQt*0XTV-BkKRd;64CU|)U4cLg!uZuN21};(WQCh_Dk{Z8(`=H^E=yJE&z8n9xyN5> zO1$giykOT@{Q70O=Sr{9$StN>j;#NF!yE={JoG)}+)`IxlER{r>W2>pXobMxa8t}; zl33!^A=zzNrqy*}PPw@yx?Xr)N;^Ds^xnW)|1s?p=eMOZ%Rq?mjCt#jUXrvchqdDx z_70P3we77-t9(=u;%uLs=9ajDtQK^$l~J3!47Q~`yI2Jn>N1Q+2_cERlv20qr1Q?X zKKcvn0RQtQfNug<+<48U!_+6$lLZ`DU2Z$uG_m8LgM3LHV2KMf^4i{lJN39}~$a}KR+v^au{=#&VJ$$kLyWBcW zNnE9%OGP?cT&vJ=re=309lqeOp+$SUrp97lqMuTsxdx@wIK7uzir|<9@bcroZOnvt zLOa}R!Qb?BhVECgIHCBFR|X67XcC8SmliPFs)Q2-hpu+wMLJ4S+Zc-u)u$S;tww!T zgmfIDu`g<1R^+b`{(+eIL|rqyP+{TnNmA{YwWw6r5MqV!?b3{SSU>+I!X@Uv_Y}?%Z9F{?4jQA-wbx0muLqqQH2yB73XRI1dgh3mr2;2}P zkKL0N3MPj~-B$O>-^~}?OBfH6?nj_qBzA%pS*lRipnwi9XZ<8@?;TF`f}+*(g=LIP zOxk?Jh@`fRn~$`zyvS@pWP)D9hsnw?B$wrRM4=ymJc3$=gl!)tK zvS}3fplyBan8T%~{!KkhFII^*0+@Puf6C{R10FiS?BDwH;U^(`z{AoX${x)k@>3B- z!kxkTU+`0*D?OEBC@dgLy~vA5GHFWVzD1a`T824xC|o_CLSbY=Wef4?cWS5PX(=a) z#)U3ma_JZOD$xFE3MqDs&h_0&WuMceN~rnOfuV=`9T7cDv0WSfZil1k_8J~mZ+XL? zpf_gehP(2M+$t^&5oExSg^ul%ve|sH#;OrUGj35nPNZPnv^_U`a zh62g{!w_)3Ks|J8N$|1P`EIeh+M5b0PLZ1A*65`b%Rk48vq_Dw@EP+B^Pq&HwIZ%| zy<`OA%hPp(#CLPWQCkq6$AMm3r#l8dN(1LwJ%Kx(J__ywtVA&Y4}#$-Y7-U%WhV~f z(sJgx$@v&Xa0H8%?6+67(SlYMl^ql%^2!{lciK> zx<}DUe&W@$R{EFcoell!OK1RqiR`~J)dMjUwT89ffM{FQ>!@c?A1B9^|KcG&6~l}v z$*6G@iYBET*16IUHU+zk*eFJS4KQK>xhI?i7SIbXZY!GmK~QQ*ETU0KOCS(4?fA(b zHh@gs#~2=`bCOnm?VT&9BUZ37>UmJr2Ik6lzB{A~J4 zs_aS6j1rIZTtOLWG2En8hBO$`d>Z#X*6=>NuWAT*St%uBiS11%pY_= zfmhq_zpCIbWJB53S~fVHO~McCFoG@3o)Q%&ua~E4PYos{2~hiBh%!@}h@w+!0%59Z z9Evb4gSbc8Y{3(MZncBR88O^(4zhGt7RvIB2z%_idFM*JQWS3W9L3RtXJhH z_AIsN{Sln38fCr*q79muuge_FZ=&9B;u^~JJpL64Yf1(9Ub;;E4PVE*>7}-A$NK3G zF-tn6c~C4~WlB2;Vb`AU1t6FSE_rFSjy7qooi(9TpRgTT@6971D?W?-z?o8e%;m2r zD!swCgb(xmV?18F=YJ%z+1)qMOV+s-9dy*^i)`{P?6lf@bvn zKDUZ#j&FD-`CbKU)na~9M^UA8M>*C~zbYRH6D0E+&WB1kX1=7YtL)+KNQVQ`%$ub7 z#dKjKC-b86hl$sQ|KP$@OX#}V;bM6+G0KXccc}Zq3wMQ}2d<=f@zHJN-lMnv>)EZJ zy9_F<8VZ|GT^Mm8@3f<&tA)@#P51qBqUc54Fzmws0M9V ztKY{*zSA;5fk$zn{V#r4%2naBf+nk!<(jQq$hbwo`2h~k@^6IqG|^vbsy6hNtJeua zB}5G}F~F`OG^L%~OV+JSKmIX)g7Q}Gdu@$psW#uCq)+<8N$%zsP#5+7A5UrwK{i74 zz{VyjD*L^$byXfQLWEGAl{NAyi_f0iD6h|)e$XNlu)X&+C=Ag`$dmeVPBoEA8nzz| zx~>sBSA-|OG2r``dIU_`9A0e{SZS=F)Yc5s$#c0 zpSyL0qo5$FHDwes;03}nWAae>jqVklx1_nGnr=?GL5p;7(h7J3W6}oRm zj>tj&HBM>VPIsUaV9nQB@dX)OlWHV5%VLjtA+F!otWuoRd}!5K%bj!g#wWOEQo5dP z;qKAsTKj}6l>`?UuNR~e*qlMrk|s{Q14n8(MTQLo4pz{O)zr_HbwuegB_4+f?anQ? zT~>K0<&l?;uQl}5OZ3mt{`9siHn|mpXVj`+nx!3|k46jjHKysQG@FTnHDt*bM~<(e z8FWnQcuIdwk{aJ%0RZ}9gQ}eTfWIMv!Ds#@<2x=GIse^8+Uk#=b|yV9-chD$Ey+kpOanKxWk^^*1XE>hd3uPC5XD;Nq`!0}K3{L% z(yU;WH)m{_ONXp*io1RCpylL~*6cRfT*&WOHT085zlEAqE73wcz^;uwKR zPEpTNi)w<)Mpd%O^#g&3xJXm3oZ8oWOaq0N?S(92v})_xCBL5RZa%Y68-O*Gz;E0P<@hO_rOG@I()nn>_2KuY}YQR?yM_?l77al!KCJ{d&-yPIZfuFr^jS_!C0)Al~jy?r& zeFT5~oZ8h6kcX!O+YG?h76Sd6&AU4PdyJ|6F#ERG(f3yX06PQqndR?K`P%;v$^!HT zn(nYl1y&hF?>A!&li_zIZ<`?|szIKDe)&%hvL+ujG`1z{**jzp!E7kzE<*e!S{8S( z(7UZ)KV4(0%JQkvaa{nkf0W0-p6WBss+-->$ytT^fvp_=Up*s+u$~`zzL|7wQu*xWxuNzc2H> zmrkxo*oG>eVB>v1_oC-R1c%P2q{o|Av>N|@o*$~?QQU;S_GSU-WPvWxX-!{4D!tuh z@iQE_mSS4HY09t~ug6XV@Wfnqzx{wLroe><$H%|j@X?+DJHk{4010qq=)1>I!sg$# zJ$$T)V1xZHmH}+`HNc}MZ$D)vrNt{1;~j6u7nq-Ocy4WTKl6;#FV+Oj?-yQZwA;ui z;FHb?ZAm`#kEqE8c&(fUoWMam5>6W_SYGcGcj5wFZW3jTI*E(H(YUYMRy7 zbV%Pg6u+Sl04A=({$Hi1^a2n7UvkATY7vn;T)PNTN=j8ouo#GC|T$ z-^Cs4rh(ZW(CIrP8~_1E@Kfq*{g+M{vd=rAeo?uG6dw~;@X4>F1MgarCJ#e}SpmON zV%MkwJpRX;0iev&!z}=PR9EQ1qp^2t2byWfYM)K|%cn@C8yRT)4YU9k4V>&7tJ36e z-J54(NB}zyrF2jLo55d{AK-}~9{B1)1Jzcj%UR4dH8T>jM>BQXNIm()oYd$-EA#jN z0RWAH3j}xofX%<%U>f%q!M~tfF!JJRQ7l8IsYX61db*ivR|^0`61RIMS-ybGRkcyw z{0O4iG$EkHA{bp-6z#%Qo%myf)6wpR?y>Of9f(TM+#~U61^^&+FvetC+>j34LHw1q zYdf(OE!l23ViXQKg#q}|)L+ux^4>*Av6B3IXdch1qan4bD-f-^jsbZ&KJgIl&q@+Q z5^5{s=F9UXn%YEjare@=^g$gK6z;#52mFc=3y%%lVha5`;w_k~NTF?zD!Nh6aSbpg z{8fC7{PEY4(tDR~bQ4QuZK$MuVM z_pRgkLW~`4YTYPK;i%-9yct7!I+4ogo_vgxY*H%qEzH&AS&HGZ*6Ml2FUGZ*Pde?` zd#cGEr}fm&v@`fcbJcs+oEAFA`?fyWym_?tz9TSxo{rk$5r0|Dflahul$S=Q{4vCR z0caO!iVlp@NdfaRgsT|c8@oFWyryYE^2X;YIUrt+FZB3`1j<*#x?SUUEVSMhwmFsA z1Wmjz*4diyCHXEG*Bty+0AFT5$Zcgj?;?!K*8EbWhlP)R^fSrb%(;-3l}(pm*v5K} z7({A?ytuukID?KcInndpj)!|=Z{Nk8h#XSdzZW$`tQrRHKE0`WC;p_j@(n2CaFceJ z1Qe6SJ})4XNVDMu{akHZsq)#pSdS!nd6c|G0z7oyoQ{5pxdl8ZHhQvmIm^_uJFIIs zI9MSe(OU;w9((}skh&_JLolR%V*T8G?&Vg^Hnu|h1JpFjLXUxL5YzNswF(rnhYJI} zt~-M@$jb$R*!$XVrV!1`b&3g?Z{*%9=grr7qy;Wk5q?T`(dbeJCmYSc6po6erWJf! zS?h)D(FOCE?Ui(GYqhue*@gFond&5mf{x#f&np41kp_t1&=4+{@dM_O<}})E3TC>Q2hGk$_08Zwnz7NwQ2{)`HD~9wr+xhN6<&IW>ia z`KW46j;!`Gk~i&Ry7xP8%lYsaq{S+gS9S5co2{mRRZ*w#k_Lei9|ai(NT(?da+G<~ zOR$A-b^&>2d-kRLUM`+7LsL4d=<0*gpBF|7mA&EqW+6JX?t?w=eLkVZ7!2)&e%_Jto3cs-@jCKC%w2V z@S1XNRP0rZ;CGk*G!aeoT#ak2sO)^Oc=hI+iWdJwN^P?DCbsQLUR|L;iuCFIhj44Z z$j*hE4?^8reO+2?6ML7uZ!8+WYhifxG-_E0ci9b$}?8{;+a4-AF6*!P!jU z8V{#-=)K3&orf>vHo>=dqnW76*sCf69UFukB~P0oBs|#)eQj5iUj%{zr7O;Mycpt= z@f?fujcj>#vbj|KE*lajiUk~cR{GgaZk6)rki2xCv@`6Ey*waiqUi2MTD%OBh1Ik( z`E;@3X^H37lwS-oMZ99}eRw{tg+-F4P}9s#t$dTAs>e&bm_p7~$|~kg127XUG`3xT;lC$<9>bT%;jXn3=(LND46*Gt5T#4`+Z82)LN1iW_y;_@z3--8%hR5rv_(73};NNEEqq zWzS0f$Ns^^vK)X_i?-3q+@K2YB?sy4Z2$X)&j>MyIlGVet}a9)+$V)>17r99xc~(Z zjz-G}_ne4vqT569QR;ly_v_=G;r5lb@|m1?aBdg}n6E1H13R?6W27;(fLv55lcR$R zt>(ivxJCU|N-PQ#wp`y97^5(AlKi=s)RfttL+)7pewEoZOnT z?x{=ORn8roSJ_@{5+HGDjNd-~tRT)mH=WJo-Ys)DPkUEuf5bz|&=|Vh0zMxpH^{#k zVrLWFwl7RJkF|?ugGOm1Z1)iOJ2F}x)+8zh2O=7(bVnCjI664{yJtt3pVZv$YpQgj zy67x5-?ZK=?|CCXYt5Etm0iM?BptV!P++cx|EyfMorw9fXK;FC#`$AL9i?W7i)QDpyr|peK63?_!Cuvo_y z$#4R7aIiXyzQ*^OLSy&7l5SrZfCvSXC&ei~kAOnY!&C(U-6u#<4i~pDKJK6tmUPW%OUZq6oCqh-6!Zgnd%)b8k@*O25 zxXUuy@}}^{a^w!(fY;4V`{kiG{sHq%Ybj@6qpf;Yis9-SwPaC3&Cw|Z!P45C+gk4< zaok#!z}u0JB#KaAN5sqTOo@>&V}{15in*IWmS*_rqtTy7oA-B|TeKSRW-DT6^cUe=rU zeG(5`nq}=^^;`Af&k+8Zp&N(8uEp%gCZo}~{!UV5hW2P~*DVFWudF$bG^U<=qdZ22 zSqZR^>a$aiY*wfGFWs6#Idcfu8;q56{ChVOUnA@IX6F~@wx>A-I3@Ec%Gg4<1HJNq&wZ;P@J$_s*UaZUU(?kHqK>&(TKhzGBkquT3b}EtTRmr1dO2k!RacXzw#k~; zx>l*BrekoR_B;859?lsfBjz)~a7u%&<~)0@e9n$qa9|Lzd!sDWg{=8ll!%Nk7AsSVMycGz98N1Kdt=q|7^ybZQ7t((#H zsacOy<$aS2-}JAZGmgcl!w$8$-HC>y-9Jw7=J!#xNI7;N?0t(LZiQj4r zgi^48uJn}#(9VJYRtMaFHGcsyV$aE94C1iQGY*--N(?QN>bI7Qa6K`s4S8Yfw$s2x zVprA@&xHKk+C-`uDGf;qT64{sC93QBlPXrKY+1^%X+!2sL2@qpP;53O-@Q^V*U#I^a|V?Bs_ujhL>Gw#>s$ZP z;sr#S%6eBIhh-j7)`Uf%MY^8!GIq7=$wdhR1r5v{#*!-odd3)>>x z#x6ov_{`Gu?DDsFsO^(^QXg#eJdw1l+J~nl`$Jj#`5kRa+&Eayfmv5;qPL1xH)id; zIw>utEipv3DISzthxVK9n*29rrh*DUFuv zMRXql&C>jFY!Rm5JmdZ!^c$nADbY01&cReL zx)KD-2u*Kut>Cxo%ni$$hez%j>5mxTLH-PcC#~|F=kX34und2h@_(pI4QSXW&ajhdn$f^K^dnLPDSdsOL$)j5t5osyQ zjQ!OpjVkLC;yG(eX%u2&v@jc%1~1wOIw{e{u6s+j(!MET#PJDNAzWP3h+uHucK^>J zYI}HvpqjTBb0X=IP(%!aLg~nV2c)ki&Cn}VG_KGq@min7lT_~O=*cSxn2Gjb?TM^o z&km2nC!!R<*~9?z2F*^wsT()%8r6lyuGdtTR_Y1Pj+B4B-jpk6*;%K>NpQWmt{-50q@_!$S4$t*)(RGURc1m zwp#rNh_XTQzW>VD28AuchuY!Pcsr=4=gIAd)X;1k-zw>iIz8#}+bZC&z^zeN9~r32 z8wgx2>JXmMGf!+qGEccS-79PFa}k~8(Iv-bud+<-gCCy*+J;t_azW*tU8RTizT6=o ziUjVr+HYzf*+{9|X~Q#h)~M)M(Z2F&KL>QIiIXXRnRAw|%M_e}(bEJAp8hH7yb*Z^ zUhP#goO-46YSHB4hr42CQJ{VVuS>~-)wWdd#~;)JttbHH)R?_p)Ok{qsL!bN z4wg+HTfOT8=2dmao~YJDA>sz`s^|ne3|f>Fy4vZ!BkX;^PGR|x_FR;RG)lVQ z4Bp{H|ElUJZDD02t$|dU8Se}he7(Dln1Uj|FvhMr0oh?gTs^wrIr=fLAh+Q%Q!m#o zGst5J|lqG5Hv!tBIQVZyfNCG~B2oP*^<}+%0mFXDRU+c`Z^aqj%(5{B*@_{idy6l-3HL zD&ec0XGT~wTRz@XU%DW?pYnPhTJE77N=vsYDSr>2s7Q!RN;6L{-uK>6ULHj0xQ_^c z@GV$uSdbQ6CFO&V!2WG4GYUkpQd}eSk0F2ZHl|3lY#ZN2_ z$*@mUkx_R2eyKOsC4=ZX7B6IO`~o6I2Xt$ik}I>a`jHfMB*4|<#Gc}&`QKW($9Lyp zFKf9R`EQ*ku`)QQ?7{+YzmSV-E^jaXg9Nu=>h1 z!`Ne?e}_EY=2>cC)i-MXaWs`}kW%MdE=*f560aR*NB-6xXu0|`Oo7uYwXYd#?iXaf z!RrFQYS+RbTB zOOC#DH_epPF0jyf>aJDdGHhkGV${6z&}&URUtHVFRyEep|1hc*(vSr`ZP-gLftXcR zk2pTj$a;irH|ot~ivR-ftMlLDg#66ObFijCt;DW`jl(vK!!}s4*b8WKY~MI^2DkHf zFE{~7E&f#l<1R19XB`y!DkMYlLN?pzvX+Rr;2-$=hO6ZyQu8^{&*YKRXNsZyXclXa z!Y1A%IX9)Gkrp#I%35FgS_QMWQ5bR(A9q+Bn{d1Ff;uw4RRwEZ*;FKCcQ9K&HLa>- zY00opb^11r_vyxy@?aJ$lMAEJ?`Bx~s%ZBcV>?#nFR63*J#1AB?<;oQ=2J&Rjo=3L zFKzxUZ}3L(aHGpZ*d9z1< zg@$9s9T~+uKcJ@dw5dQgJ*-=2%jxcUYvq*zm#&Z(qY^gBJ$(N=bpnUUlxtn>y!~y# z%;sv2rxv{<5GZS7a}!MCjoNtYn0+4P)~%6)K=ntBcg^YF@Tt|tUltUIYh8sqi;6DZ zBzXYJ?$MhNX$!?wot#o*yn+ON!Twr`Ec7HgUgWCXnKMT@K$kAJv0M)jsgJ zt>aFm9`K)nD3UKxZuE8q)8t3@guqYN`&%-d0zp<>OYArM8^&qdoWzQuC7sAr{nY@Ko;V zc)*7O1xuNs$ez;Oe|h1G6SKz0+Rp)}(x(%V)9>CMSKCoeK!QkK0R`&XO!zvAK~7i; z6K|7Z(y$=+zq$wTZ5k>HWP2!aX=8>uPixgkGX!g#Boy zMp<8M-CsJkZd5dQslXVO&+^n&OSwgqstu{uo$|UQ-d~;pTOYsA#u5MfBl7D3|GT|S zO11jaL(9zItylwQiPg8P&~Y&PrF{np_n- z$_Hw8c5OU(S`&IO&O7jO>U!4Qm&53JnkRtF?yKzE$B&F#X9kb>Z_N=zNSi{uC+$K! zCEHX%%qiYELn*5txfUOt;Rf*EkK!Fx@wnwRwM}y{6uCJWU*)UGq>VCAeg`gV{sQam zH@{}(L;8n;_eVc8rLC>4BiNSp!6K-)ewhP@aLVshNfklz2P=vLAtzAm*3Ym`8A=oVHhNiWk!GPgab@R9X-c#hD8LJoKgPGd zr21a6xo;omkRjniKO(YlKyJY}Y*Eia&N88v!Wwscw_YQp=p?BGlbr`-jH{HbwJmo> z2eG3cDcPj01bZG8^A z-=DjWHs9Zx8-AjYSO)FqMzRD`WFPKAj@nu~TE*;0)rfT2PGksM7 zI!fz#v>M&u%F~0dX_f;kt=Z|HkXO~`e%Ex{&UJOvpE*4#wlPE>O=D>ttR_uV4B@H; z_IY;_>WWzF>Lo;N@@E}k?sD(*LJCrKEauP;&~?=FhG)!EaY5w+zfOXq>0+?7`D+%q zp-Wuo)UA8b$?X?RlA4;DzA;Bm{ll-a3@O8V6G{yml3u~E%ALr|dOQt_CHy&Tnr(8Z zjE$_r>HV6SrE?=IqKqG654r3ed0-J%{;*|PhFm=hkVpQ?DciBA)~PCUrTIMk z`7*%d4*erP_NQdjN|;`E46jKx{E(g8Z?AEBIK@Glst`E@Uqc``YUYlwl`1xFEtk$J zBAVvj;K($y^vH(Ht+ZWsMqLSvgpwLh zpGsM+Yf#UR;O&DFN;!|8{>iNMJ$k>tqitmN9Di@Qawb`xz55P}unrMkdUS_KtF_VG zQ{IgG7;BcPg+n_bCQjhYC~1$$t%ycil2j=}5*+#i4V4gmEb1KWvBs}uu1~SDzlrw$ z6{ppd_6edhT@(Un$+)e4N1l0eYGNt|<{&Kl9}y3F+jL%P97sjA9+I zyd8u;vqdLlCwh?V799ul`qxSY4GNFA?`dRzbyk1w_11;t2RAv$4=vMhEF6IaU}H;q zedB(d;+b;Y=Kj~rBD7Q!8CA1Jr+#7Pc`)g%qjPq36?}v{zzd|j5$EqxkYH!`afam3 z)iE~}X~|2K=?n(K{jJmS2aq2BZfTL|qs2cJk|ZK=Y+nb9jIxS{r@p39X*A2OGX^m) zm;MO&d)Cta^By89G=!m<;G`_W&f8PxXmSQCS9%XY-YzMV{v8RUX z=R3cfOwc2K|H_|G^H(nhEU5|@YouuYwq_ZJ^qiWw}6WBecp!w>Dr}1 zBo?Hk8)<2zQR(h3rBhf+LP|QNl@M6Eq`SMjyBpqzkKf<_yyraUa25`G$ILVL%r!ID z4N7|sS-w;b)asXn7v}=oWQ~8?1vyXLkp`;C&^Jmz95guaiZ1E;9G1>4Gq;9zY z{@ZWlf1DxjBrK}pff!nNacSrIc$u4{s9UhpZ1|2Z)W$#}!2t2+ZXZgft7=M&ziAPB zF;2V#FF}gD>`9!JK`e>JZYHvM@4m<9XjLXFc>+dI!($()_}uc$kOXvr0^B>6$zFBR zdskgpui@dAyGDLiKlS`ecNbBrbq~hdoyi|P^ELrz+tv^%PA;4q1hqEuOjN=|eBT~T zI4JC|OMv3w+{lNJ)44subpwEKWqNJqE>r~{#J_~I)KSDlF>jwA^@n{KR$(Dil9Y%Q z3I-^&H18Av{{f)j0Tj7kLaKjvCNgV*L&#GA3E*qNtlL)jPY!JKp0vAN-}U68n22>= zh3s|xD48PtkLjvMLA5wH$tKS$B=Xz6RqZlsVu;tv&@Br|2YBVVCf9kz!SSUb2WyNF z6(ovGitGW@VITNyP^p(NCv`(`s7G_y)V$(kCzt18;;Ih>cY}{}Jd{+w%(dmUV&Sqb zV{Sv5)2d4apqVkh^P*1d+h_6@<*{CkhKO8zj8US)NbZ~ZRY1i8kCPp);`KOv1l( z|1slupYK!B_>gl|Ev})dE0{jl*|bGif+|s0&iN1RnV1nSykGStS?qgyJijSpR77TkT0*nmqN9c>AwDlI$X!7l4ObI)&3fv z(GlRbJ6f4nSMMrL``;BiKy(bTu(2K3P6ZH`)5dK8Qo zYW|xxB{%zWY|=^V*p;aSa7g|Dmqlgxsosl5@Ts*l)vI7j!+WVXl=R6kxdW(mwL2{?5bhbJk&^Mq%j41& zwnVU1n1sRQUL&*1$Yny|s9#7T!aa~M!69x3th*rgD?(cOdu3zW;U-uj)I_&M$Lvyh z74VW6=qa(=7qqxqlO-k0h8(vfpVv49|Bs{TWq*5T6noHMK4)W7!?107k5<-<7O(q- zZ~wk7d!VKDA0G#HO8-b|61jD&koXV1o@$E+`NdX>vtTCi2^zkjZLIPT z@s?PL+W36D-zBWUzQ(+fn1)3@!rZ0#5kFGs*#y50`w;q;K>1Q8w$-q*QM zlSvT3O!Ca3GRBZsobma$&+$Icb9C+gKb!bh!X&Xr-cIc1^cIL6bpxCof%fZh zAdi?GiDkXLzbz6Xh_IlI7dV0R?HjFub~fePRZd@d7vRZyuf3QLt{Zs zq`{E`7(KWYo}E!A;jtYqN!R}hasFreX^LC~Ze%y~eIF#N-ScL&aBnEBJMPfb;PV2O zXgC~O-?xzADbo`XQ+Im-Bi$RMKS-YUe?v)|>dq!R@aTD<#ldBi2wL#RZyUK#y{=FL zxWxdDmd1vL(G7q-f-<@N`H*G94GP(JC0dnzuIF1Oac^Co`4at-R9g`8)CkVP0w!L)s?H$C6@4_xL~V2^*443jaHsZ zTCl{(7qRmJYsAl+i-q&m7HIs%P82_AdYUSeW$qf12m2(gzgnacGEw7Sz#qB`Yv+(@ zPq#_z4INXP3?XZriq2tpn_o0}vn(x*@Op7u_W$*9_SE7!UY|W))?jf(oQdApW)NB!+&Q&#x#4uArksDk!=3$E}AL% zldn^bMfrW*-d`JAi{{%GaL1tu4LRdb5H8fDYGX3-EXvfb1bf}$ayII)a6MhTrFxlRB&W`$%T{PVM{1AI_O}P^IK7Qc)8BsB zSh%@L!yGV)RWd+xW>g$jnp^_O?IZcg$DcR4t`w%>ij}MG^hBx|Y~Ym^A)gC=s*%|f zN&03UFcCbQJjo#6?kUs)+`1Fn;_!Ck(mW_vt+_I^9DhzOYp&7KS}fAo@%oj%g&L0=tx+f-C>t^>1H8hSDzGb|MfTq3n)y{tzWRXdy5 z=pLKA3mPeS?zt<5N$)x`+D1!3H4@jiYt%&$1pX-V;Cu2N{G8RPU*`Jr#TbpYRL$_y zVlhnk>{@*M=JISoanEP3kkeeheBt7jd9*Wv(Na?Lo5@X#vO{pvcbxOP;LwKw2jq^H zfzi~oeg=x^`kmLf?0|3h6JZtb4rjW)CYqBja52x>zIk^UuNn`kv)R#L(W@}^&93-W zeNcMv;XO&Hm2{Z5eEFZv$+hLUz`B$RbGK+|KFQn#GfTcp`a+_@35{|Oy}g%{=AJu` z9I`a8wKQ2v7H+B$Hsl6W_eh>};s4e+fc7>hknzD+xOyR}ddl)a^QY<+Ze(z9O*Pb! z)PJ3*j$9d6`oyrsCEE9q-K<^{p&Y%rPOY50fznj(GSoDdP2S3aM3&E-@Az0ggi`!4 z!)sA?iInxP37Kf88E@CHhC4E}<~e3@3!N0f?J~Z==rk)BOYQKsBj15L5uT z8Q=}y@BlQp$&xZ=;%3QSq{qD|o7a&J9_YT(64hf)F*H^wcLt3LLnYn;goX0r_q7$F z1y0ql`6hhqe0QysYMqN4>sagi;jt_8jtTMN@LO4tQK_akwiaP|e0mfW@%Bko*DM=1 zVVBMHb854q^hcE075gm(6Smh)YP?^yX8$zOqB0KEy0C_EiI|mFj$IwXEOBU!Aj0F1 z);E(!L&?X-DwB6<C-5GQ}Ed*EPJAI-BRsBd9Y zj`nDpAvW8n6bO3>f8+RIWBzl7xh)YuvnVmgZod2k!uuVrk-a^}#z%kw=PY!ZIKidL zq@ycr`c>F=Q`bYhhRi~+1C2uF^b`KK;Foqj_)OC0F1jG=jW3gQH*R99CwDpOHV5w* z2TAKtd_yAdaOl)_evNbIw4HI}ePDIL-`a2zzXW_rFQVJDffdaOaRMBwFjTPhbG<}M z7xM3F6ahmlQaWh=QZO8*;_uG+(=0x=<5S~ful=+jpS#b8ul=xIC{n#|fdXdfOK*-AYiKyJsBK?Cd~$CpzOCJtbtt%_(n)d{Z*0@lL5gd>AP)^bc5EzU~*boKYf6_54c$h%vYUOT3soWLIpDTeeec_Vh9C z!qZ-B_Y(8U;7*gVwAO}`bf{NLN58^uoQ_`NS{dG5;P%9D| zAI_MKyzuE}znQAIz#1Ea&}a{JfR$d^DEal<1tn7d*8--JG8vr+?9TnM-*X5uvTOEw zC*R8K#`M`eDbE)9c-8$8!LNuZwYy9j4xx`c8e@n2g{f2Z2LX-SJf!@d*1=;p`}m;J z((~JYj5mOXYSWtfH--SBt)Zx1$b+q?Kq>J&PvpevP)$E+eb&LE>t`=5<5M6@&Shz5fetNs&tK`Z z`%OM(*jV8`MgJlV=1`DN;dWsdWf^Kttl?fR;Dp_skrmQZSc``tB(zrEmN~!EX@-?y zIVCmW$Hk3psq!Tr$=UMS=Xaga^!EL(iX0;rtc=ucG$)+W{2g2j<3H*ez4Qq3ESuOp zQusuEqLE)grSa>0huMJYU}FQVHvds%38C$d|B|o2FTd9pjgjobY%iWhPVW2J{q=fF z8as@;HEvIMCTT;v-q-z-0R)>sp|4%2dvLxG14+n(TZr>|_yuf+zPjddIu?J*$5l($ zPIk%J+tktd%Pdv)vKqsrKM@NlkBVj6;`>?oAjK^_fI!W|+xwa7D8iAV-^55*tu%3I zEfU2$N0_(l(g$tn;%l>qKE zvH#$lOU0?Z9}-2$Zgqmim4nU+sL^O+7ugqsNnmcxsbjL%39Z@Nll~+!ncGfdSPbPC zi<_#)S%S8&TKZL!%^P!`Ebp6_8s~)`87+mCQuLHY$&Xw*a|wRwYd0}()PLgj zX}nx*d~!?sT&Q62)z?p(%UGAoyo^7ZUCMSMETY>}(1E>Wa0}y^No}Kpkz&w1`RATO z@506Wrx|0Ytas$-mMs_O0bjyL?C1*Jdv zeU;eb_Em&)OjFTh$Q+mPi+Ant-iDZcsqe_$9qBWH9sp`BY(BHP-SE^OJ)QyQs^E|v zu66%{|9qlehdrf`=E`fC>F%5+jbD7U+VF%(a^7=Yhn)= zsj#D((_VP@y|1@%JUn5dM5bi9d$Tqz$Qxs+Lh53cHhZKxeBS^y8}76H_<5R zqqqV*`W3vo`+hW|nEnSbz^kGWk)lNfxfEY>odW{df1$I=OT0j(wJw`}`K`0JkGd>G zb$}bL5UXyK_)+mwXWj)R%3`6C>|55A-YTuzQiBJbG77bhi3$c=LL48Iy&dWx=G!0m z!sr(U8*q8fpF?nf5{+eEAP^8QYEXGuT89WXFYZmCu{!c@COW@9oi^ld4e>NqvM}`R zYLEZ=Ji>{{=1?K41cKb zJ43mINao=(Q7KAPPpKXvFkYy}%iM^K#|3R(RJ$fz7X66Fdp>t<{k`8+&}yjrD)vv9 zU#1w^$TDW*Dx331(R0eklkrusH`WTk&NId(8Q9U&6)=qcZS>Z#9$WZ>h-2eDUE~9c z)>I3%*Q!@#pdP90TG|a1zQ4Dwyca&Z5=dRz|7))@2+WiK;{f!a00RlTSbygYl3AW* zGQeFjwu7(B9Jp3Yknug@8ycqqSK9jzPiyPQ%a+z(Zt$r!$Un$Vs2!ORf@8v3(}mJY z!@5R(d>29{bpByUHYO#bFV1iy z=pp7oV`o1)>@DV5w3?URWB8lr=dl$4d>S>Z^i-|-%7WVsI)B#LODKRy_HxOu2rp~df>T5Rqk%rY{@HQ8m-vjxz#Rj?`)X`XW#;1f zfbT)sDlPynT!GcEOpN7mtu^$ri$iJ32vtiuQiKjN*Llj(b zW#B{IV5pub`Q4dJ`E!1D^ua-HMcU<4Kn-LHMu>RvQS2PI;GDixF9}_XGZ{%j8U0H0 zU?Ds0!h_ahUFhQnO5O4G_|w{90H{o*qiCfO_%fZ9de2 zkx4T3SWc$91U>loV3g`BWVH7o7m0|TW=|XJDVBXp^OGG?6|!8Lt0dmWYT-2Ze|N{y z!)Y8{4ywF8iFe#7XMLr;SjLubi*2ifa70|s_Qo@YeB-KILT1z0flQls+_DfrJYhHQ z!k{Bp$(K$0)SUF5O$K8Siirh@gL(UpnQhFz-sM*M~V=feu{WPFhn;g zn4RC?)rf7?>q!Pk{8qp3loxu!+<9&5)+C~vEzJ^bziiF;swAD_`Iyzu!CkWX&$~hSN6ZH(-A#+L~`W4~sX3F85IR_c5_JWdKOK3haN#<*ONQdc1OU9Vv4(rO#4-{y~x{6<_=jog| zuUzS@GVD>_`JaB9PL1{_xzeNI$JGc#M+o3vD1rH~ytew0Vmg!7@+w5-`!$IA%`Z;| ziudYr)+`B^y*UepLEhPoyudhqlcMk=2wDA92#%D1Hkd1Sx^x#&wtFM@qL~Y^Qc*!x z*VNEAa-6Lv7Dmtx&1qYO@&glaw$=zj4Ib$noZ% zwh^mxda!UWI0P(G3DT*%_6y{~_RofzW{c2b)5=rSAu1dR${#!bF zns9EkYp_Cz?7WYN4|xX{-2=aF>NC4CQn0I9cq|u!VED#uxnhO@wnQoAxc-TJ-1|sy z>FkDu6dv^u2jpe^_w`@5jyZ-Bzlg= zaf!2vdr@wYUB*Niv`reL|GR-1R=A$-?E&%-25o4Rn4Kus8P?G${%4O<{?R9BwETe> z%j-Ny#TmWbXF&Ex_&Q@U`J%s8GGLHbL^}OywwN(Y&>aVqt)(x+Q0Y5Q&wjZXw_VK?KSl69aSp<6Sb1{PGma%JYCg+Re#@99Os zVyF-dXp04V_xaPh@qm-^Z2E&{2%3W&^2Xs!b=~e%z>4x_?%7OT!+CZ~_ z7&KT5N^cY~Dh?9tS2=0`1&gx-J;i%jhj?1nDc&Uw`ZA9Gz-+SM-l0OEOg~%X40&Ae zMYmQWQynSWo3Ybzf$OcRwqi|LNp!2Rb@tw!R^Bk%cm3&UY$J?qCq6N>p^x(>p}*uZ zj(4o-DzDzFClY7$+kVIU)0^0d%)e{i=hq8Ab9?VShlsnvX3t(;eG?B$D(M5VXbjwo zSrD)rs0>+fWjNfIt||{?PS<3ApF%pZE-Excs@B%lp7949&cS}!0OP>}W{h~$MT@_zLvr)Mf+DUUzXE^JQZ%8Z$gN-Guqi#2vP6Z36ax0lSDeykF z$XEV3NuS;4SF|xtFW5^Ld>P_T_Zv!ko!cDGjNuma8?#glnW&9CzV|0YrLsHQ9GXti zOsQN2SdW*LMh{n9x$d4GY|S2)9oPnHXi=vcgITn!CH8v+Y`83c4r(=Oq|<-U?;ELP z3?lo{z|10EoeNP<4#B^ytXr2<02bkh8Kzbp%zOXx+^+@!=L`kkm)Km^pME|7MU%$F zo0_#n@y)412Yv|5_WP++fiuNRiP=4hN3TEzuX zB*oxaWsR;|cM|jVej_P5%2%oRJ+F}+L0=rvV$wv7wEAm%G&$II<>xK~U+*RMN@{XP zbE$9a;pnd_Suf50P`&<>Unf9o6HoLDMJKpSN~fxxdS=WUN06eV&|Xdqqa&E-<|X;S z-X)r8odh_^$==)~)|8IjPiegBv9@rZ5B`Zw{2 zEAM*k*IskM|Hg#e)v;N=j!KX->C=%w|F90)8D$aNwfYGugqHl3xY*ErHt7BYK!tbkl zJ^y~}wh1Tf)J|1!F5SfNOIKMv3dawIa`j7xii3m4**0#P|3+Eoz^4ShII5)|8lFUE zBkN{C(q9#VFBG-E#9k2D<7;o$`Swoa#p$Q%?CATMqf#Ng5C0|@|IZA~hjJ0}EBOvp zR})R_Lj>D%(}r`#r zceO(+_Rbk=zM?}kg{91ErXJ`oU%!j~3N8;aTiJ1;Dl~(jIDZLI0fErQ#-`~3xSNdBA*bwo689IHHqmnqaDG;E%xr7xI5bE3S z!PZTQiDCc~-p!e%E=X6BYtGlKoo@Z#e|yr%GnzQ8+ba737YU2m<HKN1Dm4eQBAa(11rzzh}@h!DU*7ZXel~D$fy4u zUra&y-Qi5m*STJ0JNW*Evz8xg|DQIArK7TlDF7dJ40@KEX@woqkpD>-6|&Ba1H1nS z`p(*oor&_i?d4)%iq`sgMq3_n)(-p%u>Ak69Cb#dMJ-A=mIt4*gyuH9Az5-~Vlbc1 z|6t18-ct7K>S}H*Qb0NM;p}SiQ5eMG|Ld^2*<4MM^C$HM# z{H}Y^ebYnxDm1;eh`IF^Dp`_+VEsdX;k4i?(AYhf%4aU9G(%6s~1l}qgp zSjrjy(E*+M27^z;&xo)jIwPe1xwSV(y z)EogWH`mKLi0PnHxL(8}Sg=rPli$W#*fjFe$kBI?CvZPJxv4TW8mpL95T<56c)QM> z3FpYT%N(st_bJSGPWP^vi;>BG+v!11n1Pu;uedg@$~nR#AIo=Y%B-nWs&7kcR_nF) z`;^=yq2_dFDN)^FEYM;+JKtQD%}2v=o{Ey!ohZf^NXMwo{9 zJ(-=f_-g4y7aB@F7T;BZ_?H`u8L!(DU=Ix%R^NLX&zo|xe^1)=)+akIDl%P2m&ne= zJhA33=uDq<-yYS?e~Px6yLD$O)*Kh!{J@BtDCP#xBjufmo`rA4%%L9#WU%4@p_KBy{HJg zve%U+>Bf9mePXV!`mOGo1!j)s92yff@Y2qibe={+H}*n&`>DX0BosAVB#x06uF(8i z(4MU3TCUQrdG$-qEsX0}*@Bj8T?r1!0LRDv@9h#rGP3x|)etgD@1uadfBkNwV^qZw`YsYuN$f!(92QI?AzRp*~sat{LV(mte6geZOJ z5#HJosmHf_Dko`bCTBv!#iu}pfLeIB9ChLvQ z8%Xg({AkHcXo;*g#Zl5|lTSqL4NBLZO8+2O5TcG5U6f(-r2 z>aibU;Op$}b3A-2Vcm~7b`DeiE7Ypj7kX40%ijPuO#a+@>Pzlz;vK_3%rw=7QR-zj>C_`2wHd!c6 z%wlfXmPst{H4+Mvzv{Rp3aFbWsBojBy6a3GmkURHa`g^)_l8_LMil=n(%EEZu_?_H zQ}KZ7a3+5D_5pvY-uzQof{&7|R)M}JknvB_9^YjSzfHURuz1->c-tDI+L1UhlYX)% zHT%=~aB7HTf`^_f668-H+vZ(-yy|18X?1afKN6nHps@Q{M~PgFt$}rbi*~)QqIzz1 zrhez`w{qJAgE;+5pOAW{pTQIVR|{aa#9C$O-ptGMb4rJDY7qIu&+8_i?c~ApQ(8lySueATnWee0x5)Xq>~PAlOnP124_hTgs2@%k4eiGM^~C(>$z6_$3_l>oR(R{na1fSa=T~FfP zuZ@D4d{DPwy!`rQY`qRI3RpE~h^Xq&)S&_2gPP*FIM=eSWl0?-<>T?GAZh@bk?Hys zg(~J#@ofy?z;HR{7b{+K|}74@}Uu`F`2M^a*&3)<8uHo7ja1g`z1kdsK5FkS6;`A03i!Vc zKxkJO=M`4w!S-BH)tm}n^i;en+L%pt0q(t3K}M+Y(bt(W?VznOL0`_^Qeo0eDQR=( zV|udM5S7lHU}7DxkRd0%iwnx5q%R4XRE2&qp(K1C%J=4|@ zYp&U2_Tqsi0+&CY@qMW7Sp@E>-)a0(L_hC`S4N~nqvJu>F0-$5<&xBvrTnx{ZS!n@ zxbDnXO$iyxs}0?YR#uVrUzQH?LY0_qU+v7#pKW-oX+PQ+2`HjM5*VQH#m&*HpD_pC zBz-*%%Hsi@2!R+cK23)SZ6=NROw@^A!XbrdTP{vLV9Kmzow#2yX*M;1W_L^(+O^(o&h%c}N2Q*JaYYzC^gd)L&5tp6BuIV=&Hf;G0!(SuS2YWJ-I4}$ zVmey`e?A$|0j?>XcJd6yi}=l{(s?hDv)ThA!FS!lfS*EhP&ERw;;I?M6GL?;XQ}SP zn)70(Ac+Y>dueN0L9NSns9~MG(w(TaQ!(@Alh=JYfyxP#McAJ%h>-12z zn1nuWx|NoIbDijYRr?FSg1~R_3FQAgM%A6t{zV|VM> zTrX|p`3soyb;amk9Sl?rnUsw*Pi_d&eSEK`Z*@8k5r1~bAJw2@OXG;B-8+H3v3sBT z=EEPhgYkP&8|-qVry6zGH;)%@ZGL;QSf>y$lGQDBv#g9T&<+x-SR8_cB8wEU@yi_; zN68PV->3Zi0q!4E3Nw~^J)Is)1cgIDWDvuE z&*piY5)+s6n@;B$C;>^mxiB=|v>dC=--B5cFph5CY}{2><=bvt)I0Myaj%h;#~jVt zY?6-lHd@j=GR&BdrZ{%aJcivya=pGHqLhl8TDbA7!`?*-I)01Vf?$kT%bPlvE_M>g z&Eixh;Qj+9UB)~VEJxKo>Z%i${2cD*&>=&(=m3BXkpDW82B*J$3yHrKUc{$BE#?Tr z)o^tVj0DKzlYxxl4FSyw#6Kpw_!9s-*09=IrrLYy6E{_jzORQh_dja!B-svB8)jUtmQC~q&vnHh0(;g3!w&=(1e0qOlLCPo^O9SB8j3}j4!&qujBwUyjE>yr5 z!Et#klLQFxLXdxISRn?#s@1>o8c<2$fY)Nr{~&L3+X&0m~)oZr1;thG6$j2_SX4nT~WME*KQ6Zey#VHG`@In|)R>7$!AD-9462tzYV86Zwg;@JvV$t?? zjyj~@l?-o~g7KfX3=m~)Cfo=fGZq@~DLsSOQHJw_<6?SPO0iYA=CPMUXO?Ao;y%=} z{0~p#7uhHc7}16lz)qJiW@Wc*M|{E2^&RGYwmMMBE;O_sqwHtpsarJ{7-0%;B-eD| z>}4~%5!j^N?D-qvfZ;$Z?J%LL;lLvS0z-Ky8Q3^obRD=-UaVzqG$-p3!o1zo7A8Hl zjtfIAT#&PtAby1%e9eK(_bL^21-ffg9R`~Wc}5<98FOaAjld(dnoJS|-~u>;ISnt; z5EKEmy(mymRl}NH!8~;k54fEkc=9Y;xfBAyIH&PZNBye}W-z^3o~3j%8dlP_gb1%G zRIqpN9OpsZNx3VDRm;XCtVya{b(TAOyCT1M=qlQBg49Mp4p{kTar8v-Xo$+v?cPEc8+))5=&YVel{U${qN#9&mcJjD)<7xBHD+ft^Q&QL!e$So6rU$n5iJ0Rrpx0@l=Vc z*^RPmE?7zZtvZM;5I3RJe9pWxl6>G9dy5W!2i3r%>}5DoZDb|=q(0V(he-~0pLNUf z`j-1ZRHQR{OPzt%klSzu!+o+N+kOxK^U;G90lGf55~C4qPii`BpVsy`ns*z8*>?7z zVr!pkJHBw8BJ``lnZzURN|j7gsh&x6Uhj%)$@XG?*U46%(R(iSrfOgCoB0PYB_^eR zz)3ntI-q)ubaAn1#Z7R{O>o)mODmMU<44XGh!u`q3eH#JwWib7fJ(wG%hnlBfmFr({R$bCv|(Y6?2~MI$@IPc&A8Sjx=qby&n3i)}G=IEh*FCp2TMF@rPW z)JkxS(lZ;>^NW4^w8!**QJ=x;3L6qIkNPZGNzeBlrpDqoinS{%PwnIcavD0aj)v6D zE$>iC6H41`oms2?V%SD%JIvN0t|Fp-{p)rVytd-EHU}(rkdOTPqx0XnIryc;#p8py z6pV>=5E)`%u`={O?R3XP_IubDdq%%X@=W~<&C>z9l%b~0q-+x86U{}<{W2SWqqXm4 zAgW1L0&t;+9tcm7g3ilrWaZ(33}_F(zP=6-YrpZjG)&49^9msc3nNM!N~ju`A;x-n zdZ&L5n4vK?c)u}N+vH>U6z}-E(qWG#%b>AggqU7?%&t#;?d^64Ogk`Q#BxgfMu$Jx zT*mX@Xb@ICmA`0O^Wdrv+PLK2O@CAFAm=CZJ|Wn&ch0wZ8P>A0+(5awsJM8yvModz zd3||+dXL3N4r1$UzkExCuLWy>upEg0XK?vNk&FNXH{}3V3BYjfpAa2|GSog$AO?=@ zK(D@krxyh7u3vk25JCsN^XewbMD~OEKyzMfBA4(rPBd@z_-iOnM{Zh5j=9HG37mM+ z!>*}#J>>X5I>YxmshcJe*!2A6RuW)Y(t&O#92LL-apW2ciO&u-M_OCPt~d|CY3FMy zX|uTb)MCz!BEKuKcb6N=o7|f7xpL6l5^I0BD1`lB{ZVVTKRL$Y?zZsZO2Ypu#fkmZ zA|d7Jsm5G7 z968k+T!}UX)Mnr^+O+NCJtCjS`_QZJp!?ekjAoyQ(;#Xh4~8gK9cH6d&+|VPByA>_ zhAe_yV^;VSCWfA1l2&!*7r)|sJB$0IPR$^!Hl-0qbE9^B)uuM}lQmD%usO`Zp%05f zdCWwpCCx+3^_7nGgT6iJUiR+R**?09xg6(AN6cH95j^?QO&8uO8QRRk<68~!E}kSM zto93safuU^{;RC)X#m~e0{r2nD@C_erXFJP$^c# zfYEC%B(}eU#*HCHN>U^H=fa#AInfjZDWn#Ql@Sf`Bk2L22&NGo0JPT z67_#PIeCoy{@pc%KAfEm<->Y?;JxNh6C6bI?k8Mu1pyq z9xXV6)it--bPdB}QMGHmMhfJai#CAiEygqA4Q{8InM`)|$tk0eQGv>IFU@$weGNN( zaLgF)iV}lyqAfnFrw-BG-{0UpJ)V_rUw~VgNsLpM4Z<_9n9jBW&_9-IMJZ`WO*;tG z8K8};&0}|98HwF_EVe!FCgIx;VO|8cr|-_B_o8Q_?@V&)OHa*X7<$;$uI0Q?7>b%^ z4cTB<1fP)p>NZ89!1y3yXe3dD_PyDSk}y28&eCLTeK`h6q{V)hlwbZaN&=Xudl|*c<4L_n(iH zgn$Oo{NfP`zn7;Qh;U|3%6Q7|Iaa;P7C>krajOl3=YhvDHRR~*IU>(%qI>@N*vh&b{$u62Dsx(3}*IF4B1 zw5&LEi@p89>U!^_4Q8Sj1KxO~RzB>KD|NT@4wkacvX6<^KcHdDJ7xwFkWMtByVO<5 z?xvc~y_H*GmA6h9vGQldrWUF(;_$2Jd1!3NGx9WFtvGNxJGO+g9da<_u!bw@imqNs z2=Bc;4A?KrzPRLbr?rjIY_$yrfPd$80w0f~12#NcK?V4q!bdPC$A;>nN@ee zPSh+Ni^sc?IZb62dRyE0XZwr0(3Rb@e8z;|muHRkR^JNS@ zKjhzmhXES9VIv@hx+BMNxV|dBS9^3DqCV^8S6D99c6UkWJwkA{UoGSlEz#hK4F-^#jqhSdfG{9o4BFI&%KF=L}k zQE2JX$%tE-c?|;}vUMUX~0#Mu+@ZwR=ppf){+c zAK!Y;8-d022+_gMKLYxjH8Fg-4e6aA^umqr6RWe#{BP3_eV_e2@M-dYNwZU2`ceN8N8~~xDlx=KuayJ;R?%2A zu$p6f9=&ktkomNwe+Yc|3C7sXgRPdEAR1N=wOBhz7!$q^!!W;=4c(;~@j|Sl&Ab+Z z$t$kEF}k?vbd$v=26WmXpvhUyg~7m(`LoFX=WacVX-c#qKcKp+0C@+3N6sN2Zx@Ht z98&p|EyHPQ$O`zzCd}bD#77H$HEe0j?I_i>h^pySCr28;-nnEsBIn}-={$^v8Gan( zhenZc^p1(HO#1zq47{#*7j97`3EQ}?-WTuYWY<$(6N3NJG>F^axwHM^l^3$|>wpg$Cj4H5XX>Ab0%a+9F`U~S`M$caHBvcLmgjwqHniw= zxSeEu8cwv27)m+rog(=)^@<9r1Aq5+ZMalu1dw0If4SADge|QT2*@~^)I*2duSP>| zfJ<^3}wRW?alXU)iGf* zvs>u2E+O{cc18S?&r1suAInQ;Q|LR5X84WvYJ+4)DY6&F*nF?B**gCsDLT1pexj3D zzk7*ST_~3rs6E=R{94##ynq|YV@qJtfP0t!TFMjpSdB&G! zI|$y~Qo8=|t8Ic$ia^fsm`%4l9$soRdL#GxkG|Br-HfW(RaS>~zaFC0CONpGk#Xhg z|CA;Op`H8HA3HYHmli;jMN)vpdb8xr$)d%l6t{!~Z&c3r>N|K1iu@bh4W4R9J3JH@ zrma(>!%Ee!^{H~uZAO48oCtC&Ac~nBzj%EOLyR`)Hue$m4z}n&x=+Evp;cWsg5A ztC48%anG{;*H6QP05FY(hWnkF;Frs@Ol!9O-|@sMy7o6g4v3?gY0YORw*)tT~E?C~*bm^lxr~M6Y`AKO;!#h7Yv!oikCeN)+ge zYK2RztQ;I*b*-`IF(QW8m=IhJjcw?Ge@$W#xMo}y?HgwXFS)q^MH+=iX{_RNQ7ZJK zw_>%ZhwUg8mRXi!dP(fgX%DG}1(B(>z%H23{il@WzT-&E%9S&;wmy18w0IN}a5%(# zBg<}roe7mYd@B_pj*!Hcs{xffgF4RS;1^;8m|Vh+``5%CFMBM*<-?ON2CU_SGJEiM zC-GHZHNY9l?{p}Kf#i%NWR#9j{#hrIe*<~$g5^70NyDMZn$zMR2?Fan^1SB{)=ol> zmYUbRgryx@wJ<8b^=J`Ov&~>0(om~trbi;nw`39&yqJA^_dsGV&b{MF_WGLum&Nz& ztI7@gN_(jXA6=|_AgC~S4k<_%o8E#NyiRs19ps!f-hKP8U<6DO0rMr<%K|;E_1cq*YkLR4v_kHJr;UBKq z^X#?v+V@)PzSq`j6uS6%ZtnzE5#I#m$i<3R zsR%5dcg~Hoh776{=yqFj=^v2GZVpL(DZ8}=MZ`QM|9;063{IFX5V)GNuVIRtI3Bd1 z$OK6H3x$*te3UJ)8YIqXrtwAu2yAqC)WT2B+$HU!({CK9q|aXNR9B@PDwEIOiMO94 z{i+uy=Jb8Oc>>Uy5c~$PkivWNJR5ZFqTRxX9V5YKz8DlAkN&9p+Ibn=SAS)M9wDNE z1*dHHElfnH%|U|1`jzwaq^`A(XQ!-!moJMNUDyc<(M0P`U#;%QfLwMiM&UXo@K249 zY}UsPU9D%aVAScr4aOR_TBZ7>`o6xt(2&;09@D9(1aJi>aF#*-AlA>EgjA&Ydg2#X zs%R7mTkISf%=&(pPNo!|YW|V8;oga5HYVY%nBd2)r1-~+((1Y!=GhxZxeD7H!1jH< z@?(%Je7Cdy9GoU|^EV1k%fZ|(g$?VI@cZQ5Ev?5RDep4QM}yC9F*0tiYXBxh7-}Fl zNUl}J8+GwHQ+-0HhE zv979XpKAcq@c1zpI~1tWk%X3E<%}k=t(+RM|Zl`)ra4z)5FuKhKaj*b4Uk z0fme+mwy2C5QC^@zx%QYD@f_vVRmi5q3=o3Zv6TT)_`++G+U`-c7@lh!^!!if=xg*Txq3JqhBqvu9!?P$cV5soP24adsHMq2-e8$zNl;^f%es_lCpbDY*D z{CX=VXz4#Ut5FkryL#;Uh|CHK%`TaV^>yT>t>p=RK+FD?v8!|06+qc?sI1O3^W;8| z8Blqynpa8oj5Sr~tHnA$ys4La$x?| z&3ZY_>qMfKx!3JsQhaKs+n*gUMJ)Rhnrnm|cd+z;p9{17hz|F~NzkN_=yQ7_R`yp+ z*=LQ}^V0GgYH^<{wFxFs^H->7v=A;1^h9o5hv+bh|HF^P z&jy~PaAhooxRl)Qb)eMuFv3Mo)Ehl79*0D{CRFhzH#&$v8>REo;*FQ@kr!<|@}0!$FvuEf{dM%)?X!-< z#Vi3=-gbRV60-iwi&1M`H0VxZU`K#Y z&+5|^*-F4;cjdK*Z(HZ)N8!yfLY5z}_wTnr+^>BBe6L*qnuwK(qsF8ypYd}SoV2pP zs`8bG9X&>P%EM{3uJ5UH7J43rg$+?>A6DEk4n;Wj1h$CqCX0%wPoJa}-C1o%ROAph zxdl+cNCt z5+CB%pH{WZkfvGhk11)2K`IzyP!MF$F};!Lw@~REN9=eZ5>OPb4n#+#U~^|JkeO*W z`K4*HYM(JN_rM_;MDW_wzcqz%ALRdjtl|SC1ENGjhF*f!hIB?yfukm>`Q?`GmqKne`^UxNao`kFyOf&tylZapP0ZDtUR= zOna}1rH6EPy6-@Bc(684@o3}fn*cmDdsLr8>_JRMF<5`p$}#=IyI_*2?`D37(#hZD zLEw~YsYe8epwxRTWVtLjmy7(K#YJv^ECeVw3VEAu^_6|=PIDt=C09-FlYiHr_GP={ zpX$L~$NlN=ID2UA(zH*$f-oDO8jZ%bK5rE2*NOd|I4MPqbtgk>)+Mt(;#a zPIhE%;;|ibvtHu6h;=Z>3Qs_dfAsS3^qapzjdLWywG48;#m0uSPB%h7oN<2`#{>AlzLxEcILe`SHhEJmOvbI_8VC%z6EO zDNMv&Vbr#~WnY)79bb+nQ08WpYU9u-dL19Sthk|i&qaRaNpLP z+^Vp}^~+79bAuCS&8oP;dYheRmei$3ZvWyX$w_0?_+b_H4z+CE&5}NwuqgJK4#4pA z_!ec8=`5amdyfM#g8D4-=-v2^yO7!ls#@D^^Xjg1JUJ4a6$j%%1SVRD23{}u^8ZaT z7?GOD+v`lrr7pxLiR;)MV z!+UWZgzprHr5Bh-StADL|bLV4CjLnS~o)RD>%&)rUX-=2(ya7D&BJ z8X~cinR1eTZoFs{?4^o!1(E#b;o1%>q!O)5Cy9S+2(H4(GYLZl1MQ04w7>Wevv|S> zr~9qGLoZ*4m}?n!k787`ws0sUrIn1>Qh z@!@e+IPu(-h4Tv8ZGOy4*Pq8}Vp}3n`1$2dFDWKC;(OU0#xiGR;vP`{P16tpCuuad zql+Yo(;f}9Y#o!Yi;E@ABDlQgdgF<(QR=O>Yg)QMEhvTl2`#}xBX3*0j&RIkbQ(Go}T_BhZX~)Svq8yDVS)oLs-g(yQ9SPxS-8v z3nza!^~y>W|6BXfKhF$E1%PuV>;(cuJlndpUCvkcHQ8*6qhEIDN1H`-CFu{DeM%K3 zHkc6?g7Fw%=C5HIah*H$@^b7#Y^Y%Bj>d1@5kcH25zs2tN5qJScIi)WZA?VRpW%(j z+Slz*Caf?0C1^3rX%8XKZMR2o{lCMX913Zjt{Z(D32VM?+sOYr@i}@}x~hbVmU37i zkQcJ)k0{^xoYfqf{rVhf*F#YUFE|_D&saa*OxIdu_NSP6IKv`%k|E@2RqN1 zxx3>RIV-hap`u=tzt1ntV+mjhCVRe2(mveWo#Wam`GqLeejw#LiuN-bf0_5J}-|~rOj0fw;f?_(WzmQG&aepw$izuB28CTmzMA~`87%+J;UuZbI)j!V!-GBQnWvVnT zTY7Gooip1?;fix0R#W*)C~mNoGcU`y_35~pV~G`F|1<92L`J(5usv#AXDof4K4Wsg zaxcbQo{3Y5R+8th(@d=;f(;)^H$QNC39_j}&2iyuTW4#%VUrbJ1)Yk?$PHpVrpvgw zn`1F!_|5$_C08bjOqEDSga!vVhot}Pgue?BMBPgNiZ|H^+l@xA$^^Px$MyYqV6ECp z$pwC}^8O5AnqJoa56bB9m{lbQJFfT8d&?LYuL5<@8Do92;7g$P1em1_;qO?+VV}cb8<;Ox(o`K2i#jhojblDI zpfJbm9U^}oZ*O5Yd)A+q&aRp%ZdzIJ&_4X-xo#4hM9+Vc$|lWJ3*T=~`bVzYj*M7y zoW-M!b8uxwT=zRlnoLBI-+b8r-}uokn>6jXGfCFrR*A#bbTs8iEFg~XZ`SPMei<&T ze!KluqFHj^AJT@6Jk@?+aPwS_PvwU5H7rNs!^XW6*>hA|cvLn?%|BAuj8bq*ixIe~ zY%hnH_{5=e5m8?`g6NyVS400bkilOcIWH#5R9q|^zZGOxZWa3lq*GL)p7&F9RO6W&6mk3H=zG8f)sD49ROTmNr7pM^DqlJiRah z!SrOLwZv+owB{2&-@#>&zUig5dJ%}Ti54g9-%;uRIRm0c9bKI2(#sj*7w*@uvN|Zv z>!}>A>TKEsj%Vd+9!^rhYQ%}=^4up#PXi>4H(c|SwC!kD-E)`pVHS_uB(T=dQ*W_P zQWO6s&Du!+8i+I0I1Jw9a^I&PMt1Z*(FQwu2nieupLNXi%TB%GSJrI z!%p`ss;Oq)%*+}Lr#RO@>hM`9y9H{1!)5PrV$GV%R7zA{B-2~4p6K;iLxzWjFWjGj$-?hvfjaV$Xm-Fet&TrN=UTR2dSgn0PPV(Y5@AKxXR|=$j4AS;77^j)^^e76=-R z)x>6d|~xOPj{e(0l1nt2rx8>Y~L?aFIGk>;t?NN*RU zl_7%_>8m~4g-YMy%)Q@7UIAQTJ0Wt@@~8*L>*Qg#izgi6Cc`DXjC zI_yqqgifV)e;Jz>VrGs4&!@|d>{jVZII0UOj-)U~(rB1lnGkU8z|kVmGAzVS z4km(Yd}=@b(2GSXcr6%`L1enRVZ;#JN{KkJ!jC#i`nN=)5 z1f(8w+uchR`m>+ot0?o9?P-)6RWX15>p(8#nHEvVGzMhQAIChY8jYZPQR^-I+)f8T z*SLh1^l!MTMwz#-Q9ZkJ{ET0#_w(1F&2{kk;Sw@*Sxj1^4K#I64!eCr8-rWFRQJWf zeuQVo%SX4+!1Am3{pgGpr?H}Drne{apld>-*8R6}KazlBzjMmRn0+rXxztP6Sv`n? z@m$UYwRbe%$t(Y@k z?s$QUTCu9bWz!U2JX!v8UjBV+#`Kn4l61aWtWjhAORv#ypI!A1w^X2Q(E3;~-oZlj z*2oTZ_s~)eI*0dA{x7TmT>1x*zk3)uii%#meJHbKr(*9SGFx}^o}xAd?w;$Yakwe` z1Hd=^$N5tiyl>jD`-cN(PSEc9Xc7f9p}* zP8Tp4g%*h7q8;SG9gDpwqa3=w$myOGLDad*3~-XHN!4RXqaL$OC#LzBvT95{obC7z zn15kj4GvZe@VAXF(Wp=Kqxj9tdr+|*H$x~js)^zcTRG4zdA_31wXn5c0C$r9SKZY{ zLi`;_NWbr4XlYPvv@Y=Y`v{AMkU`o=cC1AT;AuGfCzII4&h`){f+@g)-5vPUTV5cO zBtp6nb`}}h*imt|BmGEhlXjGMU_d$YKSN%<;YlZ6h$6~E>HS%y4MbW{%)G=I2*)<7 zM1(eMOW**R7exg1Vd%jZq zvy>PQmIFvcuePM^vrfSh+^_%-uQy zTX;PDpX0-qKnOhC9d!*6^1 z6~b)Y?zI#1OCRAtGJ7L(07nDNEYI<)-IlqJLAn4Rp8#OE>6OUC^~UcbkOIgayI3F2 zyB_C5UV5T)m4KjX4VP<$3tj@m6Ext!4#~z~2u#!9Aq`};69{USqJ?O)H7P3$ z>r=oG;dlsppH?m>!x&MKV=;$i1@jk;2r{pmBKkKVfzbcWF6fqr3t1CLeP_oXWP{JB zECt_<9F+g0Pj6fp@Yr11`VCdK$o7+1jMwMey@ZpT;jIv(J^Riu!Cviw-W+ZG?-35> zi5W8sHl=R2f2grwa$Vl=Iq%f@l&6>PR_Sq8?{(Eu9q`@8>sjpn(x0LUbcw0p8;Q-C z*p3IG80{wapP-TTby_M`j>Cw2Mw6jmbiZ{Rk1G;So=BJ1G|GRd*QhWx))7Dt4P~`^ zaHMZdMd@8g_-}a_XOr18xTO8Qsb>E9J45+W@LNzpv?osgM+=elgnnS96Ia zaqWy~>~?uQH?LtED|NK^nS_z^=8u;3H)>xvTCNkH{a+WXyy+^SL2j|-$3pSr^kt%nAkL}fN^sly!yqv`flZ!ma@v%Q$oZ`jq=BH!u1*t zeT(PA@1Y_?25SEc6i_sKD_EvkmpZn>BJ&Wp9r?^x*0(iY>0}{#!EI)Q_A~UtyQlk( zmuBTOHfj>7e)P5L!8b$inn^hC}< z`s$ncvp+-UY4Py{b)Jiu1>L<|52HD{yu$V{=E`=sL@+nyrNfXby94QJ5w{fw2UA(t z*^SF5N=m6Eg^7sB#UACe`N{d-CRrZ`I+BcTI_^fT&#j@i&f^X{HqW-e{V>OWSldx{ z+{2ogs^}=}6+ahy809ux9!i{FzN@O2q)M!p|E4yvns@UOxl^JB>Jx;}Td#}m3MUie z>Z=xXkcm5k0*{GG@6$p|J1krimJNG8^wIi<3nhjd2M}Mp#Jld-ZVL%$3+AUybM*pWQ@x|BV3GR%#XpY zlI!Qldn|CN`Fg%-M3FO7Hacz|m4>l$q!G3hBJ(|&-(iM;c*2UP>p(nPk56!n1@^`Z z>PpCSt7=WaJ@-tn!j+PzQIm^ICKJH`Cd`Y*W$f)Y`FiSF!Hj{BLYD;A2$xNv?^QE| zW_^6kO4O!VaO(r{5vH8uCD-?<0KAbyT!vER$`TQi;;Kwd-e%F^mWSmdA;R;+; zs~(VO7X!nbrVHEyj`mq%SnLk6F2`LF{YE}xr|cYm)o-7i+1P9DY7@RZ<>F5Ckp%8q zr;7OG?~bm5Pk&G)tLO_dh0=uCe-8zz?tdOX%Iv>V>Ih7DA%j&>uF<#`NBn{|Q2)^K z6uKps|7#T_Foi#>p63*fq z4MIW3_??e1mEF4D@NIhMYm>2;zcLj`UtIs3?L29LAFEV#q@AaMEG4?{-%tbcGI3i6 zniN6Vh0__635njdxHl|wQvhR!g#o0(Q>^Isy%0r*EB4A%&9&vky$-JcG9_WEwo-c( zS4DlnUKyZ^G$ItgoTP7WkQGiKEB&>>;yTmPSck;As$VdtvHaBw-mir{{Noe>`$E)! zU77F%Sv2S-`WFZ?hlN<}vWocZfKH*|XKnneos9OQ$Tf|x*ZudKwUur$Hk=dyRrpa} zDEZ3I{S{8Kw;N&)x`i~9sG}%ava16=1orpYX?L&KM~1w^Y_g_F1r;;DApI!6PE!@u zR7|k17tWn=P{Zd`{&MS8NoGILx9ka55G_9ZzF||@XioV9nW8i~tHdgB9qMTcpHD|s zj<@zcYt|GMkjWV_eV2&7iU+w{C%tMuKgc}$bn8Jwl#}A`u51E$>TLQ-5ul0JpU7g0 zAX_80NaODjKG(7~Kbs=`STFCbXR>vf{PkH2mS)&2)0t)dbIpPYao2aB*fY(VAtH(a z)~=(wo$c>K42jtt6fX0T4bP}%@TozQpoDxj!7lAX%ju1&6Jg8+Qe*VO*Z84By&vMC$V-$m{6AqtdY z)WqLH{tfUr2Y=`a7=+8|Skxsyi>iXjQ|Tkw-ep&gU2jH2ezf?iVPw`zZgLvqo}6u< zS-{M+)I3!}uszS6`z}x{KV!avOZ$U6Cw1jddX#9IhoaZeC zyF;F(?ZL>Sl{sSO}#n^+O8|$ zk9wF}V7U%X*Ere@4Kd1x@B6p#{uk}FA^%2ns{sKz$(!-#$AIT$a{q@Q)PUYoR#zm` zYYG{tFF~T2q@{J`yFGomyOh3E4eJ8!rQ(zta|>%!(Zd65o~7n0|je`W@F^8&zv;SlWoQ{Y-0ix6tyrS2Xy9=^Bl$5ubs`Zo=V zi5)%-4+&M-HrEvWv<1$rx9%XeO?$*RA7+KO#pq1!7o2~&GJij>5PFqp2iTC78F6Zt z6c6=wK>;@Ng1s>G)Co+<7iy%*KBMw0nXjT%t-|lum|q@PC*_7P>e8+T&^4koI6#j` zyrus8UW1?yi;*Fkle4e<-QlnL5i1u;5m;(N7pF+Ua*8Gdk7i6qO2b}OLs z?C&4dBBGu}pE>+B%yV8a(@mO!ip$#POsU$^i-8m?Xz(pGoI-AP{OP@<`H7F~wvc084RpWbI52@o)fmEuPIvXlla|A8$0T1RC0; z_7s%q6Y&zNgK&v4Q201*jZ2HCKopOw>)+b1{)YFMRX~ZjgXE};0)==AFX|AD%)}=P% z2ypZOn$Lbi_j*mZ)EMDcdZ_A$`$lQ5B7kaqsqJEt%+&SkwYihpm;a_9{_zW1gfqDZ zCIE<1huZsyPpUg^t2lLJ0;r)E8#AX?uH01YJeXzCX!^%3iFK#QgGOml4Y7bM1A3}n zWCdy0K_f^RNLkeXzfKH5I|n3-2nQf(sr}(ak?}_v88vHM=uvV`?O^!N^NiR3I)i`K*AYGt z5C)bDLidzwUey6K32Y{~p_m(Qso77C;8@wxO0i?ANm~--fqDPa`g4P`tau6|mj6vZ z5G@TC!!07>QyoJ>m@9Qrf(hc{bqX5N(%{pEol-Lc4JehbNe`pj3*z3}Hm06opGhfm zG0oJKcA$4l>z=keeF8wi|2}MRHV80g(Wk@LpGm1XWewxKWYs{qhLb73R9swk-&iws z+Zej-HI#BG{~r9P{%fzP;{RI*pm`KvJ$3D@EAKf<4}PzqaAY>Fy3I%BfV|SK zp6S2tSqHk~(fCLG-sYCWNN$gR8|6z^{#b(cop7dwq?87E2W&4hc&89C;t zBoV#^w}sei<=L9;auVOu8@s}P#WNJd`x^2MoHBpqZX!Lf+>bXb8}`7ny^APyptie9 z3Qa<{lj-#pfNT=|HS*ve=X$A{H*_7{LbSPA=48mNe7(+cPY)I`Ff+msFh^q(C*l~@ z+~E1-Bi;%3$$o{c31jq-iki^Grn8VFRh4@;pI&-McQ5SA;y{E;x6D$Q-R8QHtaycC zhUxWW44EBrm%ZARxggzQVt>OZ@r%+>fNJW^oswelw;uUr20_k+3wg&G`mO6$)FczA zi=JZ3p4FSY^n?qI|03)3{RmokNiKk-j79+lKflLmisXE4&ebI?sbR&-v_2%cxb;6S zz>NMXEJ+Cz{}wsY)ox+?avR^!s7`OaH+<=Z>BKq0e8>j~n^VV|B@c^aAE)J=_J8<# zACRhj`o-}{#+y34`Bx;j6J9bnQF~!eBglX`V{mi{BrJy`2tAnvOgg+8lt&eNs+VId zVVm@37@xumJ`Y-y*FL9Dn!V$`=F0W)ykHc%Huj0Jo4LEs^wm-fXIo#O+Qo4bBAy%S zZIFf^?4?rqn_Np!N#<;*)>Ifo2frlKV65{rUda0erkJ-G`5nA9OfGVv#l&dGK3#m` z`X+V`#Ul5=)9V9D(MtoX4e2L}3}!TcR|>g?y9$Y5`wo&x;*tKI$untC-nu!E4|0@D zojFb=qq73?2sHEfiQ7V%92lDEUth#{R68Ui#7`RJ6H;|&k;yVh%2YiAWZV# zX0JgNteETQe@ED1y*`p4U17d3)J6lIxi9ESh_6(!{(M$1KV$)f?orq@d)Y_gt$fh< zPf&hbw1H*cgxyh&TpBhcPUs(Y2;i z>k7-01+^y!XN(T8!jUct$LVea;{Y``)h#rmE$ZbR+BEbtH+GJ{EIalaQeaTXFklL0C-4VBgvKv=`hqR= zEYMHRb1!TxRqpQKLow0okziDzCTIwV55m~sApJultpN$_E^`OaLT`V}zcAthC$qVR zZU_gXv9CS{2;5b$=yW7u3hR~@m(y@Vf3wKU2933UNS+VOH2YC!iX^WCJ^K9q89q32 zaCshiCvK?i5tjRW^89eWn{wRzS0jV6WumL`gWy>xBa{oiGz71P7DCDM(K(2TkFb}b zF!z$if>Fi0DRs2m`hZsd3TSK%UuIzi!}0 zkI{Oi+yWh}%WRYqWi4);Wt>7+S2e?)-uOlS%i*|eVTijbsJ6kI^`774tx5TqD29d+ zEZ31;dLEV&4R+7`Qfjr|RChU=(}p>fy7w1w{++OFRJ+q{U6Jd+h|LW37b&Bd1r%gR z@cE~N1_{5e{9~YDf=B!IVwq5Q2a~0wv1p#X)q~H z!@YTPBecHC-In8&{2X$UO6@jt-r;l+n9fkTuve6Dg8WtZOo0NN{4c5*bf}_KB)`mJ zdq>Qea>x$-IJ7A#laB&@!(F#@D-6yPb@X)$^Nx!lMkC_=1K{h#Ef1gX>>|F9jK9?Z z*4y#t%Yet1JE!5Gr&IXVO~n0F+c%(jqQpm{RDWlPnZmD*A%gib;uDso1H+PzGq>!W zNzFXN+B|VUOak6LC)qupA7D{6js~gBL{^@o?kYF>{yQauk97lTeY(9q?%{5i05AU5 zmqRAv>c&b&@jEPmayNTioG$s!#H8L?;FdhKfB3p{Zw*48$5F^{8#q}^D+GiAp>_b! zSUU|zdx|&^;}dxOYk=tt8XvS3O>e!^7(YHbu zPxzPHI>p?_q7_-uZHf`2C0Q3!LMqz2r9r3ppS|>o`Bsz!cGAgWH@hnc(;511?KgFi zo$Vx{ew0=YF7h=q8=|U0*>4v?SAhNRJ+!B+y&sA5eF-0WA~VMd!vF&mE5gFelLa^ zBfKu*9rOPa+WmsYo4L@S5SHXd+TTh_la$!7h*7;}B##O5@)vc(EA2S2QGcI!aNur#9bbvB+RojnwVJKxU}vJW zynx*RU|Hepot*80Vfxz zau_vzHa(=^HK34~1_}Bi2|_e&LxH9o`Mv?hg+7mstyZ~$R4HmT@E-Fon>56(gS?F+h3Gt?F8I&#JI z<|&hy6?AU}o^u#k#amC%R~ck6y37%)^eliY>Y2U}?xLobh1NSF#}S+NKeTm^wC%Rw zURi$^u{nmvA&?-fCu`Y&d0HX2?(rq~NxQQ@7>|k}i!s_pSe`TD z{Psw+PS$iQGJ!Uk*iaUJ^SMgTScfq966=&2*3_KexS2@s~!P3{7px&j=l`_5$2|bJC*tSA_h$m#bxUPUw zw4CfJA-0D%#&k%NYB1)e`KF2v4jE>0OA)Ep|E~UKtXYz(0v;z3k^94$V^0!75`tVv zBhbICRLi`S&^nW#LX zgLOeNeQ|%5gvMDmu1!D-r1TNRX$B%yxRiw}n;NJgHyWz8wB~r@roWtA6ct)${Jq}* zt&flp2qYY)SD%^rb@Gftq&l2TGS$dL=J(hf(gvm0lQpNf zGe3&iaHfR#zSMW~-xmjcK5uc)qp(d$Q<%c*`WZj5cge+Uh@rVU&t?$j{_do4t+uyH z>F;s&k1AsKoS7rDxI@jv@(o%S{%hU{`dgCY47-II`39eVVPc!Gewz|^w@>!{3QSEF))5jY}4fM~ESkV@GZ10arj2%{VyRUjhAPuKX zpO^I)l-cHA8SKjyzGDe-A~<_hP^)V{rIZ5&jukU%wN66BcnO8`aOMY(PfMyCrM9>C zN(;I@vy)*CZXIdUy@c%2_RA4_FKzrX4JHXoPA@5%%!pPbC?`^bd zhq1?nr>hKi7PuH?uff5L;1$h5!NJJkQ8$f2QEQug>y^2bH|M(|{=O0$1C6v)d9Hr$ zye3g7It`xfmAf!~MdsJjot-z`tiU!;pn3GlJUyJ{d^j|I?p}mNbUt2@mDO{h1i@CY z#$xBT@x}z3g66)7YOEgoycIu>ehK|l_Z-o}P@Ah+4o1sO9>~AlL8GxslJ>qN1SHaZJZvLd#;LF??2TYI7>C*&+MLuWJIn_TgZm}>CW^@8_#9o?hqaE5KAa{sl_BNN!J&srCFA*e z7ESHH2zb221Abi_uB7*rmB|$%S!+{gM^f}^*cIF}^KH)CKf)-mN$-x3S&+4n+%@L* zW8!N2<`IUzFZY@?ohzCZbKxo!^q!uanK!)6yuI2;409K$;|51i_OQ=J+AaRB#}yUq zxj!5q+qhM}D#O8dZ#w1feC4PbT~ybBwKLw3-(q~QJ?od~93aM1-ip6Llt&~~$+k&K zP4pB@ovsa_YCOC$k6>qPO`Y}W*B!RS;i}&!Q&%gO5#99Jd^=NtER87iMjmUnEE%PJ2WFEfdX(DvWDSDvl{JUpmcV1F06o zDqFu8jnJqYsqaMCGH|Yeq#@T+(152~Jc%cm(?jm_K)~9-H6^&<2j6W|AevdCy0LVI z?|`lhJhzcb#JkODDJMfzt>oh>inPYDxbSy&OZVk8lQI%L9P+|4trEL zW+dEd)#<(+8zOsSht1?}qp8&qkA9IM@QmWR&uA9*4>E$ZeY-8cUCWd11>MGLf9Z0U ze^mKAOwf?>hi)+p7UL<0aknfSjcu{=;w-uBPxD56oC+E7g62)~q7VjRZ70!)M#;}f zqVbUyhi~^5y#H`Nr=x<{cG$U>%8} zb$dzLhi3xBlRFpZU8+Z&aY5@8Tz1Z;N^DliCXTNrwAgzM~_)lD3)Faf#hb z53Xv3qverp8F2e9~R9wswv|!iM;4rz( zfGib)0cnO5+E23Gx=I_moGL;iX8NU|G74wywN26WP2c`|ppys7TP!%NKw?k~8M>~d z>|?X#Ci&$Pej@Z!k=x@zYq51g)VGA^)8j3=nK-+-UpsutGa*mqSYN+ZxI`eRf0VAV zvg>G9_)KK-?3wKh`*fRYG{ zhs2Uy0#UD1_2-7}d`2y?!;8q60^~2RHT0!2U%I~OFhC|M|D@jjm|*k5F*m2SbifOL z8gnU!__uSznZxXma;NfvB!Zf3yKnd84`H{Nq##iPMN+*{y0n8e!W?&OGW5NzB%e4G zAwfe}Fnml`WgPF*?MW`6Z+r7_1A7r4VvuYtEXCN!ReyM)r0)bFIM~dI0%4&9V4+2z zzB}`NtK1c$TJT=fSn#UMTUiJSe^cH1_Nh%vU+G@YuW4L` zOuk*O^Zi%KtjV$S?~Thz4ez99rz)~f%54n9ii+%}@|TPn;vfA-92yr=?*g0_?1r6f zR?BTrL|qBver@XJ$#(3t_)+}9ote%1R)S068|QRw$f}*9-#ELYoE$A}C4Y_Vz5D9j zC!}uT-fs?{G$7uB0^Ho8TIfSf0IaY~AWvqi}sVcnKyPA!$!FH%9llP8-VztBX-Eah` zRzR6(p=K0W!#+uy0^O#%q22L1wN!pW-=T8qosy3Y;)Ie&r$qj*eJ6V}L=;!JX-K*0 zq>cJ}IxHXw$7K>6*_BrFN%C0uGnxEmPreq3L3Ulyr^V7b1Cdn&$6|FG)`NyHUlT$K zBLkE&7|GP0{XNUKd}lEO^dD|jeV`b$GE!nONuUKqpI41gHe=RnE8i?e745vP&r(=m z*T4iijpAQ&dW=mI&2gr(hZL#PealOYR2MxEi+QdC52XXDkCl`CAFj;-ANsyn!Va<%0by%C*I zF7SMe50|q*_mFc&|Hr$~xVX5cn~&sVkuC|Z%R+C?__AYactV|3X@WzzYhj8^Wj{iT z`9HvI?HK{Bos#;-jZbcFgf@NM@y26Dz=578SdEnudbwuABEOBWx1BOm`u#M+%?#*H z+3IH$$v;kNH-@Xhej$dZW3E20jE*iYZ@wZ%;XgBvFLe zpC{vQCa>g+QV#qg?MM^UZ5}{oFha`4)uN88> zZf`pW+85}kdbLs89k!p%`8Z7T->68h^InXkyXV>%tX_)GENGsPocmqXZNWr)PC8Px z!!be+#eJzRu6wo$ny4kBJsLz&Vl=9^gi8m1Gsdy;5sp!?qzt9m5^?3T_9}mhH7vpinlqDo0kC z_ak*hHp=zn9%*LkFvsk#!GS_orMRaN3Fm#Bo`#UEqrQ&De!PXZ&jD8}4muyQMTqW^ znSYC3=s({%3{OI<&WP7RE1-cpmeiD|>BOsT8d2Hiz3EnAcvDP>uqnBBuGxV3*34r>8e7 z65DY2t6^sx{4Gx$)uxB`pjV0M8p<^*FdBN2TcoEMZR8%hLnMFPK?g_7iTs6}r-zm>8U;k7z%2ISm)lD?Itp|cacE^0_zrgNoRjTe_KpTKU`#Nxb=J_m zqGc*emn+I(Wt^ic`H}N}tL;RZWOZ?Xo$ZdYCSwV_(-Q7O_L({7zJ2-JkGiDz1l=j} zHbC|;frjS#qnZ+Z4p?%HM58Da76@vK#Kd7$1<}WAlEOJGnsiFMZ(TO+TwJdbqyT3h zBtC&rzavK8mOB5Oj)>tgik9qV;S$0u!u8}2M$Kkbb(CP>a|mC43N)L_ul3EI;Dxpk zhcOlo%JK8Ork7hKa}5-5S$8sVjmhyA4=GxmWXfM_aMqu={Nob9S|M#5yJvNcF7tTy z=6O5d@z3XvN3YfJ!A?O4@lgD&y~;0N);3So$?VMc$1w)u@q!#6C>jh2nHs|_IAlmN zv&>9IdG#<~uye0yaEB9JWL?Rlbn*-fg8KV4c)3m+S4b-b3x^k6Z6Nn_;3Ye4wgKB7Hm+4%U+5_Y$Pw1p%q*)cej=v&Q92u*v}KLc?X$r@YfTeO~Au<;V%O_FLkHSUBs? zod`1-y{B*J%Ire6Tk1A*-F+x=hYty}Fw?oNdsW`Q^eW~8C!To|{+$*d$*uBUxb#!V zDCcU8@^xT-peOCcdz*Q6G&FHS%|#9p^-RWwc9dZHHvS$j2_$85ABI;_osd~K>qSD< zDSb{5QaL>x*|o_JaB1c|Ba5p;)94j-hCXP|vg`woR7c#9^>WrLPvUqgv)CR|B^&b3 zv;t&!90xEMPOkVPbhm^N43GYHhGh`yl1RgaHw4nNkSR+BDS)yqCQQ>U9Eg>DiR zsuV~QhdW(~Cf?&gz9bSP3&`nbpHHqhR?pj4E&s8{iV$d)E3ZGM-l9aKZ0L`VVtPycM`H_<~fYuXpjvhdhni*x$%dBe?_xdSiAzGdunXoFQM#mH* zH8p2cCJi=k4D<+e9(<%;1FC7OsvC^G@xU7bIF2`jZ`IVekeF@-xSoAsUJy>u)YQ-3 zfde{E1b%Beaz9&XRxi`vOwS{izSu-=zfEjv~(9|J2A0~Z?J*9}k{pz%~V+vO2r zJVLssAe=9@6rx=d)!?K$1!2a_ zwHI!AGr*aHp3Uc!Ug+cLgO1igwAI$efm+HLC}dnj1wgWW%77OW=z&DwkYRmeHD}FJ z&9kGej||L=2MOn*ToUbq(Aw0Xkw4&MFvD)Jy5teIK+gVp;A^)89mlQyvI63-E?yTz z$7OFM?Hr!6P-G;@<9=U!w-X`9l0S0yu@^7^evYnD_{xK40>QY^eF$z^(h8_n@Ot+V z5N-a#viA@&?#$vo|9~HswU=S)_m3+~lyz5Lw4%oAViot)xo6I5(hnL>M7xR3qQvhp zdRr=bfKboBQ!pdBpJm?mtV(AY<2g}|}_sS^Cm z;x3cU0r$opGgaLPB#OfY{uh5fC~--1sT}=+?~}Hz$2;So^I~o@?d3ae!;8t$d%^XJ zWuZcPwu{l*$J-n7Zr0QPSWSx`8eeK>GiLJR7O&U{d?ZF2hK~h@YuT5b^l3jXD&IGq z^0o;`$f5o3rIEEEW!e?+;Irp@E|$eu7!y+uS5yaB3v154an8|w&f$9QL}ib@Tr*VO z|Njy7l|gZJO}DtayK8WFC%8kf0Kp}=yAK-NU4sPo;O@a~aM$1v-0peas;}3ueEyZ-J~NCgZ>CxxxwYP1gc&98nhsu?P%d&nS_RAPW+#0gO)EJD3T};k_!Zn z_*~WY<!eU*{cHaxxQs5jX}Z95Uk=uIZJTAuF!$(y%T#ERtS9e2AM;f;}-RL9!cQlr;rfWIXdrM z-b*|#;SbJkSXlB@Kve_wv005t?CnHmB@C_PHe-%X$YmN|$lRTutdc~k1GRGDmG=`+FmR@J4|cIxY3>;iuH+GV z!!U0KdA-MaFy=l{#PEe`AdN_cPI~-MjmOPWMYf*AkiS51MLqgiNLn)8W`PQuZpI(^ ze_nuhp_WZ&ZyNp!+tEpk@R9vcr?dw{u*q*BacyD*M)fbqe@GzW50&|}%P>OUv< zcxL$WEXntA(O@j~b285c(dBFIhG!0kIL3Sp;IsTUL(zQ>Tn3xc$HMT4kWq7=>o=th@$1WTkC&|;7FO|mUt*pl!&9}J9Px|sRyp@$jt0i3&)SUsGEs572s-c7=_4YailvdQ{j4I(YayP zlmnDrZYily3J8y#q9XI9VHf*?e1UN)9W^KNI@kPVUu6mC3XrkjkN=7~4q1-!F2S^-*x5#L;Xe@;_luZQfZ1I@V^WF}_$a)1RNenV_+hPh6 zOw&TDyP#2A%wbfbP1?14I@i#P*fV$ZU6gW+bJz!@%Oo)l)E$A1ldPP=Hgu@`-N&tE znyph~ARpmd>iARtm!N{?Ymg8Q%3mR|I!uLScVh{hmy zRyijVbTA0s^id2^m`?xbBdiH7&;qUn z%lr8pu-Ow5LQY7zC1p7NOEB_UUtlNcei3HOwvc*shyecKGjw>8IMic_A}sS{;g>_I2Mfj3 zju}PP>#Q&QAdpRDPAvfxR7ebLe7%eUcHYn%ILld>cZqrcV_ic|SeRMKD6*n~<7+II zG=gMaq@Z^6KH}dSnuR9Yccxz5 zeBrGt)S82G?X97Z{1Qx)GPlWY+qh!dW?<5+zXr2F*Vm}Q+G(2~e`R7U@NK~E3i~S= z4n)coW6c)pZ_usRRaB9@I9IXlf4|$A2YeNu5K#2oa$6K|68GJm6evb|5)abD(|eYe zY3g}9wttx`2Q?gR>9peD;7p*hfv!K~PLi!~0B9q$?MG2GwDol$74<(vjmbp1DF`1r z6u{hx!rDk#3;CiZSC@w{yr`=IJ2xI~sd2oD=DTS6+qc&waIoG+?GNm}Bn=XRB^;Ce zMriTR?>JhYP-u`KRDE64f|8WO?Ii_DvW?FsXWdCxmtHxb^$B6e=jX9S{htx1r{i@O zcq-tNsiCw_c53qPsgxW=}M&u~+fNL?17k?Q8$42|y>EbCH!%Yqg5U*+M zGRF?e3$zgPus~Ym3xO5oIt5@L%2jP2aX&cndpc@Sfw9lvk^r-X{D$F3tpLiUw~tQ!o!uokidNAx`Iu5}H0ose@A=h9g}S6DX`Lq$He2 zKkwjhi+Y?cb7iPuVxsi9R2Hp`_}|?J^sXG?6deEgH_g%#lihw`v!-NuA=25K30_^u zC|e8(A>2vNve`0n#8$eU_yN==)Q5qO(w9~LF016}9phQ^tm0VphyQ= z4M-SN5Ko3nC+dtl%l*iINfcNe8-2b%6xE+*+G@nif%62sehGBgri}mWV;X*x$bf|< zj;>W7xVw;$x}jsHH5*IIrzf7dkguQip55{jjw*3bOkTcyT&CxL{B`_*r+ZG7dqu(u zDzIjY^ax{wwNL(ve&kGY2|dQXt^;-?aYQ$CQ$OX>>p7a#zzRQEAA4&_+W$Ty(Ry)9 zh=Tl-OI-T_9jqty3+;#g?n%9jA)*|k8W_vnP?iju?j%zqd=$T*PN3L{O`pk{)HESF zvK3B=HJqQ2dksUWZ)Mrb1_5at+LguCKY5_v$D`hvHbpW+7}LQHbQQIq1lh!0KW&f6 zB=xG>pN7sw;5byb%V)UZu){Xw&(Z1$E41tynPFp%1*ZC*(j6N=24cBUY3DnCi1%EyJ92ga*S3=U<(fCs^PSt{E*^@>pe7c z^1k|sDq-$Z#Z!EmGF?_@RD1p0&b^6#%7YdGomCq47w0DihDOFKx&vjsKwa*fc)~Fg zqu;Tf6;A1nSL`x%HlbSDG?Y@L9wlu~Ppbw|_6Awy9o)BXI$nkjSMBQsHp&agl;2Nb zO;Bb-eEPg~D0U%H$@i1hd|{EEt`Q%^O@!yy{)%PpcTbD-Bo;%X1`=QXyLEK$`)V?L zZ>l%?dyv$P1D4*A^@(O-<3q96@#9YQ<1sK`U}^&vK)*u0G)6GjKi*QwoAW*SDv^)^ zNTj*H862A*4zKmL-}bk`B4gOF3o#ModMOix1yjZm25H0CyGj6wuZr)hu;_wU0MJgC z9?nf4<-fK$4VdVbII=}?^u{sGNos>9?dQnc>!V!}fMe&R| zmBYc$hI=OJ(7Hk8GPEK6{ZGW~5E?m8!Kn30efj1Wsn>YPh-lpou*n1Q*C^1UA00x@ z5&j-cPfkCyR6b@^KR7dZeBQ5F7&4$6Bma$6Cvq`&Thwe|IymdJlKobcol*|d6&)~| zy+S6^M^2d8gbrEWPcVZBi4p&XWFyIFgIdDVq#gbtKvECTK7GeJqiO)Z)o-28l6u`2Om;~wlMI6O9r|3wz}|Mbe5*HQT&YR)KQw05FL{n` z{dHa}3HOs8{H6lqpa3x4;He6El8Itln42V-H;=doNcQ)bPhic4hM)|ijKM#Ar>mre z|Do(`_>k}v^ey=7FKSo*l!_>ph>~%9IJH4e4$a{~c-l-RQ}}gcV`>UtO_xB1R4ocf zJ1|;M#*$#hvwQd|ZBW?=k=WZmm=b~zyM9hzckGa;m>$?fL!)Kn=Vo+|?;?oC1_67- ziv6qt2U0gy&kPo@2_EgJP4*Gz9>~=xsE8I9FHcXH(|-XWCf+F;fiW}{9dk_>^Gt*+ zyk8=-Q($V&GMXo;_~WIu`Addux9_@s#3il+a-I#7$ENsiv>r4izQvnbKHDupoC^xf zRV7Y3>^LBd;7#Y6P0Ib1vM+5e-tm+o3sHB|`o`dcn$~`MAX|N2ygYLv`8#?oJggf9 zF&6|#1brP@JdtC-WF}ZQE6GL=-t>Ne`gwG4$(Mm`nE^=t8(^I9dv}v{dDvJQ`p~S^ z)tCgn@h&^UJz)s`b#J)lUUc)c1Nc!4TcP!8yyNiIJQ)Z{JE%P=mQA_+7f!w3yN17a z^#%0EuDKf{$R#CwL0x2Is4hqePXQ@VT?x->-k4N0g*P9M3(N18dD}YbNl5hZKUcD2 zLKNOEWW!Pe#Yn!_;u5G(YX1y_1`>a($XMm}FWILTR9_j{TELto1kr}b>q>463PIUI zCA;^zUo=B)X2~+fzP&?8MyTeKIrH;cr`qWB3UFo!W3YmfPQED35&izQXDvZzkfiyE z!pjyS6AMZ%1$~0uVNg<%Q>yV^eiJQ%I_nU@GPcDQDCq(3PxP;aPl#e4Rd(-)P-?V! z1lQjXU~#cDI_{DGk18S|Z6ck92`AfD7lTPf$mcJeHLNMT=vrM$0P>1xk`5FS9ox>D zrR6HVWxM}08S6DPI-10*KsprWf}Elt0U=iZR@&r|I7-^iBq)^2+?@d`N-uYQi%^Pm zPjpcwt$DZQb2Q!B7G1{{eiA|J124&_ii*xzJuo9elDGwGJ$IF-A9p}ipOk8-EypBhhIfmM;GAT_{QP#YfsQTq+`TZ9`K2q-4nC0R~+c z5-NGoLT1P4hvGcJjIzFBuJD&o+=K*_#2~wXNv|Tr{Q7s63r@LzHq}g+U<4sI*%lq?b zI<9^h&TZ@hl88$QECH6E5!Kb4;t`(6pG``Ur;3660f`tSFMXMXO|k$qFLtsD&B5*a%4y%ze!nfenOsnYal@Q z!Pghv3}S*EEzb8NNU;mMUWdC6B-|YSQ6ou|^KTt>e~_n*8Jm|a*V0YF+o+F$E`}0o z#e9}VX?eNSewLf1W$nMUbjs7+&3gU(9KGlhYG&41K`KTOJg7ECpK!m4KgT4w?u_3s zcBRL=!i8Wrz|%)88HQ0u!lEGR7>XKS$ur|YG*UX`5Lg%JdloOt4mPeB;CD0h`M{7_ z32tSZ`XRz#`C7cg&z-yXZQ4adXV?D7f4U(;(dpzZFxz|s*0Jy3Wz!lxe^wWYLMQpc zAox{O9S7qw1P1ZK@!nIaZ$luusNNW2YJ>OH1mUAb%-`#H$B`&u<>XqW zvCr@c6+)(k{*X&u4J$;0gyF|3RI$^}nHbrWNZAIW1Dw@#EL66aKlgTuBD)xLTuJ+&wp z)f+vJJQ(D&3w?YkZDrmu`c&^3RP<3c!fc~x)z`|u&FWLFDN>(~TJKpV(@ zxn$8LY|$qS2y*8CNH!Ayd3x#Wc=L9Gj0ebDuaxWY!}vCDUQxXV=&F_Htf_QHh(z=X zdl2W%u{5c7kP#>#DVdUg62X)Nw|wCzA^uM&^@Im#BS}092nXW^5`u6@)(l$%yD;fX z(!VT$XGItEXh|H3iR(OIwM)hhVQS?k;G>Zp<8Htg`Cjo!C$?_SLW< zpjx@%BUzf}&ZojDEOOb$Sr#;vozB$0$7Mpw`x$4Ik(`Kcg~kVFd-?6%?62W_l7s?O zD^0d3uoEVlP{t{U`UUebHRmXWzWl}=TTSS}pcl601f^j4`VgcoWogShWx%0EMqHN4$ zX7dUOp{^NAwf)V2GuuK^3e;S<3X(}W_iD?4!|xFQA)KCKee3oc`rbV3(=~j(yuGu7 zcxMW!_eC#%0(n=8RbW$L9F%Sbr+aej&qL|l;iJuwW!aLguHhmh>a)P24#Z6&n zxoMd^9%y+0I}d1^cc#IgKWnQO7P?uDNEB3rXbc_`OkDDFvviz(dlStqZd3jJFfdO; zKpslv$>_zG6U-QL0|}Zoe$jEl`wV$aru9#c$q(+IRl?)lSI@G70%Np)QTy-Lk-8Jg zk6lo`2nHYy)GT{=j-NsXX8*3u9qx@mVT8%-5sA7Zh2>Z^^{_uK02_E z$!xL&)cz72;Nt_N3;683*{DF;2L1xy23Q${KO*2qE5b2S)jwraZl9;UJ6i=)puoss zzz|C@PNFctVq_+)U|=MvAxoAiO+|Qk_PR6!<(;-Wz|geE5hAI)B8;aM%cQf*8Tm7u zn)n9`W!ZuMR@Z;c1hO215r3Y_OGQH#qxX~Ffsf~3JssKeYT$<_ zL>B~r9z#NWffFZ}ZP8}ZbOS?VeA;}ttrfF2!XRObcI7fyA+`&r}&y z7g$9(if})67&fzdn7Pd-7(D{wDzo_VMJkd=14|1m;Z6#CJD`1u60Rx!dh>_vagY21 z!E$@2Q05DZ8ko}{0@AX94DFs1(}WE9BiDsO2WzlDi6R9lkaZ&2kxvKa;J0W2X!M2W zhd5PhRSW~!t||q)jq{V5o`L9~%+XQ)C)WcrZC(6N5;ZlafAfhWT-{YoQxM4RrI4 z+tCcc!JyuOfl!XDIZ7=JKm1EFWZBDPc?47mwXEuga431~o3VWd_MOay`p@$ubt@Nj z`u10M{{?cVX&^roh76?10CVOK6b3>pA0b(FNgN!%T6SL0zLP)k0Z2u@ddhBWU!y(2FK9ojKF~V{42}62{4GaD`c>D;rc1qW|$J3 zJV9mTTD$K*&hAKbvbaka_gy*ph>iWrMs6OU{(C;Ohw5Lsg{r+}F~8X7z4#A(^AW5cWqAZE#@CQ*}? zp_7)$AiD~Dq;|3A_xPw$-$Yw zMYp;|mlf>gZ@A~)CQ}Bv2T2LpP*`NT+We3{tDpBORFXq*>7Pic9RIR@gmeL^7o8r0 z{2ycjK~Xeu){n@CQvO*2@UyDZ&7>ZYJE$(TC0Sh(Ac4fNB{)lKq-11#7#gPaUcK}4 zTx5TV2I;hasS{PD8#^Z_n1HXr%g+yZaG}ZYkhR=n+l>k;@OF@v{!nU@z{o_|6I8IrQ67bB z%IGSxoVv2YNUUC|))`Tnu}^lsJ$}Vx@;%!dU~iOoBBZu(1s^yKqWkT9X`e<X= z${8i+9zO5>)hUn}ElFE}rDn6}qq3Z-xC1ml1k7+^`|4qM4dUet8g#m4#R_ z4^&D(;OqpTcDue=^NMMskht958w&_#0Ay@B{in@2POMQ>dO;oFE;lhahx!^_B;(@xJOjZf<0kN0b6(&LI}k*wbIbDl{)TR9K1 z1v1NV@QvYfDiTsbU&O`btcQ+q_MEKiHqWl^+@lV@#{wMb+#x(C|VEHhz(Q1SA>1~0)zL`Qa5MTR5axZIlD$=q>3M_<}k=!-K{azvz3=}YgJLHLGS;H{hHHs$6 zH)PkDnfPl)L@U;Kby1*tl*YYJAP6ogMp(<_1Qi4mY%MSlkkV@&fZhQ(L|V>g+{ce> zoB%ZQNL?(4v8NEJOK{O`Ynot6Tps~X&Nvc_lA`JI=tew{rVCyq#fv_KmGT`MMgHTx z;VSau&&cVsVXSW#xy?h;dpM^{7RR@Moj0S7X`jBp_0oY~&IlGcuT4lG#Wm8ZKY2-A zz-?&T`K#jIy^F2~Ii^>!8H$h`g#*L6X24{6sCt_<7BY;w%ZoSNk8D}qd9IFPZ>5t! z><}vw_^i&Iwv-6z+sK4Ho+JB|5%D(s7Gi2zE;=9ar|teseSJNl%kTm}C#1+nP21Q~ zo2s&bDPKXm-(R_vLjjqi#opJRKWp>I1zK2{Y~CkWbTpP->23L)2JbdLHq~rM*OuXY zmmL2;j5bet&vy8GmqU{$*QuC!^ z(^I!UBtHBbI1(KL{t9MG z7DQ5l3#1%uN$^`?Fov(NXqCDSj~f_L?897=BM~BM9OON}L>){(1N*Z{nq8I^lD_@4 zXJljAacF4WQ@iM1Y`6FI2v0=?5tE4u0DA!B1MnW;Bdf+Aw74c6d z$A`Q);O>tK*nQ%H6})pt}5F<;!-cL7=q78k<0E z<~vF7CH2e(Cn;5>G$=?@98~PQTmqp@-Z-ATH8X$Y2J#FpVb z`6gZIOSEwx8zr2Jy@fF_JNh)+1#~8deyGK z=eF|8_5Zv8r(m5bZDN3gax23pNE?cYj}jU0q+-@TNL@}RM^k^VY%l;Cx@E>pjx#cF z(5T9^DDx!%W<~6sp;(d|UV4z-}Et3tmm5vf-nGIiY_xAuz)yK!ogHkRTVjqdgQv8lR(_*r0vf*e8#KBZMrCM z=ks~t5ZX`wPUPh>CCI&OhYD66FKQpV3;#Pj(g=S;c6A*8z(ahxNN2~V;jBDS9vgFF zZWzDW<0=2=oOs*&#=CX#S1QK!*Sv?vE~H3TceXFagBFcrwLfT!hjMoO4jbn3>DR$s z6nega#_O8PLdF;Gn~Aa$c4QcD967W-s1Wnf!HvffgwJ!J@xU;M=-k_N7b%_0WMy#^Q* zjcov_jOYt00wti88H-S8mDR1CU*G*<>h|*<0_cdPZ(TY7WGO$fgANu)TZDUs+b&7m z`%`7$3_LkY0Oc3(-*^+Q5{>E($ZAl0!NEu`0)i0{7F(&rip^W>pPfYC1~p|TJhRPI zm|1&F=Gf_AqiBoWR5vx9X)IHneB>~NsW_8cE}V13#svf;%-@Rsy*=u@{5-WUSU>cO z(qOQ#G~|j&D6CS=cn5aA7NpEP{By;4j>8(wgoi2enIM^>hC(dnhE(s*0Mu4)mXswr zle_E4x1FHeFG>WZN-_*Z$;v!BrsAn! z_ufbHbRnG&1y@nQf+|(@bW1xo8r@xonYUdT5bpS0JCt*rHkBVg;k**9y_kU73i{WvnpSm)S4-Ph8;~9bb|b zcK(KY;6=m1+d6TUbv3OyI=tU4yy@$r`*f7-jz~pSs>-;odLHXdXeA3bGDNsw9d3Cp z*1R;MAZ25bg1saqX%n{B=Ox5#5536fR>5_bDIqDXWxHRJbB$OkdF8`ysSK@9lZO{E zGFA|5Mb=r!)2nhKp7141L7O7US}3g4wtnNhUcUxt77qG!_3g}vGr}R-bkczSjU!nO zG!puV-iL_)6PZ*@4v3#@MY@0;s{6T3#a^Hn>bDOIdwg?Y5Dh5k^q`si%o8q5QD{II zcql8_9_eds20*8eIx)chE^;1kwLYqNFc2|*j=fVD^qccW%{56@;(EMLXAru7**iIz zeHCG)IL2%?APDyR5?l~#1+lvpGvq6GvR~++{-NUIxlQncnIl&du60iX31KWi$|D8^ z!cAX-hsYi*K>~aK0{wGcT;XJzo+<%h96^FgfEUMw0(9tPA{Zk?Lyg=ABi$b;BvTIs z#Ts7x3!gx?SeLyFrZnHbgJVQMi%(np=eo@}w~A6->st2b1SfLJ5KH2(TYt6Ahi`ct z-1T7x?Y#l;Vw*U$7zmr!%;~!)bPZc$w6v*3C8?%4Uh83oxxKz-(?c+ zBKicgZphkl=J)SQ zALTt?1kk_9ua14##WOMxMOGiAveDa`Tl|rK_)D}&RjGK*v#G%sfO3m4cBE9m8)1>4 z_$VS`dg!#9W`+8Zu*%yFFPizxd^spCsXGPwNJ&FaJ#aUy3swAUG=Jgu*q2NQJ+>Nv z-dff@6>EBKqc&VfA+uE}_@xM4|9s|GyTr+u)v4t-)y2;#9~7q#1RH1FBW`Z*8*f7< z8ew(){@InWR9Rc}g>2dLXr4 zCTcIX^~_m%@$BsE5Xffh-{)(h%LG@|8LHP4wEw5)9q`eRky^!pYJ!4bw#d(sgeTCIODZZ$lbE$=h&^)y{CsQX70%qQlqLXs1;c?5vxahndNA z-=vwKymfFgl0Nrg`Q1|x7UYW`SxUM!>q+S|v?mlr)lJ)<+{wB!?pEZ`Lw>ZDi|twe zHi4G)N}7#*kcm6k`uoA8#@j=6k3AiW1Me`R|KI71(SX%ycvc)UDV82OKr>-s4+a>C ze9DCZthMFpv*v&J&tK^W`azJBy-oFwWK%o-i*#Bec z`GDB-s0NVNu=}p}hGKsgY;UqRXMA6#8fs|2Dz0zcpZ#Xu; zYCQMSxf^@PAMeLjLL9o9$*63VwcNi?Vf($Bacm`QH(p(5zNPOZRf=hGM3vd;hN~BT zt=PX_V(QeNEi(ohE8{I4fQjI>m**tYXGSBY`V;huU1itGB1mwkPBUAs$L5CVM~p&Q zjClMNbG|sm3XkIH5AlZY;-vPXZVpPd9a}Xj7tJKZ#BHu_IgCQf>UTIHv(Zu3twihmA}0G+!Jd_a_aPG)F}g8>7{Xg>vyTCOs%|JRl5v>uA8 z6dbtURa{We+sE)l@#e%9&{4312=nESry)c`6$na0LgM=wp?rm}-SWqki)vrmfrIiI zz6^2W2x)!Ph~Xh~C?!p(hUQp`9iUPB|KLpFD)mnaVdn3^TF}@&F@a?K+5E_Xm`*$N z@CVU;f}<KhsN4GlTYLsp^k6~RtnG&*+D*VZTRL{ex}vo8tUDW{!qi7 z4donHawZA8`VdI+xSty&9}rqwQtLT5n)K!;Pe10~{(20yL0)e`DSq=dinIcHfx@>JSQML%N zN{=GCc=VL6_iFoQF+_AB$|2va*=?Kb;WupT{u2FYm!U-n;rRrWmxo8e0D&U0(sBe! zZ=31TNsEGaB`lAB`ddMC5TZepnAW!*br;7zcF262WGK&MPs$X-vv74Rte`b)uyO_kosQ}^7FHpkDH?4N5~ z97^(y+^+<#sh0^*l(m0&b8^12-7a$1s?OFIrh0nh=#L;d;GMPfuYDsrgr+CwL%;u+ ztb^T1G`6Y9yFoFtB~oIj8e>mqPiP$4S>N=ic}>9*(U}=JIQlz$_q-!lEJz(4;_5^; zUGuKis^!Uy-jj9YMNK6~xh=`g0slF;=a*4>t7lI!g*d{V{Ui!ty5p|ycWEBFtYz|h zY9G9Dk2?2=I9wLD!M@QJhoXTr=_Dr@{yH#A5iX9O2u0O#y!}v>Hvdif!R@`~&=d_o z<#eH6sUiV<#w?c(v!DZb>ghs){7m})Y^dD=1es}S%t%$fAFI=X6P<~288gMaI+4&g zp{elJZ)t>}68>n{Pg}|G@-}v8!04v}YE{L$M!(3=EWJ+^y1OR;KE` zP;BSNY{UMM!abSurQgM3NhfOv#R?0&0~(q=1kr~{Gd)Qz(7k-x*~PIn25A|+1KwSFoq0m?NI1p24ah?u_m zG)-M!1Q|*sslKC)RhFb+@H+Dd81*wT=G1)*zBmW7pn8kK0NRt6aFHgwpTFVG!&cAk zR!`@yd)u%_$H?_^h&d{yZ4gZcOa_QH+kRBRH5o$h06Hr2C{pb9QvC$caf&04iKSgj zPhCyzYPR4Q8M!l|=G*&P{`*5x&@&QH;X$qD* zdRz2^HC%d`6hDqn3c?nMbRv`xil_=GP|!6I1T;-mM9_7dF&(!u;IKkxFHXYJK&V@K z{P!B!?$fXdPokG~^4|4T-q7Xp8f-orsYe923`^gTN0g=;U+p$}$d6D4a~Pg`>S0G{ zL0dHV)GXV3@)(XGWrq%Hn#<@fzPUytO3tdxeV0e{VnryL+#a>Nv)T?RA(EQj4c%t* zys*9V`xT1p+T1YuJs)OFQN*yrwZmAIOa&@vOl&vM@S#qISY-=J2p9W6ia&v>CY$_< zixCgP!j@ZhUg+1KJ@B1>JD0$+h)Ley!+dzTBKxBxiUyMU)AI9kTKmxy-@!p@?DqYu z<3@Z4*C^hJJa4WhIIC48+BzcmLcJ%_*d3`^?{npJ|FGe!!z8aS?c`2@*WD{~^9|<#$MAZGnQ%a>XMj;ySMTZWp)ss^Ro@H*q=t66Tu4Fe zO`kP=Zx#eXGQK24E)-y>&{~r~+94#PgaM3NRtV~lGseV8jNqz-%P$nK(`@P}mZ+ri zFOd^Gu!!Ptl@jT{gPA>x^}Y^;SZFk1zQN;vBup&R^GqRDf=>4KD{X$TXzmeU&r6)5 zMeQ7=r5dObp4YdIdwmNjQe)Hbny^#YHI&2sLp!>-ZG~rIsTlnQ?_icKi9DCBA1!G(pQ$i z&(aJl&DHE;oGWboWzo?UogFnP&W2ni9W{LfF*g*dUoACm*z9Nq1wVYjQHI)mvOF`$3mPN(;2?UhzB^hzHlAtOjYucsp zR{=^9Xk*9_?y)Vc2&wtqNa~+B6i|3Si1PEqf+;16;946waY@~i5(l@Mk>zSTaC|a6 zG775`z9rNZ7Uj@O6To|bO?65O1)4Cyw@Ruteh@xL+G4}Au1YEBiKd}_O9_msEV<2m zF3gk;uVAfu_J9lB4cAH@L$#w}j`A;K;}PS#HzCf&VSXede^FuuoF4XweI*|`KfW0W zR4cC3-?Zbx%tXn1hCZSlHsa5q+9#{)O>B*93*X-Sa%UUyY?6s%j0rz3E95vzY!|3@ zXH0dixv+yKne{Q#X$}8$>z)gVJmgL~NzA-%sJloR?OMmW{_v{!NOb85FabaGC|Q`7 z8ea=3KXPYPQW1xKLKmW`nK-E`@yKK~A$0hogKbgQ>BvXnb4k`jVhZUld0%|;6XFk; zA?P)lS!pbQCNDx~{9Znfe|&ZitNo?}bnJ8;J<9*WYu$w+cF_Q*YyPxbg)56AAtEHp zN;djBIB?&J4y%Ur30yi`ohtOXIqA{^&oJ&iAMwlSgtn zM!?2@!INW4)5B`2h$9)6==&DKG$;)0rfqIL-oCxh20{(IKXd4)d#y~cWVxz>Hj!qV zyXbz5RD z=>LY3?#E|-e`|R`xrTsDck;(^z;pIC!b8;vxgDfb{a&(5(98I%dS1D$Yb1iG&YdwJ zP1xu+pDE5%?4_yPm2<^K-GU9#1YWdF!OA0#%4VsYE(iZ%OU{{a445@=;_WB4h19_r zw3swh{PB~Fe?fU{VY^MqXcl*+t3z5&r4V|F*$|eeq|D^~>Xbt5Aoo9*$drRUaL2!Z za2RMa$%@BG@>TqG4ut^h<>``N5i1BNR$hU!qxD{K_e%}s%)b=%T#xRvIyaF2ZmtQV zotnc;ZRYqX#{;vD+w+#9@1qr0Ny|_3S;9^a_ZKlf^Jt42q}>ddr7X>)2z*XGaAnS` zADn%Yz7r9NF(%xq{KHY5j{3bN?$N0&40D)hk`k+Y}(#C``=yNkng%^?A` zdV}Of@Vi5O$?#8Pl5>h!Tc}NOkrKLlE9Ks&0S{1Gz`(Ac89=3D_*$dw1%F zFTZu~K7d(xU+_lI)XK$gATf~HzZfS$z+~j!1o!itiIjNn@FNx<$bdFJx<8-`ch1aD z#p-v;uxq4NX0eeqMGrk2!#7x`=D4KL1u4CXKTos3UB8oq59-@5^c~BIA5ISwnH}zJ zGdPr_TuVOue1sLiy*^NsiZfuMXKvdp__7-@Jg{2sx3|!u1e;qw^ri;zEYWbe0A2J{Psq z&J{{~biU1+>Oo)BDa;cN2OMw*T~cn}l(=PGgAv@SkC?S=4sbJK0!C3d4V-3d3%0J~ zSBB<(2kzjiz-UoLi7D`c*-0Pv{+Jtt5l61iZ;@o1 z6ruQmXkC5jX+sC(5)^UWIgJL40itoi(aCUMGl#7=Hl=pUAL5M2PkW=cK!*g>P>=oXtgrpOw|7TsKJU64UhM}}zb~a~%{yPomTUg7 z-{odB2a@^s{VNu&cHzw;zTWy7OMUj%6?#o4rKh(fXOxb~AC4F?C|i`}L?Ux!)1-Yw zIlueXl|CW5I=!*#w9?Mk$u{J!DR`lx9h(gL^%k>a)3c;;pA)gYL|F_*L zIf=4}?;uH0wrAt$SNoHq5I3{;TG?N;yt7fG7AngZta^XQSpRrj-L(^8ZBOeiXK%7s zHs5y&mV`z3TsJ88-t#s)+YU4f&k2NvpvO=p+nQ1e$n=Lvwl7e_Y6{0Q;k5lZSf(gO zn1z!9@+uM5?*c}U>||&v^2VK56B}6a5Od+bssSf+z{hj+$9?TbIKbXdC&@afi|29W zM2iB-Cj=zL2WZkPF(g~HUF|0e9XF3CjfmG@f(k$;LRSNqS|k;WWGF4Fv2!DSA@794 zGhZU^Q$xnsrITC7^4W!O4xPE#*lLC59IA3is(ddAijRGXk%Drz6nhTt`fqSL=O^^- z+lKhLt-7^^N|@U&-}UnmU-hit{Vt}EGyu%3W$d@4A4pdyhP|U>X1MKP_jRP2I>41U zlQSA%8%jCBz8wT~h{U zp}C4q{6Z^~rHYZ=>$ZULL$p?3e?+;I|dd5Z<5AF}B; zE`Q)N=X9nfclrBb2PbmC=#q#mevJG=O*G@2PvxYVrjE6>E8NGri4`4glJHXD{4Pf8 zu`YtbgLAj!X&MtG=xK*E(Znllmew@E*s%u^Ny!z|2lEKh*+jfYgeFJ6kkfZaWr~334UbsVTuq3{yXiTMy87%j_&NAe80K# zbr&ecB&jB|1>PC-G=zojwTas-E<=Ziz@kG!DqkU?OHbxC5UF-i6HJ|EGkot2bmanj zed0G`ZrRjFK{Pdqvqh8)1JKn&E%9q0+ei4FCHzp(5-5&V4oOQ_Jk(y7*0W3o6B1u= z{DHzp45c`DS!g|Vh^f&RuZB6sW!uJQA@^%M9N*Jzp+S?l*c=>H*Zs`j-cLTB zBetft%p_upf-(?3UdsYs&&A%$dOn2MjUZlq+C7v^Kj#E$4^4Lq+^#zG=r7~4^1U_jsf)*BL#V#!uVdpN|mrIGrBS|;91o(@^N7O(`qu(XPV|z5aUlvLrqf8h}kPYYp<(DW(JKtpS1{xMGP-p zKXS1h1qJgt)9{FD@zJ}fEO!0ea7vgHY=P7vBJKz>Ub2CUq^f*MY##$J zS7z*TsvuT0~$E#wYDV0s3l_z6d468 zbVD-2a5dBB_%M=Q+IIP$$A$hyh*8S`Ghi0ajFyr@5ZRmB4LY)v4Ig~_#z-N=9X|`{ z`0HY&U|tIdCH9{4ZFVU4V9ft%bHMrcUxg33?hi4VnV&AXf>~9Y_=y=}as0Z&3bR}0 zxh)-dAt9%!cIAQ6bx^iUiL#Ktopg;$a*YOstgGWd;id6Yq(1MDv3+MAHz8ZZon^er z8*#Uv-fr#3Gut&^;O&-Ky%#6}nVAfaVve7LJ8NKbKf?I-cRAAnG9n}G=wTFuEjv@) z-2_C#Xbwv&nNOl;en=sxdV>szaTLH9Xb zyK18xwuJtt1;}PlaYkmWPq7X*X_8x=QzcPph7wB%KnDvFH?qcsMMLwWEqWkh6+&=0 zO?&f7f^H8pZqhWy%5@eX;ZDCai)-J8jmJnQ@nr=5!9ID^u(Xy4etIaMiVR-u(B69k ze;##4*A~u=*V0|(c}j-cbd$9CdNQ-A!$-wc*L+N@;kR4i9+?trT%Q|w12P|;=te#l z{dg?AoIWFv7UdH=$nL%h$D4LSee;Rg#te8rUlz()JFn+!;sJl=(95>d{XVxz&cCP3 z_qDD%%AeuP0E#kOY+F3AM(I3JKm5wBIj*F_ILF`o`tY#3yIl(yrM}}mZXtSrlp|$O z@^LJ0Ki#b;Iscx zh?+Qve&lEvB*Dw=8F~s@D=Po92PGTQA;e&6M(~uY#u9DiGtcDsV%YmRl>BCVUV%Ny z7E9(GmcvJ}Uj|r9m*zMRVMj|e#eXBJ&J7O53`*DnL_yl~EgEQF6Ip~UUM9ks)n8I5 zNj{j>{3F<=m=a~LKYX5Sq^71M*8Sc!`1-K|$l8GULfO+$(czGJ`S~g<@F<`f6eOiO zY4Z3QVj12xWODMEC^87iISSCC0_Vjt+E=_ks(V!Rh-DpucTujiy05ahs7e12JIY~J*DSzyM^?QIJ! z3>0V*e0%3@Nz)k!@}{Clm+5r;eGM>jz;0L=O3%gK&_DH$%I}su^77hR(`+246cbIA zxCkOT!7Fqb=^wXJV#n%XKQQfjltk>QU3?Qu(~GdEkIVC5|5fB#p92vZvLX^`0?zXz zu-P|IMygp5RB)bMBp3t{Xc63-Gj7`2b88t%XEFj3^OB1+&ADLWP2EnEvuoJx#|rar z{Oh_S)w{6Ij1y-FA?R5KH!~1uNAV{CdJ=~6KktxVn}puM1$}>s8^8nQ$GBlZdVsCW zIr%A|WQzpEqyxsXxB?}JID%MaRUczS6jnETXiXDkR~nQQjcgt#BE)mGUzg;S|IaU( zS3LR5jCOw9-mi0S!RZhTGFo!s6h^`=o7 zfBK8IZ?PzYkqr#v4bpgBd9UPuY?tf5g!%1|*5d3`KF>FF-fU@YgQs8EIJdW8iIMQ{ z%u}PXS|vS)tyHUFMdmw0$zH&cCZvem8E2xG`#4U(-t1jI^sgO{-9s!d21>tv%3Ftp zJ!Abv5C(cXQ3P*-K_cOBg;(4GT~G$2+KgPU|2jv~>ws1s8{oXyv}sL53bu+vFCIEB zpTx^>GBhx%8Gb%@^xfVRmz7yNB{df{=WEQ{OQc_5u!htmoc$v2YicULP!{aG?Y}90 z$T;|&&^JMb(Vvg1`N8PGEGn1~>MwJ{DqADqTpx#8b`C-NI!>XZ_;4${iP|)MB+n#C zrb$cqKPOQu9z7-or~jMP>diO4{~eb9Q2zHD(e1-*UqD2m8{#y9`iig{Vy7aGMX)PL z3dkrkFselcwloEH2f|{jL;=k1>fJO2Lw-PyOXaf2PDoyxGQbWGCS4A}#dm4>N1)1- z&qx%M2NJkUN(biXko;bbkl*e25;Zjd7ZnnW|DLo`pH z%(*hSZvd5k;6O*l!6eX_;iF^Pvu4tvZ{`6YuEK4s6(O(L@7MF}5054l?}qi74I>E# zdTPQ-R(ZlwP{go#`>4tP3)VS2zNg@ppzk!07qj^kMPd4WEdQ<{FYp5gPJe$g8%m$1 z*N?}mL7qtG6ppL5RtE(ITtEz_vtSI`g}InjEs=oEcN~C7I-^4bb@)%!QpH8yCAnj* zkLkmcQR*Sa@(^Ku|L5M)=LcY3*A`?gC0+!d8M1nU;=H^rk35HzxB%z85Vvh%HX|>a+#_~JZgp!e$;p!Eyt+;m*YC_b$+!q6 zDF+JC%TlQixzdGxwOubi) zU!EF+*TLM$LUhuRQ&MxdDv=i@@e7Ee?g~!7ZDvjfar{`D6U~_Wn3YkL`+i7(vT$ho zFU#jsys`!RE6}h#I8|zW)}RhRLcWAwi0g`riN;qBW2tz>_(fy*_3T&fzUsvpy=!6e0B{>x=ls3_WHDtlHx5I1WO;ZKzf~_lB zQ1N&11>#a?$yB<(oFEmZIr5#2nA^h-m|yLa>ph3MTyc9`Cc-L?`yYj!Z@29{?3{IB z6H3$lBqYlbjAo8c_`lz;U;GO$_4~HBcM2WUn!ODRk0xff98?vpjT33sbMe%E1wQVC zR^Ct|<~;VMU4B2C9Nq84)D!75C|SYU zbr&Up=*aSQeZ$JQ#$NT4+hrc7D?-U0)D0~;7bDj0o_as@7Q#i)7!+p=5Lgp_Xb4g> zGV24rRpyXoVVSO-dN1r01#pG+Uh@GIRM7zGETIz;67ptK>e6|3p!HOMGaKmEA~5W$ zy?b&Cy?PD+CRcv;23iVBM}}5_Sh1&Wke( zNPaxC9frd!D^Z#!2Q5&VB$MwY{~2!M3K5yC?Y1qLX>K~)7&40wB|XVlP;=V}ieAU= zTBRXT-u}}y(^q|o`7$r4vN1|SvL#`GzPONR94U2-5jOcA6|NrPTbnO-bEa)TTwNu0 z^SJ8m_q!Gz%}qALBl5P7sYG6n*TAFwLw!qaeaPn6yRHwd#d}{A%~<|WP-AlO_{k|! zu3Rl6BNIcYOZ|`g=R3RBmfY=j3w;j?VoL6B{~|`nz_U`DwGOTahKudW&UDyxrM79T zB?5%m=j%@%3`Zr7BhvB$nSOqL!4<(5x#I~AcKyDoS}q`VSuEU9u^V7z5fgjk(2_-?lu?F+fz=)c2dbB)U4KiI zV~3Xw|JRZ+$^BQW-#&qaU-!PF?R+b4uIbVfnA;}|4IMR9ihFmW_Zs!*79OliU8IaU zJ5mm+a_e|I11=2_6A(eMRnviMssoCTp|R3V_FJ2jom#zAy2_PZG!Rrq%Xg5=Der2euGu3}r8? z#YmkO5kCua^-5%c8X@aALMcD*?raeaC_;}B6;V$}ZKzPiZ6z9!9e;>7k8mreV%g$= zZ7`7KvGk;)Ubb)Iq5lE#aWA-2TtV8fBw00?u@Rh|J`? zEdbM<1v^pavFM_;UskyiJ?E3~$-objcbFlyM)IS>=m0 zOf{WRotfnXbi*s~k!L8Uj+7MwMDRJ=qqp90_$Jw+T$ZNXM`6p*Uy>) z2f{-o3MQ0c`kjHXLyJQ`f~eo5;W?YiCk*0}?3oj(ocLLoKrc?&p`p6qwd3L*tH_q7 zzhRH-yl2X*P^GTtZ*a%jZEA3b2fR&h9#nV-aG+=YMev<%@ADrx03Iho!rQ&~o4XhP z@0ZuRc>j>^{ZXNTc)wSh*N+FT*M4NdQTr8<3$lM-fQKvLT(rG4+TZ-tc*cET!MP7Z zjDukWtI(KaoaJE}hQzV3=nH1;eyx}^@^pxGE9yfj^DpSd5^(8rib3I>u-g(Nv@Au_ z7`v+LQ)2X$;c78L!vHiz==9$9&lB<3(&qBRY?{t@f<-1S@}?6f5gt|x`7|CqX~i@y zsos>u(IRw<1;tWC#<9(prB*Foqxj5L56m2uXc+a?1;8^8ZPt;k5D$)crpNKfUIc#n zQ>w1dtl4z8e9q+4N;@_M;DD6AR6!7|KYRilai7$9p)@bEC{^C$E+d+~rut!F>vDZ; z!lDt0idiE2GCgxbX@$(|L`*ki3>K4A!4`!upRCj;n8j33%*O7BA;?7-+Yk2!7J3JT zeTo8OAAd}ylK=1nz^v8Wyyl1=r(4tv< zd2uUJ1X5I3DjKoHu~|cvaN~g_f7+rloy;KF2PC;}d)xAB_%9^-V+ako`8j2*(n~ry z`{9Fk9zy|D(~_PMf)@Zc(KM(EqyUJ8X&D+Qy=ZJg3ZuN7$8nEJI?gy!IijC)S^_#} zF#qJa8zLeTYU74^st*>GOrCwk2MPaAL z_G!_%`r}^N!imRb-KWAK200ONKN02s6PGZZR3p$L_br`Rv=XKaXW3H+)Tf4ySdkMX zH}M<)gWe);+d`drW+9B_tQ_EC@%R!oQSV+76J5*$zP~mC#uD@_Btu6pLbJY`l<6Z7 zy+3zK@~|7po+&6>d`qYn@sQCyg33rcSb6lsmBBee5vu@i9bITV66l%ryIIb};%Ltw z(R?}@zAk>03SsI(6@q|O5$_;HFYP#9ZWK;QKREpet~G`8d=SUw>hz_>TCHGSBo6?4 z#bail)>@RJ>WeWX&c_jw`54+vqvH;1XN$Y5PKwflKQ0v#z=0|_wur(Tki+jV-u!6+ zZA03)mkF}kvljs~xD5vZ8RVo#E$n9O3POj^QM?k<^)BV}{V4@}mk)($ekL#8ueW=I zzIC9k#1}rqCqn^2^Y|$YtU7P~we=&+h2y?_J(G2wr1!kp$Rfv87TQ+=>IQovt}1@$ zzFh3x#yMM4YFK&9!V$ehhljSf{I;UgC9@3X!4fXQ>cQ~RsDrV#!P;r6_Dm9X2kK&j zzZ|1LxOOHdXgO47X8>7ypX5>n{lt^@t@DnBY;)PuxuB$>1|Hzoya5~;-gLHT>{FEU z#8BwBch^7szmdNq-ovFn7Mc8jI|D|IvJ&L$9B%(T(RKU%-Lotg=F0tXGG5c^*w~>) zcezAnf&W7s91(OIRK)TChAqR!F5P92j{7j*U^z$)b%1w*#;lUI7rk6!HFt87^e3hw zOH?Wa@!?T(f@aup?88{;34kg;eE4&#i#TQ*UM&o>)z6@))Q#%E=ODEKe@8COL73AB>77IB2vz7~58{f3|C(I<<7}ZD3}y>2Cev>Ql@r&1DdZ5s^uat8>?YWfDcf+9%ti-*e_aiXTh5&!_Gh)Dir=dSH^ z4+_59W4evzvJvp_ziNV*ux+E@jdIiPgU2KU1ED|%BMo}6PE9`wgjzp1AVg82Zd3^d ze_EL(E0-LG{2UWz5R+_oEjPfmDz^+HHvp>ndXGIzIdXqaIz`zwv0~gwj(Ul+`k-804h8|dHFmrW=@1bezqAw( z+nK6jh~_2w5oe7hphQZNnpW}@Ij9*menEAgn}89VpT0E6(_Bfa@Rx~=Dwg)(C0mK; z1r}~VNPa#qsqXDZZ8)t)ykC4Kg70sosrkbZa0tXtx8prwXTtKyLoh?9vBW7Fi`Zi90 z^3gXw-UIpg;SSW}CBD7OpB*UznaIh*BmBKfYI8?u_wEj+<_c&8E=X|_4B$nfVNOZS z+!Xuqfhzms+xk&R`>bDdmMmXEOl)v+Aj$r!9m*mc11dvg2pW<1vhVAl74!)bfD{4u z`dpRY^Zm5*^~nT+57L`jRH{|;xiZHP;~3iv!Z1383kbfZRB`4xrNMKp1>Gy2{X2M% zbeMhsXBMiCXpvifPVYk{2AsNcNr%|%?+VhO#TQ3=!j92lUxq2$+(Ns#Yc#JlXGMUT z0-)lQ;!oeHnAxtc3GeO>1b`^TPMR|IoyaF{R?s_ibatmejT2u@>Qo)N6g{PpBvtyY zJCfUZle=^{trfbtH6QSd(e*vBE=0{z#286(Lwo^HW}A3|2UDQ6p%T0G(9-D0qe4WV zKeEY4tRY#I7kLCsLW{dN#Nz2xbEanI567%_BBYl zNl@&6Qx`zQcg)EvQfS%Ie^)xnWxK^ur)5f=P4}Vhy7T(BEpP3S-^ilVisKaI!F}_r zAZvx_m*u>3R&BnQq^~VJeWBjLSzmfUlxF$Iv-qaEzWH?Eipjxfb#gMGqR=y`+kC%? zsy{U;tj2Ury0mLSVQn+G)Ay=iz@4)oTXuz}#!@gdwX*SubAZ7y)}4>D9*}NvzRCnA znZ?PC#XQc8KSnGg{!2s|{p{T1Y#Rc48qOH3!6@AJ>sj3!jfj;z8Z%O|pcjq!zI>NE)0Ol$}^o;O& znFDu<{8XsaK;zm5vlbkq@w(NtCxw0In4dJEkpiKrS50erxVW_;6zdNe?z`~r=Vd!K z;h@LCQ0q`jSVcUlnPRj}Y*1h9Jl$V?1)3R#KoU)MDlDXztqOOyG{YC(w0U{v8)%0JcC_UTSq5Qu??N(Y6I)4iLPD7% zBD#C6xN}`%_Lj`Hc_;KFk3ATL_WAG(@B0q-|5Nw1>+&%HY*pg@uAn`ieuit++20;N zAqu`(|Eo=J!MHt$!;r+guw?Qo3yuU`;eiNQg zW(h~qne0C7o^xU-LI2G<)+N9=mJG_%3D>XGooa#fA@>QV}^XL|z@4GKkJTg1KVOl}% znA38aeJs}5H(yOgDe^HlkA5~6f5}CP32{p57zA>z&DRF#w$V)k4}pS#w?a>i>(+A8 zWNo7<-{O~mQK{3fth6i0(j$TA{Kt_icI<8Ov$1dFo#>Ja@1|dYYx3r*xxm;?lqt$N zaR`YpLm>I+4XhF2;s4!dcZnwfLBH<7!2`5wqWme#MWUO#yX)<0A5Ug$T^j)B&Er!Q zm*?lN@U3YZ>K3t;D`0c`=sDDIQ|Qg92s3@k3+4tPk?ST8Q8%LwiKqlmTA%wDy>-Ns zC<0&FhskcXLxje|w`qZ$oqmvY!z#+zt9C}RzrKq28Mj+%<9p8(2s;?+w}X!aQJm-E zr*zQa@c(F^9?l20bH6I0zAdg`TH@ih0wu;AtikK@++}Np2_Wsa;YX~VJ60pk{DA{xRQR`G#9+k=^0JciLi($ zg$Ur1Oiaz>sv8=#-CM5TCvw7SltA!)dA#9FMC{F{hDejg061WmxtQn*S>EE7xKOc~ zGk#FC$wEys`&mYKe2&kf%Ny^mE}c^I)9j&L^mF1Q{UvTe$1tTR)pj?;y)%W=f_oy> z05-*x$S%~|;SCjZxe{GJA^2(1CMW((B8Jk*GYSgY zAWY6RHq^&I`#wHWjd|by=>!pfgKXJoVmSVHI0A~hu&arc*i(o3FBX{e0#eNp_lc&B zCl#Rgbo=@mG8zuOxwCU{{YCiV@zU<^`R8*>fG{u4(}#C|?+(@jS;^CrcmL}SHeN{} z4p$Pn!40{qFW5aKWZUn5T7aW^IwEZI=e&nuj(0I;<6NwOW&Rizd$!BHz+smSj6E08 z+PVqqx=NeI3W<%mTN<*YV#dPcfy(%0VnNHMJn&{-pZ6!CmQNx^abSxx&}NkFOC0g` zXQ<6NY<*e}|jd=G`eOu{CNGsRTVv;NV~jEiW(b6us~QhN}ySi;JthqocoSrS9(d$)?-S ztaqo|D_E<}NXKf3ZgcYzD39yR)sd~?Eg%b0HP1!A1`YYE@*Rj}B za6N*e7i52I2MK?4Dw?zbA;VUNqr#N&R`H6!t0%i{B#b!0zb{y&`1sd3p}+!>`Zrfg zwDat2JYZ3Qt268wILY^qn-%)T&-Z=C5&ZsO^Z5#%z0EWrxyy1dFbJ=`nDYCfIGVVg z!dY_vSb$UAudq-&u%iJ>*7Dt77=V!%P0E!Uf7+31xvON1>1ucc0 zNzT2r%x?NZ8M&`aw(uUyDXIKzBW}g;D0$j_WAZ&eNmpriHB{7c4f++zq(!K`N)>~) z*^{ji-`?;)fw>BKJa;|0>~S$m(s@q~mQ0P2V$t$EhC?3n>eo}@xhZZ!j=7gp@7VBg zvj3kN4odmFdWItt3GIJ<5fTacJ>tm-0hb59x;C5SJpOr-2HiqZCMa-M&K;;SfIjIV z@fMo4B>UMoE2~UgIyGU9l48&yz%7Mc9Sa^b#_cVyk)RR{rZZfN=`jPnK#cHosMXWd zMei;SywtYvjo*rQMke9d<8BC0y04`{z;-07z`iedyXpK{+*M9|TW-h3Zl9J`n8pIi zzzzb=3`E_qcV41eSZfKLGwio)>~yE5g3(sM%eZMqP|C(w1RzIo+a!^Va}{XuJY0`e zLavtD3uV8Bg#s-RhEqQ6)>6{}ry8WU5`12tjo}pK@2}3mjv*K4I^~6w$R&tr`Q)5z zh!+4w#`XOU>FpaF6pOzR;@^F`h~H*$dH@y`d;2L_7(6j|kEX%t=~xd*Zk&8{ub$bn z0Q=>nwM$03S}HxGLqHF!O4$kzMM=mNmEWjlEW%7Fr6D<$S;<08q1!}c54%yN5mR)& zA5>1BCxzOL{wr3dpK31CG?$dkPWBB#>8_^G((mnx?&~$5jUTN3n|YG+OZ0WlkChiJ zsW%8U90HzxIO#mvh5L+#vUE4$t{Xa=c^{xmOu=KeQEB`*41PjtPjn43)(d^7#Qg)Y zTs%i^uy#3VlVnnSy(>I7pF9AY-Szuxa)*dTwq}vOf!8a`(M{NOUFr@nFvlaJaAVqj zx&g#+my=>Jg?S!A9GHS1`Ejpzu)hQw0pFkX1e(>XSo}2L3bpP=JGIIQXr3Hvg>en6@(c(r4eP`#YL8wvg>UB6O z_rP89M2I)6rxK(LuemS)1FemAVq%V(T$uq=B@_qwxBtKr!Dy1hk-d-l!k$2> zoxo^UU}|RWCnrh9RM{c~P^_`?xCTTupSZ+bBCYU~=D8?QWA~$bW)tM+ipy--om$GI zB^o@0ClD!eBpdz4Hb=XgIh8+?(sDZc0x%C$h%FHI&`oF{%r-D$yGd2)Pfc{%ok^O|Ci z(Bh1vOHB%Y&7$1dH_vQf|(ewS%vR}qrFo8 zm%v_T-xK&;7PhR_uOC(watOPNCabnGraJKhjASjS1a-=Ri7LRb=~KqN5aU9n!~%>q{Q|KM&#LZ z)tnDB;4xlcdG;RUe???jKnqEpPrJyN^XUr*ymY zNeF))8KfXTen>EQW`t6G_7)iH|C^f7%{s_jMT!1{mz0f6_(ij0ZbWCjOMv`WyL8R< zTWkzATo2YK;$C6sf6RIhPQ5|lZGbOJ9i;aY;dbs(FMl{5fr)k5tE7X`x+bd-%W|;Naf219M)}+iuX+} z=lv(r2d#L`)+Pxue-B*dXP!9B7s}5qGtxSH-OmAL2qQU9vI&7Ha-@IbON$O|R_QI( z{otf6H-KU|cKxQ5*1JX@0r|VI-D~)flLStK?UsSRplcJff5nfro)Mo?$`CD(jZV_y zJ1_<>4toX%69_VjYUp-<`ep16%=I|(0@!dGSJrDCnd87)@#Or!KcRuM_ZMJ%@T0eI z{qY|!lf&;q;t&x_F4k@X5xYSumP+Ov`Y~RT0cYeYu1&T%WuE=DL*K&cF4B(K&>GM* zAEQkcvW+JGTXH$wdjBNI!$pY7lkxNwmrqCwTYxtBh@IQ&g~}LtQGWaNnDFxUzS`!Y zNE-y)Go3bvCDT2-ePe0CUC6(ja9imD9^zV%nidqKYN}Xyb$JkDwsUV0#56{IT6NvV zbOUURdj|j@0sB|>rAO1yLkB7`hw4a3b`nTE*kzfGeEIcHGc^QdJ-~vnu$^#smzsTEP}x z|4N%XF3hUeS@tO7VixumXOGTY4jdVM<2b3MNf3O>@pA}h3_(>OIxr9;A1a&o^iz%z zfB~P|d?+0lGb3Tf-jp2)5`!*{Zp?u18U^*R?P|x{cN*qw3?wDotiLF~WhQpNj*xJ} zb$IqQ>8SN^(d;9&O&rPFStqEHu7WXr!fc=n#Z?5?bOpg}EKPw-7)Y_NE#u7GK7rNiZg~J4|qC2 zfsOtGNjCcR`RF(VoMpQ1=m}VBv+NO|%1-ItQsBin8)7&+Evx|pRcu!)_A87rkkE~y zfZa)cuBM@cuCJlBf5QdQ}HO_q54isq8Ap zK}vH`80q797^g8*XCS;19EHglBY13?ZF=hUHKW`En(z>iK+X8^o)zJzYz*VLh!9(= zaGAM*-b0fWx6@7nX+$I#A$m~1qu~nILwsaO*f}7b<#=XageE_TIPz~5hvg(d`tK@w zcc?{}y^J9cmRl&V-zBt*CAdxLh#By6w&41$-RPLbBiVtUivr*O#Op==_v5F-=OJ>h z@h~)?mjjjjy`CHdT-Pka`|{Fj@LoCX0;=j!$r{Bj*j`MGrUbELaQ7sIZRD^sRD2|e zbFMST9ZqN;=~w<-S>y7b{-v9HRwol!%j9zt5w1ja3Q`J2Q?1J?~8`(l9raOj%FGWiNh$j}8O7^l7>Y(hsgC@Xj_hQd1R0?2rbV{bXSjzwircK0>dCdQE{ zymWpmPVx~4l%VaG+&8@n3Gc>|(EHPeH z$jJ>$?A}fd>t+>I-90f;erX$nL(=Ss<~k}PaOV?U*?M(;En29bZ}u>KoopGixeQ^x zvrOH3FCvDUK|r7~u?@&q!X9Yb4Ok^r-ExVoQ0cQ@KE})=3OK21saDrpQ+B3{3kU6H zfg%~*PTl`$CZS_H47&FM3bOnBk9LjxCpYm23p}{e{4Yf-OrgP#k)FYqF-$+p@mg>w ziT4iR(WKxka>vG74v&oU`xQSe1?pZ5NLzWEE>s(2e|yH+Ob>s5MX7oAakK!v~9C|lcITZj`g}I z;v%dM>i_wW-}@cA^VY)zB8W22kiwGEfjBI0JOUuL6c8K62%CfMI_yq)dTiP^_10t^_g^MO* zv!z`QCqBvppejLntPf+6&hCcuFO3T4c~~uo`=#gZId|t(n1B9VMe$%a3BL^>L&ew? z=)T)k!0^S{mS)D9;?^RsMULzJfyxTP54X7+qwStrVeq0-qUpF)m$&2OpRoIjC@P)g zS60Mc8%jqkzwra=Q+}0<>uk)9^-9pP-h=Eb;Tv1^p77_=%nwvu=r`E(vo`8nWT)-7 zF2?Ng4)J5bVUmW!kIGnU8eeXb>cT=2h^}w@MeDwS_1i!b?8s&plW^i?=+e{ME2FRK z8b9iYd18a! zQU0Zt6cHbX4gU62%9ZTF>#G$v)sFd${tw>z@o8mDR(gnA=&PKl-q z%wHdxcXR5%Tpo+CZ#B!mX4h8DvObwY-%4?z0*kJr5gLjLiwO&}h+x2$OKgkmjLhAB zV=h80w}7*OXP+-r^WiQeMuZ3UCR#!JemgcTR14m!TQy)J;FgP2(<7deAaXQcMKm~f z5zUB+zYF({NZlE@^|!gKQ=GU1k{=$u`-1U*Hg#lauh|kn5BZHG#TQC{g|~Bn4^eK@ zv;0{L2s!=Z=<6Fi7m4Udgu`Lv4!QE!$%21*Gu*dw)rBgWfAgPt6b3y!sgTi zv{7A<4#ay`>5d%Ay|s$X-32S=oZ^WKgMRO9>Zx0dG+>OSDlCkFgbJr)2WZy=p8;ij z$wogPVXjOL?;*Vm^)B`FzpS(qG{Bw)b)xWjcuK!<0P+=|kQvCvy&8({3nQQ+6IG8O z;%#`bB$H4FxBHwZ9PIpj(tc}xgtnBN)ENEsa!JdjuwYdt*gE+n!yW-20%P7J)rPx^ z#bBMbJ)>Z)@~UgX+)0bK>Xv1oX3D(iCF{Ri)*eQ}m2tNWrqX3`pa8qchLBBBaXXit z+!H6b)YgI|QtiZu*yzqPcx!3f;o|OzhJ2{-G|7Zkd}Xm3D`!4Z(}G30o;g1I6xJOs zQ$$IKVe1sKOS$Y(v8dp3iAL9ubu?DKvK$#By zWEo3r?EC8o9|hhi`9d%o7j;e7=$!ug5Q%A_7?*=M_?}~LRr$hL$Fstc&^N;`b?w6< z1!3k0H~ilifL`%RsEn!cK~lN|`W)Qa4ajZ_{oG5315#DBFr zCE4fn>PXo%r1%1!v8(=y3UhO?i^`Y z!#ZQ_tC~q5_G)FN=ZbnO7;0%OvzkJPUwb(-xHc{dMrH70qdTC(QgVK+U;U@~U$QgVyFP%x$~M zV2Px~rIKQF2m@z59)C8kPhkYdvkj?q{Pv*CcgQ9k%Nxl)TT(VQv_&=2^ss)psR92> z*FAt?AsYC71ar2C&sjlto|>@M%9?m61p%V)ed?gVn`HNjWNh`;sMdXDEjuA_kf#Qd zgExtXi%UC*6h-eUPvVOFedMJ`ji%Ny+DQcM>z9Zo`g0>8F09^mAE}U)qWLFVC5^hH zFJths{e8JI3n*e!gioiwSO2Bh`ZNxSVz7&I%5i_NDh9S4>O^zbC#r6-&;vE)i^Q8E z|38|r2%E*YQ&OO$!B6TbG_*No28(KLW~3bRC4Nz@Sq>=PcPMAiw`N# ze<^M!gr8&dyAf2UKotx-hMrK>i5F9nZ9r0z^$b-1D-O!W1@QbtF zs_t>>h-&L8ZPwbiSlI>sM|9+E5U{P+RdCYor9tF<2AWD)I@41pld51C$5x`<`E#-X zq|qbMUqjy@(McPZNrA;k$c zdy|e{Xb%Yv$EA~2_gnE6^V-04fJ7@(D~Sv?hNOpb*CIgZfw#XKH6 zuQ>85rC=z(F}^lb;+)pZJVsAGdkpx=;-RQ@u&w)tgeDGH8Ho6uRAYZ{_56_@5z?9ti)Jx+N#@i1NTNnrDb z{+HmVz?^m9T|TX2SutNhcPd$`e=_u;~&L1`?7Cp5im>X?bT6^R*eZ*8-WsoIny%jwU?#vqSw;*GE{ zETo&}5))FBF*tDRF+x7Y-!H_MsXyO^mV{q6AzxE&mHgk+!~LJ1slFLRwvx{6IhuA( zBP)Pw!VgX9{`GHUu3x?kq@vgZo-(HmDWThAWA*WstOg?4fz+#1ep=lvEzdoLA0RbGT!!{;cYBEMeh*i2TQ{+FdK(f|*!AKb~$!DdP29k}K zXwiQx5k+)i@2b`MK)&)cZqV((yOdHMvV)ueMb5QaU8kJ67`PMV=ck@pEElMCvJG`q z0Z{c?_Rn$OKv|yik&6_oDC2X~O`?k}}eT$wwEJ~7Z(@+e^_13+L}DYp!=D? zwm#a}q=$JWIvO~#S8&M08yr~EC5+uLab_p z{iFM_C7J7c{h#}Pjq)5S@TsiT&Rm-N<+_nnkJ?{(7)!Q}+w*R|UCzq+9U^_IfN}Bp zNiU>rQI(FprPe(rF{mpL;6bkf9)mxd!&s6Urq)XK5S>W}oziG@Gu;Ilpp*POCHck6 z^zY*ytU0WMUD&!E(}b2wAXzyKD+n>;Zm3S+L%?(c|KYT}%8jp3E!Z_W)tR|rm(>RZLrR~}D(LT*lR((Cg5gSPYYIVYIve_DXG`g=p$`B|0ZMKTom4;W1@ zv(=rz;Fmw33i?WxMyTm81 zDeZhOEBSrH*9(HU$`Mm1nU&!gqX+5W!i<(!Rs#CA zA%fiGe3ge}v9A#&Y4;fXoDaR2V-#f?&HYW&02|=GUS&0YE zbSIiDsW4Y3g-tmFwYlgIMh5raMuqlE0a*-RYKP1q=-xVpLeZ_X5#ln(*RJhcO{CVU zvGc>;W9f)H>{K5MCtX1BM0u`QcBh9W2=l}#vm_K$wF=ZdR7YYFW({A@VW3tB!yW4q zE*)*`aBwJu@c6%6PCr8^T#hw>ViXH6vb&8M`ovguG=4Ym+x_gy$)hdiA0zDfy zk(IzfZ;rwG(3_Bg-a5YRtdk~%y?v#-R8RQ(Yb2EK{Cfr>jAkS5u*lIT{>qEpT!#6m zJ6ZQwngq`Kua_1{nG@d1?R-zD4b5R;bCf%{*s<7?ZXKVwpz{S@#@=7; z*Yuk&a#4Vc5?|+l`{x_n@-<8X+7KZ~zWK$@n~0jA{xz}XcuQDHWJrb4OVH)LRP{teHc5N-FD;Ug_5d2C2Zi6jIQ=n z+tSHLp6Db4r$r&KjiaJbspHme7ZD0vV?w z!{aG5c>)1_e-DDK;6YQJ{2HLrr@)Y*wvq8{0kB#mHV>?X+NH}G^s>X zP_=vdNYIPc&#HZwVrTvbPjmV}bSGkRFgKcvnG4PmwL~&QNixBw&v#dsVzX^v@DOt6 zuASnWDk3a--U1nY9LuKc8Ik zyvz#}x9MkxRep<8YerrHNRn=gx<+wfP~$!?eQ;ov<0Phvn=7A7@hBgaR=QpYw{G`T zW>hweFjL^~`r1GB>D-N)dg|Y^)rg|R4CzLqI24FtS;F-*34adPjyUqm@MJN;0Mvo|Kn9Bh5GFLZO-w+8miQt zU&7l??}L8pOu?3;k@#Y~<`}jqBH6_@o?$n^pFICqm%6Z83s-GWO%KOea8eN(#=T}O z4MyVlXpRUbq!T+5q*5=unXu3Gb#CJv2xp2IeF8?>U#aM2k7jd+=I)giH-(okK~CAf z8xdnCiDl72H!DZ3g~m4W=cZShmHvE@E+f#}vnVrE5~7L1_9D^cry);%EgN<1WNlp% z!W$-DXoP0fZ_rL4657_%p&1J*X5&@=c~~UPL04pwI51^mx)_u>^{_v9aXYp&1$}8@G%`4g~yYFTeVk1-qqX~Lu`KD?Q zx}Nby1|QZ8J(V<*mTVVx42>hXC&YG%?9fbuMc<++clEx^w&~`obxfa8G-HQFepqz& z;Po_`kk%df^lKSTt&Q}UOV~}PUI*%VFl^|%vs7HD)(_5d*9}BZo>32-R~3g;RL8I?Jkk4k~+&ui1e@+8h3tR8|@bE(}Z@ugKAlY@{$Gw>v;@g;y2B3*%zSu0}FsEfmf?iDRLeqnf)S4db7M{HB_V4-fH?F5~bo5P)%2Z z63T+|Lb{(MyFRX*HvTDBRYcJiQTVwz@e}>~S+}N4PYrTuFL7q`2SyYBjujfak041J zLCQ~)xRUCS$ZLiKNvwX+$NWddu*f>S8pe!in3kfK^PU(`3h}?!F{09|7iJ4cbggDu z6XT{`{b-JC4|MRf)3fz3YqRCPJ=lB^^j0h0+0to!`?}TrrV=>17Vy~b$EjrwM?c<`r~2gNL(sum ztd?+C(}nE?c+j{=defZ{c!AFB)3HTK5CY&N>KfVbzoa^>s$|em!_5#!`5ndHcx*IL zXsrxyLr#n1IWH2=k4-X13W+42r-AJwGi!+}@eh+3Qwx16gRAj>hIX6&h4G$g|ibsFc(fR}Sp_wVFIgt2&XUWX5WWQjF;4wA<$!uXq#W@9A|b z5#K|~5pu?3e`mYVa>KGsB#!BD$0qevTw9QuCjokW?GG_ZTB?uv6@gyoA8BJMaQniM z7*!X~Jyz}H`ahpb!P)0K5zQnfk2D5GL@EFLJ;VpgTRVuT_vt%7ac!SRtNby4J{%@C zq(Kle{77C6Y7pJ3#BM^=&NGGg=^x>(TG)9A2y5po_VR>QE5Ys`{wW8wp%#$VVq z<@`rJWg>GM8tH`R;`GBs33?e{KK~fjiO-SixoAsMZ=A87S*lmHs0qMTMwsy6klPx> zC9lA|Bb>k*oZ+6)G>|9hWin_?2^v(dWkD+s8Xkym5JpW!+ogZ&M_Iex38Q; zso_jKNrr?!$Qb|(M{%KfRFbMcWL8=hrHLZeiW%j|>p1ApZA_UR$;R78&_^<}jI;3YOHBMqoXYcx)=IP^hCf+$b? zi;~VAjBsW(_C<%hTf5r7RN}w;oFh>E9hqy;(xw-k z_yeD1)px43q_;>Ddqk+0gcg11iv<+Oo8`O}`Vsv>-gBWJjB|v}prgD)SyDJppw`ms zi}#*@-os{5f85h`#WO75T_dgZ_K*}Cfg#;E^E{jhq6Iuk?}#tvT^|zMV#!HY(%>!3 zl6YX*yJxDNYaZYG%ACLNz1slcy|l6RMD+U0(D|D%$J@6PyY{>@ zxI8pPnT-XGQKLMx&m_?nq6R9gRbODC1QAsW&m%|gn$Yw(VMml~!{Z3T##}X*cvnLt zx+s?tuacwfZmlYNzKc)M^QEG^va*ZAx!6#F4R z9>w9P?P~PMIneY)_fS@KAM%?z+F{#I4s~w9Ij$C3$Z8^aKH)!=Zv1m@BDywQJ7`L2 z_X_K>#8stVQU}zRB`#yk80RG_8Z#3p=iw=+@W$p|s;g*-}14bY+p&DXNdF(1q?TV?k^>IaiD`-(yrGT0m_#}p7Zwu(3BF1 zEo?7GFd{qze8)@pmwh%40h=s0GLS>$mlm}BW{Itpp+2`qB=xQ!wFL*y` zP|+41=hG@JP-rm~CVv<7qngL?;y1t3JR$LNo;Dtfeo|R@G46XU{<^6wA7zFktGeSU zz3ow4_{5=FUdk-QIHiVbva*xiT3uw_3{$gT!i@3&#P z68muVSlZNN+oEb)G&jgudIhUFl&$2W$=x>_&Kwdx0<_$4+19IRPJ-nX7k03Aa&Xo@ z4^Hu~EZLylWl>87GmoMf4i!dn+!YoXX9ajY?IzhxYNj=>?{t@>%<1b*ZcD|3Xvl2- z+D^^{(?hjz0&&asINOIOYv^sl0f!f3`Y(>l&zo{e*B?;1F2}yk?w;3HL7b-A}1q$@8zS2=B)8Wurc zzjP#+J?`n`U$z073a_d9jupiIj-nT0uOB7IU0?Z+|Gs)4Z#(XU z7(9Es`tsx5)s^dj#VNYO4Sv^XH6z(qUp?t~?w@7z1JowV7SO1u%QBT!)Wqk4FEsIF zaL!7SN|F$q5d;RPc$WQX$PamczlFc*zbOCz&$Y^1$C%QF>VVw_+Xz=6pazQ|G zmW1rwkYdR0ONiz=@g}iF+8J_NOY}5snjbuy4w`18Q`daQK^NB~F4(j)oyes2dD%5) zEF&X6A{1&2`sz9Viq_Ov0Mwz{E|4Bo^8QY?k4gR<@cmOOSXM)|j10U`QqmvJ?xcwv z%1fRRq(L(gNs(q{ld;<07#5ZacZkxM+vx`!SrXm?${-a8vB2jwJGqL}T`$F=byuF3 z$~9-sBH%upv5QCKeerqyMIXrZ)RvKtGQe>_SE|CG2AMIT*r*1dqOYUm2;(ZAe6`Ul z>s+0@cu7O{W$hq@!uLEylvw{r&N-qP=*$75nDIrEaa{{&UFnuu`$DhD(fH@7D}T+V z<#eu3{b@-f(9KF!kpjZN0d9;Gqr31& zc4+?B{;!#hPn*L4%HnK#%)%EtOfI>xSt~)ec$hlz*2_~uL<<-YaRblk|3!f8D_^%j z1cu^qo3ju&<{?K}sJ(_<7`H0ix|T%V$J=j7zT)Q8qp3+&Gb(j&aMJ@DTpaR~3R82M zdrI`s!o_BTGzL?grwkC#6Kls-tYg~GyD~sUt^mpt{L`!W`n`d0Pz`iGhi)9fDB)-| z#WsOi=><&2%gW?rd{@bKh(_5~LRn!$ihEh!R-MB!TDeoogcjTFi#FY}I!a;Z-SDy! zNPEXL)ET9=mGgb2&ff6+S4E-8YUBM)!c-Or6*ZR-b38n;>rLVEWKQvTE0P2u8 zmAf+&&tze=|NJCGTb+w3H?)Uf;KwmLb6xSBi;>A`so`C(sq_rL-|6NZa&i1 zld+6kMbPN<7m0eY%bGT$y~MWZ_RH~(9BeIVzrh_=i_TL@b@5dr4l*@GP>!%My@G_D z-3}j-g1-3twLDbc3vTpt zvHc&K_Sd74d%4nkq?a57Z>Y|{;b(D^f8p!kAe1I+0&e1klS!3fpG7(MB_t&HA|66N zP~oL071$~?gxKk?F^!J8{V?73_%T?tJ6$D~`RtSNi)_aG)N{NcxS`_*)<)nA$D zE+J%7nEhjnBlX<$xtuoonXbY` zaQ|DabcO-0NmD4K@ zh4#k${CozDyA??mGfW>5NK7!I+rT(t7exIlt7z*vzu$mR!yIS=D9X~HXn*{dDeqT& z+d!rf4rp)`_1Ii+`C#1bf~@f~T&D_iirjt38K~vdmacrCIOT{JnAk27eH7wYUNWF4 z9Ly{UNl{LVu%7Ba`bk%k9VIYq3^e_UN?4}zzO~_%BUV4yX0cN8*gr)ZwT^2cf9!>^nd0{{dXC&gM2}AsKXUiOgz}Tx zlI0n%#4(R&nL%|K7!|3B4TAi)QRNPUEy~>RGP#F@Wye&%N4mRk^wFlco^y}!ptf8csrWWW^BnR7$F)hRahpwM?{}{rh`wvH*^HWp(*~c}MTucH zK~O|0ap*C@Xl(C8v-r5prUVb{K34z5M!iQrZ2r$mB>kI(ryuN<{gxAAEs(}CuGJ3= zm15rpRm1Gin>3eh>*@<$l^BHDADWk4in(>l1Rkmtxa^duCPEd4RF~Hh1Sf`?;7<3* z*EDgAH*h=_>C=2tv3+9vvnHHhf-Y2AZFW9r3h1on7^P`KTMe34Rwa+R6XCmeM34Gi z#vmOr(B3rgxm#(-pt&!-IaH|Yr#M3+On ziXZj>Zi@L0Xh`^CgyCaO_MZgh-#~e(Wph9i4rf+i))Y;uo9z<)c9+($MrKNZ;vxIz zT}OrX;t^mgQ9o8~wvFpL5BVZ)nw=&vCvz(b;D4OgDNz;}u^V(ByQ-|Q1IuL|cZ@7s zW;Ei)mG_PO%sHQB@3$& zD1TZ6?-MrBvmB z9ymAaB(}9N(GsXAq6kXTW8!?b9N}_EY+bx$I zS@`RO`c7R;@LTIijYg9Ux!2R&ez%r#x7`qcMW0(+qowN|7bk3HsA{!Z-G8?_w)1JF ztC0w+`|s6NTzg3D=m_O}IUdhVV8N`{7OS`d54scmb)0l&RI@+KNFzQq`=*Vu?|jsk z(fHL{n8ZR>mz%R3zA%UKBz|g?gL-FJ+pU6T2dSn{yrGh0wR- zJ3VSg_U1T&Y09JmVaS#fT!L*_iqsNj;Uv8)w^RpruPeoj^Nqaa_H_*;=PlY#3*AT! zS}!|qr!ve4smk5w$QmJ)f=DdW_}%Qn?2qTvg6638%bVW&Qwo>0I%}#vRcI{opl8zu zE!49E8q3G4zi$c&JQ0{h9zBcoty$b3Z_^c@b$+R?Rm_Q#psSm@>W5^lG~8rZ8(F(9 zPgbj;_{O~YCrX>xW~h&vn!OWbp+aEDtn^LZ$e==zMYx4`JbD7^LIu>792@|hxcITp zO#&-cmOcQx-ppZQa&)pyx{50T0f{6JJ7R+b1BIi-{zA-woY5X$!4qg?2xqAK_Tah1 zOnWBq>_Pv$#rNqfS{I{86xzq|Burtf*_4e_Z1 z>f^JN?Z@ReylI6LvAvod-5l{uh5_f9ehrS(mFwYiY9GZt?VQw54xIVn32|td9G-~3 z1jSD1#F2K0^V0 z7MW%svw*ICZaMMX`Z7ulvZ-Ugj^l^ypSs$w)tEp)H{4ZpZ?>q^L0h0b)3tG51P((o zgAIYJhf9KbVgEoi$)1T;F$Os}R_S<;XoggY*KR|Uc6k|H#zLeXbKJPv^#gOACz+Ip zl7@8#-q}38S>c`JC(lI6=41TT(I;c*_-~^shpLvT)575tcHc2hbe0|-u!BiL-(S7A z4(@}zJ+;JAPwcF%+f-xWC0*nBg-c>~)C;ntts~XzPK(C}0Q$mx;;*W%ZVac>Zd#G* zq$%ZfyiBey#I5DHz)ZD|ipSr&ds}TJ1sto2TWwsgo=RJ7T%5!*gC3=u01rcW}g7C8{!J6mlV(6ku{jyys zSQ)ZF9`_(Fyd($hx#Pw1pSJ41{Q4Ga-~P1tO!Wkv29mTff3&jjm0Tz5dc`RBhKL5T zTrFrVy5S1+b(=`|zExBAG63U5`*|B=^)dfsb&D$ii@|+&Y29wGzAF9DB}M^=Q>Y_FfB$onb z&rS8qZE8qOS{xdH6By3zi$ZRiN=F}GODal9{Ja)sR{JJyChDqGl=l}+3wrWNlSkgl z!a{>8E2x@etuut8{OYIZf{G9iXNbjVQ-1y?b>3yIBGEK!`U?A*8x-DD=|LR z1)F1`;ECs)@Mt{G&@f=dWPuD&!9p7M@aQD%uW|m<>LTR`V~{nFKG$=p=kJ;8kE_~! zPqI_oIa5bnKt3$14&m6)S-eq zrpJt~k@Mpr!5->aDnBcxDlx2?{VQ!s>esni?-fghxKK1Ch#r%c)-p!)gHn_KtQXg7 zcP-`8CwR;LtWu10F{tXX$IxbS2c)))zu;xv==t~qxv`gKqxDV!VcVkGxgwN$CTDw% zm+a3v)&q%k{Tzr_8m^RCA9JdgFG142uYD+nyZdJG+mw(hqIC=eA;AO*3jzfvS< z)FcZe2qWuUGrh9LxM7IrnL8Ph1b9hmd5u^`6&m-^08M;1E{fZ~=Q~@pmQ(aEE%&7C z);7%lv(`N*J|`v^#i6$RpiBkpKWZ3)3qln03Kp#QcZK((iszjzjZcQ50Jfs$m-wxV z914k@rq5PrzCzHMLg&_T8>Zt=j^3q-Mdp>)1r45nx(tZpWI{%$8W{or*JEcxoC(tL zPqFDflUf(18j|zIoqrw|qe*ExsWr2GkD6#d{@X1%UXCoCJnZec?4cP zypWJn4GH@>Xa%!ct!HdbX=}zTn%idgwdp_W6k2f+)IU-g%rskSgN*G9MqLsmfM19} z&17%})Mx8454BiG(TNPfok*45#odc(aFXIQV~OV_drbOw-h1qc#KESFOg*v@%E*{k zyn|}YUTjqxqNyLzP@u|H)MD(Q;jsF59a^M9`W#4(fHstyk(^)3?D}Yq=!}rC5$#I9 z!8=oP(Ba7{e53VG`!DZWs47P++Rt|}sa!S~+7Zdw63CYelam{h9-0!-6?3H;r7hD1 z;bQXYTAv^fr!5sC!ouJn0)YaEzsv$POD~5GI3XahbMEX$Mlu)B>OI6wU>e%`o5*{6 zg`Wof5>iCW=6U#IHG|oCX8Y95P?{S5ouSbFkt5@Z=>^R42D>Jm5@_%f_HyD330SKT=+%N3W2vLq z3!gK0bGGaZ(V=Wngh4e-uRrU0La2uG@}1Nod8-6Inkxg^DEQ&-m}UL_$^QMACBng= z!k(+kZ4k|*hn}7tV>-fO!CcFZ_tZ6nY2vFDP|o}5rOFNTL&$mQal`kAUw@$X6Ys}B zl(@u2K^Bh(q*RxxIfMiiGq8Gp*nXGRa=C;Rw5vhet}Q_CMarqC4$|g`u+wB-*3vch zRYU&#b$jU)#3wv8IjMvj$R3x!zL<<=Q=)+de`7}3z|BbZu|ma#e8XXEnkOrEFJOUz zv%@&FDdV~6wWg!kE*v1Ib z%J4c7X>dP4(A3rrX(j6z==@9uTla7n#@K@M8&-j}D+bmMjh%7zTet?=a*$3+TC{|9 zl{wL?LCoBd!LEyHq1=bc=1BlR=HY^&u|k$1jW)*EM8IYM@wSqIOXQuv(Vfg|eTQBt z(YV+$v{B)I^l3c?U-8^CbBQsqje!!Tf}}fdXf6W7o~dvz6#LIO#?by4067l}3kUoxl<8CQI0(EyeXn3Qz@h0p`076SFZ=XviQG}| z1SH&v!r-1kY#JLEd-m8FZjQfccjM45{ABY77 zzkTxPGwuvCV(9s`nXq~|CbzYbx^FM3jgL?m)h1tPFumX(ywckQirB=Y+De&4jQrVS zHy4lPFW387)H{_S+Lg-p@!NEg-VBf?gN^3NHft%Ya1s7f4+%qA7su2Ul1f{AxBBHi z_SqQlWugD!?KW@_uU`EhS>EQD=v}RegM6&L3Qs1-Uj%S|-wl80s{4Y%bmj)7W0Q)cB zUpwBa!dMK1?w}wo@#k^g3DM z4}8@t$}yFl$&dnDL;0odl;I@@5}VR5Hl^jLs17v26 zgpnKUE&69iHkII-PMi0|HtVsb=I}Z*%xYSxbIxO2FG~rFOr;J8y1CQj0wIm_=eLNr zhmdyvptD>EuoBXOYlv>iq-#G0BzSUwRO=Xdi#BYep!-J4BC}r?e)Ffup>yet^%Qe+ z<>m~Gar^6DrKiFY&3xQU53}i#rdJ7@$%;9q>wu#A@e|Z$LmNB$p6*_uV>Wei0HW)A2&M*Alm(rEPC0x+2ytvj$lNu@g1bc$Mj)S5St8{w@{Z#IgRikq0x zE3S0ZY5zriKW%-~p5AsP=ck1yZ^PLhMCap4mC|I$Z0FR5pYoTj6U zoG`b<+8@|WoR>0XioSZ)JV?tF`|XF<_SpNlRDbILi#7V2Z62$8Kx5k8hVDbkH`)iw zpML#I5*ZO)O5{Dk1OZ@!3NaWuSh`v=bcEJ$@O!@M3)$NtP@DYGBO)vrNCoL3v_CI* zyp-ubSG^B3Nj|At`qWClC?rI6u)N(dWPEXnic&W%b1RMeCtR!MD+}@tvT^ zD_yYtM)j|Aw6iw9s_`(JYE&b0qY1?Fp3k3*);5>^WNfFXQ_hCdhB`upCENT)6gBwe ztqv}w>qq%PCDqqF9kN9|fnSHw>Fl5SYY(E|Sbu}B*jF0$R>|`RYQ0{BsOO(K<#P2C z+#}s|z}*?>z>t{l%d>3Z?`L%PdlR0S)RxBu4t~jW(#Y#O_@G>o>)>m!bhn54U!!$V3jZ~bo^eza_@s}j0}WGdI1-2;e>?#Xq+k5(Al(vP41Bpm>>BakTSaq z{hvg8lg)6GM>#7;JgB2?bQQC`(UzF<_k3D7*k)pi3Y2~i%vC`j7DcA3{MOwiHl^Ra zRas&x1ZS4z@jGSv91|vg$Yl(*cF3A@Y=CK0lKxI;3z>XX9+TQFB7!q(W!&%-(o?{f zL2JZl+tgntu(P&I%^xUS{ltNttMj+H4Qlj6%??9Z)Z`4x0d z{jU$U3Iw)t)9hDFtY_!2HK&!@*oS{0_7!5cd)a9HvU3DDh~OowAki&Ks*m0Jtz?C~ zXjnP(yl;ep0nR@cgYFjKa!_{J!z&m7XS@*m4!}!#f9ZHmZHj!>UJkWKBpl`^fq>!& zZh-6Tr#E!Z-^0RhG|}66ml{VRMfMAbPpDv645b-QBR7p200Ha zMP0J#rn@1#{)Nk$ZDRT3L6N3PsT}ANT=@NNrvtCPOkGR$+ud7%GUJQ6suO` zi0{Pq48en-@80SB7Q6YQaO`>Nlb(2sn8O+*D_3L@F=pX6iR}g?)yF*xnf=JCo71BZ zDO&=R9bK8X*!1n$hSbTw>-77wA@UbR(RmR(m*E0+N` zhG%Q|ONlJKi!OXIzY+}$)*}ekk^(jKP~JnqiO-IKiQm45#a8OqI_}Sq7%Y|!I9qFI zRH`Dg)@0GcW&`<&Z1~#EyT$;mT^CoSC)KKzQcbgC_^B{d9>63$IWYa%U)K_v-LXXF zI?7MEHWb))u+^y|9R^U^)84ar6O)TEO-X}wy^h_p>lc;GPht9u=6ZPx%P{W5Z$q9! znTI`GY?bdv8U3>TqK*XgbW#U{A<^(aBn?r&dLMWK?=9s~#r5`L|334+CeC7u4dgfF zCFk3Yu{%y@&j9l+Ummz-L%D7ZmzS5+U1kU032QcN?5AuMlkP>JbE%$7soN>Ma1e+pu)qwRW9S5y9n#%fSfJy^W zcRv5v%`7gW5E$dr>GMndEv)PxoYU3+bboR2DRX-l@wT6#l6NXTY#SJ*VtHmvTrHIT zQ9g)EJt`e#r}RR%#&~4!KyMIY$tfDJg2GxiB{CV5f%}~qbq>~{Q0)k`q9rTpZhqya z_QMK_51C7}ma;Y~3+~r%ZDRFR6dnPswC0xPaBm-zF!R5r?TTtE5e_0}hG&*``c>J+ zW_Cz?QaT8lTz~iwyMrs0@L_!fD{(R6lQ1eSBB$5binI>mGuo>7{hJ(T5GjgA@Uxx9 zJ4tfc-t4j{#Q(m8Kl{V>+B>S}PO0O(r^ z@_8kmRaDK|t9tZ6{49n72n@VHu71(%@biz4D1&Hy zGTw^Tm%o3*Eb`_WId@5V2BNc5qY0&rIi5HYQ2Dj~X8#PUxqV>@eLb(S63R1gY+hcQ z8a<$q12TSJ)wshHALRG0>_lHLt7+*9yn9^tv-{8gQNyJm-oN|S2utS zsQ)_Hxl&N#b$FeRMUg1T(xBkw`*ptDiM&2sx$8eq>!>N>@N)GVaA$@}l~Op2^BAV{ zN8wZq!9bhFp!ksPL5!>;JiXWtiQ)TtQi@9(mQzwRg(^AAou^rj9ty)aF?c5)BJq82 zH@O-z-gd;BxPqKm@D%AJI41|~Burc}dJhCfDebE>o20D$=$!>?%2;c}IWMi?yJH-o z@EO#Sc`pi(PCqAr-)?-7m2XfBf`h%_1G}|?y9x1?liGD2)I2GS#)Tg)Gj*OfAw@wE z@UeJ8JmX_H{49}MF6!7y_~mkOwK|YSkZkDRwZ2lTHX@z*c9Yxc*JhxL_ZyT~OB-{U z5QHJ#(2;*|zB)PBPcutE_7uk2W|bz%U49*7Y72=U_}tV=h*YZQYXuHmJ#4kU4ea)Y z{}ui#oGXY{Mhcx;=lj*nak1!xh{t&qovhQ+C|13@&Es%rSWkYG9NWGNP ztF^O-zZSpyQCm0^Ykzk{C}j?@;97HU#PD)NE856;LP9Q~bYdci#(y=603hO=t$t@FoM&g|_DNumJS2?a~o{?GRB z-Niiq#fL&So*>_Gw(HJ6k5N%damaZ2XAYev`|5XVBm#F_TB{{vyC&8v4z^LVQ)-gl zaxzm7#-vanV{B;%3|+bx*xsDi60&#r%GZm|JosMYg4t`u+r(yP{w6m!e#Tgcv}(mN zs63AA!l%FYA@M-!|G6=cV*H3a z9aFsDWJYp3GmGl`UrGw3C{e>`h<@>}n=42iy031QpB>-21m21I!r>#D&tc+QwvXC) zSca!{TfJ@%L+|a_7*WbG@E4~az~j$i3tv5I#H0`wb64tvR;C5u9#PdX(C9G45h(5v zG8IDN1@^hOpfj4svnQkjfHTeLVAt@lGqax4@%QcK#m$mhHIx)RE?WQnCfwW~m_3LT z%7sqF8mU@E2p{|w#+5TJvIP8n7gT#)i(H67LWU-jUf`6}{)DrW#Uv^~>U>$;BZ^;WWn0>aP9YhCl>fhmaDW z2${$RC+5gz@%;di31!GZ6i~_8V3P$lyFXrZuMtR~ZGBUsX>YiKTYGMgckYV_+afqrWfLx7~e~CqAe`@y=%W3-=vNuHuXOE@T2}lndFs0@sB=5JwDO z%W+0W9MFPJ_8W3kqC@(V<^F4@x&Lf-&E+4K$p^na>_t1Z$u1-4l z$;`)Wh`F<=R%cvn7ajdJJ0Hcog@x<@`3K1tXY8+C@dD0>SdOp#ST!a@1oo)E#D4BS z=@tfAFbEcjhrrK@&FM2-yyUKVUsq%^|1bf~2at;%PGmoMvL!Zi_0daiWOaL!6}U%+ zT#e#Kgg_1BL$ksC4sb>rZ=M9^W=k{dGXPr?*z|YCPb9wLgKc?giw+w(X0B@zctZT@ znm_rX7aKPgASjG6X)%z=4?~cr{_Iy{5wzZ;V`yMRq|pf@+KVO2g2k_nHDP zlsH@!_w}sA)w$oq5Cb6u#rfYFd0vISpGit8#G2I^TaSKsM;jOTb+5M2s9}JQPgM=> z#^s1WgdMa}gMx@=s}4m)MbWgkC?C6A>H1-~>P|@uig3h|0U?Mx(QK#7rN>W@(+H6} zh1|Oe_Ul4J4OX0(>JcHMeOHerJS#uKk99l?ZtLHfw5-_Uj!U&m;oBAmMW7LU@Lrk- zsTYyGkGfeivh);jnc(tiTl4lfhomdV(6Bc6j8BUVIV<3?zoCm57;@S3z)&9OzS~`) zrz?7SSM`?5(|p!L6-0^-1L1I+*dh2_wf@lLTn3mYMKvKwp|21apol<>PW;ZaynL^3 z-KFAciIdoyK9o~)LQG9hOAp7#z%-&RmKhnhPlBr(h!kl;X1c1hek(Mhp)g{K{~YHv9M2%=oF>q*4%;g-UZT~xOb4lKiyJm zp|mw3@O4tDE5A{FUB}y2&&d-=U#%n%O1~~>IXDzcppyg@|N7?yh8Tai+$qjMnt=2&S`!ZLjyk*;gs$yfhqE@Wx!(w}(@E5wT_lLvvik9Kpbb zpE-9T9|&(I{59PvlZBUiLqF!Cf8Op!{~WS|BCuCvv{IYOF)Lfi3Zoh@!Ag+Xf{57T z<743=a~(pF#%~gTl6AD%kRwXb1iU0T^M3+5H6PXI?7HvG)aW$NrQv=d0 zRLl?+hV)36TKwbJ*H917=Y9WoT>uI~lmf_^gr9cfnB(-lBNs=r=w50dXu0`oa_9PoOTfA2o9mhOtQg=@9GG##BM)+yKp4^sHT{MPC4qprFHvd_ zV`x{~{fxPmiVh)V$Q(0xo!jwzzRrJwlc>XbpAEq-RO$Eh%5nZm@RjB3s<@<~EuBFt z3*ZunI+WFh2I9j=sS4$>ftP*tVg4=R|Aa>rI}is?j7J1>86YS!ux|t@#*vVui}L6W zF_`^knkozm=5Y5l*XJEYdSb4*Sk(HS{#-7p31pqkDMmlEn+sMX7YVlpBI9j zz+yWkw(YH9!`~VWA-x5)Kq$dp8f?|fD$Sy!srT|Cv)=Y+{h0h75ig%6SmU7ianuIQ z@%r0*ZWcc%NiQEsL!hUe4g#OI%3)2cRU8E(S%bV-QueEHV0}B!**tzu=~CtG5}!^q z5Fa2=>|CPjynztShyL>qWPWEqMxB>PwQXZHny-98mdCAV?S+f71_De0X+U_$r{MSh z)&lT{&;5p(?TYvqi{!o8CgT0R$}@4-#(7n}L5OY=4-)Y(e`L|~--dysou8i{7;jG8 z*o7F4HS@UI;h-~vZN1k>Hl@P(M9o(J&GpyTM1@S6JPiB~6Zr-eNy3s?YtbSH)c@d; zM#WC&zn^Deg3Ek9VM7bV+;J6B>Et#}B&;=53L*s>{xDo2POUuXiPuqK3s7GoL6| z1%G&n7S#pKU&nwO=j0)$9@O%WHnM^d43L8hs#yzI3m^n_n#DEsSZ1G*e~Gj_4e6`; zkVDXk#*;i81iQ2NpI_^THSF~gI@?t6VX!IDW!+z_$$aVLTmvQNO*#dk7YUPZ258(1SJ`cl8`MSB*@taUQ*EwFIt9=O|lvb zw^D4llR#+r0LLnAfU=bVqHbl$UxPeif%SMR%YD13(ALBC6a|j9z-6ZX+r!lZvVPxa z8Wz4Y%HVfrQsMqR9BT-+eBNpF$kIEzPsm({Vc)D4K8V)mLns4|Mts)LpF&YI6hOkW z*q32F;T{v4emwHDaQlgkc*-FZBy2V@Nh)MNsea?!qx@`g;Hu*n1Bt9}EcvxAgbt5@k$S6OBs`rdz!GJl3hm@?}eT8t1(llg& z@$h~ee}B6>t%?-<5c#YCF@!SZtdad}&7+@uhHXR<8VYM9_JLIk$LLrpPZEcs^;?4Y zUtt)CIXdBTchTo2%>N=xTF9;MZ6olcMUTV3USCZQulmT3D{rI9JI?dg~6%gln zM|d2Cc#Qkwm3l7$$HMVk2asZS|Btfoj)wdF)*UTIA6*DW7cB^)8%!diM~z;h*XWEM zWkd~8q7%J$(W8^1_g*82ZcOz1$?u+X&+puI*Sg=c{NXRl=Y99y&))ml_^%5$Lf2TX*9*mUb$;Eu(g}!Y7s5oiVxp z3<);BL>rv{#=} zQY{Q9I3SV3gqQ+_ALE&FtDUH4yW(Ua1Sfw=Ly@~CJAUNvbEfgv$51;Aynv|dKs1s_V}oCX4YeP{?IqAcKxaw#R_pZ+`UH7#30KKLpWHXX$8r z>&mqoJfQ3glN-6cSZd;wj+g!J&k?jaBy+b}@wle%;?VD>jcs%ekJ5)>S#7iE;1cQ_ zRq8U??Z^KH`>(}WEqusk{Q1oaYtZ<`-N>A3&xicm6pVu+!13rF*C}i(sAXkDy$^FE zUKRu4TgZ7AJQLa{XZjDf@h=CW`4mKB+g)77rA2A}+N?tAN!~U(4VHjI*adg`9ualA zH57Pp){D$2*D13=X3*F}pP2`5=C+&5(^k~(i_RO9Fwb#y?UcQ_r8Rvt^7*!Y-+vHl zdx;iviZl5f1yOD_cBAy%W13H}WwB=zT%{VBZ;zj7|M8ym>+)uEykldi@;d=}#j{Y; zwB5&JXhOz>bYnEdyk$gn(q*=SDoXjmuHpWvAofJ=d!m)W;zh4khf&WLYbl=1P@_A^ zuzcs&Bfj3Ff9`FlU1i`anl^HIiYZe{;ys_S-4E5XD`JmriIiJqdXrEi49-ot#^2hd zJ=!wY84LqCKN{)0JO9BKD#`vYyGYNzSy_>~TBKVECnc$3n_SS;#vn!1TIO3VIF;JV?-LBZQ z{ax$e5QA=LGko#f`5|KV0AVcGUuY*opP;gxZZ0L>|9G(-7i~17Jm&c|TI04>c_hm5 z=4;70BLk+UU5dxtG{wMB}~$AGIehhgWlDdaNvJOj<#>Qlzc(@Nn{$@69H! z|0_}o5y_c@mfqdV#HVIk<^_FoQy1v_zLCGNalo$j0T=66*4c;+1JN|RAhOEIiJW>` zFk#RtDMqRujm}qlnDF%kMe@r-YK>x@Zux4xN8?XOj?nZq!=qwkC=160V#;SrRGNJqZ z!BI|G2X!j9$rf{sx5>?q3)-j~g)PVBn+KY!*ADB>%g<)*8rUvc_mWQ!J}9(wDh`^> zRW!J#pQ5*x>N~K~B$sD27)$A#En0W(tKQ9hst`8ih6!reD2WMrFGrXzpwVgKOKom2 z&z+gYUu~ehD0u-bYOlThTu&kKt8?4!m2RDWzNy1^@*mV}7995C3egQsL^GDAJf9l; zi?8?U=*92i9noGd7l?KwU!RM*zaf{x8xOwf%C>1}+9P*YqxtRr?IyW_M5=JlLk=9a zyqU;9eeX8Ak0ne_);wnAl?APQT-yb9;9; zO#+WYR<5^KzRb^+@Wz@tV4#9ZLHv*!h$iKSwJm?W-e(Q(xH%vKYfCiVhie&c(R>ue z2C;ucyJK38 zTf8pLy6-z3?(k+*l5CUnC+_&qc(J^PQv=_uZz^hxvdTJIO4Q0lt1H%X94mg_>U2(| zgbO(?IC^~AFRXQ7TyR`CZ&(t7i3o?^N=HcFVa%0u!ktu2B)pXnrj85j3y%BOMvi66 zjttCj&18?crsze_SpQ22|LxiSc+vR6x+`h--<6G1%~uW)u`)an+;6%+)>j(PiJ+y+ z#6QOw;iMT&%p@wX#x?`B*ND>Y0TgZ9B|By!n01&ym4jQ6R}xN&$@C!6q(Z%ei^(PG z)5mt01|S3P#C5DWfG*fHHN5$O9=ZL)eMg%ea6%{Pb0SgwOf`m56zU7p`vQ)h)v+GB zQs?xoQnxV0<~Ik~GxcNYcb6#afb6mR!OH%A`qxcQk*GXBw>~bqQnC_mXg%(>2pPf2 zf$8vS^oLwt`QJY|YGg7g>cvThQ2BNIrLk|a9f6_Y25lnY>R8+Kd`oKsu^`8l_7aD& zyQT+rljZ)MF^(xJjsEoIljj&YnF!I3ZC+pOSrMcDIxX2xJlqv{(BhrS3{Na5NW4ro z9ZEaHck2Zlt}6WujEEh|zabXj@*ZzY#A;g|Pq|w&nhsC-8m~Se(j7EiNtwb=Cg8b$ zTom$09{MgnX((!%J9lig&CXd;%NA7W4E$bOZoYD>I@1_eIjY|7OomTv8HKUnG*3KY zrj*W3GBf^)W2bb;d0JaljiD+g{9uZ2=hwpW-GeAS8cmpK&Tfv&(e4`ks-NCW7fmot zSQxDQi&hpyQNMtSshbwEwW|p*lSAEKO#X0mBF?{g1;UPle-i-+r2f~#4d4D!y2G*p zQWz4{ffj_I;WLtGRbH>)*LVR4j@?g->`iinuTrX4xzN&q%*~tUD{>mV76LY`y2LX- z=1Nr#COFs&zYv+CA9w6K8z1v!?USNihw?DACOw?bkS^x}fUW2o^9wTBZm=`WU9(BIs@wwFFj z%#t5ud0owuE^7bOVg)o>*!4-kp=QZ*!+Szxq5emkeddCNg!)gL>qS1ge78TzE!V>i z!KmPlEcv2d)%~*_S(2{;&kt=^z679sekF@t&3XoU-AMx(kD82(kmX$A$y(6X#5_8E z_FRCK?2NunMg4Qd{$)pvYxmmM43{i@zh65f4X*W={#hgonxCYy#T6=18wHMus^*%J zOyA3nxyaidM2Bw`0#Af0G<-g3Wwz?6ye_&4E&+I`7 zY*jK>QO^1n9k0aw?Hu0N?UO>OmX*BwLdFomHIMZkzfH|!m{rHg(Da@;bKt&twJMKs zpJ(APufj3c`(Qo~jcEFqJO6OjBG}m936J83jpNldnK83J<=KzXT#P=0Y#JLbAu6H? zQ-dB?$ptfvb#+_sP33^m*g&Q65q(Caq!YVI@_x_FRP&R%Oe&uwA}lOdO;xWY)hFnT zc={6Ooe$2t@;Oy)sd5(|2-THFfYw;rIo1g2H!FYo&khBE9HfS!?5fZj6I5Jv57pXj zVy;a>TCsg`{#pCw%-QwFd6Z28u7QP$zlGM0G!{};FHu;kByPjp)`o4REh=J?frPL8 zLLCpXOWhbBr6yyPX{6x?ZThn8g*n)>xv|xn(kXK%n8B@vZxLr*Hy0^PWlTBzH`hXs z_fS3l9-C$A>5gp?LLGYgPW#pR6iS!^)1H8$?v<9^gvl<&mx|0<-8$J_mV3kPI;)5L z+_DfHBt7|?!`G8FJ`}$b-#n{b;y$%X9OLM5Kb&>fe8!GlhZiXsUCtjYjt*WNy5^JD zcb@2jzJ)geWG16>u3y4(+{LEJdE@{)HAdbs?I9hz^c*Gxq$ZZ&qfDD zJ%X8*hc!@zHE`k+*b^!fA{g8uB*j%YxFy&~s3d5YD#-ZD#_t=iTdY1@S8ke+$mss5 z3zA{uz;kNgFN!13TP5OQz9hkTHQT+ts0Wg5+-q&mMsP{A8Q;CMrLJ;pZ{E09N-x}k zGNV%j6$VFQ?cezG6)y>G31H>s7EQCFzxRrh;x@2Nga;}Cbh-t;2g|qRV;X$MM0rG} zqx<-PdO+&Siw_HR_muB^fOijz(j1`KJk?432amPNwCL_V^4eG_Zg)c)OyhGB!*X|X zjdR%N8016kQI)in@N{8DNVhO=bSlB&&D_Z6RUt9Z2alm*!_2!?Ws2?PR?AnFtA6)G zaWL@hUEGD<3IN29WwTs!%d_T|aBkfoUp?;XkmAwvfk`^weFfKE5lVAw2Ic+#s3HTA z^GWgO=87;e*SQ13*f_m0l2o1$WRrSbwk(_Z){A)gir-dueoq!!d6TpIRu`KB!b9n* zdK~-!-xn4?cC0fT)3aEXUN%rt`h_-3_+H=lZp0S^?lyhKsf()oM;pTEnl4RdDrBxH zoQDMK#yB&QqdSL(ckc>!G?|lW2!W;;x+GWp-FaS1M8W=FAvkfL+4Q&Hp%BfOvZz7} z*pwa99*bf_S!O}k6kT!y2_LMC<^8VwsmZ`yGr$xB`>M@zGq40)7a z1f0B<+z=}ydN@KRu;%)AcH0}ly7OMFfyy(E!go^Eyjm7db7{E=!;rzkOvah1G*Vg` zQ4rfnsmQ}03-RCb9e7T!y!O}C#+qbwo+m7H8$3ZXF_BPMg=wtqv%TseRA&B;pZ~P- zzWMmha9vE6uH6vl>yLORe#>@(&(G@U{MrX+&Jrr!Mi8a}F-gZ?4NkrL}J=>nN zPfG=AX>=aq6Ljs#+E?LfZLIq=N|BKrjy zUEsCEJCe;KAdB_-I-q-K$S{(@NsYcM5Z;J zRMljH#-Jei=0)2Sz+LQc)ZG75#hzt{a6=+YHSH-13o>W%~t1<+r=KQ|(DGcNPc zl%Hi|!MDKar`2QOzsIi*mTdD<=fyx(PxDxXwYv;w->fSHDjo+%V**jewx1tRa6Ubso@yqNo?A@?^aar15oorO9pMLmK~82l2g^r7Br@`5T#IYDxNIIo5R%ddx9BZ^802-}ti_RobrPL4#dMG2iJ7HjntZqw$>|4bfVe zl9}m1d0l@%5>>sj9M9TbDm`QRrX0V0s*@;NOOgqnl8>#+UnV(jx1N1I{bOc(u(Cq7 zANui)nN4~8yP^Rs(4uB^gMYK8%IrVtt0P+Q)kI*P|RwuDyitLG{8%{hv zu|?$_z;i|u*L4>kohOu=-D4-U!Wn0tAr#ng-=2Fm!rkziqV_wskF>M!eO8ILtc`{7 z(@`4eSFCBWDN6(PEf4#9d>NN@ z*>8T}y5a(=jQ* zOh=n#su~c^uYY!-MH%pYKc^@XBkG9FjS3v(0on)$tWw@U#i9)GZef?4(xEfmS0^Vn zI+Exw3o=*fhcAI=c>e0>pbb z??^;r)B>NiP3xJ*(#GXAU0NwVz%B`f|04~}lqJK$gkkFsTvjd%(-YHXkhd;)tJKd? z>{#^B6Ck)q<;<}83-S9lbM?FJ^$xpeJ5wpoG2^$1FRyP-JN*z5*krDdzk~=A=%@_6 z+y-(vzSQk#5PF7zg8b2BVKA1Lo#*)iEzUazA~IA?`gc}=mWLbV$FTqMX9ww7B}J}u zvX(c4=gD?Z`-z}r5#~^kNTI@%{D#~_DY1G}b>n9jVr$()zieZY&EZ^J?2iveb0}707ZWkukLo;Sk>#wzq84=s6^;CF-pa~Wk2j*kdU&8e2WQ}0R6`jOcTQg`y0aJrzIbqBwjBR;x(}z@gD`X_%7j+8cBYfBd8KZ+~G(u4&DGf zwQ_>VBNIc0z_l{Hc3+S6Oc|=dNa1_&P?*C>&@Yb4A$48o&iPS?Cl5em10Ey%|L-yG zvkLIHfX1ZQ>9^)%Uig6|;Zkt=9Ja|M^+T$#_XG;Z!O9?f$m?3a&w$3xJ@TUrd!J%n ziaDDR+C2*bvGTnzs=&c6w@O;nfdW&thRquL(K;EB=wWC#p6! zE}y{kohznj;NwR2*@)p<|7;NpZ4`-!gv6s>{tdI^9jIh^&N9Xkf&FGTBJliHBJk;P z@S+4@vH2H&%Mmh&%YG$qpI0qOoSU;W2=nNjT|CHp^;@MDsJq^1i}rJF(3Gh&c0Uag zT;E#ULq!6PT<=>Y5KzHwp>8h$#N7W+j7vE&6Kj5&xqEx~W?3Pq*zJ`yPiYnpT>zze zSSjwLyuTi!FpoHWD6T#BG=5uaza45v?xyV9r#x@sW9Pf|%qI_};}rodQO+W%T7DJq zM=db$c(gx{D0kks>S;J93@BYkN2Yrk66Coy7t1(% zW9$i!V*v5RvwsrTlyFFJAL1I_X%S!zy`Fe&XtjT?YoU|*1Em*h#|-0ys(gs^HK1T@ zi^GIdFm{UqZ;9qq-z%FcirUldZ0E$kTJ-k0J@s1ly9%dP9qa=BYwg-6lI7-W>Y|mP z%#Y-UD4J3ZS|cLtq@YnSnbAyrwF#7&f9y(j{kXKl!_V~j^1+<(Ve-$gSdLzBRZpUi zMbra^e`2vJ=UO|lWEeY!6L9b1JQG4?ha`6dn>q6AHl#PK;Az@WeS%Y5c8@0`&O2AL zUK7~wxhaHm2Wk!XkjL5gM`$z#4mg35(fH=q$>!h&%hI?$g=4qlz=xgyi_Gri_s(X!_{xPQMHCfNDAw3UbhKMDTAzkZ*!xk?DSjWh31#5l$Ux) z&NerW0&a{@b!9UnTvi5RCaWx(w|SiE6gVJQ`&+k2wEXTGpgj<)u=oGppd7ftlEUKi zt#^)?z4HS4cN1>ITD!$6e$eJ6MWE)@8!_EDTnW5mzBt%c z^OTt6A3)znb_tH%MUAlKgF40DdmyPS;-T3jv{~jjr#KC%9$uooJWU~g$5#8>8M0ma zUeNU5`mf^8M-0}T*Fz>i>YfPHv4@gLs)keUR!*+h>rRU}u{n&FYUI==C4fd?h%zP; zsO6hRVFu;#D3$BX02Rq6B8k(`OcPRo3VhR3&d=4>&T5|;tQh(#xPDMrURiv}r*Z7` z1@HYZp2xCTBL*skLs?uq6jM%Z(YaunaaXJ7RH>@nJhp~@E$^m-X`F_7)s^~bD0Fg) zsd7AzIzrvJi!Yy={n#4QI5yN?v6^K|z@mUYKll4A*?IjIFl}zvyxrJLFOKC_-x^zs z5Rir*0g7R!jIy$-Dwh`D!y;`UXA7bcX7Pe6$=6Fa(VO2K{*PmRp*hW5)XdDV$j&>+ zcr8g)a+Lfj6S2rt7HPu~L@p$%-$m(}X-udWxBB7QRM(X@8;qy?Jpo2mPujN3UF%_o z)cQVj(-a7mNJ8Q&1KfSCFK5&#&f)Ml98tUjJ51PGMo+0>ml$qv4kr)30Zf_Pu`04x zSEE(E{BE@p6aLa{OZI>8t*@X!#`)XD<`$>KUAB?=`HB;-hFxvrzJsi(o z!taCs*$WWNp_cVUk3c&N?avh~;kQM3~`ZArE6J zm_UT3VFlz>5x;y%dn3q(je1(icEA1oNbkcDpc9&e#x?RaE)Mu4=g-k@-G^z*|NMY>M;bJ9p3l+ zL$ws#hbXV5+dR2W5Xlw}n3*JCZWybcek+ul91T{cL=UAL@s*=NUEN6IVSJy1$xeUN z!QYboE5Hp)ib@-He7^oPQPp`i+ZQJ(pKhwoXw^E=0RFK>uK^{I%PtV?mX9=by{~x6bKR~>mv#)B_L33C0kC4 z>i!x=?SH^DQnieT+LMZRFdKt22xVW5cV1e(YH=Qp&63QdmlDGvG%Pt9mUqCgx8^Sl zipx!vqX$|QgjO)>rPzF_i=3D-thO<7VJ?{8KLe=KKN_;P347fnO~{0y(#elSo@~jQ zpfHz{iFR*Q6-!FmsPp? zdrU;FT2Z9M=*Zq9r7^7Tc}M`>kxNG?x2}s*Sgj#%n}HFMcR1i;f^mE=_%(?XbnxxZ zCjc(}#Y&>=i=`F+hs;cy322VtE4^ELJzR6gdSRl@N$T(t4oULvhgXt}BDR|o%%^h< z|14{>t>sX8@XNL^{oc#Na64N2g;QCBwN!W>7=tw=ETS~xvietjcNgue2ikj5>V8lX z?7wz$dWwBsg<(XAc# z#07|}7;qT*jCo`XZ*Tezf!H-@y#SfRL$6adHMHxCLyBe3)0?`F32&%!CPFd*+)ufg z4h`k9af0yoFRb0=F#XLmCict&$%S7&1p8zcVvY+5G6 zR$<77foTd3fEwt6XE3{LL#Xz>I9i~=3ePaq_w{E{mZ1-lRB3Ep_r3{|4SjML^jVuO z^&fs(tjOm=x_dm>%=68jbXN;*Q&`-HgZ$}RiemJo$_>Zd)u_0L=Xu^9bLf*)Lw^ z*>M|Fk}qiNX6;dsUsuKk)-{-z~9g z^lAk09Ut9A@s(reCY9tP0`?$8!EeWZu8rR6;Shc6I}+ZpVk!o{3gHo{vwd{nwJy-N z@D?bY`b+{$j`_vO?)tj-Ek&5{qp9Z43TnGA3M&2BZdWGzL)h<`-n7?AJ;IO^KYVhP zG_Yvw&h>bvIFhXBoL4XHw>@d!UfRF9<^{G1Thcjt)h6X` zv@R4Kd3DBJ*T*?N3q&(4^rTo`&8kZMJp~71Ha00drg7o<9o3Sf{K7!33L0h9Q-8XA zlT6e+$FS>@4OCNpFZ}rxb7M$!vpnk4Ig-SDm92t``YdJ^88W2b$gTa^(xMcFEs8R(DMkFZWA{NxK^X4&d!wSOEmY) z8?`9T^42YxDqh*ppYpIIH@_dA0t-RE#r`MFs_r;L;yF8PnoNryYGypf-g2&*l3e8=4JM>0t#Lih#l*kD>8GKwFz=fQur(=Q#EEM0B(JBf<^ADbVZL-WpQ1XSwkf>- z(Ovhj06d-G(et4^aL<;)u@&cu&-?I}w_`KU7mH-Y3LWd(ZLM_G^id`)^=rA>}}#vz-SRME%qLMk$j8Ixl~n#yMiCx~o}YsW=~~ z)LrgrmTJ6%61mjEw8KPu(+f_|M=59p?ew9XW6S9Ks;Un@LrNSHa$YRULk0riIm=xL zlEVjDQaKEmVZuQb1F&w-L;5!ET$gGcsyY@#?vZt;_cp@WU%3kR*gOs6G+| zQv8JfqTr1XQCJ1)u7fBvl^CO573(E$zO<#%hv(--_U7(tt^G{2>=l~X7<~0yxQ)GV97a$FW=A^|SQvO+ zN;IMv#p$1aRx)s?-fuQ0oy1~7TS{zoB9a@QJVX#Srd@fhdHy`Zk^6BWY~UMHM+-9?`E|6xez?YSCBL;@To-kya-XZmS?T2g ze2mGT@dOFJA`E&_4btj?YaU9$v8QQhuz;TXwzqC<5F9WI&@MQwj|^2;dIy#MP-zI- z+A6OeS-V+~L2M%oZPFy|TsbxHnssk~bzYnn^`}}Zs9B9@9c!7Y#^9~XAzSi`8QCal z3}EG9G<2VCgq288E!&mCwQO_KTKQ>z@I`*SMJar4x4e;jTTgp`PvxwmPRn+bb*`N# z!D!(=Z|f$0!^N^wv=^B-X#DE>&o5&{T43WA@<;P)ErXIqEu#INg4|5{gSGjCDWHd| z$aLW%ec!Bg#0Swdqv#jZNY@nOi1>3|kC>|-@hJ*mw3P^JOL_XLF>asYYmvd+`JCf? zq13`vqeqjjjGw`R)2r}UN4t^Q--V4WWsV}KU($^hNr?20BA|||BjVT^v#)-6lJlbd zSMuKM5S_+?Nup!Le96qW;&g>+$NDr4u@Aj#Ms#?27&-Vf-t>O{2e*kr3B|UP;)z1EEwtQ z22i%Y^DkOY9!6A+g@?bksdA??ZSm|!?T@!Ls6KK$4Sr0-p_UdHG5_R-+Mk;fmVdZ& zj<=E`PO$7Gt;!fDA+tG@dE0k+xlYn|9^7^B(NN5gbg3q1HnBOko->*uLEdPT4->nY zS7POdf??cphGS;q!^O!q1H3B&h{WQdF$S|(rAOu2Ve7?{-Hs_3nG-h*MimyjNfzzw^g(k-p10KynGg1b2ZNGHt zLnePS<${+JMejB`O^!O0q=sk(>CvH9grZ(+3NTlQ3>xFavSap!PdGoBj~kF$m7L6t zS>Q0X2wgFTAYB?YIwnk(2icWgDmA+!KrU1#A ze0<{lpam0dG9pF0YDM(PW%06k+~n7()sC2^$qLt$@VVl2_^Aj}rG`Sq^MP04)5v1E zMh&4<9HMyg*2=Z1ze-5FkY`age0BAOTGOExCqgmTGgO+dugK6wUsiEBjboJUacn*YiF}!Ni6Hs}R7{1YfB49Hq)~)z&eYJCWrgo^hCp@fMDNT}z8Ya8 z`}b>_1nP0R*h%x61MndcK)-s*Kqli!=v&WxAiGF-$n)(PKu{^>fCQK+pwDuo22D_b z`3=q!Z?5nm@_FIx2sWv!aG~c_pc)g?x3{Mexk>zMZoJ)aKeWd4;(o(u0shAOZ}E!a z)od=zNHA&BleHAWXgqS+K320T3>YxhQW=JgVea7{lVrfV zSZY|h+YD0D6T6#|8QlnuH!>|z8w~c|AGy7@&F!n3vyROYn<~Q3DAfy1`GQqZaxXU* zA|a(wQDsi~g5H=j^9Mw_;Q_wL^jUhup(gDiu1asjL9xm@#`{ThI<8*2@4hSHRqHvKOJF1adOvW|Ij^)vsbfm7~* za?tGQA0f(Cd`NsO!85P#pH>JywRc+AW{6C1?>U-53W>WW7av7#JOZ!Fdw62xy*Ud4 z8$R)I-MB_p5crnZ$ z%Le`OR(BxWufHEjlxOTYj`0t~|( zuFov+GXu=-d+aUl=kjVj*f3c z=;`+TeutWq?F)(1l0-WqU-+-gAAVtaS5Fra?aS{@SC9Ufd;{nuhyEpKRP|E&9%S+@ES7$M zi#!7;pL13$l=e!y{)j*<=2;)~vlQKJvIGHSO*=+StAC9HSG{^S4bAn)F*w%wQB~B{c!}g(grO-vpX;A1QX_fztgj&pm zbgvXznx}@yc^Ku9@mglL4+(XWKPeVV7oE9Ls2(*myf5P2 zi=ZRXdQfgfmH+mK;QjOxNv4-f>--Fm-=jF3Fwl1rv2NMcw!d+A(0^eFu(Jbvh9m(& zTSVfQrPlcgKcpiFAmcA)tVo#+tv4QzNzWs6qae>%k&wcZAe*nM+F`!9)cf+U@pK=l z61@)tC+mC{3yR|Qm4vwR>tR7$2infJoTY@HWnl>F{(3Ab6ERp)gHz6H?p=u4KdUFp z)u#Jl_>;SA5P$zP^V4~s@rGC}{ij$xndPE%rYb?7Z8a^UKmz$<^$F7!qx!uPq>S}+ z?{U(47L{{K{IEhvO0TqPYtAL!a0ikZ-pgx&B zfr6%uNVg$YLSL1J;psZt4@W*V+jrHOwR|IF@Mru{OwwuK^}@eg7xrJ_08=+xGJ$p( zK7}rBsp}sb`r0_(P2{Eay-BR*M3tTgfiXjcsmyuOVm0e>G_#xJwY5K4o6v{gG3XOO zT0I>^78-F~(3H^dOhI`GZbLWP*qz4zCK>9IX*qFd>5E6;1h)UnGqb?75^>pxzsy`+ zh44FG8T`I%YH7v|eTUKOdGbu?!}+YNR7h^gjC?1UDUToXb8V>C+Lj@>i9$|DtXLfU z+6+gD+tn#*&h>oL#uhs&`wq!K5*m$X50Yc=wl}#wEy8(c{Zs&WTi_$68!)v~Moj5J z`B=aMrrg7?eKj3+51@Rmgq*6d!EyB(69J5QbtY;1dr{(O34NW1HlB{>K{mW{Dj4S2 z|Hn}L{u&C_x7zo>Z!$o`z<}_6QA6w5VEL8?O>MK27W3-t%YS4QSsthQ8pyd;x8m(vPjp&?G9dkM+1RSA7Q69TiQ+jWddfx|Y+Ly|!n zeTIuoiHS(u8%+2v<~*hBxTl>$`RExZK4e1<1Jg8MkQ6{<0)RK8{qNfKB_1?JI9Nph z*}p|wVVF;hESHZM#i-c`)|{MU!dX5eLs86xLf$fepmIQP(83>5Abj3-=7e_$ln}1$ z@kv4#1%M#vBWG3M#Yi@-rX+WCCJ_Hbt=l+7eQMT2wCDrPyj?yyS&ICeFdBD8l&5H+ zuLT9DB{Pj)LTtRD6gy_u4c*QSv$;yShmEw;eLU*`O~WT^dW$to3C!aCjCin?W7Gje zIQhZ<4W+uq>eZHjRAdh=zLa&A>Km1yasr>_Xt`Pu#7n>?DwF2eARXUDH&G{7#=X1p z-$Ss$o*Q1}%~vulj$@W8v9#3lN7cG3Id5IRGfM_HKLN}^@J+`b)S)DAwAfRP@9l1G z+LCWmo9)0Oli%6-dDW2pJ-PTlwEPuntC&z)qYcS}9hh)IZVQ#~G=-MDQjIma6I4(x z5@ZjdwA;U<6E%QNLjUG5)PqDt_b}m$^G|{wiE%A8^1gvI6nWvjbnVeFr=ZUkM11e_=rqn5qH+ zEw_Ft`8X`IY@Om=bN6@ct$MrxZ0wY0SUXNp^^!~p0nzMLjVyA4b#mkwd5^=GQGwu? zIF$XbLlM-EMLmVl&;BA#ITBPh8T4JiViU2q2E7a=L~=SVIaI+=d&&5xad=L z@t#gl3~dRhWXcY+k~B54QWx@fwq^Xl`Yhqp{VPXO^1T8ww$MvN;?Mf8_L$Gm-Y^?B z$zO7-DO?9Y%I|*bTf#=w=^NLL#iYp^2Q-$Af1~a^cFuY?P(u5WVDn?CB+6LTf*U*N z@AT!~A=kKFyv@lgQz$b^FNXadig_xDIk)Q+B*+SL#}rc(WRZ)wW+tP?t(V}f2v?LE z`y{5H)2@-Oza6zJk6Qkn+^^cxpfe-k(XX;5YR&lR@%*4Yu+#|X%;}f%^2E|k%E{0S zhrW`5?tisqr%W1Pm%asJqMIqb**AKy_>v`iU z4=a#)SODqgl)DQo06~wQmUZ6n0r197T&5?-0KS{53%pV(mi7QMkU~C2rD~EAu*85g zs_1fy={TiTl^_EAWNmC(7>u{JM1xH~IeYI#>S$zh)#N!{!@uR%6nONQ$zwgT^~;gw z%axwhQw4^PUMmAw?KS*CAPZP;!m7Xt zd;KCDGt^<$tIPxdatw22!Lq=C-v;+B=E;ATir~+WtTkE-CPAM9ZAt*c%V;RiC{0EB zLrtrL&;}1Y^`NVv+$4swm+^6Yi`vSS;Y{Rs!&%WtN5ehQ*86BmqS%cftke6>xdYL7Y(*-^j`jB%ASTzBoj$viMg4<|Kn%gHI<;pg^)o0# z#F#XRW~`hj7Xl`P-YXp!66JCZv%8dMhH1TRPtpzTPkzDT5ZWJF0$lrPm}i>j6k&9% ziM5n0ysR*CngJhmvLK)`#jKtFoK9&eT$4B6hU;^550iw27;$_Y>2~{uq}%5SEAK!? z2{8glGvQ=(m);0%pQ4}$1yqpD9s^ju5doynB{Z!8htlL%x5kf49*HTOEN4{hdZSfZ z?3>=D@dY5dpHX6$90%E`L6j$BRNo{;Q)`(k5K>_Ge5CUOJjN;NjfxRn^-m==BP=hmgn)gm3>R}qeP)P87UDOcG&o>Eb_(dp z>q!iLz_V=pwG4nB0ZlqCKj_7UX8Xqcy@S(_ztT5F&Y}rbGRkChXeg%70k*@b{OWU4EWnBYRv^g<+r$I1OKw2UVVH1HavU%SXx#gg??3-eg;~DI zk#p(RtrrouryaSsr%j)rnCA_Vll~}vrn%Rq{f+bZb_O2wTwY?zvDisQzd^bq-7``H zqRb{2dJ(JcE$ZRo!mnfMu+LVbj#AqGwzWHj>P8qPcNnIPKMFuCqd6rZC!oJ#X4z|MhDQn5-UJ^tn@Ja`O(3J~IMDmq0G)JqJK^RjLOK z0?R_ylmV&!m2jeJdD-mGt!jfmre6?Yr}GvI=ibGQy_KGcOAR|-x@M`^WNqZ78x3|! zwkN4Jb+J#+^5SXMVDR-8Qtg#TJY4&0YpbjEgxkV@10ZBZ)JI+=6F#FI>N8L1=2{n5 za=gOV&g=e8#O_*_tVf4_v*sblKJF)fT{9^;HlAY|O&akEJQoI+yCVXx%TYi}kKQL? zYc!iP&*}WAF2*IWu;={j^J35IjzDn%Wshc|NJ$a+;5Oa#WGrw zd|9b7&sMHw4?`M=ZYLXmWy?7NUZP9nP_o~;-oB#-z?ng?+#JtmGc>Ghsl<({fBvGJ z^CxrPL&;UCpZMP?MUCt=dub9B%a}zx$1C5nHx`HCKCRUWwc|C%u3^qB(P(yIo=ZkT z1Xwkt5?OYl_s8Quf!@df7jGel!R$iq;}w0zAim^Lbn(S!u4BENHgqH7H3yt(c^7b6hUHOdk={9_ow z2O7IAKud&a6(9w`0(0*KKZchmi9YQWdwNa#ewZ!I4GvfQ zvC|YtvjbXTNzq#^z5BDbBKJ&bp$Uh89PV_~APDf2)3jadK#dKx>Oj}Zg3J%ZQ1AUGO9nLe z#}-(nGxYCpgnPdwv0DRYm`p;NnQv} zEB9g?Uq^K*Q3tImo-f*R0HX#>AX(=T%Q-$U?7QEgI4!6`q{mPU)Q=t3z*_ z3ZhJEVJbWA{O-Ahgh*eT$^tI*vLxZM_-Wb)4j@f=SwG_UYks?+UX#PCs;E$CTPw|^ z?5xOb=)&-&|K&d89q%m2aEpvUvNw(~@K$SP=aJa0Xucu6W+k((_N0ni@!rp)fp6bx zh`8!W-!8_y8+@qnRr@Lf$;Ye0_$xk-?%|ls^RhdiHj9nqH-mP)_3N!uYr;Cy46ooF zclhXnZQ-vtfMBG&=J8-);AeEf?NuWICgkx7Vh#!tKxcq@rFSPsS_xC08d*QMs1~8$ zcClFAEYn+R6qGio$@Iyg`w`!2Ew7wB5lGz=jcH`c6i#!bq5TxDrLp@{Jx}^tBh5nd zE7Mcy4-^9dKL-Qy;V*nn0%-}iA9If94vnB1TXAPzABX2zmL<(3do^G25|uY zt6GpCQ@fF^xmFI4fI6S(Od&&{t)(OwX=eJK9cjHsE)4qzI)}1jJ=lFmde(M=LC|Vs%=0NOC*ee zmlTgKXdV*3|Hi~juVhPH(3|_g-Jwk8f3gYcR7yn@LN4<&?(@v~ z1?PLu`@QdZ&UeoF65pP6#T+=hL76XQ9htarzXM)*w=)D9^^V>6wnudJHrFZOg6nrz zR>!OCRjFb?|CZ=R?qU5SS6m*)&u~_|9N=O_mj6nnR$9E`MQAxL{Av^<0V-i9SDeKY z2Xj$j804K2skmD|P3dXepRcq;7hvGAxJ#-ndqy$e1v)Qur7$ZK^g&;6a01I(T++yvEV>xWtGJH~v2rh>=^_sg`#e>tn;KK&MhIK<1{?S?(=Ie5k{ z4kSxi)Ax{??mJfN?)(F|VjBnhWFd}?uP&t9nYK|*)&5u?JSOv?A1@w^`H_}@33wuj zz(5KWX}pqz!2$!H?)-}vpvL=lwlU?Vs=hT&5y6Pk15<_IHto(WT(4e1LkjX51iRb~ z#LDxOG!NAw0|h^TUi}yK2#JFpkqZ}9gk_T-la7Kbsppy74-Pj1T%>w{t1b$xp92nX z_bKIRtLFS_9t@}v-BS6*+ygKV!%EXnCxra)&xmlh{u)yweLYP2k@^YTkg?vFF~hc| z0)wrfd1tmpC!_|e-UtkI@x*Z*=}HeQ6qA~jYz|dB*B>8JS6qWu)@R*z4L73|`={j% zBl0G&=+4fRMb;%9)b9u+gNaoNZIy=7vcC97Tcf{M`VOlwD|f&n@P7dPg$mg~n*hci zwjut|*y=farfS=v(Upyly3VxJ_&qP4rir?o@N>$2jAX_#yJFL(-XH1jXS-nwsQ?Ay zxbmOQ>HjH!JUN&?M^_LM>E%>t9H@{6r;MGS^B9NDVD42!cgVYt5F=HD5ig{sS~uke zEW9bUEojfFcGyQI(TP}1uf1Azj1fXv?}M23u+rC56KiL$}R#X4)_Z5Jz) z_2+F47(7*G3$&n3qZ&FAE7HKwexVd~LQ@R2J% zIjx$Ud1tMI129s{sO&L*Zd!rd`~`6!w0Le5v$6OfALke~ZmJ zhugDN(=WYt-W-AL2(WVvFd!AzHTV|}%ldu`*6x-Ug`Yal8@46UDlAh`ktg*>>hR5N zr_gJZzJ{mv8=QzFOu|$>VN3iR%5+6s3+3m9Siyoelw~c@#mJ))(@7DA5-*T2VB(N~ z&vpl(U2B!8;OtD+uzmmS!OGv#S_j-DL7W(qhr{8LQj}*{@7A^hES!@JLg*U85U!(E z5dQbeBaShBCTRBIx1`Oa%xUOirkjFjonp+-#ZJNwGPQuD4T{;8__dyBqZDF~<2N(! zg(=UJl1#Lm48cCM(Y**Q;?C@3O73Zv=ur|cvbse41F{(W8r^eFNT6SM$F84snA#3P zz+E|WhnhWR&5KyM>tlNZ+I#V7X!D24NfXtqKd-6z2GE`QIv?-h6DME#sq%rZwFw{Y z*JSRbxY(-&I%|Kt+hyzSm+bZWw3`D`9hZ%<`+mnQ!^HP+PVlaxc?3V;BXVJWdTLGf zk3g4?+))1k*FtsP7o2k-;^zD(OI3Z$XZuB#T?{kG^WUW`U|^%(M*F8qCl@l%>l{Ko z87LePC`z*j3BturAA$XRw?eX#Er|oTqidd^+X<{O26nCaIQoQ$)(8zXjjjS$K^A*?g>TK;DJ?9rw+lVbAQI>1`=X{f(|(ccT+7||q(rbhh91P( zi#bflg_FaaXdq}mp({&j3ax9yiJ0$u)+ybF!mUMJzaqj|zell`94GP{4CTBs6$JS+ z=AWDQSuA*Qrrl7UIL5&4CC^@1Ys+GfO)z#@(b4x=M-%%Cu{~ijxLq{8e!lu73|iCt zZDOx`_2$ZEgn)%v=Q?GY%!rA+?N?pX=_=fTyQgH(H|Z5)8yp*KR0(ubhURN5OBYKx zN3JA95wX0t9SM1`vgBf@6ZVYn-kP9fcy)hdwbH z<#BGQ8$%-vH2Bu^ru-Be-%AxW{kHWsbTq?-iHr?Tj|^J}`{W0H=*`qe;H+S|cz zW(c6@ECg6vR!EJldBPZzhC;TWqdrYvZ5dzSQD^Cqs@#HEO@vXLW>>NqU|e1mfDwng zmJu>1F{fkN>qwSFF3Nh8F@^rn8=aXywV_-+e;<^kcq`5D!eGtW*=_3wI#J@W#7;s_ z3B6ozemrHLv-gv{?epY0(qS(=8eyd2Y&vBn6)4JIbFm&p4pW00b9cxFm8J`?E+4W$ z0Qg>OJCn)>t3CuTR${>wec%yz zw3g&nc{wb)RxSSP=ymv`^><{Deoc8aS>7V=Ba9KGc59MaXgl^D9GrG2Y0)n?0AgVxXx)j7#FcrS*4>9_)ESh z5f|xQ6#6hb!$+W2qOamiT>{=hxyFZo8;Q0P(Pr%0CRc33X|g|HZEh&y2q(3ew3gbt ztd+&SVbPoYlOo46iSaOYqRxKBp%dMVcBiv!MO}3{4^l-XgQuHI^=K_UJ~Zal)p3{R zq9|d|3q8FJO(0Dbhc>7LZFD{T$%4DyX3a{|V4h8*y-${`Y1EzspwcH(0Xsz57sd8A zF!X>`QrW%6?x>Z456>D4W9L60m!5mu5l;y3y_jq7uBthDP#igu4Z~H} z{dkZG8Tqe$k$jZ0Nj@W`TQS!Vw94*c(w3kX3hzx1CF;sfTI2cVdXwZPEAktw&7}UL>O|X~KdyoEQ!tX4@OqQpu)KV$wU0@`gJyJQsqRQMOGm4YkBEp)^Ep zBVN=_k1R{LCPtBo&|)ZUa*m-(76Zdd7Baqj*^>0Zi{%Kb#Wcfr`tw!V(_1sOV6*|~ z*Dg^zVJnZ`=HB}8Gl|%AT{v4pvM&j+XaGsG1-ZV_8+zk>^{dir6wc(rgCES(0o*m4c`OEHO z@h#x5wbwr@ew@-O+{G3%}m-Ti*fx9)Bb7|A|13w_Ii959&Pw TYeD;85qP@#xwQWC_M`s+`fXkK literal 0 HcmV?d00001 diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 765714c..7b6d739 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,11 +1,12 @@ import React, { useCallback, useMemo, useRef, useState } from "react"; import { useI18n } from "./i18n"; import { redactApply } from "./api"; -import type { PresetKey, RuleInput } from "./api"; +import type { ImageMode, PresetKey, RuleInput } from "./api"; import { HeaderBar } from "./components/HeaderBar"; import { RulesSection } from "./components/Rules/RulesSection"; import { PresetsSection } from "./components/PresetsSection"; +import { ImageModeSection } from "./components/ImageModeSection"; import { ResultPanel } from "./components/ResultPanel"; import { PdfViewer } from "./components/PdfViewer"; @@ -33,6 +34,7 @@ export default function App() { const [pageSizes, setPageSizes] = useState>({}); const [isDrawingRect, setIsDrawingRect] = useState(false); const [presets, setPresets] = useState>(EMPTY_PRESETS); + const [imageMode, setImageMode] = useState("pixels"); const [isDragOver, setIsDragOver] = useState(false); const [submitting, setSubmitting] = useState(false); @@ -84,14 +86,15 @@ export default function App() { const rectsForApi = useMemo(() => { return rules.flatMap((r) => - r.kind === "selection" ? r.rects : r.kind === "page" || r.kind === "rectangle" ? [r.rect] : [] + r.kind === "selection" ? r.rects : r.kind === "rectangle" ? [r.rect] : [] ); }, [rules]); - const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; + const fullPageRectsForApi = useMemo(() => { + return rules.flatMap((r) => (r.kind === "page" ? [r.rect] : [])); + }, [rules]); - const hasFullPageRule = useMemo(() => rules.some((r) => r.kind === "page"), [rules]); - const hasRectangleRule = useMemo(() => rules.some((r) => r.kind === "rectangle"), [rules]); + const hasAnythingToDo = rules.length > 0 || selectedPresets.length > 0; const handlePageSizeChange = useCallback((pageNumber: number, size: { width: number; height: number }) => { setPageSizes((prev) => { @@ -134,6 +137,7 @@ export default function App() { nextRectangleNumberRef.current = 1; setRules([]); setPresets(EMPTY_PRESETS); + setImageMode("pixels"); }; const onPickFile: React.ChangeEventHandler = (e) => { @@ -232,10 +236,11 @@ export default function App() { const r = await redactApply({ file, rects: rectsForApi, + fullPageRects: fullPageRectsForApi, rules: rulesForApi, presets: selectedPresets, - applyImages: hasFullPageRule || hasRectangleRule, - applyGraphics: hasFullPageRule || hasRectangleRule, + imageMode, + applyGraphics: imageMode !== "none", sanitizeMetadata: true, removeAnnotations: true, removeAttachments: true, @@ -324,6 +329,8 @@ export default function App() { /> + +

+ ); + })} +
+ + ); +} diff --git a/frontend/src/components/Rules/RulesSection.tsx b/frontend/src/components/Rules/RulesSection.tsx index 6098e7d..145555a 100644 --- a/frontend/src/components/Rules/RulesSection.tsx +++ b/frontend/src/components/Rules/RulesSection.tsx @@ -144,9 +144,17 @@ export function RulesSection(props: { {canAddSelection ? ( <> +
+
+ {t("rules.selection.current")}: + {summarizeSelection(pendingSelectionText)} +
+
+ - -
-
- {t("rules.selection.current")}: - {summarizeSelection(pendingSelectionText)} -
-
) : ( <> diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 714abb1..09a9737 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -76,5 +76,12 @@ "rules.page.title": "Page", "rules.badge.rectangle": "Rectangle", "rules.rectangle.title": "Rectangle", - "rules.action.stopDrawingSelection": "Stop drawing" + "rules.action.stopDrawingSelection": "Stop drawing", + "form.section.imageMode": "Image redaction", + "form.imageMode.none": "None", + "form.imageMode.remove": "Full", + "form.imageMode.pixels": "Precise", + "form.imageMode.none.help": "Images are never modified, even when a redaction rectangle overlaps them.", + "form.imageMode.remove.help": "Any image touched by a redaction rectangle is removed entirely.", + "form.imageMode.pixels.help": "Only the area intersected by the redaction is blackened. The rest of the image stays visible (possibly with lossy re-encoding)." } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 2eb43f8..7836ae7 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -76,5 +76,12 @@ "rules.page.title": "Page", "rules.badge.rectangle": "Rectangle", "rules.rectangle.title": "Rectangle", - "rules.action.stopDrawingSelection": "Arrêter dessin" + "rules.action.stopDrawingSelection": "Arrêter dessin", + "form.section.imageMode": "Censure des images", + "form.imageMode.none": "Aucune", + "form.imageMode.remove": "Totale", + "form.imageMode.pixels": "Précise", + "form.imageMode.none.help": "Les images ne sont pas modifiées, même si une zone de censure les recouvre.", + "form.imageMode.remove.help": "Toute image touchée par une zone de censure est retirée intégralement.", + "form.imageMode.pixels.help": "Seule la zone intersectée de l'image est noircie ; le reste de l'image reste visible. Recompression possiblement avec perte." } diff --git a/frontend/src/styles.css b/frontend/src/styles.css index bd7c0e6..21c2c62 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -78,6 +78,39 @@ body, box-shadow: inset 0 0 0 1px rgba(43, 72, 165, 0.2); } +.segmented { + display: flex; + border: 1px solid #c4cce3; + border-radius: 8px; + overflow: hidden; + background: #f8faff; + width: 100%; +} +.segmentedItem { + flex: 1; + border: none; + background: transparent; + padding: 6px 10px; + cursor: pointer; + font-weight: 500; + color: #4b5878; + font-size: 0.92em; + border-right: 1px solid #c4cce3; + transition: background-color 80ms ease; +} +.segmentedItem:last-child { + border-right: none; +} +.segmentedItem:hover:not(.segmentedItemActive) { + background: #eef2ff; +} +.segmentedItemActive { + background: #dbe5ff; + color: #1f2f6b; + font-weight: 700; + cursor: default; +} +