From 17b4cf6cf57089b96a65537126d4071d69bd215b Mon Sep 17 00:00:00 2001 From: Fabio Date: Mon, 26 Oct 2026 22:03:35 +0100 Subject: [PATCH] Aggiunge documentazione e script per face KNN e face scan --- KNN-SCAN-flusso-shadow.md | 162 +++++++++++++++++++ KNN-SCAN.md | 164 ++++++++++++++++++++ docs/face-knn-source/deploy/config.json | 14 ++ docs/face-knn-source/deploy/run-face-knn.sh | 13 ++ docs/face-scan-source/bin/face_scan | Bin 0 -> 153512 bytes sync-face-knn.sh | 61 ++++++++ sync-face-scan-source.sh | 48 ++++++ 7 files changed, 462 insertions(+) create mode 100644 KNN-SCAN-flusso-shadow.md create mode 100644 KNN-SCAN.md create mode 100644 docs/face-knn-source/deploy/config.json create mode 100755 docs/face-knn-source/deploy/run-face-knn.sh create mode 100755 docs/face-scan-source/bin/face_scan create mode 100755 sync-face-knn.sh create mode 100755 sync-face-scan-source.sh diff --git a/KNN-SCAN-flusso-shadow.md b/KNN-SCAN-flusso-shadow.md new file mode 100644 index 0000000..7640bbf --- /dev/null +++ b/KNN-SCAN-flusso-shadow.md @@ -0,0 +1,162 @@ +# Flusso KNN Shadow — progetto s190js + +## Panoramica + +Il confronto KNN in modalità **shadow** viene eseguito lato **server Node.js**, non nel browser. Il flusso parte dal worker che aggiorna i prototipi facciali e arriva al binario nativo `face_knn`, passando attraverso il modulo di confronto, il runtime KNN e uno script shell. + +```text +Server Node.js +└── tools/runPrototypeWorker.js + └── tools/runFaceKnnShadow.js + └── tools/faceKnnRuntime.js + └── native/face-knn/run-face-knn.sh + └── native/face-knn/bin/face_knn +``` + +Percorso del progetto usato negli esempi: + +```bash +/home/nvme/dockerdata/prove/s190js +``` + +## Ruolo dei componenti + +### 1. `tools/runPrototypeWorker.js` — worker Node.js + +È il processo server che gestisce i job di aggiornamento dei prototipi facciali. + +In sintesi: + +1. recupera un job in stato `pending`; +2. lo porta in elaborazione (`processing`); +3. esegue la procedura principale di selezione dei prototipi; +4. salva il risultato nel database; +5. dopo il salvataggio, avvia il confronto KNN shadow. + +Il confronto shadow viene quindi eseguito **dopo** il salvataggio del risultato principale. Non è il componente che decide quali prototipi selezionare nella procedura ordinaria. + +### 2. `tools/runFaceKnnShadow.js` — confronto KNN in modalità shadow + +Questo modulo coordina il confronto tra i risultati KNN nativi e quelli di riferimento prodotti dall'esperimento. + +Il suo compito è verificare e registrare eventuali differenze. In modalità `shadow`, il risultato del KNN nativo è usato per validazione e analisi: non sostituisce la selezione principale dei prototipi. + +Eventuali errori o discrepanze del confronto vengono registrati nei log; secondo il flusso esaminato, non annullano il salvataggio dei prototipi già completato. + +### 3. `tools/faceKnnRuntime.js` — runtime KNN + +Questo modulo prepara e avvia l'esecuzione del KNN nativo. + +In base al codice esaminato, si occupa di attività come: + +- leggere la configurazione KNN; +- recuperare gli embedding delle facce e i prototipi da confrontare; +- preparare i file di input temporanei richiesti dal programma nativo; +- invocare il launcher configurato; +- leggere e interpretare l'output JSON del binario. + +Il launcher è configurato nel file: + +```text +native/face-knn/config.json +``` + +Il valore atteso per `launcher` è: + +```text +native/face-knn/run-face-knn.sh +``` + +L'effettiva esecuzione dipende dalla configurazione: il KNN deve essere abilitato e la modalità shadow deve essere attiva. + +### 4. `native/face-knn/run-face-knn.sh` — script shell + +È il punto di ingresso shell usato per lanciare il programma nativo. + +Lo script cambia nella propria directory e poi esegue il binario: + +```text +./bin/face_knn +``` + +Questo passaggio permette al programma nativo di trovare correttamente i file relativi alla propria directory, come il kernel OpenCL, senza dipendere dalla directory da cui è stato avviato il server. + +Lo script è quindi un **launcher lato server**. Non viene eseguito dal browser. + +### 5. `native/face-knn/bin/face_knn` — binario nativo + +È il programma compilato che esegue il confronto KNN. + +Riceve dal runtime i percorsi dei file di input e i parametri necessari, come il numero di query, il numero di prototipi, la dimensione degli embedding, il valore di `top-k` e il backend richiesto. + +Il programma restituisce i risultati al processo Node.js, che li interpreta e li usa nel rapporto di confronto shadow. + +## Quando viene eseguito il flusso + +Il flusso non viene eseguito semplicemente perché un utente apre una pagina web. + +Viene avviato dal worker server durante l'elaborazione di un job di aggiornamento dei prototipi, dopo il completamento del salvataggio principale, se la configurazione KNN abilita il confronto shadow. + +L'assegnazione di un cluster a una persona accoda un job di aggiornamento dei prototipi. Il daemon/worker elabora quel job; il confronto KNN shadow è una fase successiva del lavoro server. + +## Cosa fa e cosa non fa la modalità shadow + +| Attività | Componente principale | +|---|---| +| Gestire il job di aggiornamento | `runPrototypeWorker.js` | +| Selezionare e salvare i prototipi principali | Worker e procedura di selezione | +| Coordinare il confronto di validazione | `runFaceKnnShadow.js` | +| Preparare input e invocare il programma nativo | `faceKnnRuntime.js` | +| Avviare il binario | `run-face-knn.sh` | +| Eseguire il calcolo KNN nativo | `bin/face_knn` | + +**Importante:** in modalità `shadow`, il KNN nativo è un controllo parallelo di validazione. Non è il motore che determina direttamente quali prototipi vengono salvati. Per cambiare questo comportamento servirebbe una modifica esplicita al flusso applicativo e una verifica separata. + +## Verifiche sul server + +Per controllare la configurazione effettiva e i punti di collegamento, eseguire sul server: + +```bash +cd /home/nvme/dockerdata/prove/s190js + +echo "=== Configurazione KNN ===" +cat native/face-knn/config.json + +echo +echo "=== Collegamenti nel codice ===" +grep -n -E \ + 'runFaceKnnShadow|runNativeKnn|launcher|spawnSync' \ + tools/runPrototypeWorker.js \ + tools/runFaceKnnShadow.js \ + tools/faceKnnRuntime.js +``` + +Per verificare che lo script shell lanci il binario previsto: + +```bash +cd /home/nvme/dockerdata/prove/s190js + +cat native/face-knn/run-face-knn.sh +ls -l native/face-knn/run-face-knn.sh \ + native/face-knn/bin/face_knn +``` + +## Nota sul fallback + +La configurazione può contenere un backend di fallback, ad esempio CPU. La sola presenza di un'impostazione come `fallbackBackend` non dimostra però che il codice esegua automaticamente un secondo tentativo in caso di errore. Per affermarlo con certezza occorre verificare nel runtime il percorso di gestione degli errori e l'eventuale seconda invocazione. + +## Conclusione + +La catena è interamente lato server: + +```text +runPrototypeWorker.js + → runFaceKnnShadow.js + → faceKnnRuntime.js + → run-face-knn.sh + → bin/face_knn +``` + +Il worker principale salva i prototipi; successivamente, se la configurazione lo consente, viene lanciato il confronto KNN shadow per confrontare e validare i risultati. Il browser non esegue né lo script shell né il binario nativo. + +Questo documento descrive il flusso ricostruito dal codice esaminato. Per confermare che una specifica esecuzione sia avvenuta, occorre controllare la configurazione attiva e i log del worker. diff --git a/KNN-SCAN.md b/KNN-SCAN.md new file mode 100644 index 0000000..4de8705 --- /dev/null +++ b/KNN-SCAN.md @@ -0,0 +1,164 @@ +# Gestione dei prototipi facciali: flusso di assegnazione e aggiornamento + +**Progetto:** server fotografico `s190js` +**Percorso di riferimento:** `/home/nvme/dockerdata/prove/s190js` +**Scopo:** descrivere il comportamento verificato nel codice, dalla nomina di un cluster al salvataggio dei prototipi usati per il riconoscimento facciale. + +> **Nota sul livello di verifica:** questo documento descrive il codice esaminato durante l'analisi. Non dimostra che uno specifico job sia stato completato nel database in produzione: per quello occorre controllare i record reali. + +## 1. Panoramica + +Quando si assegna una persona a un cluster dalla revisione dei volti, la route aggiorna le associazioni dei volti e richiede un aggiornamento dei prototipi per quella persona. + +La richiesta viene registrata nella tabella `face_prototype_jobs`. Un daemon controlla la coda e avvia `tools/runPrototypeWorker.js` in modalità persistente (`--persist`). Il worker esegue la selezione dei prototipi e, se l'elaborazione riesce, salva i risultati in una transazione SQLite. + +Il confronto KNN/OpenCL in modalità `shadow` viene eseguito **dopo** il salvataggio. Serve a confrontare i risultati e non decide quali prototipi vengono salvati. + +## 2. Componenti coinvolti + +| Componente | Responsabilità | +|---|---| +| `routes/faceReview.js` | Gestisce l'assegnazione della persona al cluster e richiede l'aggiornamento dei prototipi. | +| `queuePrototypeRefresh()` in `routes/faceReview.js` | Crea o aggiorna un job `pending` per la persona e l'utente. | +| Tabella `face_prototype_jobs` | Registra le richieste, lo stato, i tentativi, gli errori e il risultato. | +| `tools/runPrototypeDaemon.js` | Controlla periodicamente la coda, recupera alcuni job bloccati e avvia il worker. | +| `tools/runPrototypeWorker.js` | Calcola la selezione, salva i prototipi e le valutazioni e aggiorna lo stato del job. | +| `person_face_prototypes` | Contiene i prototipi facciali associati alle persone. | +| `person_face_recognition_evaluations` | Contiene le valutazioni di riconoscimento calcolate dal worker. | +| `face_recognition_index_state` | Indica che l'indice di riconoscimento deve essere aggiornato (`dirty`). | +| `tools/faceKnnRuntime.js` e `tools/runFaceKnnShadow.js` | Eseguono il confronto KNN in modalità shadow, se abilitato e configurato. | + +## 3. Dall'assegnazione del cluster alla coda + +Il frontend invia una richiesta alla route: + +```text +POST /face-review/clusters/:clusterId/assign-person +``` + +con i dati della persona e gli ID dei volti inclusi. Nel codice esaminato, la route: + +1. verifica che la persona e il cluster siano validi; +2. verifica che i volti indicati appartengano al cluster; +3. aggiorna le membership, segnando i volti inclusi come accettati e quelli esclusi come esclusi; +4. assegna `person_id` ai volti inclusi e rimuove eventuali esclusioni corrispondenti; +5. gestisce i volti esclusi e le relative righe in `person_face_exclusions`; +6. aggiorna `face_clusters.person_id`; +7. chiama `queuePrototypeRefresh()` con `reason: 'cluster_assigned'`. + +Questi aggiornamenti e l'accodamento sono eseguiti nel contesto della transazione della route. + +### Come viene accorpata la coda + +`queuePrototypeRefresh()` cerca un job con lo stesso `user`, lo stesso `person_id` e `status = 'pending'`. + +- **Se lo trova:** aggiorna il job esistente, compresi `reason`, `requested_by` e `requested_at`. +- **Se non lo trova:** crea un nuovo job con `status = 'pending'`. + +Il riutilizzo riguarda solo i job `pending`. Se esiste già un job `processing`, questa funzione non lo aggiorna: può creare un nuovo job `pending`. + +## 4. Come il daemon esegue i job + +Il `package.json` definisce: + +```json +"prototype:daemon": "node tools/runPrototypeDaemon.js", +"prototype:worker": "node tools/runPrototypeWorker.js --persist", +"prototype:once": "node tools/runPrototypeDaemon.js --once" +``` + +Il daemon: + +1. conta i job con `status = 'pending'`; +2. se non ne trova, attende l'intervallo configurato e ricontrolla (salvo la modalità `--once`); +3. se ne trova, avvia `tools/runPrototypeWorker.js --persist`; +4. dopo un successo, può avviare immediatamente un altro job pending; +5. se il worker fallisce, registra l'errore nei log e attende prima di ricontrollare la coda. + +### Recupero dei job bloccati + +`recoverStaleJobs()` può riportare da `processing` a `pending` i job che hanno `started_at` più vecchio della soglia `staleMinutes` configurata. Il job viene contrassegnato con il motivo `stale_processing_recovered`. + +Questa è una protezione per i job rimasti bloccati in elaborazione; non equivale a un nuovo tentativo automatico di tutti i job in stato `error`. + +## 5. Cosa fa il worker + +### 5.1 Selezione e acquisizione + +`loadPendingJob()` cerca un job `pending` unito alla tabella `persons`, ordinando per `requested_at` crescente. Quando inizia il salvataggio persistente, `claimJob()` tenta di cambiare lo stato da `pending` a `processing`, incrementando `attempts` e registrando la firma degli input. + +Se un altro worker ha già acquisito il job, l'aggiornamento condizionale non riesce e il worker segnala un errore. + +### 5.2 Calcolo e controlli + +Il worker carica i prototipi correnti, le esclusioni e una firma dei dati di input. Esegue l'esperimento di selezione e filtra i volti esclusi. Se non resta alcun prototipo selezionato, il job fallisce. + +Prima di salvare, `persistResult()` ricalcola la firma degli input. Se è cambiata durante l'elaborazione: + +- il job corrente diventa `superseded`; +- viene creato o riutilizzato un job sostitutivo `pending`; +- il risultato registra l'ID del job sostitutivo. + +Questo evita di applicare una selezione calcolata su dati che nel frattempo sono cambiati. + +### 5.3 Salvataggio dei prototipi + +Quando gli input sono ancora validi, `persistResult()`: + +1. carica le esclusioni di riferimento; +2. mantiene attivi i prototipi bloccati (`locked`) che non sono esclusi; +3. disattiva i prototipi non bloccati precedenti della persona; +4. inserisce o aggiorna i prototipi automatici selezionati in `person_face_prototypes`; +5. aggiorna l'ordine di selezione e i metadati; +6. ricalcola e salva le valutazioni in `person_face_recognition_evaluations`; +7. aggiorna `face_recognition_index_state` impostando `status = 'dirty'` e `dirty = 1`; +8. porta il job a `done`, registra `completed_at` e salva il riepilogo in `result_json`. + +Le operazioni descritte sono eseguite dentro una singola transazione SQLite. Se la transazione fallisce, le modifiche non vengono confermate. + +## 6. Errori e stato dei job + +| Stato | Significato nel flusso esaminato | +|---|---| +| `pending` | Richiesta in attesa di essere elaborata. | +| `processing` | Worker ha acquisito il job e lo sta elaborando. | +| `done` | Salvataggio completato e risultato registrato. | +| `error` | Il worker ha registrato un errore in `last_error`. | +| `superseded` | Gli input sono cambiati durante il calcolo; è stata richiesta una nuova elaborazione. | + +Se il worker fallisce, `markJobError()` imposta `status = 'error'`, registra `completed_at` e scrive il dettaglio dell'errore in `last_error`. Il daemon seleziona soltanto job `pending`: perciò un job `error` non viene ripreso automaticamente da quel normale ciclo di coda. Il recupero dei job `processing` scaduti è un meccanismo distinto. + +## 7. KNN/OpenCL in modalità shadow + +Dopo che `persistResult()` ha completato la transazione, il worker prova a eseguire `runFaceKnnShadow()`. + +- Il confronto avviene dopo il salvataggio dei prototipi. +- Non modifica i prototipi, le valutazioni o lo stato del job. +- Un risultato incoerente viene riportato nei log. +- Un errore dello shadow viene intercettato e registrato nei log: non annulla il salvataggio già completato. + +Pertanto, la modalità shadow è un controllo comparativo e non è il componente che decide la selezione persistita. + +## 8. Come verificare un caso reale + +Per concludere che l'assegnazione di un determinato cluster abbia prodotto prototipi, bisogna verificare nel database: + +1. il job della persona e dell'utente, con motivo `cluster_assigned` o un motivo successivo se il job è stato accorpato; +2. lo stato finale e, in caso di errore, il contenuto di `last_error`; +3. `result_json`, in particolare `selected_count` e `selected_face_ids`; +4. le righe attive di `person_face_prototypes` per quella persona; +5. le valutazioni in `person_face_recognition_evaluations`; +6. lo stato dell'indice in `face_recognition_index_state`. + +**Importante:** l'esistenza del codice di accodamento e del worker prova che il flusso è implementato, ma soltanto i dati reali del database confermano l'esito di una specifica assegnazione. + +## 9. File e punti del codice esaminati + +- `routes/faceReview.js`: route di assegnazione e `queuePrototypeRefresh()`. +- `tools/runPrototypeDaemon.js`: coda, ciclo del daemon e recupero dei job `processing` scaduti. +- `tools/runPrototypeWorker.js`: acquisizione del job, selezione, salvataggio transazionale, gestione degli errori e chiamata allo shadow KNN. +- `package.json`: script `prototype:daemon`, `prototype:worker` e `prototype:once`. +- `tools/faceKnnRuntime.js` e `tools/runFaceKnnShadow.js`: runtime e confronto KNN shadow. + +--- +Documento descrittivo basato sul codice ispezionato; verificare il codice e il database della versione in esecuzione prima di usarlo come specifica operativa definitiva. diff --git a/docs/face-knn-source/deploy/config.json b/docs/face-knn-source/deploy/config.json new file mode 100644 index 0000000..4ced0a0 --- /dev/null +++ b/docs/face-knn-source/deploy/config.json @@ -0,0 +1,14 @@ +{ + "enabled": true, + "mode": "shadow", + "backend": "opencl", + "fallbackBackend": "cpu", + "dimension": 128, + "topK": 5, + "recognitionThreshold": 0.5, + "scoreTolerance": 0.00001, + "autoBackendMinimumComparisons": 100000, + "launcher": "native/face-knn/run-face-knn.sh", + "indexDirectory": "api_v1/face-recognition-index", + "runtimeDirectory": "var/face-knn" +} diff --git a/docs/face-knn-source/deploy/run-face-knn.sh b/docs/face-knn-source/deploy/run-face-knn.sh new file mode 100755 index 0000000..ab9c340 --- /dev/null +++ b/docs/face-knn-source/deploy/run-face-knn.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +set -eu + +script_dir="$( + CDPATH= cd \ + -- "$(dirname -- "$0")" \ + && pwd +)" + +cd "$script_dir" + +exec ./bin/face_knn "$@" diff --git a/docs/face-scan-source/bin/face_scan b/docs/face-scan-source/bin/face_scan new file mode 100755 index 0000000000000000000000000000000000000000..008171e505b3c57c06df07b2b7a2625ef3cfcada GIT binary patch literal 153512 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�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

pedk(szEgO?G}(gmaPt@tnx-Fy${7;GDz( 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%0D9v3-ZpXfROj~E^+jVK=!`OqwX%OU(o z@*m1}^^wPeFUi}z4|-PI$6ik!^R0Ma^1{}*u(Nx*lK5qkZNMbk6+JLzbk~6?xn1{? zQz`u{FzsFO<-lXfz3a;YuJ~C657{&vo5UxpcU!SyhOwBH!Ki^wo@NeS;U^o{_xWGN z?~iK>ik@0Kz6e>l{0ZcNVkr(&kNB1R27Roddy$*$r7qJx+kNQg_q)eL7JKrVz*Ea- zoZhZ%9ZuU0ypetQaQ?kZ=PwF2@f!Aa%JP3Fk1-pn()b`rDm$?D%({r+V2 zPrEdi{_utE`bM_8wag*3wM9OM5BdIs9r!c0n|6=Oe6P_rU3T*KdN-4UmiOxWlKeo| z-f`Y8--~lTsn0^Mx)LAOH1kRFAZ@P3cGyO)`u}9D(oF6U$|vqL{oV9IacHumyDb>x zbw5tKvRA%EdmrXmWy=KbPgeil>Z@efF=)yeulnxvS$$O>)!*m&{{Kr~KX*!Bo9V0c z3iVa}I|T1gpTqPw)lXzcT0c+p?@9c0h8$4lJ@wNIoDx$^zhHET7?}X@>LuUsp*C!S z<2>LMzU)b?x6T80uLHXkzz+Bosz0|19=vZh{nyZ+L+G%dtbW;oi_@NkgP(Q(+MyZi zzWl_!Yt&~Z>Y2a5H_=s*dVbQgStrV>&YX-^%XjPeH-#GuiGNV8_>_&nDiAED$&pIs(P026&AU@6nK2|^W+->+H zEFUE83Z9}d$2Y68E16flH|S4#ul}W%fv1B@ch&8(aU>_}zu$ky-~2n;Kvr4fm_+}b zv7}@xIKR-#Sg>hhGwNGmq9Ml8sj*D6$AZuKq_NNkXDsQyW|g0F>Ubz?@s%{6bh4&k zz(y~=W$8!YllD+*KHwj_@;xbk(wJ~wyLs}`+lrH>tC*Op1pMtV`_OuSW1{RYzb%=a zQOSn#eCaYR$aw9E3N8IsMX?#%gdJfKe5bv+#Juk#UN&s&KEzlo3M2oe+sGHzh7Pa+ zT`MfxDEzC{meFm<|8?kJE$9HP=m1V!YAZTGoSZSrJKTZn??CpiV?FJ(OD+T}W=A|| zK(=;X=)_>vX}$;GCmV20fxWM2Sl5QKyXqd?ad+LZtH^l|uf6)7yXvBM-BUM>zKT~U z|3_hI*UjG_-hK0ibGvT-Iln{LA1zskEhG6ee%tvqk1rLzV=w8hg0}Fbm+5+z=#1+X z!3o*AuSk10oof@AfKQ^ZDTMv)Ty#0*jl*Ze|JbG$*1LzWWvnL$`XIR)m~M?vJRDrM zauQ0{EhYzN03SmAZ||&&Xu|+zRuQY$1Uv{7BiXwh~=(5_)NXSVMdO;?de)f5?;3?)RP9p4tyY{2a0;<$Dkxb3waB-EPL>nH0A6 z1T|1+@lm) zF8O}YF|GH+z**k`XWj3&zk7rKAM#xsf98YeOTvlOx^Ke<&stAoH34K0bDPPy66mW9 zg@Mv*S>yC=XN}JKX^Am)eR&z}*v>{jw`Lfz-=2lRf?-9yce)heOIPEQ3RlIN1A{bd9n;PcCCG=-&HRU_{K3Y%U>kar)cKy<*|N^klfONj#+ql&&Y%96nrjn7DVznv!0jVFcE7pA?Rs(N^btv~9*M=BiK!CvH$NBt+~FxRT{wv_!f*G!@u>%uB*375h{ zurs7`@PC$^O{~ZK?$%wt$+3q+E;G~SBTo+S$ z6p_2`a_kjnV(Xy&374ChD)VK^kQ?ge`mdz=w8*~q+vEO%-N!h5Qa=2*zmysWme2C~ z%s|w|zi`t%#!TPKJh{zdbse7O4;tx5AS+hbX4(qZWPLSzO*VFftiKdOV@)?Gf2lop z0m~;})UCWj3FN5yw1@xytuatv%uoD;J7@X)OU$BMzW6}hqAxym^DS$)JaYfv>vxAU zbRJG#Q~ezHEp)>nHjBjL`oQgLIYTYfXW0UBvoS#wmjcueJD`A}K!SM$7{=Ruyg>P&d-h&N(;@$o!lmsdPg3+KYG=M4BC z5SO%-{DyDBU+X=od~K6hlZU3kZP$_$#u|HXdH4^_Au<0G1lGJVP8>9`}IxOfUw;>Z`m%1X_xJW^|8}# z^ECWm*e`EcnA5cfJXgOuv4sv*X9IO!XV=F$z?Lmk^~H%@kp8YQ4AjTE_Ww{{FMXkq)>O%-y=1_gmxD6dt$;I%U3wE#uo0MV6QO(bE z=A=G5wU0J*j#*iSoRr;eCi8?tdwO$5VEGu+TKBDz2MWcD?uM41LatbRiE^wZ%3gjB zUhzePd@}vYeQ74aBaka*s#$a#{Y3k(9a=G$nMGUJ8`I&=Yig`Ci>8r(X3g5QyZ74o zUJt%|;N^;`)ESH)^1ar;hrxZ~3~am~);-+T|AgDxx39U_y?mY0y8bWiSt&+C8&dWTrPP&nf+q%ZOKI+a6Jk*4*qWXpm|+N z9nukB;$L=*k?2ZKZOm(r`tz|VjAbpZ{0eziJje&|r=v9)?e75BV?WDi-`8fMH!=TO z4}Jij+6O=TubRyE1KTs&-`t+rKH0=(O9oH!#Ad%sJjXkX?I3Xh_3Jth&MEiHtm=3L&rR5IL9+SGtiH3x?g(7rj7aS z8~tP2_qxKf6=M~kO%K=T@C*E0$G8r}Vzd1Gw{DBgifs$edI%Zh=UFe;*Ki%^;XT(u z7rfk4RNK1(p27VJw=4VGJX9kn*2=nY_{92TRj#Af$Rjm>^*>J@ww z=zn|X7rNfvynt_r@7)~ee}}l14cJ*8!nP7#TU3NkvaD@wUeWP`qq;uk*-`LOxiQ4Q z#5?+aW})@E0u{ zqit*&(E{c|ep>cc^^e8oqO%E)!W)iZXZnb?v{n2#aOvS-Pk%o(CB&|NR%R)3|x$X64@=f^&;Z0Vw`FSFy&4>sE-KfbNw z2fsl77j(T{yNJGjiN0UewVyt{16=lA3CymF&EET6&lB;a^w&WDTeYVD;5DZIooOSx z`~hD?I&FeE`+#}y8B-fSCcP%J``yjV$D^aW9;RP=zgzRfTeaZvHPk!pimnfU!MmHk z!21PV3q{w!M*80+(3A91>8|ACjd~~HS46jUq3bqqzMwfX&>vhmG1rg2-T|)*;J@tU zOxb2+I51eW4PCX*Gq=)3u8X~yb1UD-o?GdKF3^kGq4$F^%E&*u*m#=oEn%xp12%gWDT zvSL>|_R|_-S_7k?X>e9@Z4&ld>EP!LRd;;GARg%-s$6VvAI1$;E`H&l`bG{_&Nq1M zo}tQ_nS<)In@V=YGB$GCE z@vb$%-2)F0t=ErY{}lA^$G6(d8a9BRznT4z)r=#^8aN0Iu|IpdA37Dyd!S*_x;wVG z!ozyg&02GSMw!>poyqB1Pn*5T>DQi^-|rcG2G|SQ{bn%yz5)D1uhKU}t6$~27WRr- zFr-bvN^K7C1#3^Q%i;@)!;nwyE8DThs~&V_^^-G6INBpnnL&Stk+WwweCRP^j(W*~ z$09J4DxH_cL!^;dHg(HQ<<4%Dl^C#qq&oRPqv_q zoG;`zn;)^@0sP%B0}s~T;#pQXc$VU^@Wp%&ThI5ou))6Ha|^DhJ*-e7UtQpZ7LhoPaMrp;L9_aVPNjq;f9!%{<;o2I}|8 z>djr5#9TWzd+m`p8qdl&8N+y)H}Xna{stlll#X6Cinj*{?OF=y|DY? zf4-vY;eSRK?MZIzhSb&_EVeF$M-^}9*he28u#Xo0x9p?7bEPYvY#(*nm3_1|53o6M%s#xF~oQmgEy^Hh+klBs(#mim(A=2*?1-LiZ#^Nu?Z3Dm0QgI zkJ$CH?OxHPaxK?kqv8GMIcrZb5@Gfwh1r)Bt}*4ZLrcGN_6ErY>&$zfcx--`76r-))&sbfEW*gje9luluOR+a4w!Nciy(zo-6nTzkRxaqTUf6YvOe6?@Ui z9Q~_z9(y^^%?{yL>$h~VG57@W5xs7rBbj6N1-#emDgKZBfg)?4U_I-zJ8PEo3s2FZ zM_-@mIdXLy=MA~XHQj?fTs&Y0I1{Mx9tk{dw%oz_BdzG#mrV(jhSoN(fA+4qQ4^aM zdH&wHQT&ttF>ibDNG#Vx*5&-R@cItZwVysbpYuXt^LgkB#0tK!#+A3E$Wt23dbY4( zinr9{1p13j)&zhjx#6A$MhtctZJS(y8-3R^X-;XAf-%~%;|Mb4@~*bs16)vC`iJi6k8o~$9X@p{X8jO*|670s{(;>1LTK@N(|;R&&heh{ zktBNaNMLttVW9u`c2E0Z<}WoT(vdT}KV~jIrk>-(GJ>@IN9oUzD^35p>uO5dmd+`? zCnM11Yj)+~Gi?gtZ+HmbgZpPK5Br~d=-~h{Lvc6yCVF+1XIRrs*qm=a$3$0fp2Yn< z#I2R2;@UUDPy1^E{rl0qk6fud029iNGG4*vV_*|Emi;uk71{a(dFRj}qlf9M^yJ0D zO?1A+$SW85FnX_N@7Cq>qZypHupj(t{g*)3o3obm?~(5MIpGNTJ%Ou_zU^lYw02Sb zij|W7yTUyzd$GsW6r``?!S$cRzX$Qx@Wt(leHZUs51xu94@XSD=u&hvAHRa^nQ>sL zb<9e9)}f2AXHKhTFAs5h%9ny(U5{O~H-gU{pW2ZP0r7+=T%iBZG*e!UJZ>gtBs|S5 znnS?uNv6t z{$I9X%Ud7lzgPd?4fNl`zxapj0hWIYKaRso#6#q-3=ku+!S(}eJF$j8Ay0sdU?SLD zDY)R1ik-uLYxvlIQoe&ZxPrKG@slt<6vKH@;wR!ID}a;uiulQYQ8rvgKUtGeX7ocD zroW@rTMC^ul@Ti+$_Pg@!TUQ$nEsoXp9JeIVynuxV*eyZ#G)S(NB`E8E7_yRK9M$P z7JjiKH(WRQ()x1 zup3UoW;zKQ>kMqHmE>~wFmCB-eZWj@mGZ6kjb!;dQ>{7K^(J%jIPm^0bMj;0t^O`y zPB!x^;kRzhh@!?(IYq&ojMO|d`88MV8Uu2)N%A~j^FE3g6li^8p((Edw>A=g`D}u@ z2PR$gb>E%vBKk{AT5k2F4Het%J|{f>vdQ$B_-od<9%2FAqZRY*Uz4@a&v+_5!^!iI zYOBT`!x3%OgJybam5@JFtyl_p|!3V}4^r z2|w_wC`h}CH|Kg`3GFsqI>dAOS;F&1U_BZ54*CwbqZ>&-w)UBM;H853i}Yd1YsvC^ z9u9N~77iRVZ<@0j;GubQV50d`{TjP7f1B;GN2$w-3BfO;I6qzgjce&V;{)Tf8%Nwz zCq1Vo>(QH)Po#<*pkeUwOXxtal+0>>4cn#G2N0wcqt^mIz%El6v-Gxtrj76fV&&TR zxW^xi<4cuaTjd?S4Sw>edfU2&K>zLdwOjFPx8c`bXWTo-ZpH&uYEf{ z%wBLu{^u952ZWJ}<_qj$mK=d^ho>y*4-==^Jc9i|H=f{8Gb!)zr|0?ZbUt?VWvG6H zK8u~-_N}-4Gi89m-Lk`=Yc~U5^}|ma33y;0{b|N87(?Gtf24mGb8d8;y>jyNIDGR~ z%8Oraq8`o3ZOjRJwKYG=zgQS3M3#+jisNg33cd8HU`j6)e>QpO4>#P%dJVb9<^eIS;u;PT(f6=Sce`lYF`Y-xD7n;&IO2k(zn)F(IZ-!qr z()R<*Q44$b9%9|`;0W!BGWp_Zq6Kh&d4RQx^hk2IEowtyx*%nQzJ<+7kUXxU$(WDF6BATosXKe_bOMO@Q z|37HbkOOTfniLKzU#R{|?0=vA|IhaSGX7mFi*lL;dq>8=6Ef2EBLl4t> zNcxNF(7MRcVWgW$ze!&gmA=oMAgd*Jg-?Fu>N?`MCW2RCn?}R-`s*W}k40Xn-a}k# zt+t0V*{k#55ou?#?_ghS8+vUkJTH~=EWi6!_N;_{L5@jceI0*umJixSzX7IAkCE?L z@!>vnfCRdN%30Uw3iap;;Ss6(2d_)zgxbJ;%KtGQS|3+-4YuF#S<1OR*1DexjI_R% zZQIvqw)CLuC%9JMgKNeW-T5NA-ZRPa7V5Ed%xB1p2F#>irq+^$-45K^h}#z2qytX> z12T|4^`U!xU+vkJl(hrGk zw()%2NqF80p0~lzThd~cTj1w03&+O};P`_!j$1J*HjZnYGuRiL+UK6%J&kLvogLVp z53MO4`)%yhz_y<{x3svmzrN}fuFKW0cqMrQ?Y*|G`0`@zab+Rbk(rW3w`%Rh*-R$q zPlbEfzwpKSt0!k5qjWS=|m!FF(_7kRVB?XGP$_*RgO_^Fp4 z!w(nUj2uEw3~kS{_IJKDHS?x8I%E7Bj}cctWnv#|#sgC_Zc=&ey@<2UdVu^N*X*o} z!0zlEnW3J zYu6X2zGZfOhWgA-e?^>irp_9z^yFnHsYmPg15@VS^w!jQH_2xdq;G}HgVsO~F>lf% zUe;U!=SP?i#a@J2M?3Sa`PZDAP)g2bQ}$XL#@Zh-s2sQ={BWJp#t+1c>^Q$3_=M<5 ze7NV)6S|aQ1ot3Ao|pnYLo>1)iGMk52(Q!^f4Hh${A?rb?3aBN+z&%%8^Qlp@|9E@ zaxLYv7lwE%Q;@P#X?%^sH|ASw)*ZalGuf*gUE>OEjRopvz;v%j^cUn^~ zBd5Cb#VW3IlwX~)m-Alxg^kZFC|)_?=9XEh`seaoIvH_WL%?*l1*@Mk2Gwz~>fpc9 z{-0_8Pv>7Tp_2Wr{DkWVcy?@_x7~f~#D(;+Tet;m>VoJ9+Kckyui=f1Rr?^7yYO~k zxe)knMIY^j27b)5J9zdC&x%dP!Ap^iJv@^>_Z-izMGwH|cko7R=mDNhc~?Uk)zZI*4b+u@_B$ig|l z69At(==(b0^COe7Q)ij21J;5M{ucD1)Y+WreQyOm%WU`rSl4RJ@gT5Q8_4mT6bvF6hsIWd=E>QrB2tYuGEpXxeYoN)Lq_4R}u+=&Z~!>6=9dJR}O z@U7;VY@De)q~5X%&^u&H6F)M>mUH+j#G70On*(w%eU3C|#$0U8lj4SMhwu7`8B*L* zD?D+YVB_${RVVl%bzA%}PFy9i73>#xjVQ)G;Qtf(fq~&5o`-Gi9q7wUKEd-^$%$Ev z+`I3ODL%E0tzLZirzhHN1@^3+E1RiL=ceoXXNiS0%kZZKpy_h>bDCZ$ z+U>;_SOcGEgHKfRZ314{%yTz7M}y5*>UqvyxH6S*oqmF^e3|DKzol=&0bM5^G0}zG zi(j`0C*bQ8&y zu#i0r*pvgFA}c?I#`qMmlW}a!I{$=t$?0F2MlKEP;TND6zK-AE!?hEN@Kuz>`L5nm zSSy=+F>|VK{i7Z(gap?5|jyY5qz6Rh_?5=`nRW3z(SkrPYhT z0qS0o`_)yZUN}YUF?}RQoW)b%%Vl4)`)Z(rAK1A5b7)Ao9^v1?f60;;xDTU?thaTM zFLU2^M#`=r{?G#~s*S5Q1phgccjs|SIG^7%0Sc7W&YDDli$4=o2Y}Iif0x4{&(85h4!=Wr#<_;{cH};PYC)rA*f5MAK#KBeUw5wcqnMKz$k1q-#`xRp} z`!x7x#328Eelhk8 zJy+qI7|ilbY~<(Tw>igKyfMpL+-bbU4Nq@e>*t3ay|%=d+4Om~FU!o9-s{J=o^%&A z)ncn?CO2akJ=*D`Pkp3+l6`xDzxKhk0Q-MuZbVxT1(I9jyRU~PH7CH_qSZqEL%ZYo zuLT!6m=_;>c0RTR={V%xUDQ#9-V9IRo0rAww;(?%sbdX4H~7c;bwOexwj0jJNI+M! znmu{q3&({2$T8^@nqTQ|KJq3@rVZuWwd``X3{KeyGX`vgG2%8Pe;wH?+LP>6z6Q0S z_QJ3HWAYN)$w~6^`_!#{6rHL&ZEP;-!{C|Pn!x$5+wHcK$b(My%0WOgaqgW2{a4f&1xn1GUix9EZ{y)lUb8ZRCF4 zE%_{6gLtvi)z|hZx<<_E^9fz!Ascqsqigx3widH z+d%yaQ|_&`V~gNlyB3po;2r#o3H*c)vp&{dC?CHhGCa8%pWvM%x<3Au{I8zwL)*oh zMwH>d&;KI6uEb{f$B6AmZUiQSV~?QUBC`_2{uykSaq5UmPW}?!%fH_HiDOJ)n^8=D zw;z3nwiLVA!r8~aB9GX3;+4hcTqUCS{O)RUV7e+U+wGlv$?nFimbwP|d^WK&lh!?X z^N)}%EnJhMr`9{lkVB^c^Mbeb(KVAEIftK@-+pptJ}6bu9)ILTJjA_C=;!(#nHTzXGNrTpnw(P1|6X(!)>6CV z|8GTp?B}degUv4p{DP(+vLCs3H$OugR-CP8Sfm4;W+d=A#|+z927Gt2kLbL7Q}J8! zUEuq)Vyv=;o6(%7MqZ4}NRa=(b><}uc~En{qX>VZ`=#6Bi= zv!}tEjN>KGRCyR z>uo>sKNj(;wEc+pC;VC{|5)04>rYvOvQO}z)F`|M{b)2aa*2#z&}l|HSnnq5p0lw} zr=ZW=BDOB-D`y&i{tC9T-%bt*N#tr^^i&9E$>5Y^Dm>0_U!X zZNU??kALXI871+788H(?^yf3qL=CJQN-S&p{r{|IhwvRx5H>Y-Wo2Kxu24 z=Mp^!u*dEgwtCA3pV;_oY$HZE{6ZV{Ajwbi`W|rEr@-2{ z{*7mza+I%NJhOoLC6Q4N(??9XhTO2_n(P&lb01%YPFFFXA^2>H%x5U}I13GDL#I!Q z{vFotxtX+^xwjLVomCgsZdu_NIDa2D&OVe^&axCfBzvHKEOwi(!rM)IzR-9V^+wFz zjIvbZjH_2@#>=|v?hrcsN4j425qD~LDM*!h;PPi!KbM`TK4qV;NzY<04I(o}PtM@p znoHSZF>rDlYxe#?J4;^wK|V6pdynrb=^1tSrZB`1?QY~F7?7z^*!=a;QT4_leV_;{?y~SpIEoI}*>+L5QYdwQp=YE#*N5H!)>#{NfyzAgStm`J;=Q)&#_uog( zr}BaK4@iT2S(4E*>P5Kp?4E;VYGKl`BY<-me zFo&|b1rGgQc)Vqk?$cNgt;*QqVs_*JV~c3puF${Ok7caJnkEyT=)M9^V6BpI1>+!V z{?KXekCgetfavq{n7fRu#c1JO=HRMCUI6n6V2K<$i7W8L-gt)hCfypZE6y<%IoQWB zkoo=40g)vsrtW0v9xcf5`N-}TWcQ%c51Dp>`nx$7O6EN12Vc^sg%631L0jJ6l=Ugx zGt*nbo9*?M(X_I(2=ri6%S&oco18~ga1QY#e*qM^&qy2 z2TfarVc9C?M{E_wa?769**-Cx_0Cea!_>stl zJ@OfFy5+M64>Hccwv&Qwr;oXR^asR~e$b5WA~xT?kAz3beE28mNJ2ZzM}F)2Afa(d z*LkgyrxT5@h9-r^i|9voyNJG){F`u%v<+>vO>yt5$fD1`u-5KK*&Wm^TjtK-!6yyI^%o#-yR=qu3W(6&LU?IqqTIVWNC3T?n>?w(CY z*OWSZpE`U*+o%||UB)ZIlm3hhnY%Q9$!n~m`LN)!^k*pl%PQ%V>>-o$YtZo6FFCy8je( zZz&&o#R0EUZHIt^EcoOZV-$C*Y;Cw4Sc2>4274M#4pL|La=y^BoHg{pAl=0M=d^+B zxsdu^s0~_a8^#U|AF|K&H0QdV^m7go=VN`q`r{8O7!zTS{ebnnlKuo^7SY$`OfA_5 z`vGf<88@2urcmGQEj@2((6!6m!b4J&gYytQ6(ebv&Nw{n34=H1p zrYqXd_iFa5@?+4*adgcS*r&q@9cNm7nB2YL!{intD_xNvb^R!l?lcfrF~oMpFKwS5RKel2)-lr{Fq zQW?Wxy9Wo>9fTkJm@@+e53FmEx?1lR6|8OEenU5PLo@n-+yRfibI(@#p4hqM?4K6S z;FYo6579-wgq}yyo^x2EA@=1sc(veL)?$e4nK;NZJaO;!WzCbJ)u!vq0(URZNMS98 zGHuF3-Al<+#iqGKOEY$e%z0TKXx`H%=OVnV_lsZQNHWLA&Ey$oj%NWp|Jb8h4PsL` z&OY8V+>K7(Df7gtvSZ}$jpT1&zh+E-3G`NG<(1-AO6^ptA9~4v`HTZ+Ntr%;!8(&f z_6(ZqFuvFp4*P0B;aJ`SZV1wlH^SwA0!E zp)-p&*!)WPx5cM4_$D%fbNMV@9m${lal#|2pat~l#sKv88ZzKDWPkzxm$J7~ZsAwE zyLlRp^>j5T>b8rziEM0{X7Mw-ysIPS75);<&m^w!vV)XYa3MI5^P(K&+nI;kb%@aB z{&t!(baT&!jJ2)$Z9R|weOvwRBA*btfL%AKt64u}naDP&TdQ9ymwFxR8PgC;9j*Fx zY3MAsCP^KUTNaO&xzP^3EpqE^?!`3a;(2l_pO-{Ax9LMKd>WCZq7V5mpbs%N5Pj%Hc!%giyKqr< zMkc}MlhB3KvSf1}asXv#KbolvDfA=Jhmzs#Vw0VBcYgYZ1CwTQW=wp{1D7qabfU<9 zc(c7@8#hqr&iw3R`p|05H?j4h>)9*!O*(n?g8Gomq1hW{|P_--_(an z1Q-93KJ<_CgYSW_|F`(T_(H??4!MqUOtrk z65t_HCNH{J?OW({%sEy;TOl2rBx}g(8EaSD-|Po#;`;`8$11{uq!B$__S%~^clLy} z5dJjfA4yn*pP6TvTKvq?eO8iI(zPN}jFC-aj1i$RHKY+ftCLR3@;T##+fPv*#z;~g zIhQ@UJmz<#Jiqyx`5XzS9L?n4LcbOGtAHtXxfa4i$5q^iXy1?gb)eW>M&4`H+r+_r^3ED}slULUPkPaNWKX?(&*MA5dS|&K!n8Ngj>l@S-LUp~ zF#E(MOy1$G+XZd_zFH5gUvqz9AOg4MENc>$Q3vKX#|D^VV{9q&0J1Ji@)8@d)USa& zHSVMmo3Pj^B`hH2Crs>FXU>LS5Z?7NcO#1q-``PHi+z`M?+J}ZdatWR_x<#1+*)it z)E#|3p|OVdL{DOTfPGOO_C#$)KQ`Ex7+}AY!1*ol1%{*_iGC+AD%mF$z_z`beFH)4 z$gPB7Pchf}K8YO2Ax!MM(9&qm4aa}r{4LlESE$5OMt6ZdrNNFb`?dnuCuD7e%vbbih{}T0r@I$+8qQ{+rlk4B){^~@zkG5kxD*pQqM(_pFBW)Hf|5CxJj2nFD)4Eb^g3l2qZ6!30 zpl!s~zvc7rtXP zB3&?QkAk#s{ps+?V8ov6V=UrzcqASq_2i5k-c`3} z6gv>Kb&o;)1#UiN7W_X+ol>Dip}`vk|I7*h2kV>t_~qhv2Yxvwtvbx}_avUg`2l+X zJ@^Z34{=xzXU4c7GLIDsUn9U<)lTgQkU+ z<;*6r`3fE9K+i#FIoDi=Y^{IEg^rsdYiw6w_g!&Jjh4FQU|W-Mn7|j<&jNQjHn)6e zobicy_q2!ow365I_PhrE-Ms3%h^<=hxN}+B9vb{@1g7+v5PN7Z1~)fS2kDRYx@_r- z24}Fy+^?jMu17BQsE@#II(}iex!@)*3a)+jufT2M>_b`88x1p0Y~sLN3O)j?Z`sa! zE^~I$wo-1LeLnVl;S9n;#1a0zjQH{{q2B6Ug**;-zscTMuhKt7dU~j>XzWL0lm$+cc zGiA+i66|kK*v?&BYLj2|1vTzCw-WC4C()}9`=GX zEPJ?Q4vsxsLSK^SXOafpCQJ6p@%Hw4-ta-PHAk=nI|Owe z+5D)lfxQ}&&HDu`IAu+a?6<)~@2_n57r5_0#vItahAOr8fZQ$d1+w?GZKl4qUDlB~ zIVU2Oe7SGDtoar0Cg=V1G)KenA3GaPT&>!U<-&_7Lx^!o^Oej?!(Upiu;AxA#?;wMGB%CsK+;U5%oEsHPhexc4V%^p>f@*%u)J*B)- z52>fvW$k*}b+qf}j@0isb+E?1+*?Chso&>c$$0picahvh9V7OnsBwIUZP_aS&l~Kv z5gVk~A04EtkGkvSe#$QQsJtTcl94t#_S8Rj*UMk9SG26K+Nb4F)%FK$$ikCkp3rWS zYa(q@EVzQEso!~bsC-*{$ogx$K6X9K_MqI-N5=z`@^6cj|M7pe{Qusm{I!(-LO54~ zbF=IhzW?RJ$b9Ap&_YbpvJ^j+8|F2ICi=L zKWD#Z6pSvw?;NK$aWwn|hB_DCex{vXcee9OvwY+!^xDV6+B#&^DEN)wpR?wM3SFID z_KI1~6ylvm?(}l0N;$8eF~Y2sz&7DCzAlOQ8)BQmU*w>`(x~spk-V+;c*e|M=;YSf z7A2>G>gs3pG+|BN#+ zb2RqJC!R{dzSXCTYHNOUBJzrPVCsZE|B|ek6n9{6HS%=d$7ZPEp&6ySe$6@lBRR)E zaIjQQjIVqsHlgyNipiD#r3P$fA6rOQ@rm0i`)|HmyJro19CwL*%fUK^Tvz$${+RM( zGhOA!g%t&DrT8&LR!4#xlhE?6I1Ds-E%B<^%dY$nIHE5B74* zswbZl(1*~Kgf*pvW~}MWK2+>LP4HZGazfi~o$~-h2k5`#4;(5oOl;8h*zN4HBW544VMy91>5nN*j&cuaKcyVa+~fE(<&yP+Db(*H z)xGRB>c}}9r!?m5r9Hk_436*TuD9RQ?x80#POfIXCA4~S9^cUGs0gjfnu;6b{S{X^ zn*u7EyG%s~p?#qPu^%?GU*yt&DwnkscA1*#C$irD;~QcZs1xdHgEGqfOsc65>sBr` zZP$aI;(UHjz}U@-n;QQyLpByU>m?riNMYUri#E` zlRn>_n_lEr=?mN`>GRw}VsqVTv3c&4Skey8Om@`ga<#B0`8CS$Oj@qnmlkl3RSxTH z+N2zJ%OGd@Gq|d04eP|}KO0N``wvf!yOGD(mFo8LWOW_tPD|;U{L`(T#HNN3~s!% zxO>qjG^gsB>S6yPPtl9$@wg$S9-vQLvW79uJp3dq)Rep=kM|H~0l(a&-Q!^#T(45y z^K|vV+&K0xq+jXQdUZ`!kHsaYB&E3(kD*4mH6C4QLwA22zCj0Ow(2wgZq^bG;(Z0@ z$j0&R0!}JV%JMz~{u@5lm3})&^@&eOzl=6Xb;mQd^z+F5w?3ZvuK4&|rz76SUDCp{ zela@5y=}DNj^A}mpg&FMKd?=syk8p>$RQYST z&+zzSQ`{fLUgLg^=d#$#*wZ<}eJr+DvK|}5<4X3a!S3v@9ryV5Kh{4RyN$1YbAMkS zl|Ht+`m}}eH~YtrIW}SZn3l=o$FR=kA<2h5q7OY!|C4)1-(D40zInHH&n|d^LA!+y zsx||>H&?{4|B8L=O>1ThQuQU=yTuVvtPwk;&dM4mXs+$cKdQFlPiZfWqMc<;YBTaf z`n)cEzTQ>t$6w~u!_bA%kGX%^ePo&5kdn;ZwT$@!@M+@jyM}lg^eOy01v(nex2#_^ z(Ah`lYUY`7Ti9n~pTqL;4Ot7qD|$2}+|C_+#1sCmx+vBwCNwrLV_b&*)EBw0;#J!U z&V@lYm=)?I4-?5l6+6+7#iXQukD;yXsQz1V%94(_n`wz9n47s41Z?<=Al!eD%EOBizx# z8t#nf@Fv3H%bydT6O)OKA#>6CzLc+h6~D&M%m=)t7=z3Io9{&Mu$g*_?Ejp&fk<70 z5!wF^aish&>j|dpPek?$A8)2l(x0|-FNd_-zCRML8TqB&V9pHrD}H~#@9*(@p%amB zLK8!Y?~(CygchV8DMn0r6aEiEb7zpFtoa{099xd0JK=~eZ#nKX??X9;tZK=H#{(yY z@@@Y5x`yyiR9h8k6)^;eA!C zxt5ai9}gsFsux#{m31DRQ4C$4n9p2o1^1(GP;JwQ%iTzAYWh!R#IjE9Z#Br0Y;4?1 z@|Ji8tKQz_J!ksZOO}I;*~8j*LuoS=@j^=n?^uH@+pP3YSHkzDUQ+&Jxxk_>$4<%g>=3zOC@&_uzNfH>&5AVw?#s|0qz=+vlJ8Vm!<&^b)6=9~5?s!?56hX8 zxl;{I8QAq&)oW${7V53kAa^}yTeKWx%w0_VS*tgO^xUE4mUaCnicOvF9%G>4ew+AT z9K5xm`M9gR4H^44WNfnNW4~8z++TX?P4?OC!R9ID%mRkoRV3rUM3q?9{4#hV-W>cV zP_F20u8A2Q1K{#5#6f9lJ;B>IB^>|^j1<~9$! zK>3=4mx8}`U6Z)|h$HKRO&$k+1dld-GcIpCKzY8%jVVuYYTP%{r}5_wbQIBVD!eb9 zJVd!eZ)TjS@xHW(cx%c3b9e*uFXh<8D`juOAx%|A^E_#{&+u!`b(uPit;hUX{NP(x zQyzgKdX~7dmMhwAUhOQ$?p`T2IxDX}jqj0G^g|h6>FIGZHR#+Nr^7oFGJ4KT?$x)X z1zhgJZW_?FnKGUdnzzSgDG~a-Zh3-9pMmdl2cui)v!cI@{f)y8lRno`KcUGL=*a>@ z=+TBDdVuI_iZefDO|j%}*=iUUGAC+{d9+5xCa2)@vt-<}thD^Vk#WEIY`|S_es*-X z4o-E}OgbChnW4&;z45_kVlNTBZ|&+kc7#^Hn^Bpoy&>mUhZ3|mw1M?gyP`KV>7Jdv z4EjlOXv_)v-s;uwWt@CU?QBVI8dLF#{zk}g>yFyh*{#RBIJZhXE!MO3%f+n8?8W?T zZ_XkP-_)>qb#m+R8$x5Y#Hp=&(B+#+ySBI5S%=&T>DYM(HI31FktSAc4fPIXq||cX-Y(nIrBUKimOb=Eij!9=u!a zTp8!t8tBbhh^d_2MLsKg*4z|X_El5BA0l% z_ytzY*%8dq-soivac4sB$EZsIb*Yc>Y-K#qm_vO+F>0&S=}Gcf1rCgEYcg((wPbk< z_OzRTDRq}RrZ5Mw7aCXvURUaU_Z1_!IaK`4R)4>;&ec{#u3Q!nEssqfxMee0>;ZtA;>^hN?}uECSh#j5*3 z;55;eO|4;5f6;*P3iY&YuR_l@9SiN=?o@Axt?|sc+slM5&z$pCSoCd;Ppt}L$hO5zf=FlS>|0BU&?%nz;hyB9E<@UZe4LOmwg@Ef%$Z-vrO7;WlUn(8vHm* zYG1CLLBe~g!%>!^68Ej)JI&!N8$X>r3A|5GT6xO+ydBqZ2EWIkPV<91ylI}c5r*Lw zx>&q>ZLNAe#hnL!zoN}6cRyS^x7ss2??>L@E5Wfbf6$IV&pjFAE7kDK$F$+Q!1Zcy z{R+7D^a_p1p>H399_E3c74VP%IDV-yTw~QGv2nBB@6=D*!n1y@)D3UPsW;v}cU#%! znCerCIYwElghVaZ9Zh5YMt@e__GHw?s5c~SY=UR!oba5oiS*lJs~ubCguN98bkr}F z_9lP!Yqm8(FT0?ZE(y>O^6X~zaTZXXJlf9JrGMFK@T6&+hXsCQp4*4)5nSeiCmGNC zz>nZB-JzFV2mZQH7Gr+Sj?w5a#syI*ElhoU+Zyf8yv59>jTzl9bxRx;WwWo|bov=ssZxkG=ue}vg z|Cc%AU=s3H#&f@gZY93NK_@yOX(XP+ku~^o4$iB@k+NT`+(P%2U#>VPG$U)0&;i<3 zfotI{f@>f672IAAUd5LAD)Cb0AIk{PzCm#H3jKKt_00u`E1{<+spBf@D7ed^eRIIy z`}E-z)K%z7=yWjk{2W+EXonKYcO5cT)`Ktp+d~Jr6K!8Yw}dijqq&4hd4vWyqhenL z-&X(ZuI_cU1ZMXVcOJRo{>koeN~R+69aQRXH0bs3L>)h!I&bNST z(V4^!D1AqhsMU47%7j~uNq?fUuH695aIB^Ag088zbo{^UPYY@8u|i!*FqkaMi1pXb0ssQ--H31dBZ9O^Cz=T35_q~Mz_zEk@i_Y9vA9g{i6EUg~EGAg-iS9qGP^-j%n+o4s^|2bW4%x zNwYlYZRQ@YMv>{VKkUh}A00^j?Q@@rep;_5?K}45zRwi;&Z?`LKjV(>4YC%_!66GR8Ef3f`bm)~Iq<|>y=lxHvR@TB7ep5M=kLfk%^Ek+ zmvR!+P6HWZz$b&)BQ`&@rh&VB7}sO>WKB!+=MVjIvqPQQYs%GujcZVjzU=Gl}H78`_&kw;<*5qThIWd3O30GFfyT zOI>{bmqlgoP`v?(JPN^X@gDEoD1)$9HCndJ&- zZ+u(1G|DA_Hji#rTXp@`RVDY%4Chl_c*9U)@4=j<@vd-so@c%My7Jlzj=C_|%RV(?} zc_`$pjQdPp7Dz4cO}w)|G3P{>A4_b!kv{SOepPA zOLWHe4*gWWidD5@n_COr{RZ73OkK`U7nz$GLf&FyR?OMFfA=U;{TvM2@wPUkIAE;vOcw?I&wj%ywx` zEq|Uc8@J*LZ+Aeq;nmt3skk34M&E~?1N8k5;1#RTl`ey}o9XjT+(*FmJZO6}I#Kd+ zXM+pc9zp!^13g=xA#N{df9^oFHH$a}@CeT57*kIg=8M_}6L%2d6Y%!{FO{%o@h9){ z4*lcjrv71#z0Lhx*gN}v`a{m`6MiRcF8uFHXw>Ic+wY?C0a@97FrkpA#7e zp1ICZejhwj_~1&$+o`MP>|nh0#vsPyYI)xcdh3cOMBnr&RVKQkhyElqtZ_bsnjhF9 z~t3!~bM{WGVV$8*yrZA!*le&$r+>54fVgJ!ispK-Wo)-;3b+ zS^SpL&Wn3%Z@f!8_dzE0r=15lwDP62vEWf->=yVXa$)y-8Q3h|2=3mLQAxfU)?2C&|U^9tH*yDj031?cW+ zaMnUwJqZq^u1|q4!NW7)>jd}_d+gKHUvOgA$*$wm;Jh9@y$nt_gTEKRkBtlNLcL(U z4?c@r_%ys-`lHyAWt<^(ku|5`SK{B$*E~1FW7_(Z$qU5Zc%|~}Jh{4CLmK;p=D(Bj zeVIq?uBE!gZV{VwrQ6blv__RQ+->uSUMYtA<1EHhUDMq4JmD3I4YCGcBy(4Nc|x2; zrkE?!m=~@euSSKK6P$mk*ymE+TXEl)xpj1!Zt&kY&hziuE5rSxn8f&p$+tUxf5rCS zjrqt^%%?q*Hq`yhWv=7~=JpEXT5m9jW4Ji8j`L7sU95lA)cn{tLj5-jOytp{qc3xR zxNCUX-Kna)3$RWw*S7{3d6zkp9|p#&v8^}AT;dj)a|FgCqX)YKy5}YI_5;{tZrRL! zp*8zg_D^|G4VbQR){An+Z($x#@h$U!_b5Fc`)@q+H}Ov?W~2yLf4C<@!W@4HX5`{8 zb(gt0=9J<&ALSwa54joI9|9RF);!boq1@QZ-7;sVVy|HS?{arQbxBSktX}EK^-4=t z;4qmvK()V&eIA_m!5m;y!C3j|A-vv7noSSJN)AVGH?7O;UZ7PzR%f~ZJ#{DIuO=oNLwS|W_?VX zmeIzm=4m}oI^u^mXUo|IGQPdSEoG4QleMjvEf_d+f-5ebGYKa@vg?YnX9AbbeCD;w zIAbexps64)!^CTPid)5|x{t{Exg~>_tdY4I@FHXQkJ$eu_;`l-K~G^@=q<> zz)AdMeQ9SNbl&^`@aVUu443i>Kb5kLBdx(X{%yI;wGj@zVOPAgaqN8dOfhFZ0-bC*d#QktOH7oB4<4GS$}n3hs|_XLey-2eL1ZxybKoFNIemHH7!6w!e(+ zx}c>(o#pJ(vn}zrG{~72%`33ANPW-|key{7o@2~yr8H%~*z&o0X%6#j{wdg-(!`eB zqd}ie`3TEJrhD1{bbK}ZAO6yEM!h6`BHhHMdK-Q4mRCxPkkfn7Y6RhD3h?Qm!`R=;+MSqdgh7a%9B0) zTAP_ue&sR!TmGo+%#`!*_-)4QvbKH0Z?Ma5N|SFl3w`{~D= z*JsBY2fkzBC0ousGNbAB$7Y-+?XGRlmNXsxNy!lSo1D=i<3OuK(E+!WmItQm1W#=4@l-r9~P%}{U8&Xwpn0Uogz zi0wCk&G%Js9a@MDV+A&hc-9SJw`hiD+8po)>=-NfUJFfeMo#0C#1%WnGBu!Vbx+l> zf%q%2X}YT6A}cVXQ35%bCD=&}yd;9RxOKjMx^(RVlp zP-swSu`?aEoC?o6<6teLl!vx@0DY=J(mbVJnuII;Ia6HPl=UF}uHt(%ZV$dk;fg$z zvE z#t0tfQ|2It4ekKw4orb1cH+|?-HC0lU*lK%JZ+LsNb)5w$;UxF8SlLxSyxjdVUB+L zghsx8%98J5>-o#ri3|EqR}Gf}U-mGG{G1MKp>NA}a4B{-_D6h)o#(ixZ8l+Fsn%cr z5g3v$XTcv3*(dx!=I$TFU&e=`Qwd#(ycL;w3ce!azTuS142Nb#&cAB<_iKCw*Dg=< zYFD|?<-e2XUx6v{MQ;3(Z?Sm@y^G&xkub3-3177zu?0Ci=6#-@+V-H#SkIR-kK$0O zEk*2e$@Dj1$o!_PiO$YYpPqzvvYqPFAg&>M@_cG^ka?8mWblh!W-Mn{nmUd-XJXlJ z^l*54ENf0$j>9*=K^yfK9?&9bbjDtB@O|(nYgMH0y9k$krb^ajsVmAC@U5Y%cxfN* zJTvE5&a!{Yw(E+1s=U@73)vsSJ=u-hV;K7}zoIneLatD4zoCqqZ&IJ`Md#eie25pf zMfZ%>ylQkQ<=(Oi{jp$VdMU2h*_z4I;`a%SZBK$zY=6==Qa9_Iu~*G8c$yRWm_je6QPwPx1jOZbJtq%Eb4Qs0NA%(SK0{6e(nO0zx1ej)AIx3QcuR8#NI ziE}Y{c3Xc&+|Kp0Xq!1SXj5qMnMj>-eb{@*PwE?8H`cnCbraf@wp|g`u0N8r;PYeL z&U9K&TXv1msl<`GO^wt|=rx*Fg-)e@bAXd8ZA#rfpiQMLE`fn-w;}rz%{E`KG;A@Ov?P?N11^ZL`u|Kj!-a_S$U_Wa`_0*9yUhLz-I+i3A)9VaFwe*>&dWE7@)yo4Em#~0R*Oq>3bV8CEnHZ7&GkbK z>npc-;eGifrP*_fOBMw2PdhKtFoVdEKld(NTsUuGexBtO{WT<#LE*yOqI>i5uLeYR z;ez12{HqGgkdpj+vU7_UEHZ8yV_aige!0=^kuk;?sZ{a3rNwg>y?SG^Isjr~{9JtNV-$YF3ya?_XHpBlJDHYqI^4DI|gzK zf+ZIwxDG6taXRoc%xF(-l3?_gO>d>e#YR!EWS*Vj!s1dRe_`>x^9qbbg-h~_Y@3T1Q+HR!CZp!mn_Q9Ev4r!2$swT0n$#HGbRdqFcX^Jx6Cq1A6R6f zvi&=lV>YJwoi)oQH#5C|+Rf*s_fDVQ{(bMl`3sBhUub8i#!s7Zvv<~*>#iLRk!P0_ zV5AEWtG>jydH_!0 zyn=T69AQ{3E9DlxQ@k)Aj*(k@??Nkz_-6q^+}k4VtXu5-W_}}$#G5&7W_vm0JJWAS zS82zex6?QAEj&-1a(+6#?b1Ti_bysgTp~?l@n5@MrAAif3}ts&n_ev*2QQ$ZiwYOo z{9Q%E$qSYS=@bt@C{g{?f@}3t!EdQCVd8kRd=rIF8=3iwb4v;rl@`-GXqQ6x#=?2v zp{TgTD2-5o*)F+7`N0wb@`O;N|G`-wFu&<+g+)dA^MXa@CsM*FfyGFFv*{s{%*@w! z^K`{y%$PFHERTHK@#I~8_Z1iB*=!?c!J_P<;$U8+HzKx5^Ouy;59w3i{A>3eo0XfFK-WQI_WRWO?_r%#zRP9T-em^#x4&K39* zGrhB{@0@%{JKwP5NIWU088^a!%=h~XOACx((V~K&^nWutG+aDa2wD>H!{3BUStHz4 zYIiRTyR;;@aPgvGN&dpz2ikR*D2{C_Jtn!dw^uvMz4kl?JkrYTJh^azd@dpvgmNMP zgnlChMdc`5Q~)E2N@Yh=5i)Bpj$Hu3Q#4;N=_FW`Us`IiX%mmODkWJ;xTq1?i}Fjd zk*5n6=5w{QQZqw;GeJtrO`n;m?k_2Z+EDvU?LbAoBMIoeHlK{X{EQg zLv;D3PxQ}{{G$79>Ac|oxZes4laA@MGiUiGiujOxY<^+VXS?(g|A?j3mZJfHg{rf$&oA<`{?{ZbDF152W-7tS|<(bHH2~P?SHXyZ|^J#LYyy>dqrrm$psd5rf|V9_IJdAf79EuH*SGkDq5IkLcu!c~7=Ib+I_oHuBi*Xt%Eo!w$bt9LdZ6JwNfuzW=&3;2ZqFkA2Ip zz1%nGcQ5*0xc7&?P{E7sl|U|wN@NZCQPlEoyzxE;%8YqTs{%tGbSOqROR~lKk~YN7 zr)2)Zg^VfCh-Ug{jL(cnHA@ysoTzY9GFsxWBizd5#v8M5mhnbWQE@KN7Gs5rWDpge zmp?ZsBbeYKl!v@XxRvX-$Xl~i7m&B6|Hb9){@yH>;AsHS@@#+rXB$%5%@La9AE%ohH+?p)dn^-ZiY}_cW|L2w2rjUyybU@ko2Z0+hOzZ|Q{6W32z? zM^12YVQ%)~(h^jF8_`P_@_KJ>DH@D1x1@N1vGCraBBO9I+CizM9Y`vE!-tok=}0{5 z`_{$9Hwuv&hV^X?Xs)_@(L9rMmC=y^wWo8aQdf(*c=h7^qPbV+FQFq$#H4_ll!KDP zkZj((e3YWjaU`b&43otOWwuxLs1YM>&YnDdX7=?XM_eT&qUNGDK>@kN^PnY4o4wfd zxpu_0*D%z#;s~7R{GyaPauxEjG(M@xObA+3`g|y|sHm{iRPOMfQ7EHel)%nTvrP}Ri`8+txikB+oUYvU4 z9d^2iYx>ibsE?T-buku{d>b0|$;l}u#IBx7wW6ui2dp@qilaIeN2L}qeh?d4B=5WI z^5ol!s#T^3BjtI}BCqq>FE5|r@dC^Sv|drrC@F?^>D)zV)TM>@SuLgwaD2Cp{_+HH zVoT43TdzvLfb?wv0IA9u&gz=!wD-bJ|){?F|O&$uUFITzl8 zo3!U#_$2P^SHWWs>VZ22w-q-a-}}ymci`@QmwF-J)7a3ThWp&nbKyMP7vBRu?(!D$ zhuO{k5WL{-{VVN(0+sa{_{4qj^ttfIxaof*93K2)EBMAuN9eCjpqxqJ@RUUAlN=6z zjhmDj4iD}_IR=NrvvI%XQ1K9xr-!czhj-wnj|_)PQAXFLhr|1ETUjKs4PM=CayYyP zHwpJJZW`{#xLLTO%oR)_AKW_JBHY;!9k^?8_v5C$PPs|HmxaN#xUv5g4p-tPy%7!{#a(iM z_P7lHgDjpDmj$@5pgg#HnFwyieeT0>xYrQAaR=kd&y?A? z+R_=yxx}pv=$35yK}Kpyi2f*%yj|q{Bqc0zEq)`!kDvH?c%H^D16O_q&n%w(_+{ZL zZx3UmbCbhYp-+A9PY3B;R=Op)UlYeE9{dE>V?3?+Ntpa3zj~fL77do-+OYf;dZjiq z4sdVwP~P}V>jk@mq&q27Xc}`HA22`0d57!1RIt<2Kga9wB@t%hnKrA`bf1l0vkW7MS6Y28yeN_uvQnA&?Z+=u z{5sluytI%s(0J2@P6=K_+>^x3ii(?Ap=a4~{gJp*w>sj+)|?AV`G9NIZ9=4OlGhHx zyAi(MD)aP>ahtkkR>W3z(ao$);_z0xs$%@>95qgVt+rmj>+QF^hYxw*ea9QAmEgna zP^xlWr2Kr}$-{Zg>UI3Kx%lw*Fk$-zc2!KZYn;IIt=AU<>YYrA9-)Q!aqX`?rrVKg zoa-Fxbt#);uqFwV)O`u?2O?Kr=NgyiW$JIWpuYW|(tp0&s^>2D+Wtm>_nC`7xt#4SPXTN#S3yQ(- z(Ifspy?5xa5Tb{t0GQ7M)3DmAqrSc>eY#-K>dO;5UT^DoCB4wj^T2rSC3rLMHl0P& z&h!ZFNShue?w$4M2NIW`_+{gQ+?X&aL^_48Hqt?c8kN~})M@08M893p;F)Vo3SQlY7*&xJ!c z%HPf(E4A5HBS=}-5$8_gn0$|K@p~S>9r&H(U4A2Zn((W927O9AqUmTdnOZoVP^C|c zdn>{vz354ju9bAX(BIOm_V8?s-PFZb5mV{%S2?R4z8Za<_8<`2*&NB#2zk&Co#=Vf zrQY5ioznShbloq>?5e8_qOm_t8R&uotu$s|@=5pbOK0*)2l21hYc;)?q*1I@^33EB z9aW(#CPL@rS)b_LxJTdgitek}tyk{S$5l1y)i3Kc|E{mwsjuIm*Zxjl68ER~&Ih!X zq#pz4^{wc70?*qcq;2fAsi&`^M`d?^b$nGf|GKUtlU&t_?BzgK_Q50%DHW ztNHd>%;V@0Z~UUDuLzG6m;$bv`dg*>w;TAh>)U4MEMfA63hzt9a#xK_Iv05(tocweV)p}~{D8u$YIpmRNE z5ZUS{aNenJWu4zy{Bdvj;|571KO#FjryF1GsB-!RcZCr?V7H+NxWk9qCFwWuS70#; zL7|DmJYGuQu*URs)NoHlAioRLZ2~~+%wLRDO^44|V&_nl`ti$)_K_3+m zNtN~HL7@o|(%$&V;xj3Z(0HFjA1A5(l3H&tCAuVp?@6>NZyxlEE0S(~uiBm)den8- zpCxU(>__Q~{`AF95%weOZ@iha0H5~uTbX8l6Xa_OYDyGXK2;vos_zEBWZb>PYM;Qy zZkytL6>*haeO0m5UHmmM>ssy0KHk4UuhaZTj*gSh z>2XJo_~J8<9L2Hr zbF6RUW7?)N&9{DyR=ZjoSM!Lr?qMyn;@`B&A86yNAJwYXYSZ6-YoaBuOeWEzIo1j$ zhzM2+E4c-$2;7Ja-$7o7Ig~Jhn+_c{Q{-x> z2SsvC6gf!3!-xFw_Z&WyC6eqG^DE2zJNwY#Oo=j$2omNOF^612HX@QD-LjJ;6bU%V zWGhom7yzfA?`!pVcWOrM@lt!|opvaUoO2 z4L)4p#IAt;KpnPq^=_=zHdR4iKhkP{2w_!fl@*%5>Itp7T=UgDuC4pAHnFZu+whpC zw;Vl^Wxdjor=F)F0mw>eCA896AW2CgD;Ko-@z%GOE`&~$jpL0UXMTL&{A<16cJv72 zQi>RW*}oYV4yRlF%C-emYNeptl8L5Xxt4ezcf-!nnGa_Q>qf7X@qUL|sRq-(c93RW zPfneJM}UjRwT-C*CvVbA4QG*Sv@*5n2wkzoR`y3K(zZJxikBPA{{QEo_hKkDu_)yFLLm(WF7? z6?QQu9XdSCP5~pfR8^6yC$L49_78{O}_-$WfC( z|H*{2U<*f&h)!{sa_<;Oxt)AOkBe@VG4TU$zcsa;{xZdfCLSm5bWrV!zs3CPH~)J1 z>yH;Dzz-imeODu~;WioAC@mXPeVljW)7qw|v~gASTJ>gl{3dPPMr~@{dX8w&yp>zD ziYK*kwHvhcb(+4yR^g|}=-ATU>*I((G%LB4nz*DOJy0y@CX=v4c)a7^bzuyVuY23y zz47|y_77kD^r-i&sP`%D?-4m20Yu$IH%m-p%ziCAhIjdiUs}XZ&?!Ih%fK(4c+&mk zCw|lM8;M_%>4WVPH!qUbv@Jn@`o_yQT{f;_aOEI>Rcdw0)EZ-5vNT7BWF24oo%Qb9 zDOHCja0c>h16Ja7VaqP*i;SBlSw^8@gzqOjjqvTf3s2BDrfy2ftS~B*GppR+e@h0Z z5w1f#iG#g;JMq^=$M;Emf0a8MaVD|(89c*?n>G@gvUo7o(>EHMk|$KSZvm!6GV4#A zQsPA8BoDtuo&1*ISA-wMHGh)!u}*$6rl^m=+a|HVo#Ea1h;!4!PG7|uXXR?AziO4U zdZlv?-PYEJv+P&1Jk6v(5tVl)U{2%LjNcv$W)m>iIyXHE%txG+4+C?JvwF2Nvu2eE zx1AlJqeR|GHw^xp!Q8~1Y)IWBl>pb>yc>6Gn|2{~c4+HJk`;xZ)x7va@v$Hp5s zjrLchSKg3Wb$#_Hf6d5s*ZJ39TYJsK4I}EV)@6`${y@Od>zjiqJ^0ON2QCmz>_O*4 z(;sn7zS1>m*f`h3;jXN!?rAr6JF1;=mY>&(;f-H@{V{-b`n5s_q~&~-Z|l&bkMOD7$Y8FK7)7cAr_CwbY;0Sg->J( zpYRKx2-qAUCd=%X!V_c;tckS3Yv?1E9b#GsPdGvNCxkyP;nz6UFU&g#ywejn_jj!vvA#RduVi#9d ztk*RuCNjh_tux-3Nmzs1DZWR&CIBS8B)3P*GMXl_fS43BPN?5P?d^7ijzFtO{Pvy*31r7)jq8-$8vl^~xrdko zw9=d7AJhKtlktyfAG*JDI-#}GQoj}d8m)~OfIJIb9M{tcuO$2*!L{HZMEujl|5tDj zB7GC-x35Irh`<5&7ot^RBptZ_zEJM1!ldHo@Yf%oY5f&i*5~p*?&y)s_&dZ?STY)s z$vl1W5&nzUpYVbqih*M=*=7!;{eQ@uZ0B~EL&gzlYY?x9cbP|38@%xzfcAEAJO$$knt8uUUPT_fICE5s{>7;v;bT3AyGy8&H68a=zen)ed zbDV2P6L>sAkN<$qvYq&x?Duzd7OJY6iCaosk^Akuk(pRwo~Hi8y!$%BLlS;o-V>_a z)!&(E59kFJCw!=ni7WVNhc(H9W#BbM=J21mxPByY77=F_aRgW7XO9QPifZz6She}n zmQJ5y&PaFJkbkYF2FSd$(1*d3N%|sOXEB4|4j3}cV$L`E>=)r0rjOM&ACvd&XT#R~ za`c#hIjC7gjS!U>F-)QodNEjU@HAN$Kh3iZzk2B1`Bx?rygfSErN-67h!MJ7 zb+XbOC0!B+;hE|7{bT8*jh?0qP2hbA@8s1ncZOYbLPxnxeQ!T;XK?_DU0$if3H$<4 zenJZcl)VT)nfr9k>?q3wF{_DH%_mkh)6$kHrZfGAWOTm%V9t|z4C?kg>k)tlO_=jR z{`PsKEU};7#h}b4BW8?jbF-M5X?9C(C1te#c(FyB^Kxwleffr@2P`8DOzQ|^ZPVV#$Uu~Qp>avH zzJKkdGE(r$$cPajQ6mxKy&ID5IpW&@VeTcXdUS%3zp&PII459mXY$46-}wDacllhC zrn@Fj8|Rub)phgDK3CQZ*Th?V6?azNF|KM(_4n4_R(q?ya^3AUv!S)ahsN8(;+QEc zEkKpBXF~#YGdIkd?wU5)HFb*PI!#8xF;iovO{$r_?)Ir0X4TEapHRI(EHAPk!5@E% z9myx)eFDI10hkntli87Qf(1`xW)W?F5?-|k+2MQvL}E{JY`lKcC|}jJ)z|ncMpjf@NS!UMCMe- zTiroa<_KG|#+TcOyN0;ZujMEFXe4A9!tZO|oug^g$a)1+4KfuXbfMdU6vdB(2Yd~z ztR3xoTSwm&lbgv9BhxLie!w1Hnk9<(17jG^cJglqPBZV$*XbaUI@t5c(KGo{?oyER z_|6UQPnKPhEFi%}8JEHS4ckUU&6|5svP%gu~Q+#$kYyVVjKFWYA`g*|M=)$qOSjd$u(v zPT=_CCwGoqaO9{@;(m{L2-8$O#|AY{yuW|s=oB#?`fOkE^f7}Wo_;BoSBmA8V%>^e z)&${=j*LOvZzhryBs@P2jKB=FWNPf?xN{Z0uB6j06^h|igoc^^`n^tPeLuA)=A`ym zk_z>3hLY5}OPo#pR9$c9C;il$y(M^Uf56(fKZNcHYKUY zx;kG>QqOlEc$(XrdKTgH;w6ue+Ql-D+)&^EpF39^?GP{r|Lg^+9qR)xE7d zEIGE3WE3Jxe5{EABH+#K-bt1z%A9msNoVV0OLsQ1jOp9kkK2*<%e!-@k6>~sl)@Aa zR$^Rn5vNf2#^qFwlnqXBDgq2u2?hjl1ywNNLK(`HGDM*izHG<&y?*cQ&CJfou_6C$ zmvlYzo7bi6L@;@;3Fw>V)@{cDf7YQgJ)lB7M2e_n=(%?AACAx z&MzOtcO*}&7{oUz?_Du?$E(faiovt5Hs@9ho==(kE*U)cTJ!KFgE&*?kxNf3!_8xt zKXB2V>&=}j>G{G+YTXknw*Yxy)#>GUe#hED+?-lV-zIzZ%28aOS+^GW+4T^@$6ht^ zbNsI1YX%>F&A`WALuD~Yw_}W+a$gj|ML+c=(3e180(}YeCD4~ZUjlsz^d-=jKwkoV z3G^k(3e180(}YeCD4~ZUjlsz^d-=jKwkoV3G^k(3imf zn*`2enf2)u=O;3p&kJtw&JLvqujjlaIe!z&nCtL8IZAqeL*)Ko*zgYBz(oxrM!GG8Lyzb^td~CgwGx(VB>T6ZXOa|Yj6o)yLAb#Y`8Qk&xMUUca$Fd z_y0WKr2GsQH~31TOB?Zy0wrmdp>v%m;kXEw_DK7L%xHahMJ|-2n0e}Xu0X0WbiN{` zHJlk?XXq7kN-OY=93{o+JxWR|I5UePXgb1ylGgvs^V}amjub})yZ&v&yQh?%mwS9? z%cXO2KS%GRBK<<{l`o^ezQ0p44(6&~AI}SMYRQ22bCyzH4)NNuaT(9luRV6zD83c_ zw)EdUbsgmgkWx6~I#sOVrzYGn!|sQT;<*^Jb8PG_sg2vq(;kkE&ScZs^w8CrkvEmf z)0ymS=8Xa+m1cYZR+P@Wi>3jy%-k7^5155me6VZRg1iP`<q@r#Yxy)eGqsC@|I zD~#HeFn)=9?>mUm^#H7=+O^=b0UV~I_C1VWW>jCp_~m$yK8W!3fO)x5zYu&nfK%De ziN6TrtIWgnb=F84z)9~1J`;yuVNQHI4u3`0{{&eLz`Cnn3gf?N)E|ZMSDIaF9|I2t z;1#-dGlZ`-C&jM>V95E(uD=Q6>r6`YJdCf0zNx2LdNSbN5?#8dE9yOdcJui#%D)Fd zBOKL3^4}K)@RSr}_l9wlI79id-&t*H5&1LTJC1loHMTv<|9pf$)xQiU{41{hm+5=; zknvuy@yx)cy@Z@6HfK8T<~f!_P~HwBB0;AKk-@-MOH+RQ{_zf(8WA?LvQU zKZB3Svr~efo?zfn!M`NZ{5g1N~%%4T4;vrC9^~QQv6-QXEn?M;U{lm zU{r8=U5M~Af}a)qR>2qE&cH^&|3dIZ!A}YPIl<=-FyPL`#N`i_|3Sv*IWt!ca=rOm z7*IXmBlx3&KPB{c3BK?S1|AgruLUpN%7DJ6@EyTVzLW7hi&O5_xHBnn zIVQOKK^NS+vnG+>Cit2P(@$N@xypZt4)hJAdxTzbcfKQ@Z$de$*RL_Ls-yBToiLx9 zgIIUuN8$^M%X1 z1wSc<#GR)F{PTjJ`8w0P^RsaIpMo!ZlW})O7A{9F<$53dF5{1LX8us{lmEuRl+2f} z2!3u+aFOTA%a~982aLP3kZ}19!OuU-xH}sLm+uk$^lBEEI|BvyR|H?!%D6j21o$8} z2uMDsw=?d};s8FZ`1OpFAEMM2{LEek+<6GVKP>p-LB{D_KuS9APR$9xa2HP<3F8<> zq?IQ1sW7g5Mic0dCeSacf=B9|KOWEjR0P-d+?&AvbS(W9W+4*yDxZfF_?)>tzCA;K z5RadZ;9u79Qe5;$>ph!L@9Fm>@K1@rB)j$Hq9=ln3eNo3n4w4`2B)!iQr!l{H+n34$db2qk>a>Oo`jM-W(O2QM?%xirPG4% z5}f63%y$K!5`4SR|5)$^!AAwB7qzLs=LFv;_}bNskA5;-?+(Ft2`=G=nG-xOIKnEI z?iYMYaB(kYQSftuZxnj&NALRdyrW;j*9Pb>cE5%vfMhGLpgmO`)usK+HwmuoP(7R! z9Om97#koD}%v4058DDJ{BkRZC2cNig7SpdZrz7)M?epSYEN7|S+yOr1Uld=E2TFhP zWSCy@Q%U%r#M96JX*@nf3!*^M_9xll`3SwXC%XU2e6BEeoDK8;ru0`o4|uE8&Gc)` zmRLKv-kgk#i`oapwHD^H&Qv4xjITClA6H7Q_y-B&sQp@%4G0I9=cN5n{3n8sM(DLY zx*w?AUIvw=aqoT}A`jLBC;Qoo*gfXcyU+6mN8gL@75@4;jMmG1diRkIIzGL)%56TP z|BNrSQ~4*!v&$#q_m8=HSDX0=PW>kIWaz{xO06I|=w|e1NqI@q_BKbjz#- z9w)cM3HV1H4!IS$Ayr}Y1;Ks6M+AQ&flnF(99QqhQ^usw&Q!#1jDmhO`Au0UtH0Qn zz-KA}|Dy!_&l2!2I2?XqjQhJw`t@zWN1tH;Vt46B34DIzw^-lsgTpSZm2uo4_!-ed z)rXwm3sX$Eor{@UfRp~K-;rgNd9UEndGUnfBZULmB7{%+ul|D0L80{H1o|rw0JwT( z9q}qAH(B6u<49*f691{4VY%HRcxpG}j|rbP@Kvz4_eRG3cmn^s6Y#%Jz`vG&f6w6< z-(B3EC!{_9A^4*|V?g!om%vvqTW6wvWH|zI>hJtJna{(*XT9L(WgO=P9|8V4xejJ~ z9eoht>w@qxvcOe4b}WJZ1Hi9BJ2j5d`0M@z`fn!Szf8c_;RE<9mi6wRrwE4}QorDK zs~yW&Ba0|8$D!_46Ga--kf&?1Su|92NS<9Ur*~WOSZl zoSc6*0e@QpUII?_>i!0uUq|Vm9R1~Hw8-O5XPQyE4rl&Re@A7$-^Z}ID+PR6@8?7l zLO&(*Zb9gMhs#YMyAwFshp3;uH-Y|q0=^k%^to|~=+*VWslU2kbc(xYZgup5hREfD z(Cd0(Qt1CRf&NDhhn__AVIal72_CKCO5oJaHR2y16N0OOJAIIK&=Z1pgg*5w1FCQD zceoG*vU`Bjyok#4qYm$l6BdL%>PH>|PVGEBE&`D39|Rw@3~2km?r_tSz6YH8rTbti z&r7ai{tLh4B2_85!Qnk@%;p4qpYR!yeNLUfRp4=Q@P&Sr_?LU7sy|NP|Ct2*OTy=z z_~l)~=ZOURr-8fijl=_&!Ko3h`<9sgF1=ZB-A7e?x8S;8s`_jN*Zo+vC+`LxXE*Lj zz(4Eo%gvPi0soa7Mo%RdF4>Y>KZ z@BI$TbCt{^)#vpN?=5gM@Hjpl;nR|FQM-K)aB5Ff4<8a-_nGN;S}A=4cwE1J;P^95 z@b6WxkJtaLz{&p1N7j8)4i9qR>)U|G)qA(_IW2xc=f(FE`1~XRU-pK0eZUWmxBX1I zX*QIMwS{TV`h^*@;iv)Z0WRX#$L*1F;jpbV2x|ayKQ&%%%y^A*x>z*!;O=au&+uJldn$L3CsMmS>+#~n6udsjno$6QjHQx{UM^6a--b# ziXmoF;mu>yV{Pj~Vya*BZEUV#4ty%D?_DUob!4RNohpXCS(X>aZo?q^?3dM4iwGvVDRHfG98C0xPrnl~Mi3TgBNCW*CPqeBYaY}gLk zFuwO%YiAm>ws`bt<{E1oG?{7^9cmZ+W_vt8vIG5^@Hfwui*!GcwG##Un?u?=F=RJc z+iZ0*o9sA>pl$V*D?EO1_i&@$**~$_R&qDi_TNAS$83(u%}v^g9d>faMs-3*j^-33 z>PN-NeHeyIDIJ>a__kUuw0@-y)X=Jz-U;+zVyB(V*vV{fSGt~|P=ecv_QcCqomvVN zR4%i5x2_!uRcUWC*R%VCTIkC7fc4BYU3>0DPp{T9KjP>e; z893F#5%n+t^VLHrAm&q8#+pOdVx2T)AI86Zm}aAtA%j9BS()fFBRMo zE0Z3yIwduC?cRY?ha;|?CJuDTZyql9dNpUff>X?ERGQt6iZRT49BH^A5c!g!dm&mK z3z4l85vFG;GHf9^25FtXgya}(0rd->6rNm$AktbduPzO4bGGKY=Jr?@5fYhUvMx?L zBMd{D2RiLSq}rvZDKF~0gt&&<27=F?)-DmDSiaiRK-Fhd{Hym?DkDZN+^ZM7UY*e4 zmhdv#A`M2SVb$5OBnU*+iU>;uzYt{-?pv0t?kTC+i~jx(@Mds z&9>oh%7sp|;X0^;pRL-NLcLyyf*nNkWd~{?pRF;abwjTPr3%>5Iv7qz?Q*j6v`VdohS=85Vb@i;3DXx16vD!`yh!)SAGw+vaf= zVILE`LL@jup$WO?#bof!3>Gn?v@J_N_WTb}-UKgD3|}+zu^({JJgH zFlo_iTWVUK*0zMDQ^yu&u>*z$QmyQlOT;yf0y^06Y@yvQ9J5$Pw~rYf!_sWMehftd zcZhO4KSXNnj{RHrV3DTuX*hTS#H0Cl>Z%Wco(=1jd@FSd@2?%X}TZOmrVnQM%jPqb*&Shvw+C6u_H z3COjX_Tfguwr3lV3)DKugzjrz<8TmjjG-7<7{nP(QqpFzr+_obnayUlfoMAPSmcq= z|I$r4=uO5l!vhEGaC#)2-E3@`f+7;;4J6Hk(k#7*$cnXGelM1(BGewvJU$oXI0l(V z%Q?BQ_eWp>t!hGXyE8WKDF&?xZR9@asQ+Il)itE|g?5>yR=6n{3@sKm4MtfT?D#%R z(~{S)vz>CuRQz(S7J5#h37X(n-O3LEt{cWsCrzu|Za3TEVx+sn&>i1{RdmlGo7g5{ zJ6O44-NyY6=G;NJmS{zrvycFy-3_t@C^o!Neu>%LTZX36m^f0R}J9q^3J&Ig2fW`uQUhMqxi~A#2n_{uYc}lF?TC4Z=G^TtWE%K1ZeeNK3as& z#QsuH4&3aly~*t&IhQ={!`}L^2*edS;5S2K?7B~qixJz>$dKM6f`zFoBRVIOSLo38 zmUAL#i?oNH`6M3_qEbQ1>wS7^WbvrKX8la(f+A4)vEhO{^gv;$WkYCtR&L13wxoJn02(2gmCH zc{dS4$I@I1DYu0OAPXXoT}AmM|EVX$2YQs#KHOW4V1H;;8k`QYUEgnw;U_)O$AoJK%;EJinhu<&!j zU(&%P#g0B95sY+>V7t}r2gA3cjs`6utXCO7&}n0b7;_JEaQu3A*=YI}4Z*&!g_rSX z=_9t9cep%0i5*~wGXu2VoTII9d@RtOE&3jqjZbW{c$(RwPcfVE@dVZ59_4bIu&$ad z=jL)F{;^gW%DRd6lBHKrCwy?_Ho=@}cKr!X6ZtS{W)?ed^r3@9#JOcGv4hVzaC);btO0VLi_z7bG!T7Tl*%R3kj-SW>^;@ZokfX zoEIHnlfZi9d@UNc-<#NuRd!Shm+WS6D7yh7k0~ZO*-tp2qh82ZTRXW2pF40sOlAyv zD#N5kFJ>taH>ik-Awqnhk*B4BI4g6J=!6?Fl z1?yTGTDC84WM5K$#xmm=gB%IOE!3EEP(MU1oFOIIi5FnsLV*HBKYk`ETRhn!@>$SraK8~e=z8yTg@X&&NU0?8sktkvJ(x)qzgOT3S?H1 zwP0L%k*U~S%z$FMQi{v~m4Db$Q;mgbY*q&QLRAEVoKk#{6BsP9CKNLCg!FN7RB*H^ z(Iunf8(22z1bGS5cq|)Hd$xK#8pA?OT4!SNY`w-7u}*~`ZkWU;pc%WFzeSOAt>!;A##Dy!GbpeLslQ2Eq9THe$+8>$Z?Z+D%M?465KR&go!>WvpVa4pC(xBJT z!0g4FJ&J7kL&@C!ddTyV*~9mRdRB4LXvb!)@%Q4H`Ixps5;TQu7)Ps<`TAQiau0h(>Sec zP?BspgcT!>Bpu_u3>X@i=WKX6LHi*wMnjDPF9)&y)=!&d7o0X95#7BaAMm@%42|Hs;tloiX5vxGA+LsRr(mobi z%!#)pjpL-(?t?*84aTmSg}PS+mnJI5pR{WQ*XY<_%czd2(EGK<7mch(iHq=mnUvJ? z(=?~&!9=vdgs;iEvlg|yp0lPozJ?k~gP}WPHsc;gmvrmbbFef|Md+jDx8wOwarUCt ze?~4er{|Pj###3qNVzq8ae*T@y7lY%Zkn%>7f3D!%>e$(ZTH;Bn*`VT^&B|O_fY2o zDJs8r;u)PSspa*&IL#lBvf6&7)BG@=(^-{zujk5X?gke$)P9nkwjY-+9mik7yXEBz z)_QK{qBL0R*Yaz*xH%!^x5>SpQ>VF}*Gc8^s#CXqE&l;vR0Xw|E~U|>OLz4l{0)}ZbM!RV@2hLE zNOR07DX;R^_b)a73f>nCrfB;=6)CUp3u}H~q{7Ip`D~=Tp5LeWoALeTVAAnd>@+T@ z|Jr^%=TGzQ11S)#|69O`=YTxWbN@Cz$8wMMH(LK$l*OyYZf+v$o*Ss;qxz%eHGdLi za5_e}yq+&OD)lQJ@usBrnx6wkEhXDPNzWnNCFPUqXKG`f!-d)w!u0*^DJefBg4Ow< z^{QMhM&-f!^*!&C&$IjvXho81dCln@x?p)dZ}%xFuk|Y%EvNaKNO^s)IJJx$p4Wns zYr7R*hw{Wr<)`ly-G{(AjFk__g*f)F;XCMYyKCjKn+d+ literal 0 HcmV?d00001 diff --git a/sync-face-knn.sh b/sync-face-knn.sh new file mode 100755 index 0000000..f283d7d --- /dev/null +++ b/sync-face-knn.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +cd "$(dirname "$0")" + +SRC="docs/face-knn-source" +DEPLOY="$SRC/deploy" +DST="native/face-knn" + +# Sorgente -> destinazione +declare -A FILES=( + ["bin/face_knn"]="$SRC/bin/face_knn" + ["kernels/knn_float4_topk.cl"]="$SRC/kernels/knn_float4_topk.cl" + ["config.json"]="$DEPLOY/config.json" + ["run-face-knn.sh"]="$DEPLOY/run-face-knn.sh" + ["SHA256SUMS"]="$SRC/SHA256SUMS" +) + +echo "=== Verifica dei file sorgente ===" + +for dest in "${!FILES[@]}"; do + src="${FILES[$dest]}" + + if [[ ! -f "$src" ]]; then + echo "ERRORE: file sorgente mancante: $src" >&2 + exit 1 + fi +done + +echo "Tutti i file sorgente sono presenti." +echo +echo "=== Copia ===" + +for dest in \ + "bin/face_knn" \ + "kernels/knn_float4_topk.cl" \ + "config.json" \ + "run-face-knn.sh" \ + "SHA256SUMS" +do + src="${FILES[$dest]}" + mkdir -p "$DST/$(dirname "$dest")" + cp -p "$src" "$DST/$dest" + echo "Copiato: $src -> $DST/$dest" +done + +echo +echo "=== Verifica SHA256SUMS ===" +if [[ -f "$DST/SHA256SUMS" ]]; then + ( + cd "$DST" + sha256sum -c SHA256SUMS + ) +fi + +echo +echo "=== File presenti nella destinazione ===" +find "$DST" -type f -printf '%P\n' | sort + +echo +echo "Copia completata." diff --git a/sync-face-scan-source.sh b/sync-face-scan-source.sh new file mode 100755 index 0000000..a974fbc --- /dev/null +++ b/sync-face-scan-source.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -euo pipefail + +ROOT="$(pwd)" + +echo "Sincronizzazione Face Scan..." + +mkdir -p \ + docs/face-scan-source/bin \ + docs/face-scan-source/models \ + docs/face-scan-source/lib + +cp -f bin/face_scan \ + docs/face-scan-source/bin/face_scan + +cp -f models/SCRFD_500M_KPS_640.rknn \ + docs/face-scan-source/models/ + +cp -f models/face_recognition_sface_2021dec.rknn \ + docs/face-scan-source/models/ + +cp -f lib/librknnrt.so \ + docs/face-scan-source/lib/ + +chmod 755 docs/face-scan-source/bin/face_scan + +echo +echo "Verifica file copiati:" +echo + +ls -lh docs/face-scan-source/bin/face_scan +ls -lh docs/face-scan-source/models/SCRFD_500M_KPS_640.rknn +ls -lh docs/face-scan-source/models/face_recognition_sface_2021dec.rknn +ls -lh docs/face-scan-source/lib/librknnrt.so + +echo +echo "SHA256:" +echo + +sha256sum \ + docs/face-scan-source/bin/face_scan \ + docs/face-scan-source/models/SCRFD_500M_KPS_640.rknn \ + docs/face-scan-source/models/face_recognition_sface_2021dec.rknn \ + docs/face-scan-source/lib/librknnrt.so + +echo +echo "Sincronizzazione completata."