From 1c071166e9dc1d7b70cc62f105e39f0a34bd40a2 Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Wed, 29 Apr 2026 12:03:35 +0530 Subject: [PATCH] feat: Add slot for customizing course outline sidebar unit icons Introduces `CourseOutlineSidebarUnitIconSlot` to enable customization, modification, or replacement of unit icons in the course outline sidebar. Refactors `UnitIcon` to support TypeScript and updates related components to integrate with the new slot. --- .../course-outline/components/SidebarUnit.jsx | 5 ++- .../{UnitIcon.test.jsx => UnitIcon.test.tsx} | 5 ++- .../components/{UnitIcon.jsx => UnitIcon.tsx} | 40 +++++++++++------ .../README.md | 42 ++++++++++++++++++ .../course-outline-unit-icon-replaced.png | Bin 0 -> 52616 bytes .../index.tsx | 28 ++++++++++++ 6 files changed, 102 insertions(+), 18 deletions(-) rename src/courseware/course/sidebar/sidebars/course-outline/components/{UnitIcon.test.jsx => UnitIcon.test.tsx} (79%) rename src/courseware/course/sidebar/sidebars/course-outline/components/{UnitIcon.jsx => UnitIcon.tsx} (56%) create mode 100644 src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md create mode 100644 src/plugin-slots/CourseOutlineSidebarUnitIconSlot/course-outline-unit-icon-replaced.png create mode 100644 src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx index b2f6bc7249..df91440ecc 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx @@ -1,9 +1,10 @@ +import { CourseOutlineSidebarUnitIconSlot } from '@src/plugin-slots/CourseOutlineSidebarUnitIconSlot'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { useIntl } from '@edx/frontend-platform/i18n'; import messages from '../messages'; -import UnitIcon, { UNIT_ICON_TYPES } from './UnitIcon'; +import { UNIT_ICON_TYPES } from './UnitIcon'; import UnitLinkWrapper from './UnitLinkWrapper'; const SidebarUnit = ({ @@ -38,7 +39,7 @@ const SidebarUnit = ({ }} >
- +
diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.tsx similarity index 79% rename from src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.tsx index e5f70d1286..4dd02b4447 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.tsx @@ -1,9 +1,10 @@ +import '@testing-library/jest-dom'; import { render } from '@testing-library/react'; -import UnitIcon, { UNIT_ICON_TYPES } from './UnitIcon'; +import UnitIcon, { UNIT_ICON_TYPES, UnitIconType } from './UnitIcon'; describe('', () => { - Object.keys(UNIT_ICON_TYPES).forEach((type) => { + Object.keys(UNIT_ICON_TYPES).forEach((type:UnitIconType) => { it(`renders default ${type} icon correctly`, () => { const { container } = render(); const icon = container.querySelector('svg'); diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.tsx similarity index 56% rename from src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.tsx index 47992f215a..78672b9a63 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Locked as LockedIcon, @@ -10,6 +9,7 @@ import { LmsVideocam as LmsVideocamIcon, LmsVideocamComplete as LmsVideocamCompleteIcon, } from '@openedx/paragon/icons'; +import React, { SVGProps } from 'react'; export const UNIT_ICON_TYPES = { video: 'video', @@ -17,10 +17,30 @@ export const UNIT_ICON_TYPES = { vertical: 'vertical', lock: 'lock', other: 'other', -}; +} as const; + +export type UnitIconType = typeof UNIT_ICON_TYPES[keyof typeof UNIT_ICON_TYPES]; + +export interface UnitIconProps extends SVGProps { + type: UnitIconType; + isCompleted: boolean; +} + +type IconType = React.ComponentType>; + +interface IconPair { + default: IconType; + complete: IconType; +} -const UnitIcon = ({ type, isCompleted, ...props }) => { - const iconMap = { +type IconMapVal = IconType | IconPair; + +function isIconPair(val: IconMapVal): val is IconPair { + return typeof val === 'object' && 'default' in val && 'complete' in val; +} + +const UnitIcon = ({ type, isCompleted, ...props }: UnitIconProps) => { + const iconMap: Record = { [UNIT_ICON_TYPES.video]: { default: LmsVideocamIcon, complete: LmsVideocamCompleteIcon, @@ -37,20 +57,12 @@ const UnitIcon = ({ type, isCompleted, ...props }) => { }, }; - let Icon = iconMap[type || UNIT_ICON_TYPES.other]; - - if (typeof Icon === 'object') { - Icon = iconMap[type || UNIT_ICON_TYPES.other]?.[isCompleted ? 'complete' : 'default']; - } + const iconEntry = iconMap[type || UNIT_ICON_TYPES.other]; + const Icon: IconType = isIconPair(iconEntry) ? iconEntry[isCompleted ? 'complete' : 'default'] : iconEntry; return ( ); }; -UnitIcon.propTypes = { - type: PropTypes.oneOf(Object.keys(UNIT_ICON_TYPES)).isRequired, - isCompleted: PropTypes.bool.isRequired, -}; - export default UnitIcon; diff --git a/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md new file mode 100644 index 0000000000..45ff57d67e --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md @@ -0,0 +1,42 @@ +# Course Outline Sidebar Unit Icon Slot + +### Slot ID: `org.openedx.frontend.learning.course_outline_sidebar_unit_icon.v1` + +### Props: +* `type`: The type of the unit. +* `isCompleted`: Whether the unit is completed. + +## Description + +This slot is used to replace/modify/hide the unit icon in the course outline sidebar. + +## Example + +### Replaced Unit Icon +![Replaced Unit Icon](./course-outline-unit-icon-replaced.png) + +The following `env.config.jsx` will replace the unit icon with a custom icon. + +```jsx +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + 'org.openedx.frontend.learning.course_outline_sidebar_unit_icon.v1': { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_unit_icon', + type: DIRECT_PLUGIN, + RenderWidget: ({isCompleted}) => (isCompleted ? '🗹' : '☐'), + }, + }, + ], + }, + }, +}; + +export default config; +``` diff --git a/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/course-outline-unit-icon-replaced.png b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/course-outline-unit-icon-replaced.png new file mode 100644 index 0000000000000000000000000000000000000000..afcf03aea2a966bbd4fa3909be3a400ba2b3672b GIT binary patch literal 52616 zcmb@t1yGz#(Pk;n>SllIO0)gNboB#a^jbq&mEh&-`B1oQLo;!jWM?)fBHqi$kM5Fl7*S3|;}g}b zUynTXAy%2h^`D57Y5rGH`w^Vc>WTZOM3dv2`t1DgY`7#>y`to+aQiN$~E z`1gQ0&>uYit-b>M>HROYw+Aw;^S{;qp5#B<|DJFc_y^4yFp}sm!V}%MZRh4ve`(Kx z{+VBxVL({@@9&fd`Qm%BzhE~)$ah$OdjFxK6#>>9|GO9h4;c>F4^gR=Xgt`r$^}3U z#vt$bpuaE}fPbL=&f0GH4-&hWaM)oj>MYwT+7`OV_mjunpT$KtQB`dQ*= z(AB7qOvdZb^_A^Mo5i|+KDDs#FKM6{xi1s-Zf*&Fu@66!9X_dp(wiKItOo{0gzb*| zy^FdQFpqeg@A{`^$B2oEKUjxPS4XC&kuohl#rH<;EcxtjPxq^?Tjg8 z_E}R?Q%#K_>{KC*`7@Ct&t$KGsmTws(3SAX(2I0I|E@s+Du0|8rCk~qSZXR!&rkP# zueCqbkxssDqbjeANpH2p5{~3D7i#!6JK+&HO#Y+xbuOA4@%`i^-s4_k0)euQK#oRA zVSu`D&Ta$4*5uaRhW6bDs%fBamv5O+Q=@y|Li9I!gIzg zhTz8zrwgp%`kZZL0{R{1Ag5iq=Z;@}M&B=f`EMc$G0rs$46ig0Kwlgsz9cwOZ=ShD zyitRitBH5|xhaz8o>C#be^o}5C|dBLZtkf%=ySfHKaO}ID5|Oo4@eAjpLHUeAG)!% zm2Q#9+PQ(p5muY}aFP3be2>hI`-%0_ftzNt(jhT1VL-sk1zgn2h{4dav9>lPO^%jP zc$9-|PTtWWx4mw%BOn#;Dsi-T6x>nw`I&>OGC5Oki~BR#3v+x@e0I<>4I&TfTti;& zn-5TPnjtKbS@ZhmDAJtw^08eh=k6|I;-^XP^w@gnRNKuu?)xWn16F&zj9o`(0y}t zn*^USJvuofCLtUi-3P8QT$e8|f$8aSMR^}!DT>(ly&zY~-hCxmf+3ej!t94?n381e z?%@c!gY#d~ho8d_(rVEI2;)fcUs3wm)Z>2ZMPFfOE&-u1Ew>8r@@msQE{+|C;8w=l zcsyd7;dBpLE_QO!AdgY1Z%0s$R5ymB=kB{do-fZ_U=b@PQf%DKeublGbk-RsFU8si zsB}vL-Qh09m`!(ak-9`*FBl;T{GJ%1|KYQUbrfpq@q*B^=s!>o@mwuW9sps-vLYp{iAsGAx8V=JieVT)X^nc z{EU#D_%XIuZm>AdCymMvPg4sxHAdp^n;Q2429uM?Y^Aey_Oqtnp`TS(*OkhA0}xiw z2CuXltx7*T?*pcRX-nw>;ky%2@D1nP!oMF`c&6{?zRuh zM+{6k$qSg`ObEWe@RyOCTwMF!BBaH{CB}aS zU3Y=~6z^BCynY(xOn1T-2=Vb@bL?TNg%4QNR51+)YRXDU20c68p?_^i>Yip%J;OSw zJT`=J%Kh$AYD6UOY$ij!c{a=^QcoaTm82Z*>xK~1!Ie$tyDSKCD5>tGL7SK`x-r=_ z(BxGnw;S*NSmLk_xAJ^oxo}Hechet5U=a4gHUuwby$Cc%q)E|UC7~%&qDwVLC949R zb2dmNAyMFRuCNj*N!5I7hHaLfjQ3}g?K~C9W%wXx+Xp~)G=dt&A+yj*yUMWNz_Tm} z{C256lan`a4EhN>aMy@!>32*{D=wm=+pzCIV3afW>W`w*>UJw`I=@;s-qxoF>06D# z!O`wEU;W>A;w>B9@l%5g%}U3!nXDZngM&N|CmT6E>M)(vvN2li)@#+jLG7XftpHRa z0Cj)PQ8x(jer-XJ$+E|^3EKy7v;m$wX%^mV==i$^z4i?-_1a5;BNz2HjgpomkHlM4 zv=#UTQxCGvYyu(9ihTYUM~c=bXB+Q?`d&9h?A?pFnLTpVSLUrfn(z8Dpn>~!6evskONcu0=N8*b(IFdP-9Un&g_1qm{OU6HO6lDt zbEb8)K6Pj}!&4BcoJh5h5{4k-aV7f|pOY7lLQ!D#-lJma_cy8+cnEnaYs4$AjW-wd zZI9eNR-(GO>N(cP5H6BlYq?XMSOvojKdq=aXR@mFAwc(Xx~dqS8+d#`sxyt|(6_7$ z!<^@&`?!YLQy>~-xBZ>Ub9w2*Xfi=#+H>QqPH+yQ2{rE}Hg7N#uO$HWdZ+pEQH1hh zWeNRk6mMfWLHp_5kiKFt`jn9+;;SkqB)KI%Tj?Z;(}~%|wv6+BcZ$e3M}wrwbFX&B zAbf5KCCL}#RV>J3@{)E$Q{P06+Z#w@bQN5 zcL5A(jPG&xVm)JW$PiLR=G~#|^TUi8f>I(=%6=&M z7E6qN9RZRG*i0UL)DhCbp0D_rUi*heHtZ8+zWV+dCC%mR)^v&m7E$?V!* z21f8-F9kg`792Y+`SiRC{I$9nV!YLaqF;JV!djLhY<9x7kj&AulId}D8#VCmX~rYW zj5rf7s^`OLOlq0IPgUzw(1jOeD}7Oiv-D|hC?(&k)_UByv8e6GevGYmblX{lMg;xx=jr+1?s{Ehz8WAymoqxBT0FN}lx8MGrwt3s0T}ID)@b`=>H`k z2iM)DEW|?y_G|VY5k*`bkH7HkBd#txB7|m96x3*=8JhHxD4|`uB@8j8|M>8NOUHFc zJ$ye<;w2Y8C3%;hfFh%Q+v=Ud=3aD@d7($Z{J>EwXo4w+1%rid4^?az(!V7M_Nzo7 zHQxgxROd3-hyL=l2eJXh{6h*BPD!%te)sU|>N%3%QC7za4{QO_=w{LdS7!j)F6)LT zL;7^QLH2b^St>IGSE@Zg@8zg1@teETRe_^*(k&F?ioI&Nf)tb z!mKKhL@vlvv8OyWS$H6`;~aGFK#vW;QWb-CfgQWw!U^3#3t-9o%RB6&Vinv0U|Gw3 zpzkx0ew>kTg1)=SV(ocJrq^;$+r!qF1*78xW@3;2+R{z`mP4Z}BcK;AtgYFrk1i}J z@9i8rk)v{6HpC3#Glv|})~`g|YexhXEpc8)Iuura{O;lc=*ClY%F=_V2TT1fbVihr_n7g9Gyi_KHdcV4&e+atT^AA)xYouF?rZ0KeCFX*DL| zVbld%E*Ez%Up8QVR4}a~&=Bg)^&r#ye%P14qH>7S8q*JSegUpq|G}Ugg(FJ099B@x z-mWcIF(ga8?9A^+oemOM7WM_tC1RJdd>)M$d}PBrEc$-G)GY4znw1G~6Bjek zBf~q^)Y7vf&5&XhcI2<&+;>*{?j%r_^2k}?^zHx^x|&R@Kd;^?g`OBxvMBZ}>(IB# z?u@MW@g^WI4ezS}miYFz_gIve^)DWNY7HK=?~OVvL4Z-<9SZQI6QDnr{o4)Fu`ZqQ zibwPfbbN^FkX#EHw+pE_25HZrQ>=XKht8+an&bgm zHU~&F!~%n!Ry>ruhRMSy_^P%ZaZkYI{oD_0Rx!V{m;M0mit_Hd{e>S^zeeH9(FU1! zC}LM#z#(eR$V7?nKT-!wiMc+5*pN;RscPOnsx*TAgz1`O)ZV6%nHZ@$9pcMOo9TO| z3;_#E$jNZp)dF^c9rwLsTJO! zEWKfR_iBt2&wTg;I~fF?26bKjf^uOT6#aH7xwuLbMf5vQ3l9lub;H9wiC$aFewQ9?*Br#OZPkiDaB>0QC&)z zt<;Jfr{0SO-7*}%1jVJjM3CdGcWrN+1}fT2UP-KqaK&R$h7vLf&he@6?cYp+xE)2p zA5Dz&KxGTtX{0K0J!-J)z?8~O-y!ht8Jl&xqXZ5IrgWFju`>2`3~V5$13Q!jsq+i_ z6pT=+>mRmhfg!ITSXBev;2eaGr(DXP7deP?jetMrpzNM9jq|pm%SA@ukSc8MV;9yA zAej8=6r}Ze>kKR1NBIc9xF=K3Fm_;g?pqEYjRo0rwvh;$7cw4scqqt#-zBfj)V$7 z%APsbc=L0^&p+!%66RE4E6XNxF zlZBFTxajUr0<*H^ltge~Oww3&oBo%6^q=q{VqW^MNi_MZSDO z1(T)%cTn*#r#NR*smwdsKKwCe#(OHeFm}(wc+mJ%xgf3fXv4!{=NyASeOQT{|E*0B zs;p|2B+GR*miSx5J>QIe;Aq1|NtJH5dx@_;RWAHPpBG*d)d)St##ujg(~kmwidYLU z!g=bRjuHvu@&xYFo4uCVClVY~Tq#eYw~BG)Wahv9L2LoF+VY-9sKo{ZKS+`Gz<$%Y zB$W-+aTba0&oNDT<|j)BtTp|>ir%7S{6O;EP{cfSBsLcos}n3=v7}UvuI~@62_cnY z)H%g63S)4%CYIVU>hWSo)$iZ*ir18M09SDz&gIDdEW z6Sa=<$FoZePMznmvl`rT;6Jp3OaSM^R3j%kVN#D6zDp=A3~l$1vA7CJA#IX23E?-0 zRGsFu4de~wQe+JIS)J!J3cP75$$b|jfZh!gr+U2*>|8Te-JsXB)yxr5po-o+49g{w zFLWQ=Dyn%6Fb>_;sX26H`EPdZ1KbRc17fv5VQrN7EfqL1PKX*LS|h}5F5ssZ;5;ZO zC;P*3W&Fk{=Ho>kW%32(Qez~CXX!Og&Gf-(O457;=WW8D8vPmp;y9L=TL+7m{?;c( zl_3_s_1*?pSa=kUi@D{jv?Ib)txAgfGN;ZD*Oo>w0*?3CvNy`twE=5`oGPVelWo|W z>jMWMkyH5BU2ouk2fKoR|k0YS-h@`GM_$mO!6 zb^g#l+**U_3FMXdT&gh8oK|;+>z;)w`vk@pL(@0c*A#kJ=C2$0Z!6}azCeE|K*R(B zOVs#E>|dQ>k=}I_tMW)k3Z46hw^FMQ!l)Q!wJ3XXEp&fwQFIW}jh`pzb0B9xTENGS zaa)^Y1k|T|$(wal3AgrJ!J(9EkoJkme(h7SqBfNid;#A{j}D0@T*y({H(KRm_kOd1h-HOF$CKW3BDT)2Gg9-OPq`qc2hz@|NTk~@!gNTw$?p?^ zi}0K(XPMTEWqLZxk6^z~F7gSPRWgRtdXm)kKst{)zxbPvGsjzb>8;tmoT}>fc?4d( z{vrlT9B^cbLtB%UK>SPqXs<%z&r2bx#26Ep2C}|^NNbhYniGjWBnOePmAHjtlJDh@ z-hS@|T308ZMcLn1mkYO{La7qOAc-_iqG%iV&n7Jd6u2<^%tk|le*I|3Ms}T~p8Aa- zmn>?*Pvr{!zA#Xf*F=TeR_=_T>Ww!_OQ|LQh^u+oDj>gHp8vfxnbNIa#Une_qiuhd zAvumdogat`!-Be2a?t+711DLL^AWg<93^A+1Q5h8UN|R-rZ!&6XWRm)2qs^EV9V}_ zX$+&1bRY%d2DSnQJ*3aEj(nr{d%1VkT#8VqdyM4z%6(ogJ0GO#u4^Ds$Gk}Fd=@aZ{&lT$Spp(fK-&7)>v{)~s@{bEQ4SZG(pR0E zdf=o>!SgotB!X9?#k6l>^@eKMJ=d-6lyL5Y4aBDljL|bl>3(ZxKZR?j!U{r(itd@^N=d>1L!$-E7It34<`Z=NmSnvl~Kix=JVnpW! zm;sYwWaUU*vQ@tXff1ZX3K|>vO?}Y!4&p@? zBE@z9v2W2_mZ-jpgwO+p@pk|Q`5I^O3!cy$D}u}z8f_g3Eg zWPDQQMnOFUUy!wF4ZwkU;z!#uTe?{EoD>tPP}tEF;fQXEy8R;zD6`x`Sz95nR-c z2xEC}ZMapqiw_xpbc@4#m!LB3WY*EfHNMIZpXH;C#We^m`hoqvbZwof>WE(4IG{Fc zaLy$=Rdvuh!IS_r3(4$m5BJK5@&{X?igXZ~Vk3B?8S2T()!^3QfsiRq`dw+hXcI8` zZ6|)Kd}b8@F6H{XPYWH#c^hn7*?i~64DDO_xj8O*f~EVAVR@jHGXXQYAS-7ShCN4U z2cr3a=z)H{@%BP16-XjZ00(Ukkl7GM(UT>_o1p+!vJY5)xX+}Mdv z1L63`P$vJBXqM|{%LgL>ztMpuJ`?N?>?FRXfXBg6Mwa{%1>2N|L?^P3PEh&~P>nEB zt~PvT-4M{O>o(}|S;DCkLQfudVnQUalY%bkFvtZF(+eN>wk!2fW^LRHRoN}zg!tgT zQ+QKwiWO}qL!_5&NmvrJUKDQFZB;1(-uS&$J|E4v7ofx-EzAg(FyW$KYo32YXE_9s1 zr-tf^ivBZo{gfU0KL>>z_HMcHR?yR2pn#4yh-9ImZS_Z%;k54@1b^uN@%Hx9UQa^q_qTD8uK)W|<-|s_BC=X-% zj!tpbK4_DFi*XJDeD$@`xopxv0m>k8w2OV-1bBOoIwP~AIGC5tSIh{1dt<;5tE0S` z(_tZgm%pZL`+Q+I6_HTz!%CV4I`?oIbhg@dJ5v5^|NP7*9dJ5s0Eg{(nnlK-gxInU z80qsK9w80OWmYGN7XP#dHr@*x+B}t8RJ{TQX|xZ5`~FW!vbc70mIq#$puMklG}hi}eLp z;Gp09Wp>4!$QLL6Uoa$2=^AF!FHQ`X@)@s z_Z~fv^7^wfMD;wPhy)>V*|k=X>ZOV^MZz~dmBrvT*zuy!SI>Dp!6W^VqpVv^bzsdR zF|B);#A{(@L?h?eZtY|{%SFwcAhH>|{ zg@Sp9DQD9AQl)e}pBlP~LO>b46IrD1G_pZW8-s?5ByH;q~|($Gat-I`xn{V8F2a=D>V!vQkK6=nlPRGc z5^d}^{8d;i2bh0sFPtVC#rYQnc+L*f;Tv1oTu@m)CMD8IQb}ogYImDMVQQ2z3~*J& zn+Q+S#N+^FrtL@={VwPvU;8rMEKi%&s0ZI9f>zN~x!G8nP95B(;R5`BoK$cqDeDnn zo6J*SD3asE`HQK=f_CBFMUVTxgfmXnoG#``L#-{O4+fc!jw&Qa{!wQoErQ1e+zqjP z)qH0ameK-HbE@}b=?LZUf1O329N5Cfp`O>Nd_5LTbF2UvNXIB4rA5(qKTX$KH&l8v z5B%86L#r|D$M~XcKyaq{3&621*DpDG0|fKjBqn!6=VL9Hn<Vmf4vx3_Rfqg{zcgPwuh24>@~^u z742=nt&#P~o8ms8o$oknj)~7hw-l-f)f&lU8Ynmy{5fS0C5|Tp+@<#c-s3P91QUps z7^tN4d}_Z$d&IyFAVP3%AX*rGQlcRw4V30O@x9U3b`;oY31o&Zc(QPMW2G|gMKqv4i!iVZO!M9A)TV<4_KAeW$P2zfvWeGeKGKN^TKX$y6k)C`%4$lspvo41 zNqyw5nL1%)8%&HztD-ohqCZ7>1PYKKwB7WK&2fH>2H||8Pd(K$jv$$r^QR5z7tNO9 z$bl!3IU99}WTq1h`COnGBS=5s;CoM(tdCT7or!fb#`}Vggd2*YWW()@+_|hA=$eQA zRCa&{>I9M?#c2)-nNcO4Adr27blAm@tUkH#J2dJ%ZUbJpR0L+4%&mdDu)^up1R#}( zRxsy7tqpZ2*pb}%71+-v@4hU$$lVFS!`#xHuS=2z-=dVtDqYrP!1!;q(J;)AEnS;iMM zv~%!b5Gd=28()W;ayhOO5!D0SoaBjckBg2ui~IiRz`FM69IN{yp6OvRED(s%5ZetD z6=Bj17lwI_%h=Ze!P6ga9QKvdL5J4;2y@x^?>C2BkliL=!5(cl(V9LWPBQK0S#Wcz zdUMd_yK(9sM}1_WOPC%mcR1r90ZWtxYLyy&zzonq{8bN(??)8Vh@Lo$SZz@HB8;RN z%0C-^V;()j{!$RvQTceX80ZkZufUYw~WGjWu zCu8q|G~DX;Cw@a#I+^zS_EkV&^(%bjZ??M#Cs9+5!( z!9Ym;%(=P2b=HqU8T%1JT_qnNn8?A2UP9hRfy$EU?x{r>*x+%j>t1gI$(D-WGG_}$ zZ@k!kCv`KHy9qV$?V~Ug(16_=8(sT=HEA&2XO0MS7gXGJL>c7745EXEn}c+|H;Ee_ zz^v&hf)1v=X}@^(*I!VkUh7jC5?Iev2K4yGY%$JW9w~Noc#^vW$#(R&vfO8~(F#s7 zPWaXiwB(=sFw9+ptF>HyYi;q_p|252w??astYDHb4GVM%!Q7*tL>}jr8>ClXTIpX6 z-|D{DCjELX!WWc&H0ms~i-^Q;9LbcCB+;O1kody&2DHywk*TcpgE9Tm8|kh0iMHrF z&qV#5t7to))K1%zUqkv+%GK{7s@*zpR7tqQFPZ=mae>89aVTY=x630{u=^PZ3#o-5||ry)ev4L>ah!f zc?)sI!wvA`s4186=TCg8IM|&8jpiw-cu7A4``L5XRtKvwD4S;*&k}Omh{R(YFTP;y3? z?1Pzb)F{Ek_}jdmG=eRO;EEbj=y)PrROe0r@k&M?Mf+F6PaUwJs{KJkY4&OE30AZ~ z=ru=dbP;9)Q%2D9&?q2B07u-Agz&me*XD;*leZz7Iy5cwd|zhL|JDw%p%%0Yh>`I! zxogoSrvlqUy|u$BE8q?CJP#|M*_b&S3KgJ9NN_C(7g%tj&_ACR1h{b^>;r55XEm9 ze>ML%sW7I4DoSl)jCUvujJ3MhB6w$N*K<2+ZF*bEJEyo$WAn@wjPQ zaQk|6^&`3sp*^QuFsB9e8|JNQn@BCUm|>;iPRH^$4JHy^x3i>V{4Xr&&GxfI{K}LV zFO6@LYv!10$FdVh!1XNk2a&j#EBwq7EAZZ}2<*8|LJ@(g5k&DaY|hCo)o?M3=64|W z=TqY^+ica;e-vO^(n?a-Hd~JImtJ7Chtlw{-Oj32!M@x6VsVka#jMBYqd42yS>3m@ zF5EHFITPl0$$?3fv$f6j6f@TmMw{&BGba)yuq>>_vpeA9qMoBI6ux|Vck5|y`WdY{ zVegw+;EHY<=zR+RR`|Oy;gZM7YoTklSY6K$7M4-q71!~j>jj(b4mg!X=-Bte^W{ZX zWZMbXQ|t4sOdHuFrmF!nB<>sw3Da}<#NJ|QR+1M5Im2#kPw_ql+r8EFeum=lF3nZT zt)i3L6Vs#f_6jH$ zz^AhIlL`C>iIimd1rmK&ZKrFC&!=(EOzu#4oLWczR8RvS)S%O2bDrM6+0C^7)l)+{ zNK&8u_~}cgm(WJA9c|C68@~Y831=$_Sa4>gb_0b}bV0{)bgV7+EWxAB4fzNzhd$CO zpZM`cV&{`ym0Pqe38VF5<%o-n7RPEA^|Uza%6*A5LYM@pVrO8As=;itNpfcs9VV(UX1vJZDbtjy}OfKW|xvf!HRx+Z!rc z9_Q~zfoF+#J?CAtBqBCOgSXeT=@|muf!(|i0M3HX8tNvMC5W8)K~k@4(B;jKW|<8b(KZNtyu*gL#xGI!YS`D+#Lr?EVS#t-k%m^ zR>;p)TJ0R(ep4M{1#g|HgcsuHy!l}>0`?<}W9#R#I)5<=XXoFvd^fjTW5ewv1Iyhe z-T|;EDk_E%F{4!&Pvr~hu#~$uOT2K2>b%-{Y%49zH$Iz&wul{-^DCRt@p$(?J8*XZ ziCFdVSc1y^&m$fJ44kt^l^?fVa_D?^#RsDC`^b$p*1YO~0!x726YfuyDcgWpGsVZq zIvM&vZg)-Rkc_>jb)hjq=ckdx*H=$&sX3PK=qk>!E;g;8ZTti`iBnk5wwLll7Dmrc z)#YsraUzGq8`cux_8;gUv{Px(1IAiTV?sFJ@S@Aq2>S`UHvc}0Sfps9*Fpcv(aa`F zN6;JbW#?G;_ad#Xj*dUIXf%SjW9h=6 z(fH2KuOel2cvQ%r^bdwm|9E?4#=0F)2lcwYuLX4 zppX`3?I301_wp&u;UsF`z#GF>tOol;Gt^pcAK_GE6Td;$z_c>`B4s|?S&NL?KnCna3A8YWoccd@9UM!EKs*|-()iqmg<;i=M>0= z?>}b+soY%F-_HkBKE9cQU}7&zTN%tM`lUJBryfu=Y}MA^<6dSpJV@2+MQ`Iq&8tTK z9Cca=o;wuC3+zV(coS{6DmB&sDqqQd>_&AtzVOG;O~*>e$K5SEg|b`rU_d$qcq%b8 zAM5nrYxBuPdU^zF457gZ4GoVTW_LxQoK zDmz9EH-fD1F--Gpk(fEKc0uV>xvIQ0RmEX`yilDgiVe1HCnNJ097zkZUma4FkSluk zk`^PQZd1jK(C$@qHENTXD^>}0A=~fm0|{)#Fc6if`_ZuE3Q99uc~;DRm82daLNcL4 z0PKBqPwDx;$YMVINb))0D{XR#m zBR~YDs%9OF{#Da<K ztWSE>KwPfS-W=UU_LOJyK5&-SQkUF`4;D$Y-yNzl9om;f(OB?}=f5B6iwEgE8qO|Q zzTW{jFK`C!-dSP`$@9jk{p^t10hA1}OUUb71n8wJ2z=4EJKyS6Px|^JjZZ*vs6?;r zs@TnzL0DqENH#r51Zoa@Z`<{)U(M2?3@;{~ZMOqyc$&{5J_UkR?Z{@^F++Z6v0f)3 zXaw6uHlAR87x}Vdq4!>U&oy@=RvJLX7?#Ld+U|T5ZCBjaEcjuja@S!^6E3y`sFH#H z2BBDrp69!Bm$A49dj&U2@yFA^W9F0BPpcLR4+7}uBoC)RWFRVCBFTR@?S3a8Nv6TJFdcpxRTmCJK zY6Y5;-5CJNBKAu%k6>2u^b}iQfoV0W-$7UHVOB-6$J^S_$OuB3CF54GAC~~b35>tM z1G+Mr-n9-Egvmsk8dXe_i%ok|0Py?ai5(L<7zqk@8$goW+lw9%G3bM&9k({R0C~C) z8tkJKWDe0cBOG=~5$a-&gbaLk^##q5s^fi?ho{|-Y}dJ`(>zeY_(rH1I0F25*CxVe zSJqwjBHO#?V?QvfhPtOJdow4Pfe{vI#JXmjCSTixgDOh+y{q^S z$)~_ih%#M;Xa|vB&{r-m5IBlwlN$IARY>{q<~;gC&asGl&3)sIW-1Lje0#!(>#a@u z74MM&EUKIAhFcG0e}vXhDNtki}FO6P#?knP9R#obgaix-w%5m2Up80AJcH(&Ft_9O;-0KJz z&J^$BfW}j-Vbal-HKP_93gkFRY?IoA+HwWkw$ImkF4vb#?SVkFqb1O|RrYWfAY)u6 z>w`cnsQata7GMo$8Uf=>t7O~%;S~*8pv}@Ws_Dzf@l^FKM9#ev;4=4_P;a^BS&zxB zKv!5%mD7em3;K-g-YY?Z<7j`fxeo^0HUVkxsZ;B1CIM|~UdLZ?Pwpz$$(oU@0I0RY7*_I1#9um1dO4VK_dgQ8KQ zQ?OH_mssFkfxy$G&Ov0Ih&&zF<_|R?7^7W%kw$ZJY_5V<-`^JcVQg431U@R3AngUc75n01Q`vzUWR`&tS0lB~ zy|F>c85^1@-SzcN_V~03eAOc1<(O+GYlH#?E zmee1Rh&!hk+)^UGysQG253~atKpyW=0r3rQuhwqV2<3kYCiVbZNqK)(B(CE2EUT%t zeC!62Fs#Z`_bT3Knk&)p_y&qn4sHRawntS0D9aOKa`h};C`Rjp)gE0f{lagma`Uj2 zc(X}7LheiLu%dPqN-zn6Pz-l94(NM)$%c5o^Hj>9C$QEsvtR+qVS!7#0STm0@_g`y ze`Z zJ2^AGgyn49^$&}td*MZfOc30bc}z&hCI{2%s~MugktGAk5}ap>jZaKZVFRCQ_GJUc zy?cD6kkE6JF}W^0#G?DhIfBw%bodZ%B{3mB)Dn2_f}iB_)zk;8O@cx+#GjYLIf$@YgV(5;%Z;fP(@B{Js`6gieei^P;$B?_ z`?dbOGxGLZj2q;4Ap>xx-}#tfF}7CXD<`k&NL(W#G79;h=R3W?3&uhpIk}D+8DxB# z*^hk4t|~8fL7l;bt+ftxbR?qkZNkxXJXW& zLPg@2)JnlEksgP&m%y zcT>rIXNvB|%P;1nj(sGYrr-{sY>sgd%?!&&@W(QHm%~NL9Q4;>#+8}T%%=w!bZR!F zZtRONOwcD7pyQ)BRlhWM13AN@2#E5()`kghLBWPe_083O2?6lihM>!K zj;R326&^y5FrfOx~!NO+E9?Tq?kpLRYgUXJM&`!Q^Nq6bG?(%99 zl?wJ3uWDvTWvtL4YVzuH!ML&8qDZ~sE7egn;2JYp>p}0m2RTM2M0|;(CA_ zW*ju_Dz;z*6jQe}Li%JRn^#;N83-g@`94FqvNhXPl?c)6?IdXUbUoZ*`vi&DA`cac zjHJTu&e@`Jn-efUVTueavqlHy!)N-*@o|;cryn}Vn{1Y=t2I)lU69Wy-0pr(0jwpB zPqDP!I=mZ8;1WuXEid@e1?bb)*^I)2h=p17@`i2tnywH=}0-UA_`Gqwg zJ@+Zl2x|np|IuluJs)4aHkya=2S6*yxrSX+wd4}CPciR;+#pHovCD#2(jHAoz(i&)H%2&!1CS3j#6M^c6g?df^fT>I<-&)_>h!EY z^-f^$6p_<1%&t<08RNWej%N|O*P7{IT82zgp7%4=J?~!Ud<%EZgYB+wLMkF}iUG}3 zAhJ#dnASBtWSPV>Q^?EK1Va6WuIZ)HM9J1dc$1c;b-b|1(2?>|D#jZ1tvOn=tRz_? zXl@kOApgucC>II;#LU{|9IN)-+K{GBI~IyOi7w0|#9}(Ilj)T~;WXE8d}flb#!@=~ zT*@@<2_-bZS_hTrw|QP4FRQCncHJ#ygN;W6w?=_#!RJ`-G>bgMfpwV>0)>N^r=V~@&QFk?urDFoDZ_Q5w2BIRbD3x!OFL%nLK;|h(ijDGok;9mi&yO80 zu;n{y+|*i2NqmQhQH}=%Cu2Y7KbILA6S`AkKn&+_aa5}L^uzILf?-KD5n1xEf37^d zbKL#K0})%y=Py8WapKYohuNfwgNA+GA^4n9mna;I5vnv1Xkju<^)o=_t^l z73O5ol;+#d$<8cpsj-oRc{n_)XN92^&`Ma^saLJYo9bdguRZaNCTUqEo}a^UznQ2| z7h4#FpyOwjg+J@y=IcD6n1it($#PC7-nHvM!l8{btjVb~$K`-*!7Q7;vh;dE*MdNB zWv5!`OSBz!=b-HMnC9Y5^dSYArI`kB7fWQav=-QpMXa?##hZ&Om$!HH<#L8D;*2UV z?DHCcja$+45Jq(#-W+^2&Ya-@eWv?*f0s*;LfNVO_2XI2c?4hLH?M?qB_)^H{rm`Q zg@FpMSs}YHiuEU^)6|wG7nuvU5+#V3AeMybk9UZ~Y#gQwXCn=`DGVw4Z#Mzvv#%GE z1p#$ht<3*$oq`=?=%E7w)keY*$$M=O=s3) z%x9MgUYS3OU(xu#hCBcJxa7dtWcbA~S9fA`iq;U)G z!5epJG&tPmocU(XU334rYt5bizujxWqS&=-SJf-ee(R~XOniwD+Cok78GG?rR`Fk8 zjsoqRok;{gThrG_Zhfn6WA-Q~;UdPdm4%^+!@x>ZR^Ttw16#RfAtp6ICcDQzYJ%fag};2+I(11QU)Ho0{B{kMAm~&tgB_imrhRx?nLl_eQTUwX-$skt?RjYm#mJ z@^w>Z19WKaf(e@;Vmi!_DWr%vc1;U#v9@mPcl9CYc|QYzZ(l$?t^NC(fDHUZr{sL= z-dFfe@zs1m^nooB?3}rETCg3H8F}n&m@>JzDw>rrbc!8U9$^RTq)CX- z@m00{Ob|wU;SL}kz!M`s)pWiCSad^TtriG+8}6ZVXC`^`y1oPmm7`^4EsUctQ1A!T zTaHY&CR4@LkBN9ez#fn;o<3NZa_HS(o{y+{((j^K+Cw(3mJ&wcvH+WXgxRujsTlVr z&sLt1F8P2T#dzw8^bW2PwOIo>ySK2tOeg+wAK#uWKHLrTS)E{?;T5Wq2cgV4EuP}MgE_G@n*FEkDo-4q}|-#QUj3n}y~tcY8iqrml957iAr`+dBZG9*@Fc|{~x5In)O@`ma6 z&YGMe(t`B&Qzk~i)Sj?_`c@-hp1h;?^`9=17Vtur5%Uhf5e)2L8URU!y_bk7-T{#M z1; zUppE1-|Xa!asFtsKRU%u?d$6kOdtw#1GcSvMbm0ApR$34zav5Hwj8Enme~jT9%Gkz z?0!Q+kVu3Mdf&&b9Vz(V=$EW0-u#=nM&YLgOu2%gYc=+FMOVACVF)NtW1=V*Yosm> z9tI|A{&wzTTTX^**kYFx!?T>hMp8p^>eJ?U!@3p>Y~E-z?Q|Ok$|BIaI?5Y{a+>Yb zvuh|HXeR;|9>bp35J4P)pEZRx$i~BSZ?1(JxCn^7>d!6jY=7R4qarW+kd4kLa9Q^UwcxuDGByr97R0$fNxY#kaKULP?bY6FryHYpm2Cew zJwDYWQDPU;4ymb3M@GR3_J#e1{S5hs!Hs7}2hFWLFjUs@>KsY6m4|43x)`6!$8+z8 z`S-j+Vg96tFd{CI*uM;uc;#1tPnH$+SY*6PuX=6eVMeK@P|e85hzbB(1X*r!GRt2ir98sw*)Tf%Gp&v^8 zQa0;T{<5l^NvQ&|Djni8oVz*4mOz=qqPYAU+z(&~2~!hv=!ykoEWDY}o&sLaDVJ9h zo6wd?)}s76vXzggln=CDiL9B3?zLgZ-A_Mev#EuJRdu|}5mB+N!RWj~$&r=#YRM$z z2!=g-(VRDDvDdCB*EU@QZCZIGnhzq-Vns=kEdVb;@o6_JZInU=HVPixY-nCG8UxA? zw9=?sBwCg(H*4H=3=dQ?VYPyIl$(N)wiRqsfQJcNkkF|DepBBo_*aFA zIrzXvreap|>=@7-gquCwSg44z-j{dYif0aWY}6wxDk|z6J2hIOW^(x_=%Bx%X!Fj< z_clo-^$m1a@U;7PAMmqyGffO1v32RRo#5hlIXTkdY~8GK?AsR+rrDOtrxOBiA@_Z zLczl@g@5N^R z_@eE$JSSK`Pd_9NPLV|8O3FuVBDqTkEGdWKcE{q3L&k@XgC_J!;!h^-t@=uW6nkKN z86Og#xFVeZcdbfocE^)M4saIVfR7EPgrla>RA~|Zq&_HZ3f7nsRr+2}BQ3M5fN>;1 z-_7Fc3sPY|J2+D>Y1shIzR%O~yA<^5fX=k(KLHo4lfUrXW#@>qh&wo%Og6AEjG1yt zL@;1LU|RtP99oUPf(Lnpby7%%JW0%$?X^KaNBoE6g49eqB#0|OonWM90^vG0;W$in z#vcbIi1;%!!77I;LBu8<^w(mqle34(^al)}FSIub^weCfd5V28)1#+$unE{z(PObI zjZHqm4&Ij^2ii)O)KOEte^=@6KspZpE*IQg^VHM?TZ~2{5DEezX^8)U-w+av;Yu{Z zg_n9^8!Qk6>aqL7yb9odv|j$KDe(Ag$nRghTzadgC z3Wcgf_FWYH65)@U$R{q-CDWpqw9f?f;QqZ({L}4-hBStBXNUGpljD8sE7o_A(_icp zyLvG`sK?`L@!yVr*(#eDu;k*Q5vC?1aOG95m4-HLEf zcmfx?ZtajoL`0I4F9G#C9L}Fzbj=l1Q5EoY;fUSmn|@5drV_H^&|XS@G5K(|rMp>zUea%$#e1L+?-6bPS278aCz! zv|+?sxMm#((4wp0g7cWzgCXG}@snn!8Pqj+S31_3to{5Ew%u0U?O#N6DWFW&kHN01 ztxQX3L|8ft=QZwSLwb;Y>A-ViE`+U~TYpBEo_WS`R2{igx{M#EFvHGU@fIW2W$njm z;(WcI5x=8zDeV>j{6b%QgTL^~cm3@~WO-i_!|P=wGf`C{5ecKMUK5SN1Jhe|v^44R zWhu19U2uWexpQ_GL6j;AY%A!sIs5nZcXZlgJ;2TP2uo|1o4+xPR70J?>S^l1ef{`I z+nRHjTRFJ`+^hjqva(XV z-TenQbnuD-=Up_J$o|sXt7oF1@%T89b8>g0U}rRoOseg&((w{JS7OMFZ;Ep)xzt=;^hIC)rZv3R%E!PvA{cB zxEepytgI{m0PwNDVRLiyqSuh3M3^v3^Pg~BxQp1fAPBraq_brhFRDVXf%%Z0 z=d`%p$YZzPtly|wsFVW_2VM-iOA8}i&Q*VrqEXk=BbEAn8S5@Y;cd^xI`*(Zc-LQ^ zT2lFBx80NtIXZl8*7wYFG;V))D+fyi$eFGr++oobjNXX?12R}`h30ACgVr71_M2;a zN8k^R1cNI;8%m^Hj8?Js&x-IPoDGGsLH!JbI**tQ7epS~$>LiU=P znk>@99~~TGr7Dy8ujH*z?WI%)rP!Ha0d2i+csKGzq)M$Jy?aTB0I;vj)e4I}5WEWi}P) zus(`Gse-uq_^OpAAdohP+6re^7)$wo$<_UfS^Q7(?mtMrf3tc2QSi^}{;P_AU-!SL z_*d~i@ARLp`%eY`c#!`+72ELszdn^Uj1~(=jE^7D)AtuklwFFOo7-+5FcLAE$I(Y@ z7X9~+13g(S*oAQH-~Z3kn*TSp_&1~bAC&CB3;sdO{!az}WSakOY20Q1bc zt)Vf|yXdN_Dk@IP;j|4EA=mAS`G5VluP^k|D1Sq1t8h3brO17_S?tsCRr_u2k@VL!%Qw!f!eY%j&Mve-a~&$?5C}2zn2}WT4^~~bKN)&nY~d82)kHY78b%r z+O<~@tlX7eh+orAR84*b%c`yWR_`lMku+D=2Ff}R(Qpi{IKiW9{l5|QhlhWfSi(Mf z#ra;c21(5<0c|DK>sOb_M(ENAUpl7*qiRmFhu6&lR<(Xoes-%T?YYer#HWoC zPWouBL6%`{V~6doJD&OAYgfJ*bji{b^A6WyZ9r>I$I4<%j+ zn+K{iY_GG=EfHa=`(aNRy<)0zmZ1Gyjfqa#_Hb5{^LYwtTnOAaYwozFtck7ze|k-FYfk zJP6#-iW3)`)Jco>Czw8l1gNFrad8-O^cppeoY2p%<@u)AISDJNj*y}4-&yv{jX~4h z{1A1`6(P@I;+vK9ddnu?`~3l)I114+?iUf^b+9x^XY0wsG#@@RdQ01Av3kf>f5}d& z<|Y&IzJ@%YIxM&PLD$Tj;sYl!uGL`dbI^6!FCfeEVa^h2a4vW_m7E@qHMcNlr^`ymGH&yg<^@SGPaP$xNu^ z?iTv~fPYJVhf6L4Sz|=_`qSA05EhTo)cxrjbR9<~`glDsC2oQTXC8Az>FiZ$>mcj7ajxyiXFt!(Cw0HIAM>HZ z-ggLiA~Hm?A@A0g?Q>^gH&r~=QP0GN8I;cy`7AyBpD)rTF=r@G2R@?oUZIu5m&D}J zBxybOr|vvzEc2&-n(Ff(%=@J3<3O)befn*C2>e_9?{ciy+mi7O=g9|r$(FRTu~LoT z5Yc>-Wy)&Uk_L|LF$6i3n2)`{Lss5mBs#rb1N4>G{x+p@F^*g`U}R=c^IPre6>O_P zlX!Ik>|N{Cx7n(xJWU7nbe^)=t9!Uz>pqjUI2Y+*l7Yu=xC-sNx{TZI{@52{vRkzG z4@n>@Hpw<3$je1c(l2Qde%2b%ulmH)38W$72_QM@pt)|wv2mB-FV_?SS%yvPh>*Nb z@RTRmb{q6gpTB@I1wW~;Se`|P+L1yp09VyIKQO*pfwU!kf+sP#mPifd+87f_Y`-oD zk#l*b<|{{U#>u6idW2oRhnJ5zMWBO?H4QZP7cf3T(Bte2MF@I$66QJp{qk%>(+h^F3;BGYeesYcr;=0GY-`X{Jv@$ii{^DRsrqH*w5|#NXGV!Zs;xcLn z%syrDlW1cQ-_RE-O|9bbAhhq3-NbB|{{Iq%PmlSNm=XAXqOBYWpxpXb&4`nl{=A#? z{DVL-nhwCpXN`9hJOTZb(+dBb@iY`y_Apy9$N6*muiT zOYxQ2J_dC%1*{76DyEe0BRM%Z(JJuv<5XqS5@IGxdH$SGFTC3hBAghnQB8Emsl|cM zxNWdD1$!E}qvlNnQ=PV6pS;W(jbf^f;#WB~v^hS>7y7Dh8=4rfq}XK4wuQKcB!f!l zK%Go>WGbf%I*Mr;XE)}d2;ULVz4f~a6J5^|`P1yNU8LRlHGF1Afg9rtJ5cAS<&Gj! z(;|GedM#!%Yb(a+W>9<2?-p0uBDrh_$8$hv^HDaNSR{r3jypoNpbbY*2${-BYCRBw zb?%O8&wn{wU#25|PW(9|Y(<3d&9UG0X^2p{iok;s$}0v+{`fUX*?0B_g|Ig(Bg%Yl|#ci(3NBab0X3^fnVVIf5@2FRvH!0 zn0thb;htXkJ$k`4q(@hV6$pzpeN|ydqc=+b#y7NeimkOl=GbbM^MGxvoO_VA7tMCq z6J^Y`U7d<_k9P#KG$C(p?IjodJB^ap%w(zV#&B@(8;bwXEp;$5ew>nn;v3L5Oqr z+a_B2udk>Bmffy=K5S3QO2fb57`vIN_LB@saz_P3eYr`>d9;H};o??<|J=F*5w4o+ zLPNK#rr++@AlRp=iiK)5WyQLO?e0I_U-^y1oRDE_u|qW6QRju>H@25!m!5v3=3J-L zkelemMZ65_3j8*0C$f=w&MkZ*@$r?|m+v&i+9H%5XC&iFNnIpc>}3P-qTx|7ZDAP% zhA6NsP@KL3JNHpq<{UKdH*0Ww8A4+wLa^1l~z|wBVJt+5Z8q2yE&+G4O z?rN`a7<8@FXyw5S`+y5dPp}(lG=9ER5owtCqi#Fzs^LeaPSpMiQX8}ZkRv-)VzK0+ zcMbf$L24&E7#yx#uKQ6=Whsz>SM_vsdOkoKZ%Vrpr~*77KlfISiz`!ew9C|Im$%67 zmg>g-xLqA6D+3>!TTd;iEcGT0ak-n$B%ns|K+t%ck|o{11ljc$4wTvtw|6^>N^lJ@ zXgOlCjz+qy>ccb)uhzUIrL`2_q8PQEc2QKIc_Wn*r^eI$J=MUqG7S4l^kh{j3@(`C zQV8OFVj>%#$}Aw0ecPaWWqNBh6cH`nwF(enipUD2gm=1>otqQg?0K(3R)wU0;x5bO zXZD~$B?eH1<9;c;6tZ>Zj=I>BvVs3=^efa)2p&?~W-mw9aglHr{GoWEJ~A>A1Iomy z0b^2r$Y3`ZvFQsCkE476Wdb96+ybz<-bRWL5%DfKava1ZGSy&XC4&k9}foJtO_B5y^Ij zeoM|!kkjtD>N+-6S`0ry7d)|Ta6MuDPM!cR6s~|ggOG_()RLwT&+luw3{&4LeQ%N+ zG3ovG`%9?jpPlw=3y7@$8b;RM9iP?$Y&)_B zvfdXTyNK|L3*Lj&HdiG~2m>7YM6*thqrWwgG-jCb2C;iuT zbZ%tyjHQMa@~ZDeQqHP^uy42^`_wP`6Kp9NgbmFxxv%Tv>P(D*!`wF>X#zI@0Td8YNa{*PQ@=j%|K>!0h$VT?=N%4RXc*# zNl$XCK8l~VXum~>d4T0!CAEFuL1_cBAi7`KdPBHH1frWVC~l6x-r5m)x;d2ysMOh6 zi?qhHT=6ytPQ~SsnPa+n#uU#Q9Qa~z2D4Y@=%4%j_ zD)}{imQ=GJpQFzxE!jHG11veqAstV)6g(~cfhI^&Hh^d66x$VhJ&BAZk(HGDLzfMH z)>6Wj5G24az->0$3;HdV`II%6XbV2&3UZ?``xDCpY?iw0X0^P^Wp-FR{|}X54zsZn zFQdxU?xm{adiOlKr46S#g-RQgdCaE75Wn-ED|}7Hwvitm|6KWz_U}=D4)p$bJ}FpA zBx?YXKE<~4w~-Bz+@P zU_rvp^RZQ9F=Az8?({7a&Vw=XjHcQQP1k5)5C?_i!wGirjZmDei_9+EKn5-3F~9z! znokg%DO=2&T3#y=SrQ#GCDp2Ti^yYW1>X64=`;nhgSJ(8D}y1M!rKw4V<2^%}p?gsEF<}v)7T9gQ)?jEKWyk2`< zH~J~5ua9CBFOp|fEUIOO-Ww^@#-PQ`kAQg?wrGXTE7gZ(L8$cbjo*XAFXn9TCSFsU*4C-rkyR{9 z#h0O+XHc`_f(4q@_iKuDQOWt6JN8{2ROZrus6WWM=Qls`xV9|kmd5leoD&2Zv!c)> zcHv&5iY-5|9)1k8+XWpQq{{HRPpsVCD?DYngby;|NVaa!mXLI$D=jS@0wN$J0S9&b za&CLGnaF@e9oo|c#DH4MCAHdGqZ7RqI_W;)VUwgN+S_&=noGUhCv%9bXM*z_oNYi3 zg}FnUqhVs=n|B03Y8n>=zGr-(D7uRAv zmU~Y8D1O8J>kIk;+@#GY=aw=r7MGz0`Vogr_U}1Ma;CGX`PqU?9xd*mpcZQP{0|wu zLPl{ZOw`S@g~Is6%W9MFRc$F??a#Nn}`H>rvtWr$AM~04;ZidfVnD* z@#}z%_@sy{mZJQ87;=L-Qg*G1(*Ud2vjopd&=gnZjj3e3Uz3X&c3p*x=549p0K_X+ z5hhUG_X=ET>jVz(ZYGmN}IZl{Fhxa$$p5nOJW%YN6|+PO#LeNT*qg{OPzy|Sip zHU7On%NSWxT(egp-^Dud{Td*2WVh8L9oe17N|+GzC)s`)xeY@yAXW{T^&eqs+jv#+jii<-Pv0a9PA$H-EN5YrQm>5|%mEU@AT@egp7 z%<=u=Q#d#JQC&@8>$hoes%;^2M8*gXn*&sphzXDNZy*z{Wc&W0i+@>3W=>dg^{8Uv zJ22YL^9<)!bt*YC?_1OC|EO`3XNaUJXQeh|SEksfgrzw?r^%n1%^se)F0}s2;i3En zxW3-@Iqc=gG)$Wdz>D=pD^9N$yup&D+?h@iYS1g9x&ntj>%YzsL&pYF(Z!#uhe#XGct63t^XNroNm~IR`}W! zmCd6ldS*9Iv6Y{ycp@-w%!y>&d8%bHGG*K}*lp*7;)`IiHzBVl&-|75U7K?f%=c^? z?Xp{B3kO&qaO)OPy!G8ye3NswhOs1<>yZrxcYe9s#!X$5g^=-a7kHxE{^|uSAs!lXik@1y>L3uj!7Po z?Xlxs#BYl|T6H0-nZPhvvC=`Vm`FV?dOz!!>FThEcUq1Qv*V2OV9V96~4i&ss9av-SU+lXEa0;WZ) zJL;Rt?Opiy48`c*rH8^>zJIC9M96TehKVz0(Tg?}oj`K04S;?-21Go3b!i1G#* zt*7SzBe(T;$#4xmCq@H>dU_RYt#6zaiCKCB4%40)5hD;ff6q| zvR{#dC0f!mzQtPMprI@7zl6p%+Y$<0J;fH~`E1g;!j)+2gqyj0F8j_~FKL7B6gx4r zN4F9ElBCDPTy0~kHMFHh9|e{l)jktBmhVUW9n7{h<-zp(FQ~k5?2bA;ol9?(?PI(K z2myUB(y3AWCReDXK>K>#TO13a+kKzM-iC7fbx!q{j>9cOcr9X_2{_lBW0g;Pv>=r? zK$^WXvu{b8Wqxh%nwidZST@T!97G^__XC?p3p-ZXUcTTc7h>zLLjj(-!QbBG?AzrJ z(8?>3wNE+1I$KdYf+2s{(w}YH0}OvNZO!0sDP!d77*lXc%9$>L()(4DCIaMCls!{P z-L83Q_5%}gTGD<$gY-!mrnM`fjeHPw4Gj%14xwztD&B%a5~vzj(NtsX-kM%#BMn~_hP zUFPw&!l-BqFqHy9HDV+z9jK}wKOQOf0n_+x44~7C8Q=j80Pn@ul?Ow`NR~WrQg3C+ z0kpF5`JVmS8~6T}g$f<^G-%5Swq=tR7~xvXXGYT?Kw8V)#U?G)&}m?+JNb^%-3cG+ z@BZ;+Q%IISd$YE88mqE6{-^)nW{DYW<^j|C6YNU1C@E>p zF8A4&Fw}CKzivz*gk9p9-QhG0reIfz8Nhtc2;T56`=&t4wWX5qA}{A@J#~S3JjWe- zxlXOfUowv027i7+!-f8r>C2N?#j0k#d1J*mkjsiok;^Q@1|VZ_VwdpY-APB^LQw=0 zO2oaM^38Nn(08gBm#RpjJesc&pbP6y@41M@Jfy*rsqf$4Y(c^(G^sGHgrVyk)0^u= zu5E~E6mmOR#r!0rrnVEC6*u31!eY2lAhl*GU_8YMTLv6dXNdQC&i(>iFx7#1mwt}^ z9OAKlOJa}52Lrk9>OZ*!HyL4hu)qiMDiMmmBs{Q=o38?3@GaVyw9WUaJMO&T)Qta`_MqK8iKnP3DExR9SIlNBX5Sp73=9et4augj&sB@PX7Z;n#I{ zz>AKQX2M3#?QJA?*)U#N569TntK}8d4&qn!a%U;3KKt+Wk}Md`$(_cjGe?|6q&NZi zyv`)5ydl1rwFLdF@$k!@^_l&^Gz58aj0gl7PIuW{QNT%T@_*>z^X$S5hlbH$KdJSP z_Z5NZKiw8TRW~Ec(P-GxiX7K19y_)@Ib%R^7d}CKX4aR5#Fd-f#jH=aWkTN^+ zj@M&#NhBk&;i}RA^YKePa9h#7ZG&a008#)!r>v z>=xXed}Zhv(wNCY1_=w<>p)CpWt1`v_ijVs7RCw@8~Gyh`p zHl)f}B}tC3O`4BZ$VviiW?Jm`?gjY3tb zXc%l{h@iO3L0ufoc{DF#rMW8$0;b?WBz)V{M`%7gT9N)57X{ZA67v(<4m3gjGOX6e zlFfn}{PxyGIpVmTx@uX_DvK*a$L84io+=-b1=|+;oLoJpyO4)mB^hgcnWX9{e@q`=Np-r%QS894|NHql1O@7_=~!4RniXK z!cuuO_xkRS#RIXj6raegF3nym`KKtp-*a0}q}c>w2-7tW>d#kS1kE|Ywg$4$~`(&2<^q|FfA>^Ie|6mdAj=zo5z=+Kw2 z?8it@1kjt=fgcrBJNmv-^RbHJh; z$aQrET&2=ew0lu<<}N#H{~Z4O3r6!&KzBbKqPd6hdD5D>cKySs9w|XWUSh|@^YZwV(#Bs4#w(<^;3SI`oMs-CNge)y|ymW zmd4rVua?eWVoG?G>F{jHl1@_HR7s;LhrwxVtbGbX6V@~^iCVMX!p$q3go^FG4aS^=IA2mYor_2CkPJV| z{V|STk1)~^;D}VV7bSNMbgm(K( z)3gUrfUR1;Qn*fe!x-A?eHpyVJqoaHSz(3B68$shR%SJ=FYF$c}gzfeW7 z138UWOyl#bh1fHbr%>1FqSp$MUBj}c?~GqcJ9xK+DdT8P-b5u zgYHgSp5x{lhrcE53uy>1=?t@8&fxwW4Lb2olg$(B;y821>Zl4NaMz}X7FE546IMjR z+Ai|G9JdstOzHEWyUCP)mb--}Iwb0mm(DaoIZY=4!Tx()qdoA=J|IY-Oe^O}vLACk2_&*i=gMss3R{Wpg@;LuZU3u=pKN|jL zNB-Ln_}{J=zsd8=yz}4SPgJsCe;!x)eWvGMiGSVlzZ{kScBB836+i#~BN6|TU3ebu zzwh_A*8EpA!g1iL&=^Q@)^#QuR%;w+Y%u$y$Y;e?^{;!>una9tHrmHxQo0>?ymw{7 zUcEK~B}&h5(`rRXJ;1-0szm4{mS9nkw|I+(8_!RR6fcILn`lEg;xW5%;?8y@qIJBq zvV%k1$hCNLE0CjCJu8d>Aw5x{JgAiQsgOkISd5V=pl}tUK)<$R86w3F`=KAZ;}L4& zEs{fpR;d-$3}gIxqWVMBnUg=u@{q<Nd8S`xfF@M{c|!M{Wm~E%{94Dl4S|GJ6(4bDLeAC*w2VX{`lc-j%lW+(0 zjT0lja0Gh1FNvkh^!aFr;`9XYl{D~la<2)c%1X=WXo{o|sD^#MkeJP8j}~n#>b9fK zUd~rTzkBTu3qkK5En!K>rN}8LT9m@IttuGqSR+Y@iJRNn++4B#lpJE2{CLNltiy1+ zqGz;w~`2YX(=1jf^OBvUGLFKIs}7Vq+y< zqOMe*!sw)#nVHS|YT(x%6ciMhxDvlWXg9H>0}-(Fc;?P#2-3H)S65ds67%S&%1fqU z(1~NRrX>n0YFU+|z5UVA(Zs5-h=>D?v6mN+aK#w}vJx6r_yy8<2c(1#QQI(iv9=!t zBSmkRu)qEBLU92E27{fT>1fuDjybS)v$BdB?A_hdd@>^7@QX9$`a$C!9D;(Rif;^) z3_4(3WL}DWj9c<~YT#2?IxEC*(ARt^c{IO($Bj8}U<|!XOKM-j4o648u<>(o}FUlL0 zZwAJuhEc#zPiqz7ZeqMg9K$oBdQuG-C*LzNn`s_%Wg7@GRWQOI1~M3mA-h2B6`9&E=qGsuw_fZuvr z+K2cCxx_1-fh>k1iR$Z|^UKRT6y=&{fWN;y*p|E^uW5I<;lpe*(B7utp8+~*-U+?5 zsdUBdcK=g)6=vvg&lnU?2T3u9xOeyv1p|evQt#s&PZftBU ze@0H=Tx+I42Dg`v?~nqKUOS^tp@k^rw!D+T3lWb`Ruk)u>O?+9B?@D+@@e}y zCNi~lDu@^?{Ih+z{*&R(C(G^CJ7t0nNUPUGUn~HqhK723IA4zngvU+1_UZ zvJ@V{f4b>gxG+j=cizzXoqV3m!|$}G+h^EAImNryKVga-G4E$2hL{L(O2Fwj?^U-y zPEKS$V75#an$dElI-nCn@;cQ<#>Lr(oFYboun0%fl;}Cp3f`c+Ss;7r=tpu*&~~jn z9K{facqkf>~@Q3H6%~G|*`Nl9Q!)GD? z(m@kQzjiow10D(6>({R#>hHh>uu~HE{FYu?UNi`G&x7|nfI5zN{672BuOHq>ag3l+ zddI^KxDxIwDDl{fc*)pT)ar505Jh%Q#FCRP8&e~<-0F2zzGE!p^x4!8a(cDmXXaRd z@yUgeuZHOG7Z88C3LG>Qe!bO=BieK6GlNKN$MhF@F(HV(SbH z+X&BLXEerMmh${!>n9*f^&6y1+fT76_aF)&+d*M zL6lUa6Rl{=AW5*@{WL$&zm}bTEoCwtFZytiwEniWFpR|Z zfb>O0x`;>^$Y0Ug4wf9q=H3(=u+dMQbyTi0Sk}6(sqyX|Y$OZaWlv-M-m{|>z#RsB zUInlqo2Jg7dBM1W8y9<18+Wz){X_}J6kbyki+a(0+ut|D=Q_Iu+8Lq7V<|<8nK(-g zwy%B`1Ked(7Lq|~%Z_a~#eQErdrQnhf*lWsfb4JCSFPNXf+qE$L;`+~_jMDYBWv!z z29g+OM>xtXR+o-7!HAo$1UO^HJ8OTQ5hilGlkTZSxQ{D|n5?wB_y>U8xeRhKF7I50I?Ii6o!l{q?#M$nqGUUxp>qkevcoyHE-%3Yo@dxd zZKCOLgdpaYY|G4tU1gi<1x+!`B=Ba6xYP^`ILM4Sc-%o*g5&LGc}m4aK+^VR+nWSSegvIP&6#chfz7RlRS==G&;2>e5u@kW_Ltij0ur!bV?`JQf8Ts%wM&g1{)JzUFN% zRDua{WeA}KCh)Y1P1na{UP|BVv-iTw>cJR7&|jKA&#-kJAT6#@iZRal9|m#b@4x55 z=EA7vB353D0HE48<8yUva0?5yBi|@|ciw*lziM!uVLt~WCZ+x6lu5UickK2b)0XoE zcnq*`iLmJ@vum|<@Z-FwafOGjE;eLX@7rFIVqWImC2?4ZK-G4rQ0y@uLv=9$6Faw$*sRY5cR`7C$1I1f7U7R>)81}4{0kv@|#hw*O@|p z$x`}kM#-MNE-&y%z~|6R{bSmzbe+u)p^k}JlHoRBwg3kki_BalmIr-f0HR~bgS+dB z3SkN%FMk@l4jAsClQ_>F7ywJ2F`T&7gBU}t5ui?Q81ZIMfSD403p0#Ajz0qvEQ*X6 zYh|sL>VKYMr!+=t|N7myFJSleAcfPKAqPZPwtRwp%X!M5L_u$td>(M4L;XZ{{vu_L zW8QL>sZtXip+>33*N66kg#3F4Ol!^=tbUGjU_m<)#A_uG-!!P)7!A@#tHNXs*Q4 z_lY}&U};1d>j9V%w;tfP!ebyQ!eHu9D9P-dcRvn6+{0ixZC>`g2-2a ziU|d?jer1BwReBy zUEGn^z28jBm?(4xdzd)lM@d$G4oeR8WWn5kNc6 ztjhLjbz!I5U7ddc7q+ySQ^JmWoFn{N7@OJ~xw1UNr2m%D4MDWr=z!!uo#|_ZCobJ>S+K!6h^vv`GjA36=z>aY&Hh5ZocSTjK-|9!SvO zPH+nW8h3XK(6~!u!R5Q;_vWql=KbfbnfJ}C$;xV2x0~Blr|O<_>eQ~i^DG=s67nTT z){TQ;b^~lcw@s`#**~OE}yX+6m~5jy?J5MWau{=VC(FIFL*bPnR4D6K{y4 zCNid~dHjYpG%Y@in!`*`aNpT87R&S7r$0a2srY zIPN($Rp22+R@QV0I~Yly!E$^1+nHYOyvWHLGWlW9$ykm3=8ydybEfo&*_1E@f#s6i z208pSD(zc|IJ8KP$={2K<$TC3|0b6k@%&AduRgXa0c@?2jdMS+E6_d4b3?5c(cymi z)xD96kgyQFN5&P!FJg?j+=tU;pldrj70HQabM}4P2rarU*F2M=K zp4wZB=)x5*iTP+za-wO^PsS#AGQd%^kxXA~(NremtkH?@rdR&5CH@R6PTC-oqi4W+ z{fbRTto{h3d*bzHQhoJQ8HphEx@#t(YlAW|?NeR@L=9l<5~MQoLo({4X6lVu0Y6O4 zFsQ-HFWzzq!R@wAN1!({J1C@N@?PKAyeBT*-vfLbt4q(iSeL+jmWz(?nB&N~0mwv> zZ&C^bYFnZ(UW{7+{d!`~uJfy$1~GCy%Q37hr2vo7GyMa5h9l08xY+n^_xzGL3)R<= z;=^+kISpWczj--vMCWS1cJW&VD}GOEPJjg(2|)=F?id~Or#pRo&QYeJ2fa@$5J>W5ik#oZkAj>E}c)6Ivnj+7++y0_h;B3Zt2lBNCqT&6K zDTe_e#a@+S8aoU*95T4qS9nR2hZU}*0ynp`T%|_lT(;Xh0mXK9Om>B%s<<}^hv!qX zpiuaar@R{&t=fhKq=+uKVKB7r&s1bfgB`EW_OHbTjJu=ICc`d>>&q4HW&1ZZIB^NY z?AGMP8g-Df*ESG}i|J@tX1Q_y#0VhwFwQKOP}KiudSL3Ua>U}%b>|;xB~@kV+S8t z2UBtN*$ist&?(ap1Z*%IhqU3pBPe{1i+EM%W*>_lov-SW8k>PuGa zgA4dOqnzDv8u$m(w2wfp1G2A9UXI$x>P{6kvw4ncCzgFH&-;(_X&Azpj+`B-(@Po^ z83A>m3f7X;n|Sk0rwve*3$r+_X8p9&ycZ(kwT3X3ZJa zCRKz+3D+>>*GZFlnQlY;n*d6xXiqUf;gM&lE`w8o{Zc#wnLh(~#>5+F>fTom;{P1y z4G4US{efjXcS>yc(dkxpbeCYQ?ZS?|P&oa*ktx%4*53r?D5_K$CZ4K0i#iU|?}Uh@ zdF&LLqH*7wqYLTx7fO!PP$@KEAzJFxYkw#YWxu%7X-flW)}3qY_z+T;UHhA0x;80+ zTQgo3OVQz`qE(Hn+P`JC~rb8zukc~G)kr5mkNi5tF z`<^d@`N(drpong@C{mY)aQVl$BP~Y<2yEiC{Mj8rAu6-jdTVe+TRDXzA2D zOOt-q_qoi~V}-wtB6_D`Am{VOecQRwTvq1{(BJ{ruX)@Yb(5Ze0tXK-H|a-IFG@x2 zrv^8{mzIml@R;k!xgH2zTsFc=GwV`EDds?4LGrb^W#~Fgob|QbizSlEAQ)})K)Tnl zv_Rna>m_19WLjZe1nzylaFmhrY#{$_#$bzcFblN|&HZj#!5ODqyFE#^7GBMf1@sox z`zGyTmb@12Sg~NP&8=(H$+Z#Ryil^UDp6z71QQvumD=fC@EZQJUw- za)eVp>7WQ)*?(ObLID>=4LpCMG_CL7hzsOmgTlP%%nQZ(h5p1qDt5NN2CiHDl?p>K zWOgaRbWI*vX)n)o*)$pdB2a1jQ6xm+JFNKIwQXsVx&t+JLP z4?`R$;ptGt$96w*eSq>5A!MWbsc$jQmyhiNkvVi1Ybt2f()ToJgjYV9<>Ez1%%rKZ z$Dm}kpHn~fbz<)p;YE9Zc)^g-A!M!{8hR?OZ;o} zYZ?agj^<)6%#k3hxlrQo;kfEq71bmJNk&E@oP2C)puySKeF5_6LN=d&(0@bo${$Gk zEpybNNvg@O_P8T(Rfjv4oym|Gc zA95QiCU`5$pT$D|gzfe&i2YZe%k>0@s7``~0eekYK)DIwHW5tbrY`S;U7iC7mX8$_yRMqRri`5nBfzK@Y#lEOlkK9MNlSw$(Ms$(^CPYbm6l1F8 zfx<8&1{_5BT0fG^ilIdiMCgG;9;C!x%y=y^+vHMadffnQ*3spQGu@8K4(zsTXe+#gA z>X!k!+PYgv_!Z7wTE^)_+5W#i0nE61Wle`|I4sEt|CCY?eUOO|O%e3Xk46?L!oEU( zSDo{(XH)4rBjE2yTkzZJA|}#!aSrWnWq-3C+J5cGHJmBn5SDbz609fFF9~o;5%6#2 z=!H~&x!9>XfB%$*6mOd(F3sHfZIjs5QPhnL>Ps$5RH??>vpMtFm(S9q$|&G|xW#3w zi#KmheyPa$Z965PN1;9%k>i8}6I!BU3&>Sh*!WaJhMXhPaX->Rn6Nj^oq|8Nhu~Rp z&_|+q&89N4j8dsSX~zk8oCcE!KTNu!N=sh@&%R+Ab27L&Au*-O7MR~2vQ6L~8F1iz zp47G#a~R{B(3=q4Es*P8toqAP9N3x*i|83maid*`Z*n?Xd5dnCgs*%2?VkY8m(>&# zniU=q;s-rUg6j>ggJ+873q46!JvCzNlpXeRt%VUIa(pCHu0YBjxMDE|p`AJNAr0pN zp}i905pX|VGr4Y+N@T&a(p(B!23LIGP3h!inxUf~hLr){16bn(K`&I__^9)(KCJQK zuYo*Iu*zlGCmOeW*?#bhNouHBO3wB({ANBW#(xxZPaN8FLNXQrT}#kBziE7B5_2Qw z9)hRSR+<)IUCt3VE&Id&oO=}aa0{45WBP~nZEv~_)HFUFLZS!zs&fxsy(1GLGl(1y z%dh1igp(T8B7%ZS z;=0D1!-ME4leh^blT}MPK)p45x)NO#1_fx}#qUw|e>Lj7*SI&y$erE5Kcyj+1C1g!ly8O-0?g!k!E^JD89|rYN`Y zK@tr~WbcpS;%H;23JKMDU|Uo^<2s^)eHzo#FY5zJ$7@ z5tQe`PXVf1p=#^v@-Cy=uzlX2*cA*sE8t2K8a5PtonjU0wv*R^QYT#p<@;Au?CCOW!9YN*Ta)I%#1326h>VrrINdsiD}5LT%z#W zsb0q$$KIrG)&1PlM(QbW(BqG&E=PX}98Uh0#iZG#NvP`rb93FomuVkvi@-E-P+|BcEi(qGNd z|A}#Z0Fk2%-M3q)Go@xc|SpMay5k*ni#OB}nDNpZtCEnH)3l>nE1KUHng) zssH|w|Icjqso4S#_!f~Ti!qqMPcO*_OjFL^Mtu5j#`3@K+C#JdwXOf3^{)H;;ZFa0 zpBNnxc-yOEfQ#RTkmlSgg>F#14zVIE2FlVvjwhXKo5Pq7w@Y#-4@mz$-5mqDS?Y45XOE-g(`qBCifIk zlxI=Nfo;BzA`T0HX3=9ke&J`4%?8s(jVA^7E)a4=76Ky=(C?E*AcCcDnw0do4A7 zE}vm>4H@ehNey-Vd>4KRZBNSIUxM^@wOMJnwy(zL$fmkj()?*`=VJ@4@T}R`m`CYZ zfkur%Fd2!@Ms^xkYthY(jNnsHyi^u(bGt|v_Kj$=36*9xJxdqTp?1V} zbde5whPkI8q~!$`u;S!b&41?l6)R>nlyXz!iJEdlTG<=X2z~xY??Cc8&BjbAk`E+8 ztv=~2&4NDnH&fx)BTwbPEVQfH-?gPdOc z%c=Lvr8BJxqj`?pQj)%Lb*5(Aiybo*Tjg9TuP`P(Ew4CbVP>M>xLHd}JJYHdUaO?U z(*bq4=##!L7a4<8dy?DtSLlZQ{#jTjy-JMb|4a&zA!*i7v-d@cE;l#VV}MamPR|jAM&#Gf%4{|h3cGJ$p(H4J#Vk@`#*xnun);<%UXjS>l_m)*beu|RovTPilf;ph`zvQ zMV_>UTkAi#uAJv^fvJnY2w;Anf{>p)$zlVDk0&N4v5tH;BhvWyj8pp|4ykCqaY?a)_*kj&LAPfZev_@NMlKmU^ z>m%z#FKx?I)oq3A5;{Xd7bDG}^EU#S&c*^EmPlpK%TcQxsu!IO@U4;7M*+2~%avX2 z9vg2p#AoR+{4$bfO8NLZ@k}YN2Y>VH%W~&U3Lz_A_JO|s zDNa&t1`HyI(_6zyI4+Af%k{SoiI@lx#INfeLv`@x@2_*_HYvHrSe_e0FRXblF*Sap z2VyYE*mv9bs^^8{9`6RpQ&)*ny% z|FE*E9!~r__E~jxRHzBoc#u<37mi-@RhTT(4Vj>EJZWz{`>1B$p+wrl)V);JjPw}2`B$_ zg|F{ebHdaxY&9+a>BNhp1qDg+I6m2~;QkNv6wbB9>Pb+{PDTbbDl$fL(K7BH%sXNR zJx32EqHJMH?(gkEWf)C79Eg^li4R?j^mpo2CcUvQPNG;m&kw-rw2R(6Zu~PXEg~iA zI7vqJQP2#ss%}TU(_t7ttOgda5C_rB8qgCM9umrEDl?(#fzgU_+sqZuwcg>Pw{owbfO+> zpdDxq&bai`c1yKUb%!SBB})2UiSCjc;3R0Zy1n3tEV&;XHE=1jsZ7gk8`w=-D$emq zg%w)S`tDv3M)zKfM$U1QsJG|Fe0h4{G#5v*A;tlV*x=0|!JrF;X}v-8#J=eNU1OEN zt`GlFL}2%t`9c?HB~brq=B5dM`jfWt3v%96<~yTLE+IJ^;PK62XHwYSnN@P%y6fiG za~BrG(pKC|dbh6g&LY+QaNvt}mY~G5oGaQAJC)5^397Z{IXTPEJ4T=BvoAE+o&>*y z@_Wp8m$v5X__!|B9(ZrioU^W+onU1OiXDr-GP87fk1HjuhZKc7D^AMyY36l9Usv-3!FveR+FbP|yb{LP3(0}UGzStpLfLsV;B zUQX+m2iC9sEW#9*N))H36aD-;H|>?v@$x<2{BO)|*^++5ui(#w9qz5V{%q?eiPn{C zF(rw-p_g_#G#)vC&P7#3(ZaTR>id%|p0N)p-upqPe1iJ$sMAyhGVr9QCUaY}=fNM+ z2KGu>@_L?aOBs-GyQV?2w# zl!+WOer_8iw2oIFHanw74RD`hCSEL}E-dMO8brg*n`POMtx|>?h9pmsjWyrheK-BO zzF=s_SL(Yo^&FoI1MkXxo2X-aKgeq(SM$cAZ+@E~b>N#lDSL$4OclYtfBCFrx-a2L zq-OU#Z6=m`g8P7WCnT{^gFTiYp3AS)*c|B`^~Iw&U()RowOrs z!KhK8Hh(*T!mm_i68gnucPiDs4GX};oc6^r7wO}6mY0~D)fX&f*+DY(?G5ltn1p)}Y0%9{?jNqeZX$M}aX%P}V4$Z(b$)A_(O`Ph zigvEjJYPB2*}GanS01$v2WX#qP%EzTRD`46Zkx{xWZH0^=;e35Gnsw`ML}Whw&QXOFUimWvS^+cu zsMrU{EJ;s<=IfK|IYgkF;geH1Msn3-V$-m{Ip7B*&xAAI^82&pZ+j056q7Q1_>nrB zU*LLeeD3C}e7aQc&jSMGA2KC$$~GTgX9k$~Ej!^G0&J8frG9d|bW;)fiEm*6KTbeu zTDTuSXtzAgxf4A0mHgcbSy5N_jQmKINe8b&IV$Xj@REIsXxWIEUN3&@w4jPXIBF63 zQe3NO#>cd`97W7eRgyX|wKht}adUG~s_bv-?P|pKXldM{1 zEQt6cq4v}te!wb9y050scpM<;+4iP{34>7!IeH1bV~obO zC8*HuhibE@ujy-WslY&0E0N%{Zm?5q^?7&J?j=AXHZ?ZQ+eX4KXTANHE2L0w0+nqBCLZLbz$RGdkHjVL=t_MV ztbt+BY;aB{Bh;1o0npPVw50j?E!?&axqX29FluIUQqMTu)7xZ!TDmtMCVnoKYbRSD zGl+D%C$JZRoaRJNqxqb!9TXxE&!($I;);3P!jbXagARxplsvZ9zDC63Giv~J7x30t z`5M;P3(WBW{_?B97CZDH#E&r#KV{Fs@%d{_Tz0}J3+Elz+;| z?7Axi7Q`|IhF`aJBrhA!;x=SKROJKbHxs=)J;F1&2>har8zo=?`vwlk+h@Dea41J( zUz7VvG1KGvyv$4h&nZne@JyrJ~L3D z6aLz>I`?(Jdjrzp+H{qxBMy4GG{HC(iD+blfYe8wZkD~5nQFB@ih6Ce_^+2=*XHDo*BfUM=^YIyi>rl{d(Bo zQ8)_i;8zR?uc}!rl4}Lk@@t3R*%dd(;T}0U4iT!cpe)I74JZ4#j#YGtwoJj7r3LeY zXdhZT6e1;B@K1kOHs>~Rujw$O%L_4Yf=3t`6T2*wlXbj=Oy?O!Vd6MAZ|oFOG{}w0 zW5U%A45-+XdEu@82=a(myG!Q%Q^hTYhc%;i(q`D8F9Wl-uicLp)OERrjGb={`CfVq zc(0HV1=U8Y1taHZ=-T8B1e!RtIps`M_CbgX+pBtz-nLeBa$FdhAKH$K^oTI$Jvw>n z&-6(zD+Tp^JWG2p?rsqS4k?@UnKFP9bYFNMNzRe?&rHC1!g6@g25iXvo=F1)aBBN< zUz~s<|8z1ZDe#9t%?%}2+~uk~yYT8J#>h~NC!f!VOdM!7Q)q;b>5cNYGsP!U+Vw}d zy)o}*uK553DTN}7kk;KgW1F;05gBVONUw6LQtGs*416ZWCqm;81ZbOa{c4!-4T%uC zUsh#OzufSjzBC$1%EBJ%l22DWXVI#$GRn*Fb2f!3e|VemN{{PvXbj%RFA)8`xpglg zjS-hP)L9rx+)Ro3kK@tzTDWLUoKi$rBo(hL#kI013aN3DW%=K|+(wUSFi2E2p8sj( zX+!lS?K394wQ={A`$cGH=C{XB5CqB;AtxX%kWr$2`;nql=In}^N(|H<{4176L4(Jw zHlFZa87}&bs7CV{X1%u5pIQ-CemnQV+(`9g0~an=Ca9ph@NRI?zzo+4`0!Ky8c=j3EL1V~_>t5Gw0Pa1ajvu6)E$C@tk*Dd|s}uM8rnS&TkOUq+W%o6$*pR68Cq!SQe^V8_p4hv2#KA zBml?d)?7Ds7ExB$)-5%^SHV=fl)BVuBYra;@rJW;PV6aG)}RN{K?MreHwYs5{qxw3 z!_rYZCK%f-+o&N|iRUxKGu59sEFVZM@nP8`^+kuEfe#T#vJwPS-_hQ3^+W8Pu`6Os z{QU}ajCOszl`8`ZC5YXw~FosKKVi#9HM$YEjInw1OF- z(!HuxWsU+C%|@!K&3EJ&uj})qrQI>Q>OI5~iOCBbFhU6uUw}dC*7r(|8S|H_D5Zb002uGN?bdkM^gEJv zs(6(EXt@m8^lTlp7G3DZtBRzY~9SMUoQP~ z>GG4AF(`&0c^VcqzV%_0N*OO@i)icjP=h%Nx60Dy0j_g+kA81~auDGy^x`P3SFY?W=XA790E7bsi1TSls`1;xuw)w4 zdd}GAgG*qo3Cmzg9=+_qz|WiDV1h4h!WOR*Ox-1Q=xL)E$4;VDi;51E?R8jnxpDmq zE6wiV_6>C2G)4m?JkK@X9J>KH_N$#<;HVCz_wFFiV(~SJ(6H|BI2i4FU*BfQCsNa6 zXKFUHm7P|T0CXb7Jw)c$Bpb%3AHJ>zLR#4yuv{F@i}Z7K<*?xI)?Z$*wVBS%tW;S* zc3?!5d82}jc=x1xKHB{dXZ`QQ7ZXpX6f%8sWp`(f(`4S3` z2lOm1FjBoPHND1E1K&Q=1qP#jdW!k9uBD95dozCnyhR=77BYm&e(@rhA^CR|rz{o? z+2ksFCs`q#x4+w(chXRG3xxrh9L>qnwdwlW0-J<|ZQdv$=6C;Uej{=reU%t%J;-ro|D7d+m z{00>1Ho(h5q_05i7&ZyVAjh9veV;?=GfbDaHdVQ?$;oxrn@;4-KQJt{_}5` zo$z~uV+xYUnqEb^hIrd$FYd2@tj4I@L9CQc%Fsa{09&GzYhI37T*^2JAPn>J=bTvoQDdci2;!m{bsRurh)W(*^ixt<>}|PW$)R;AjjGXS8T)3m z9+M1R!vB%T6a{6`t0~4Tw@g@r(YEd+yGzDL0N%3)W(@F?^nT?M)4<3z*Q~YG-2mrS zIt{aNx<~R2BTpB>0_F=wzgrts<$Go?IV!Xe-|`)kx`GiR4dX3-f&&oD41B>D_|;b9 zFN0iXv5Y@oRwCd_V4H0(iEQpK3OO=DT6+V`#~>rdiAcjhJ`v{-{0x4;vKOd@>uBU` zT0;` zgXr#m`8O=KNox7S&VX<=(hE+}&zvJ4EHq@OUKC()E;lU0#6Rc^hphz+cN3?V9o)a+LS!^0PjdD{q|QrS zG#D|7x(eG{#W4yO<1fHiYSZvdux4dkHy}+qN6M0uGnhIBXr+dyV!dTS{!I^@K04KU zi#k34*-K!QR7k#(HyZjwk7!BkybX=C%a4TgI!t~gS5Md*9!mn214n!8;vN#LF=m#oLv!FnJaN$=HwYnooOO)3^0YP< zYM!R5B=fp#gbr+`<1OSqFP9-dX8ghpL=_k5 z%yqpzs1qA*xj3@&u%OmFn5vNs*F5 zODcr0fs0Zp3UBCBY%jk0M6E|GU%fK_d-l7l9c*mbu4$wl7Qmscelk1#F2_^P{u(NL zy7qpU`}_P+mUihDE_^h8NV11;-zVIeOfJUTk=24sNvN;|!g*g*hVu1V{Ec$zTpjQT zJX?94!~KzU4V*Y#$U`K&_P{oWjZWI-l0hhOl|doOx-lK)l$}oB>LN@nDE6(5-7kGonRJROAi9{G0Z5vZtN1u*2yk zL(J%xVb3&Zxt>*d>|5ppx_UX+x4#?Za#-EYKP(vH0g`@C^-fsc(V{r(o-=^Z$E`+P zSBZ{6KM@`+-w)iA1kALmeiUoX9)A8qhLBpk^idez)|?Tv=PP@rTl z*smCLUe2d~j*=FN0j-0v(2rtb6fDCc)s8@LVln~Cczy6QXHR*|d40{VR^t{$NJe4F z3a|@Ve8kAi>y=tD2GYBHvcyl6geRbTx1|>7B4;P$v%tz-AA0sJjP`Qp_cag%-%$fv z7X#%FZi8h6H=4zIv8i#tM61EoCSy{11AH!Y@`YNUPbjb39Yah+?OfgZ2hjq3{N#ap z&!_NB*N(GPd$NFbNI`}-VdUeP)1pUCh1h{l?~R~TVe5sAQ)w}JA3ney}I8YZ2UY!MQb9wM0tWvma$577jayP-->eHF6z%*7`%dB|sG<-^d z=s}h|>_H~i{tf>zTV)nv(mMzXxc%C|+h9_;aSL zq2kX@<+;psz)U*ttXX()J6T`zlLIIJHu6ota}DmgW+P-pnWqNx0uI~mlE(~N(~G{e zPVo&xrZDmyYeB{`$adheKfhdi)=G#RI+^t&03$IrRYEeGN)ib91_5 z{>H0%uP{n^gOcHS%;)=cpSfy(ckq`Y15>x-ee=0qqXe zqDw^s&%-Ud-F>u(6`nbi_Kr-|Ry^{%oDoCU6qs7oov`?+%HX6DVNLrf{3xv%3u48G{2*I1rlw-Q_4vP5#zdo!q`7 z`#xuS(x2wmyL~18u)9I4Lg2`=^>g^MZ>G;`;EpvGLgbVYuL`G|iSr#&YOlVH$tT-9 zdTQ^@)Qo`jFGOcEmbgtOe;gr+^SQP9gK^_rz|8!G^XD)h#=j%?6H(K%x32()=J(AY zByzmE5=3i=p|CPBb1Y{X7s<{1@gtCD4j~XvU4)QBpJ7KQbh)%o$<;&)h-Z^4Gi^ow zvP3kT^X;veJ_mka1I&Dlx-VF+K$Le#=)6#Hz`>yF zO7B|(aQq`t_^C^5umaz6~b?>j_dBjM%=<#tOepvU7{wN{lvlJ+umM#adz3^|juOnu3 zRAqi5pHtp+8sGsRGr=>H`8-@~(7fcN%?iG=j&%l+g1S8dp`VX}_tT$aY+cEFL_Xlupqouq^qN+^Uo<+7RLc{BB&W8j z3CP1vA2;>4jHaPRMsIU=ou|v+D!jDfr22MWG0uRm8+&4jo}l8KYWhPr5QiQGE+OVl zt4aS(oQk6P_Q=ysc1yq4l4XQ}6;UqvGLBJia+l(}iH#*zY_N2*-dPCZ|$+WaQ zR@_&{J%l^<#76c!e<-!J*k>oskXo>nIx?t$K**jzIrRl5aa?Jhc$fV57BLzV#hbm@ zNTqs)9`1J{>KIauheON=Z|>yvx3~?~aM1~@G)!;)i;gBV_|J*Q(SCy*;l0t6&*BdT z=V~Xoyb^1zGrOV;E19|rhajh{Sp41d!N+|Vc5Vik@e=ghy57!QpY zizU~0j9jmFJ*qtS$wInioHVN>t1S@?Pqap{?O4m-U_Ra zf?CB{^(PV#X4`Ch0{oKU4KQYU(RP{A$kt;N^2s1#^cUt{viUTgXNXBgx_5q$GTYt? z^9I5`j8kXZgP6i}9N~u1s>-_j4x870DH^}TpU6H4>PbCNwYOXjUixef3Tz~^ATTFRI9Tq4O5 z&7mzb-D#T#d!tXo%Yaeal6apxW~V}5$wj^2opr}3VD};ps%!TQEuhOI!mMyuy)EcmA zxdt46pjtDvekcmGe`8W9-ve910t~1m!bOA`PP6Mx%-~8tT0{hAGL7#2Dcaphy+6N< z;^V|REYGxAE zDbMC7KR{7eE%#1BE!rw58~s)!hBG2FM*5;OzxXjp)ER%{EA9B{UqW~O{+-6iW7jr6 z9-N#Er;8_>J~I)A>|3l@6i;U@DE!a_zp}Ehu1%9CGz;CO^Kk^Wng4E+c`h7yj@q?+ z$}k>B`w^ev$+jDz#o#F{+bbt_d(39b>krpbW#AVHEVB{=qZ22AiC0|3i~EzkLz3Y} z?U5N49C;BeMX2#-=9(!LJa2VhpSG|^pXP3b++e?#b6~Q@C?89(&$n3uOJfkY5LZ#? z`OEGZp|zyibZE2l-*luD_d~Xbd;mS*z~S|HwK_zuh`xaitvO%r4|YCQ6*XRTm@Keuz5b? zB(@RH<7pOzSGuh$)6%j;lNIqRU?lj@kE*UrpdLltn;}3NW0u89nsHi#|iJ$(sN$K=vla9qhBL&cI z02SZ}q~}C{I3+#(K6f|PzrVl#f*ZibWk7)!#hI45`T56a?aQy?3+MKO{Tmw_FC6}l zckQ82QfxIfwV|OQnU^e1?2uSGrh&vpQh=okAY9u5pL#UD8eU#D)cLXP43M3*3)I%u zI)nnv0f4Y>=K=WT`2jiYry=@$U=0`C%+s4=sA`8Yd1uHsd8 z4wRRd zZwue~i_{(kjgXJq%P zPqVL=*Ss}%?a!Y+Bwy&HU0q!P-nH7f#`^kWe&xSS0ABuqI0M!J{{6$>_@7YF510Ro zitT^7@E?dD|Kpwh%jf>fh5vhhcqc0Sy8`7o5)wYT*cto2$BpRY|AdnL*PzvmyT73B z|39F?|6q>)LB{@{8~5q2sTq$R8YeO+`0(0~^u$#OcgiFq`oY}NZ{;OQ#SHxa7rQ_n A4gdfE literal 0 HcmV?d00001 diff --git a/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx new file mode 100644 index 0000000000..4ea731b875 --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx @@ -0,0 +1,28 @@ +import { PluginSlot } from '@openedx/frontend-plugin-framework'; +import UnitIcon, { + UNIT_ICON_TYPES, + type UnitIconType, + type UnitIconProps, +} from '@src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon'; +import React from 'react'; + +export interface Props extends UnitIconProps { + active: boolean; +} +export { + UNIT_ICON_TYPES, + type UnitIconType, +}; + +export const CourseOutlineSidebarUnitIconSlot = ({ + type, isCompleted, active, ...props +}: Props) => ( + + + +);