From b03df9d4dcb16ce5d9cb698544bb3685dd86dba2 Mon Sep 17 00:00:00 2001 From: Fedor Date: Tue, 22 Sep 2026 22:29:58 +0300 Subject: [PATCH] feat(projects): port activity card and card layout to production --- docs/project-cards-activity/README-prod.md | 17 ++ .../screenshots/all-after.png | Bin 0 -> 47687 bytes .../screenshots/invites-after.png | Bin 0 -> 34457 bytes .../screenshots/mobile-invites-after.png | Bin 0 -> 23554 bytes .../screenshots/prod-dashboard-after.png | Bin 0 -> 20148 bytes .../prod-mobile-dashboard-after.png | Bin 0 -> 17556 bytes .../screenshots/prod-my-projects-after.png | Bin 0 -> 17784 bytes .../screenshots/subscriptions-after.png | Bin 0 -> 46102 bytes .../facades/projects-info.service.spec.ts | 77 ++++++ .../project/facades/projects-info.service.ts | 36 ++- .../project/ports/project.repository.port.ts | 3 +- .../src/app/domain/project/project.model.ts | 5 + .../adapters/project/dto/project.dto.ts | 3 + .../project/project-count-contract.spec.ts | 51 ++++ .../project/project.repository.spec.ts | 64 ++++- .../repository/project/project.repository.ts | 51 ++-- .../dashboard/dashboard.component.spec.ts | 5 +- .../project-activity-card.component.html | 25 ++ .../project-activity-card.component.scss | 82 ++++++ .../project-activity-card.component.spec.ts | 88 ++++++ ...project-activity-card.component.stories.ts | 256 ++++++++++++++++++ .../project-activity-card.component.ts | 36 +++ .../projects-activity-placement.spec.ts | 28 ++ .../projects/projects-presentation.spec.ts | 114 ++++++++ .../ui/pages/projects/projects.component.html | 9 +- .../ui/pages/projects/projects.component.ts | 9 +- .../info-card/info-card.component.html | 14 +- .../info-card/info-card.component.scss | 56 ++-- .../info-card/info-card.component.spec.ts | 37 ++- .../widgets/info-card/info-card.component.ts | 11 - .../projects-filter.component.spec.ts | 21 +- 31 files changed, 987 insertions(+), 111 deletions(-) create mode 100644 docs/project-cards-activity/README-prod.md create mode 100644 docs/project-cards-activity/screenshots/all-after.png create mode 100644 docs/project-cards-activity/screenshots/invites-after.png create mode 100644 docs/project-cards-activity/screenshots/mobile-invites-after.png create mode 100644 docs/project-cards-activity/screenshots/prod-dashboard-after.png create mode 100644 docs/project-cards-activity/screenshots/prod-mobile-dashboard-after.png create mode 100644 docs/project-cards-activity/screenshots/prod-my-projects-after.png create mode 100644 docs/project-cards-activity/screenshots/subscriptions-after.png create mode 100644 projects/social_platform/src/app/api/project/facades/projects-info.service.spec.ts create mode 100644 projects/social_platform/src/app/infrastructure/adapters/project/project-count-contract.spec.ts create mode 100644 projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.html create mode 100644 projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.scss create mode 100644 projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.spec.ts create mode 100644 projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.stories.ts create mode 100644 projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.ts create mode 100644 projects/social_platform/src/app/ui/pages/projects/projects-activity-placement.spec.ts create mode 100644 projects/social_platform/src/app/ui/pages/projects/projects-presentation.spec.ts diff --git a/docs/project-cards-activity/README-prod.md b/docs/project-cards-activity/README-prod.md new file mode 100644 index 000000000..f3152555a --- /dev/null +++ b/docs/project-cards-activity/README-prod.md @@ -0,0 +1,17 @@ + + +# Проверка переноса блока проектов в production-ветку + +Ниже приведены браузерные снимки финального состояния. Для блока активности использован Storybook с кодом текущей ветки; для разделов подписок, витрины и приглашений — снимки проверенного DEV-исправления #368, перенесённого в эту ветку без изменения разметки этих разделов. + +| Сценарий | Снимок | Проверка | +| --------------------- | ------------------------------------------------------ | ------------------------------------------------------------ | +| Dashboard | [Открыть](screenshots/prod-dashboard-after.png) | Блок активности справа, заголовок буквально «моя активность» | +| Мои проекты | [Открыть](screenshots/prod-my-projects-after.png) | Блок активности после кнопки создания | +| Подписки | [Открыть](screenshots/subscriptions-after.png) | Отрасль не отображается в карточках | +| Все проекты | [Открыть](screenshots/all-after.png) | Отрасль не отображается; фильтр по отрасли остаётся | +| Приглашения | [Открыть](screenshots/invites-after.png) | Отрасль не отображается в карточках | +| Мобильный dashboard | [Открыть](screenshots/prod-mobile-dashboard-after.png) | Блок не перекрывает основной контент | +| Мобильные приглашения | [Открыть](screenshots/mobile-invites-after.png) | Карточки без отрасли | + +Во всех трёх снимках блока активности браузер подтвердил размеры 156 × 180 px, исходный текст заголовка `моя активность` и отсутствие `text-transform`. diff --git a/docs/project-cards-activity/screenshots/all-after.png b/docs/project-cards-activity/screenshots/all-after.png new file mode 100644 index 0000000000000000000000000000000000000000..89adf6cb2d26247de6957aa307b22d3a9682c087 GIT binary patch literal 47687 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�zH>$EjEx%U@$VC->&PpY;90W_6Z?hIt(P;9`zp=P$y zQB5_fv#Ur=rkiinxijq*ULC8sv7-SdZJiTRh8J2@kp=&X_;YGDj?#u~xyb99PD%J^ zBc(S+N_8sC1%P*(wpn~&9!x#{F;HFs z77*i5Y!iPUqwdsmu_u{`0yxx&TQRm{7lpeD+$EL&?V63qHuJ!%6j?6|+)l7}M zg^2Wpg5AxDhrhMuq{hUijNT3p_z@4!^o0ASVHrerf5sCX^gpVXc%|SsMNNw`Mduf0hH%6~u|u(UuScLd`h=+H z`ThWqBR>zLZ5}y?yb>d&afz3u4MXe9tIfReX)-&-GCTJCryk@Gt%4e33EE`B2@aS& zsNC~q-Y)Z3p#Kft*Z<~u)qZGUb*adZg?yD(v{8VUFUy#OXd|?1Odgp&>}EvUZDL&e zS6zQM$anP4y_*}d#ObEkX5E*RybMdOL$I4kFb)|=-wTO4k9InEFyi?doJ*a)w&MH8y@Tx5edCJ0>2E z{8nX*nWMn4Hz>fvVV`;%^7={Y^Q;r9mbQ)CWs)>f_<@ny?>4&H{}SFnd8AA$vxSsb ziG0QVfVm{HJMqAdP(#19MM9Ln&RhyNLkcQOA2)f<*{c4X-rt&c?Oat_rm<4}uIt4- zE=wA6w>13QCx7>${)3;&ACG}J&QV?+`{EDY{$DTp#7}e#LgR^)<#coc-pS2On;c? zmqP<43JE`T-q){jP!=Y>HEkQpb2PVqAqX&h8`kP*5=Col)Z?-#@DngIYks$h6yk-_ zeyp66Dk3n8?lh5wUUUHcd(1KLX8!JK>8W zDLw+;au>wzP=7a4+|3<;?djfiN`s7puDE7OA%Qxlj1sUN(}yB1fy3NyTC%`=(^0&kd4)P z)M#5g)J~vfQg?gTES_PL^8G?tN0E|+t9Gh{+*p21&&ueEA;{-t=oM|4%=N0RidcuX z^p($+M1&q`+NwUpL+&wOBr|IW=9cu&sFR0c=M+9213nAQxc{@hG++lAb#IDNMlHqr z*kkUalt)&*&=y6{dt@20&KT|REzV@?dEwXfo-A^X-};rFnfwMm(oaCuI#>Bh2IYMZu-i>c&o}}#uV@wQgKns z{=}Ju1}y41a>s?GCIj@*QR#QvN!U}P9hq*ywZa{ zXvG|di6U&@4>U~)i3o5wWiVy@A$x9dFAp|mx31{B0->FxLLCHGIR4@^%P-UwVs zq&uEdI%XB2ax-|B7@eM-x8QanO~&#qv~`K|qI#zJd&3&DA%Ok8Ayv?W`clvON|=NM z!TdJDti$R}gyd9#(qN$Y@hnq}d}c$?QZNMSJUBlHP9hp#nxp%c1XHv***-M6)-9pN zorBL{PQ>a`R_lpc;k>$WDAlmsAzBfVxiw)>1U7}~7T_QPW7QWQQ2CcO4E-ClhB4A0 zTMf6(i8>j8S*S2*ksy5iO^LnqjjroXE6JU(&$ihmCi=n$3$`21i0@bXj7sRec32_* zftM7_$jZ#ok40{Npw!$(f?Erfg!WUIQ%!)u_NP1Q*RdrYrrDb*mW)xFwO}}=d0KZu zS^y1@PZX`5{O4T%(%d}XH(F4^zTKx8<&cMIetju*r#!BCvt+64fXDjtH{BcfMZbv} zKi0>1U-|P5QIH(LwH~tH=hS~894>89P&u-w^4V0LXWS054g}~P8!Tk?&p0PV&;M+8 zS0yF%9wIhc;HM8OzUaT%XD|WTA?EIV`Ab}q{Kb+1et=|W&|GPlVM|1ZzZU$3FP0&l z$ioy64$glrTG2^fJ@^!l`;<99z%aH5)9DIuC&|XmXie>TAp~vz#<-FGVj;E}_OR=q zhV)|mMO>Zu%5uVLfZ71?2lvcS^t06u`M~cPjz|K<#==XPfz+=ZQ1K;nk18AMa{4yO z2|;H9?NaP7c5BWvT&_+}VXjcM$wlFFxpQa`xXmaV9F63tWc$o}JnhRsez}gj(`ESe zyA^{Nb=SzncwLz#wY!5LO$y2rVq|sG!lza-JgrDk;ZN%dMKOxgt(OM_Ip6PVoTA=i zsn}e(vG$~-PXGlB`!OR{X4Ch#5QaB83P8{l%k4C>vwhMZs3=_T*c0U4Y!`{&c=Hz9KT001WNq zvCsYrlF}1LP0KMW`(=i|Lgvz6O8*KSGg!J8F{^F-rf0;rvEPdAar0QMbvI`&mO}D& zn~x;+m*aNZ{Oo>hf8s10G?9&8mc|!DMDhJ&jYq((*ujEFX5+gL&ZkAWw66uqX9kI1 z&Q>`T!}aKt^ulP?+{y!;+#E9U==xIx$sCt3-=|#8hpB*Mypc^1KA(!R z)sUVtwvzXAw6CBbbvtyo9g<<1zUkZBY~UncU9(eIeSQ+f3M>eSQPb*lw0CuwT@Iog zXqhT>>tz_NtKELJ=$^1l90GVO%S5`3I_}x+Bi1>_jY@uEg=_MbdQ){PwnO~V@v!oILNr%*9p@K%R z4~e!G362dD-dxyvqi`?O*uF$gd?sgLmQt9j^_W~Vm}XHd8;MoU5}h0s87viFmg1M| z=fB=j8BkZH7g(JW0tZ%8f5aDs))ZAM-vjV;3AAv$Pwa{lj}sAJRB14TZ6LsN*|S-h zYOVdqn|_GlOG3>>orbovT_r?}jdYc(8_Z|1VlDQO7fQLNMU)+H8aw~zxP(*GQejZ) zr9&}BrTwGyb&REAw2_g~w3+=v^)q<|+yGLXUnP@~I6c5>x?FV=)yvSz$%5L(KHOx{ zohxHD6M8+4#(Xi=D!0fvF|)(=WGrIaE-)VqC(|NlGPMR&h)^;E*6bNMFG{+8$Wpl) z({ia;-2Wjpc~8ib@MDqkQp~picKfgYf|CFBjn=RBDC<|ueEsde!_LvokvSuX(f&ZU z3gYC#e}V=57ZM4@&c3F2A0~%CGYm6yf z2EG)9;is9EcNa)kvpodc2k2E*!V*7tCqOjw6aDHI8#FFYyP8RHFXl4*G}0T5l|5A; z7_FW2?E>&%V464#VD3YGnnRV4L6%hlb~&1R7lB9XH%6MiextqTa*TG{1(p-8HO!HYl;Rd-hi8hWRyf*lsRKl zamK3154#-`p;>*}v*M1(>*})0NLo*rvWgE3I9D&6)Far|aw2on7g+TZ z(Jii<8s7zA78`VN&ab9i)ptMwZ<2UVStYB6V_YY>=2J&QV6;~@&iTAqsYqU~WyA*- zsGKdZg(lc{2KTwidbum2#*@8)Vv#q5Sda4$nqp{d4aK`{IVX`{}_!!zuWyP`XE6}bAcGfM7NY2bYS zs|BX&161GT@-|ajHJEQwPcqwznqtQe4`(TQHTBn(ef)j`K*Y3Z&xoW10Vmx8R+X-B z0mXLCky=D4`(*k=P3Q_b_tIweU++dt;xZPStXHFd7Cy_-b1{>mB^4&G`(p3zk{{tm54dAvi^ccb zUoY#<4=lm_gIXfEpx)i;^FNt&9%LwNOWJhtna0H(8$YI*`R_H&ZeP~48{eq+AsX|~ z7c`ugq5Bc8tVotrGA!bC>OqF@C*XJ6uG%UicgPa_|H|0 zimsl;2F_i>FU$L}lPx|;fqRYwcQ4ylWW)EXd5HyBWdDNMNgDe88*PJnO$m(hX^*Ss zur+Lr77s~Tbu$(p7M+Yad5XdJm(-@hOkH()5XroHJ~Mhwuh2JLh%seIerR!-^7%G! zU)vao9;#0l4^wz~)6L zEqlyJ9b4x|L9X=zsfGPI(?~}1pbq9tQ@6Bt=%Yo4rYpSO_nA(Sb27E_TA-gX)9J_qMg`>x)#>RbdLs zYDTb8wr^7UvT0vwMO0UrrXNc$DQQAkp+D9@irA!&d;o=kT^+H$d4<*m%LsPA^Umc~%*S^seZxOQ?s84^ z%c>AjfL5%2Cf)+`gLhTMac;C{%X5Sq~T58_^%a+&RALQ8hKHQ-?`e z-TRStkLhC_N!89JfRrN=ladm1+5Mj{?`W>N{fxNkoj*wWjBGP}t)ft=BE>O=i2ELH zB2br8-AgdylECMIZdSvFfV<-|v0SkIi1sN?6|bv8MxJm!M+mI(l7)Y~w&T z{xM0gX}7tOL5@~<7-%O|^l>G=L*Km+1(QZS&ycSs3!otiQccs#fat5bO9%NBG z%%0z66OisW>3lm$$thJyNb@w(AXv1?-T?QHylyI111c4CK@>kaodX%#g8Mm0ij zKUg3kL8i~Mj5uG1#!p&3T@LopILY+W51S`d5W+@gh9ot8_k(9{@15eO_}!kO^J67Y zLgGBWI*Qf2+0BZO8vD|qP5fk3^z3AQl(2@Qe77UL`9U++ zy_T4_TkLmxvO(Kf=m1)J?LJH_&n*&q8os412DtARc|}D4D9A07_?KqK#vJ3H4E41o zE=)Hrf;tzs@jAH#m$(;BNohr%Uj3ghMd_?QrXL*5(Am%_2%X?(i>4#HymB}Odwrbn zD?n8K03fmdDFDHD4&>)fL)~Wlm`0)_XtZ{PAG z^RCf)XXv2`X|s#crsrX9JFlh~-ND1sXCT|EG?4oc!CbJB<(oJWYqyU!xsaR0OB;AA zNKdtEw$J&_m(R9;vo47pT2d|PK*2Aox{l0Tu;AUT7eyqV&E{QTrRJKlg)N1}6U81S zxy%JYkW07q(CYRu`&xyj4e;t@s^;JtJ6jP%NcNgd(J zI@(~27X;qJkJFG#x4j5nc}e;ApVmC3#}sG7BsemF?q#ICdb4$V;IP@}L(9mDpX(#T zBnqKA%c{xQDGwBta^^w0>3!T?uZUOvlKH^6`Tk6XZf>DMhI+sWdilcqr&Cca6E^P_ zeVh|!B0~{|D9cYvi;;Ckn<2K*(Yp52`3^02RDR@jt$9v5A;zH@&MDgVXCDg*4nCMB z=;esCx$ub?;60^U-Sk;<#71)u`cjHTGk$NoWmm--o+00s0F*4@r|?}v2O!%O25=k^ z5F!cM5*-|b%&o9gNHxGDsIX7`XxX&(v@`57f*hmnGD~y4L_qn0sZK1qP4M1ZCR|fX z0>Vufu8$YTY;q+-qo!tQF>$8I{EYUAW@r4s^1Nvsu#(QucC^hAFK6M4vkfYS?F=oZ zRr+PwqQ)c3i67F68=UWoSx9*A+>63(U;95eJpc2N!oN6mx|d8d_?VfSKZ{-RQ@T1y zy#!X$xVZ)paz_O6Qs|-!lULN#>%?UXluHIeAp9<5sbT93YMdV%0Gr3ey1S2WyBEP^ zc=Jlv+p0aDh9sc*u!u|TZx9rT_D(Gjw392^Ot8Ne6{aov&lRg&pKe0bS(KaQI%+~|5qH53_(H+xeeZ;_(VP-ZeMQNaWfULo z-s%+Tb7dwU#6!X6IE;gBYJHU(90%zHtQMUElG~6 zW?gmsn{ zx+&IVD$TKDI=HmuN#r z#qMH)IN(J}SfgRXT+0K+NN_|R=HQ0Jz+Gw)xx)5kKU(~z1V)`%Y3u3fN?t2Fs+lzA^~o$E=~WJ^0ys6(v!!6%hZs^Q+7 zq#n`oVH*+)-i!*k9%C1odc~N;VDi&P8!JX(MX>?9y_UOxT_X2!^^Ej@U&u^V=4jAl zYDgv@k=8ix%QD`l7RN6XKe{|4f0qDo$-d3W6sROkzkbd%U_$ zm{TpR#T=eVcd9zjq{-mk1)ftz?R(FwyA}ihYG~Pe&vol@2%O$cJ0?4Zd?;p!M9O@f zA$`+no$rdMxc8t2l2$}avBC@_V%qwiPt=W7V^TT5GVIMJBg^rJ-h?MfB3T$t8(RU- z_7#^_XZmx#E<_TVcc2T}JOJHplaGjH?F||qo zE4=3V2Zkmco<2wem~1u$#5T3YtNOBrDs73CfXHIF-uIU?#>U_$WOJ(SxvK(NAK|AC zGF;l0(q7bsCTrJ75Br8pmcDi|QHER3C88)dH#c3PDdSs}lcJ@O^X;!vhp^ETYPzCR zuJ$=s0c&eKO(+1cwiyv|X~(PsqFabl+oI@u;rlc92n8g3B;L4YRBoJo!{UFp_a#ti zUhCSPzo+SG6O%tNW^nA$L~D&2gW#;Ew?<U|mYXA&1oV(WF{`cN>@48vI*4|6L{e2(L-t6z) z&-?6$QG;Pu%KPg#hT|xh^QIy!5E)c#s#-!#ka18MLgL;@g%CR8-fTzTM!>cp)!e=J z3AJR+@3gW1ecDnXw-~tY3#F(8-G}1@db*Uf;;)phy?&GzUiU#4me(HqX$=rQ;}1$043B7VRvmb3H)YiLEi_+$wE0vUs? zry(Bnd-n$lSrSyS$le+)2eX$qC%)J%-8f^Ggd#P}Xi{Rl9*sNfPi~jw%W&IBL3dD} zQT50IGvNHAna5`q&Wok$F@r=a#_IsDMUK#rk><(dxYkNbiyjM7(j~(8ZJRV57#T3y)pCq$h)gSoU#XfsbUFzKv;L^?5vWpndz= z*?RDHhcEJ=kz{;DVGSS*=9S>)mRD9xH`6nQk+!aWs|8U^zl!s6xHZam!#649k##%$ zdTyP2bs6;VYa5P{B^nJ%zrr@~0Kdxd*=xJ^%l)=&zAOyl12Bw8N1W zMO=Knw*E@VQizS#M8;j~ZV8Z1v5_E%D_Cv_nypFEF;wr9;mYMJdxA*qVcVdiQ(H}E zN4(C7GTl9HyBFN$bkduQD!B@Qakxz8AeY5XqqTrl*X<;4HjfXtTrC_G)i-Xie0!5Z zn&G(d=189XoL^8tZC6!xI3<`hI@joo_cFHG6zWKU4;?4k9mn0uVEh*yob5^ZDi|lK zQOVQ-Cl{#KHZrs#67^mDJh^~E{legJiK(?)#$-e02ja1@aG+IyCsr@lkCY?WX$lwW z(M1T)A-*Z!zP47JcAD;gGEc4372*kjYA7%lB&V?z_iSyhlwW9>!4m*0-Zlum2vj4X^TEx0#i6N`;2 z?F=ER2Og%Y&AaXEtIueai$tt@%?Py2?n<6Fc{Z!J5SK)h%{AD8Wxg=BwK04bkb4N? z<<*mzd99Z27vyG6^6G+YkI$|yEK4ruR;qnE-H)+Tu($J%1AxfF(T6iNFnmYH{eovD z*}{bKz8~s_NR})6D+Opn5IVfgEmFI>%hj+u=J`g<7bUf+_wY9r^p_(<9)cvL$pkk4 z=tUHm=!bHWJ%ML7yxc~;?5sVJVM4u2C>D#V&<#Mj{I(U>ylHlUNPTQ+ORXS0NUKt@ zHp)SCO^{V{n5nBBu6r^H!zpTRsPDoqJJMf@2XNgHOk0!V)LVTMWObDKEy=hwIeSP_ znr_#?zJ#bE3f!{2Oxy#TXO0s)?MyL+bUdUonJrgLu`l=b)K@<2f%mpRHK7+0nEr%) z0@y8fARerE#e)-`WCRw3ut?o5QsvZz-ijGj4ybyZP=ug!6^1@s+q>Qo7WPNGpHP9r zQ*;-e5rX{)tWYudA_3M8PN|&O&jT+^vF$4Xj3z(lm4M$3eDk*x0pMqvtNVkY1HgW0 z$w&T(AlK7RXjUwyxrcK}Q%&THF)1!<-|KoJT7d903=^?wmFXWs2sIs`vNY)& zv)C;Yqyge!j9?mZWOX~ML`ZD+)SBLb_b4nfp&R8B(w6@@b+mhgyse41)Jzv!5I zs5xsfhI{_fbF!mfJc@@p4)EO(Sk|kjx1G89yb(WCtPI32r`j9MZx6Yjb2Jbpl&s9> z46JrI^u#}ObKFUzsj>@;`jcNASO&r|ShV*;2c$Mghqk=;=Q58k!3&hQN^Uz!+vg!a z(8}x2jo3pZ;H{9}VrOZKh>ni+!lG=O%jiz7*tyX-)#(m>_xgUU3&zXztihEU6NMEE zV58l-=whs2W-y1yGA%w&9q9*~CS~Wu2#^591|^iK*74nu=-41*Eq$M1sWP+T^jiTra$i4s6b^xH)XE-7_i{_1QP{#xwoCeokt} z0pfU~tZXj?jg;6vh=~n(pC~%bTcXnXGfDts%1g)bv;uEY@*uYvy2UrC5`7}wPj0*1 znP&fK+aT`w=5AXsQ9ZPVJl*f-c-52F=tf{Umk``0KLk#GS_X{s%}WKiS7gE;xoY6? z!n^C@Bv|;sDlmIl#N+r38J!~OL1=0ZEiQ%hX6&ZAySlh*v-9UEVf%W@D2GkKgAs9l zJmV<#T4BshZg6KXHc6q3M*!40k>ir~Ps-FyI0?3$eXdywyY&BlE3h{q!vFbym^R)V zt)%qd@578r(f<_Hc#Ilt6t8i*L}&o$q$}K%)mhhe|KT}9kS<+6@O)tw5iZ^w0%#lf zf!oMGp#Q1OL{_n%%DDIPkFh}#`yF|@p-ITFwdEStGtuhrzHhLc>;$tr5zhI*)6#AD z^yLHYD_O0j*pqvd$<-C za=+=xF-IfQ&{N@@uV^m8HPAosYSlc`NNo8kVZ7%Bvpym1t$}HzWe`@O^ zH(*ne5NQYa!;;j=lj&DR25dN@C1l_O#tZZYG(Hyl2y3Y@-A zv=VdSx?WefY-GpqP7++9Lx@FPTi%NTm1)i-55Ct!UNW=P)6+-H;N+Hu&j*0PUYCJfv(eMp+Sj5Q z;*HOD#|kFxhhWUJh73aDip%RH#=?Pe^v&L<1*-n-8xW%~(GwIL6WjgWYrZh?Lby)e z)d%@^FU^t>Q^=>m>+AWhscjGCfESm7j3cm$-QNiWx4a)d zPD#uSJ^GbWC`NOAw!w6GtdkVhpfIJ{x)3_OJK^rlsvh|Q$=7(+pe{r4pV5Z$JvC2X zu|ShN(BLx^&oMgJ+NsVuAn0=oTHM)9wKT^jV~9r_KgLM`UdwK-qZGgw&Bwscj7|r_ ziPGcqSb$bnq@nR`pG-ZQq*#1T&^grAag82<-Scsp^2ON>2d<_>rHiYITghM8azeCE z+rXTv@hX%8)+_b#6GIy0$wwb;-o67#422i8Pz6^;hs`$p zP-b0PzA@kgc0<>O3ZH>%G%NKR2oGY|sW7`oj++xKCXyrMFpZGzq75wiN`qb!eRaIo zEUGhAFq(g~4jH(U2U^~?KB_(JdiJ*4pYfh;SA)4P;Kgnkw>A`d9G*eib~Y}5TNIW* zx|MdW8;c1ZnHpW_C6;Sjton3H=z+x1EZi!!m#9mS+E%GSgFl&J4P@g8mPd9|cayS4 zZuIBC(ki#`tIZ86wBhK$(+{T9Y;64Oj>t`CIJ_}En<5Syjw79y%@s^G3;o^Er_Or_ zKh5{Y~W?F(}=%eKyG%_B&gYK z(?{BOb#-27T{!n+`odD-Tkr2<8moK9%Xpvb;%mM}5QI!#e17Ri%}V)UwXCWWb-Fjf ztt11q(#Ti8ZC-t=)o+<%8y8L9=SmNb5k9LElF@=d>&37YYWntMd&tizxcjPX)yvl< zUvH#eu`=mRJXN{LgQF}e(XOd+gb-@t>im`)!g1H{2Y#Gq$+VSq_@YX4Q0m>>Bb-Sj z5xJCAvM1_H*Vwbp*h_n*^k~y8w(s2K`bv|Htl9B1*v^eV?FKc?RKTJ{D2B|HQIJ;F z{TCXT4_mEkx7ho0^56pdh;+8guvZ#5(vjdxp>{96b(GbCr7S^Nw)aZu=JtRrdiyh8 zf?b%l%hrC(@`}1-`=EbJ%AvHNnnip1U3JSdE4Lr6q&~GPUfNmUPneIdzQq1=X}2^F zK6CN|p9%SQX(n%41u^Xgr@KVy%jLWE6inMuO6$LO!?s&qFzr}PSj;@0hcs2q#+5(M zgg+hpdTD2{UMupCnR>;Up20{2)98`Yoe+j}CFOLV#Y8+ud77&&855a|!{gKvnzVK~S9=%ns6(HoskZmMQs)Uqrsl-$I5`3Q%<;VLLa$y+8nBUJ#G#y;2Z<00{4S$u)YNsHK&D zfi~&e@oaoqLc9bwvdf#D#UHdXk1tU{H_)rv(>G`}h^wCW9(vLgB63hx=5ye8;2wqL zqk~h#K;Et4)@YI9i65v((K7vb6u$deH77M1?E65W(t2F@3~Epjh7(|C6u+v_H7;*P zi)RE8_xs_!wM_pcL)A2HoA@ta54-kKE6#|}!j=BZwjU11cK8Mz0iEsj*FHlC)YCEO=zFEqXnl{o8RQbtma??liSqL2CbDz%Ot9yd;8Z69 zlBi>&->F5YY>6Is<|)!8n*ubkL|jTE#DEn)b|M)^e=n7+@$0|tOAA`NT-?Bn-QV@) z9;#F5S*nAMjGdAu;y2Pi3>ZRe?g}Ylxekw+GDAz10;#+d+o)R7v@JL)YpHo1ZPzrP zrvLq%h(Tcvk}98XtwmoAS8NCJ)3TA%PUgVnm%y_GFmG(WY)OO5rzSXk1F>*dfp1kz zn_DSqOx5>Ly|;E#+f=9B6jwS)+_#oGiPn)()V^uSyt%gcW03 zV!wY;sc&fxA^GU-t~G7iYiHw2nBU0=&YAR3|Qou9jz+oLfod>K;o9EWiYq+ z_rl_ub%;!0q|yQ2UY+4j(T`~d9>(6N61PD@*WBNifY>gx4}R2P2P z)%rWSI+Pv>_INDKrip`f2m`3ynN}C=%bRqT!oRVew-v`W&wExGEWZ>;CpaY01;M&c zQic}W3^O&UWsyn!7zpVFyug6v(`+{2t007%moZu*WqgYUZ1k1V?|qUd65Kd74Hv_k zr1;Bg>}b^K>?ZTI`;(^_ZVgLzCWS^330>A+92GwZj578S9<4IM{6j%|y8g_I1K4nC zLBQUgP3nteV@%KoCyDiXr1!})9Ky9L#0u=WL1!u(iG~ZwY+Hg;Y~nfY9aB(+&w)zJ zcfT9_sKezlCaAjW2o_jT2EH$UwyMd)bm`OJ8L2I6H~I;{$`UdUg>Z{?aNIBi4?t$Z zY99j=cxxSJDGrWEA}-jvatqf$-w*b@^<%VoFBw>{IkkfJLB+Wl-F?aIS*D(K3A6{ngY*h7_fQ+;%cMk@|pE3VTAGd(G)6H`aG9Yde!T#PL|-Es(jF~+0h@!sp4qr;L zVm6G&EJ$v9k$UU7Hy=N!4mx#Zjs|*g(n3MX`RYN`nicZl5uZ3;BWc}y!(9_m1z%b4|>z><=1&>w|f{#q=Tg!yr8E| zlJudUiYB*ijeQpF;Fkjy-?aLx!J@XgZ^{|?pLg1u+fl~4DhJE>L`=NT4XG{cM8A)i zj5%6JQ7E*mV>Sj7;)(?382by3LV!`lUyXPtAJq79ExXX+@2DGrQ0uBkharmH-eGH* zOTNGH+y8d6Uo{iF-S9uD{%d00|D;=Z`?T-ic^i$tslS8gZynPefPjdNiiV7ihmDVqhmDI%NJ2wKNJK@9i%ZT-PDM+{z{o&A#=_1* z&rUwQv1RNY3B0M4%A|e(&Aub{PfBEyP3xEL+B@Yn-1wjdb#DIXpfcVu1Abw>M z5(?rszkmNgK|{PU3J>}EuRJ;c0tyle5*7^>8Ws`)=JzW>LP2A|U{b(xU}1}?XgI^+ z;8AkERW)&m|NJGtX4=%^W8%yXu6n{OJQY`7_cnE|E03gEU~SJUHNxM+ypHwvfnHmP zS8A{@um1rtUTMGnfPWna>Q4*^NDL@w3QR1HD;OLx71j7J( z-u_wvAipBN;$Z+p0NU48T@aWl#kh z{s!hn1h47=$Ys6D(%9{j>rw(-nn4=LTUM8MU$8MBnlStfvQc9^j1l6Htf1s#6zm$k zm?yztX?5X&d>M&y0Vk_rQjqRo%KK!wM)LO2AP9L65JLw%RhSsi#*+z!dna`B=|EJJTS&D50 z0@1bqu&uc0GE^>UuS*GJwe7M4el@qqi$$7tM*Afyp&6Q!a! zIK&UJIX_X(-<^9wjn$e3v)G7ED ziV1v*TMsEl_OrVf=pAC$L{Q;l6fcP*kJ&I0VV$**&eyQ@!8_uBru$m9*`~;qL_{f=5kO)N2V6W~AsR?-PVWS06fS=L2 zlp+)f(uRrJ2jnmcoXPt3IPMJ6MssOcS&2c5h!Xh)po?}|uO1uKdtAUQ+s=Jm_ z8($HA?w0E%e}KVkY0PRi#sx8Hk)nV_Nc@byklEJ^Xc1t>trR%YvPv9nh?mw&8^3qVCkt5N=LnDrF$$Yli`SI-jVINe5<4Z0Qngd*_=f1ZEi zr9NUJ`*`v$PnE^kaPTB9#=D^sqh4vvW5Xrlfv>byabnac6U3zpC<=xv4@!oMdLMlt ze8Bo}2p*vpQyFbT)7o>HM05YRQLDGv$bS9gp|{Eld)C>eW1xRYkn-dcxZ_UXg^C7L zaMfKH?cDJ3Q+8u@vTh55$|y8RXBhw)u9fN4W3%;@Q07CdAt&;Nu((HR^L#BwSv!@Z zMT?NP09!T8yUq?PP=Qamxh;lI>%tq)ep*Br=Rd`pL zow&U<$t=S4JMf?of)3U)>dnJws^JgW-rn9TVrE~Ss_p}Vib?xZX;wU@oKhi!5Ua&n zOTms#F)9S!6F5oj?FPsjs_yQBrE8JJo(#mzl3N;t_&IEd+7>SS9W;*}-0MS; zlH#VbSi8BHHo4X}HYr?(cu%M#&1zq+WX}&fzM|OxLLo`o3{I~`!br`L!Myl)ei^8S zofacvA59gD@;HaP$BAgdKUQ5DgHpFh4xOC|qgT9#v)&=l_F4uaW2?%q@Kc~|<8$#f zc2|rj8Y?!rS1jbVno&X3rZfS;Mh2d2Q{)K{u&XblDTzpZX3^I@1LG5uI&L z@&i%)0_bGL>2X6#h?Ph_B}<7DAC(dT%$ z3>B1_DnopA%_%AWZ@`bBRaidxcp(YPdPC-vkHT*k zPH$OO=C)BW7I)AErTNcOy}PX)$FuGmHN_ABf4F}VlskhiL2}{tI5ad2U|cz^Jtu`r zL+_xN(5u!JS>+)c5*1YmjGD9!LuoG-SO0>t(r#^MLT?+>2tI^g0O33Z2vh>;j7Ub`g%LI(AmFNC!;G7+$4baXb_<1TMK<2YbV5Q2fCh`ghq6;o&wRAqAg0lRuPeJ9a6cH)}g^^KQLcH6sjrPIg6X%fO z%^QR#-bK6d@VO{#&NIvHWJYuXC2t6{R>m~JSa1k>+@JU-$T?yGSZ%62v!0of27z;} z?ejCOkVlzNJ27uXosE5DoB^xSNA7bDYTtfNUVgJHxz2b~5bMU{%*WnPiC1IeJTfIV zhv|)&9W!f*vYqD21_|@xW5i~VBBJtXCrMRnZfFEoiL1nbSRtwZ>%MGis0htHapSZ8 zPqQ8log$R7hzNQT?Qcb`j42&m{J|}v95H^63f|uW%sl0yw(m7i1G6d_sI6(coTj;B(_9$>5kRH3h!$f6$LVsL?;bs!QUYRR!iz#KZ^Je2tl;HTztTK~Sgj z<&75mp^S&FwhjF<@r7H>^so{gf(q4g+87FfSTp3-1(d`kRb*~DM()S_aSdc+$zI|~ z$gyUE*2=dgPr z_HGlJ_(%y@NqC&W1^1BNgb$t41_xsxMSH*o+E&$@k}}({u+pVqDkd8PtZ-0M&8`nI zFCU8m_C!`P?+}#v+7&-BO4xm1Q;d_DT!yGM9`y~(^9tzK`uAuaPz&k*|HL zdvrntCFHQM88&SyuNWbas6-=9#O`FNwoio4HsK&_i%b}z3*;No~QHP=g~(gH@gy4Z_v06h5BIQW?w4bK%g%(&>kh_kCm6;<)S0yB+|% zi^To{E}t1xBPxQ9%DJTSf^(+&j4~3 zM9ngu+?Vcp^d+0H zHwT$hV}Pq#W{OqTX6+PJN#Mtu1ZmS+^}r33xgK=3id(Fcd7J8Q`cgsYTgP7tQU}GA zkj4`DgV-mxnz`4!%lWYnANhZzgEI^RQza}*!w`rv^NAN7lZqk_*Xpz)re^S;`sMAn zi85O^J8tUNguW+Nh9Xw>gmarF7tHi6$o6zhhcx4nK8(AsZjx}Xm62qW6b|=i(b8td zwce}Fh9qz5aXu1W0Gr+v3(zg9R`a!b4X94J?|TNF?kU&deesQrZa|sn(%&}ajKp#+ zO07`$5n&NlcgLQL6@sL|B7WSXs96jrg)kdpKMfg&@NFVBP}XL|YR%<(fgVY=}b|o2YKIh7SwUGJ5woG!kJ2t3K#kNx2o&jxmDR=hbXH zswby{HE>IWTp=u(ldX;Tt=n3#OV~s&BC|E`pzJ|5;GM@wEVyc!<_F_~lsC&g?H?ep z%AxqV^hbix%wK2?@mX?yvVVY_venWzwqMOt?u!17R$*?Hu&Me7ux5Pt8%2h{qm}6p z>^04${RUvfj{ork=U?k-D)Hic_FehM*W%GoQwm2#xh8ziwawFKl`>|ZLsS--;%Bc5Pcw#p(>1|K=rt(_}?D_ z{NEKy{0BN-N*0~NGs8kpv=d4RxCTi$&Y6bZy1hgElWer<-@l3E)wGJ^xd-284TZR= z@Qi=iv=22OgR{)~=E_u7w)!P7Bk1#wA_o%PY|cFotJ*j7=ay4qsAxfIz>f(~BECKg zekC&1FGQ~PcsxtJHEwNU*xHo>=0&~4uF^zA&NW^;nzb_1feW z7Djp23@{7498S0!83~e*OwUcg;s}l@VsZ5dwFNjlj5N~E@T8m~$CNVSryFrumd*`5 zL?R_9ganECK((*ztM}TLdac`|n1D_wC}oW7+Nl+^0|YILc{##j$e} z_|tKy%#s;%h{gBJB4wQ=HLoHZ>A=+I?DFAv|m z9j(o+;FU4GsP3#=MxThFZK)SLuRcrra5lTCXyNYe+fdQ8+$iY7Mpbg)HHN~1T5@%5U z^OISO^|nK7G4bQI-rbFMDpcx#^e(zWz|7jOU56(?heoR)Msx zo+9t?9!oFj6vy+8WzBvM3hBW6yN`(o}m5C8CNi zyBM^l z2btP;c)yUOr4@Ei`uH2Z5SsWCzl+hWlOvI5E49Cs8a!ZW{J!eBQ%P^bV4U}{dZw3{ zgVz;*3Nj5;W%&z`5(pnw^S5ZWSn}`abnfq9N-=y`AogEJXHw7QCR^&|AF1{%RHIDJ zm`ADCU(5gmYiMtB{CW2bnU;#Is8;N23JXfC-HB0ncu?qi%wz}x@Nk0;Xx>*nMf4h| z)M@*Z4zEoIO1GE9{ZDePQA57+5yTz1L!hv+D4M4cNes}mk8@CumbB5dbj-Cfem5w-PnKxi~d zBS?dL_zS>t0bC#cDmisFXx(-1sMEWl;+~u1&PIqP zw|LRlMN3UO`MSe|;x09A@)Sgl?QuuY4~@>e{!uNQctW0695#}>eR=~!Miy6X;xj{@UU%`IK}&8uB27DM+n z%XzScTLWA{yQww-%%9Ib>t(+*HLrTo{=gHjBT0A=u_>~6gA%JMr+Ncr9G7bDd;l_p za9&I}S>W_=V1^XXSFAz|3CZW1_2?Qf_uMht+R zVLdlJwli$dYcV#EA{bOxUoF@zREpN1;yw8kuwq+La%K@aZ^|Vr>@K(|Cp1IU`gZmU z-RFIlmc!ON^Z&>w{ac0yCeXdQMW~zD4ncKbtzyx8Ls>fMr(6JL8ufwWeZWi_x_E-( z>r&SGK`YCj{=?|5P=e5)xZB6CZYczhRVpGi5-PkI)YP!r0uOg(M55kJ!y{j`OdVI zq=P=2qz;pM%#E&Jve?=4K;DlrlW{SJJPd*j0TP8CmL@uXNL-;`%_n zPh25<8fM7bsLpHWUQX0DEVA_r(DO~MrgQC#%sk_LB7C;#aavgKI|HJV<1d*x?A#V; zl!pq7#F0C0jfU;Xu2`tt;oCQv-p@QcQsZi<{q;Og55jUQaaBsRq^@4NX2y@VbXK+;8fny2 zn2Bpc=}sF1sv&$?mVIgsJk5zMLUO?&h{%jO1~LN&pnbEfDX3xh;X1KPm#5Lg9aBe^ ze97DukLt9xBebh8Ru2sIil9i)0V*C9L!Cm01X;h&-=?mU^Gt7<2z^<|g0Z7nV5JYLz2Cf>9_f;ci;gXA+hwn1SwJwf4+>mJ> z(14_FsWZlZR(+FCaOM5>^;kZPVwjFApzLSjpO4ij;a$ECJ8o%0EDUVj;t0G9t&Pum zttm@IqVNLBbC|Izf`<>_ca7gA1NR-;CT;?Ss&4e2KL1JM^H3o1pJX{@$2L!X0SY+D zXU?UNR?oBg*jrq<)%&!G6?zRiD%XcZMFO8r3K1AeEdo7~<*-IcXNSaUkj~`|JDJ%K zEBY86yHrJ=_ZnZyZJZxru8|reifn51#jz?w=oy)4-DP5gyJMW2+A&;9Hb*)FwuK%p zamy?885iC-4^D_!Ng0+Yj@F-rE(a1@ncFn#zL(t#z%x5NNE$aT_VsYpM!6u|nUV`B zTo%O}V?9eT&lj+ zyuKm(3jp^MZ^j_{;n4Uy_3m7%#CJUTF)2dTqfIRZ>V@Y{7BnsdE5}#ex|D+VibZ*7n-qwO`nXj82j;i_ep_o711C^XL26V;IuDPArkCgO(=q;i!CU^JhU0V5GCEN^>C7Tno}Pve`S0l`Qj zH43?|`g%s}PAvoqVEYsDpG?btpS$Z6(~Y5}km220O%oOAaFYfF$R;#Uq^-HrI!jDU zoMB(JPIr?NbV6s%l6`G=<0`BJ%?I_X8b~5)B?9x{g-)%exNn0TOuD>(vqt8LXI?sExdEsU?dCQU?y{13Q7-+BVHF7O;B1GyLJdll`v&LU}51LC%(>UNGbFmSE$d$@1GPo`>p%|siLdVbOs!Z4HE2a(ZHDcRp4u<}`D1`;uSudCGS}-h%bO!xrCx}HI*BE}<`u1N9161!xyGX)q8$mV{ zE8!f3?;{Y3k*Ff6(zsoko45>Tn4#>pogBOauYP1!CbYp6Zp+eUUFknJJoEW1e%bN? zsY$+DARIZ-$+L!;n?WD>u&|sfwJEI)k>LX2WY=*JK(R<5PwdM=yEd3zR@ut?xv%%+ zBv21J2DH*cDC5(_t8h5h>9sV`r$-W^rKX}fKV`2t)euvh9o5FetkTd$cC%y;zOaVa z+w2t3QxaT3_Glw4^G(u7nw9jw5dbFw74wXFH=U3I>hu(hsuc@Ldd!M^Q-hf-O6OW-S!7da%;H-2{D;F{mml zpztNPPfv%(gXyPRQf;T!9JgnJ@E})3PUDZYz>&cx_oXN!+?B*gWhEe)WQf+lqegu| z@j^J%j*S3coGu!>=a$!dP+s+o7axwwfT^kdChp^%S)_y-hSkzhSo?RG-?{fd*qd+C z2es9kL^C2hpYc8E^559HL$w>p_|6^uk(s9~EsCg2wtXLhK#>;0TYcdwQ$t#Cjk|6) zc%?Z%r!4Wvx2=ilTIF3r<{0zok)5@1ADL>Dy5R1X1Ek&ukJfi*xaq;vV4rT+ zgT=k=OT*BQ=M@S#Oxhr(63gfuJT)0{MkqbYa3VhvV_4@QnC{xgw3kqQ3wGzL`gB)P z|H{^*4K*yZvQh*)O#UhmybZ<0+B$DG=kufq{agoR(OF;M)a(Tz}59xf-cO zK)|R;Bd8?@F46z#*k0(;nq%e6w&F%ZQ%eEo`_PH4{IWpwhfTjOmY?JHJpSDR$wde; znK!1`70Cs4kXu*OaqNyTjd<((B&P?a{#bo^h}QwbxH6`9cxy{Tnjk#9$yaZ4I)(*9UNYM(m-6-=o@n%#3_Q~7>nQWGp!_e@Lm22L8*KlgR}J6A!;#6Ls`})m3|Wv0FoNv*P+*<~ zrtEO+l+g0~ot}@JU(>C{hYqqPNnggj4k%ot3HsPGOheLfSBMecgTwKMt6y?6&(Nmu z!@XH+_MG@znB9y@qdSUb$i zEa31{%xvwEHq3W46on5y=)~?5I(SxiSF+U#ihUAlLhn8`g&M@b@CD|vp*u%yr|6L^HCUetv7s7evC1Ez9CVL8J4e<%FWK# z9u&?ADQ1HTjp1613%m86H2Os{HoiBCB(*g4n_}zrw?|%;Xl}`DIw!};6skH`J&hxG zAChphCt9>OIFec{W(;}JW3KQf_G{eE)A<-KDD_UY55!8KgRDFRdtoKp-OMEWVoX)S zqFQb07|v1li?-}4mcWhZf)HXhg5sov(Unm611D=oL@!!dkI3V^fnZNFf9Afvl6DGgN{8weon(?Ag1aK{#s=B(I z5((Fhc=8Rwftv!zL9}Ca)c$nB^7iR@IK02~dYL5t&bG9qEY>VXvS+6wzPP%yG~)e| zafB_fVcxm36<7FE6Ht3)2l*3spuI`OM>@&XZYH`Aep4qm7jFK_SBo0h{F9li{`c7% zop<0acHF|GlQ-WVM9==`R`~G`&2#>+mg>tEvd}6$nCNAJj2oN~O&VJ`0bwan1aU zk-DUf6s_>gEbdWe>g7kv6gnv$t|qA=E$AYLT!9K2q-GpWdAc&!diHdvS9H@D zuVvCDj*5?~k4|C4&279UmeB&;W@$n@-lN96NXN$YtSfM6aQ~pwn5Ut}Ag5zMdxvv6~IFevmyebH@csQJ?^S zU(Lj~QfEcN-p_CHLI6_R_B_rkx43O_EarakS7{uUYH(^-Xr(&}ahehq+gy8Jp?sgY zZ2Vpt8_T|OJXK+~maK2DnEG7aZ6oog56p=tcllrdOU{Z{!q>EQAh_d%K4!*;v~h)i zR}+o+3~NG_XSVB=r>De7gqc}JiB+1IbOn-ANLMg|&QS^El$SGQ)f7~ynh|yA{5=H7 z*QuaCTD2Z5td*QiEJUd`&&pw^WR;fk5u3V6*7PR!fXcTN{Vfi;bY6VV`gZ2MVlb9T zqBRz|%5TRrU06AbY(W--PD@Uu1f^!FT76Gk96>@@(xje37mlH=dk2KBZhWYWYr0@7 zeCopDqNFKxF$(BG@|uQj@<4dVMbCe=cEr8y5C&N~*k|+N&qa z!=i7WoMnl>7u~ZxPT5D+E&mnLI;xO@3OUb*3n{i6X*nl<*_lL=sf@!{4ZX0yD*@3q zMM`@R4LV@~PAEqH!lO|j-krLQJI2*4DTaj_eG$r(H?WR)S{4t1ILi0^AQhv%(oXu9>1gRF9H+B842_ zQ5b8erDl_7Q4tBzg+`**W_QhM+I8^gFQp}v*3>_JKn15&8XJFx{m7)K-@V1r2{d2> z74I&~=r6AuglR2mD6j~{7N-u7SyN+5b>R=x^YUC4Oqf-kI`&P+J5#|oT&6l4J_d)= zMbM_mGT~2&(o6s#J)yU_Q$xlEHH?Ji@nb07uH??D;c%rAaR7kNkw~d7A6N&umrxBf zUyuN>TY0|MT(sV14z5W}P6V;+x8=Y>IJs`1^;mi>9MZSMEt=nju3}JsY@?b)yYF9J zvmn%KKZ;wmVv?P2;s-^qb`GX;;3~}7n$j*|Qb`CC!MLQz$u6$5&mcdL7Zd)~yM$(m zctObJO#Kwa8GSa!DgsS>>+vp2{>BtP*w4=_8>xBhfc>G7L61p$YJlg}{z;y#W~t@W zHz$w1nnhvt*LM&b5SNs9tBgV@XGUN(aaE{qLsF=y=%Vr%-ie>EbE)ai48bnCelWn3biY(uGf}YDH?ys&%B%@{7y1rRvY<0{HdW9DI^Y z^DG(mQ#%DlmWXKZzhv=^B3VW8bhp%T$LVGE;l>{}Pdk{E1d7VL_FeHNw-d3=xk@q- z9_5>@TtYW=13gTY6Is72B#*jc}}Uz6r=R-U!%bDQ6> z=3ss+z`<1tgQVY$?oBh;iL%XkK)pYiqNlsUa)|#)xSVq^vuC>{ct{&Z{eW(WE^J^D zVSA^yyv%>D$rPdbsG$GY8Bah=SctQ0AdoY8NL%5q;}>AmzG0t94LCfTl2*c0W_`*x z*Pu`wHlW{24sl+Ws;g_qO`Zu`=1&_H8ICVm<=g8i(#|X^q{7`Qt3411!RiFSYNitz zS)ULzD_L6Ozw^qXk=1xhi(DLj-Eu>aK|+;9+_Q+e?YDq8g~HO*&0bs$mhQ){Q=+aF zuqn#y8fFgl$ux!|$NgP;j>Ht3MQc9EY(L@Bcmc(6Kz}}Rb;doHOuZI=yUYuU=mGh8 zWD@YVd@JK?5dgwCd2!Sw*=mbe_$LND`SABTrTT+eZD&|dU;;9Kp*{iy1VaUd@*A<1X} zk372h_Cbu$Arn_K@?fgb`yW8`w>H|^y|Iyx5i+>ttA--BA5R_JMh@*?+buoHF9`%T%)HhQ zZhNE%A;og`&8uH=3wZBD5djRZ*!)&!7!oE#&niGRxzUAjK}g%aCd)eboWkqpyUvso zkn5L$JO@X|>;tnqweuEXp<=`)3zxUtUpa)mLmAtI|6<+sPuAlrQLSBN$S=qXDqt!{ z{`B)f6wp9Y4f?o=wQ3Tp|bfzwe6?A&4siIFlc z@H$N(dg<#FRpA$V1Q%8W5JR`0J}DLE<|h<#4%EWo0iR{sGCzB_8}z0mf_et6NHLPF z#}rL+4vo@mOLmgtM}_3$cg{gs5Kgzy^&?W?-v7QHRUA--shP}K7FO!V1p>(N@UU_K zD6&G`8a>w|@^5V@P>KtSquZ&zlm<_W(4412wR`uBu%Cb}%dB-*8t$}lBuTK#qw6b+ zcj9OJWXaj1w$k@I%C{FCBoYA$1W?DO`SJ0?M61xBYN|#FOgg}J4i4OcDUv;0?U$>Y zPXbT+t;|j}`*4DG=L6ptaGCeA>z)!B4zaJc&)jwj3V|aBwH)*ox6=1Sv_dhXwDel8`lVE+;y)u-6=j4;T+kiqnGMpQ7By-&c;tx#dMWN(KgH zRORYHO8*Raq`9Y0Xc+9HdL_)B-=4}Nsp=ie*#M|mx;5g70p^wcDtIbbK`GEuF;l&)U#Q4k*zqyi69-sTr| zpB#@vom|16ngqtpfQ_Hl2*};X^7w1ea9gfI8BamZzHfr_=jZ#;Q9u)BJBh{tn0Pxu zM7y>%h+U(54KGcKQ>KAlQ66tVsjKZq=@%O`jC5xZ|DY ziAZxx4qBF)o89{Zq}%2uPVXc9LM`W5aVo`#6(OWK<{Gw|` zg?+^**;ouGW=S`LJ=NSBXB~C!Mv}QsCo$}i)?wBE&u3$?p>tTMuwAbLv%1;Yna1o$ zQOl?yS@(=%qNH60Xl_sdoTm_$3Eu(*a}rmpE&paPFiVUeyhm0%+ao>5*a4-#>C&K- z73`|fCkc#xLws$~@H#C{Nj`!R;|dY*`Cuqk5@eL{5K3Af?JZrokCc5YTd!$Bj&jUO zvFN@tjMS+4975aNr$Lwv*pQ5Y^AXAZDxVwHYh0C#O4^4Q`}G@{biJ*^>nMRreI`Ud zX8VN7K$*iW(wE$~3vqgWT_<*)`ix6y1J3V+M5RB~Cf`+skP@76@n23YHT3c1xTa^~ zsYV*`-IBxuDeWDD!a^;t8Ff$a8pU~lM9Kpyb;4mE7q^ir-O2g5U6!-l6-l!CjblPe zo7dEU1?^adoV^5QXNn!S88R(I!R@D0Qy;{j^>ON6))ZG=1H6;M>zh%Md(E?0GPBZQ zElC-6F%>k4CvR8GsOU#riTeUwAwX;!Bz0cx>iFu8rD?U&azc`o9Q%bnsp2v$cmmHO z7b{Z>A@zVMX22S*Mj5~U*q8+9{_^rUUm*hj+HQfVk8u~B*gy4(3#vuUSk z_C*EasdPMu`10xA)MOVI9K|;10giVO%cn%4qR&pp^r=hvK5d8SV$}6EU*&8LThA~U z#uk-O-NJs7N0d*Qcp+84D9SE#$A;fUf4G|M)Pf7ev1siiKmf8u) z79^pCrMDEM$(S^;o*o-(X-5PkhQGSZk7OfKF>fQyvoU(95>!ZpsY-{jXNR#WsCrW& z>|;LIvYqO@UPw@bcc;D+Qp~kf6G)a)qFQ0;!3*VCmKD5*2HBrhN`5}5p_5$@*=$`O zGfo$LL!=_}D2KF)LtOopWzhc_>ihIwwA4=vJ(MnIJ4(K2^xhL{KWw);pl8dM7>hGq zafKCEqCnXFCCco*Mc&S)-O~$$A;~%%yWHf@<4|d&xZe;xF&z$tkSCm)-m?M#Mv_P# zx*e%k<S3JW(M1vE&i)a;YNcwKjE4F0c52a8Hh)ZTw7ZH#baPR6iK% zg7b{PV?&;%_mbdqclXH-jpg;sexN^9-(Fsptg#sl*3bF{%j-#v38mj!)==nX#+>-Y7f3jVS|FZZ0Lpj+$+?oBa zoq1f-ts30YIiwcfZ4g!}d(lHQyzJe;?DJ$Mc*JjT0%xY`a+}icKqW z$fVjCp-=M}Vasm&VlOTGB4kt``1g*xJE>VeY3Epz%QqOj$@Qtmy!@Y}Y%`gEb)-|T zrK@V%Ql{uT{V#$WNa(Jv{XhTJIT0F+5cZ2+>-;Er`{>3}d@K?gc~|sTN990B<@C&9 z{|@ngHMT%3$4;z~nI~J0itmqgBwGQc?VTSCe|6@(W3k_VCu;G7j6A$J(o>lUK*KxM zr2kHRPK+6L;C6j z8odGGGheE^i3Yb8ZmJ1~`9C>q-S~fcW`9pdvbx$mR3=)|uN>?3YK)-40DxaJvP9bp z>uMFJCmGy$IMle}<9lY{?jg1O_41r=xzA_weRU+U*u4K&GN`P~8}rIrTu#0)63u=7 z-ikZtmfhR`P3^Bv@hvI+{R8j+6!|mulbL7c1u7qxnwD5GQ3vOc9Ru?3NKL7tyeD7P zpgs2x$YpyB%!-}}Z%5G=b*jel@$TM7$}^(FLM>-3jM$k)re*&4M^u~XZ(^om`F#ym z;`fc%KW;dN{d15=?6%6B@R;eL7t8lkJod!LptN%SfUWF)*RqWSB$ax3y>WCn4N7a^iRxX)dsbCqQBP76u%`0S zKjg_lpJ9e)p%WV^9*@~^<&=`sqDrUUDcJhBDZ>mQ;G%8QrZAeoe*1>iH=#Id;L6TB z**aZ;)%xkBzBXlK0DXWzhYwP6JbcPPNvW1Q!Q`Ins=-BomBVu|ky?s*0d(Q29}<*v z9e7|dz_g#tK%I3N;iox?+eX^8-;;3+T|N2E(w8NH zE>vgy+FsqnhLN zovYv`I^sb2RjbGfH<%J?0%rRGb@7F62S+jQsvIWPobETzW~ua zSIf*og1V2JEhga#8WIu;;co8Qv=||^mHJZeA8Q4Ut(TSvSL3>7QxkJG+fo*a1o2Ya zB{eoU^EqyXTXcuy?Y+E-Zaus7vL!1m=N7oo+>G{Rg&I^f4H`g7OTn*7*3M7x z>10?}?~QMj*+KBQaN=J3sx)v7*UEVk3l%(S$&Gd^h6ZfBL0Ft`(dii*3)tZQ`ex7Y zTjMT#_kLl|CUoitKi?N9uDv?D12`;4u6o@wAE*>W*L=)gVTQD;Mwu)UE8c!jt_ph` z`fI}CWvK-@%NZGqPZlJ*;n0~YC(~ck*VInoWK;43yK^_CH{H4 zA~Zs9p58#yPt5c|+zt#pISLGPH-p%+{G3%}j_U;IIv`w(NBiq6#|6OLsa`4eH#0Y9 z&Cbs432BD+*pS(Cp+UQE8g*6q80r-<7CP@xMM+igWhnn+;*Dviq4u9{>i=7s1N+*S zGZycQA1wux<;S&9FQKg)GJ)HbiN4R1pTRU(BGb)(w0>Ak%@^j1k#K0 zXrSOZQR_>M9+B9~?m@d`aspl91tvph=e{PtOTL;EcJLcH?;6|L&%0UV@E89(fVu3(LzH6kH64DZabRtH%&3w#0Nh$5f8chBrmTC`I zc*5?`*;$c>t7C@;~*)IO?Cw z4vdfya$f(Dk!+aga*ij(1{$AG=tTQNT@4M_K5Z;cGXBKDFnnBWA9~yS;Zjfy+?4W& zaRfSwhPdP!0v<-~H#j|2ZwTTd`RI%u)Vl4vd$#?Af_AP+y=<2@CoaAg>z9TxquRwE z%MxQkzW^<0n*j*lXa8&#bAAC(w){{+zB9cE|4UU^WBwGh!T*_Q`JbasA+}TF`e2nL}n2O@bCz-9yAL5$JHnzyAQdB%@roO3u zvZ&eQV@Kuyl=-#_p4B`O01?jZpmRR)t091u=PzGE|GpykmnE2e} z*2T*AH_E23_iyvX&>6l^)DBZ~C$ws3-LOzkAbXGTgP8$`ynB$ZtAerAy4tq1&WP6f z8Wl=dB8W@ddej1v({2`aT zY-2N)+DV0?mh0=~$H5xJH*%a$9`&qv@Ij%fJ^cphA|^+AP^J%0uvapCH!uMI0+9@TX zl~By?5o98NfXJrbm;rP&Vfd@r7tk08o4?hS-O1u=nQrFuNnX=V%WU2jTDIV%WRaOU z=Mm4b$1+ks5n!MlRZ*TH)LzT~nEFKC+RHm~Dn}!6W73eIYO0~8CZ>U{e$V11M5TWK zhrDokCJV7C$U2StjUzWTtcmvkXK1G(sopEUe!Muo+0A)2?F6Y#7D@k@b&I8W3Gxyf z6BtI_6^wydx`Zk7wZs4z-u%gjen^k;|u_5z+}!~nPSFM!aILBDj^a2CIy6;n-~ zCY3))sy5fB8b>(L2ZBwjTf>KGrH~!%@{YpoRs14wrOY}#_%aT5M3iL&KytJ%7vHLmiT!C5N>knV;4j%OA=m`GNT0<%7{9jfMg)iiRd= zZ=95(%c?le90a}HdW+mPa;8E@npS$Pn7uyQ&}j-Xn0KY7xSB*vTf9QHf6{XI;#DfwYXVd zJfyCgnTz_@d;ug!KNwxkcP;GyYUj+Nn!L6+p6k%4OhrJnOx6UbLWq!HWDqK#5Ft<@ z2qZR+0%V ztM~Sy>-x0MI^X{7v%mj&J8SP9Wg4tyTolcAH@mf=Vq`$i@jKV&4^Ed^Ig3I!Dpa{R zpj&fcuDRo1JbYoRFxI>v$5AqE-tEM;e1QeK_}(^l7`zjIXJyZ}iL?Z;=*KmvHIrfy zohjR&Lm|E%yF%0a@`*7|nb(Ai)XLH%(=_3>cPI|?_&s2>m%Sht9t02FS76acIFltP zDJ)$9PF*>)eN?LR?_;WXQmpPC=o)5Q zgG|n?L2F!a14b#pExVf*0*9*b@0DEiUt|u=)jI-NMjxGO8_x*CCylWEVRg( z*mU>&`Npsu3Gv2Gxu?vU!D7d1YB){-t6!aYshS)0PTcoe{<+M&ya&!zbR7ZO&Q?@M zwTjS`k-wXe18_RPZLF8qJ4Ct^6Q%f-C)Qv!eO2p7Luf_7ufwdIv)jrP!?S37BsdNU z9zi-=;D%dz`sepJVJ#KRi5ZcR>OWh;D`Ju_c*6sSa|`XO3)-KVRpL=9Hkb4)k>Km> z(vtr2^R46p2f_pXvzN4512ALAVx?IZhi1xWbKgC#qy*lG?5oxMqmZu~BLM z#CpZE+AS`G<7+t$xd|$cMCh)V?&0pinnOj0rPGYRc|^_5aKqHpDxZur*~JxR^5b54 z294e(uK&gJIFByK z2oq@s8mghi<0v^Lywh4^@uA}Et2re0dL>Yvd1Ct72&cOViLQrq2pWX#L)NEWFRV}W z$`pFhp9GKR@sEZf3gc>3zV*9Y)d}>R?1>x8^wt5TM3Z-`?gT}c4Q;~AuIlQGC8R6z z6MyJv>gNVDP2JI*3@+UA%pD=+Q3r3EY)4viE=LqzDT}vBmyrkWGqLn&fT z_mW{#GbNsz?PT(<$iY=qQANTFs*-Qx#te)erG4vxB)!msL~i=E2&&a{(V zkLPdEaK;XWHmCgNMi=BLl=7Azx?vbe$Q7ED(+ zT||0nVZq6=A@GWEw;WV*K+!qIMAJx)y^p$y!jDHd(D1xOHj3X+sd#Rk?X^FdY~bzivUWg>6Eglamf#lzy;HyK5QpBrrJJa3Go zGaKEAVTT3M-qti^QAFh^oB?%l(Ec)U`0MN>UC`F}!}$;d$l70`JE`7Xr^__@ptW*f zTmf_P$`U{$r?kx2&;t)n0fRDM_JEU*%YX;Yo#6T4?=gxcXqcP54a1;|rnA-xpVT<`n4e zFgM4l8>Ohac>f3~S-k|06oB@`N|e;KUQ{{Mj2S0m4fk# z8p;YvPeK57$9F+MC-D2n8r8dlS4D8oslbnvNC_jNXT!>T@D?P9B>hyaE2njpaEnW zLyN-uVE(=N)N#cA&~n8Q+o5?>bLwREtAw&`!bgcQl4s}hp5cH!Z(-P5__S%)@i+4l zDbTjkDY<-@>gMTLM4Z@U8N0$;Yz;UzKSjx$jAD}M;+lM3Ny7Qr6^Qw8hLLXCN1KKQ zTZ{^7BKCwd{8}Qj3}sA&a(cHczQ$(YU#bph1dhTj}_lLfa&`Xtk)-|Y}=+2@S*r0bs2qdFYj;YKd(N= z`E%j^E`3n0f{lFo)^Pa_(o@80=tn>%;jUwh6uJNxXj_S(;W*0a{+y|$JLE%i-m002O% z`uNdP0N~6g0N`Z(xs#MT32ssA0Kg@H>Z6CxeA1RNG;wJI7TkNrrUwcA@X(&JU@nd5 zmG??kr>TF~&}Su|Yka^zpTyE(fw=KQdYMr&W5G4%dFapZGI_K$0Q8PQ(lF}m)a$F? zEY9)B+$;>fbe8@1E$-92C)*YTYCal8LG`>=cXhq0YK;ZFmUv$QQa#10kSxM z0g2r$_IHV|s;oRqnb@lex%>E5?cE&F7y=V1dvL zA&i9ld4nCK-(C&3%;B#T?c&Hjr4?MO^)2T6s(J9(r7A<1G+X zWg3?r=uj!>=}ZpvfUwCGRS@F2WeViY-DU@7Y1sqtB6cIM6GtW3I-xsZBaPPnhEK;? zm0NyTf=CvvD%QzT=J}522w-xpmnHrZwS!?dr{1CNP4yI%>}lXO74!Tw#+LhYIXY znTwKL$hnpIyFKLJW@1AA+uPQyk*nzxA$#HCK>F@&%Nc)N9kVI4>JpDlHtp{LE<9$=drmDgP#2ox!j z6rL=Dt@>vzZaxeS^zxG8b0q;@n|U`=t_G-7+qGMOuQK z7#XEtbI7J;Aj`+%yFTKO0y{j|X_BLJF~g3?%h&DEad#FAj+w{REdZGhM#0kH5Milu zL{%mqe<5j6zb;gdRJNbn3d4`p@`-jXI-Awy_%*xeGB6FYYTld^pKl^9zmM|nCKPa> z$eOK74VSNjR>w&CD>6|w@(^qgSFj>=*oJYS&sKAy%pu-9h>HQXA6;v@Rc!CFAE2~* z)dZ5yeU7r-IP!iX?|AF&==-&rSQQA7P40+#J7d@y2gkbSTzi1U8RIe~Sy^+5fdY^% zw#v|Nd{u~h{ez)!rW7nRd#^YfUi-V!MbE9;cZJ3@)}<&Vk(R@1l}3{eJ6P_#_9_QL z#D=bY-6*i#uAi%@(1*zP5!dR42C(a^{#ilK2%S=G*``kLwiQQAtHSW`I;jB8R^gqi z2{aF!-(6%tEyB~1J-oJGg|M+m9xiYP!gqU0rSxqb6o+=eXoZ*lWcVd$3274%daX23 zPyohUJ8q7Z?q~OM@of=$c46~8G?5o?cMd?__5C0o@TK_MMFH#&>Ba6`7rS81NfM!!(=puCw~kRVi;CU+P)dfkN|~ z6U(T6)g5yC(*3@`im7~u0;c`KA5Wn9{ketCPhtLL?Y&Y$K+v0*qQNvf6uxc{; zlDu@kR6l#Lh~FE^LJ8ki(RK9|CV%@*MRU0ujo$z|!CCMxNR*K9oF zxOtljOQm3oWBa>^Rv_N|z?={z|8jIot#uGw>n%To+zgH+V3#v4xSuV>6@~6cj_a`X z3UB!zPwNF`S}&K?igK6y@GF@3(@e=>b0OcjrG6JhdCxYcO;eGcNS|fbkq`@tjOM&f zHSR)7lMgCc*$8VDLX_Ze^F~7gg+{WF1guX6Rd|q)$c5v4kGeCH9Zu$;)+hct%r+Yq+@sCrMYJTFVtT8 zS3q<;Rzsx453r%Ehx?ONQ9GlgttGzses8D!g1JgpzkHOvyV|a}e95h=hw{7jt5+SJ zp~Q;ud)I0X*n-w@8{<6ezHe5Y7ktaJ34}oZg^vRQa`7Gcxe2tk*VLklx_~%H3rnh5 zyF_Sb+L?IOOY86X6dDw%32+B@w&2drKs~Xa?CCpKPg7XQ?GE^t*UO)H0l0I}V-D(;}br8Uy$+2-Q+2MeyblaY(+eR=~8?&_@xDjQ4C zVml(k-JAI`;6o=Ukt!2Emyf!bq!R-tj76-B!te%Fh|Qt-3zzW$TYYm?feEa=ugM=r zktKYcg5;U4Zxjlk?o#y906V^Vo)u-@Zfk-@dMFa7bxmOh&+Y`?BGU!N0>@J4o;@?$ z$3?CbSIR+!ciYUn2U)va%o2goU7h5L$qU%WRw+XjvdF6G4fA$pAE~PCw?(z74)Tdb z?N7v4tL~C5EQxhk`Hh~4S&aEr;zNBxR(o^eMX$$sf6mR*@dn@T6$GqTq%Q^bmz0Uc zq1vGM3^Yn>C6e8qA)MI0T2XjVFqS*8(uSGoDOk-%ZcKg1P~i^P&aiaIXm<*%h4^p0 zG_~pekivAG_I|s?hF83Y*~?MVvyS-PaGBYF*rIe$)hhpZ;jeyZJ}G3h1w>~{?;3>)8=9T$i%nrXf<7ug}d>uzfAA!v-vS2#LVVEMU!MsU%>I6d~+WThi7t@!|RHzb$H0Vkm=A8`6JpY+@h_Z=A{K{(( za1KHuYQC z#CKJ((x#_Nx5jAeC46ONyQ7Kf-VffWNz~U!O{L`$>O-S%c4yE0#Q*-$)YS#w-o9$z zI;5wspJ3aecn9#{>jHI6Kv6{ng7DHqr|%;gz4$(MvHOq{M0wX&rew;yD#_*3a51O4 z%9)c~E`!#y`uy;e&EyZRP+eVJ+J+5ZTFFRO`N6$SMIFHuQR{ZjJWs%*Pkf@{td6p- zuI;UNB8!T$JhGxYNvxuF zUo?^qpls^kFq&aXbZGs|W)<9*M|JwvQ`?bK8J=aW(&YV*Hm4+Ri!GIIV5_q${l|{o6Jo zqZ*2EPVyp)tn6%-s(j7KTlT6d37)p9dE%ryeh&aGuS6D3fNY2$nZmkz;+(6N8_pqD zM5a!t#B7R5ROLG4pLj46gXhQfhY&6&P^@xqy8LK-2TkMWg*-pN9zRb-W~-zwEpZ#% zV|_)z)EF%R96CftpYGiEVK-^HiMHj@1PLi?e%0}=89Ca|R+Robm67Q6`E6q>!1Ec- zbfex1+PqxK$R$>LlDPXZV)# zG#~MBYJICEz5(d9p4aP}<3#qEnFKmr%*2EBhBQ?15>>@S^bZNe6#*>F)y?ge4Y+MR zA}E@OgR_W)Z7YJ)cLVj--@k_!;HBJn2jx@MmhB9^K!UtCcFT6wVfls91MDnVOK{r< zUOoozBBIeKSKHatjR=ua2;C>2==l*IWZv7G>%4bOO-*yzP6>NkQJanmFPu2Rs1t%Y zm7%fJBP^|_LFf$Uj2W(46dG+cm$A0Xv|7*Guxo=0r~t(#!FrsN3fp^uvZafI5TH{& zsq=$ELGF%M@EtiCyTRZBPj40=}O}BYSd$Px<>@kvF6;w&$I-8(EIS zeYJOLD&{7d9QG4~n(B7@9}K^n{D&4`;{9YLHL#Z4^*I)ABA00o>d5z$RU%aHpGcLe zpIevbcz71m7oHMd;Gh6wXUzLuoq0)BcD%>O$?Kr^;YGXlpBk%YuTC@chn!;X*AqMp zPWaLCKKkbRWo8QaY0JsSm2)0edtpI}U8{xXEbP1kbdcDjccO<$-XobD!Izo2M;bGJ zoHa=cu5A1iGu43qnNxF+7n-jRtrCn2dFl^3b2LtPwQ66Pg=oF+EjF8HIj5^)!devRIlbQE z#h__g?}xUfw!EF8Hvf8y&v$Q~llZb>v!hSX%-BG1E35GZ40d-+pn8AT0ZZzugfvJ^ zim1lU?a=K8*)edjx1K*GwXgAn5GJO`{LC2QRpL%@<-s)9XdHX+feun;MFgT=D-t=E zC*EI38mRqdv&EgyxoXG5l{`2&C>&GS(BLti2fPe;UN}s`6Fua6gssHnZUHPih5f(B zj#LSd`@xYxG2q!%5JH++4*9O-125RD|NczM%{-0+vv@n8jJsBql(aM9?fJgB$mLs+ z`T6;i`r=Awj%ZGz$$3<5C-a*U4qpisX^f=l;V#8-CIYHo*bOXnK9yp@N#t)K$Uf6e zlVkSKMTed!%(-B&NE{=_(fKCHHW!dP#ZU~t@KeZ_EtYaW=_%_Ex4o~%#(4qY#h4oi zt}X}i#N%m(JdAs@u+gg2-hy1Zeo;p0t#GHj%@n|;*exMaOM3HY@|gqapE+TUgm1g! z17duERnL%u7Xex;wb&xL>Z-D>RySAbGC@Ajc&oOb#*-7TuEZ%bYMQ5g+mHz^3l*)v z?k+HJk3l`0P*i|E=j6+PTgnY?Dl6u|UjFHK&tjZ8SD*8!=6(S@XdBs^7hp3p)p;jE zZKF|pP_&V2Yb1WB3cI+swz$aEOAE--l`C2f<7-VVxRO0%sy<#f!*YR(cknVZ6FC5z zDiX$K^|@*Y|Hb4mT~#Dj#zm~ikB9c;Qn3~coiLL*6iZGJ;_cK`bqHxcBZH>lfY#CI z;J7VUG;#2Zd*55tpKfE=QdqE1Y-0q*pZBKlhidcKH}X^-^}4Hr`xhT;IcWJilVeey z+jeGSP}Ias$VON!Y^e_Hwr+~>(2a~T!}DrXk$z;g@7tnjXv2yP+`z5oA27j~ZKvMd z=liH#9P#C<&bhZMvwI1O|)gqc~tTz|~3C+BBnq!}=tev0{;%Uk)}*j5jYS&p$nc zS>QY5z3YDwnVdE#>WPJl$~7e=q*+|+-c(4EvY1^&Z!s^?UDP6W=ahFZtwew|jeV6e z6*66IV$NLa7H}5Ih`{toekO+J%`XefRY}(FK@dzfS0q5DzMHSOlwv}urxRi;aTc6h z)*bqw)a1dD264F`H?=bjk}4hja;IZFpLx`-bCXG~?o;us%8K$*mS)AyX= zdVF`yd&;L@jwKzg$b}WTZpXzJG<}aRizJVL=yK;#hp%Y8L;5^&5w2A^wyIj6M4E=5 z4DU^g>U?3-8i1xcnGq2gPyxsrxI>`FV$5p4Aa5?IuAt65NRA3rnT=!XC1%E6icsZZ3>}qWsXOEaySgB^UoI>!Q^&n3E!EiG6Snj79u$g0A?maGk(a%- zOQ@LJk{`8lne$`!l>KaX_ak#dK7bgc56|ewbHnCM3?(O1eLc3DQRT=wZjJMHgKLDw zGlVzT!hp?;$Q;)>d?a1$CS1WH(`KJA{N{CD{0J}3X35zQ17Sz_+sgCum-80T<@tZ` zeku|xnN74Qx<_EN?Rg%*Qx5qi;?XulGhd3M@~c^ER`9!T*&DCF>hA&ZsLpo@PB}xX zBLA4$MX-E@b-<)AjmHVF+|_P43sP; zS7Mr9P5+d4Zn-5l)cL}5e8|{#h(6=_^uEcJDF$*51Kpj2GPdqs!|g^@dopFehk?B> zn2Md(RG57eveS}TaBxgo68^O&kc?nF`j+OXx}6Ap~C;M zt0GF}fyf;UQkwAVOP$TejqW&Canu*^no}-v^4j(X+vLo>*W=%>W^XZnsZs!Li};VP zBa1FJn2RnWrp+0`2A z4(`p7ExU1T-`@HAV`h76 z1t_axlXT36M(cZ!0LBIO78H63intR{EO)_a!X^rpX!q-a7{Dr;1+w=WsoQKU#|B92 zK6_$9fx+v0&rZLhMcbn1zT)~}XNaQ@2Q2MUZXOr{TzK5NAA%RjV3DKuqwdo~<>ZBM zn`rG`^wmUt$*})|;3{V}FUs62yY7A|At+tORevjd~HDxqwr2cUjEJ^EOC=Kv0qjqQ!K794ZubFE?ZmADZV zaXhPJnIL4A>1=nMmO?>ec*b%;m3T;OK!=O;rz%@k_gxdtSNA^SOACw#ueT0vFW#`a zC$fcG{&2HB#__i1Ijx21UeL+2OEp($pkVYHtY$5|QM9EDPfb)OFAoW&xDsEzkKpc* zytyx!6R(wg{!{|VCwGrJ%~yzohgAiMwoBE|a)RKy*>74rAGPd_+6GN}3Z9Zk)k7dEE;qd;6+mD+FM@zbhyZNiz_$iCLT6Z(Nz`k1w!q3eQ)+S=(#Jiy7s;b{#QZ za&L>7JV1{q9`7u;o01{5|8T)KUTgaKS&v4u>n6JLzlvh@k@E*?s8MIkZoe@i^-JAs z(YGBG9n6yx+?00cEDR->DhRV%^P=AvF&HpZZl?J)P=pu`MU8gSkY)3hc%tCpvE( zTu01sqB13mC z=N0@z6pKS*0QZoOL#B};p&7><5vd#e1JT9}#Dtj#aPRiRF>n3-sdcvXLnXpMcctb$ zPd`F^-3)h(p%sJNlT(83Ze6sw#J$XADrQMw*ab>``iA9$K@Ae2jsvM~Cikq{_90R7 z`cUHe`M_Y@Snzr$ZM-@%$xvn@R^wI4Cw#&Hj=^QkJksaGQOfqg$5*E)%{wzsoo9gO zaq)AMP=wJg_lxUcau$V=156A~AH_lsw*F_E_M_p$%Og}+p`7Mmk1l-0csrCXWoUY`fnZ(YoZAdJp<6v&Z4q0~ z2ZI*z(#>7DD)BO7h>G)@eF#qtK~}4$^YG<#zEVgk5W${WPTdwUUt7CtB&*e35pz)z zZL|RwAan=l173OL@uz+*YSSCAQv6DhS%j~sWm3u3S4DFyugJ>s>FD!}Z25HLhP2D9 z@}0hlmAy|WIj>WqnNI#2oV_o7WVl;s2br_%fSB&SFC>=U=2jcxhdv=ZHN zh<`bbX3@CT6sFJ>jo2(XpQ*jEW!z=)gV!u;&bF`9`UUvXrq3pcp1ZhicOiwdKPkR) zziz&fq)?!6?h51i&rGhI^WI%59wz|Z6`Ybh-uFHyyB+BR?Ah2;-R818px`K+*k1{GmD75dxO!G3j-?(&P&!G+%Y=Y^U zWrw7Uw3SIW8uZj}52N$kM`cRolAnC#!Mx%i%-jWBV&r8SeiQZ&EkIR8C*?#aMb5b_ zmM`~wt~ZzfXBw49U%G>3rasZy=2_%ltU0YT zD=GGUzSldoY};4ycr>J<%P`#q>;2M{hkrad=q3||qA^jKHkbLk^_k=J4Yu2Y;UJ*< z!eq`s*T}a_50}Rx@6zp5pL8^#Dz16QnLHd4Bzn)&Ar1K{sdj$TcF(o!yIN_yb8M6> z|HQ{{dnF4D*H=^}T0kJPOkUm0pH@c3#!ZjWhlkz1u){}^5Sv@4gtP2h6Ja9&OxG$B zIDeH^QLpdRN$nKnS}IwTUqfzA&h@v9vHPEy=GAov?0)immU)xC$7f6H3+S%7LcUH< z5gIshwi;BzpAL>^m~Qxs^{MX#!eS0nhVN1q+9aAHTMBFZNr!#+)%Lg3e2*&O#V9Es zRda->em`m+f&M#9aZbaXN;nr59kbdAKJ&bA6TbXAk@b=wv)_YP9-lo=Mb3;B5nc)c z7(!+giuU+cFVJnha(&oy>SP+ipA2Z?oH%N-xc|2_`mB_(ChCbJl`LIdU9f%IP5CjTWfK!q zSa64P4KIPPtb?jEz6};h?qoo22`NqkLnYM z9v$W5;|tt|nH!rzZVnZN7jeGaTaHhp)bvz{Rs}t^rada->5e6@?|{q$y&&$2wU;Sk zN~);u)MPHlk+2y`>!$bNlUxS z0LSRn-XD*38N8OQSTSvX%2LVDa0G<)m594SIcWg^Mz^+YS0yE-=Y_v)I*g2s6nT$x zHNsQS0|}^raAm+wzB%>hpMR7=lg*O3@53AGQf2?vZLt2ExNxPTkEJCK*Kyg>L^-4y zqVo4bIjvaxhJe4hWT~^uIi@ICW20$-Zn+ajIU^2dT!i|`Y>WMfktn3^!sPt@hSFPU z#`^ryL&mZ)$UpkrP(b0xt;i=&>y}F{`_8I6eSGrww_P+2i5PbsN${VlAyW+ay6$+* z?K(U%L9?#cpBAiPQh5u$1}`LDIdC?^O6_}pyb3e;K7=0Q1BhvjzfIq zPP*O7@>FZ7ah(gps#cO;fCCOgV2UC=*S9YHD7>b;;O`igx6A6`{y-&gO<_b|Kgf1< zi4;F`E4B{XIe@vhuJ27N89vSpy-2a$bmP;TKiMZJR=K6te2b%IFK`b&^R&TBM{zcN zcOc|9Y1v6doa^gDqt8wlk95`R!az}%+80yleAHaK704B@|G$#k7jx`3yfXfSzVDPDIX)dgVs1x z<64Vszd#|+vqFUD6CJlzyQGZ+Qd(-+C``tyFP|V1c{ov-(1bxv^c zD#c^A#aRs*?p~KDcUeIKJDc8R{Pk|u>o+h2Jr9FuD`rBJcf6_5Ii{QVFUcg6zSRXkr`|6+>H18|)d<}_#mzy9c0to8JibNS zYmJM=-3xm^E@`I14xk1pk%v6t6Oz7&t5Hras}Ev4Kd6=PH_Ux3ZH^iUX&tSjbF2<^ zL-XIKklF8NY;zcHq(d#YNkk)7qyQoxR799(5Ij`;ViaJ0I5L_t2&v1$N9=@RAG3Ce z@>5%&R9me%N0U9wS9#v!mn|h1Z`KZuc`vxa5NzYRm3zqiZ&lfW&7K!Kx|QM~JFs+S zGz__-?Kcxv8VarmHdMXa<9`7ovFOY?Gki8VtF(Y`%p{rldv3;?SmqWfZTqlroBuHs zg62l@GJsWK;Ry-j0}q5a=Pf?=^JR2XKsS-RN_#iTrNR6Hw^eJM%s>E`0BHcCyADPcHI#fbexs z`r1m1qoi8yg*r-7?F`L4RZH|@N{V?ssqd)oxkyLx)QWYe4kZ<6aGylUrQW@J zcifkl_j(VpvEfkXy?l{tF5onCmkNaG62S7&zfbT5N1@V9b&SiVZR<|n^CxzJ?`S5A zI_z|6zfhK)U<4v7zv3QCpT7ZkF+~5*DaWq|y|zFR;&hpUG-r;$rPKg<7%7eTK8kzQ zl1Gj*!#Mr8p+P+fan=ifOEoz%>e3ZC4oq6sN9m9jyX{v^=m`{Xzbz0lyCQ*=^4l`F zbyhPp#VpY4pa4jyoALe%@l`9?m64fe!Le#%^f1~6|Tm^iv#Cg@s-Utby(d(jxW|CEUV8W&t856tP+%{@MLB?)(w*2go3eOa`nHDkX$REG z`*aF}j}gnFd`|MYW50i;!`J+W5-LX?!4=>SYW-&#GhfQjUTuCUD-%iV@Vb8bg|?oy znOO$u!e_N3cKMyqH$I**bCXgiKu=FU;wXOUZGb$sr>AFdFySRI)l1@}_Q46t^NE0H=kOD4qlxwJ+l+7gB`TNoP23b~ z@15mzd0|%syM5H}`OjJRn!Xh02fXUz?K8BrT*}82d8aPFR{Z75x$yIC#)fY=Bm=^Z zqI(X(8rGe3UQ6W-y_Dl{-W7lTX!pNb_+M<|kC+4_L=yymc_WNC{PQjitetQ@`L7CB~AW^567}NR+Bmx@@fq8PkccvzFu?}jnVL+y6p$jjj zcO&zdf-6;q@Qdb_5DzSMo~PqVlt*4+v@sEpn;DrWfqCrdOv;u6!9gzDsuCY&iDy~4 zxouA$eeY+hKs?6OVy^JpdIVBR0bKZ7E+k9x)>QgnMO_O6>&lH^zk#Q56%$J$exXv= z8iTuAI3<$?h(1N%)-xhVLUP#(xq5=+?zrS;J%krkgo2+##tdM8WMFSj=2R4+iA@5J z%qI&A_FnA+nZJGzcRICAKTtqj;eFRCO*xszmOlo_*-O zp={h&&W7rG(iGVJKsj;QCD6S&BSU6ZeP1J5RVAg~ry6TPQPUUe>I&=`NPBB72kAub z&$AZxgglzIj!x@7JwX~p9PuYn)2jw>tQ9?IOL_ur>u=HW=|k}5aWZ>S5h)ob+?Whz$%;a>kk3ozsKf{vvy54^FC&nt`{ zEj@fjhjL`h&|!*?=To;vd|Z6146V22nv|b5O9|<8GGadJ~uqLwPe1Pnsq-lEg2U3ODYGnl%ld*sV33g6Sw3JU3j!8*P<B)WetptnUoE5 zbqCh?n11{ZqwfD+ME*bftXP&ZsRuaR;st?L=~3faX|#;Yrk$#x__JpTx`S5sE%DX? zW}v^Dr@KdyV5ymYiaIta8~(Wr&c#gN0Tv-0Nk1K5vHsa#kBblmU+=+4vR)OOhc6v) z`LGy);?C3Gj>Est9BpD3Sr{n=3vb)QegFJGNykziCKK`f_SZDg^Use(Rj#RpOpzOr zA4OGf8bwWauGj}`MWIvo69=%`U}C8o`(5RuvOMAaTIr_u1s^Wz^nP2qkb3{i2A`$6 z#G60M`X<5Bmi`H6mjm|};ap(r)sBX>i8-ilf_(Ypp~Fe;B(d3@R)1#(WsiO=wCBww zw&UMrvd@MI#)XUdpH#~k_s>|)VVWwumQIsJYXqqKYdLrj1b;i^m{en52{LALfn zy=}f(oK_t?gqJ(?K?`48N|nIVF_7otlG)XcjiPKmKLTNBw-d!~O!%vdI}WdrFq1#x z3&44XEfSTOgKUMi!MX%)E>+p};KU-3y0~oMd}W=VPShHjgAN6G*>phO803x(WvylB zhungDkjJi8MJIv5yVo1lfg>!pDW4MMVPQWzKh2E1d`yie8r?@QV3Smm?VOkTyj-=H zank1aTt|_)SRJS>(rL7DPR!h3?>YEwq8TxENpYAo!C-bXfIiBJ+mSuKU&z@4r^xhz z@k&X-_S*w?6EjxaTEz1|p#N!k897(6%p9oh7^AjzH{|9f9y$>l<%u%55s9aiXRw}w zw7iNd!nn+&C{+7AfxJsN4vl*BpZMwx<>mDRbf^pEg}qpY`gYCvCU(<$0Hs_Wv@O?o zG^MCei)i*LN%$o$CK2Ox!Os3x+vhhmwZ;^Jc2*WOZolCzQ>gz#{I@8sj5cb#p`Jq5 zu%W)oAK7eJFexp%8BVYm%+>GOtkS%8yNcJU1;mr<%Q?JW2Q!7d#?~8cS{Ydg% zV)0;*-$26;xbr*Z-DpNBbwSDC-6%Eks9ls8{(MOXg?}HFmolnSgr3+tn$k+aMcv;5 zRa7K(bZqslLPSEQoqZa+bp`S5yw;9sgZ0!2;S^EcO=tDe%5t{ll(t6$raG1RJJxU+~(9ZFdAX(k+&#G;?*BsDlP-aF7U zK9UTg=_t+2DlII%qa)ItpLKzAf->HxYh0I=SAt5>=i4+39EC+cGEi<_`lEyVa}yR$ z8CZCq0&0vrTofBnKlvlb>}S=b<@P5X)2DyZ6j3*iawBnBMcu#M3(F9n3$hVqBCv!w zYegk%Lu<`k8xzBp`Ry(42}-X|Gt6>vz`=g0Pr~n|&_>duMvWh%Hl`OlT0os=7mhWE zPeC*2x|ExnZ73am^{J@Jgd&QCHrh1+4u5PDV>12wb!K0L$d}HfKVv=<6`R|v={v_C z)28~BKH#e z-_JIROxJz%QM5SyH<^Q^k2l?m5QE@_j&|bEX)R~{X&NDA=4;2KkrA>YU|XU0vbWw_ z0sCeMf6$WhnG%GP(TxZe5I?!m|Fw=(v{pJ8JLU!lY?;l6dCG#mn zHiOzVCK@7tV~J;yfVuzjj~eheORcf9zl%e45h}Z`%7w;waIAdo2cGC)UKgl(E)fG! zk!G;@gFj;Lb!|eDMCG<$3TnXX-A1avA*CL596P?UxuJMk#KRPGf5;U(e#j?bhoun-~Qdq?I{|@>XMeKn@F%ZaZr;kqz=}wZKb0W z<2aQ|RmBf^xpO{h%(YcNrco4rj;JTpAYd9ky(gO(Ur_A7F-U|pcn~zrc{-oeOlH!y z2~u~s)_bBFsj6~3bhVIuSHwI<%Huoy@P)wWi&NG0-m^nXijGGW??(he`KgD;W{zsC z)|1Qvk!5Vp$z=?@GYgOj;;Ax;CyFK(Aq0%($Q8&Kjarv7;U&5<5_Sz_i~WLAq@jfua$B+G1k zGOtL0ParaW;@rg>M~Lw`3#uk=oN)tskmKIV`RW+od!LvkC;L1RC-`>riOe1E3?BAo zUhe6|&}tLSyPN|#Ok4Ls=P9Gdh(KR>o0wM48rb@)>#O+N+R6*?cZ7UsFQu5dOS0g@ z{pjNnpT<36thm~4&&??TFa7cRks0O9|3TjMkKDB&7&0g(^2(uy4=-8%_IkvrYp0Y*;~XzAmv#zRRt7@)%DayqEM_&BZaF0gD#fCbwTf0@V;M}Ev@V!+B<&Q6OYm}HDClO`f8*~R~|6aNlFIK8yNrZ1TM zQt`(oIFyRbm&^4^>&;zGV22Q&hI+C%A1(DFQ%mshU&J{kO4FjLtI(+qNDDY%sp67Z z9e8qsTMuho-9UQJaw?x*J+jIO>1XLq93Q|;Kf*(1gSxJ_gfE*RNPF4M54mv24+D4z zd^i`BKDCmeDDBchNiT=TN12!3LSVKQ!_pBJDkgvTb9Wh0Fz!c+3v`X9xqKowF+o0% zTycucZ2y6UPwOf5s3EK$M0$L>du>9_PIet#+jzAWd@UqRRIVb6(4<{C5fx^kV)bW!s;zlnOd95LXA8h|rsPV87;-0R zU}@gT*Tr}^{SlpdVh-0NdMR;d<}yU!0IhGc1M%Du8|oB{?5=jubotDb&~3WuelxKU z<9*Ou(>gjXy!)9FCki$B|Eq{!rV&?YuXdM}UpBNVAURGKw3g=Lfy@QFi?8DQL)a8Oq;JH5p&$P67Y z!aX07>>;#rL;2&+OBVRCkyA_;HWsYGSU0DVnQAK;AQXWlVQCosL_rlq^=Q~?gxp2x^9@A_qh84FDb{ERlAz^CA>QaxMVXU3Qd0T!v zsDfeb+19tssfm~a5?my7ygenJhHcy=X*8x=E}6iM!XC_~UKhL&9K&6FzK-g`$>gf- zkHIvn)WN}0y>U|%i$kZ2Qeza zm;Vou{|I&Y1ACWV0st4Kj{Yy8!4-MqIHu&*1#+bdpe{5(pGw(Xd2obu502SnJx?l0 zc0T^b=CN1CMNh@WvJXu^{yzo2$I$luKZm-<6!wzbG0W2ae+7JxF^%W43SD}eYj}=o zudwSy$}Xo63*gH!mMp8|EUL2kzrk)~LC3yXd|Bz?_k0x(cAN3Qqhs2V z;Uci?w(9UY7Jaac6vZSN>9O6uGePO{e5;}=ZNMm#TNHcnGm&AOo)xXV^`Kh4#Z7Hn zq90DusyI4G0NrXw>~P|U9d-yg8Sejvne;(+(L@-zXWIjO&AGvSb={4n_<~VP2nU94 z#peYf5yn%f`tka8{=gS1jFvWnsoqCH^`HN6IEp;sSEWA@@UZ%FLMfHO(TrrK5H^&+9jO&?0Rg2UiN`R?fo7tGeg=iv2Qbe)hjnzL`?ZvSD$gPmz2 zyH<27<4A!{oW6Tk#Zb;$No2_#L|?35A)%#Ftl2mblP-#`6yrZIvXK2%F(gDA-~j&R5g6AGVL5DyP<#pJfbe<0v$@xbCo23=Ao-z1v2ivfER=GS2DAr&*5hvi9m(bN(ZU z4Z#Q%j|9YYq0;>A7BUbU?dlGVV>KZzajbtseaabMnc&(IGj~8^1DzFu(U~LdCL5

c$ti1S1kI|^)y9-yI`1LB_3HQbPRL$Se#f zfbg*<(6^y{>camTO8h^E49EEMA8@t*#6%ssEUz$;ima z?@7`1@yF+!;G@~uStlo_*Z0_c`C=tR;~4*B;fo3S>rW6>A zjPOpsGuqgpJlW6->5csh`%2xUixTQs{d zHy6y#DBn8UEXCXAum46w$M2ZpN)~r-@&E)c9j7e*ch#A2AG!O#2K$!@{^bS#+6WW> zGQq!0!2K^1{L2Jc|7jEKk||V_Ob(5s83h0UXODu&QvmgMSvvkFZ-FRx0IEt_kBStY GzxglizMlsG literal 0 HcmV?d00001 diff --git a/docs/project-cards-activity/screenshots/prod-mobile-dashboard-after.png b/docs/project-cards-activity/screenshots/prod-mobile-dashboard-after.png new file mode 100644 index 0000000000000000000000000000000000000000..edd4b3052667c052c4d43286282f022c0889ecc7 GIT binary patch literal 17556 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 Gh5RpZ!@2DM literal 0 HcmV?d00001 diff --git a/docs/project-cards-activity/screenshots/prod-my-projects-after.png b/docs/project-cards-activity/screenshots/prod-my-projects-after.png new file mode 100644 index 0000000000000000000000000000000000000000..27c93286cfa2d5d4807ea8a349c4e92ae1891340 GIT binary patch literal 17784 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 Rlz}TC#b;_yVNZSR9 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ŃE{t(7bbqJ7Naa1S-eHS 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 literal 0 HcmV?d00001 diff --git a/projects/social_platform/src/app/api/project/facades/projects-info.service.spec.ts b/projects/social_platform/src/app/api/project/facades/projects-info.service.spec.ts new file mode 100644 index 000000000..6f29b87e7 --- /dev/null +++ b/projects/social_platform/src/app/api/project/facades/projects-info.service.spec.ts @@ -0,0 +1,77 @@ +/** @format */ + +import { signal } from "@angular/core"; +import { FormControl, FormGroup } from "@angular/forms"; +import { TestBed } from "@angular/core/testing"; +import { ActivatedRoute, NavigationEnd, Router } from "@angular/router"; +import { BehaviorSubject, of, Subject } from "rxjs"; +import { LoggerService } from "@core/lib/services/logger/logger.service"; +import { NavService } from "@api/shared/nav.service"; +import { InviteInfoService } from "@api/invite/facades/invite-info.service"; +import { CreateProjectUseCase } from "../use-cases/create-project.use-case"; +import { ProjectRepositoryPort } from "@domain/project/ports/project.repository.port"; +import { ProjectCount, ProjectCountLoadState } from "@domain/project/project.model"; +import { ProjectsUIInfoService } from "./ui/projects-ui-info.service"; +import { ProjectsInfoService } from "./projects-info.service"; + +describe("ProjectsInfoService: загрузка активности", () => { + const count: ProjectCount = { + all: 12, + my: 7, + subs: 3, + myLeader: 4, + myInProgram: 2, + mySubmitted: 1, + }; + + function setup(initialUrl: string) { + const events = new Subject(); + const router = { + url: initialUrl, + events, + navigate: vi.fn(() => Promise.resolve(true)), + }; + const repository = { + count$: new BehaviorSubject(count), + countState$: new BehaviorSubject("idle"), + refreshCount: vi.fn(() => of(count)), + }; + const searchForm = new FormGroup({ search: new FormControl("") }); + + TestBed.configureTestingModule({ + providers: [ + ProjectsInfoService, + { provide: Router, useValue: router }, + { provide: ActivatedRoute, useValue: { snapshot: {}, parent: null } }, + { provide: LoggerService, useValue: { debug: vi.fn(), warn: vi.fn() } }, + { provide: NavService, useValue: { setNavTitle: vi.fn() } }, + { provide: InviteInfoService, useValue: { ensureLoaded: vi.fn() } }, + { provide: ProjectsUIInfoService, useValue: { searchForm, myInvites: signal([]) } }, + { provide: CreateProjectUseCase, useValue: { execute: vi.fn() } }, + { provide: ProjectRepositoryPort, useValue: repository }, + ], + }); + + return { service: TestBed.inject(ProjectsInfoService), repository, router, events }; + } + + it.each(["/office/projects/dashboard", "/office/projects/my"])( + "запрашивает count при входе на %s", + url => { + const { service, repository } = setup(url); + service.initializationProjects(); + expect(repository.refreshCount).toHaveBeenCalledOnce(); + }, + ); + + it("не запрашивает count в остальных разделах и загружает при переходе в my", () => { + const { service, repository, router, events } = setup("/office/projects/subscriptions"); + service.initializationProjects(); + expect(repository.refreshCount).not.toHaveBeenCalled(); + + router.url = "/office/projects/my"; + events.next(new NavigationEnd(1, router.url, router.url)); + + expect(repository.refreshCount).toHaveBeenCalledOnce(); + }); +}); diff --git a/projects/social_platform/src/app/api/project/facades/projects-info.service.ts b/projects/social_platform/src/app/api/project/facades/projects-info.service.ts index fd5cc6d3e..1f9142a98 100644 --- a/projects/social_platform/src/app/api/project/facades/projects-info.service.ts +++ b/projects/social_platform/src/app/api/project/facades/projects-info.service.ts @@ -9,7 +9,8 @@ import { ProjectsUIInfoService } from "./ui/projects-ui-info.service"; import { CreateProjectUseCase } from "../use-cases/create-project.use-case"; import { AppRoutes } from "@api/paths/app-routes"; import { InviteInfoService } from "@api/invite/facades/invite-info.service"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed, toSignal } from "@angular/core/rxjs-interop"; +import { ProjectRepositoryPort } from "@domain/project/ports/project.repository.port"; /** Координирует верхний уровень раздела проектов: табы, поиск и создание проекта. */ @Injectable() @@ -24,6 +25,7 @@ export class ProjectsInfoService { private readonly projectsUIInfoService = inject(ProjectsUIInfoService); private readonly createProjectUseCase = inject(CreateProjectUseCase); + private readonly projectRepository = inject(ProjectRepositoryPort); private readonly url = signal(this.router.url); private readonly searchForm = this.projectsUIInfoService.searchForm; @@ -33,11 +35,16 @@ export class ProjectsInfoService { readonly isSubs = computed(() => this.url().includes("/subscriptions")); readonly isInvites = computed(() => this.url().includes("/invites")); readonly isDashboard = computed(() => this.url().includes("/dashboard")); + readonly projectCount = toSignal(this.projectRepository.count$, { requireSync: true }); + readonly projectCountState = toSignal(this.projectRepository.countState$, { + requireSync: true, + }); initializationProjects(): void { this.navService.setNavTitle("Проекты"); this.inviteInfoService.ensureLoaded(); + this.refreshProjectCountIfVisible(); this.searchForm .get("search") @@ -65,7 +72,32 @@ export class ProjectsInfoService { filter(event => event instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef), ) - .subscribe(() => this.url.set(this.router.url)); + .subscribe(() => { + const previousSection = this.activitySection(this.url()); + this.url.set(this.router.url); + const currentSection = this.activitySection(this.url()); + + if (currentSection && currentSection !== previousSection) { + this.refreshProjectCountIfVisible(); + } + }); + } + + private activitySection(url: string): "dashboard" | "my" | null { + if (url.includes("/dashboard")) return "dashboard"; + if (url.includes("/my")) return "my"; + return null; + } + + private refreshProjectCountIfVisible(): void { + if (!this.isMy() && !this.isDashboard()) return; + + this.projectRepository + .refreshCount() + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + error: error => this.logger.warn("Не удалось загрузить статистику проектов", error), + }); } addProject(): void { diff --git a/projects/social_platform/src/app/domain/project/ports/project.repository.port.ts b/projects/social_platform/src/app/domain/project/ports/project.repository.port.ts index 24c9dbdd0..1a61a0073 100644 --- a/projects/social_platform/src/app/domain/project/ports/project.repository.port.ts +++ b/projects/social_platform/src/app/domain/project/ports/project.repository.port.ts @@ -1,7 +1,7 @@ /** @format */ import { BehaviorSubject, Observable } from "rxjs"; -import { Project, ProjectCount } from "../project.model"; +import { Project, ProjectCount, ProjectCountLoadState } from "../project.model"; import { ApiPagination } from "../../other/api-pagination.model"; import { HttpParams } from "@angular/common/http"; import { ProjectCoverReset } from "../project-cover.model"; @@ -9,6 +9,7 @@ import { ProjectCoverReset } from "../project-cover.model"; /** Порт репозитория проектов — контракт CRUD. Реализуется в infrastructure/repository/project. */ export abstract class ProjectRepositoryPort { abstract readonly count$: BehaviorSubject; + abstract readonly countState$: BehaviorSubject; abstract getAll(params?: HttpParams): Observable>; abstract getOne(id: number): Observable; diff --git a/projects/social_platform/src/app/domain/project/project.model.ts b/projects/social_platform/src/app/domain/project/project.model.ts index 6b6e6d669..b08a904eb 100644 --- a/projects/social_platform/src/app/domain/project/project.model.ts +++ b/projects/social_platform/src/app/domain/project/project.model.ts @@ -97,8 +97,13 @@ export class ProjectCount { all!: number; my!: number; subs!: number; + myLeader!: number; + myInProgram!: number; + mySubmitted!: number; } +export type ProjectCountLoadState = "idle" | "loading" | "loaded" | "error"; + export class ProjectStep { id!: number; name!: string; diff --git a/projects/social_platform/src/app/infrastructure/adapters/project/dto/project.dto.ts b/projects/social_platform/src/app/infrastructure/adapters/project/dto/project.dto.ts index 95e5146dc..c3451f820 100644 --- a/projects/social_platform/src/app/infrastructure/adapters/project/dto/project.dto.ts +++ b/projects/social_platform/src/app/infrastructure/adapters/project/dto/project.dto.ts @@ -52,6 +52,9 @@ export interface ProjectCountDto { all: number; my: number; subs: number; + myLeader: number; + myInProgram: number; + mySubmitted: number; } export interface ProjectListDto { diff --git a/projects/social_platform/src/app/infrastructure/adapters/project/project-count-contract.spec.ts b/projects/social_platform/src/app/infrastructure/adapters/project/project-count-contract.spec.ts new file mode 100644 index 000000000..9193c1a0e --- /dev/null +++ b/projects/social_platform/src/app/infrastructure/adapters/project/project-count-contract.spec.ts @@ -0,0 +1,51 @@ +/** @format */ + +import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from "@angular/common/http"; +import { HttpTestingController, provideHttpClientTesting } from "@angular/common/http/testing"; +import { TestBed } from "@angular/core/testing"; +import { CamelcaseInterceptor } from "@core/lib/interceptors/camelcase.interceptor"; +import { API_URL } from "@core/lib/providers"; +import { LoggerService } from "@core/lib/services/logger/logger.service"; +import { ProjectHttpAdapter } from "./project-http.adapter"; + +describe("Контракт статистики проектов через общий interceptor", () => { + beforeEach(() => + TestBed.configureTestingModule({ + providers: [ + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting(), + { provide: API_URL, useValue: "https://local.test" }, + { provide: HTTP_INTERCEPTORS, useClass: CamelcaseInterceptor, multi: true }, + { provide: LoggerService, useValue: { warn: vi.fn() } }, + ], + }), + ); + + afterEach(() => TestBed.inject(HttpTestingController).verify()); + + it("преобразует snake_case метрик в camelCase Angular domain", () => { + TestBed.inject(ProjectHttpAdapter) + .fetchCount() + .subscribe(value => { + expect(value).toEqual({ + all: 12, + my: 7, + myLeader: 4, + myInProgram: 2, + mySubmitted: 1, + }); + }); + + const request = TestBed.inject(HttpTestingController).expectOne( + "https://local.test/projects/count/", + ); + expect(request.request.method).toBe("GET"); + request.flush({ + all: 12, + my: 7, + my_leader: 4, + my_in_program: 2, + my_submitted: 1, + }); + }); +}); diff --git a/projects/social_platform/src/app/infrastructure/repository/project/project.repository.spec.ts b/projects/social_platform/src/app/infrastructure/repository/project/project.repository.spec.ts index 6edfd5671..80d9dff08 100644 --- a/projects/social_platform/src/app/infrastructure/repository/project/project.repository.spec.ts +++ b/projects/social_platform/src/app/infrastructure/repository/project/project.repository.spec.ts @@ -1,7 +1,7 @@ /** @format */ import { TestBed } from "@angular/core/testing"; -import { of, Subject } from "rxjs"; +import { of, Subject, throwError } from "rxjs"; import { HttpParams } from "@angular/common/http"; import { ProjectRepository } from "./project.repository"; import { ProjectHttpAdapter } from "../../adapters/project/project-http.adapter"; @@ -17,6 +17,7 @@ import { removeProjectCollaborator } from "@domain/project/events/remove-project import { sendVacancyResponse } from "@domain/vacancy/events/send-vacancy-response.event"; import { acceptVacancyResponse } from "@domain/vacancy/events/accept-vacancy-response.event"; import { rejectVacancyResponse } from "@domain/vacancy/events/reject-vacancy-response.event"; +import { acceptInvite } from "@domain/invite/events/accept-invite.event"; describe("ProjectRepository", () => { let repository: ProjectRepository; @@ -39,8 +40,19 @@ describe("ProjectRepository", () => { }); eventBus = TestBed.inject(EventBus); repository = TestBed.inject(ProjectRepository); + adapter.fetchCount.mockReturnValue(of(activityCount())); } + const activityCount = (overrides: Partial = {}): ProjectCount => ({ + all: 0, + my: 0, + subs: 0, + myLeader: 0, + myInProgram: 0, + mySubmitted: 0, + ...overrides, + }); + const page = (): ApiPagination => ({ count: 1, next: "", @@ -97,17 +109,41 @@ describe("ProjectRepository", () => { it("refreshCount мапит в ProjectCount и пушит в count$", () => new Promise(done => { setup(); - adapter.fetchCount.mockReturnValue(of({ my: 1, all: 2, subs: 3 } as ProjectCount)); + adapter.fetchCount.mockReturnValue( + of( + activityCount({ + my: 1, + all: 2, + subs: 3, + myLeader: 4, + myInProgram: 5, + mySubmitted: 6, + }), + ), + ); repository.refreshCount().subscribe(count => { expect(count).toBeInstanceOf(ProjectCount); expect(repository.count$.getValue().my).toBe(1); expect(repository.count$.getValue().all).toBe(2); expect(repository.count$.getValue().subs).toBe(3); + expect(repository.count$.getValue().myLeader).toBe(4); + expect(repository.count$.getValue().myInProgram).toBe(5); + expect(repository.count$.getValue().mySubmitted).toBe(6); + expect(repository.countState$.getValue()).toBe("loaded"); done(); }); })); + it("refreshCount помечает недоступный count API как error", () => { + setup(); + adapter.fetchCount.mockReturnValue(throwError(() => new Error("boom"))); + + repository.refreshCount().subscribe({ error: () => undefined }); + + expect(repository.countState$.getValue()).toBe("error"); + }); + it("update мапит ответ в Project и инвалидирует кеш", () => new Promise(done => { setup(); @@ -150,18 +186,20 @@ describe("ProjectRepository", () => { expect(adapter.deleteOne).toHaveBeenCalledExactlyOnceWith(42); }); - it("ProjectCreated увеличивает count.my", () => { + it("ProjectCreated перечитывает authoritative count", () => { setup(); - repository.count$.next({ my: 1, all: 0, subs: 0 }); + adapter.fetchCount.mockReturnValue(of(activityCount({ my: 2, myLeader: 2 }))); eventBus.emit(projectCreated({ id: 1 } as Project)); expect(repository.count$.getValue().my).toBe(2); + expect(repository.count$.getValue().myLeader).toBe(2); + expect(adapter.fetchCount).toHaveBeenCalledOnce(); }); - it("ProjectDeleted уменьшает count.my и инвалидирует кеш", () => { + it("ProjectDeleted перечитывает count и инвалидирует кеш", () => { setup(); adapter.fetchOne.mockReturnValue(of({ id: 7 } as ProjectDto)); repository.getOne(7).subscribe(); - repository.count$.next({ my: 2, all: 0, subs: 0 }); + adapter.fetchCount.mockReturnValue(of(activityCount({ my: 1 }))); eventBus.emit(projectDeleted(7)); @@ -172,18 +210,28 @@ describe("ProjectRepository", () => { it("ProjectSubscribed увеличивает count.subs", () => { setup(); - repository.count$.next({ my: 0, all: 0, subs: 1 }); + repository.count$.next(activityCount({ subs: 1 })); eventBus.emit(projectSubscribed(7)); expect(repository.count$.getValue().subs).toBe(2); }); it("ProjectUnSubscribed уменьшает count.subs (не ниже 0) и инвалидирует", () => { setup(); - repository.count$.next({ my: 0, all: 0, subs: 0 }); + repository.count$.next(activityCount()); eventBus.emit(projectUnSubscribed(7)); expect(repository.count$.getValue().subs).toBe(0); }); + it("AcceptInvite перечитывает count после успешного доменного события", () => { + setup(); + adapter.fetchCount.mockReturnValue(of(activityCount({ my: 1 }))); + + eventBus.emit(acceptInvite(5, 7, 11, "Участник")); + + expect(adapter.fetchCount).toHaveBeenCalledOnce(); + expect(repository.count$.getValue().my).toBe(1); + }); + it("RemoveProjectCollaborator инвалидирует кеш проекта", () => { setup(); adapter.fetchOne.mockReturnValue(of({ id: 7 } as ProjectDto)); diff --git a/projects/social_platform/src/app/infrastructure/repository/project/project.repository.ts b/projects/social_platform/src/app/infrastructure/repository/project/project.repository.ts index 263188cd5..00c6ae6fd 100644 --- a/projects/social_platform/src/app/infrastructure/repository/project/project.repository.ts +++ b/projects/social_platform/src/app/infrastructure/repository/project/project.repository.ts @@ -1,8 +1,8 @@ /** @format */ import { inject, Injectable } from "@angular/core"; -import { BehaviorSubject, map, Observable, tap } from "rxjs"; -import { Project, ProjectCount } from "@domain/project/project.model"; +import { BehaviorSubject, catchError, map, Observable, tap, throwError } from "rxjs"; +import { Project, ProjectCount, ProjectCountLoadState } from "@domain/project/project.model"; import { ProjectHttpAdapter } from "../../adapters/project/project-http.adapter"; import { ApiPagination } from "@domain/other/api-pagination.model"; import { HttpParams } from "@angular/common/http"; @@ -28,7 +28,15 @@ import { defer, finalize } from "rxjs"; @Injectable({ providedIn: "root" }) export class ProjectRepository implements ProjectRepositoryPort { private readonly entityCache = new EntityCache(); - readonly count$ = new BehaviorSubject({ my: 0, all: 0, subs: 0 }); + readonly count$ = new BehaviorSubject({ + my: 0, + all: 0, + subs: 0, + myLeader: 0, + myInProgram: 0, + mySubmitted: 0, + }); + readonly countState$ = new BehaviorSubject("idle"); private readonly projectAdapter = inject(ProjectHttpAdapter); private readonly eventBus = inject(EventBus); @@ -38,20 +46,14 @@ export class ProjectRepository implements ProjectRepositoryPort { } private initializeEventListeners(): void { - // События синхронизируют счётчики и кеш деталей без повторной загрузки всех списков. + // Изменения состава проектов требуют повторной authoritative-агрегации на backend. this.eventBus.on("ProjectCreated").subscribe(() => { - this.count$.next({ - ...this.count$.getValue(), - my: this.count$.getValue().my + 1, - }); + this.refreshCountAfterProjectChange(); }); this.eventBus.on("ProjectDeleted").subscribe(event => { this.entityCache.invalidate(event.payload.projectId); - this.count$.next({ - ...this.count$.getValue(), - my: Math.max(0, this.count$.getValue().my - 1), - }); + this.refreshCountAfterProjectChange(); }); this.eventBus.on("ProjectSubscribed").subscribe({ @@ -82,6 +84,7 @@ export class ProjectRepository implements ProjectRepositoryPort { this.eventBus.on("AcceptInvite").subscribe({ next: event => { this.entityCache.invalidate(event.payload.projectId); + this.refreshCountAfterProjectChange(); }, }); @@ -124,10 +127,26 @@ export class ProjectRepository implements ProjectRepositoryPort { } refreshCount(): Observable { - return this.projectAdapter.fetchCount().pipe( - map(dto => plainToInstance(ProjectCount, dto)), - tap(count => this.count$.next(count)), - ); + return defer(() => { + this.countState$.next("loading"); + + return this.projectAdapter.fetchCount().pipe( + map(dto => plainToInstance(ProjectCount, dto)), + tap(count => { + this.count$.next({ ...this.count$.getValue(), ...count }); + this.countState$.next("loaded"); + }), + catchError(error => { + this.countState$.next("error"); + return throwError(() => error); + }), + ); + }); + } + + /** После доменного изменения перечитывает все взаимосвязанные метрики одним запросом. */ + private refreshCountAfterProjectChange(): void { + this.refreshCount().subscribe({ error: () => undefined }); } update(id: number, data: Partial): Observable { diff --git a/projects/social_platform/src/app/ui/pages/projects/dashboard/dashboard.component.spec.ts b/projects/social_platform/src/app/ui/pages/projects/dashboard/dashboard.component.spec.ts index 5e8882dbf..d6a350a39 100644 --- a/projects/social_platform/src/app/ui/pages/projects/dashboard/dashboard.component.spec.ts +++ b/projects/social_platform/src/app/ui/pages/projects/dashboard/dashboard.component.spec.ts @@ -120,7 +120,10 @@ describe("ProjectsDashboard: контексты карточек", () => { } else { expect(c.isSubscribed).toBe(true); expect(el.nativeElement.querySelector(".card__status")).toBeNull(); - expect(!!el.nativeElement.querySelector(".card__context--industry")).toBe(i !== 3); + expect(el.nativeElement.querySelector(".card__context--industry")).toBeNull(); + expect(el.nativeElement.querySelector(".card__project-link").hasAttribute("title")).toBe( + false, + ); expect( el.nativeElement.querySelector(".card__project-action-label").textContent.trim(), ).toBe("Открыть"); diff --git a/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.html b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.html new file mode 100644 index 000000000..cb4368dde --- /dev/null +++ b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.html @@ -0,0 +1,25 @@ + + +

+

моя активность

+ +
+ @for (metric of metrics(); track metric.label) { +
+
+ + {{ metric.label }} +
+
+ @if (isLoaded()) { + {{ metric.value }} + } @else { + — + } +
+
+ } +
+
diff --git a/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.scss b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.scss new file mode 100644 index 000000000..8e05edbc8 --- /dev/null +++ b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.scss @@ -0,0 +1,82 @@ +:host { + display: block; + width: 156px; + height: 180px; +} + +.activity { + box-sizing: border-box; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + padding: 12px 10px; + background-color: var(--light-white); + border: 0.5px solid var(--medium-grey-for-outline); + border-radius: var(--rounded-lg); + + &__title { + margin: 0 0 9px; + font-size: 14px; + font-weight: 600; + line-height: 18px; + color: var(--accent); + } + + &__metrics { + display: grid; + flex: 1; + grid-template-rows: repeat(4, minmax(0, 1fr)); + min-height: 0; + margin: 0; + } + + &__metric { + display: flex; + align-items: center; + justify-content: space-between; + + & + & { + border-top: 0.5px solid var(--medium-grey-for-outline); + } + } + + &__label { + display: flex; + gap: 4px; + align-items: center; + min-width: 0; + font-size: 11px; + font-weight: 400; + line-height: 14px; + color: var(--black); + } + + &__icon { + display: grid; + flex: 0 0 22px; + place-items: center; + width: 22px; + height: 22px; + color: var(--accent); + background-color: var(--accent-light); + border-radius: 50%; + } + + &__value { + flex: 0 0 auto; + + // Очень большие числа не вытесняют подпись; полное значение остаётся в DOM и title. + max-width: 45px; + margin: 0 0 0 4px; + overflow: hidden; + font-size: 14px; + font-weight: 600; + font-variant-numeric: tabular-nums; + line-height: 17px; + color: var(--accent); + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } +} diff --git a/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.spec.ts b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.spec.ts new file mode 100644 index 000000000..fea2b21f8 --- /dev/null +++ b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.spec.ts @@ -0,0 +1,88 @@ +/** @format */ + +import { TestBed } from "@angular/core/testing"; +import { ProjectCount } from "@domain/project/project.model"; +import { ProjectActivityCardComponent } from "./project-activity-card.component"; + +describe("ProjectActivityCardComponent", () => { + const count = (overrides: Partial = {}): ProjectCount => ({ + all: 0, + my: 3, + subs: 0, + myLeader: 2, + myInProgram: 1, + mySubmitted: 4, + ...overrides, + }); + + function render(value = count(), state: "loaded" | "loading" | "error" = "loaded") { + const fixture = TestBed.createComponent(ProjectActivityCardComponent); + fixture.componentRef.setInput("count", value); + fixture.componentRef.setInput("state", state); + fixture.detectChanges(); + return fixture; + } + + it("показывает четыре значения authoritative count", () => { + const element = render().nativeElement as HTMLElement; + const rows = Array.from(element.querySelectorAll(".activity__metric")); + + expect(rows).toHaveLength(4); + expect(rows.map(row => row.textContent?.replace(/\s+/g, " ").trim())).toEqual([ + "Проектов 3", + "Я лидер 2", + "В программе 1", + "Сдано 4", + ]); + }); + + it("отображает нули как числа и не содержит текст старой заглушки", () => { + const element = render(count({ my: 0, myLeader: 0, myInProgram: 0, mySubmitted: 0 })) + .nativeElement as HTMLElement; + + expect(element.querySelectorAll(".activity__value")).toHaveLength(4); + expect( + Array.from(element.querySelectorAll(".activity__value")).map(x => x.textContent?.trim()), + ).toEqual(["0", "0", "0", "0"]); + expect(element.textContent).not.toContain("скоро"); + expect(element.textContent).not.toContain("пока закрыто"); + expect(element.textContent).not.toContain("Подробнее"); + expect(element.querySelector("button, a")).toBeNull(); + }); + + it.each(["loading", "error"] as const)("не показывает выдуманные числа в состоянии %s", state => { + const element = render(count(), state).nativeElement as HTMLElement; + expect( + Array.from(element.querySelectorAll(".activity__value")).map(x => x.textContent?.trim()), + ).toEqual(["—", "—", "—", "—"]); + }); + + it("сохраняет заголовок в обычном регистре и декоративные иконки", () => { + const element = render().nativeElement as HTMLElement; + expect(element.querySelector("h2")?.textContent?.trim()).toBe("моя активность"); + expect(element.querySelectorAll('.activity__icon[aria-hidden="true"]')).toHaveLength(4); + }); + + it.each([0, 26, 123, 9999, 999999999999])( + "не подменяет значение %s сокращённым числом", + value => { + const element = render(count({ my: value })).nativeElement as HTMLElement; + const counter = element.querySelector(".activity__value")!; + expect(counter.textContent?.trim()).toBe(String(value)); + expect(counter.title).toBe(String(value)); + }, + ); + + it("при повторной загрузке убирает устаревшие числа, включая title", () => { + const fixture = render(count({ my: 9999 })); + for (const state of ["loading", "error"] as const) { + fixture.componentRef.setInput("state", state); + fixture.detectChanges(); + const values = Array.from( + fixture.nativeElement.querySelectorAll(".activity__value"), + ) as HTMLElement[]; + expect(values.map(element => element.textContent?.trim())).toEqual(["—", "—", "—", "—"]); + expect(values.every(element => !element.hasAttribute("title"))).toBe(true); + } + }); +}); diff --git a/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.stories.ts b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.stories.ts new file mode 100644 index 000000000..a22bbc175 --- /dev/null +++ b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.stories.ts @@ -0,0 +1,256 @@ +/** @format */ + +import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; +import { ProjectCount } from "@domain/project/project.model"; +import { SoonCardComponent } from "@ui/primitives/soon-card/soon-card.component"; +import { ProjectActivityCardComponent } from "./project-activity-card.component"; + +const count: ProjectCount = { + all: 24, + my: 7, + subs: 3, + myLeader: 4, + myInProgram: 2, + mySubmitted: 1, +}; + +const fixtureStyles = ` + +`; + +const projects = ` +
+
+

Цифровая платформа проекта

+
+
+
+
+

Образовательная инициатива

+
+
+
+
+`; + +const meta: Meta = { + title: "Projects/Моя активность", + component: ProjectActivityCardComponent, + decorators: [ + moduleMetadata({ + imports: [ProjectActivityCardComponent, SoonCardComponent], + }), + ], + parameters: { layout: "fullscreen" }, +}; + +export default meta; + +type Story = StoryObj; + +export const Card: Story = { + name: "Карточка", + args: { count, state: "loaded" }, +}; + +export const DashboardBefore: Story = { + name: "Dashboard · до", + render: () => ({ + template: ` + ${fixtureStyles} +
+

Проекты · dashboard

+
+ ${projects} + +
+
+ `, + }), +}; + +export const DashboardAfter: Story = { + name: "Dashboard · после", + render: () => ({ + props: { count }, + template: ` + ${fixtureStyles} +
+

Проекты · dashboard

+
+ ${projects} + +
+
+ `, + }), +}; + +export const MyProjectsBefore: Story = { + name: "Мои проекты · до", + render: () => ({ + template: ` + ${fixtureStyles} +
+

Проекты · мои проекты

+
+ ${projects} + +
+
+ `, + }), +}; + +export const MyProjectsAfter: Story = { + name: "Мои проекты · после", + render: () => ({ + props: { count }, + template: ` + ${fixtureStyles} +
+

Проекты · мои проекты

+
+ ${projects} + +
+
+ `, + }), +}; diff --git a/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.ts b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.ts new file mode 100644 index 000000000..7b0df80a6 --- /dev/null +++ b/projects/social_platform/src/app/ui/pages/projects/project-activity-card/project-activity-card.component.ts @@ -0,0 +1,36 @@ +/** @format */ + +import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core"; +import { ProjectCount, ProjectCountLoadState } from "@domain/project/project.model"; +import { IconComponent } from "@ui/primitives/icon/icon.component"; + +interface ProjectActivityMetric { + icon: string; + label: string; + value: number; +} + +/** Компактная информационная карточка проектной активности текущего пользователя. */ +@Component({ + selector: "app-project-activity-card", + templateUrl: "./project-activity-card.component.html", + styleUrl: "./project-activity-card.component.scss", + imports: [IconComponent], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ProjectActivityCardComponent { + readonly count = input.required(); + readonly state = input.required(); + + protected readonly metrics = computed(() => [ + { icon: "projects", label: "Проектов", value: this.count().my }, + { icon: "person", label: "Я лидер", value: this.count().myLeader }, + { icon: "program", label: "В программе", value: this.count().myInProgram }, + { icon: "check", label: "Сдано", value: this.count().mySubmitted }, + ]); + + protected readonly isLoaded = computed(() => this.state() === "loaded"); + protected readonly placeholderLabel = computed(() => + this.state() === "error" ? "Данные временно недоступны" : "Загрузка данных", + ); +} diff --git a/projects/social_platform/src/app/ui/pages/projects/projects-activity-placement.spec.ts b/projects/social_platform/src/app/ui/pages/projects/projects-activity-placement.spec.ts new file mode 100644 index 000000000..a2ede1797 --- /dev/null +++ b/projects/social_platform/src/app/ui/pages/projects/projects-activity-placement.spec.ts @@ -0,0 +1,28 @@ +/** @format */ + +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +describe("ProjectsComponent: размещение проектной активности", () => { + const template = readFileSync( + join( + process.cwd(), + "projects/social_platform/src/app/ui/pages/projects/projects.component.html", + ), + "utf8", + ); + + it("показывает блок только для dashboard и my", () => { + expect(template).toMatch( + /@if \(isMy\(\) \|\| isDashboard\(\)\) \{\s* { + const conditionalBlock = new RegExp( + `@if \\(${condition.replace(/[()]/g, "\\$&")}\\) \\{[\\s\\S]*? { + let section: string; + const office = { onAcceptInvite: vi.fn(), onRejectInvite: vi.fn() }; + + beforeEach(async () => { + section = "dashboard"; + vi.clearAllMocks(); + await TestBed.configureTestingModule({ + imports: [ProjectsComponent], + providers: [ + provideRouter([]), + { provide: OfficeInfoService, useValue: office }, + { + provide: IndustryRepositoryPort, + useValue: { industries: signal([{ id: 1, name: "Образование" }]) }, + }, + { provide: AddProjectSubscriptionUseCase, useValue: { execute: () => of(ok(undefined)) } }, + { + provide: DeleteProjectSubscriptionUseCase, + useValue: { execute: () => of(ok(undefined)) }, + }, + ], + }) + .overrideComponent(ProjectsComponent, { + set: { + providers: [ + { + provide: ProjectsInfoService, + useValue: { + isDashboard: () => section === "dashboard", + isMy: () => section === "my", + isSubs: () => section === "subscriptions", + isInvites: () => section === "invites", + isAll: () => section === "all", + projectCount: signal({ my: 26, myLeader: 23, myInProgram: 1, mySubmitted: 4 }), + projectCountState: signal("loaded"), + initializationProjects: vi.fn(), + }, + }, + { + provide: ProjectsUIInfoService, + useValue: { + searchForm: new FormGroup({ search: new FormControl("") }), + myInvites: signal([ + projectCardFixture({ inviteId: 801, industry: 1, name: "Проект приглашения" }), + ]), + }, + }, + { provide: SwipeService, useValue: { isFilterOpen: signal(false) } }, + ], + }, + }) + .compileComponents(); + }); + + afterEach(async () => { + // Завершаем отложенное прикрепление portal общей модалки до уничтожения TestBed. + await new Promise(resolve => setTimeout(resolve, 0)); + }); + + it.each(["dashboard", "my", "subscriptions", "invites", "all"])( + "сохраняет размещение активности в разделе %s", + current => { + section = current; + const fixture = TestBed.createComponent(ProjectsComponent); + fixture.detectChanges(); + const activity = fixture.nativeElement.querySelector("app-project-activity-card"); + if (current === "dashboard" || current === "my") { + expect(activity.querySelector("h2").textContent.trim()).toBe("моя активность"); + expect( + Array.from(activity.querySelectorAll(".activity__value"), (node: unknown) => + (node as HTMLElement).textContent?.trim(), + ), + ).toEqual(["26", "23", "1", "4"]); + } else { + expect(activity).toBeNull(); + } + }, + ); + + it("приглашение справа не содержит отрасль и сохраняет оба действия", () => { + const fixture = TestBed.createComponent(ProjectsComponent); + fixture.detectChanges(); + const invitation: HTMLElement = fixture.nativeElement.querySelector( + ".page__invites app-info-card", + ); + expect(invitation.textContent).not.toContain("Образование"); + expect(invitation.querySelector(".card__industry, .card__context--industry")).toBeNull(); + expect(invitation.querySelector(".card__name")?.textContent).toContain("Проект приглашения"); + const buttons = Array.from(invitation.querySelectorAll("button")); + buttons.find(button => button.textContent?.trim() === "принять")!.click(); + buttons.find(button => button.textContent?.trim() === "отклонить")!.click(); + expect(office.onAcceptInvite).toHaveBeenCalledExactlyOnceWith(801); + expect(office.onRejectInvite).toHaveBeenCalledExactlyOnceWith(801); + }); +}); diff --git a/projects/social_platform/src/app/ui/pages/projects/projects.component.html b/projects/social_platform/src/app/ui/pages/projects/projects.component.html index 1fcc04c36..16b3d3aa2 100644 --- a/projects/social_platform/src/app/ui/pages/projects/projects.component.html +++ b/projects/social_platform/src/app/ui/pages/projects/projects.component.html @@ -89,11 +89,10 @@ } @if (isMy() || isDashboard()) { - - + } @if (isAll()) {
diff --git a/projects/social_platform/src/app/ui/pages/projects/projects.component.ts b/projects/social_platform/src/app/ui/pages/projects/projects.component.ts index 3edf5631e..246002a8d 100644 --- a/projects/social_platform/src/app/ui/pages/projects/projects.component.ts +++ b/projects/social_platform/src/app/ui/pages/projects/projects.component.ts @@ -12,16 +12,17 @@ import { import { RouterOutlet } from "@angular/router"; import { ReactiveFormsModule } from "@angular/forms"; import { SearchComponent } from "@ui/primitives/search/search.component"; -import { ButtonComponent, IconComponent } from "@ui/primitives"; +import { ButtonComponent } from "@ui/primitives/button/button.component"; +import { IconComponent } from "@ui/primitives/icon/icon.component"; import { BarNewComponent } from "./bar-new/bar.component"; import { BackComponent } from "@uilib"; -import { SoonCardComponent } from "@ui/primitives/soon-card/soon-card.component"; import { InfoCardComponent } from "@ui/widgets/info-card/info-card.component"; import { ProjectsUIInfoService } from "@api/project/facades/ui/projects-ui-info.service"; import { ProjectsInfoService } from "@api/project/facades/projects-info.service"; import { SwipeService } from "@api/swipe/swipe.service"; import { ProjectsFilterComponent } from "@ui/widgets/projects-filter/projects-filter.component"; import { OfficeInfoService } from "@api/office/facades/office-info.service"; +import { ProjectActivityCardComponent } from "./project-activity-card/project-activity-card.component"; /** Контейнер модуля проектов с поиском, фильтрацией и навигацией по разделам. */ @Component({ @@ -36,7 +37,7 @@ import { OfficeInfoService } from "@api/office/facades/office-info.service"; RouterOutlet, BarNewComponent, BackComponent, - SoonCardComponent, + ProjectActivityCardComponent, ProjectsFilterComponent, InfoCardComponent, ], @@ -64,6 +65,8 @@ export class ProjectsComponent implements OnInit { protected readonly isSubs = this.projectsInfoService.isSubs; protected readonly isInvites = this.projectsInfoService.isInvites; protected readonly isDashboard = this.projectsInfoService.isDashboard; + protected readonly projectCount = this.projectsInfoService.projectCount; + protected readonly projectCountState = this.projectsInfoService.projectCountState; protected readonly isFilterOpen = this.swipeService.isFilterOpen; diff --git a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.html b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.html index 6f87e5597..b07e47fbe 100644 --- a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.html +++ b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.html @@ -40,7 +40,6 @@ class="card__project-link" [routerLink]="AppRoutes.projects.detail(info()?.id)" [attr.aria-label]="'Открыть проект «' + info()?.name + '»'" - [attr.title]="projectIndustry()" > @@ -60,10 +59,6 @@

{{ presentation.statusLabel }}

- } @else if (projectIndustry(); as industry) { -

- {{ industry }} -

}
@@ -118,13 +113,8 @@

{{ info().name }}

} @else if (type() === "projects" || type() === "invite") { @if (info().name) { -

{{ info().name | truncate: 12 }}

+

{{ info().name }}

} -

- @if (industryRepository.getOne(info()?.industry!); as industry) { - {{ industry?.name }} - } -

} @else {

{{ info()?.firstName | truncate: 10 }}

{{ info()?.lastName | truncate: 10 }}

@@ -147,7 +137,7 @@ class="card__description" [class.card__description--project]="type() === 'projects'" [style.max-height]=" - isProjectCard() ? '26px' : type() === 'invite' ? null : type() === 'members' ? '50px' : '24px' + isProjectCard() || type() === 'invite' ? null : type() === 'members' ? '50px' : '24px' " [class.invite-description]="type() === 'invite'" > diff --git a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.scss b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.scss index 023ef10fb..554b9eb0b 100644 --- a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.scss +++ b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.scss @@ -139,13 +139,6 @@ color: var(--accent); } - &__industry { - padding: 2px 36px; - color: var(--light-white); - background-color: var(--green); - border-radius: var(--rounded-xl); - } - &__description { display: flex; flex: 1; @@ -286,18 +279,19 @@ } .card__description { - flex: 0 0 26px; + // Место удалённой отрасли отдано описанию без увеличения внешней карточки. + flex: 0 0 52px; width: 100%; - height: 26px; - min-height: 26px; + height: 52px; + min-height: 52px; p { - /* stylelint-disable-next-line value-no-vendor-prefix -- Префикс сохраняет двухстрочное сокращение описания. */ + /* stylelint-disable-next-line value-no-vendor-prefix -- Префикс ограничивает описание четырьмя строками. */ display: -webkit-box; overflow: hidden; font-size: 10px; line-height: 13px; - -webkit-line-clamp: 2; + -webkit-line-clamp: 4; -webkit-box-orient: vertical; } } @@ -350,6 +344,7 @@ p { font-size: 9px; line-height: 12px; + -webkit-line-clamp: 2; } } @@ -360,7 +355,7 @@ width: 100%; } - // Увеличение публичных CTA не меняет типографику кнопки «Моих проектов». + // Типографика публичных CTA в master не зависит от строки отрасли. .card__project-action-label { font-size: 9px; line-height: 11px; @@ -387,16 +382,16 @@ } } - .card__industry { - width: 100%; - padding: 0 8px; + .card__name { + /* stylelint-disable-next-line value-no-vendor-prefix -- Освободившаяся строка сохраняет длинное название. */ + display: -webkit-box; + max-height: 30px; overflow: hidden; - font-size: 11px; - font-weight: 400; - line-height: 14px; - color: var(--black); - text-overflow: ellipsis; - white-space: nowrap; + line-height: 15px; + overflow-wrap: anywhere; + white-space: normal; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; } .card__description { @@ -472,23 +467,6 @@ white-space: nowrap; background: var(--light-gray); border-radius: 11px; - - &--industry { - font-size: 11px; - font-weight: 400; - color: var(--accent-dark); - background: var(--accent-light); - - span { - overflow: hidden; - text-overflow: ellipsis; - } - - &:focus-visible { - outline: 2px solid var(--accent-dark); - outline-offset: 2px; - } - } } &__status { diff --git a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.spec.ts b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.spec.ts index 321a713dc..c08c35bd1 100644 --- a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.spec.ts +++ b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.spec.ts @@ -233,7 +233,7 @@ describe("InfoCardComponent: статусы моих проектов", () => { }); it.each(["base", "subs"] as const)( - "%s: отрасль, полный текст, Открыть и отсутствие lifecycle/шума", + "%s: полный текст и Открыть без отрасли и lifecycle", appearance => { const project = projectCardFixture({ draft: true, partnerProgram: projectCardProgram(true) }); fixture.componentRef.setInput("info", project); @@ -243,9 +243,8 @@ describe("InfoCardComponent: статусы моих проектов", () => { expect(card().querySelector(".card__access")).toBeNull(); expect(fixture.nativeElement.querySelector(".card--project")).not.toBeNull(); expect(card().querySelector(".card__name")?.textContent).toBe(project.name); - expect(card().querySelector(".card__context--industry")?.textContent?.trim()).toBe( - "Образование", - ); + expect(card().querySelector(".card__context--industry")).toBeNull(); + expect(card().textContent).not.toContain("Образование"); expect(card().querySelector(".card__project-action")?.textContent?.trim()).toBe( "Открыть", ); @@ -268,17 +267,33 @@ describe("InfoCardComponent: статусы моих проектов", () => { expect(card().querySelector(".card__name")?.textContent).toBe(projectCardFixture().name); }); - it("длинная отрасль доступна целиком в подсказке и с клавиатуры", () => { + it.each(["base", "subs"] as const)("%s: отрасль не остаётся в скрытой подсказке", appearance => { const name = "Очень длинное название отрасли проекта"; - vi.spyOn(TestBed.inject(IndustryRepositoryPort), "getOne").mockReturnValue({ id: 1, name }); - fixture.componentRef.setInput("appereance", "subs"); + const getIndustry = vi.spyOn(TestBed.inject(IndustryRepositoryPort), "getOne"); + getIndustry.mockReturnValue({ id: 1, name }); + fixture.componentRef.setInput("appereance", appearance); fixture.detectChanges(); - const context = card().querySelector(".card__context--industry")!; - expect(context.title).toBe(name); - expect(context.textContent?.trim()).toBe(name); + expect(card().querySelector(".card__context--industry, .card__industry")).toBeNull(); + expect(card().textContent).not.toContain(name); const link = card().querySelector(".card__project-link")!; - expect(link.title).toBe(name); + expect(link.hasAttribute("title")).toBe(false); expect(link.tabIndex).toBe(0); + expect(getIndustry).not.toHaveBeenCalled(); + }); + + it("приглашение сохраняет название, действия и данные проекта без отрасли", () => { + const project = projectCardFixture({ + name: "Длинное название приглашённого проекта", + inviteId: 801, + }); + fixture.componentRef.setInput("type", "invite"); + fixture.componentRef.setInput("info", project); + fixture.detectChanges(); + expect(card().querySelector(".card__industry, .card__context--industry")).toBeNull(); + expect(card().textContent).not.toContain("Образование"); + expect(card().querySelector(".card__name")?.textContent).toBe(project.name); + expect(card().querySelectorAll(".card__invite-actions button")).toHaveLength(2); + expect(project.industry).toBe(projectCardFixture().industry); }); it.each(["base", "subs"] as const)( diff --git a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.ts b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.ts index 03470a66b..1a4b946e3 100644 --- a/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.ts +++ b/projects/social_platform/src/app/ui/widgets/info-card/info-card.component.ts @@ -24,7 +24,6 @@ import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { AddProjectSubscriptionUseCase } from "@api/project/use-cases/add-project-subscription.use-case"; import { DeleteProjectSubscriptionUseCase } from "@api/project/use-cases/delete-project-subscription.use-case"; import { AppRoutes } from "@api/paths/app-routes"; -import { IndustryRepositoryPort } from "@domain/industry/ports/industry.repository.port"; import { Project } from "@domain/project/project.model"; interface MyProjectPresentation { @@ -62,7 +61,6 @@ export class InfoCardComponent { private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly addProjectSubscriptionUseCase = inject(AddProjectSubscriptionUseCase); private readonly deleteProjectSubscriptionUseCase = inject(DeleteProjectSubscriptionUseCase); - public readonly industryRepository = inject(IndustryRepositoryPort); private readonly router = inject(Router); private readonly logger = inject(LoggerService); @@ -84,15 +82,6 @@ export class InfoCardComponent { () => this.type() === "projects" && this.appereance() !== "empty", ); - /** Отрасль берётся из уже загруженного справочника; пустая плашка не занимает строку. */ - protected readonly projectIndustry = computed(() => { - if (!this.isProjectCard() || this.appereance() === "my") return null; - const industryId = this.info()?.industry; - return industryId == null - ? null - : this.industryRepository.getOne(industryId)?.name?.trim() || null; - }); - /** * Lifecycle зависит только от проекта: submitted > draft > program > published. * Роль определяется отдельно по текущему профилю. Отсутствующие ID не делают diff --git a/projects/social_platform/src/app/ui/widgets/projects-filter/projects-filter.component.spec.ts b/projects/social_platform/src/app/ui/widgets/projects-filter/projects-filter.component.spec.ts index d62228af1..932edeabf 100644 --- a/projects/social_platform/src/app/ui/widgets/projects-filter/projects-filter.component.spec.ts +++ b/projects/social_platform/src/app/ui/widgets/projects-filter/projects-filter.component.spec.ts @@ -3,10 +3,11 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { ProjectsFilterComponent } from "./projects-filter.component"; -import { provideRouter } from "@angular/router"; +import { provideRouter, Router } from "@angular/router"; import { HttpClientTestingModule } from "@angular/common/http/testing"; import { IndustryRepositoryPort } from "@domain/industry/ports/industry.repository.port"; import { signal } from "@angular/core"; +import { ProjectsFilterInfoService } from "./service/projects-filter-info.service"; describe("ProjectsFilterComponent", () => { let component: ProjectsFilterComponent; @@ -14,7 +15,7 @@ describe("ProjectsFilterComponent", () => { beforeEach(async () => { const industrySpy = { - industries: signal([]), + industries: signal([{ id: 5, name: "EdTech" }]), }; await TestBed.configureTestingModule({ @@ -32,4 +33,20 @@ describe("ProjectsFilterComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("сохраняет справочник отраслей и фильтрацию через query-параметр industry", async () => { + await fixture.whenStable(); + const service = fixture.debugElement.injector.get(ProjectsFilterInfoService); + expect(service.industries()).toEqual([{ id: 5, label: "EdTech", value: "EdTech" }]); + const navigate = vi.spyOn(TestBed.inject(Router), "navigate").mockResolvedValue(true); + component.onFilterByIndustry(5); + expect(navigate).toHaveBeenCalledWith( + [], + expect.objectContaining({ + queryParams: { industry: 5 }, + queryParamsHandling: "merge", + }), + ); + vi.restoreAllMocks(); + }); });