From 7adf47d13fc2114b407b4cc9d4789a2fef30df67 Mon Sep 17 00:00:00 2001 From: sbcrumb Date: Thu, 1 Oct 2026 10:12:15 -0400 Subject: [PATCH 1/2] feat: auto-detect and merge a series' IMDb ID changing between syncs Sonarr can re-map a series' IMDb ID after the fact - common for very new/upcoming titles whose metadata hasn't settled on a canonical ID yet. series' PK is (imdb_id, instance), so a changed ID just created a second row for the same show on the next sync, silently forking its episode history across two entries (user-reported, reproduced: same show, same path, two imdb_ids, 2 episodes under one and 1 under the other). upsert_series() now checks first whether a series already exists at this (instance, path) under a different imdb_id - the path is the stable signal here, it doesn't change just because a metadata ID got corrected - and if so merges the two the same way the existing manual migrate_series_imdb_id() does: episodes move to the new ID, any season/episode that collides between the two old/new rows (a genuine clash, not just happenstance) is dropped rather than crashing on the primary key, and the stale series row is removed. Self-heals existing duplicates on their next sync, no manual action needed. Scoped to TV only for now - movies have the same underlying risk (Radarr can remap an IMDb ID too) but two separate write paths with different signatures, only one of which has a path to match on; left as a deliberate follow-up rather than folding it in here. --- core/database.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/core/database.py b/core/database.py index 63e096b..704266a 100644 --- a/core/database.py +++ b/core/database.py @@ -328,6 +328,7 @@ def _init_postgresql_tables(self, cursor): def upsert_series(self, imdb_id: str, path: str, instance: str = 'sonarr', metadata: Optional[Dict] = None): with self.get_connection() as conn: cursor = conn.cursor() + self._auto_migrate_series_on_path_match(cursor, imdb_id, path, instance) timestamp = datetime.utcnow() cursor.execute(""" INSERT INTO series (imdb_id, instance, path, last_updated, metadata) @@ -337,6 +338,50 @@ def upsert_series(self, imdb_id: str, path: str, instance: str = 'sonarr', metad last_updated = EXCLUDED.last_updated, metadata = EXCLUDED.metadata """, (imdb_id, instance, path, timestamp, json.dumps(metadata) if metadata else None)) + + def _auto_migrate_series_on_path_match(self, cursor, new_imdb_id: str, path: str, instance: str): + """Detect Sonarr silently re-mapping a series' IMDb ID and merge instead of duplicating. + + Common for very new/upcoming titles whose metadata hasn't settled on a + canonical IMDb ID yet - the next sync reports a different imdb_id for + the exact same show. series' PK is (imdb_id, instance), so without + this the upsert below would just create a second row for the "new" ID + and silently fork the episode history between the two. The series + path Sonarr hands us is the stable signal here (it doesn't change + just because a metadata ID got corrected), so a path match under the + same instance but a different imdb_id is treated as proof it's the + same show and merged via the same logic migrate_series_imdb_id() uses + manually - episodes move over, any season/episode that already exists + under the new ID (a genuine collision between the two, not just + happenstance) is dropped rather than left orphaned under a dead ID. + """ + if not path: + return + cursor.execute( + "SELECT imdb_id FROM series WHERE instance = %s AND path = %s AND imdb_id != %s", + (instance, path, new_imdb_id) + ) + row = cursor.fetchone() + if not row: + return + old_imdb_id = row['imdb_id'] + _log("INFO", f"[{instance}] Series IMDb ID changed: {old_imdb_id} -> {new_imdb_id} (same path: {path}) — auto-migrating episode history") + + cursor.execute(""" + UPDATE episodes SET imdb_id = %s, skipped = FALSE, skip_reason = NULL + WHERE imdb_id = %s AND instance = %s + AND NOT EXISTS ( + SELECT 1 FROM episodes e2 + WHERE e2.imdb_id = %s AND e2.instance = %s + AND e2.season = episodes.season AND e2.episode = episodes.episode + ) + """, (new_imdb_id, old_imdb_id, instance, new_imdb_id, instance)) + + # Whatever's left under the old ID is a real season/episode collision + # with the new ID — can't move it without violating the PK, and the + # actively-syncing new ID's data is the one to trust. + cursor.execute("DELETE FROM episodes WHERE imdb_id = %s AND instance = %s", (old_imdb_id, instance)) + cursor.execute("DELETE FROM series WHERE imdb_id = %s AND instance = %s", (old_imdb_id, instance)) def upsert_episode_date(self, imdb_id: str, season: int, episode: int, aired: Optional[str], dateadded: Optional[str], From fb554bd90c5e0829a42753d4897cd40299a56417 Mon Sep 17 00:00:00 2001 From: sbcrumb Date: Thu, 1 Oct 2026 10:12:21 -0400 Subject: [PATCH 2/2] fix: update bundled Emby plugin DLL to the verified 2.0.22 fix The DLL merged in PR #128 was the first, incomplete v2.0.21 build (GUID dash-format normalization only, SHA256 bf6bca18...) - real root cause turned out to be config.js capturing the wrong VirtualFolderInfo field (Id, a legacy numeric string on some Emby versions, not ItemId or the actual Guid field). Fixed and confirmed live against a real server (excluded library -> excluded=True, non-excluded -> excluded=False) at v2.0.22, SHA256 de996550... - see chronarr-plans/v3-plan.md Part 7 for the full story. Swapping in the DLL that actually works. --- Emby-DLL/CHANGELOG.md | 4 ++-- Emby-DLL/Chronarr.Emby.Plugin.dll | Bin 267776 -> 269312 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Emby-DLL/CHANGELOG.md b/Emby-DLL/CHANGELOG.md index 443b4a5..4784ff3 100644 --- a/Emby-DLL/CHANGELOG.md +++ b/Emby-DLL/CHANGELOG.md @@ -1,7 +1,7 @@ # Chronarr Emby Plugin — Changelog -## v2.0.21 — Library Exclusions Fix -- Fixed library exclusions not actually excluding anything — the config page saved a library's ID in a different GUID format than the real-time sync and scheduled task compared it against, so a checked-off library still got scanned +## v2.0.22 — Library Exclusions Fix +- Fixed library exclusions not actually excluding anything — Emby's virtual-folder API exposes three different ID fields for a library (`Guid`, `ItemId`, `Id`), and the config page was capturing the wrong one (`Id`, a short legacy numeric string on some Emby versions, not a GUID at all). That never matched what the real-time sync and scheduled task compare against, so a checked-off library still got scanned regardless of which library it was. Now reads the library's actual `Guid` field — **re-check and re-save Library Exclusions after updating** so the corrected IDs get stored. ## v2.0.20 — Server Name & Admin Pre-fill - Server name field is now read-only and sourced automatically from Emby's configured server name diff --git a/Emby-DLL/Chronarr.Emby.Plugin.dll b/Emby-DLL/Chronarr.Emby.Plugin.dll index 29e5da0c87672fc11c117898c410c8bc9ba9b6ee..d3d44e672d660e0ad48baebc444114db7b6571f6 100644 GIT binary patch delta 29783 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 delta 28063 zcmcJ233yaR*7mu#Z?EYry=PB%*3Q1LhBaZ6RkpArBoJ1C4xK1V5;_q@P+ah$fe|z) z?v8*c2%-jM6kK7%g-<~kabd(2ol!>dKj+*EX>ghEf1dx(^YnYqTXpJG)u~fe_tw2= z(=#zmkH_4;I`y$$H*5v*cM?*)5mFIAlmcMT5+BT4_vrYjF?kA%q=YgBPV3hB9M(z& ztjGuCDp1i<OpcPAcF+EDXNy?RC)Ll}R0(}Ni+n5DEs%K95{t=Uxr8MJRGL;YKM+`Ye9b0&&V%0 znkHiNgYLAQhYAKtp?_fM+K&-(WdC98lINBht}-QWvnOyG(^u%R`5F11%oPd>7YyU6 z@tTN|X+domxm*pHg z1S`_8XJ4pK7fq2Trm6Pg{<+U~hMLB?*lIb&(m0QiDpmC=~uCGI-z?VoOjCofY17D%!-$xZ2HDWO^%_}hmzP^~3p^?CP zOtG3$3IgAt5NUQ7=}fsMliM742D#-#hC`9-(RE5NsSDKDlz{q|lH{r1a-KQU{~Ze; zDsap7wbYh#n3|Dq&J5m(WpX8h|F7spVdk%xicMI?Gi4=!kXivfn&n*~j7)&<(eSz=Q!=0we8@s6mol8SMU@IEyu{}8$ ze2yX+uE1*nMzJ0I|Drq-4w)U~Ml)Y^jTXKtjS+lxH5&QapsD$t=yE$S^Z$s&b1vE} z472IrGIFC+3XySLqe~cd3!`?;sHW$4X-0{K8SRS=EebOl$7STkc)scy6Zq2;zE+9l0gOS~#CL!=EX;_&UdEg^fG~mb> z1EA)1?IJt6t24Tm$#c4^Tf6oSk?DxUTdH|jgL}{bt^+|`DP3cO1P{1Qaf7qr=Eev0+;zu;g{|tCih6^70<) zvTlQu4xmw8SfsANrpfioX+D(nR8MppCpYy}yL7J{9?=VGEINb7FQJhLBfEqq++~&d zWz5!6V>{f$skOMCT5{a(TAg~TdlzE{8ceQLb|#hfmJEH71oUcUk7+Tu&RF~#u^G9N zM-C3_rM}rCAq6AVQj2kF@yFu0Ul%OC^ii+_PAUPG9*Iq) zVXES5Y;ZAO%UN?h#`*;0!590ghx^5P=9RTCM4NB~MBZm*>aSSsljUk$|A8T#lNO4%i@h7x z4?7&dS!uz<08U}N25<&j{J7ud`q6xDBW}-%Y~&5N_BRHm{GowFGLS?D9!3NHdvH}% zkM~au;jFbdjB-7t25_ER941+=r%H?$47e5;YH`wA{K=Qruj!*k32FF9Bju6`M1SXC zdu(W(>;6sHavq)o8Zl`X{JG8JN9s!$k%1& z#`?3!B#Dv1*U^^U?Du0zrd2U+LD^xoTm88x7i@NTLLi@Lu)t4|xEgT-_reSV(0?8MhFxu7?jhv`)M2QBE z8>G%0oav@mXfHtW#R6IC%Y*$=vikMl1cwL`nhqjJx~WM+lFKiTgXl}+UseoUW~V=2hmXPP?HCx{Fk8XAAJQc>Y|wx7_axnwg67Yx{2Lv2sip&UQnf#v#pA$PcJ`rwO$G2~sr zAqL!+I!S8Im0ji2gVh;V=1INP+pbKI`lydx8I<~}$sC?lX#5w~lNC`ad{Lle;rWyje>r+E&=0|3up9jS)u|O;$*(q6 z_zMPLqQ`n-yxV$WjKe6}H;&g$GLez5WIA*89Oc1tL)Et{ay$cRIGi*b=wa$BT_ycKW87-oem4Y#w!>gdUi_!g8Nz#rbJLq6VQbd?*Zkj~#%T`_r( zTt7;Ed2)*U(t_U&o86!!cIVsh zMm|7K$o2otNbjo#$$uHE-f&fkTwI~c;!3!_uh`}P z%lde0*ixakRmQ3*l~L8aRu4s+qHna!*c5H4!g<{uRod;!MQ{DlCcz57S*g@@m9BX0 zmY5VS-3ff-uq|2gl5y&p%I)TgzZE(0E9vrhRrzyel`nk4U@6$JPC$E7Z(c`Lb=iI&M~(>>IDP%*qKr)p%`| zcMzUx=AM`+*Pp^-bfiJou!ZIXQuH4kX=M8GdC+ho4(B3nRg@t&e1vGz`-iK=vz^ii zb?5<{7lW1DH)CXp#WEawGUdfa5Q!EiFH_#=lntvcgZIAlp>@4}s@v3`{ z&pjMXXm=@;D>rSuF&(rDE@Hz9rD z1YFto;-W6spT(kqF{Cz@paOvpcE+iL=XysLQR}Ai-2W04$qRJ7;Of)<5Pk+JdI1mm z@tiw=NB5ReymJC`U?Q2DL@*h_VYD0lQ`Fsay`{xu6RqIt`xV(V$_;eA;3~VsrqPe} z;^tti$2(&Rml8E*UV+>=K`ootUw(Fidc(ZJusKTYkQ@Gqh;#JSc{E2e=l79|C#tjO zcTc);V*6IM343h}S|%YMj$>vFVhB7tKWB8pWO0jthwn<@dCa2wggKlVC)aao8>hwx z7gDOf1}$|wp&R{`n5*6RXuEyatG!Yub;8wt7j5Q7|47Qeiu;6%^E7q+)!v-WS*2C08rH~=S{Wzh&_FWOK?ERHKLx{Cdc z_W+mq8dLt%&sqiJuTr00G&toPHaR0dQoIw<^D7Vv8E(X?tJK6mifb>{WVT^qCble4 zi38yDSE=g)4yjVD4rCg`QbHsL29h7@arP^QA@%FjTb?QEJ!qqw`a(@?_Qk2iHX^jC)jn8v zVmpMHd3P*MmL{kvi<9MVr>T7xXJwX7*T%^jXv8t5IdLgr&j zJhn>R6HH0En$6_q3kxTz*a9^o=%1nf5S%T|Q>WG@*sq^~88P8utgflewVuS}_D-p7 zwXS4}?%Hdyc!oPLk1oNonPDpDYJG-kOt9J1+v+^J;OjHh&ULAVvy^0~q}bq~YCILY z28&uxTKt7P5y=IM|C$zi`4noRJ#JGkyj>4?Lt$y zsMn|;Uvo|R?+5V;yzf$s{)yD#y;rFX*Or7wYUS@mYVBh3*?$eojtJ~O>+%RB0~9>t zRR0q1nC`SZO;>2C#y2p0w@ufu<^N}FB&u^vT4bB05inn_C%il+>8N*#`j;i%Zl$~f z=*X;0X7Om3u3o3)BC73LGP3dc^Lr4}q56>*+A zhRbR$zPwzsbdbDpwt8e~W-*1Pe=vIV_;rBMX%~e`=HMVl2JRqNb9CA-MyG$-Ao-p- zSlFZ9xUAe;K3AI!4w?veGKn+d4L{8coCkB&&zDV?Uz@8AS?-q`=Bc&I^P{)V!>GZT zV#$j%249?~Zd+a?pP#3mTHZ|_GhdCbPqW@PpW={RHjhHpL7|Ed$z2_INXFCW!hCgc zeMZ>RF!@Jr_=SUPkowp9x_1bB$J%YX(PTnW3q$@ zzB$7>DJc(Mf<&peHYUwE`d_Q4p|A>$SpYTh;uW^Bz8?LAZ_%_4;K*rK#ql9-?o^Y; z{H0WLw7TVngdQ8vhFl+wd0~qSbtkv0QF~c=fi*PWP&?TMHFeI4ixny-+l-Aix@z?qWq&WKFP-b747wGgYuH5O`oygmJ}m}=3q>^N+mNkoXQh9^ zSi^*eF~Pqat98sa*-ZStwlojhhcbq2_)BcOyKljiQuI9)JbAI8#b(i7eH(-SjKB{a z?8q-G>xd8oU|*!32_;GOsi-%S9t^iA8>C)DiqApgsKY`5=;>4|pti z3~Z792CP-vI69I|{zi37bMFx*tV!ozff_iY6L3c3eFos28O~^YXG`-GpCyzCLnatX zH{$@{)N)}0PuWPbHd8UpjcJi))z+92`VLztl>T6f;*%2KfzD?*F|{{zbTiv=GTcZN z<9uzz#~utMd{d11vcES4(snE=*HZ>PC(t$QOoGbUo!a@a^~5!FleQeEWpLSI)tly2 zzi3L7H`ShuEk~ub5%z&xyrnVH-ygvQrmn1rnbr1WR5 zqKe5?iFDPzCqY-??OeO7D1%%@*DzO6IdnSC8%wySjjOmeuH_O}btIFk z>^JltgD=g)U8O*0Trx*+R3%{+x{5wxi7Qs zB`;Z&LGGh#*b+(Q&{Fski96qKmqobU_ReXCCzC`LTUn2EkOJoR7a%b=%o?ltl;PPbR_bWDw_G%fO$Dg_BEjCkaz1no6FZ(cRi6OmoUC13F z?Bra_8tSVzCUl>V@+IpfkNR)cOG?FsvVE~Wc&(bWx=6;*9l84AEVt4uXV3Ep+pJ-; zyd#-Hcf;zQ^a)0I=<47xbj_63fb0|Q*?{g{Ov z%fX9!WQ{vC=+F8=%GeKFudyH5h<5BpKhY0L#eUEwtQ%D1(r&O3E*;(tkxIS!<9<+; z^iJWXn{s+@9{`Ys_e+WRJUzD)%46$-^A^pi#h$_S7%UT)VA{B`@F5;p#9&(572}3r z5jcx{t@`avx%h1)wj8I%O#Ho%aw7h4H^fhGF-^0C|~IG$NqVu4>WlM^j4!GBk( z9X>C5FwFwjVu}F{c&Mx{p6oo4{9>*F_ISTZFu+!s(hKB6Mhm2;AH(#!y?$>LtZ}X~ zMnPz`t8b10PU%SL2i+l~0Ul&S(>!G8E_qjW6l^F-Mx8V^)SGkb(@6h|4AR+)rm@iq zVXMpUwZJWzRLyHy-y}pqRxUNVXYR3F3)B=)H=?{`t(Qzq{3?`1CMIJw2IyQ!?Rp7& z>4v`-j!HMc3?Eg~9V?51lUY=(+~_DVz=V9lqgcHgl3b*D#_>&p8;XlYrMqEV8l^bW zUc?vY{pCJ+7WgDPEzb@coqh5Q@QjsgzUJDMZHKYBp|5-v=z-3(z*hxdp&P$VX+TF! zO-;jM-=(GH#lv>&Ulh1AlXH?GIevF)6ih9eoEHTTWyWBsy3{v(sj#qkd0r~?Ng|w| zwj8VZga_ht^s5Dm!09M?H3UrFvWaz}KUna41=#O?| zpe&YHcbLU_Y9X;wn9FQF=as<{W)nh8hr{hmBYeN0PsYGzX7xo>a4PI%R+;*XcZgI4 z&odjwc{OlS%S$KCW$-aG&1NHf$?Q(9;Rd(>P1r#xtw*PUuofaEV)yz3MDG9x(>pnH zJ;XDM%cZ>akSI}qrx(1PG!X8B6lRaaYRt=QLl&{SY3anZFV#q1+XVTN&KCoJW44(X zR#>8Lxjj4dG9K`3hF#E&(>_5jZ-#wP%Iqh+S=bCOLQiIqoOcj#7I*2PSDC!jww8?%4Fz_2!a23K(2has;13=C!ZARGM}hBL!JLo@$^E19)0`x!o|nRwGI<-bc8uXo;>E-bg-&Iv*qAxsrp@AC3AEG1|UFC&6|*r8GnnZpV7@uByL{ z$ZR_)1z1%pwt-duWusyCGv3UW2eZy+ zjQ`}6kXB4Hry0_Uf_faLF;gnM%c z-!0ZTBzTo8(0UxrRcam6djB?ez#8J-f61gehJ5f&B;jW)4`$3_owsb%v&UEtH?5iL zsGvOpXvi)d(5lR6hYz%2ZI6l2VKh26%jqZ+^);PwzpH732!B!tD?VS4hE99Vw?t=yS7dUjM9k9SA5>@Ucr(lt#jm#TRx zOlKU*Y2H0T#{guFG%weo21&3@N6ii0sL+=H)t0YnP#P6J-y|q zJy)>%tb>r%5DQ_!f4PStT`Dq{`$i#a5^TP29J1Ad6{So@cDrDoyQd@DAXt{a8d~q!Eh{?8y>hc4n)v z!dhoC4AAl60emRf)QCOKB6zrnG@Idk(tc+NvzqeJNH+-D>^ko324@AkC;3xnDI6`)3RZd*xd+7JNeWewX*%od z0o8)pO+Pw&!ggk#O2=by!GY?|nr0TB1@(dj%vPD6L67!=IxWxiN^uN?dO@Sev|7&_ zdczGOGsWtH-f*kPTc4Ay^ntrX-a|R>S^B`eA}_O`RO$;4iM;Lw_&f&NMc$jvQmG7{ z5qYPa_&f#&v^?~-;wle8B^~sjgGZPgu0gPsSu^Z2B_jJ=?4X+8d5g++R!%>Z)yXk56Ly@;3|GZ%gobHd$KeR+_&Bp}-z7(0B zi1UWA@PlBP5iS@D7X+gassIC>)nPdbp$do=ECwTC9C!pvz(^PeUcnkLg2sbiu+5D6Vwg;Teu7Hrc6H(;Wg46oYz4mMnFe19R*HGk;Rj;0|Bb=S>2N`0T9Zqq zN-zx69PCbxfl7!LEZS3wrw$&$GCeU+1$fxNK0JkkHUs>Eox?$!0mXtno>wZ(gi^tt z%ZtJP{6Ifup;e~6*u!cVDl%Wk9#+Fxjj@Ag!4#2qE3Oc;V5VRjaD|u!3j`xy%!WF_ z$QQGrQ804;9JoO+a{e5+RbwF&Ie0GIB{IpubKzdW$QSeAA;HKO^I*GR=g=4P;TgfC z*cg}(`!&YRz8Vf)WNY+S!x?6GnOYnpTnphFX6sC$t&TBBe`NZyi8i1`@T*|7R%WYAT~qOE zAUHah%H3tE3R&hM{Xo!0%R*!y3znN1bk)E=1?!W!1lf0jh1{yL82+O%c-Xx+axugV zVWY6LsL>UKYQd!RA;`84)$*E3u0xhSjM%5rciEwvU3IXQskYG6!N<&2nTFzM*TENp zU4^4v2j2@uYyLIxvtYF5UjzE#WOS8jJx0Q{5GmM07zx*cTQFKZmO!##xO#-}@GVPF z+ANkrpmMgy}7P76k(eIuL|j7IxL_(3ol?bYy$V6<1P1_QpaqbTv? z_PYjRLK@}qT?3mgvU^=?_#GHU=~rn6Jd;fvO$D|4o78mF;^ z&J(V`z;R~U*1QS6Vy4ZQO^`gEt1yjroHuNOOu?o&TzK+YD42@(5SyW!VE33~@T9S9 zJncW|jJ;`-lzU*X$oyNH1oyyb!N%d8{kjk6z_C8pPjQ2mv!V@Bo z`nwf&2}b?h3NHvo{e1vl5sdo#02~&Kn*AWWPmK0IYWIV1N@Q-t%!lBNU=L#6L-3to z)Tf8xykOL)he0<%b3XOy5r`0sy7UM*1*0xK3WH~oOz(oh-ZQSp zpmHJ^y$ha6p67Z3@+N64w-d1lTWr|k)4#zy#ZWzK$3%%ViPvkvZ zbV9cq76`T-*)tFj?9~)i*#q^0mEz8^2Uas%7aO9R%RTThQ_UB9;0ulM4zLH#2}TRX z9{5=>S}*p3GL@RP%0%nMUWgQo)`VxlB^a#<&qA_bv?lC>Ou=3W;i9k)3I(Nw<~isl z7%eo9)nUx4eUQDZdEw88Dnv@W&524*WEQJ3s)gRO!M zQ$pG9{cwQkDJcqHn!O0t1!U%wwAho0ES{NW<|RmHwh{^?MScn9T#{EK^2#{xDQ23@ zm*8Na!{$ryzF=5i2oAu2U`OTws1S@A^Ea5gq$BTduv9S0dl|g-9eFQ9kzkbf3VgGo zBkvWS=F}z1I|wn?b>xK(f>%(=JOrawc4QucO2H`aRhW2vN8YP2o0;bB*C5DD^V4gv zoY_iM#whPisJNpe?@g!{jPl+B z>&A|}w;-OG)|kVP&TJ)ANIl($VI(uH*+(EWB~0}Q%oM6uL$q=Pt`_WLsgv&Su#}nR z#J6G8JslOk4V8jXV~&EUwIlB+#0o}v??B9b9eMA7HzX)!z68pnom~Mnch#?bn zPQmY^;4EfX@ZZ4$M8KIWGVw+N;a)5zLw64uB6A8CYtN;08TzAz_LM)bn5s0wclb)z z#C75OAFZ0NGRe?&h&q^yjZok`9-v5gEKli2^GW`Q8#E15B+&HlX8jm!t^#9FmLQ4k zXqx{UIaD4;#nQN%7qB<@9?MBpYVxhF4tZxX5=7yQyBPoBjre~he~$4a z!($~hr`B`tSMg*fSqCTa2o~S}P?99FwWJSaDn|dgLmjjsUh1JgZyd!u>hsjSC7omq zn|Wsa4u<|HgVTrbjQE{mockHi8f{!P{3FfwbORnp8F5#Qgls(I&&Q7-)c1D`!a2AF zittyAzY_d)#$Olwnc)C__+~@IuXqqGkc}9FdW5Bn<%~lZM>9@htU`3*aRq5EW?aVD zjA($3i1Anh$*1rh!0*LRCup57=i81QGG&}W>;gX__QbE>=xcyP{^%f)KRQU{j}8*~ zqk}~L=pd0lI!NS?4ifpJgGB!5Adx>hSi_a2!;HeG@#C29a$mrI9zt>+got!z(wQ@Q zvD}O00W1$-c{t0%S*~EYg5{|!Pi489Gl_D=JIrVpli}-RE^K;q)Wu!k4B{4C!*;p-9~=BumgH>+h1aAi zM0W-&Gk{IX$Idco32XwB=(<(V~furHhF(SJe;aiY|`TePh+D`rH#hwKS+#Lmg#yG zJC!Qw+WdIMr<>U67-}BCW>rZ)mQbldo@`8?AvvxMhv}xFOxRv#(VlJTeuM< z4?`2furix;cflm(7!;LME05@Qx#uf8bg8}?s!d{p-77CMgUj^NnG;C=dt z{5?t@kLxkrqQX~|c@jO{?uUJeUnr+^^mfmuE5T>lGrFAygZ_*zCfBO}R`*z$32o;a1T$xyC5PtUbF58@$?>OHX0 zPk}tdvBglq0a(ESSiu2kljdW19+CSboi&6;EA%?#nEYMd1;Zre=M=?QrEEwb(+86x zj7Q{NNu6}0nr~dA`#iS0aVj=$Af_Mik1&!>Ck(64bK;d|-N?e}#%k_Hvo6^`-MCoM z`A)Oyu65 zf!g9&%NaPIm25f04LXDk!cS{iKN0m~2#Yl5o@{6nvOWon1^^IWZe&c zPyE7KjN}{Z8Odn=$(qhR_Q{dX)JP1jSU=*{f_NpJ`@TB!7tv+4d&5084PSf0spGs`Pk z-ooeCndMfNw@4vUZDX>ZGfuL6ie*V=LyYB&Rg6tC z8)CVYjcUb1kb z8Sxz;k!Hp%jE5|bVagdsa|FrRj6)ckBS?P><9^0dj9^t^VZ3Bz(~RYem6*OezLMoC z#wJXONN8fY*^2ML9`&>`*}~YyxS#P9BSeyp#OP)8F_tlwGgdNIF*Y$aGqy5rVQgdE z&v=sYRAfEHKSWUlUdA%UO2#I}R>qTz5Y3v5WsH@KO^mIKTNv9I_cNYkJjDnx+!;nM zBF4XuNf~1~V7xxMIdK z#!3y{l-|VH%Gkzuk`X*yim{BblCg=gjqxNS#Ih!18DnLLFHMZCjBSi386l1fFqSb^ zGBz=`GPW_EWQ2IuXKZ3@Wo%HDO@g$=+k5VcbCBPF|=%l{z z(uBcF4L2GdGVC|JVK`>^#NaSy8pj!HjJFu?G2U-{%(%~Z%y^smZu3LtkIea&;g-Kx zPFOM`21d+@I1|y+S{QjavP)EB)GJXRMyb;d^b5It{qPKKv+oMTzTV-84_Zefo_CK& zT;ZF7xX4$D*g0hu;#v26#9V&>@k~}7;$ACR=e z{S~ZpkoBurb1Gw7eu$KoF)?xl>sj?=4jH;G@kYe)jPc2olH(!#H=Ev{NAh9T-^2~l zN@>sftPV1T0?}_ZK%oM8TF_y26qmKP*B&dL%B1&h;kP=fN~djSq;2C zB6LuHOdo3~GyK)i+gNRU-I!u3GOaYNHQi~t*Yt?#km-L+pPNkPzUJZPYV$J7-4R|O?ZcN8lxD)G0`V7u zZ}IiXWr@&)$HkYYJ(#AYQ6<{n`KVENlze$5Z{Zp6nijLm%7Fw>I>t4WC>R(4WcZN4AZ<>XAWZ6&RX9 zO;o_2q2uc#>Es0kK1|p1wI;*B*C`p~4h5VUCcYj@H}mzb3=3aZXW#|jE^JQ6w*e$P zn@)xeSOFO}z!X+6VLDZ80zGs5x3Am~i)e^NG{gd0LoA{p7A#K4-E7e~qRQ@^hwq`ClkcHoqYS&D-Ek{B1Gk%deZ8Wxb_YPRIYL zNq_v^ioXNM%@NIVVnmBviobCY`SM>Q@`uRpN8BKt#tgHySx&`Yq4kJtiaa8_Bb((` z{5=tQgY-h=IoT0)PWIt%0{-UX@2~iKHY#6!8-Jfi0qjgY94GIb{r3s^JKy^Cyl(eF zom7#!`<5)pFr-DTlM-6W7E9fCU#O8Djj+L|UvGKwTPaYsui${ZsZYk1-On^g`}MsH zM%mun@3AgX0McFZyslFI&OB^o9>iRmK`yYEF){i@6kCi8L+DoX0@1CN@)r4 zG40vXrCP~SOWsOpal*bxm#yiHgz#6%*0cl5+M4$1jfib6kFS)HcfY$*s+94c0n1TQ zNr^38S4qV=79wme%HWkGd(+cg;4l|H%<@r|kM3TzN?N8w?u)RcRBaOm^ioxFW%x>d4X}*+T0vWw~+&;mAY-g&e%QhbqNMQt^!y>m~fjyDQe~zA2C*TL!+Q%aMwA*Sw@ljFpO8Zuvm> z#DKcFv%E6{i)PQ8yg*8<{EIO~wTQ#R@-lE#NJa26P%gvlSYv$Fn zs`CT0XSZAR*4E8iu)sSfQ0J|kS+!_Ui|w@Tq1_Wt=w5fwjK{ybQ(7{=(-mTC$A72$ z$ZWc{D(Ib8?d`pL+y&juu9Cm6uf~5@JYp10dli2h@c&A-A+lplrD^ZLAFY-lO<$OzxOWDv8