From 98e7cc1ea1d88d473b06c62ba34de47e2f48b59b Mon Sep 17 00:00:00 2001 From: pedro <78969191+8bury@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:46:04 -0300 Subject: [PATCH] feat(lid-guard): add lid-close suspension inhibitor (#30) * feat(lid-guard): add lid-close suspension inhibitor * docs(lid-guard): replace plugin thumbnail --- lid-guard/README.md | 60 ++++++++++++++++ lid-guard/plugin.toml | 22 ++++++ lid-guard/service.luau | 127 +++++++++++++++++++++++++++++++++ lid-guard/shortcut.luau | 34 +++++++++ lid-guard/thumbnail.webp | Bin 0 -> 49490 bytes lid-guard/translations/en.json | 28 ++++++++ lid-guard/widget.luau | 59 +++++++++++++++ 7 files changed, 330 insertions(+) create mode 100644 lid-guard/README.md create mode 100644 lid-guard/plugin.toml create mode 100644 lid-guard/service.luau create mode 100644 lid-guard/shortcut.luau create mode 100644 lid-guard/thumbnail.webp create mode 100644 lid-guard/translations/en.json create mode 100644 lid-guard/widget.luau diff --git a/lid-guard/README.md b/lid-guard/README.md new file mode 100644 index 0000000..8abf966 --- /dev/null +++ b/lid-guard/README.md @@ -0,0 +1,60 @@ +# Lid Guard + +Lid Guard keeps a laptop awake when its lid is closed, allowing AI agents, +builds, downloads, and other background jobs to continue without changing the +system-wide lid policy. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `8bury/lid-guard` | +| Entries | Bar widget: `lid-guard`; shortcut: `lid-guard-toggle`; service: `lid-guard-service` | + +## Requirements + +Install `systemctl`, `systemd-run`, and `systemd-inhibit` from systemd, plus +`sleep` from coreutils, on `PATH`. The active user session must use +`systemd-logind` and have a working user service manager. + +## Usage + +Add the `lid-guard` widget to a bar. Left-click the shield to toggle the mode; +right-click it to refresh the detected state. A highlighted shield means the +lid-close inhibitor is active. + +To use the same toggle from the Control Center, add the `lid-guard-toggle` +shortcut in Settings → Control Center → Shortcuts. + +The service entry `lid-guard-service` owns the inhibitor and can also be +controlled through IPC: + +```sh +noctalia msg plugin 8bury/lid-guard:lid-guard-service all enable +noctalia msg plugin 8bury/lid-guard:lid-guard-service all disable +noctalia msg plugin 8bury/lid-guard:lid-guard-service all toggle +noctalia msg plugin 8bury/lid-guard:lid-guard-service all refresh +``` + +## IPC + +The `enable`, `disable`, and `toggle` events change the inhibitor state. +`refresh` and `status` re-check the transient user service without changing it. +IPC events take no payload. + +## Notes + +Lid Guard makes no network requests and writes no files. It spawns +`systemctl`, `systemd-run`, `systemd-inhibit`, and `sleep` as the current user. +When enabled, it creates the transient user service +`noctalia-lid-guard.service`; disabling the mode stops that service. + +The inhibitor covers only `handle-lid-switch`. It does not prevent suspension +requested by an idle daemon, a power menu, or another explicit command, and it +does not modify `logind.conf`. The mode ends when the user session or user +service manager stops. If Noctalia is unavailable, restore the normal lid +behavior with: + +```sh +systemctl --user stop noctalia-lid-guard.service +``` diff --git a/lid-guard/plugin.toml b/lid-guard/plugin.toml new file mode 100644 index 0000000..d054229 --- /dev/null +++ b/lid-guard/plugin.toml @@ -0,0 +1,22 @@ +id = "8bury/lid-guard" +name = "Lid Guard" +version = "1.0.0" +plugin_api = 3 +author = "8bury" +license = "MIT" +icon = "shield-lock" +description = "Keep the laptop awake when its lid is closed, so background jobs can continue running." +tags = ["bar", "indicator", "productivity", "service", "shortcut", "system", "utility"] +dependencies = ["systemctl", "systemd-run", "systemd-inhibit", "sleep"] + +[[service]] +id = "lid-guard-service" +entry = "service.luau" + +[[widget]] +id = "lid-guard" +entry = "widget.luau" + +[[shortcut]] +id = "lid-guard-toggle" +entry = "shortcut.luau" diff --git a/lid-guard/service.luau b/lid-guard/service.luau new file mode 100644 index 0000000..b0618be --- /dev/null +++ b/lid-guard/service.luau @@ -0,0 +1,127 @@ +--!nonstrict +-- Owns the systemd inhibitor. Widgets and shortcuts communicate with this +-- singleton through noctalia.state. + +local UNIT = "noctalia-lid-guard.service" +local CHECK_COMMAND = `systemctl --user is-active --quiet {UNIT}` +local START_COMMAND = `systemctl --user reset-failed {UNIT} >/dev/null 2>&1 || true; ` .. table.concat({ + `systemd-run --user --quiet --collect --unit={UNIT}`, + `--description='Noctalia Lid Guard'`, + `systemd-inhibit --what=handle-lid-switch`, + `--who='Noctalia Lid Guard'`, + `--why='Keep background jobs running while the laptop lid is closed'`, + `--mode=block sleep infinity`, +}, " ") +local STOP_COMMAND = `systemctl --user stop {UNIT}` + +local active = false +local busy = false +local available = noctalia.commandExists("systemctl") + and noctalia.commandExists("systemd-run") + and noctalia.commandExists("systemd-inhibit") + and noctalia.commandExists("sleep") +local revision = 0 + +local function publish(errorMessage) + revision += 1 + noctalia.state.set("lid_guard_status", { + active = active, + busy = busy, + available = available, + error = errorMessage or "", + revision = revision, + }) +end + +local function refresh(callback) + if not available then + active = false + publish(noctalia.tr("error.missing_dependencies")) + if callback then callback(false) end + return + end + + noctalia.runAsync(CHECK_COMMAND, function(result) + active = result.exitCode == 0 + publish() + if callback then callback(active) end + end) +end + +local function finishToggle(expectedActive, result) + if result.exitCode ~= 0 then + busy = false + local detail = noctalia.string.trim(result.stderr or "") + if detail == "" then detail = noctalia.tr("error.command_failed") end + publish(detail) + noctalia.notifyError(noctalia.tr("title"), detail) + return + end + + refresh(function(currentActive) + busy = false + active = currentActive + publish() + + if currentActive ~= expectedActive then + noctalia.notifyError(noctalia.tr("title"), noctalia.tr("error.state_mismatch")) + elseif currentActive then + noctalia.notify(noctalia.tr("notification.enabled.title"), noctalia.tr("notification.enabled.body")) + else + noctalia.notify(noctalia.tr("notification.disabled.title"), noctalia.tr("notification.disabled.body")) + end + end) +end + +local function setActive(nextActive) + if busy or not available then return end + busy = true + publish() + + if nextActive then + noctalia.runAsync(START_COMMAND, function(result) + finishToggle(true, result) + end) + else + noctalia.runAsync(STOP_COMMAND, function(result) + finishToggle(false, result) + end) + end +end + +noctalia.state.watch("lid_guard_command", function(command) + if type(command) ~= "table" then return end + + if command.action == "toggle" then + refresh(function(currentActive) + setActive(not currentActive) + end) + elseif command.action == "enable" then + setActive(true) + elseif command.action == "disable" then + setActive(false) + elseif command.action == "refresh" then + refresh() + end +end) + +noctalia.setUpdateInterval(5000) +refresh() + +function update() + if not busy then refresh() end +end + +function onIpc(event, _payload) + if event == "toggle" then + refresh(function(currentActive) + setActive(not currentActive) + end) + elseif event == "enable" then + setActive(true) + elseif event == "disable" then + setActive(false) + elseif event == "refresh" or event == "status" then + refresh() + end +end diff --git a/lid-guard/shortcut.luau b/lid-guard/shortcut.luau new file mode 100644 index 0000000..db2c4ea --- /dev/null +++ b/lid-guard/shortcut.luau @@ -0,0 +1,34 @@ +--!nonstrict + +local status = noctalia.state.get("lid_guard_status") or { + active = false, + busy = false, + available = true, +} +local requestId = 0 + +local function render() + local active = status.active == true + shortcut.setLabel(if active then noctalia.tr("shortcut.active") else noctalia.tr("shortcut.inactive")) + shortcut.setIcon("shield-lock", "shield-off") + shortcut.setActive(active) + shortcut.setEnabled(status.available ~= false and status.busy ~= true) +end + +noctalia.state.watch("lid_guard_status", function(value) + if type(value) == "table" then + status = value + render() + end +end) + +render() + +function onClick() + if status.available == false or status.busy == true then return end + requestId += 1 + noctalia.state.set("lid_guard_command", { + action = "toggle", + requestId = `shortcut-{requestId}`, + }) +end diff --git a/lid-guard/thumbnail.webp b/lid-guard/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..71c082f00d8317be2c2ef6e05af8652c4d21879a GIT binary patch literal 49490 zcmWIYbaV4M$iNWp>J$(bU=hK^z`&ruz`(GdnL(O~!PD6}-~=NB0|Nu&2@uI*z`&53 zS5g$@?xYYA8KuDffPs+#EYHA@m|R={QiB6CGBA9*22p!i7l#^r!kj6o#mNi|3?CR6 z7*vWPBBK}>7)2Nu7(~(`Yz+`Q3BtAkvCB&eN*EXz13>JekRWFU2F4Ty1_q6EBz6)K zJGr0;q`rrNfx#v>rxaut$UPw6@ucR31~V`)a4;}1$S@Q$1TnZXIDz~RQoz8Fzleds z;wu9K^8|!g(o6=1?X3(961NayDhn7G_*)nlww*_aA;P2}u_zI29t#5l15;WW1H-4~ z3=F)H3=F~-7#O&s!Ey`?3^?2diZmGpcZPh1e1>#}9EMZ|1qM%sJceWjJq85^BL)Ko zLk6?301Jhf{R|8jN|@#{Y8_yfVY1_7YIK;;fUu-nYHqcl0fOwpHUyzzm8p5qiA#ZPuQNlOg4`;`z}%oz56G;dhhxZ{9Hff zU&NpNGxzVg|AAk!kMAr0ll)`;BKw{HcmH?&e(~SBxBnLZS6`5>T|eXB*Wd2{#Q$x- z{{Hv>xAwbhxc(jgXaCQChx*I)KkVP#e_nt7|IGh0zsLVqf5U$8|K0e2`V0Rz)^Go> z|NZUv*#F}HrvHeqiNCY|QvKO~5C1to;r^xnwSWHqJ@LQmf9<_$zpsAR|F!Q}|0@5M z|Ghu+{V(|+`>*}q`+wn=!+&T04gb6U+x$KMo#M~$-|&CIpZ$OT|7Q4q_igAO=70Vx z*fZzS>I!SXaDp6Gyj-(T%S@M z`m_Io;OqV~_8b3K|JVHc{*V0M{;&I+=Fj{m{?YnA|LgzP{?GY$__yaj@i**0+duoi z-ha0~`Twr}uYN0k_dY)RllDSStw-8|75YtJ+nhkc$T zBllX;=H0!ee3ANJJNNEC_fTKoV(Ewj?Yesd=lg>}v@beIRkY#DX ztQeP-65?;3KECiZR{9oC-=y7vUmu>^xTAZn>Gc_Dx#f=hGyRjV9zD1+?`6-CZ*`kI zN;O)xm|KziOLHuXcXyIPcL{ZvSU}}%&xQVHo0=>}PI1I=%nN9=<$ZR>|jAH~dR`9#yDhe2h)CW%;JafQ9#6|35F8ba<0@pT)`J zaqs@@_@=SWM`%IYfy|}%7wi#JOFdm5ay%r?vxm#CTxRdX7Oq2CTpg{)Yz=yNPDlSx z*;oEU_09j;b3RVZ)6`kTc2w`^UpeFF{6;KKo|jIEyp^?XrD(ltr#*%Q-%poyPe2hJ#bU$f$lzq{9*GhNITtE?#tGTGLX_hCCYzgb%wfLm^|iD+>h!MV zKi?cNS6H+s;TZdctwI*{uAZufmloz&eclw(a)61+#?AM5@v(O?3g=zEd3jvkXI!?o z;mt?;hHsOYYiBIa|NHjd6Bkvh7g>etRbCtWi)nVmJeFNw>+$K#6d%s0j1%e;yjR7o zH9TV5bibgo%H@Ae-eoD?oCvwAUw1m5+^~NN=K;?8ZK7F@k~3}Z*uLA?lC-I_KlZAO z?TOslXwwg+pSaIWVCF8SOi&(tlxym#JL z4x^Sg52nZRoITVh{%=MS*Bx`8f4`S5Ic{VT*_!izr{^J|DbcEuE{kTwyjnOK7n_x}&=z&i?L>Omo(pmABq?Z@Q^qd*Y&UI3HW8fV+c4_IVa-8@tC_ z?o}O={2j-|)D^__Qb$?--QGFV7B=mguQWJFnsrxL0sE*yXw=|D~9N z+{qomLR>p67Q{%MS*o`5{QYMOw=fv{*10h63%zOgWG7qewQI(SUv}*@IL4CnTVK1` z@3rT9_WjZ}cl{+}*00`ZX>#+PKewE>uxK^I-KBHW8Y}KZ2L$`-AF|&V^Xs%%QpdCS z|Dyd*W&RnNoH#S}zhZ9qO{qh|hS#nibUg5OcGtzNkyG1}YUS@H>Ycd1F7?=9yFKQ! zGG`<%Txk#~)^JeoMVDdEmbZJi#Cv;p?X7B(=45knpBU%xyJyeyg44d=J{LIbwJMmh zbd_3Y!Bp!c4u#HAEB8(2(GrK76BX~jiJx}Gp3Kk|6+vPYLr$6j%}P@x&npO(pfq`!D-SLyodYvJpky;m=-E>Tkx70dd_X}s)@ z%srOUyUogSSCg+;XDKD`+~L6dg~!P_|NqSO`i-t9B$*XF-Iuyy%ghkk>& zLp;o;{S!V}W;~z57Z*PHn%4>)Df_7lHWeD$K6<(%*;iL2o8g%98HV~4!&S3ZMXIpI z<;;K2FvW_a!en_sq>uiY_Tn}6lh*!W@%U0PL7<6I?&kaEH7Z}He|@*A%Z_1*h_U;* zR_?q1|JfP@iufJelp199@t@tEl|rGR{NcaX96Y!Y1aHT`(<-3fUA=B+l7r%OBc4AG@tzZwGj6HuN_HWLPn)oK+>k98% zj`tpyUQgZi&9o!aV`{92UUJY1ZTbC4^-s26&w9|{f0}Cv`*L}fXVZOC&bL(VfB$Z) zt>AmkFp0z(&xkf_%*Qq(HUn^TiOxnn^Z}-cO8XoJ`Eso~4PPKmW_Q9eB zGrUf?#%tdRopi!UlGR&A8iDEaShAtdguBA ze^_AV!9!~cwy3|hJSi@0Sk{(VW9TIC(p07C^}_S5OgE1&ezNB-+tX>xwcM5Et0#P3 zk?%8KX6pV4KlXQ><(PZ_@{yyjHiW8kH^z6a5j&9gJYM%FzxRROmse*!bIdz)@%-&~ ziARlXr~EyilV>a8Sj@S#QQ*xJmx_N?_p_!=*5Upp@a6E#i!I&3J1)jf zKR@BEPY<`r^{go_pP6`NiOY8LLd7%lxq2rQZxC8=A#$s6X(W@yl;xLKoMPmVapIBX z2y6V%n0C!i@kzLrv~8RIuf%CFp|@whi1RwXZs$hhvq$B+Sq#NZeCuZ{&E@Z!%yZWH zK%+^!;=8(_E-<{3%nr&JWU*6n$szIRT@8^$Z0S4vT3gs_l^+S&& zaX4IXNMCz%eQV(I3wP7^|J)(vcJYAa?^&it<~Am`$yIm#4nAD5=4RIZ`%{0Pycd~v z;y#~{WBy9xkGzjPH|SLt`H7{sm-aKWeduQpy}5VBHsw9b&#d!RK9h1^@k4;u%G++4 zb#a_B``#GK?U;YaOXP2%us?66?@kHljXo)@nho{r{)dzdXUHDd#2M8(&tG-2scrDw zHw%TU{2%W2a51-@ZDf=fwR*`1Q#;jfe@*QfK8gy~ByB!eWySq#Tb9c=&MINyMpii}OscPm4?7dlmSZpe(y+Kfp|789X+q}KTj@d%SI+9^yBqLI z@5t0UhuZJgAN~8gKwDGdxAV1S6Ex>q_4MCmalg0npvX?8#aY^5gx-AZ`%w zTz2-Ot@mdK{0cNOJIC*;ol|;3S%hKfg2MjF(1z~4Ha1D!%8BxP?9+K?x$bS|oMkgb z>W<8bdg&0Q|D zM|1s>ieSFzYer8l{yDm>?O$EYdh7K^-a79$xN%8S>3`0NHR2+x7H%~P=9u?TqlSZJ zbM9fY=tLXyh4Z&+@GkwIRsPZJ+|fDruFuOU*bvH8@%O6ztwZ)ntnp>GYRhY_!f%~y z6WQV7H`VstQAahAYgT-&ZaxfMyPR$)c3lZfF0Qr9J>qUMNAT#bNpob(N>*=qrnJKR zP~G|^hoq$6T-mXsVba~@W!0tE13l*MDd$*|tY+ALDfrjIU%agH=cG8FE_ut!n_s$R zqnE%!Z*PCje-S}*uJiaZuP9uru2FC&_>WBN?GMpwck%qLJZE+P{l~b5^+$So1s?B} zpT8h&%kKnnUX>21g*j2~?Hdg=9u{b(r{r&#`o-t)rr6X<{XUgr=RYpKy+&b`e_M%9 zgNuLjo~ldv5<1FWKKCC>Zggn-t$#CE4-ba)ev1fv{mEhd^&Q-d z#x}C`2MWz4c$dAsspe4t2Xzk+;Q3h z4x!Q>T7{*})t|KA6gaOsA6&OFpsDQGwMVDltFD`%a{hztmE7tkdp%Jz$CnGX*KU?9 zSQGnaua44j#XElL4UfaNTv5G#;(+mN!_A+PCWrm5kpKjEuNm4 zTg)`~dhuetndY0%R|{WmTvEZU;;=#b{4((}dFj1QDx!*-i|qrn1l|-HXDZw4{isn( zQ*_!GY;t2sg?z4-!}b0Z-BUQfIPkUP_v!rGI_s>QTg^(oyeoVw=dQB+{w{F3agK@O z`^OsI3G?6X+`DAM-d#)hSM6D48v8g#xI=ZG{?nfBmnSyve&(~dG$KIu&W4cnJG^$R z3Mo2wUDlKPYWfxVvK)V{!xe8;!b=P;cnd}zI--l;pIQ6 zXOiV}Y4M#i_srB;dMDge?s}1}e~Kkb^i7DT*RzkWcYHsZ8QnW$<28wW;_H4-EXmBY zj8>_>zrDVskpG7<_nO%oTRv@O?A6WXxyH7sXJ5yPS4#6|TowPo<`@tjW3p7TT>5OB zv8klj`u-0hcWOTOTt1YQd{0Q~*ea&mh92pLT@eqpovrtKo;l$Ee2Ud^;TL7k zC>Ty$^TMZ!<3RV{NBZfHxz_Q$y(UwXb#&{x`sdc4^lnt16L!!uPx6ll|K26PgZ*$x z)1&0m2lhVdzO&Tr_AHOr-Rle(beopf#QhhUsl3*cWzOYCw_P7I#I)aN6OWxVb-tT< z?4lP_-XEXAF2Cq{!LFz2OHX%PJ|*F&vR~@JjNlD(za=WNY(DWw)Mb-I{Tt?-N8h$? zRxjOfV=1q^WL|h?;_-@?#$HwR+K*>Vx|-2?{yY1Xx5ZiUfsBHGZZ7BechJD7hxOl@ zK>r;gl5EZMw^kkht{uWxTI94ub>?-84}UjCnI>-(zN_k1`&0Vc5)ZxHo}B18XXdbo zbWSll8~6Qqx6Osw2Jwq_N96hYDH>NjzTC5Fp2AiI2MKBEzTgiZqg8V~wtv<9q;4!W z$E}6;xAHs}-pJ?Iqi+aLusz)!#4!0*&1}8vQn&5C&I^7cu`S~3Os!rMhVSh!N^~23 z{OU+IDL&*9#c?dXLA}i}>iXf03+^^Aa^B&2v+te52`>lF=`Mfg?fq@g`%L`GkMhgr z0;i@L9Qe`o)z^7X-Yx?=s(Vd>!4APf7 zr%x?A@y=y$`@?HrN?x(;a!wU#=;loGt=JhaJ)tz5f#Ki3uVt<`e-+=(2;Jy4{rBh3 ze|LS4sX1QK_wYyTqH04~fs+4A;~)7vF8pxfrItXH{;B3T29fs>zinMtF{k35O~_QNT+W&VWDIJG!y+S``XrmDQ$kChK!p6Ghfb>+lO>7Ose z9a-F$`^$^<1pDzD;aq1Qu3Bu!&7tu_Rkgru!Az0;latEz>?g3We=y%}I9-)j(Y>Af z@6vk}f7v-sgjulPxU}%?x3U$rhxFYT({Fhd+)4Xu_WXgpd*7o+M+{j^f&=)bGX~Hfs{pwbWcYnEehp$_^GS4S>una`~X zA#1k!_59-Uw=D{=HR}2wou?3Wxb>{0tVCu0*Xb8F?Nhj0#`0`E`{rqTuT-%*C;t7( zf2!Yf(c}*j@#d<{f78RaSzHc{`p+_NLQV{mlSQL|x9h+xGjp zg@OC6+>4X0yt&NJ%s5fdc+q~V%Iis*S7R$h{+aPe&)78SguTA7C~M^d$*O{b%WW_G zQJnV8J8Ujrth4KZnW~fcp5LwC64S}}p(5>mbe!F;dslq7DV}-ph)a7__38ai^UM;q zFM0d_T<)i)ZQqIysWF{ka9)%!MIkCp>E z(5p&@N7TUCWwpspvnoEFLZK=SyCTSzjxA zzphc=gRMcW^vSnlo+fK1o%IeVsaBs+`qGvuP%>kpV)^>ryoJvfx88rNW&W+O@T5a} zXVbzP6D}R*Tk5|@_}Zo;b8i1Q{j27<>ystiW2Lj+{F3R z*_hvE8?Mewswr*iKaguUFF-y2jhlh=5;duUUk^+rYFT2>KhVE3)3jr+sr`dVm)Q13 zao^uI!GvosU(yTFCzH5B$~9$^pO+q7t7NmWT-q{h%bWEAwdbDxY3dgewK>7-x@C*l z2F8t{F{yQ}BEfdQ{f{>lo7>)e*Zg`#Pf1to(wIXHyAOP_vzK95WTdb6>i2p^gUlu2 zz09{W4erGE-dNqT(!{O*a{NC2GN}huT)R@Gk~z0@b-p>}qM;YcQ@%)+>ENCdS?tmI z%2T)hUD^LJSHb&$Pwu5ff)Wd4SC?hq77oh$6{?V2*ki*IRx{<%u!--E+Iem&mg&st z?{HZkU%BFG@dxj4mg@>{0`|oh24pfLoR{%m1Dol61>?UjI&aOOF& zr(;HB!yjD-NuTv{ADKSAacn%A%~1XG^2Gnw${xA8F?wn)&D`zd&&5)oet(JYqFKjZ zXhw4sh%AVzzPYZX*#1eu#$vAX%Vr*wDmi$|xM7Mrui8b~EAmDAZ1mbbcRIXl&}~#r zs_@M#4b#bH+R-X~i{0mc)=leOd8ZC?|J}UwUExl1SLU_JS}qGcGS1eQlq?oW{Q2V5 z^^ip&S5-8=39VC@#&R!jqlQv&#+DfecgKny{WZ7t(Yww{v-5W=RqLGRt}9EK=sR`Y z=U~25M|WMA^Q)&#Q0lL>&a_2;7~I{&+x}cGO8V?}$TA{6rNHg|dIe!2qw>qQqk{gd zPZN50cBZX|tb32$Ur{hUvf_iV^xD3hS3Gkx zRN@b4t~;}T-kpSG`9tqcu1Vyqkcr7K)DZvm%V3VK(!rjSyC-b4IDFiA(d@1xPF&&l zoNYH+NFGzlSQ+8xbk{a9=4JVmtn_C~tfSu8rZaq~n!f$h%GVo9mq@(0?;aXk$FY5j zvJ+c*gQ)UUnTiiCp6i=?q}7^NpDem~K2B^~BA<(+>e?Is+x3q4iC)cle9B(K`MmFj z$8DWcU86Yvt(#>ZJgw(#ho0H-#pmi3|NXyy_@lea*6-;YE8LEJuy;FVsKK$ZP`PK{ zq{XKMK5lL&Sfsgji~5 zLYDsNO+R_9JyyDIir?UEB>2{Ab>C^lv!P-|N(;EYF465UD((#aQ&?!WP%fafJT_^j zaQf%lC%3l={WSep7jves)OO-TPTR}~?~)DYd)L%nIC6`dTfxhw;H=oQW0}0xKLuWw zcHHUR^Ygxlfh~(QYtrw_E{UHm{&}7oe$nt#j@LplWtQy7{B1&>W(({yfCxuMhcKwhnyrM%t@k_v^)!Fszl5UOD_O@0f zC#s)#*>~D)7i0eaW{u078|~~F%r;c%RVvmvKH^%%Y*GC%^|x2r2T6_z(>jySO!;o9 z*0y)q)$UpTjB;rlf?az|p5^OkU6$+mFZhmSmcy3jl3&?T^QZ92U5^WWX*=x>7w1Md zllLc9rxnzC^lmJl8F9)%P()$csk`qy%DVb<*0|RP#x4oiknFc#xx151JozAxoM@N8 z|JSkywH7t!#ylvGZ4`W_U8@}_#(uofDK;SI^t5Z6e|`JmW%_~D+DkpN=WmsGYTC8S z&mN~vbUeya(5v=6wC!NrGuB`4tzRD9pJn(~`~R-^ZD%94$iB2b*u(GHyl(UCq|y~R zzZs7l`=>iI@ag{x5_(SpeS3Vhc$Us=k85M7NVqMoQgZo%_8EmIIYK9mlS_=8Tv|T; z(3|4W8>jIrjbY1Vf%-Xjv;4n^6dbCVH2t$W*Mx*ux&>a(xBQwpZF#`t(^}47>i1pi zujVyoxj#vNzuxYbjvQ{!z5Qf3JejYp*UY~cI-75HeL=m3$gSfIyB3(THkA)Z@`e-?WOh$6N*~7Ok_ZIjFUzpIQv-|FwXT_VEifi6}W7X>vePguNaEa8HYhwFa z_UumERPJi2s<>TbCg+q{FMM)u^2@!a)Lyp&wBzUdY_W8dKgPd?AAdUAC}VW#$RsW3J5sjuTQI^;aBaum!x zeI{xDVu_H))hCG?W`_medzBY<7whyDqq~vSQyLy=lIPj zT1F=VU%d)b?GZ0D`L^H=Z|h6Lom;NTM|V$sb@ST|J)4W?O+A(zO00jPexdoYZj{27 z`R6}*^oSS8ofKC3*s-LlMoMFX<9EOX6OhCboA1AmuF(kCqgI!@?| zMc$pte5GE#DYC!fApbAxbc=(Q+8cjg-x@7AHAgTm!f`>*{qN8FdMB?jPf}bMc8w#_ zwc9^t(|Y~$4Sa<^8@u&YC0t9`GauabIQnj$$d*Y)tJWnit9~OEcH-yxX)cnHEfI6Q zEGHHxJz(nBa1j6Uq?=i!EK=XluBc6T*IuVnzP~hDkL7nsNMskrlw_8xY&t$Eo8>@$Op~m|+zGt5BO34THJPw0!u{=&FaQ5l zZ(J)Y@KZ*Pljn<_mP*UQjt>V`_t~uDW`R zu)b*eW}P6j-f9-He>0cN5WBY}D!t|Eu7=I*3!d_SbK;aKe{`wo^~)(|=1z8V-G6O! zxY_Itb7y#bvpeQ*yIg0j{F(w$K^uoh`H4-RlsBL4U*+`uO|-eCjoUHnxMdLqK83{^ z3+7oVUy}6RX!7U6jHK(oRBKd^9;GN;u zsK4L0_w63Hpc&kP#ZH^`DJW0^-=at;G^@$_&HB` zyjIu0DZ?qDBNUkLVXAe0$|T`AX{X%|DZib!QGVw1$6Nqc70gz!B!+7>Fl;e(U%yT+N41LoY23`d%H+Lwf`6H;FPN2j`0GKx zgO&P*^A3FQ`}6hgnzoN~!vDOUa>(}8yn`V{ljoKz8+pI2KF-D&*|T+%-J>Aw>CqK$ zmI+&GROm)5)lS{q_`a&X{r?ZSt#fo{9dVHhnpiWhB;nFgU75&~Z6A9llM-c}sHiA6<;AyGZV=URTz zjU&$CViVneY>eYIoYuGH+Jn?xOTGx_wlZ>@IP>jhap)#J5q8yE`X&qAxTc8Kes2s? zn$&B}A>CH`>iN@KV*i;A-`L*tIau^c?DKm9S0|q{PnS>l_%YsN`w~Nj@CoboW$scG zDR20+dnM-w!7p|#QNI3f=azgnlaIOfW8Swp(TDdw*8kFd zz45@kTQY1jl8kRV?f-sf$;=Z!y{Amn@7^{0Ay-zst<0jUj$GURycOQxHf@>$XIzs? zpTF9oHt}c5SF*ZRhLAge;3ouJ!wK zQYShDIq%4Cevx#ur&IENet<5kB-g+BH=ACcej^*sEB;?sO_kg3?}znbr=OV1-7KE) zkF#oX@~)1D6BbGA?`$r#*lfAPJ!8^?xw3126)mzkY3x#&{NRkzxn0-JA8nYs_u%`_ zKiiA0tL{9lWl$*{w(8+YudZxoIYt==UBhi)SEe@khk!(;8f$Q z0&5)zkEG|Z+(yy?$eD=~dBs z&e!51-vq8ZhA_>lnKf(f<9_3tyOVgfM!mXGmiXeI?w;@S?wt`2t_s;LwCYHB)4op} z`#KvEWP&(eFF%o=)uIu0>R-drXWyeIm&iLEx^eUB+znz&IUX&zc+jY3&$9a5SCcmR znsSNNSvOa_y1+8|$xFk3E*_t`A{Elg=GN5B?t2^2uY0KS@TsdSJ!YOd{7|mHsWxX# zz~A?>OHL(+2ku%r&EC1QGx@0qpGc3&p-Id4GMZhSDbsG9D#zbAGlX@yysg{akl!Y2 zvkb*fuR7owv1QpFev^o?bt~kH%>7=0=C5u>i+;1pR-ZVv z==KEja~Hmwzh9rM_~ZMu$p2|FHV>HXO_}XyNIS)E_}{`V{UP$9od;ufg~&!lj%$nE z*Xg`BO|!hA{Ilq(M6DcC!6)lk_I78sF13Ascw_7Z@!?+#bw%xOlrp&+9r4uqH|1aIf!b9a<;flrdzlmidbX|#%2rmE)%z@- z{Q1j0FUQa2+hlc_Z6s>n)w(#jS8gd>_CZo5^Id0WiptyFW-5E?5)B&Iv<{xM{QHpc zcT365B=1FyshW!wYo|$zJm0n9YSf>tQ%$yAn48FSfNkQe`CRGeF6>+QIaW|BGqNVn zPQxdi;l4V%iKx|yzhM_x?A0$Fj?^u=d$~^Tl-uzyZ-iQIOlHg0SiAAm?jyx(zj7UP zK6Yu{r!4Wknp1C>ue>2YEo1Kee&N99QHcveJuND9u?$pE-TwG?T6VPUyew|3^*X11$UjQm_ps)`nKd!KOlv2fo9?3j zsqo<~jih(s1>YZ+%bYs)e%j&}OHck;`?=_=ulsd*#eKha`RV#w$Ii=m(fL!vV?xT3 zGUJ;Eh0~wb)||W$^ucMmx)L{&Yh3j8XPn*2bElc=8LxdbiC@|NW&XoY`77(Lip=C^ z&dsQ<+0l0M+>|%B%dLOA>3N+HxyP@4sqo+5nT6}tgcQBce34+>BVaU(p|*Lyq{QR@ z{tinoxI?TKv;ewjJrx^}7$d*#)(j zx7=JgL0ww56sy~N zxwK+dy7Tpm*If^NlHc>@dWuKOo|sjqCw;!Y*GQ}DZpG#M#j&bRo1Zeio+Eb2A*QDD z*mYT+^}hr}BjSwiifMU*GLOA5sD9MukoSX@<-J15Z`ne=S&0lsK2 zJ9E2un=JMtw|dm%wW8Us&fchXux)ee1s!cU>m$$J+rB>fPu#hrU&}!*e^23(#J|!X zr-XlMyfS;q<>FcGvt#Ra{S0kbzj@LEpYQCgdP~5NknwYLu!5UATHsIswZoj|#P zl-kL7>#J*7*W?|XpAufn^nXWqW8X7(rv*FCh?h5)IUIa>;j_7Y!!pa23MJdL&py*t zexDa(m&L=XeR}8pa~#L+TJ>C3%UWjtFq!3!vfxJkeNE|XQ<|hsM+vZ%f6gctmSaTl}x9|0@So=uvd;E6kIs0yHQ*9Q1eX!x|=luWTPgpizUX<>8j@di( z(ayBaol<BtTHSoPG3@qKap3K#bJto9kl=2(9( zn=Pl6eCDRSkLS;XAg`z`H3e&?b0jl4)yD3YFPr<$RF+PP;hg56 zRq*`kLKna2gjsu^e{N8{6|aMcM^*_y%y~%Zl&IqsEmR7{;*k!O)Qp`fOZ)S*$pw!!U$5;&19~#U&#U>}} zovZunvG?XnVqpii-|Wirg2_kiyx)9+IShqM2c zr>{70jOX!_|FdNM*zA5W=lU($^G2NEt@o?QM)puwVT*dptaPr3eK!`?PvrjO&gypO z#CC>Y#=UkeJ@y}zLe&G#+|U!N4^O)=?a7DQ%S^N9u$9$^C;3cvchZ=&fwg3=;Dv_X zBZsdgc4`Vo$!_24*5zRG{6L}mf~O0P2?@8KjsN-cw0qb@))&j4s>*C_dboAE(-!?p zhbvc~KKnEJh5ngf2G$9c_bjYTj<-r1*w2Y%JHBMw7lrv#U%XuQJ8^QIn#mt=j@y&Z z1x}E#UipO4?#r?8uL`qt9PRJD$(TzSeuln@skKER# zx2!qZTySf8`p=T!2lW;zO_H1i6HO%_&%AW$dTa~_PxSsn6Vm<}mGi}F8h!g@YUfhp zl%HH-sq$5iFo8ju2BDb&PE@Zzhw&T$J)f3s~7Owmozaw$U>!b%yV*^DNxmq91 zn!cu`-6#9KSjdleS4AsrUtj%|Y{a^?jy#xjHdm>h-kXwmo0tLK4lUDXVh7m@-e&naTMEd&2R%FV9(W z9+}c7dh^<~z+)F#zOw#hTACETV2)5{dDyX~HtfbN^5H0Rzgzcu^Dl{%%^g9?|U z(|1evmi%~l-Rq`UL3;Y$DIWV@{C#h?S}FZ|)ZdeQz0sTIzDa*nW5E1yeyZ@IcY&5Q zi$YxfXMbICD_dJUk>nc<{k$Kt-xh?mqv^mU9mG8;slWkhEdXDhi z05AR@SNPT>>Bc*MwW0GQ0D+-`@H?<cwaMJ;V~|d1ahN_e z>}vY&d8&Nb7lMw*Pq~%8wRgLu%%svQxeok-Z&>dhUHPPNr&O$^lh`-@3XMZ2#Wsc% z2$^^qTWy??()#CR`K!DlVp_d`oYNbwLoU+(naoPuis$cCtA1?IKEHV5=K5XVZt`g9 zc$m-Fu*yRvH$K;W!pwK8Ki?7csbnho_9*$`3@QE?t|gL29#`8wm|T*#+_Ab>WTMHB z{<4l9C$CJd#YwpWkM>CH{NfhrWI4NCt9IkeZJcK&{WSKow*Ml;m38=5X-}?FDf^Oz z$-5a@{@(hze=W<`$A2xd46N86Ze>};_Wb2dCz)KEorNpeq_v;Tv*q?%-2JIjEM%+y zoR~8`H>cMgZ&JwmT^G}}=-|>@g_Hj0X6;Dn{+4j}Ab*6+6TXJ`dki+Nb~IieaE#;K z+c3X|&K>5WuU~vFlnQR2eo3uX$Sd)j59V#E*v}HGu}k)DhVg`n^>?@=RHcG) zm&N5BHI_4A>t#q~sy(XU^7u+B*TN~R%$%t=a?D?!D>b;JuJFj-(*I{f+!02ezdxE6 zPv$Qb)oTycKKuUWw597JP0xE4Z(pc;cdg~**=%XkcAocRp0s&s?CM0p!gCkX6TckE zcb+{>GDxqLS=d;|bJL^L#YJqF`ybR;blG_4pE}_mGXLzsMaJv>VqR+4{xPc%U%$%M zLHC+&`i3J;0mc(|?tAUNPIei~o0|?wZ(Z%h(}i23{@L62x9)mamvTc*;EdNV6Njra zM3&6&{Jrui_kk%%$6ok#9h|+VFMr0)g%ut`kMsB5`Fd^X!HajUtgmy|JSr%$SoXrr zZ$gup44u1N0ty3Ho4h|A$=mz(R`31=A;$Ku`))sC>Auc(u5_y3jX7${2ZYlqt|ra( zJ25M2yT$K_SyGCP<*%;- z7QK>t_k2&C>&*olpIy8cvyfrZ)CgO>8QIT2x4ruN@Jz;qJ>q1Ki@p|id`eStXi=)bKAQa3O0L$JU17c>{%bBXf?b3ba|Cb=<2N5v&#KN7745n z>fatTsmvxIW&-cm2ty zy}DscXRmdbH#_>qU+CV_GbN-a<@+K3)-MZHIzOcrT>Z2B!LI{;@8(y&biOJ-{dPw1 z`Sv?Iws5pM{k+Qc+Ub0c!|c$nFK#_}5VUd5otSi9ifs#ZC^g8_VTMX%;4 z?w*~J&@q$grRiNQ$qSp8x(H6wXSv3>&^q|rZDsM3OY04k=H5!_+UxO8u|4T$$);_q zkKW>ZcaS-o`{t^rdY0wqJ|1MyICO29Mq+c}ioR(=r{5PboIO_3*xRsY*7lwUvB@Ie zldtDD`IJTcSH2rkvEAIIiTTNJhP z{?dfTGmq}1bN!F;l$nh^y<==NvB;j z*Dd~Xq5kn=r+M|a)%T`MwR$)6@tIZIVqEQAe5c&WlX}S|qHcObsi;k(=}0m2b(z>@ zYksO7GJiGwOu_u#oAR5kNlam$Q*Xz~-I_be<^BCAvB!IsWeaD2jl5Bxyk9MFa^=D+ zhgWfNT+}d{vbkAI?P?eEHAacU`rG$D*uBY2``z|yOL*LRAFu1yFbr99aFZ@~m%;Og zo2EbS2ol+I#LKNONox(u5ywWx4g8Wa9SZZ~U$?0#dcEAV|5>3#uk_^yJcbIsUR%C@ z+w)!SpV*1kumv+GwcMJs_t#v<&PVo#_W243$kpYQp7lNMUdLwOC;$BQ$CxX{Wy!xc zoi9_$_dYMz<9PWEQ~FB(yRFj$1omH#}V-KI5 zUwOk9kEQN>UCK3$N&LUIE4shveweZEL~$tFK|x8e2QsUzTi={Xt=2ZweL2m!Yk{k< z#@`ES=a}2So|NbOE1s$S*J z;mA;Xy6bDu_shCgn>C%My*=Y*_AKb$U+o9ZS8`wIRWv6)Fw6YlyZ*S{%=h*G4j~uq-*E+F;=b6NRaq-AyxfwdY5{mtOr<*@}9A56RBd8%% zbh}Ca)bh}Ii+pts8ZEed`-g4RLUGNKu>XpAf5IPr+wb{wTGkSUcbk^2DY)6c{>RLj z`!>8`T(?Z|?}I2?2L8J%&g(5ZF7mIAXN~Cfw$&dv7fh>X`6ahp{6Jk_K+(Hx6^;*u zCzV=v?w8$uI$_?vi*t-TzieLm%Etf1iA{ICpItv16`?n0_JeKB{qm0`XUCM=+}#^z z=2gX5Fgy8jTuxx<-pP~pbzLsBe!jQ($6sF4>&c2W=iFVH{AYJm?+ut0z;2dQ%c}h1 z#+|7P{FfW{rkuMPx5t^irf{2_(b5|yUuxE$USTEk%4xTw$laJjU;Nn@r5T_2;{0yT zwKZYW&vUKoXfB`nBVm^De}x?1Ob73T6W5k5_AE3u|689sWlq6_EymJo(#?N6-u&V9 z;qSr}mw&;tbyzHZy_Ekeq{o=B*YM?}i+`rsvpa@83E1OUx-!D{LES&s&I#YQ8BK7} z*?+_BEyX`Lc{up%-r!_t z{gN5~ZN_W z7l+hV1@W7l&Y!eG^IK-g4GxB5rgIW5)@|B+WXpqtv)EEIWgDG%=c~?0;OU78(K~RP zw~j-{|JwejUG)L%|08q#3QeAsyq+ufX1dMii1Z@+ixyY7ZQRX;HfdySXP#$j8b;5-m39Yp!9*d?v z`)apFZ5eZhtR21`6HRJ!! zuWVvJ^(KC4;mZjv_S>Vn?9$I;E3bHTt#3-xxHykv7yp?j(VN=DxPIQ)-EJ~X-*)jX zy=!U*<}aA`Oz4m84L4b%cjtJkB7$CKe(SJ1y5Zs7o?sT$TfJ%X&&B#}Usn3j>#xHa zJu%Azy>5GY-kW(`yjxQA=DFt2YiBz)X=uIa(_ic9V)W13Vt;D1YJ=vb4;vr2<`h~i zb1vL}wjpVrqTi`4!s{$Q<@p~?{j!27_%KCdyWrY4iTswD;xA=?=HEFcrZJ`b&Xp}6ei;|~ zvu%pAjS!i!G&E$}{7&uU-QUYuFV4U6hC|jo_|%h2fp&-H*GFCxFXuA1Z{H8qyqTZj&6g~!{aqtQ ziR&Q0cQ$^U zO!E5XrZd)eHqBUkJyD=HB2D4q3i+w#?x(T?zNNQaU7B6WpDnTa*y3Hb&PLZ0zvj#N zD_1966fS39zD-T+{>}Qx8I>YKlAg{z&5ga;e&U%8~NQ+f5&q`nqxCmd@!tIJ>1H zEi3={YQdf5@oA^;one2;?r)?hy`gsNs#f9Ec9RqW!s6^&c1qk&GPrMcKs)rKPOb3Ppxe`%(wb*;_oU0CXKU)cNfYYjb+YWx?^Mh z!`bZB9oLfhKGg{KKa@Z7Va}sv1$M40E4=KgxdjcSy&cu>uKnYBE>r0EmM<|=UPbRM zu07gw;hk{I>7#4bt`_k;H(OhKlC5B<=E~)~`F>N+Os{abUB%vh<a&X}UW=cr3oHF!^=Immx)Wv!;;gLU`vTVVRe8+g{P576 z%f)Ki6Pc#Ea1qI4m(}NfThViC$^ynaiC>=auRd^p#T9PtkX(lNJIj(JYj(UXnSW)O zZ=q9wQnE`8L*RjS-cy{mGY+U~L|n;uwp7Vh|G|UI8(G;8mR_6b9aK|lc95Ard-gIY$F>sLHt^+oyp^U7kZ}8Q{1qr z&q~!yKIE)wPsp=Jp)ap8rm9Cd?2x=0u<_^C3fYdUW*0IG9E6u{>e*jxW;CJ1;nMY8 zE4J7!-K71dGo)Y>SJA2!-?Ob`_y0at5ui)Tr)ZFAasElsE7wsVkm&zA1Iq!n}X^)z|= zUq`;4>$h)5%gOc~b0(-(Jh1J~^U*%k)iUYV%lmsDe7IS1xGdSMf0EFR`3J99oUdT(;Q8E9GztCEj*LC|&m(CVk zzBA|D>&+XUheai=;QEtl^~Pq}uKyRe`)XU&YKmoa$lJ>QTf9D_=jU6c@{-lYKLYZN z7yZkB@-6KASD~Jl$62i2FXmk^i7P6lPjuBRK{JNA{V6ub-9?wx9JXeCZjc2bEZ+d@;<7%)J>s|e#8S#%L+9u6AdP981)ElBD zugaqq?J1kFfG4MvyDBWMFlO?`+iWf2KmW`Wc(8iHe2(_i1LsRtzI(jfy|Sd4YnwDf z-pspdZ-t)i=b!txkL%+ZStWLLc%!y}143t6e_kFCIob|FrCcH2>MBs{=Vz6k4Yo+qait zS>UejV^)?s#ceA;>~eW9*U|sSzkPpJzp~sye zz|8!=1`^X-lRt}Q_aA)2GWp3;n`!cON3XGGI&s?A&Uc@j6zXsb2% z?cmpU-n{-G`kUFuLo&zU){e!Tts!5|w)urlQf)n(B-DDk;Kb#}cDG~~aEZMW<32l4 z&E552-0jKBt`%PWkmb9Z??srMczDDEnG1dkCsr&pWC>B>&*yASX44g%uCv_9$!O|a zUA4(9(f{-&?>?KgVuk(J*9yt=>cY)Fm02(yt9dyuNU6^rXT_MPr&S8}tqPO>-A zt#YdA@v*(twd1M#u|MAy7X1u2eHZ<9AK&5mGxOKVSYFhbuA1U|@N%um=gl<=YlUC< zWg5@9a&zUn`2228xsNL<7yg*U#wg2nugiAlO z`*XDA1Q(miX^U5!T(*0nmQm90Bd;e^3%+AL{?eMe=z`MG0I3<4Zn1w`-k9E3g? zY<6gm`71s5slH7|!cW$5q_27Kt5sV0I-7CikJZB>Jt+e#4qx{Dg znzJNX1eyjsSa_vrg3B+F)cc1lb}O%ATe0k=L6s#>(&{-U~|nEUfX)h6z=^*P55gk0Xh_v&X=?Clek7TX?LBp;K1&0ZkGxBhvJwx1_I zhx_65>$kbrypPx|=rLhMbg9m7m8G28EfvCd_uu@G;1G1}#3j8H>ZCHIP^7%5AqTVqN@1u`y&rzN>A!7{~d30?bDB?9UE7CKE(L+%J%!`p0C?uFk8xK^@*A}ozn&W zhe>rTyy>;?N9TN&gZuerY$|n-S-UcP;@(@%-{-MC+O4;3r@n;L?nm{0zmr&JxZV!u zwea0~oblJ>M*XDENqRH?>^}4T)lVxAk16SYOCx5iuy+)@c|0YZV^>R;M#<7ITNZPN zFFtc~bJ_iX@2ZuL%e>Vt#amB*x^s3+Pe5tcosi(IJ%{%6WKTP$tt#H6b>qpa(vs`9 z`dOED?@{#lw&u#Cohv-%ZVnAed7H1i%;v3p(uMb#OQdp-b-Y@Ya(vy^#6zl*cSV~6ZecGe*cD!Gn#_P{}ruT;}DVkStOOv$E%!9d?LT&Pn9rz->M(ygZ2djL} z&c1QZPW4~tHzSpB-oM$O54o)rTJxavVg0wvi95Ud{J*mbU7sIu(&F}BuiPZ&-xDhK zNcydORd1Efmt{9scKZvPtLI8iNQZuldXTzI)YhaZTQW#0^6oV~!83V(%cA_!o9~@) zoaAUIePGJbIsu;txkon5n?0ZZ*tA_njvXtQ0;46LT>E}E{pI6T*TtvnKDsA);D+tQ z&Fz;yY+A(d+?1_q<+eXT`((GM_p5ImM@J3W>krna0aiGyCw{>)U>%EOBOfGU;0O zgat=(#gDYtN37+(rJKLOHg{o8PTUU*%bB8;Crf9pd^^8l?RKe^{}!;In zFKxNAedF5Dc|1k$L^#(4e&qP&H+hHM!fg`{-wr8in)_Y$`%BLPvlEM^_WAG0*yD8Bm5raeIWlcL-L%Sj@wb`(MAY2ndRvdW^H=_P!*}~_ zad_EF&#=vg&Hce|0&l$WQAm(gKilYJNQ`@}*Pd^o5n z!MyH#=IKQf#UwYUt^QlyoaX&gpJSQ)N2S*J6Ko^a%xvyRiYn8&#QRS)Zmn0rM}ddZ zp~4@ce>@HjU6Ha?U1U=@RrFTB=|+%m(OoSJu2l} zENZJvU$C5S_;&6_XHD*mj7njvc?R6II?`91c;B44^0MNOr~UM_8#xoV8~K?plNC<9 z+1q3-@HNdZgEOKi`G7>4-%2H>1!gyVnT-w0*e1*Bz2uJKe7UGvKhI#n!2`b+ZK#>e za%JY>FBg_9mSA?i-0)9r^77_HQ~!roxLyS9j}ez*s(rM0f60}LDl5v)G7Dbl5sIAI zoEfaa+^|37k>Tr~dH3clsrzVqXIr^xO9J!DEvpOnY01a<_p=!9yn23n_?ufVUOqUM z)8cY~KlAhN13Ow8j+K?bi)j3;v)U4!EBQB^`ENQyEU@iaYZ0TLjDtA9j2;fru zX7{GJY2L8_n=CgY=PxCPo+ecDCFO06aFMB-mL$-ZFvBSEtkSxpjBPpl)0o^(b!BN> zk&~Zj^Yh?2Uz=i{BeI=`Zk3)4;rq#4Q$5{PqT#&e=}XtugrikM`*>AC&u9y|@OFi? zva9{!eXqXQ;y^#s(-kVm5}#>gGVlDav`=ZTaMRp`qNBP>o4H?|XxB<`KN0(H{W}e% zC0{qZYtY+Sp4G#2=#$t}C_5EQ4_!ZaZ@defOYxl(T(RoP>!zEsbN zizxg%ztPhF(?v@+_rHf(?^^Nhbk6n_F^zf6p>Dn)lTE~Q@9bGh^SHLU$wnDv?|dur z;Xp{hnfvG3nzlSSVjU*;b=iBhycwqFzo`Cn@%Xhm@3-b0-j;CQi{9&>-gvWKO-0enX5V(Hz4p)WcdqlU+PB&7`&|Ali+;zTTS>48L(D~A`exYaLS z9-4FYm1S0T#AB7?Id5An-%dbY8lz5OEnGn_P?&$cRR z=56?tWyO~w_**e3=zG;XYsQBwLY3VYCGIPWbl?AUx>eKjTWY(EAE*@G()u5tz9jE@ z+3CYR&lzqxi|t+@+3de3-iV1~!kJo)0AuU$)6$RL?eH{l+_U|Lw%7CjQ!>M+otQ8G zPVuNw#`T#~r2W_X|GnmNP(A)+-w&sG8%sC3`_7iVaHrNw(C*_-nd)m7v1yk6!ZA=xH z7I@;=`*wHt$)!2Em-ROvSUB~;SyP@C`-jQvZ=dCU`0|TanxK`SP^_uELGixEsMEpw zW^C&D>bcT<+urPTWo{Yr&TJ=7t#*ktuKO7FcB9&z*&69l4(fBf&pr%tPO?)B3Q|>P zyQKZk=%*J?r>mEjO?u48(>c#|Htkv?(4Ts?b8Fh<7p0u+)9&l)P3~Cq(%_1; zko5Z8*YEsh3x3$xRP z6+e68W7S)3vDaQwZtD2)_LHTdN9^a!N&&u}dCn(0Y6TRv?qxGd>8a_cHnYns%6wqw z_dB-Q;nGdci_;e_<5bkx`!eKeoj*^?X`S>q)s>G;PI3l>&VEwi{>DeV>!|zWxmVZy z{M2faK2uOO!E0&h-g15It(#(O&d(MV6EwNLfA{enSH%`9F}OKRdAPxr*C0b8fVX{V zTuYAeyF1R&=XP0_dd~1q;Wb_JT(6`m)jYB?^o`G=U*9vn2XI}fV@#hfv(fDABCUDf zr~VaQ*}g6zc_n`z@8kAan@{a8U@opZEX=*IwykojG>>$ z^r=add}7@f*dP_zyMNbQiIz)}Y@fPsC~SsLOD^I9fmh$l7Qa+%|Q<%yVtxK|#p0@KHL(lU{ycgz<4QV4KjZ)}(s zw1eZ6W2R)@EP+Maw|iPCFW$hrN%w(w4AVXjrtBx8GbV0N*zLb0HRHzP?-N@%8q5Ed z*zoQDxuU=MVo8!v!gfX5bN@Dfpl(p|m2Yh)zI^}qyh(4HoiYD?M$Y+S8I@Of7xysS_2eiM zmbI82xO(>vowo+Z*R45mfPu?n)rrj!lQ*vWHscb1-GvL)%MHH#73TNJI#SA;^5weL zJ69HitA^fMNr~I#uf&L1+g~}kHB8WH#toka!`bUyLcOj^cXY76TVWY;?d#0m&Sojj zM7tt(Q3rL?^Zcz>dFDRVXMdcrYEH0DsqaKyg&fw$!s2J!Lq6#8s$A8zQaO}dxAItA z$2V5bS)0UFh*8Ix46SkF_wZ2I4%V43)c?Yq-yzvHaE2 zbJy}zb@|)Sw2KQ9r0#pH$vS1XBEmX4>$9Y$tyF;N@ieXN)0UmvBC98K=TUAO|A7xL z{<`cH<1x)Rkl(!Lh3LA=KAh}~CmzTza#c2+xN4e!{{0DyCN^)c?me`w_Ut>e#akOH zzI~B!VAk?J(&E7%8C2)B-&>+?!!Gt6@g}WX=ZJoLIDzMo;vTjsPq)9UXFpWwS+IZ2 ztIl6y7krLzrvK|JUbo{0FaMxHi|vsl%u{%uzK-m1AXc~+L3y?IyQOF-a0Z>5WOCG!{A8YMdG zPQ0+_@zM&#$Gl<1!O}^$&)G~76$_wfF8ynyqcl2;+TX#}_N`;wjIx>+R9`6)q3%yVpHmc+WO+A*WGNKljH~>)n_C zQs1Jrc7w#4GxL1!{JUA6`1D8L1j9ZBd$+`@$tw?)*_cnBo5@fz!RX4hcWm7URp$hV z8u=bmyTh70HM8#%(i}@I($62 zd$02MY!C7}eQ02FlK4&jAp&*gf>it7bKF(sntd4&PJQ^&k6gHUZ%1A58MIXMKH^0a>szUf(?O)a-JN9Oh& z`McKcOzi_Fc>~SD6L+>hvUl~(ndh-}OXg4gi&kgeOy+HytA0oB$TIyeFD~5O+?aZ# zi@oDQ!Y{#&o(qz~-YuK;r}g+&U&-Q3U3ArJP3)BYQsK*`(tflqKfXyq?3e1}#oxTX zo-8rhr5(0Us$0D4$`Q7vGroBTU3Ki{MI>q4Ub1v29 zkp0e6y+MoWwX|&WEByVBCC9&ituQf6gwafpH)MLd=Ud5%Z18+9F?DEn%H>F z+8ApMDY zlhJ+lD=#KCd?Yv2EkoX zOH5UqR~VVdXtmwaE_7dfG(|YE`(ylOXQ#NnUrMcSE*)q1_>7bN-r5(5DZ-_5qyyIN zd1dGwWw+{aW_fd^MrV40MJ0R0+-XYo=c{kOIHdVA^R1!XvlXf>)3VMS zOk8#6q8L+|@GA{|e{@X6hnSW*O)@0ujuc%)QYd&wh+ba3L z@WGn8S~li3o6dRe%YB~8xm7)^oP2KD%hNM|rfl=Hygi@wyP#6xvw8Q^?=VmI^9y!7 zy_4>=)aQK;ifc2pP|U% z&7RcEdm@tm^{1w^D4GU`N3i|B_6X1zY7K1Oxwy-wVIIy6c7Xrx{vLTX#Af z-*NA+u$@fvq2C>;ay*VNS>yv(?n?=q6aMf*XVI^)RJ98$pRrw-lf$W_8oOyM=Vywe7UW`$J0(i)-9&a5=W-&eLYEtQpDwQ#~fV zKgT=Q^o`W})H_%D3pb}cG1`=N;GyZR^QKRiO+NnPM(mooJ#&9P%syquAb8QMe`)e& zN9Ne6OFulal}%mqw{9!bRENv_^>Uq`SXq`_3v&HvJ%8nnJDvMJm|vK3_t6RdH2I^Z zF*lZSdiLtH9W!ycr#5TKlv%rWSWEv-?A2Wt_n6^<*5v0;k6qs$5jRV%cGB{czI)FF zb{g*Caox2{XNt<&k~qI3Cw4@e{;k$1tSxvX>#}j9kVyEX|7TO3%O>5Ev|X+*_gQyK z%06eK&&S$Ay*<``4_NBE$7Y#E%Nm}g^N%X_E%{c=uxFX>ibGQ)gZ%uQkNy&_I(4BX zxpi)0`R69dXoc>`#SW}N*WIcbFiN8y~@{@Z_a3!U=lsq@b&pEo=L}UJc?N@ zWN9?9!Fz6Fu;WX8=BZ0~Ztpl=w^*klp}*vXk(`q4=N;=c-7fzxST=EkMjm6^y88z2 z{26}NZHeX9(`o2d`|x9d*V+#geH=b~O3KRGtS-PDIO}hzwdK@DYBzNAXINOru-iXRLMxc8EAicw38!S6za53-G~`>j8xY*`mL!)0}> zP9EWlQ+gTgC<4-EiZnB+wSm0T{{KG9z1&TPYF3LH)Q@8dq=bx;kA_wu^GD@|UlXV4S8A0wz}^6RVG4(6CZ6`P}O_ncpPO7)hvI>{wyUfkX%?=15% zI^%HA^gM$T2G_+iHfL?vByZyS%|blotNaX@cqa1x%T|f4Q4L4Dn_60Tem-IFE-7_y>9MVC(?#WWTNY`ypNx+bi2IWx-mLI1 z^ya-E%S`xeKM8Lwynp(C!;+Js!VP*7zv7oz`UKC^+wByuK09xYh1Q{e2hW(-Bzj*y zvi!jx8TX4DCw@26e!MwtuC&eue3ibH!p84wptKX%KT%ctXqoD>)$3eg`SdX zOJ4M(736Q%Vc2sp(MOXP#!0;BRBi8 zYRjcXhdzG{nbmn<%7VioYVrT(hWdBx&1qO9q{*sX@wlk;*87bCZV{(B+wVO5$rjC# z@9w-X=oj=6gHLss>+TQwzSmx_c)8~`>F0cf6YPJwKQxq8 z_o~kHcbEMr?)h1I!Yq~MXN4>;@;7T$yym$#!kpm)iq5SKXXujilV zSj<|PrR@9olCRG#JL62Z)Rh}fPJbj>zWTi6F|(;mY8x-Eez$|g`G-u4#$T3ACG$lW z1_}IPIrX(bb3$PKLdH*_K6Ov->sWq&$0<5_QOHj1N5{`cm0XhNO$?s3&9{m7s4}b3 zRHY>=g&$7HKiVL|W4SKl;)(1T2e_@i#2F^eTj4&#bW)qt=393i1RIVqF^cRc&~~)e^sgTU*eJQy7dM;OP8*y&=<_Oprt?I*K=1@@x-d$xoHO(<)vQ8 zf381J@WrajJ~kY{fr^(kg~nsQ>!HUG1ROCB?saj>&KXr3PW;gQIRWdiHZc{ODC`#l)mbJn*O3kHoUC+*x7EK6JOq%e|WOwi2+Mq<~t|rO`JT|nzgqS zm()#fsl6&)snL7txxa1q_iuB42iEl5?0*p5eNBS>fS@DC^wfJFmp%Nl?Lpz$Z)x!d zjd;h#+;ES^G z%LY5=nR%M-ZoXogym_^ykzbcE;qZz7#PX4iujlM9=_l=Xy=z<0^4n>Z z?2`xIQx&gl=w~f|9C43V$Xj%qcF$Xz#7WHS!UW2D%O86N{$3t)Zt_Og7}KQtXA~5x zJPZ3WSLGc(xu9e2-#oshTH6$ko{@Q5W4KmydFG0ZyS|CA?ws>N*l_;Fmu%m@Z&SFp z!9VKcVKxz66YIamHCioo`_uV592uoQep$Dp?(DvhM9VN~Z+o^l&vg~gq*|p`Tt$-LIi z9~ZCbzHmfFH)-?PO4c7&C9X)`T(Hm3L~PHGH3!Yt&-1E!?$_mTR3xfpUf?+)yV56Y zCf*lr&)4H!&!M{Bov}{xm}XoL=c|> zfBuh6S2(TaGtaxYME|sQ9ZR?o!XC2{y)0rU+GTcbv9<1E=C&ZOxA8+E$m+{ zTQhyH$c!iQO3E82Fzwfm{d$7&Pw$2nqvW4A7uB5Cj@%-`7ojIGd+rpcXCJQ~eKGm8 zH79#!^QB7NLpSD_PkgoM#l#qccZQS8-&yRPZ*O~R=cx>*#=YT1wM>8RUDTWW|KYEM zn_trIbS$bn%=UF*%=6BLT3@-h&u-k*G2Q4}NRiE?L+6&weth}2@t01s(oJ2x>sN~R^efF;CBfA@amlH&_~gBHM=tzNsGP0U`h8JT zam&@f2lZPjBNs+62`oMQJI(H}gLU1PUmA5;Qocg#W-O3@9K6ZTAz*gr+siZdPQPXO z+HZ!OryEXu($cE^J9Z*8hVRxCbySp5E2-DTbJf0p&yxajFi z=bYebIqYh4+vh>fr+KQZs#k5&BbN7@-u)u<_Fw<|U*_*E%VrWmzavxJC%QVBZR<*KY!86!g|HgdIS4|R|dv}RsPX5uBsJH75tE)T} z&|P(?qyM?c-Gdz$_I;2z=4NWOD5CD4BvYuzmAIYEjO*u`%)00NKV20b=WgNudxn?MlBPaBYg5rW z_T7c1VY75nk~LT)=hbXFW`FR(=k}#C8x4;0)Z|_g>$;V(I(3i8E`#3e&9lyJI_+@oud2yz32P9RRIUKg_%@*%J}I2=HKgEn?G_-dSp9iQqi)MrUU`U z>nmIYFRGp5&z|aBclqw>JvuipYAyU)WD$ zyrRl@WmeeVRdU~I?WXI_EnC9;dVT4=R7jB^5V;sSi#aZDQyv(86{Pe4bBKNP(Gg9}kx<6IH_4=nb)<0M5vUsyfxH2a2 zEJs++=Zam;3A`TKIR_5h`xPr|9V&kKkoP6ww{2&2{Np>X_rADlu6)n?^p=%zn_J`D zKbNjLrf$~yiABM}hdDH6@kS3@fhU`7uc>UCX(`pPd2!8QzwL8wG5&eOQ!1U>zO1z@ z!(@@$dRBi4_ZO1|qjqY~+i*94K`FK5j&k&})a|c}1pM2+S$*z);LIn>I>W;=MrvjF zqfNKG>N|yF52hS)^zq2lU(i^~v^l@=Nx`fcCpj0gOlDkDAd~dFsOVOkY|uvk)Mp7= ziWds5b1o4w%sp~ccacZv-oN_-9&GJ3Z2DB+uQ+{y66?9^(#gM#{PzVf5IB;%C->+D z_g~*l_IOGiWm(KAe%v*@&|*vZXaBtyy~EaQ*{0(8Y)9pFu4cwbI^`A{r)+SW|0c{d z^!ni+Hw#tH&0FqdIMXDkT1m&f+u8T4-HUR~dm)R17fhYOqE>Y{UE*s*!MTQi8<%m3 zy#25&D)#Sz)&2c{w;Bp~>U~_qTT-`$C!qL|iNwW--k*nc&X<`odlDh)KQli=p|1Qs9xgxNY#pz2D>!U5FD!;Zeigird-y+H7C$3oYdPd-mX{*w` zQn#2bNZzKn>q_Za_t!oF4+_pU$-fGDAHyeb|DVU)a)JIM-@QZTip6m?{Fto5E3;tU zevMoI?whKAxu_@j)pWtqYo&Q-58b;H8Y^HFEmCT;jX90&d+Uyv!(Vp3S@6};VCu)F z?2dm?GV49_{{6lwQHIVRtLE)X()zf_dY#xS-AO;5oO{b?db8!x=QpauWB z%`Qihq`&3e-L%8CX_{C4uOBa)ZXMWsKFn zceN_K7Qc2yy*tLTNhHdn<)*04(y8Im4UXG09d=1Ft@}5*?|jMPc@kgR=6|&@;?+~n z4RMa`)|`FdHSe(08Lr0qQ?S#7ZS1%qG?%un3va+yLzGTWw#tgl)&#tjfmpHDw zJNdrsi@XdejbG>GZuLFMu2`7YV5SteJ!t07)3U*TG&iNHL|A`7QAWlKlr6M zW!6!-L#+9(5)#u^AL!YZ^j|k}4eL3!g97^u<}SLoe!u#{5bYPzJ<*L@II-;los z4|mMJm|rQ)ZN~UuZ|>aQI)3^7rFo10GzzW#F^Qul_koDZ{UQaA`crlX&hPzWG0jc) zPdICUuC)yD-+%}7=>>Da#PqeHIh`H0|%z)g$T z=P_=VkK{fbXr(FloB6{L>%HrLJ$?OR=anx^Hs$$$-8P=oejNzPr1*hAKz+EIQi zQN8?vKyK2@p4dg!ZaFL0&uTwBe}=(@6Wbb_n9W1?e_FwP_|}{&QKft zGL#u!oS3a5@X^$3>N>5M|G)pMzT~*iSE~0+F=Qdfrrv9!^2IA;wrM_W^k4ad-&SWw zms&;EAKmAdYnR+vYy2tcve_b&V(#9>T@Sbmve&9t*eVGxlL-mk*JiwA+ZV2>{f`~u zo|@kj{$gsetwU$6Zv1VbQ@0IDL>?@>V=w%!?wH_#zwFYTVe3k~uT^(w3o-4L`tnjf z@6Czuj$20SYkYU6wTQBNKCVpu_fv0`>AtyqX6FozzZBnbT0f!QL@h8dG@WMNGJK`~S35-J*yPf) zchax;`<%V^J64;)b;{(p^}#|}Y4h)>|EpzqQ(VEa?uxCoUw3{*^1+mVU=hRYv&Sya zw9^myzAE?G$@P;M^U6Ny8Xi0M*{%B*Uzo~yCNeyd{_^wU zB)1j8A8MKX_^%u{`>N{ss$T4!r_^!Hm&c2vlU8)PUdwyL)N{9_t=w_9`~r?p#=3R9 z8tgHw|F>wg-%m`jr=* zzxZFXtkeBAJA5j$e|E=D8H*!Xhl)0Rm2X>hd*^5Nt(zF;96S)bG}O&r_-2$@L6g)k z$!9k!npSK2E@MtZkUGK9x|(x7I7Qo~caq>9+CCT(xr!=bL+c zF^{+G%y?lCsqg=9_mq}C(OGLNItohGhqu)TnI)~X+H>w-vPHu3`8!@OVLrrv_tV73 zg7a?d%$1IMs%quG%y6mC&3DHFIhT7Lp8x%=(67V{>)aCO(vw0)6V9)A?3g|2NX&c9 zXs`R7GYgmR+RRqCf1B#-5~D{y!|&%iz1VW%{>^_2drlN68_quP+3?l`p6%Va zulxnqzh>yJI8bcqVscBL<3+|dK8}lr zANgbZs#@x>R+6t$PbS-OiF@7J8b1ANPMn>welp94Y`cm2EAGBoy0us=XVQ_4e2w$Z zKjnP8E8Mecy-gNla=y?C@ikg~d!J1bJ3jyQgf=Y^`3-v=*u>_QL~lLCbM&gP_aW}u zr@p1U3ceCI|Ju7h_ux4#w&7S7$DGxxn@&t=WYnJ$&Gaj4(dDbFXD3VC{WJB=pU#xe zD)TamtKyIP1V7$oxMA{98|$^+W&ghwd+beY_?+IT`l!t>#xq-Wk>UN%iVL;w#7OaP zl==U1M&0f!Z0vki2Y#!T+HTKX*XYL@=;|fexVK4sf`;6eo15QWwY-7xK-j`TP`dq;P&XlpN2mQ^8Ilt&MWjzuQg3NlFc4o?{#xtTEU0yC2^Ox z|Gcp>C3pQT`?<-LM|awJzbZ|dA@epEcXVw=UIQ^7A%>NiCF=+FtznY>Q#*Tq{) z&C`xQEa3Ap8 zU#wCcAtZHmKHDpy^nc6q!i|;(Cp_Y0)bx&5(b=V8vrFZSkA$$B^gZ#<%95|2X)m^3 zyfeOD?}5dJvMu$c-A+*x6I(+HSe!3?dT@H)9%r}qYWwK&*Lw9^&xPhy?kvu2nR9Jk z#*?!g7oDTjf8RR%<@5>d*J7ND_LzK|?;TLkbV#8k<=3x<^9rl{md)e*{pIL$^IqOd zN}`EB|B9d4n-zXwiCoRc_&xH65P||0la(PtO{+ z4r!4m3oTDb-)oq`d8z&F?|6QJq}A50TVGVQ7(TaLE%w0uK*ySGa}^g}sn+LM7iRFy zT}5lw#QhtDomi%5s&s|ESgX$4a%5WJBGub&mG|CEn9EwRMMXz|HCTPRhRyB`bG_w% z&z*7U=j{Bqo10?fjn@5Go98jz_wK>YngvmU;peIzFTNozQWgDk?W8SASC!kQ`=@zAIcjl(057LH?~A``gA3URQL) z4$2=8dRqK=@w4WT+2MNY7H5f@X(hRKeCN zy&$t%GT>&6jqqwUo!Cd08ieL8m6klzr~UkU=D!5n1+$uS`oF0vnd~++Icf6GW+Shh zzcGVx=9>DYv#dRD)CwI=^JCm<<+;3RidQ6~3;kul1hW z*8AJsZm-O9<6EaT&HT}puO>%Ddv$pF0k7~Dz)>>_nYVX zI=++zxfTC)-WUDwYG-nvy_!Jg4h{1!%e4}Y8C~HtYKZRDX9#|46(xE@b&-*5WB$c3 zeUnqt4m}%IpE;>`Xdo^v&?(~RlAT2r5tE2|gX{hk%mu;uT?5Wo5C`jcZzZ4HVOLKrl59$pfCsT+%+tv6t-F`m1SU{n@YT_abXUAn$*40h#J>@*P zCd-`o@=~-!kL4+^Qb@h|&9LjKYI$H?FE!?Bw2^bG$~I&FD!;V`iczQ?-Eg zrq3!Tk4-IMF}|9!bIRGw zuK&|?y}i&I&Z^quL6SAq_tT6k?^(~9_cHm1<%N4mGfXQS+Uz4c!%XwneBAQzrQvq2 zPw&f}xgN|9ls#i}Vu4)g>=kpwpZI6zO#U;u_Tg^M6Db=D9CiHe&8uL|STd)_Icn8@ zS#_He8tMV!mv$>Txo$sr$avP)+XXCMTE*x6<6A;%KlL;fu=@zx*xYk|on2Y;V81}> zjU_A3x8=P*-)uuokESXew_2V@;2_NMd>GJrIUt_yOLAdx@|37 zuP$=mC!oK4W|`zU)1}-peQ(So9?TbZj{2mZu|+e|Ua;XVbHL%=NmZRzZ@=4f8p>_# z`J!GFa&B|g4E6oyUpGH(csna7`;cNzrqKU|H6N!2V*VBH9vvv`|F!Wy-=UC9Q;VcsM|%XHe!Zpoqd78Q?ftmFS`&X~9@Am@ zEw*@$LJRY~1sao?{=EKRzI?XwhPHEyJ}b}4I6dvQ>=bq3Kfg{a|M=yPaXQm#{l{n1 z?zC=u5cJEi&nQRC{n*B(jKbeS9)4QSVBL2(D#&^l*ZTG+zL)xP??}Eiu*&A!wdnaj z&7ghjCD!ka*Wg?9J4<0=UelIUN4F~XBs})1{ktMDUulivrs#M*+j_g|c9DZK=PaL5 zeR^)v{{Mod|96&EeC~E>N0$FeWNBJ7H3PA8o53nuOqvQC}T ztG8S&Zp-s$;-3YXbQ7!3Z~x5}kyw79ZP~Y(SB}OWTzmA;D!sn9gz_tRUS7Y{?vVANfe&aeb!yw zmUYAaLI#0-dln17<_(wl$A7RauwA<$&sA!J?fb5tyQ&!+$F6#wE#mo^nl?*aQqT0n zgG)TGnak>a@v7M+GR#`{V~XuWUqiuMms@duY4#Tb z-+gMUZE^;u!<)e7vm$ZjE4c3ek?-3+_fm>IpYfd6>q7Wee$Dr-j%TcX@BIClOULe$ zhcD|rTfE9ufpx=zHRu1eyI$0dpLbM`>E&hlh4&wnf7#;s|5*d){D=E?H;e3H|MMWR zk>7f~pSJ^F>7ld z^yW)b(dEes>FiCDF1yv&3RNrkecGDC+VuML+J`)5#s0D0&z=crtu8ct8?3zjW7jRa zZxho$)PGI#5XyKMlXoR!L%xA;+mZYo9~UbzE^cGt4EgG6er5jVOw(nnG%u+{{Qi8$ zFUn4~|H?5jJJC?Hu-4oMc}i=0ggbm*xjmcJJf$#QWG}O#L=o%pV+Uq`GCO^5>D0AO zvzt7E`?d6i^Owh}rT3oQH(kD{vG-rSoUzYjW@Wj6L-%%`a(Qv6nBiY)pcwD0&*IE` z@7`5Q-T6N*q%^LB-KRon!Ukc^ zu19~D1uo*-yy}#q3a8D*9T^H!f*(}Od-~xab9dJFELwt$TQn}y<8Qm zQtq3{l~3>gl2Gnn`B9DEUB+ScxdZ#fyesYUr9O3Eun-nLl2AIquxsz0fCHJ1wwD*y z#9ZTKx%hRahmy#boloDfPY@DaD!IP5aLQ_yQzxtzJrv3=$ln`SbzqCfU89u?LRajV zqdt4y&)>5jP3Ji9=(FF4bnWU-chnwi2>6%e*5l3$6g2+&O#K&ou(Cqw?C1P7+r>%X)ujW^a2-gsTgy+j_aHT3&Y!zPhzz zV-?$k_1*mW(%~!W3 z@4xxMl6U4)=y&J4mDVYYx(=I5tv2m+{~SMI$$}TZY%-pdHg`M@%zSj%>fL*rH<`)P zm-p~VTrqf*&wk+e(ONt0wNck|p4}@wZlA!t!F0pd#B-LiKjvKtj*T?mXd}yJWS{1g z@8g=z5-@RNc|(jYyP9csXqhW(XKOa|y2~0|*E+kZm6jHU8`|VZT^qG4M+Jz z+V1>a`Rqf|V~_PsuU{qad-e3ZnQ;GVh0_`rkDN(=tXj#yewSUOXQ8QaOQ@@ror|u8 zq|yhr_jSED{+dlL$Y_t#FFr2axc$C%VYs<^*rZ~Iedpeuy1nT10w2{j1Hn|D4U>*X zPM`53XpfWMO}(4B`H}5_+W_F3noV zY*4d9`e5AlpEfI3=I*}DdS1=wM$YWOJkiK?2RHp!VGudR%pv~RMMXNAr{q@pgpT=J zsum`nVLR@gwtJ(@Z=dLQZ#({V?p&g}e}doA0Nzgu-@mb0Pkr6v$Mx#G*ZMqz)q5x1 zw#-jE6T0TFO2I7S(mj)MqBi^Oe}C+0`?Opzz56{;T|3)-*(BXJCug0wWwKntOmEV{o!f5gI}yVkHm`0|u)`+b{fARR|83)6 z(Us<`R=a5GHp4$9JR4m$Pd;JO_h$O0@cn_w)}mqO^*Vm1_uO>xy?94+>g0~|8}Iw+H+KmBG5hf@^JYz!)zsh^ zuUxk+FTJHc?$_E@BvD{i>LnT>YcF`S_|m(&sl_oX)FjhYeigj=?)={K*1eE@>YklE z3pn``UPWqjCj82p=~4V(X?xG|@cAeF+8;1V5~sXB66EV}|IFqi zZ|0tUVl*w@;rqw$CGVOVl7cEOPyPDL(`&0u+igQ0fdmNy0o~_^cTSzKYwBsm=-oHj zZ`HY0T)eySi*#Jk<7Il!=WBR%9kYwuyy55SU)$bUM?R{k{1EA^t$Lzm!`welPlY{G z-4veQ5X;*0VtQQ-CtFWoECKaxWJxx>z^8O zwpo*+4@}DFMULoMeujsA1F}W!B&30eWpsmqN zQJcB;SU*$cHvBC8{SNaMVfCMVRt&<)(=}f4W==FPowHlv`ty0dOL)w_AK1T-_eF4Q z{<5yscR3e7mswLF6Tx9(bbj*Thxc6+L@Nc7Q`x9(|21~T9@H9r8?*D92YA-L;WY2$&82Ut0n7d zU;Sg#{+1HgH{bp8g#wW|6KA$MORs&p>4-;qSL$=mK!I|(9x*e$>1$5xwg^6-rxgC( z`+MZIhr%yRit1gJOTH%ESGacNsndCtvLn;`53Rk&@VMl~Y}LxOxo#atPh?-5CmQjo za$-AoL*VDMvTXC}io-AFtcd#}k+}AW$}{EltG0ePkyc-Mr|s_AldJAO_g!zl{g?G$ zC02#Kw;ujcyL|5YwR=ZTe>m--+t>GC+4|p}|2D5_SmvO7%BhEAvGjFe=1)IXoVl6q zw_R=KrMm%>uoW#(wkJ80)^s3pVuKlOLLZKYjj zDDqT)^@(s7bCFFJH)7v%OOyh8ofAxx#nsz*H(%8iYi{p& z8t|o|+bDcj?V7AWUbabU*H@Vwyy{%z&41Okr@(6KWZ$Gm{U3B@vG6g^-c^}>f01nO zl828fWEdp0WmP2v%KY|gT(-M5`Igg~dlNRil&g-g(BE)-@{CGu^KHL+Z&r9XRIPOh zOl01r^~>EYRMTUg{Tr5fbGLoT;yJ$J<&ImE=U4t{h`SrL=|qEmOI<|bg0lzBV^a8hHpH@9$<$^1z<;wptdD|gR7l%hLz-T{+HKL0I` z;%we_g#1=>PLyTaxKU2#cC2;$PQ$grH@<$fU#PZU|6x?y*6h@$eEW4@CAF|KxEs5s ze`sAiVUGpZU6cQBb9gr|IQ+YJ+Oj*>=DL1q=&V@i@LccvE}8vR2N%6uzfbaPyKTm@ zb3fCzO*)}<#)sFa;&9COu&6h)_FMl9@5@oJNH{6I^or#)<4a0wLnjx$64gKbAa#%X z!pn2?ULB6gI2w8<6A=&=y%2`vlkwDX>x9Aa@oXo&(4L}`*fpMM}D-v z9iC}7Cvej?pQFa!ma#K`Z<&!|*rKU#@cK5>akuz;Mr=Cbtg#cE`PYSf;C{R=_fPQb zn^yb&o-9vbtxUXQQ=Fvr#;n-;OKLWoKTD2#ZvBP}Iu{@E9rf>woLuBPV7jL*SK4%Ql4$jLFEYr64FA zviV!Lt+kQ}TB>0!R>b(d;dtgjOV4SGH$87Z8T2O8{N`uZ@4X(+{?%$_^%&3kCK7sY zzo%M;?(`P5v<|1vo0n6IL>-(19x?=E-P%`3E!KQe ze_-RH2SQR!ez_<5l&+soHsF~0Y_oK+w(+&a@%4}9x~uQLC!YSEb=fj~Tkpgv7t3eK zE-Dnc(KYqn84lZ@V%(jFH`p@o{AW}Awoq8ib@zSMxm!=4jEcMbwTWqww{5`MrGKKh zxwt;6%;=r=W!?{^yNczx6E`Mod%Dom*ic}hboIZt7w-tgs>j-2j6E?m+ovbA_+EbN z+Ld*W@At2ayRmk^jlS3A3Cw1p8Gg(5Wj}kiu2Z6|Wt#J>+lQ+i0@oS&1n-DC{6$o} zr25eoKIaLIX}{aTqj};M%w;_No7X}znduL%U-szU4MFn zRc}Spx!o(T`mvb*+J{bVZd!cP zo~=&HE>Oijx%yy%+_pt-0XfIZrL6f9xu%`YzTh3JU;e-BO*)tP^Bb$5xGZY!v=uKt zqx|jBmTSkwA8sg_d}>24*SVW}_x6{6IG27o*%U3d+2|`#AuF7WPbnG#oxYL6^ZXXYvX)kt8y}q?^+8N)eEw(S;tz4X(J9CBYnhR%-FG~By zX{@)1b#d;c6@rQ{MCTVju1U4eEi!zQ^yv46UW=Q7`xn@6o}|3^^|VxjrZw+2PDrht zXa7s|rR4sY`q@GUq!T(7zdb#<{X=cV2~ibufipHmWzw7XK1gD{aI8#B$!oDx%L!i?l?4!-=-$v+jGmDfauN70Q^cER`~Qt-xLR-Fu%Z zS1-7?&HK;%r)%ODJ=-M|bKGCPnZ1p^ey*RZuIx_lccKC6e_>@RhorNxE(%H4w^w0a=&Q+`a6)-z*$<@8Ayqf&I0J z)b9JqS}#{w7P(Jzx#?E1si)%j1KaG{^8uA_j(WtIiodP7x8k_-b{^)pTTN0<5j&?n4v_kDv2o@r-&bJ=_ct$d6W*m< zqbU-RXJqrl0GKFD`9NU$gtn*?C&^U5eLsN^1Mkb5i?Dr%S&#$dXWpc;uUUZAT zbja@L-SoQc-je5TEc3qQzFPR^UGC~x#?Ga;<@K%p@v`QmT`Xx%Zap64xxA}CehaVH z;meGZ*=x!tCf5YV#WF6OlJw*56kY4J%LQFHXURJWblmTF6Y{1e$b9x#RX*PD24jJWSu%EI^eQ2Lx} zj%m}+XJ6dQ_VLBdi0Pke!wp)iZR|bO-8Q{4QF`rqc(UZ{to#I%?F*Xfb~78s_ZRZS zhMi*8iBxcy7`)B($z1z~-*xJl*Z%KgZBlG!oxt8SJ+MH3eR}%Ko@gf5M~+`U{A!e+ zeJZr=jzgNJ#ZhNoi%qweTUt)qotweA*XxD_(*wDh-2n|zm8>Q)pJn1!orn~#?(TX$ z^Ww(svl?ev1wX4+NRT=4;(+hv2f;-ROk6d<=_u z^kB1o;^DOmjUME0*m?Y)%9D#9C(dK~XY0nZtRwtH&udlFuER8my!y8;pPTtdQh3@)T?t;sNxHY*&!4?;an}piLmL)9_Wx2ScS>(#);#5# zQ5D`Fqgi*dDcCzy7I$TvsRKWeJC4E0>=3>@8o>HiMz=kHlG5b|HL+51mX&<*-mk|2cTgUtHoU_7f)ZY3BzHxfg?!F@E_z5)wzNM8M_UkK|=KuIF-1D+GZXaXL z@7}i$9PLi%MrxWC$i5HO3@ANY;_98T*K>1#Wu&ELw}Zw-xqu&2Uofsn6Nz1>XgYJ| zr5lYN|91Pm{u!GiQI~x}Cy~ioz-jO9ISrHFZSNDgp8Lh|YT+Yat@u5&o*eq;pXWR~ z)L{DQqXBRBS|7P~a*aWpRXfd2&kO=?R`_?ipq)i>rbWs zk#e%HUa@9_l$1h&`tEzb*q%Sz|2Avw3V~HM*BIA$haC&d%VyuX`TM1FGuO&7x{8a5 z@9KF|&ayGh@oFIZ#>}tE(mAc})AujX-oL_H_is$dwLMK`(y7(qlfvd+eBnLEWNq-< zi<(UxVm^;5dbt=xr{>Ih!`s-QVcydJzMZeVN%8Q`a|iU#?@q2STj6+W@#K`MO<%X< zxG>yZbMo#By(d;XW^DPp=WM)IiVw>|HOs}hv(E;8XpH*RddOMS?!4rpxSK=Eo;!l9 z>7O?!Ejf^1ab$6$((H=4sz1=zQJ#1EgaH#&?#H8}`cFFlWL>1 z|EV|q?G%BExqBXbSa>Iz?R*k&;~QZDGImO}R(l60IPWxnauwmuh*Ix^H%x!Me-<+MY5fkc%X_2kD%$AeI@eCdsxfh+ z&C~ggs_ovkjaL6BHGbqi8LK}rE$8-^#glM+4TDR z%nHM1dNgYYUw;Y!2bvtrsc|H~#ZH{&v;A&=-$<@BEl#@jCV6_M5ld zS|*?SJ<j`&W0z#JPcYjEdFLy@Oyo>ug8FR8jRJ?*gBg5L}tf6*!8 z&HK3S{#z%-ubMZCYMbPXekRTOo86tDX*n}x*8CUIOE%hlim>nTkY?4G$XovL%k0w= zXUcinPFa{HopOdLQ|WEd;*ynt!N0r%+GR9H8)h9B`I7H5sU-#)sdLun z8n`Su!WDnypiFLCPFU1e@d-BXo-UB+ethCy_(aoKKi0j{Cml8ze)l_U>-*&O${>YJ zCw7Wo>=0dgD=^E^E?fB%uWb6J>u;~R-iUUQm(GZoD`8Vw^X#kA8P}JOQkj?Je7MKm zCZKm_)#vY?efL=nlU9C9S!7@O^Gx?^$1l@VICS^D{;e;y`By$~<@+Tf3R=8L>Ws_u zlz-jZed7B{_m_-^I~iR*)Z2J9nNFO+JO7oqSO1TzJNXM0N_T%qt~gV}biQE5`>EGD zr`(Oca;DGmLFs(a)Z1Iu%$j|1&w?G%9oN3E<9d6{E|;th)0rlLQyCL# zS~BWhnlDW`nW-;RBw;16*`8PIHD5=cL)?uUGZTNbd_YJD1!cE6e}siQI)1_5Za?OK*G1SJ`oWDYHMEwMx-^XUYpR z*^^7o#eL&EvZmqN-UkuQudgniVq~~{@(j*CO>3un9?zBcBtQPeJK?9A;Fcqj>qN>d z5p^kJqF&&wUw#rEO(0lNjdT5XkeqRvgWnSvtoMZpHC^f?^K;`pp@*q z*>`*Y3yuYIFMeB@A-&*W>&K2VgAe_&0vC2qVm2(_9NfR?YfAQ~0ON;E%gw~{5(`$I zf50GS)Rg+Lz_Z!IRd$i?Zi5Mv4|+rgyq@o8b2r6oR^pCns}lC{%(@hQ?a`EH7q)zz zvvr-SPtF`MoAusWmREe2bL#%!{q(2d;99$DlIJJ6AFaGqBD|wc?(myQ=Xh0Syf#0? z5}{MAb;!c!#roBLQRgJ&f1fO_bUVMHR^HA((S2L`#M8O~Kbua6M?ddc#?tYRtJ!De zo}(PqVk~F29GQMGGjnq8#G=1KJmRMV|Ck?rvhdl@(oDu5jIGYwQl`ybuvYfdrXA0+ zkE>R9=;&nf4;#K_qn&)2oRPA2J4US`3qjgB*OWHMhA{brkyvFJqOjK7x_c^mpd1U1%E zhR>HN2F>7ma=iTb_A}=XKi?l*(QcEr{hUq4*3*k@uAZH>ys~n6zIxF8YwK=gIw#-M z{$cT9zkI((78`pm%Y)GO#{J7)CY9dad})Jh*hSTNZ!zO*8M5Chrigfbi3@UiInyG* z{c?!rY{w_vW!$kR1kYU-5xM&%=iZ9qe>=QmZ`XekkvY74-@c-s(F$^%Q}gBr&r5eX z`5}gHe(sk%@h4o*l$xF!S9*9j^c=0@|ISUGt|4%UAtvaE@GCO$XtkvZw_g5{_sJ^|Y^tm}JpI!fLb%|faER`+{ zW!vXnuXDAtd9lt+rmZ!S<*N}3y|D-!p)X~MP7)@FhvDcs@n#I3w^=6x0N3&SWW_NYX&zQ2$s@RR)GUrbB@=1-oFTOR{|5d(y z#(3MNl2f8*eq4BI$-dHc%}VZ>O+Syn@SoXz_`SyYk)VJv`6&aps04FSutvzZG|B z(G$^CSw&i`4-c>=uuRMeNV=-i5~9Vbl9+L0-`1VNAu=t~vM(2}Zstgjh>SCubva;R z<>b23Eju>VzCFF~-KkAS{hogg^8Io&{?V&*w>?}G&oAt2x!WHzJz>S#?{gdaM7bTe zo>;N*y}{d9j(KeJeZ3uOCawL|h1rnkSc4%qds1FaPQCSLTVL+{=J_Qx|ott*Ui#{`EoG%IM4=QH~e)o*yvj zZZeoWX~9y4=yRdZ{%m2W+Nu8~&G?hE6R+FWKgt{zJGym)=eZh2ymzkY;uN3mG%t#A(bk78Ap0zUbhVkLkvH9UwbFNRgt{M~Ef4yt2n^LdT zp$AgxcLQb$T+jW(IEQUb!P<#4)NTeAigNAtz5i(4EYE8?GKnv$yGnxsy8oS=dg-{* z<&5mf|5c`4nHb4#^RO+Io#D^cbDHmtu`HJ0In)VmkAA7b}q{S1 zhqm=XYbv*O#Ri`He_M0me)$vA*#941a;bKG}s|UIzR)Zf-X|#Mwmdapzvt9n?VjBXhWTH1 za-KN*UoIwN`lh(gRp~P_t|l?giu^2c$#l<`kGi=HvtOPwk88@a_xf;KcVlXh*!`Ma zpP5d%>kEeM=9+i8D4?3#FQazUW8J2Yd`0Ypv_9NDsHM4ee2_VGj001 z>jkeanQMP!s#Mhq->sIUSTQw!I1>^F{wO{XPo=Zws_5n_Z#b{ z&oNzWU;0AKWWUzx)~MW6nfAF%e>UEZopHMBds*jUU#HnlaVkF*@_cqPoiqIJ#IPXf z*K4^1sSLyX7$x_c4!a*RtvbGatL?p8z8$j-CSTntT^@9?bC!DPfv4Vc6q>i`h;Dx4 zP|>(5QGBaR+^16?SyrETpnCIcZ}yET7xkQzEQ+5UE}y*XiW-B;EWtxp_FonJz1*KQ zH)}ghUU9y8`MIYr9^Fvh@=?90>9sM#8qwdpFXqS9Zww8e%){?itFa>E z0B01deCYQlC%gQ(RPAi{-e9tRyz@}f&7Q!epI7Oo-sjq2buf9t!`DJO(--v|E8dW7 zIA^YA_Vbg+E!}T@<23Z+KPa;73CrevAE(s#CNv01%# zPq}t}QqjEMUf1`2-F7k9`=R?3ef>~5haJ+A>-pES0eTnques|0j3kDhDbI=()gzv$hAnbGxzRjc~DRk;M6_HH(BVC{~XbNNf* zzpXvO|Krk1E*>zc*`%tmNyNuF@f@%9{hgZ4j*K7oADJ<8LL_VMVkUtmyQR%FbtadN z|9o)cWY~7rh?~E1x9`8damVAk6V_Mof4E(6>a~cu>Ritnw%^4czoyAuu6g?OjQ6S8 z>_O9|A4?V#h6(n|m2RA{Yhhg4>JJ-BxrLr?F}kc<`{ZN&%d3lna=$r$ZBv$e;d%CD z*573P1p*Ph9e+!*zCZEex}GuB;&I}pGlve}>Dv_bugvz;l)b+FYp-|-Rr#8Hm9w_y z^hy^iS@+$8fBpGQzvn4TJ9g2AulL!%%TKrVg`Qyex6@D~dPU#Ag8i5GJ?9ts^qSFq zRpL|6_nuxGALcFJy42>KakHJ0&)S?PMMGJ1UDo=E_ zY2YgUcKM0ipI)XJ{BnC2`x=%xnKZA{v%5c8>3~YaVQ2e}$~CFI7xrndp2#`>rAxH7 zgz||*_uUuVx!*QQMv7fKc)0IEgWlR>_b=8Sc3wE&N;B90!^Q(myzD<+`&;B^iifxu zpSe73i3o4`VnNN#2Nplh3rjrI-#8=P)?dtOUmV}xe=Fa9e(_?1VDX<$2HOMg>@N5C ze7^GWoV4W$al1K-uAAqsiq?8~Sth^Ft#ga_g(%lMAAeN{ge*U>`d8Hn{&QlXx0f#L ztef$v<+HNAS^xefUKO^9TQ=WTR6US#`o(*5kqd{u&De0~WBp#K2;W0oVb+s;O%jvN ze(Pv?nNodYzRphfr&~qi*woeDExoL%a>8q?^7KNtPd-UD50iyj=U;f0wSH^GW{bKI z-8q#J&r}cJkem8RcUk^F{^Hi)#VM%;U1kBUvo4-HuvhfO&jp81J*wzC9A)uwSKW-+ zw>b8G_-g)JFR^L?J7fHW12gy%BG=jnS0wlsf0$iSdgW~KF{6ADtGiZ-4|koeykFk+ zHQ3MY;!Vkrbru0vWRJ-w7}(61$Q#|d)LdxIyw{PdpTGYq^KNeRw9IDp-pdK&g%bbjo-_*I*3h=shXw`kg5G_uAp}Qo?Bbd;h=7 zb7x<(_6R;D#Fld9dY@fG+4V&YzHJ#dDy+P>H_wd_d0!%DS9II4lj+nOPA6_hdp(1^ z=Swdg%F28_OVsCd*}qvWc4{kmG_5v?=`XD*WM}`hAjnAi>qMj9r7p+Q(_8a5HeSB4 zFmL*#`B4*BggPu2h)T$Hi0gdt`|GtIr*AD#+RyReai7VfBa>G~DVy>y$UmdjzBbVA z*q&HZ*$WJ_uU4n%Y&$RQq{1r{Dtd9=txLNe&5_Pr#<=Wkh?9u#hUYh*xGVAO?9s_F z*v+=9U)FP->v!M!u=VBvUz;Rrr+r@_o1R>L=(69YhgKW1P0pP7c;m~8loM}dPE8Zm z3-(cz{AU%W&3E?MW3|TO32o=)Z?kO>W}9MGf2YQE36I%am$Px63)mPn+v-nLWc6ga zYj2b8{jJcqDmeY!)}V+lt?womNd1*+v*efBaFwz1NWs?!K?g#TN|?hV^5^e$DOT}X zR4G}VsJpVcD(j`u$39)o|2KCzx;^$^CVTPL-0(|6VeEf=W7|zTY@hW_UH6L5?(veo zYaD(Pj@Yi6eDe7z{o=sCGiuV7xYoDYq@`VR;JD!0v-W||?OP{>lkNO0Y_@7XX7BTs zVl|2CxVSx^lhOOC_vDrT-JB&ebW4TTg-g%=peAN=%jxnxk>@RPy(caeSgWyLY0x}l z&3og&#+zB^E7vfxTt9q7S#V9FV8)Tzxo@`hIPEFPQ+8dzUM&+6{cQKvIxD`IZ8MH~ zZoR~&#oIo|XodvqvE^+|o6a?`UY0dH_QBTtUq$BSo5^hI_4+0v3l;?L+p(5)=CVCI zqxN1^xV71|@*r!ew`pn1e8Ei53wJpK7m3D%Us9ZQ+)DTVFaGKX+mMd1ollh#rY8Kh zb%Sw=1Wf}Jt-d*`wi?dl39PB^$ z$@6d9ytO?`Ry=yu)8T%z?&Rv(PM*ShVsHN37P8~Rd#26^i<>jslD`OaSTLx9vl>zy)}md9*<7yck_PtDp><*PqxE!;G}E_lPOsp@)u?3Z61Z;WDBXz;zE zw=3kh#@GDS!LP5@7$3Nj5xRYK%K499Pll)nN1yq=pOs1Wmi^vprxc#k*SzvlA8t(2 z-xhGFv*@gEbc%5CuArGm&fgQ7|IT|+pXFJNdyMw)^iJQho^4^m_56kdPv2a=P?keK zSvAW3uj=@)Wt;cXq<7x-+ME+^Xl>YfCsuL8&702*9{gyh8JAY@UUa;sSS4YxD`l11 zv?cs@i>xo6var6lPitz0;9pa{Rj8lUqyQR(#7?eKJk;zp469O}CnTpVLbn53m$JH2EBUaU!?wC1wI@*cw}Woz#g@h6@(+pP1K zb;WPLYWYnMDmb#7S3h+ZV3r7}{l25Fv#Pw6#qGnHFXlJBGWH3k*8Gc^@a%XX{N=w1aqGd+ZI;_ZMn6VAcuvdUX4PU21Mps@?w|74pR;9+=`K-gd&~qDUlP z=$VV*?>4MWe7j5V!ynnQ^Frk;7xtt&pHNoay7OVg?Jr>-f=gSqcYS8Ix)pS)J6*)E zvSX%CN%%aQ$Z5CMCD*KE6;#tbw?^&IV;Qz9wydnr<}NYt+_-9^(S#!o*#VMryWiLu z9rod5-8(tvIlI;0EsLkSdFJj9kG_@JFvo>!u6X$wd&w-fePR#&PI6hEe#mr2%3-na zI`x%VeT}zgHtD!I=TH5Vt$CTH>jT@x-{b)MSX|K|u-%5DDSEQ=M2PM=IBHvIlz zy7jGIw8L?w-nNw|3$Dr4{#n&1`8`X6d3{WD#S>>0W-gsso~`VYp13bRC=_up_sMmi zlSLbj*LaqHWzXeq=;v@dndN2hdre|L=l(FMbt`KMx9+UF|1W37g{$Rv-yg}zx2!ts z8DDXy?&ds+B+c-5zNa!?$WEVgPJ``&+tPN%!c6YH=T=!anOohH8dC!@|^*QnP9 z>&~hasJ?J!-{Rl>R$J*OLBB}H`&T9W|2Gb=VR!yh8Yqz zeRuabZ4*z}x<+0m_-SL`%avaBrX7tFiv$&S=aub@Ds`G9b&h#*fKAQJuD!C(W%D2Q zclJc=I(Fnu!>+KBDW6ie%BTKZ%IL*<@waxS%1K{ljz9N&-#vV@`=C*rQ^3Xv&yv2L zTmSf18+Y~QH@6udMNCfkec*tK;55IV2j1s%yx|Ppk(!jg56vxkJ3<|4W{J{z1BHNw5Ehhbw=rF9@jK@I3JI?#|7c zTH!YoTonRip4p2@;G2J;iulhkW7)+J>cl-}MWtbX@E#Z>>- zp5+sk>7*=w6uJG8qnGF0-{FR{(k~f&tLXpBC%MMl`{(N3syWF^HszUyS3X&_%Zw#J zYyFn+y4MO)yCs&*mz$7sjG1GbOWXaISH4F6ejRDXF~R=H<)F!Dr+xNP%~=r`Qk=3W zHclh;->LW$;;T2UEV%G5IqTf+X0>1c*NQhd=({bPnk4-CxWs|g>l~K+HLCo1i6@r3 zNc@WQv09yqz|>6wvIjp+UhL9wCa--@hRyl(cS(E_2@`UDx9rM4vTr-@K6YinXU89G z*{Zqxy5XF=hCXlR-+s*D{v%26*`;sG@2(7az5VWU#r>R}Urs2tm>i0V_V6k>EUY*G zMq;#%*VL=8(v-PNv=ZM6=$d+Y`j71=mgh%g zB%O`b9M4*2-s^p68NoZPy~pB$5Yvn%-+yN6U%XAF*OV>!t2O<@yiWo?JJRz0Zocc3 z;q11*hUe7x>d8NwbD0#?)}OkYo@e(&=g+e2FH7r@-gEK)v%7A2RwXXKj%Kn+%*?ac-La1M!%qumOEqP6o~LZn zzAt!}_Hd4%MqFUphXmQmw~^kHnycjPKPCBIUblA2F8A$mfAbGNy7o1ZVG`e(|8M`D zoL#Q+<$?l}=#eG0Yr4vgiZaNEMf88WtQEM=@6dFURux(A{Xh8YR3}V+mLyc_^>w}e z*Hb?p?Up-eMX10y{g~t+Ir3^YM1;pi*V+3E$=!n>pgm`T0H0A z({R66^LD;l6Y_;?v#-cTzkROfuJ88m+SVqjogB`+&-?b|^>IseE}mmNbWMK0mggbU z*X8T$@3?)fnlmY-FfO`o-HE{X3%jO#a(d3YvM1#6>?f% zc^~y&zdbF)%V@&7M%ELb7x=HNNPZV`hvmF5GuMuly#Krm3{}Ez*Z%ZpYu^(d_q5b{ zY2Fc*6rqC12|ea}0!=fFH|u>o+Msblv4$(zfF*Hpq1^8-%r}jn z_2RYhI}i4`$K3WG{9nF2BJ9Pi0u{4uvIz!S`-^Wps=dO-c|~0(MS=JJf|ktf%bxp+ z7k3&v^Xw?K|KfQn#ZD+tBCjykoi$Ey+ksnlvl;Ge;1u_~T)sS(e_z3lsD5$7Pp^&d zheXbdWUC!qn?(b>;z43E=2EV(9x~ts`y&t;ed@OI6jSJd&u`zpXLVfDvGrEHs|3p)nHL^q zB}_NGoZoC&&{yZiE3-6WW$e?X-W-d?pB1U6af6#+3J;_6?LB#ZxAvGEd%#nrB!9hR1uy@ZMadGLBKw16tq$(< zJ?x>gzU;TXs;5X#eFoFExqnx5?LPTvmBj6B@48Q2^^)0^zq(CKEs8Vx0&9S-zUW5} zVV0vmRBdOy{{P|o%9=`vrRgRzhx?flzAMX%tWk{TJ@ewJRH1@|mHh6F%Z{?ElnWXC zu+Pst@!mv#k3;VTovaI7pN|xuGT-&VNRGAa)bXSX{+hK(aiWiNCNbYywcAxL#&h3( zyNR1PUVc-rs$wouzpb#YQ`qh9{sW?{Y2rN5p1)Y~CU$z9Fy^T0)>Yzno7J~RE7RhW zS=s#st9Nz<9SGScsO8F&x8-+nf{_mEN0w06c?}J^tG3lT@3XrV^kT(ja|1=Q-pq)b zOpnz5C4SL*SN#2pmUi@}O{($pwRSqc;#im*&%+h>bz7hci}9b<`<)X`I5Pg+Bf_#R zSHI6WrsM2{Z!AC0dkY_OJA2DHC)+#i0?WED%x?KJoSRqg3z^n0_V4P{g%y7%vE8{m zF=6&TmH*ZAf6tq^xaY5d^@Y2iCoh=et2kfGI^}|;s(tWQ_Dj3tBRitLMjf#|w$=5< zf!Dh}>}@&tv7%t<-8#X8*9=-55?Afv>pk0OI^$d!o1~4;+C^7WKZVS7);F6|bYb0w zjBwT1?qzO1whO0i=)ZC=Bf`x*N!U^Q!|&_)rZ?C037kk$zN4~qU+>CxQIS09toqoy z$Bgzpog4Gk>VQgN`Z{x-q8p2HFMkNovu!XFFs?s#V?|A#jbY5b5Z3iuU1oaumw$RQ zvp4zp+^5HWXO%2f-8|`jeg32AUIG_*Y`Hi5vtgVT(meTpw(@(|_9HJY`3vmz5qfqk zS;Y3(&zf&uPv0&S_$h0Vl^T}oy!6W3Gkd+a^q!4pUo*R5FH?6(qU(Z*l5FAk5;U1G^%ynusw|b@lV%=JzV^DHxq>7TpT9mz2Iqj7;{vCKRnel#UhkjeF|T8 zwq;~|x1pk6LnqIkU3xaA(yfd3^l>aW^rCfZLCXCjiE38jGd4b29UuIuj;C(tJ&762 z%+F4&InR70i|=H3bP^Gmt+>ypHt&EW-Ewt+ML_Pt7-`}SJ$ zO51Y_pEs!0u2~u4?Ju(b-PcAdL&Kei&s2x1%;oKBp1tp{x%WlZ-^HyW>kE0WPu?wl zlE>O<;*tvsmfySDSSJ2;y7+AQL)W+FJY-be^!?1*oqL=3I#y3$^)+qSvT6EHsi?>j zi3@&ldA0kzpNC%ketU+V&z<9W6MZM$R}{G6{H^AxoRF;9kyxG3x8KWLRrgOkbM20r zN=C%IvtMSJXs?idH(`%ww~dcx_?BPCX?) z?bY!fzn<^L+Rq+0g)ESZeqM6ocHhney&-F!M(qp^Jl>+x8)qct^WyLM&Y2|*DVruH zrd0CQ)uh~t37Is#_}bb#H{-UII>(+=i^_j6!K3q^e({k^20s2-8&1x;HN9B===AOG zhl8%qkzFgeSKl%&!KFsc=dY&!o{x&jlfxIpek-w^QMdH)Yi^E9^INzd9A9XpwBR=5 zmzti2+c&0p9jarOI~jjTi*Ik`+CVd&6R~?8*I7-UQSv+XhoaDoQbmE9`|90Q`mWoZ zg6}b2fQAs|Dt(T?#=|XZq?bpo3ZcQahv5CT{in!RTFLRmu^%E6SOY&f6%SBnmIOp8r6?b^KptD-~&(%M(YE|^O4L` zv5EE~2iAUguE?{iY4*F{vOAlreoU`OkiRznetXrlJxArj^jqD%g33GgE!t_V#uHd& zR(taBPt$rix4u;q^ox1^9kSgY5Fi&TRdQ4zdD|0VuPGZ-H}6tb(^Pu%xhZP0_Vrx( zqmTDHyquJ7xAAwdk@_X0=+Y(bHM2AVeZ+sKeAv~W(=E>fRsT~D@td|k6wvDXX_)j$6(i{G=~y+JVUm~pCOR*}c{)#l=BHoutuCH1e! z@@H3+4!fiW)+x^;p^edo^0Ld9EVSE3JYk+{g(+~l=k#+{}eZ##d=u2=uNCctE}yvlF>3F)_V zDrM&@&sm{<;=j~H{^#odFTBWF<@)#G?q9OJq3#DizF!l!`1{v+Z-R_@w%9h6OkHHC zP+{h?epAvk5wEY359aZ!OfJrP+;Y8f!;C1m!^(aO5BPpu$jI2s$J(7GtntR`)r3d$ zT9+y1*lszvb;G}Ohbt|$g6AqGzWbeWEyB2TIr9_?i-4Xv+;4U`>N#)c+ZpyQsmrHv zofFHvz&tH7$I zj=IY)EO9=2OKq(a%bT5ho#PU(?`xX7YR?gsxflPqeU#35*U%s0EqHUTspihf_x%}I zEf&TLY3%K^msMEq@J=uz$NkV!)AlPnd9w=7XSqGF5Z%x;U7}M|Bm7+Im7S-ngamXr zLKRoI<-YlLCnbj^KU3DTwH&i!<}F=h6d7O@D6(x62bgZFNk-le#6 z-L=w!?6N)Z_sz)aZn$<)Tkj@kgK(O#&7rQB-yOEt{Rqw$dloZ!i)fJG{Wa_pS!Abvod4U?#zLC= zs_mDAC2h7-17ki4J``W5S&+KI>YDv$R&Pn2`&-{@M}{unduCQ!)Rh;%{4`%3d-Wpm y`Tm60tO@5XEAFRuFo0iCStoq60uG1V$ua-72FaQ9}WugQC literal 0 HcmV?d00001 diff --git a/lid-guard/translations/en.json b/lid-guard/translations/en.json new file mode 100644 index 0000000..578d709 --- /dev/null +++ b/lid-guard/translations/en.json @@ -0,0 +1,28 @@ +{ + "title": "Lid Guard", + "tooltip": { + "active": "Lid Guard is on — closing the lid will not suspend the laptop", + "inactive": "Lid Guard is off — click to keep the laptop awake with the lid closed", + "changing": "Changing Lid Guard state…", + "unavailable": "Lid Guard requires systemd" + }, + "shortcut": { + "active": "Lid Guard On", + "inactive": "Lid Guard Off" + }, + "notification": { + "enabled": { + "title": "Lid Guard enabled", + "body": "Closing the laptop lid will no longer suspend it." + }, + "disabled": { + "title": "Lid Guard disabled", + "body": "The normal lid-close behavior has been restored." + } + }, + "error": { + "missing_dependencies": "systemctl, systemd-run, systemd-inhibit, and sleep are required.", + "command_failed": "The systemd command failed.", + "state_mismatch": "The requested state could not be confirmed." + } +} diff --git a/lid-guard/widget.luau b/lid-guard/widget.luau new file mode 100644 index 0000000..82dd2bb --- /dev/null +++ b/lid-guard/widget.luau @@ -0,0 +1,59 @@ +--!nonstrict + +local status = noctalia.state.get("lid_guard_status") or { + active = false, + busy = false, + available = true, +} +local requestId = 0 + +local function render() + if status.available == false then + barWidget.setGlyph("shield-x") + barWidget.setGlyphColor("error") + barWidget.setTooltip(noctalia.tr("tooltip.unavailable")) + elseif status.busy == true then + barWidget.setGlyph("loader-2") + barWidget.setGlyphColor("primary") + barWidget.setTooltip(noctalia.tr("tooltip.changing")) + elseif status.active == true then + barWidget.setGlyph("shield-lock") + barWidget.setGlyphColor("tertiary") + barWidget.setTooltip(noctalia.tr("tooltip.active")) + else + barWidget.setGlyph("shield-off") + barWidget.setGlyphColor("on_surface_variant") + barWidget.setTooltip(noctalia.tr("tooltip.inactive")) + end +end + +noctalia.state.watch("lid_guard_status", function(value) + if type(value) == "table" then + status = value + render() + end +end) + +render() + +function onClick() + if status.available == false then + noctalia.notifyError(noctalia.tr("title"), status.error or noctalia.tr("error.missing_dependencies")) + return + end + if status.busy == true then return end + + requestId += 1 + noctalia.state.set("lid_guard_command", { + action = "toggle", + requestId = `widget-{requestId}`, + }) +end + +function onRightClick() + requestId += 1 + noctalia.state.set("lid_guard_command", { + action = "refresh", + requestId = `widget-refresh-{requestId}`, + }) +end