From 5a4e9debc191678c07ffbb79a69ee2d99568d69e Mon Sep 17 00:00:00 2001 From: Vlad Sazonau <16666234+VladSez@users.noreply.github.com> Date: Wed, 20 Aug 2025 01:15:48 +0200 Subject: [PATCH] feat: add /?template=stripe|default to url, implement URL compression logic (#130) * feat: add debug local storage UI and update README; include new template parameter handling in invoice form * feat: add URL compression logic when generating link to invoice to reduce url length + add unit tests + improved existing e2e tests * ci: remove type check step from unit tests workflow to streamline CI process * test: update e2e tests for Stripe invoice sharing logic and template; increase timeout for visibility checks * test: refactor e2e tests for invoice generation and sharing; update element selectors and enhance URL disallow rules in robots.txt * chore: enhance README with detailed features and update about page references; add GitHub star CTA component * chore: update configuration files for Prettier, run prettify across the project * chore: run dedupe * test: add e2e tests for Open Graph meta tags in invoice templates; verify correct rendering for default and Stripe templates * chore: remove @stagewise/toolbar-next package and related development toolbar component from the project --- .cursor/prompts/playwright-mcp.md | 13 + .env.example | 3 + .github/screenshots/stripe-tmp.png | Bin 0 -> 479206 bytes .github/workflows/unit-tests.yml | 52 + .prettierrc.js | 10 +- README.md | 28 +- e2e/about.test.ts | 98 +- e2e/buyer.test.ts | 78 +- e2e/changelog.test.ts | 20 +- e2e/default-invoice-template/pdf.test.ts | 74 +- e2e/generate-invoice-link.test.ts | 299 ++ e2e/invoice-form.test.ts | 426 +-- e2e/not-found-page.test.ts | 4 +- e2e/seller.test.ts | 92 +- .../share-logic.test.ts | 117 +- e2e/stripe-invoice-template/template.test.ts | 120 +- e2e/stripe-invoice-template/utils.ts | 2 +- eslint.config.mjs | 2 +- knip.ts | 1 - lint-staged.config.js | 2 +- messages/en.json | 2 +- next.config.mjs | 10 +- package.json | 16 +- pnpm-lock.yaml | 2842 ++++++++--------- src/actions/subscribe-action.ts | 4 +- src/app/(app)/components/cta-toasts/index.tsx | 26 +- .../components/dev/dev-local-storage-view.tsx | 261 ++ src/app/(app)/components/index.tsx | 8 +- .../(app)/components/invoice-form/index.tsx | 117 +- .../sections/general-information.tsx | 12 +- .../invoice-form/sections/invoice-items.tsx | 4 +- .../components/invoice-pdf-download-link.tsx | 6 +- ...nvoice-pdf-download-multiple-languages.tsx | 4 +- .../stripe-due-amount.tsx | 2 +- .../stripe-footer.tsx | 2 +- .../stripe-invoice-info.tsx | 4 +- .../stripe-items-table.tsx | 4 +- .../stripe-totals.tsx | 4 +- .../invoice-pdf-template/invoice-footer.tsx | 2 +- .../invoice-pdf-template/invoice-header.tsx | 4 +- .../invoice-payment-info.tsx | 2 +- .../invoice-vat-summary-table.tsx | 4 +- src/app/(app)/error.tsx | 4 +- src/app/(app)/page.client.tsx | 271 +- src/app/(app)/page.tsx | 24 +- .../invoice-number-breaking-change.test.ts | 372 +++ .../utils/invoice-number-breaking-change.ts | 66 + .../about/components/language-switcher.tsx | 2 +- src/app/[locale]/about/page.tsx | 2 +- src/app/[locale]/error.tsx | 2 +- src/app/api/generate-invoice/route.tsx | 49 +- src/app/changelog/[slug]/page.tsx | 16 +- src/app/changelog/utils.ts | 16 +- src/app/layout.tsx | 4 - src/app/robots.ts | 6 +- src/app/schema/index.ts | 14 +- src/app/schema/translations.ts | 2 +- src/app/sitemap.ts | 2 +- src/components/buyer-dialog.tsx | 8 +- src/components/buyer-management.tsx | 18 +- src/components/dev/stagewise-toolbar.tsx | 15 - src/components/etc/github-logo.tsx | 2 +- src/components/github-star-cta.tsx | 40 + src/components/go-to-app-button-cta.tsx | 4 +- src/components/seller-dialog.tsx | 8 +- src/components/seller-management.tsx | 20 +- src/components/subscribe-input.tsx | 6 +- src/components/ui/accordion.tsx | 2 +- src/components/ui/alert-dialog.tsx | 10 +- src/components/ui/badge.tsx | 2 +- src/components/ui/button-helper.tsx | 2 +- src/components/ui/button.tsx | 8 +- src/components/ui/command.tsx | 10 +- src/components/ui/dialog.tsx | 8 +- src/components/ui/disclosure.tsx | 18 +- src/components/ui/dropdown-menu.tsx | 24 +- src/components/ui/form.tsx | 6 +- src/components/ui/input.tsx | 6 +- src/components/ui/label.tsx | 4 +- src/components/ui/money-input.tsx | 8 +- src/components/ui/multi-select.tsx | 18 +- src/components/ui/popover.tsx | 2 +- src/components/ui/select-native.tsx | 4 +- src/components/ui/separator.tsx | 6 +- src/components/ui/switch.tsx | 6 +- src/components/ui/tabs.tsx | 4 +- src/components/ui/textarea.tsx | 2 +- .../ui/toasts/error-generating-pdf-toast.tsx | 2 +- src/components/ui/tooltip.tsx | 8 +- src/components/video.tsx | 2 +- src/hooks/use-media-query.tsx | 8 +- src/i18n/request.ts | 2 +- src/lib/check-device.server.ts | 2 +- src/lib/google-drive.ts | 12 +- src/lib/localStorage-debug-listener.ts | 61 + src/lib/rate-limit.ts | 2 +- src/lib/telegram.ts | 8 +- src/lib/umami-analytics-track-event.tsx | 2 +- src/utils/__tests__/data.ts | 84 + src/utils/__tests__/url-compression.test.ts | 673 ++++ src/utils/subscription-token.ts | 4 +- src/utils/url-compression.ts | 241 ++ vitest.config.ts | 14 + 103 files changed, 4470 insertions(+), 2559 deletions(-) create mode 100644 .cursor/prompts/playwright-mcp.md create mode 100644 .github/screenshots/stripe-tmp.png create mode 100644 .github/workflows/unit-tests.yml create mode 100644 e2e/generate-invoice-link.test.ts create mode 100644 src/app/(app)/components/dev/dev-local-storage-view.tsx create mode 100644 src/app/(app)/utils/__tests__/invoice-number-breaking-change.test.ts create mode 100644 src/app/(app)/utils/invoice-number-breaking-change.ts delete mode 100644 src/components/dev/stagewise-toolbar.tsx create mode 100644 src/components/github-star-cta.tsx create mode 100644 src/lib/localStorage-debug-listener.ts create mode 100644 src/utils/__tests__/data.ts create mode 100644 src/utils/__tests__/url-compression.test.ts create mode 100644 src/utils/url-compression.ts create mode 100644 vitest.config.ts diff --git a/.cursor/prompts/playwright-mcp.md b/.cursor/prompts/playwright-mcp.md new file mode 100644 index 0000000..433ff3e --- /dev/null +++ b/.cursor/prompts/playwright-mcp.md @@ -0,0 +1,13 @@ +- You are a playwright test generator. +- You are given a scenario and you need to generate a playwright test for it. +- DO NOT generate test code based on the scenario alone. +- DO run steps one by one using the tools provided by the Playwright MCP. + +- When asked to explore a website: + 1. Navigate to the specified URL + 2. Explore 1 key functionality of the site and when finished close the browser. + 3. Implement a Playwright TypeScript test that uses @playwright/test based on message history using Playwright's best practices including role based locators, auto retrying assertions and with no added timeouts unless necessary as Playwright has built in retries and autowaiting if the correct locators and assertions are used. +- Save generated test file in the e2e directory +- Execute the test file and iterate until the test passes +- Include appropriate assertions to verify the expected behavior +- Structure tests properly with descriptive test titles and comments diff --git a/.env.example b/.env.example index 855ffc4..4a0fe4f 100644 --- a/.env.example +++ b/.env.example @@ -7,6 +7,9 @@ NEXT_PUBLIC_SENTRY_ENABLED="false" NEXT_PUBLIC_SENTRY_DSN="" +# dev mode only +NEXT_PUBLIC_DEBUG_LOCAL_STORAGE_UI="false" + # Resend (For emails) Create account and paste API keys in .env.local RESEND_API_KEY="" RESEND_AUDIENCE_ID="" diff --git a/.github/screenshots/stripe-tmp.png b/.github/screenshots/stripe-tmp.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa2648cc672d9bea352bec5bd047137a2c01814 GIT binary patch literal 479206 zcmb5VbzBtf+dfQ6haeyzrGQ9FN-c{t(%mT~-JJ@Ef=D+DBAwEWh|;~l(xJdo%hDb1 z;C(;w{k_j0x}VSP%+Abp&CC_&c^v0?T#>5EvIMwPxF{$n1oCoH>L@6<*eEENBiMI< zBkzuMHc?RUMQkM{Rplim=~Z2wtZeNqQBdR}6Lqk3HF~Ks4dOn6ZBQ{jzgfVDr2;Ep za|9o9vNGThD@284o6C}u88+*F4KIJkqHF8Z9tED~suJ#cQ-#0N{$T54 z>uaH)Mz?;HY|qd~B&(k`QC4v9zCZ1_KK#6LPq>JJeitj4m3!6sKzg9C(D{@IKl5f` z!6UKa6!bUOvK^BRJLa*RcU4;4YNjQy7q**XA zSHe$4q4Kz&?m`P})sgSbBJJ$(kE^5js=bMUZz`}S29P$3q`Fq_N1u?)0-spr(Opo{R*mYG3@N~^Ju?(|$$2CR5cyqG17jHK1#uD2-zm)hIKP?%hUd70;=jt~eoIV`Nk1k9svi}U# zjF=kyfN>xiTW5EJGL&B6yK`7J6a#bn*;@|=3uVE!dZIy660ofC?pf_*I<~D@HO&`;aH^ejbcM+EWXd@5&}IE^hnh2#OB1KcVOKC z&Rn7oXs=AYzEL)GtI{qaa8$63-bB2yd*k@6Og_|nPettm`n;;RoZ9G3X= zNKyv74H`x^s17ZUp`(JB#+Nelv7&-0E5py8p$aZxUV`bdF=Oco8DB?opR+d%{V-)s z!C4DYS0zjenJ^Wb!l(<)G$ooMqUyNoOp<|0A@R83&d%2fD7tZQ;4Y!R4Dp*cs&}bA zMcjWx{+8zF8*XAcMq(UU^N%kX33{d8yv0b39FXmcCF}8hiKqU0TQV&+zQ^Y?USpUj z*f$o|^Z1^mmMX_MajleWE`CB}c#g|D1|Ml=D0vRkI*B`ne)NtE^+^1>^dZ$ubQ>6p zJNSu(a0-r9%u{Z1^2j_>%9Q)*(TQecy8PM^wO_aVF}J$TD`TGBEm(G+qb*+|7Nv#% z)YzRqHTM^5BX#;ZyUTWp-a>aHlTCt;?TMj+mi|$yhf$F!frJ%%7AFF`V7YZ%(p#31 z#N(~Dl$SRbGih}s@7wp0)NhZzlYZy?`RFG~q}14>>DU(eSVqF4U`+*m*%>8a~+NAm>OTiPbCr$~8iAsrL3Au@weQt>`R-_iF;1Yb6`!4@o8SV=v zE$L5HQkD^YIEenn@FE{M!kKlk6BG(GaTazAUbY&vR! zxr=X%9-$q%9wu$^Z_Y!zj~tG2j|w)O#>LAP1=a07!{l~)s$wr>7X-ir_5|kmR`>1s zZ3ORg^YP#d+@mb#6}6nQ{%o;go#0T@x1OR_@pN#iTi3Lu@3djhtw|tLemJipuYUAG z319KKA|tbbqOc+;T|c!eojiRqeStSO<>>&=fOcwa+EF@ndJHeb*4Qp^Hq^eOvZqSd z!e#PjYhI$|r&Y9mnSN{SCT;tYhb8(Y&6ApTCR;svXQyNr@)sT;ITq$Y?hro6AZWggx$VK?tHp>wt3c6qM4(Elz<~Xl zx1GCql78BCdDbNZqy$686XT)56leJusVnncE9x_KMt= z%KNnQBuhhEWrHFjvL62EjC4O8w`M8AzxliV{`(b)92GOm<%l924I)Ko3UkIJXx{Vu z(}v3X(0769A;U{UHkr0OZVLlg)hX3=12R?x!;YC20tGLXhv$|WMc`^{s{^$&!|tRyKF>b8siCYe5b%A_hff9u5lc#=P{lRbM4-Lx6k#y z@jch2@EWYPoshFvckIi!!$z0ocgt^NXLZ@+HGM z4Vw1)l6sHypsfP_4p89(kN(L3JxJ}feqNAeK%&INr{WW8Z)#4b!&%+>UT2N7e3f*} zbSFogg)vnJJ)V8w$n0}46 z`fRg^hZj66SWL;|*u!AcW3&Gxv^B1E_#_X}+$L@xw1wIg()5}ftAucrFp;0007`vM zT}{=T9+%#fCYf$v(4tRB*xqwnfPct15nc2Tamm^HH2Wjm6Lu`w-h3Tc*jbjl z9CwkIuN*U!RQ|=NoAbgLePCYN^BM6!AYdzZZTt*Cg ztt~LkaWoeMR{U)1xY`uAzb-_2Zh_9}mn1Gary{&)UFcf9Gj2{_sPvL<#=k4*QnAYt z5)&Dt9-lq)zdXpI_(TD@P`DXCt=`N#>VF+{b~Uj88DBh5xO}yH^i$B+$+N}7XI7Y) z-}%O9p?MhD4_XhHI*Z-g+b;O7q9U$x_58f*xMUEPNw`<~)VQYFV4^(l;4QBPCzm%Et zp201fu+){eQc^-;1@^H~Fi@#bFo8W(;0r>f{_lMmR2CHU-^bBVP$FzmF#f$p8Q9)_ zJ_6s{GXHGRtN|_M(^!l@8~A%E%xyD6@b|mzCFzKkpA~2?sj4ib(K`<5sIk_K#aOvsk zMO|N739C!V{97FOC-%_B-Q8K3i_6Q)i_?pj)5+DE>#2~C5EnNO7Y`2ya0Q2(kE6Sp zH;1F!qkk&-uX>~`-7H*fo!xDn9O-ZCH8Xeea2I>{@b*Uk{rTrPExm33=T44p|GpOR zf?T&}xSn!ybNzSSKvB`#qr$4T-j?=yQnn62n*sL#J>`4$O!Rkw|KF+qx#j;Vs{21h zdH4nXqv-!S_5T*taJIv!4*U1M|NG>>1x2}T-~E5J#Xk-G`zX-TAY4(d z|L!#quHAc1f1o2D*h;Br0$X61-G0#4fghHCw!l8R?c{yh9t#u{Fp9jCgr+y@_B@vN zJuQl^z4)vVKP0`n)c0@}C5*dykLX*c{E(Qc+qeR%%Nlpt$idQ>n9>+hY41WqvrThO zl4#rfmLm&RKN)VcSZ*N>m%C;@hy?glg ziQVs@*S<2fx37^(u_phEw!eMt9=Z@s4QXx$hF%RNRoP|od+r3-!mmSoO{Jt7zW?ZI z$O4~K|LI8j_d4(bj?EAkh(S$V16uH)u3{S>_Z$PGwKGIts8Z^|GMGBX`tKeRH#B(d z>Oz^Ei68{sjuO3pN~WW{IR)jU@84fSLf+7by04_Dl-Q0Gg}q4I3}OG{`S(w&sa9fs zNMQ}N%}>jA+oL9qijGVwER?f0nY{bQQ|b3ZWuxFSJ}!`ZZmu34+js|~^V_%2n!OG9 zG}C`q4N6EToAaq$%L9?)#n0c$Q9BBIdj5QJ|9&F+*Wl;R;}{D*d(Rl6 zhbnSy@0nr#-MoCxup~BEX$P*9GAxyndPDJ!+Wg~RHZOf#S{k$LFH+HaAXJIWpa%CM z5)yLqwT?n|@;A@yv4;gM7`7HawY#zZ!%nXdpB!LfSgC zP<_S`QsQybY)%Y}fEJs->m|T=PN7QBl#&sgCY1cP8O+SgZZI*RV`HL^>FL*VO#gP6 zJ~G9^@c0Teru7lnfswut_b-jWJTgnO zvU@RT4=UF+JIVTzkL;`eZd9P4g-Mzs+t5j9X&ng!B*7zDuTp|dm%SM%nf`9JD5DZ! zhlhpbiC>q{dn?v_%nrxE!4_`RmHn$1%XY@Tq#$-zd}^=4s|c=iZh0F;@>d1~)d^LE zz7Ww}a9_E)80!@}s)QDcaKF=*V4oAUK-gipd)sCfg$K?C|GTZ;$-@L^HTP3BwGU4W5jITu`O30LA7`)#UaABQU8ke?%lhbqiUlh z6cms06cQ8Ok@dZpU`=FXWo2D=v+b^_;X6Bpa#g!WePCc_)>rucLq3wkMLl29w#cMj zJE;N@FdA?{)FZgadEhuyi{MqZd%|z0*lR|z*Xvz|tE(F@DJK=xvNPZGcol? z7Pt?T8suLb%@AzD65VDpI3I-{CJWcvz4VRpir^Q&VQsx*yf&X^k@>Fl zk6%*6MLp8h@+tVNg&wWB3&=u#L10~-CDjCj1-j(;pUD@aPX z&hFOUI;Ew$CK1>{x>@<~~71erT1v&mSL(D>dpPH1Te!)2mJ_-GhC$FGT?DJX9+&pf3 zp;|}a`ipen=>~;H*(7w(V>J&>8(W?!a=MLokCdl<@pv~~pqO}8dAtAlE0m+JX zH@M^31*EJ>`0W;~LdRgue>W|G{kGBamxWz9%=1 z^PKhbV#Y~jryWjL$SGy~$D_G>`^&PB{=<6E$LJt?oGGDi10ey$ zspd5r-EJ>WKL)Bl8s7+N(}H%Q4-7{s;V zYAg~N6;8&g$mwtKk9dcmPiAUPq zZ(FACeQf!dzQJ$Ucw^Kl0sdep@duujJiuWm4(CrwRwp)iSJIu@<5v=*mJ17euxYwxi}|CUujKsdpX(dW(jzvEKj&XgHMNwp`K zdECBn{AGW%plt%zV==V=@{l)QWlReah8qfEAbs}+20L0^>}4BHn;o& zoqw`ePbuquP(_Vxz^iP>$+ik|&e-n9EiBXm*QvH9NW$|r$o@AAPzYo5;-FVl{IpwJ zr68}UO2D$q#$0b}v3~dmt6y_?cY4;^ua6wb32ZoAFivYEJpr~9Tka8&1%kuEqs4>R zBIP6Z*W=??$|$Q9f2hJ7DXHu2$kalY?jiIyTJ&ScVI*D*<(BfWpX zEB~~{Pw=ww%&GAzYp<$Lv$VfYz1@+6(htco*5IPcRU&GwU^`A|llp8>YbnK$6x2~}k2)%!6Fg2h>~S+1{B zBL?w@Tbm(Vq>%gZIfD+rV2c8MVF9uYh&VRIytZbiW`WMOIYR8~s-G_?1121*{3lc> z%j2hIqj_CDp?(-rM&n9JGIrYN&S9%uS4^WA^hu%{3Guj#u}7zv>sLjW%uFU`VSQu2 zvkgVbD*Z^8!-@LTCt*Q@LzbW6VVSEN-8&}+@){~>>8KrG6C&TTVXHRB{1(U0C0R`O z0LW61RMy;=(n%1XI5{yv%TSJ{wti)bJY`EIWJ`0 zSN|f(x$Y8&^WAa42!U$O>vR(%gAAXovs+Id~x14@(YSR>u{Zw*-cURB-}%P)J7wf{c*n!JnNB)_@=m``viek zf6LkXOXE+z6Me4dwj5=}FZD5Zy7}#-(ZSbAPHU}P9=$|qdc%TKkU~bzL_i?Q9(`reE1ZfV5SF{d4 z9SR?!AV^XQa&!^U+Zs&Epoa`)tUX36xCE7O+D*JMkdz-zl z6(PhcMB-(MZLiCBLAA9AZL-nkU!5`HTsMAKMo23hBD{EMlR$ca{T)mfB<^#riw(3S z`2`&N2-+OAerH_7jaaxUZ*hM+=ds1VFqnnd#=wZ7jZOyaRg$>C&8kq$$-73SBAtSy z1P%k4y33=O?b)D_=J(bjs&dCU-C2n`1?}*St=3PAFcnZy4Hmw0s5r+&PP`RA80&+!1de) z42;E$ry2|1Uinz^C77>zxY%Bp5n@}dg07BQvtMBO>`luWdfi+NYi~?>1d|CL?TqYf z^RDDzImS0J-(NNKL{78SFYp_abDS+qZ|eoQ&tq-Gs87IdBM zJX`n#+nRAJ+`7KlX))%cafuvmQ^myaIA4tDo{P<)nm6NZ-E5G}+A|f=s*zny+t^Z5y~4aD{0bAj1YbuzE~? zy3gj+YoVgzDQ5DfNZb41D7m*M=Zd#wnD1GE8Gq0OcY#VKi$2a+9HlODX9aYW za8k2+Ex6XUZuk&tfw@&ZhF@^*FvNholdbWOZ|TtdW07HT&UCw0r)oF$?mvPbC}>o~ z_)uq47eZ{`2=r=we$_=8r)0_eJFU z=p!Nbk+)kfQ*qLLxR_pi*Ms7Br}afS_VaSJnEQAmp)P^-&UM2HT{B#Ot0|*8-Pwx& ztXUMdAQ}7pJ0ma6P9F32NyIS7;l3Aguv}|&!P`1tbaw<=-hGNk_R5;z%yw$nVNd7B zP5}g#`m{+!q_pB!X1y^-a`b~04Ikx-y_ljjFND%bFO`PGu!GRA@%UB1ox9IkhRFx% z)puB%lq3yWu8FikS6C6)OVYNuPVXMqxK$1CH!oqt4XZ6>CPJ=0k z`H7i8vv03mM={}zJJ698CO|aQpFlwy&zU)MwvBs_So6ke?P}GKZ-jylVp{CM+;e?} z#pBQAeC$@f1^aHuD^?q*%09bAlamS(<}OmEg*z3bBUdFgG4bYH7e3pzZ_sgB;C zJ&)E#sql&^KX!z{d1pMl%2>S`aRTSvWV^ue+N}0LfkCi?!wsJhvR7;ltY}Rf`eJVL zPVN0T1X~x1nOl=4vsQtJjdQ;BPP%d@N`Y%;8=ir(Mn`%zzS-J$4~>T$7G;bBHl84@ z>_qMXSVC+6@RPpYPQJ(-8-sDsgk0n5okiy?Z94n;oPr1Z65PnVf}+yXQb^xBs>zG( z_Z6)~v8;(~`eYC0S*PZC*KmB`S26w{M#CA<{rXRz?u1BQ1S3Q|dmAb6KVp!EyBmPK zx0r;=wD2HCdS&ztyR*obCw|a!y>YeGn_FaJmD>y5a!=n}x{& zF+pm_2CIZQ|9Q*u0{q*_+f(b14qc7b$vUDW0(wpE&$199X!IZD!Q6w2PYu7I;PdiH z_PlyFLU^Z13upZ9t30qDr25s83bU$Bz2Bm|@f}RO=irfxYu?$(O1+c7+?V}}H|Op& zQx(mk$0PF~#5G#j%u``ug&7D`U${>E#Y~-0r?tKXB;Il?J8@*l9@gpcYVtkjIwO~& zcMlvtec)bwW;4;TEi4=k2~=(Ja;w-)0$fKX$p7q8Y_|5e!QL424Lup zGwdp+FNz30m7WEkO0m(~Lp*@I3)4T_8#op-Ebwky+c$H)7}W6@GOKtH9g{qX@N1f} z!|V<_Sa2)*ZbRoJE-tjklqz~e091HTtAn3B>)6C2neOX%T2S>`c4NcO#~$yE{l#=g8=@`%(r124c$3Bqrh8DOZP9( z=5kI?2K1hI12umoHVWy#*i*()QgkKA-c(A`pC>I4K-% zuK0Gyp%)RH-L7CWWQUw?R#A4Eou6LOqXRWmL^Tgz9TDD3^7X%*=gD^Ja%(%=VQ;*V zSnP|m+H})9=*@a-9!w zJz(A+y{I_d?tcY#UfQ*@JnN$i7|JEE(-}Mw`BArpib{1Oh%oXwjf5NdwVd_wx_-d< zaYr8rDe5)3)BT)To#hh$sLx+wJw?$MY+BDrvzq$2TR&$3pTfib4J-Y#jn$3)@oFxS z^25bfupz{4@bRi*`BXpqq(ueJ&d2@3`7ey7h!-MuclQ@+hnU|kVoUO_5xAi9p&M(dF`4|i}$?4Ub9S{ca8||V;@m`f`aq42i-VZv5c))SFSeg zt0reN1Hy~wPi_hQz`1w%oNKaEn9RHvk_Ogq`G{+DBAYxj>0~LV6BOXVx(Lzn-+=BQ z7xZiGIe8aTe?r?WV5sF<+*ev_2SO4b2`uQcSSs3&LhPI}7a9#4dCD)gyH-{-+cgCK zi9{5Y%}@9eN`ot9j*4AjWiUA+-i3iA0O>(ePCvCgJ5qx66RrEjih{0bApt<_^)X-R zsZdzon4*Pl$VNWv&UFasdPx_b2@eI3**k}7P%0a*cp4iJMimpOH>ZJCcnSJ! z#$Fi41g#!*Z;6?IZL<*Ydb;iGgA0$}5JiXkpetSd zlXumCHsW0rcOs8Pscda=V(F9kt?}X~G)iQ{)kDv;0Qt{rDigp~dd2t{E(F|Iz@DC_ z>x%$Z>y|tp7Lgha%Rc&}^b0+)!fnzJ#zKxNVSS%Vm3Vks#RctX;;QMTAbnxC72Ma? zP&+9UkN}KCD~I@=_KcR|&(}KLfGB!Ni7vGFt3I%+hW9^-N7!?2zH zlv+J)ef6WrsfU!*WZyQ1ABtI_zn==^5v&pEqLxjfXHm%UyxPI>vPJ*BHhx(Bu>1$X z6;JT)W`9H6&$XJ~*^jDx$-KhfVvmVo#68ud!`X(8Q}~&Uw&g%l*2zcEf$R zpL{5(r$-KMDYg{@;+M~FIj;j)-Tt0mh1~o2v}fsP&HiL- zKJGj+UBG%hmpWCcwo_u(g?Od%x&tU|_yfNoA(KVuVl zr56W6H*PA?2a3s?T)LjEMVj9IN68ltw(NTVKg0VO-tytZ*As}{(FPzE1QIb?DXdpp zJdMtK#cv!>b{^^&3x7|0HEG?w7k;DU2g6NoLIhdvlaBQ&lF@9BmE7c2Ss|Rt=LIio zM&8VP;@Lhp5k5~hZ}>rJWcWJn-(*d%^G=5SoaeCjne#DRNGNR4!l`xHwQ;97mhu=2 z7yDJi@om~?9WqM|L|F3k^LynBAn=omAMk49Wah^L`;BC1e-qWO5FA0Go=?MFbCH3Iw&|#|xdF-F~NigTV^Dc+!<` z#SGbLX>zlqnoo~+5uSeon{DCSFlZ``UV^2p$N?NTfbFIm=J;`rNO?eSK!px?O-hLqu|O zvS_tw*l_?6yyPHg%m6bM`UYxUglAx2z^=jq8Diu7vlt5?zOLb&@6Ex^ z)B6)VHY-PzJJ5xZjjo{69XA;6TMP^brmQ~_ZDrHr+$#Zw*eSfi*R+!1dB9zSX|@3i z_sIJUz4Z|h##10s^)4LWt!c#?>^zkx*!L5ueLfd@=QFeDb?{+J;rn4w^YXt@@>(F8 zA$jLGY0tv(#2%|T&Z_vb%&1->sp4EsyYyUMyIlW~-!X#7+nZaXBTxXz)_A;j5imqb zS_Z`rVg<+`6JR8!t#677G8pOF5F&_5ukLU6iO2oc#g=%^dYPX2br0(F=5$7^{wQio z6rD}UUY~_#oiO)Qw)(He@Hn5=QqF8go1$fUE}~-*^**sSGIg@@o-{>npIj&BC<#_k z5pRpE#uDdlJ z?d;uF3&e}HlwWy%YE5MumVQcKn4>`eY2u)8-=OCLUA&#;1mdrK&;M_$9*B7efB%mP z2UCS!kNxyjay5$#n!?4NnLRIM0Ew^{GJyR?ofGCA>und! z06|{+5`>qrFo2IS1i^szjFTrDmfh>1{ME#aFM~~|Ch!24gY(v?=YkgTiawqk1SC1WZ(T$)l zn$9g9pK_}E!W}dl#!r8`5CQ4QJP}`W6Q^nuu|W$Ba=f0khPdflK{C6k4+A``ns?%W zfCn_szmaEuu;m0@8P9=^&!^AbXP@#Uc+DgK+t0H6u}>#)6TwTT-H>=4W5{vJ!af@_82YUqc>lOfzz0ZYom_vYw-?$(5 z_xY;fVP7{`mEqs_1>(dCMhkuxRqNw$M?6#sL9&_uGtqyl5)57nA}_s_e1ypde>FAp zt-a6oj}P8K`@sXa3|~`jvOAd_VoV-)t}-s>iZO)I-yZibPYy4@x9JKY^WxR;OI+;h z7SGnhZSffoZ>o%~i7S6tz)Ydj$Rv$#(+-_zcCx7Gar=|-TArn*#lU3o>r1w)FM5!A zUDO(Ymq`Qp0$bR@GwLfP($X6>tHBc!xhK4<_Su%(r#SoPvvlX~wxgF)YFJ1nfP*G+ zolEs4JwdegTQ^tU!HDVVezA2dwpy9GCX|u~u%G?;Z!uC1JO<@0*PLhO9rfk&v5ER}=@DQLrQbvw0$GfOf-iMjurj6t@qliR z8U2gk*&RwJv{J}ydX{y7$t&V2&oV0Q*|q?z(vQUkHdR+bWvfR;q@vwTWulg$al$`# zaG1TP8q@-|TtbWV*DJo6sR1Fd_Mcddt3z0pTgRD>d}GCyZmDNO_kb3X1CMYKi2Pq2 z^R5x48=XMKKtRh8c%HLP3=d_zz_zn-;3{(U!ZPEqB2EMLv zr&)@IMJ1(|H;;Qj1VHC2cs#4MUWO+oa~IEj_G52Y*)~m1g-!T$uem$GNa+HetecHl z^$JG^q!DFZH%L^?IB4rNzC+V!p@h+y>(DF+u|UvXYT%R)@gS1)J()l_8VUEUSkrmV zu0pkS0YCl7qD!0ux|p@$rs7DD9Ni$b(|X`rZv=7(3H1`Lt!@+dHJqA;KXVwteIvLa zpnV%5_P9ySSD(YzcnXlqSAggy4(`7BOW#O+IA}Inr>|Cr(5pGY#@S)FXUmAqAj?CB z%?Ex&!SleYyEUfgq8c?)n#7vN*rvrjsuy{wP7DwbMsHU z+pOED9SI5dMv*GR%D!5^vm~uPP8e0tHh{?g_eD3EI{!JsMyy| zRBb=SpPz2^Z~fMpe-uQc`Z)6K-twAPaqQi@BzNyR*3FBXT-L$|C{}=laa29;zXtI0MgKrrk!zwapGX0f`o-MyfOoc77w+>W#KV-6{oA6~$6IF} zdxSWf_r5to39xvN4|%PwtpS7?y{VPw`U5u=!uXapQ#gx5Fl7nS`aq0|>v87j^to)? zyp_1!YD;5v!He2gTHDOS)ygL#JEM{1-L?fg^F#4KP-p~dqO*|o)L@6^0sA0Ymu(Eg&_IdjO{w0&oPO47@E9qE*7fLz|64OhDMw6=kqfBQAo zs4tC!amd##y!W7~kg&)^H z&pMBxBKXQ-vX>j>;~i>0U)PCrL8dJk*^z#AGXPxSxSOK4W3lMX7+*b9&p}M-qguP; zVL&Jw7@-_$1+Wa^m!_PH4tRa=#Sn3-MNvg}KQ}%g9wTZ)k9dh-M0r|q|dcS3!EZJzWYhE0q zYO&?jretr3!>;tIcVGnj`+&${&?}TpTOHg;Nq*}Oz#transJ@-2LBX3r?f0C7Ho)1 zPWC?pY?$McLJ@n|=L2|IT*T&nVa(NY;ffLmM+>N@HTS3q9U^&}goQq3`itH)(r8*G z1~KlCec8B52ZL%B>l!<@Zzu?rP4vdS3Iy+#q%xmQz^r@HYTFx+>#03vObIT9CK zW=o*fJ(4kEaOlo_w#G(a`?>`XuRB~=Z8Ay$Y>}kCw0cP`raqb$;=pT8MZ6;ZTC$v^ z-qs_tJAwV~V?dl6A5`afKrLK*VXggxTLg$;4(WF0ig@nSas2|oNLybbYtQ11J>Gre z60_&ECTYbfOh14654l~H5%pvYQ=Hb!5^T=(DP|hhdn%p57ag>TU78^-iCj7|XV-R?=qJ^UROhx`@P~H^7_=3mSic9G$8qodNsbFNa zg{3CNB7`D*J2X()9!p?*z9};y!8|bhVsUt}mM76DN8zT^UG0h~!{IA0(1WTYn1_C~ zcN!7673cO`YRrs<5)w${#KNrSO^bJ(xE(Ebm<2N?%SbGR#WL0J)S$HF(oBg=-|PIP zIL@;(N($CN^Si_Y?51%1n=`zn=??L-{ep?>OOByHKwsujhPy60>EjRt_q>C1rA6hQ z1zq$Fyn|s9xXMvNlGgskvY-`6`c@roO@kr=0l{wLW_a@;(Sx{vW6Of&z84WaM)k&| zhdF*HJIU3;#{+zo0_M)*lzxjG5|H{zEDZ6CtJFD9m8Fe@#~=V;?~L->kT(CS5nN1m zi4nDMT3c_-eDdgGrk}KQY~xxvAu~8T%kD=p@`mAHgjJ-q|{krfHyTD|*p3#CYLa4~7L?&OB zgm@s~E#ZG;O~GHtrmA?gvN8jt1RQeBwZ8`n z*nMSu`lR=b@_^_!t1ptwRJbpHC)`;Y&^#w}ni~|ny;HtR$zEJuvsa+sJBCMT6SN$6 z`AG$dcm8AA!Hzf?bDxS7eUIKv4lZ8ezBFD+p{9Q7UqEJNw-Jr2nQh+N7W(yKL+ZS^ViQ2qHYfYN93 zUc2K-sm2(m!ReRp-=&%nLp6w6!G-v4NZ{zXnMQu*mHWC`{#n5OvL7#vBnc_-N`SzR>( zY~!gTL!a%A=FjdM>Ve3`#@E5w8m~S6!xEyP8ko+TJmI;X?{sAZiQTuTKe%0d^hQ1V zrD4jPm;4i3?Z*w%cCL2po;IBz6NOjBjEszW>E~{PDJd)m)yJ1OoHG_bDR0dyy&YQ7 znxBukc~!xwG_ZC{3w6>bsRb8j2Ex0@VZbCQW6Xv{_`sF$zn;KVI=i&DyoKK(u108! zZ_D53NGO@@HIXw(JF3K0@Wibg5&ePjGtcQ|;UJ0DfnyPL|7%wK8It41Z3lRD`!1yV zd3HOBsdm>=OTOD}j|qQpnDy#gg)K1H1zpVxvA1uLu_Yt}FyU zMN^F@a=}{=UhT6VzR?0aa*Q=dA2IAe$zR$I2(gqLn?oIEEB90yf#_bHD@z9Y6f%zU|6HQ- zLlVq}wIGHdUjF)X&($p%``$BD0vwQVm3x*JNsT16z#DDCD8Un z+DsK2Fm=8P3ck|zS6Ss6KSYvMBOY%LQk&eEIU8&YB|Wvhe4%Z2R5}?Au9H}nt8>HF2gW* z@lb@3or^-E6noWii@<81ByAFZyDod5^XVt9OW7AUnYZ`#hP(UCWCQc=v{W>rsvm!2pYYb6+cp64_ZXC@k37SaKcSC9U}qFzGSwoS%x0+ zt3^JCAp}RWC(=Xg=W%*@f?fIjou*+E3pH%)SHTr_!#U;k&j49d9w2Wjzo;536!+F| zac{g0#ruCTjfF?3I>HNqj2EEu&pI;h@7v0R24{a@Vq*HyQXrmm%kwu$Yyfpi{+uaV zlo*%rBAm`J=h!7B znFBD@1lQF*0M0zV4Q0wTR~x*@oJm!Ayln+U9F@WZ{$s{wd*jXVtkOeqDUkIjUNPV{ zymj|Z(sCBkeV6rNoXq!*b|0k*$e16jCz#Oy(~@Nl%~MXbfO_&{winBYpGf`A$c}mIv!nU%tL2l$5#`2)x|m-c6pr z7ymHga}aqs`@yJcUXyQpGr0DZ_K7H~PVv&&&!HWU!-kcWm$r+m=F@FJhTm3^ zUWa@b@`S%w=V)41atHT;kn4CcbHhZ-+W9l@^-4_^6K%dX#UYiXRBNIiQ>Y(Jp8Uim zU6^gOtG`vZnh%N>Z;qGSwsP@TY8RRBv~V5SnXVQ?20V`6YOjb=(Q!?bXo+24S1=!K zO$vxt_RreNx^~96{ToO5ZwR3}@?Y?Q#ir9-6aWMGn7$Aiw%n$d0ZAF9s?!|=VluG! zIE{hf9u1(yIn^EtuoZmb`VIV0DW3WAb)-2y>$?O!5fa6@CCvpX0{VS-of#>ZF=YQ^;HL|8`86;Zm5&hrZ+zXppUbkJJB0*IS0g6|`HT(72P}4k18rC%6O; z?(V_e-7N%nm*DR1gaE;%ad&rj?oQ5`JLlf{=1+IiPd9sa)m!!2TC0LL$o&N0z55%w zYtQA0NSyYg+UyTH^G%LmC&b0kC@93fC%_&mtZFc}IUkYNl`UdhWLea7f-*LZE;szZ@+)#uRQL9>U@!7nPDY6N?Qy);=brf0i_fF=0_7KBC;)YSy4$QMg@R zysbSxxU#g-4F!k#wYSi8Z(Er#{NLaRMnQADv?>oJ(QjR)Cg;WPUi66alNM*WoR85% zq$Iw)26*>$nrN2DLxsMM8AY?UJp~fMy*P;L?;Nt%I?maYs5bl%5fvNi7vLBMLh(Op zYjiiB{_g^x2Irq_F50q*{*U<(PmP}YUs?cvt6^&T8)+X?IgcbZIv~Y>J@pN#YiTW?vAgMSgKFd=CR(CnxPd^ItYJGhqz%>=-?)ZgUxyk%{Ucv~I>@2ru(RL5^IZ5)Iw`HPPRQbYfuQKhF$2Q-|G#dj&2vs85Cz6O8N$ z2Yqr7?A$tNcBTJcL1!ySk`ldg?M|3|wE6`vZwAqJ>L7S6Q^kq7h4r6tff$*#AbXQ12hgMoiDt?%nHFuPS&z>M`QhBz+qsMi+b>R~%VzYt z8H*slR7ut18Tv=>dXarzVP@Db({_AdYI)f$3pkY%|9gRdOYDC?`2V7?8%_wUHP^D( zz-I%vmHvig6V)Do&Rec@)_1HeFfl)$%;&#D>zm-;TZMACo`vI*6ebsO zkslVw{ayC|FrvSP^Hu*3#?y}7bIlia6Ij5S`-F3pwNu)i#ap!7G@AU@C+|g$o(sPA z8>d*X%rOjw{TmI$2tOZGLjL!*kwqff5mZbDXiP;t2!NSkLCcx>L=ke@{o!XH|F7$9 zw+Jo(Y@@pdsq&F%pZ=X|M}~3RZtZGy04@#0mym)y-FsDEa;^v;zZg^GCu`ixjqe?A zVH-M~-npWA5GS=`+yhLhsn_RMNJd;NJTj=qn;84Ml@HI+gMP}#|ABIX*dbVD|AhF$ zX9oqi4ks9Xd?o%l8wQ|p3ox}?T!>_Y{;pYhI~Y_VehUUzO@bl(9lTdQm4pw4?x^R3;l?+&NZIbl&&Em|I}qrh&^kn^Q@zFw*V>XyXOQ8 zy#fmIKuv1Ll8}^)CCjr-04gGbE>{xLU*qiJF)I~Ya;J+GWc~tikO`LMN>xh|nxM8U z{?n8^0EJQ}z4?|;Ab4nM;HAW;)_?8_ngadMFGm$^8Xzs^=%RA}doxHKASwZh5?M3> zWS!cT*`4aj=*sM-5EJx&6JHp_ORhkV+p?cO`E_J%R;O)-(2?tJQy+@i-S!(f#}61u z&EVjnB1cb_>vuA{{R2buzlCuEMTe2La0iP2WcVO*LBZp$Wjp`G)ic?nD<&++gv5xb19a~Ezt90h?k&T-ikKi+isR~_myFCMfcr?q9`$c) zgKvO+kD6r;_=-OFf9=3sPFQz>76oiuIcr+@y@UwySPV!v+(7q2P#!p?f(~k zf#501dOd`t?H_N z3FvX)ta^8>4i67oCMED6CLI#`Qa6Vb(0|xY2`VV~`pqIBKUh@4;#+y+w*VuLlv4dz z>WjiPX34OKcq0RDV{MZGV+Tzaz{PeV0@qgaVfb4s#^eGFMD&zmC*`~5z^xRQXZB3`hOY!7C|8-crhxXIQ*sL zuaVZ_1-~Xw;xN?|UMoEcttwZA-W$@SOk~@xGt$wE4iP^q9lq2FmLBWSzM~GS&HJMC zQ08K~pwt;gh!j0U7yyirJShx7%l(raEcCCzqzVkyPwxX<&VSJW2Vm_cQ1o4B_ORE_ z!BKazJ7jqu3*C_r!lROmOcvMcJ3K#b zl(p14-&#GCUq4*x1d_$!s(c+Hng6s`>8-n{!bdj)ixR)jI+paE#aQ$gImJmgzvR77 z?DNYe(xr+b)WdGQX9Z$V3$2ADuu<6Zhu!{#LHYER`1)YK)jb7rd1NTR;JdW?^*iOtRGM{yeN z^q@%QF5MzQqoE^jU~kgoO|INSUN^>`1xs;1d7=qHd98-Sf}HI`K+alKSj84OxAwZU zDK!Vo{}*+Mm@W_u87XdhvtFyOYq(Q+?8ih~654?%!nk_!(7tDm!HKK>F?7h#tavpA^(DsC3&TmT!6Sf4Md}~=ByZBoIb_&75g`&Tz8ED^VHzcm|?-@fxa%APt%O>ob_?=Ju=CcM?^|MtQjuma3713ubeY@d2vx$n`@$$Xx-5*3;awVprdNSZuu zEFSK+qARve+plCXG^=TGO&^qDHvQz=PhmFuYdPUT0UFSbPQJ$*Pv3r@`$u7~&5(yi z|0SKorT)VMq!@fT38tmn^AzuC&~}{p)bh5fRX#Rj*#v)@1DdkDyo#30Ud0(q%bt^* zLxSq+93#6so>bAzdQPYtbbeXy5w88)L0Nqw8KlbgAqyS#{Ovh-ayL5&=rgpBo4Dyw zf=?!s*FI*C>%^D~oK$-}c$MgOl(qxx28XqjfdFpG&)nXR7g`P$W$|@hr4LBhgVnKf zCJ)W>gzINV1-dJXmn)m&}6d^Ly5G52_<0Tkw7`vL(Ok@@6hRfGg`X@ zxQ!XrIvn*tL*00-?x88KFwxEx{Y&ZpJN^70P9R8?^bIOtApcbW>09?Wngn>bGFIYh z_^v*0H(87l*Ntuzx=ArwpngiBdr#e^RhOQ+)&4#aInIkC|poWLT9GUs(6a8u1J$KhKoGiom%%j5U*5P z51o-U`D4&+A8mkXl`^GvWpi~<#scS84}oUJVOLyf0GpnlT_KT>EWmTPLU?%+fQ>#< z;$7VR!%|QlpjBk@sHs+J9|)I`QJ_cx&7y{zlO?so>5?rg6Fzvz3Y&VnjV~IFR;kD& z{Mv`J6$HN(V7jD$zPyFR?J#2(CJLL&{sh_hIRgAHo^zJ&cR&5xmOuo1uJKOSGyc@) zDYn$>&9brG4=tyR=gPP?9Duk&Q4c`2$oD+^S!)h9F|FIa^$Z8Z6m%^E{YW8&+FI-C zO6$*f3f3C{*7!haP{kJNQl0BtjnS@eTv~REI)!CJkTXybMp`X)v=>=G*S*Jxwtu&3P#CsKN3A zgv*sGNmYtgOxAitO1AkCWh}x8e$_)|j?9tEgG-UrOZQc{@$zt-DFKhButbHufz<39 zsVKm^tz4Dq-7g*`bk!)D0$mwnI)Ik(raI7 z+_|tjRAoPnh1Tl)4T2Y@u;fS>%pNc z`*q58B1g#K7Xnq#;m)VHy_HtyGU-&7zSbs%JTa_rzx5^CE_(4O!q|9OZpp=Z^LW}S z%TKiM{Fi^oRbfUQ$N4_XK?MMNR{l}kfE5f|nF&SBaiD+b! zRUX;4QVBZ?W?t4S55^TLs)=%KU8_3i7P(}VjM{d1N3_43jvVVXqZ4WX8zZB%51?pq zk&IlG5aMn)Qa}8dh0Etq{UC>Y@TPDyF3=>=L>#ySqzqZFEibDMu+R+-8|{oZ9+g;T z#y5xA-=3m${9D~_WqeOyN|Z|iysj^_-4~RLhRgaYNt>5~3QyZzy(W@Z8Z4X2)gO!| zUW6AW*XF`iV(o`Sj;6LqQa?#`X~k|C$P38_AqH^y5bV4mvnu5XWrpD zv^lKjm)H*a48RGS+<OJv!K*A+a2(=G*}i!NLIll9nD|2xsABspSkDax@2rcO_E{ zt4aZyF2?sct2R1_+FEfBke8bUw8k5oJGIsTe9!z@Dy8KFARt=uT{m#vB<#Z2EW@}9 zTHsq3UQ&ORN_(LAorj^@Xk-4zFH5mXRwjGts`Cu~_T8~*#L=wzgoqW?=&A6zsdU(>C^H$jHDAC&jDyWTwK=!!3IBtWyW2%s2 ze<+Y~eN=3fI^_`ez(4(X9X}eOiASqEZ$u|C9(>`LL;Aq{KZX1*g-N@h0*ujK$@q5B zVksk!z9tq@NvazL1Qn!}7{@D>$K(K2mZW{2LP()2rtnv)i{E@a6s?LXHLnHVXy7fF zTg-{myHd!9bG3%%tcl~d|HNq&cD`)JO*OjLfBZ-i&-3ak z(U>Biy!4&`i&9QoRr63atUAQ=1_|!lQ|GmP+f5ODo}jF-g$qoNKvU6>4CC9K)Ifxq zQjfuO&p8y z&^^U!wL#!W2A9(N_wVyvP8J;w3X&gBhEetWfiGOE{Bf63K!)Gd4rav^`J1u&s$`H= zVx%|328NxN@01|govi;q%d`##ecO#CTyH;TbyOON= zq_VEhE!iADOvwe<9m#kz-`rup`mL+`(5=n+fV64NEfoL^sKtcnt@r2yrzSvyOLWl&1`}IBfJKYZT#n-rdYTvCd!V_`Gxgm}L(*Ye#86LZfkuS=(fg_K zT>XI(s4}ZpoT(jh*soRLh%RpJ)!wMho%?M6qX#EH0)5Fts=m9PJ+&7OIn^vFT%z6< z6-3o9mGaQkn1ZO8C7%PxTjpnkKsyf^)cK5zkPsHW^+*f*6)NUn!2`m1swC3_PLFt* zCY+RF`6AQ{t(!a=F6I7SleY_2FwlA}E#>=|InAJonvQYjXzH1LDqT1ZW75Obo>qrgH1Vi%Z>k%YD}Z^j_~x4lY~?4M zEVe*uXR^jaOUBSKR8pb&ryQ+Nvc3eO)2q+oz_F%e+xuDI`I|2$%+;TEWZs=dL0xEQ z=MgFnn~z91BefxK56dttkC*AZO@FfuPyq2Fs3k604Ffz zx@_)+0Y10o3HS`sw(HU<#Bm-j__FTL8RyNWNjX0Miuuc;*>IM9>7ISn^I-9clmOj;w}->>W+`rCMhGIs6oj)!MMMt|;*n^^&g!xn9!2 zr*N$m`jU5rrTW;()Sr_QOLuP9ynaxR30m)13Kt zcERG|biF>$#Z20QtzY@csTOL!&2E!UY>})?C7!(6ZUG?LU+pG<<|0HP=K-(GTq0qG1Pt;Yo z433T-N*2fu&HY}ezVN~LBSg;+e-5vin`77x*w`$>`s851ViK|wu z4}Ms^H$=cz_Tp&aG~cXjYC9{?{PN-J9lCiW;>J{=dHr-5HW~Y49zntuv3S2 zi-Tf?CcF7!eMu_lyeqqk3pG~H=RvgIH1t172CDIZmx@BZ1xY4^EGo!NOb zLQZ{^$Z30^q}`i_sBTI)ICOc|^`>c{#AmYoCpPJ)ce`qFJ*_N<&GQ;EJ3iaYT^#rR zlTbyI)q-KitcUMRnOZW29PcE%Uz&y>6F`bGPSBC@2A_r zsRAi_Tkq_HC;4b#DD%8|{^FW#7V8Hcrk}vnEoG_|7AtZHSFG#h43D}~=IzerYn>er zw4#rDcawSIqHE!;`*Z0GN3#`m8Eo5HrOMR9Ux|j38EsGI1g@QDsl#tN^6#dK703a- zgv74b$KgkA@SIK&Zc~-@-SAk)qvy(r<6-mb^OfAuk*wbM$E!LwB3~ePFF&Kkzr1YP ze-b&lvD}*YDV)^d<6UpHFqMYAvS$AlR+Ly@R<#Oj{a4TOsncbx$GI?+I@QHL>|!gIgl?=t_iT3zYp~?yY*z` zmO1!ia3Csx?bR`lNabXh`+4uwtl#lgqiEQ? zs3C#vichcZ{Z*&>zDK7%NDfe-jQ<(T)PwrF!2UOMJQ4cT$zXB8zgr2cI8&9xSdJp2FCyb>C zE(ot4rk5YnG|UTibgeoWu@VlFI|i}|mZX_82!6mE6aGX-Y=wckxfR9|sW(577t21~ z8`f#kHu#Klum?btq*>qGCLp3;11YH9a8Yl-UB76s>>^r$#Z=CPW*Tm4Il;a zlCAL={mkTuwy}FuPs#xJ!^Ppy$IMdgGlTw-@$w&ukF9QMF%5yP)?;QAmj6xUdzIqzS8Chxt*4?D>x6_61c(8(4GVvlfWdu@w=67h zk_rCJS|g3ctF`CIGr^n^-vnXKOMUby8q()jp{wC%WmcGr*|phWPpVbABm9)18%=Yj z@ZlMp#A=YW$9!*Lz`BEyBomKRHUJy_mVB*2^SogB>A3G`ShHx(B3QFwLbq^5Q~+T)vAB=DqZQd(R;#iI0w5WWm?d|zJRglh6O%s0uhl14jj;1HIH3_sXOl3J zFi4^yExx?)nX;44?@Z&iREm3;ZC~6)|53!)pWZq3FW9ETD4agBV3M0V5iLq3zLI&Dol`+ANPLSQ&UIHyBIi=dpkh%RF&SISk%=&hDu5i{CWMb=zPN0ztd-YX?9B z=PkIp2DG)c5uKh^3IQ*K1KPZ9JPwRqY;SFBUCH2-FScCri`w>XM#@Kgb!$8~f|t%p zPPR?^RV?stW`{@uATkyQcwSS7EU%aTbtWq7%L{d;6-!X67E6s4i?D)Ir7C6c zemQv%_iBaGc(ltQci~xlo@v-{%_;yo|A-sHbN>zS9u>n87!oJitxo0yxFgN0Mdp59 zz_zX?pPuL7w+U1j#SMO?WS5yNJwU^QD7_!AOYm*?D~l-xKQ?=Hd8v3#x!!rXGfX=%Q3#4pJpdP#84dVgMa?njw5sE5HG{N~awh4% z1S5*}{lLomC>fVh;nIx!?}{^z0C!Mb=rcsIQGbNOuvUY`&iOnEhVlM$^%>0zV#z;+w;nx+F(aJ)%e+8sCde7<$e6KO4+ZmPq|51G&t0d_B%Eb2xQ^ z9!_Qu=<{7c5CN6ZLA2;;T|CS&|pO1|#YdaZa#P=gnB!{v)rBY#X+MenRmID}N=v!Cd%sLG9GaQwL3 z8x|F#;z4;oQ@Iqt@=ZbtMIi922SNKL|NZyLc(aL^n*P3Rc(Gp+~Iz#bJX+6_R7W4(95$++wEx|f4JPOW~j?pXI;*?p$7QQ}qua(e!4P9r}LQeB+0<%qVXj3UTYeMmA?xAom#Hwih)n`pVhp*GD@ z^k8;>oPWgjTi<|6$AgXjqEs~clVJr;{m%H;ypVFP8(A8!aZ&*EKqRqQ=}W)NQn5z3 zEPvr)qpC&9IVS0Tn9pku#7RI)y!4$d98@u_YGsju*Kvn_3}eq5i^kor$%pq;F4B*d zO)wcjy&uQqh#)MJ=`sqV)H+7)ew}~uYm}ot$^FSEsyIY4L+Aop@*Xuvn{V^ z1o~>{_mMi#W5$aDq>y;vGaqC?)NPLdy(=vG^o#Xs=jW5RC*0tzqCpN8wxV8*bJU%t zvsF1?7lHsSiRpF&lv2gcluEIV!>z|IXz0nz} zR^0E{?wOBy`d#BN=O?IkIRQvD5lGD6&y$YYT(&qO#~V_zg2EzEUIoq-QF^do!Nkb{YN!qMQ zCj!Z@{X{xT(9#9DP|;;kPNGZdEhZg?1S9gthgI$QJC8Sm+3(Y8U5IxG|JZ0d0-r7fLfEzySx>m*v(Vm*A1A1rYFM_yrm$WB0!;%frL(}p_{^1xKN3y;x39P*4 za~+#2iY#FlDUGoPqWfh$xf=FfaO-=B0X%8|1VZwew~T3JSJAo<-rgR)v1h_pGXurJc12Ane zub__I0azcayK1?`aY?xdQmA?1C$AtGC*}tj7Q(Y?zGe7#c1m?{1M4&#p0`#oc2IW1 zaTMVWYJqu#vpvl3KAS)i1CihG?wtn;e6DppWHWM8w3S13*xT;vy+6j*r{*$mD@q098o zw(qqU)?0Bth`?Jc)>F4FsaGO!eBe&$;g2NZQ9XfL6kV}96@FXKfZIpRApsew=1aVT zV|Uj(MkW2uuW$8}UHhDAmy>@30)Ysf-C|lEHLBHE+>dl!u-j%I?HbCfxM60A+XLnt z;oSLTv0=y?4V~sym_)Du-mgKaP}<;gDUSv5SadPTmY=cRBb49|h~Hr^_8b|I&<(1R z@stJk7h7dU*ML_zZ0}}4Rn!dNHM*;YvAQ4_$Tzbz2-a3CUaHA9`JN|T8|K6XfQr>Qo6Kr_-G0Rq%snPhZ2#1Y2)gcVl!l-=E1O1sX8kdyPk9w}i zvY7|B-QPC+{eenXs+s1KhDh+`Lb*s8Jv0Wt+?op zRNLKg)9ewv+ZX>_(aXtggkI$ZVA{Y5=5+_Z2kWkBO?zl!1gHSrL-h*bHh08?2FM4f zi_pd{mkI#*wSTC|;eJR6Be=nRv1F@IBJtA;@wC?+cAr6Qb?R{OC(X9NgvDi#Jf=4Ra7j{&QBPM}W>&hzrX(TP?}6B9jauWOckhe~IR| zzB8;wZIhvXy}m)7)-&)*ktLVF#Ggo`Ai*V(`_?Nidk&j!*dn)KE;upc^9#YDH|^oM zg&LGijy7H69H3D!Ut?IUWTLUt9yTs+hvb5T{=22sbie}UTW*(8zf4|ua-}?Uh!!MH z@+aLGl1hZ4u~9}65l$y;1<3_JyF0}n8@g!tSRxvh9 zuDY;cHQNc|%DZ0$W!Gn0MTqkfL(Y4HsS6aYRN{W?qf4&l;90(BA+irx)G_fktF6G4 z66Io82|YdD5G01MiYHwsqzIJnH+#HbTQ9Z9jjA%JMKE^m%B>Ug*sB&yp%8GeB~t4O z+E(h4@INNcTFuLJ${hQ)L{m%+#~Ld8z|wJ z=-TUjwqB9(B{3-T^4Wwc5!(74C0h`_SM=w3*8ux8B3i>c-h?ivL^m9sgxgdO@2kC` z=x17!y5pI$Ipy*%!ia;m{3n{T1y;Upa^vfBKCLW;9GRPVU5y9HS0K_IV*dWh3;Q6F z38*Uq%CXR9=~JAcl+wOm)GuTb#_>MTZ~5wEJbR2xI@6P%sse1e1$QZ zH<(=tMFv`%ZuUk~0Th;8?8g+3d@>G0sqA^Z3FDlfU61*5eDX_FOY)npE@(&q$z2Wp z=45(}m|sDSd|CEhzxdwU_|FqFJ4WrKX~tAhPtG&o?QIlVdn)ruxDsTav|sHEjgXq_ zmumim_PuwLT0l}!U5X-E4SyXtaG0}N7BU^v%@4H-jj|Li-In~M^f+A_QRhqia+QLZ zTv7JpZht;vp!ca|x0oSgTtXxL$HshpNn9LNB}VhD^}iUZtnNM&8(RY?y@Fd!9iIw$Wn<}%69ow6)bc0&G z5xcH2&RA8B8dPSSEx_NuVh-jNs+BL~X22j_u;a{?_6^U0$zAYA#`ef6Rr)O(^!hCx z4rLC#Pkh6+czDG&usJPP9d4i~SGBfkGMjAApvH8Ysu^+hpewohF{ji+?&2T9)r=Gi zv}JJxqS82CFE%?j#97U@{!q-S>lTVaDhOht!-)L%lYh2~{~Iy-N5qRuhQxX8*tj4B z!PqaMAJbXNELDEgX&46_OP=C+9LaFD2+??7x2Jhz~ zo%(CnAvXVMpvL&>ujYa0%dSYR7wd5Qu_(UJmve**Q4TVon4}~eaqtda5FKf?^G(F>l3|4z-LhRf&>Uj3b;L`o2#*f@bI!o$PaME5tkDgf zv-=5>zoRkuq~)lc1xc)%}}@ad<|-So|7$bO+rdV&@qL?xw6nmQzD!lWN* zVJr(KdNwmV9YpJ3JQeK(sy@2@CqG2^ZqKcOXtip*bzUo^{Xe*NFwpSdedeLG@zF)x zA)K5Krxjw}`&uU~Atd|syA(lc?y?i;KYYH5h-YQzY$A(SDJK=@X(<*6mZ1@;7d zC&<98-wx0xK@#@42SdywbYu8$VarCk!NjC7>hU)$-;3LZU%g{U_0xHGdRj&P*x#w& zv3V5@d4N(b9(=f1B=jL6oz<1O;cQ;3Bl_TkrM7H6_d#j;#%ks;Qn^ckpkwG~p#HYR zJM*U`W11Tp#Z=X@nd!x>)#k4SENtK8(b#$PCq7vY8PPHQ3N9F)$?dv*sTjh0b2^*| zNMi?1+@RCUMFbAQ(yr+5IM-QHyL{4=c7f}VrT99x?iqwuk^W`iKuN4rc}V@99kM3~ zVY6mwT|eYIM#=375gebl6&|Ee{=_|C?&CD>#jx}eRj{tY&!kbs1W)R>57dc z|86Xz8eG(obJ=c*BM8E>bj@*z(6lupPYneg^xk>)0`-gw3NE^)M3D#H@TcBW*xfZd ztx1_9Mz?NBZG%-5J)tLg=-p36itu8N*vHR8aS^k(M34E zgCyBRhPXTpbU)p3CILf;x76>%g@NyWL!@uzHq#$#ZR9I#DvjJ z9WhoyVZml*74FiIXEzfXKhzixa5);RZHYDE9Q8ZoXLnz^Vc`E65Z z)nMWjXq}|QlEUt;Ow!g6WePb9LClV%_INOqg1_WaAY(d?FeEy&CuYK;RHuRN#HgqljEr|03zl_>xS-jYdDw9dl zGnR5{jj-n@LHo1UUN7C-x&>5Lw;u*iX$u^F`fa<;<{P!n$XctHs;fmW=c*|<%~0^O zmb0l*tm@irni>|}bMIZNF#IH*kcn+QbfGX$Cu>?j??!KXCt1260-776aX$;IH254S z^NZ6TBtL^z4UD?;PufrvZ|Krl$6$G#_c|n0_IpXXuCJDZX_Y(tcg#yWS2VRYmMm@- zC*6I%7CvQ73lT1>kU{;LoJcN^HpCOq>O{*-ngHUZ28;d+> zTyB0zKIhAFULJUNSIt$#CE|lKJ?~010xb|***R=@--ePtNt|e^cRnAo>@n&VSlrN4 zn{Y6s7mi7F$m;(895$pvw<_ct1U&5HdB_wI-j@Sgh644CU-F+`?fIG7jG^IiB~~O< zKgUC+@4wB%AbA=t;GsL%q11O8;&)F|h2Zi}-r$g!s~++@@ePr*|8D+i?AY}zgUeU_ z^<4(9i#~XCl_>$nwdY|;4@?g`eB7(#M+(vPNS>|P!)?UV#|l%#4MPVZdtxBBKgo*3 zTSx@0;Ih*>$L8EiyJcd5U+EaH8Kg3?TG(qV(RLqT9gZT{Z{3LaDl&A{!xHrLE*5-B`GZ)ZBNyUrTFSbJw;;T! zD>x6_&5L6%-IwfT5k_-9feyaoI3ZWbV&#jA{m_5%gT+YGf)HsI z8Cx---m1L4J#n*m1?saKPK^e=uoODLpicb^6hQGfXzznjj!@;B2 zCA>QYFG1bo^Lf++MWvZ1S2J3*nZMOFGI#YVnOaPH{+zi zkdk+cNkBy;RB%W5=>wHX8E`_bPIsbN9RQK`P)b)Lrwe5(vGW9PV35M&@O39nV3FeZ zG1N_v;t66l!-Gt&>E)?z31lsS0KgSK$U+_Yronbi7c#DMCi14=yAh6x$ls8=kEweY zn_g4Bht0^-?g;7}4o>p84AoN*-NxQ;Xr1@F5l}MX^D1e&Ir*DELs+kO`vc8}NBw4u zwBX51@CXIiihvHh^}}48I%KOqvTPYsp&!?7=V+;^irZzq8G%ZWh*q^chg>|Wc#Ejy zcO*LH5JYLP6eZz93^u_=n71?AsfV=v3WT5~Hm(#zuHEDB7WjMD-{0RIY9=rld5S+S@DdtVH1?AlJ)~;ERPIzYO81D% z+m2rL$P)X&S5AgDSp#AwHji@BuP0B1`Q&}Gb{9xIMAQ?B#Q9)h5PIk?bpZ-q92 zeh!Cp`Q7<+ffB97RB&wa5~^Q)n^tZw?P@3p(8ftLbUz5LJRLIlKiO+f_$$`rxoO%M5SEm z!Rj&g+rg=E-C8|8ThSzxvHP2I&TprI83Qu{dyS>}YCmMP>MN1DE!V%OU`x%<%T;~HmZ5bmi z&S#-K+T$Tu@j~z(ot#Dl@p2?fzEnw>BYa4A0rHsI*=k1~ZkK2tYy&M*GhXsdt2FJL z%}-%*IhyWo#}lWBl_J4F#@!(7f^j#GRpr(fVqxAA7hG(8#Ypma{DYhC$U=afbbpRn zbU@o0oO)&Wva2)QkqrY|s@zx{5aVO8zo*Bqx1NNczmFnd3}ISJ=KZG3ZQy19d_%;d zn<>CKz+x($r%&I!O{UFP$VQ4ACLq%7j8?7q#ib?)i6Tm%*_-3|}J7uk>%nc^)bJ z)?Zzba!|YcT<2kpG^*=& zJecZj#djo%jvN3dJh!nw!}yZHYeXh{3rjv^Fj+=YVSYjA8?`<1f;iSF?s!nOkzO}2s$+a(F_g{t`kH-VA%%= zo?|Sn^X;xpHNM7WaugoPo}!Y?pQCm3%Df?y6G`#~^@ zCn9=KU52b<+0ks(&lW~U?jW_gjy?XOE-n6gApPx_R_t@Mu>h)h>PZFU5}c6t4nqd{0;kMN4vt`Wc!swlcA2&NAty&yGIkXB zG*z2g^b%jHDo;^yE|q#_z$f*+M$3?O*rwe- zgrS#s|8=(1^t}q(c97<9JR+!CkA2p^3l+1>73n_i$Pq{vFp7D66WPS|HIl^M+@EjI%rH!a z{5lv>DA#QG0d)JeQJ$y#NPUikJ4{gZ=TVo)A(9R-^M{k@^Na?fN)kE%Hi*k~{nvq3 zpfTD&9A%Er#0ClgXrXMu1VpM9>X11o=$N2xtZrH&ejxX5hHxZH`)oV*xs7~()Jhl9 z8n}WoJ*#6)9rbZ2-ZN|~Kqx80AX>(YEnG;ogF}zNphAVDVMB_*nEJZZn*sDN{HWKt zA&ezzkaCdEQ_D8s(b-P(yoZdQ8rL1dE;+00e7G>iAOg4?cRxOVMk2)E1tqOE!&4Hh%y=I(qoRVIFjr;;`b3V?#;E?&{9F?{q+Mld;{)pb;MDAQIn(o?DAcA0mw?l`NK&#Hm zgLsC8w|R=Om+Kvt&qx2?e&JxjgRQsV+a@3}?hEw|LVJIdAD z+`EJ9-jh-UO~RaCS&-;WUGOE$(9%5_ILU$WJACi5HYp!YWd}8 zbleWF&vSb3dg1drm9sE0SKe*c1bamKtvhn4c#PT9^7lD&xcT?y>izmGi2g*tBgE~a zKl-$HVWBcKl>@n=;^?O^*;)4!Qb;>_oHcz@nv~plGOqE=8z0@NAiKd*HMg^a=VEWT zDClZjVV$tgexHH#`w?6v`FANV-!1_j>(lv`In3L-vvB^ZSeADEcUN!-k2eRvbSNv9 z#3?cR-RA{E1PCmCf6aNy`-u!;EE)g%&Yp22E&13NAq&&K;D2cWR2Z|t2g5-8Fp2sv(^;(0DSF+Y+h^*7pNlV`;${r7sE{u2{J${nt{^%Zp;Qa zP)feVw)cNgqzZX zi~e-7D@#x~bz^8Gt`Dz0yM7x~lfv%<5p3utI-uoqMWfci)pIclpW4jL->O@u##z)O zgfiJ;O&-!fNAhKKh`ViM#^nzosWmCbBfuZZqvxdmszLf_QvCm%sy7i$+aw2onoq-T1#)Ot_BZGrRF zJ}p)oCxfV{BKD2D2vGMjA)!gml}zFb8Rh+$X-c&^cxTEqRyB+Cx_PXEUQGtog!pde z>wVZk`z698bCvBl2i$}m+~D!KXH2@)=zi(63Psm^nZ$^Gv@`PxMW_Jvi2`qoGK?~Q z@nyU+O#o>yC(D{Fb&VuXvFZwYV<9KO9AS6OpEHip)edl(ZKeuCYme629YRp-^lDUT zTOCe99{u0#F|TfY5UXB({vvSQvQuKocbM?M>$U&wgOp*Okw|g+Y(qRclt&m}86yhvbxpCN=iVQCPUI zL!8C@V2ef0H63`~D|Z&U(kfiof9h>ihwGro1zRx!In9o6lbidJ+><&g7TQh=Un{3% zeV(7-sKDGtk9Ms%jJ&WJlKY@1LTA1?(lb-}&a?yRPiYs;Kwq8&en5E!E_1H2KbG``v*9bYg)B(tgHQTRg?oUMmF zQ};m-2z=)ASPmPTGJVDMihSX{D9)J+D1!OHPACsQ( z(j=xFP!t2ma;BYs%GxaUt;Dvz$XiJ!^u)Iz`XJG?WMVC7Ub#G&NDSoD=(O>oVe*PI z)8A(a9BkMa1@O&(&33by69PoaoV%L~uRx(l7?d1E-)A@gF%#eTniJFsOGy z1W?V#6wNEg3RY)*wSl8S#<1!hf;rNLrTMTB(;2`cBES#xVQWJ7G}0deiIO`3i=}Gw z{`@x4dk~ z5Tx3sgG$Q#-RM;;v$0Uq&_xqPPs13zO7S=uhN6iE7QC6~6 z@_A&PW3H%BuY212fe$6pI1?M9JRUbUDVX^@6mPU{Xi#PD)DPc4VsgQf)Q>|Fp+Jyl zKS?|z-A^fPUUl~F>`C6+hhQ9g1e7PU&3e3>L)w)QTJ?LTYI$0OEVkD3)lRj^uD{Pi zFia(Q&{9vz4EyXw>708<|{;2 zUFYcA&m~5>MMe2ed~lV;6v4pJ*7-0~wj@Qwto3sza*cJb-x&Rj1l;+g6=~vYzn;eK z*dZq5tM4i?d-yBFlhK;~XOqR>=fW!APPkMXp*Q!1f1glk%xFn{cdjc2J^NmSH*RUUXwK@ zr-dz>a1~t#`}`K(a8SR})g61PkI%i09!T_o>*+Y9G9pKuVbi#6mQR?%GnAzy+?%W^&W{~lKq%nm{vUBz)vti{dZ(bEo5IU_scgcqA6 z`jtJU+BE-DS4-*shi0U%!i2WlZBOQiS{Nluf)w@E@TGgnk4n%UbcoGpe)gVAp@{jt z3Yz`fuXckdfCev2X*mWVc@l>)kzr1fGXy~=1KMI zl@@_kW!|UddK{roowlumgyeqpg^Gg=aDcP1DV>5MixT^@MKbd&k=DXHa?za=d`!$f%#-X*M2b=JUk2*2c0PDJV*z<_|< zYtj4Fe>*>xc?ZM2U~qfpmfDK0`4Shy$Ia+cJ4C4btVO=!{6JhNzK3s7zCpS-9B(3@ zrx)?&3P`hC(R+DcrLg%zdqN2SA|^br2P|P;9@b#et_?-P$SCaK&xLTcectk1NpChC zd&f{?doHxR?SekDdYfliLIZn$aZsB2_KW`YY=D!&yL+7F<(1XR5+`)}7@CxM8$|Hu zqJsPxrX*`w!7{>cl>Z|`__*R6=EMBJ2xDKMb{UG-trWC#cZ>LfD)wmI*gp`>Bv~~S zTycJ@Bcjkt#)JwecwEjQ3IAFa)`7n=6u!rmr@S)l4Cl7nda;x{AJf2=CiT7O5N=M0 zd{-6)n+Y_iLFI))pTf!G7yS!AI@Pq{D6wFAUJw!GX&$4}AYYh+Y&X4v!$yBShjVBT zn;3imP&iN$^G%YNT_N_CP3$`1*oPb6l#49OeTWLPwtbI5!u~2T^H;8^lc3C(Ef2&A zO07&LkuU=mS55)v6^bxV^gm}Fy~Z1VExFt5=KA;Enwb;`EI)kZZD_pQkTJSeTMAED zwpml_?+AvLR*0t&PU{Pu+^3!nWC?U(Kq7iZmo|G1r##zli@1NGF8X!Rg_2+~ev8SJ zH^|BHT%7u;*t*aBkOUHKD3b-sBfMQ#CY_wA&|eTS)>;Kr?zqsWL9UP%zlS!d*pfk> z8#Go_D8VcEfU#@`*Gwc#nGznabHi+ocDRRSx3bU8>) zx7oG!Rhg;HCdcfia=q=MH)BaXz<@iYqu@yet)Q4Aq5N_ee*nm;<;&{kflEOvm#8zM zH&!s3^C=97fX8tzU*DGzNs`FPvEi=(;l_MV3q9z!j7QuNdg_*ST6r9R_Yq7nE;PV7 zh;Nj-`yDJ4(rdK5BjB`}dn@Z^y_A~FT_Qnwl}y2|r{!|Xznvu4cO5zsOYAVAFkP`I@EIii zuU6=8K(vJ62cMx4u;s4CPjuRKGN%_y5=9zCmggy&8!HVc8{%%DPA!+@iR;LPQkQF& zE&#flKgWh;&avgY(5XPVWm8@%4c*VcG8yi4+D(P>q>^MhJ))HKjW=q-^O~^&3eh(d z7p5bNgv2Vcu5{|7fyF>!qx=pPE3?;ry@gO@v@r1@rPs$aqWyY=dn5^G*%{}DJWTS^ z4jccnT{q?lZw~DJ%Vk?L8DpzD8(@zehn}KmhLE)`L(;orw57W3^03rb=yCJY8-n<5 zCaa$-%C$ED1_nb&(gwG=_GD<}GM@32au%ugX#C*w30XX(pR~?e|IGI8Lc2!4Y{xs< z9tooJ(hH+tD{{LmnYmTMo^)oBp4xiJwybQYPc})KeS6`7C#+BN2oE+)&nS>awujl0yW4T?5`gab*(A^zZ zGwK{3QZjS0DFo9+Gvf);Gtbk)NyASJ44I4BPSf`b2OOPG?8z&5&To4 zTD>7yx5YVfrO}7OY)ne^>;3HXMyVilbC@j;Eb3jj^fe|!AMOBIe2_acWS7ev`oOC6M%QBLy$3ei3cEN4rp)Ce_iUW&*qO{V3c;e?Pbc1jW`RXkttc|EiY%9n!~H_y znuEj0z-*O%!Xouz4qa`11UIA5G=6-tP|n1P*GH%MSnplg*Uq5*g21Wi9!WF(nCOxG zvl6A;5A7PCje)qpdnNs|Bi+Vk+ORk6i{~)+INIl;66ky^d^1GJY{z^qtHSYPts4=C z7p471(^TyU%6x+hH_3u#t1sEv6OM!!dLirCQI09ASjV7XZRo2C`S@Eu4ht2#MH3H# ze;`}0!N_QrG$IgPjEfPHfx2dDaX+We*(ZTYS(p6!9}IS%e_Miw2Qh-6g)gmGp&vlO zz3tcxA~6)b!pCkcpKtklTR&G=98@$~Y*5~98iN)NA`>vv9#W_+6r}J27uM|KNN3vW znB!k5U%yUpwZigw^&nI)uxW~bAbtMMeb`qlJ%s&7;z*1}`_+iWLn908Vg%R9=I7B} z$@*m7ORS{k!z`%^*A+UQZ=jlY7gopfM&NOPz|oc|9|a^A3??(}C8@1?z|mVn&GPSd z>vQ6oo7#HC#gzP=J2%f3ABP;h`_qeV!p?=0hw;7I`>pi;1o!=?1Vxn7GE|0GC# z>5&{5*FTH38tfppd?^}c5<~+1Fgf*UHVN`&>yV7kB`r&x#^^zl{34@J&L5&8plr`+ zx^|;k<7VWf`c-!?&8Dwn&G&@}1iKH5P&zaLAA{O+LDTPv zXbO{CDeV9i$=1<6489?B6*-n#nsDGVOGfhf4y6Pvb4+%k9)FTAm?bYtp2By#(OUm+YW@jc4~VP3AVswwy$1BcZs!y=VCpUGxeWd-IKI zN!-c$tLa=to3&e)`!4E%*yiUJ>RitbYiuTzeC4Hq(;!xk177~bK%QP)`T+&i&|W1D zp7mFIr02)z&<_KEYfL7F%nP~W>?f^5Sz>YF$5!w7Jk1$i6qy}RaTt!vaHjDn!fAbR ze!-us^#t1J_W%y`HrvEVK}s{yTN#aA9S{*~#wG=Ke#t>n*isUo)!c(y8_?F8GCMEu zS$Hv7EZ%*91#xz^Hl##^aFAInn9RqHxVOzFKphcY4sST|A!jVKiRN7kTp$3nWWv)gMjPPnaPI~B2^Y~GHz!`9pC8XyhZCv3^ zQT7#Jh(<_6Z>Bv4#m@}e+c90prG8Bj{<)%{Gbf)%n<7s#IWa$Ct7L%4fIFwpT71_! z0Ki25-_K?G~*(DrPNKZWo&+jl5(;2qN;!++(?qwCVG`x*`Di za-6@?<3?}$hZV8d0F}kg_5&8=bjKyzI6AAwWkcVS+uH~6+f2hg(dKXgCeY|!^b(y< zQyiCgEWHqYGt-;!YXPx$LYDJCp z!dZCbUOhi(53f;j?UIj1&^C8W~Q)$ZL@NwKt6L3nw{Lj

0)L-p{0_p8AWjVq@2(KV)^0ned(;=7t>HbkDdLRpJXZhX|5s|=<0 z3OBTw#Mu#YJcAjR){>+Bq$G*LSp!^6WWnmxXs&9r(yTOWD#L{&^V`BHTA zNx@N>-AAKK2{3{L2Zppm4nlVOa7zvtJtO69Rs!|<5&5ZyfP{V6ij7b%v8ge_nhZ)v zSDu&N#P^|fieLp*lpqDi+GK&oF#?cTiKG?Z>7FP{4Y7>#Ws9?S^_O zP^;b!0;p(nc^rNfTA1BGvdl)V&-VsD_g^r>Ywd#q^z`)TT`KLcU{U8IBqH{|zJ}6A zvUXGeezs!|fOg()ilnmy;H)u7aO-ZK?=5gxj6dhpE>UA5Yrrm#(5|;tjiLsPj=nE| z8}p6DG4RDiLB*1YJLQ3y zI9&+dNGO=he&zY3t_UckX$)kXmbo2L67!&zZU+!|KajQOp*O9*wSo&UHy=*rbzbR0 zL_~(eofM%5DU*ly9)4|0j%;S@VT}^4K0&?%!NO}6K?bqMHvrbdVKdJ$)kCjZtk4y- z@AvcN{=rNtuzhrK(FG#_GMhI^50Vukn*vvZqe<07D##Jbiu>MqWrIVW+;-;(1O2R{ zXJn~LoK93$u?W^iU#wCP5nd(#%8#^CE+dUMzx_%wSu&!aT5eYFs?x6K5+Bg;_9V)A zdlPGo^+Q{#>9=9xVc2V5M1*>4jqe-oMq16b>{CT{jTyGq%JK!$DIe7;5_3#b>bI>C zQ@P5tCHvyN4aU*S= zdglv(`VICdTq1lR!U~9rVse%QiQbGI3msrVXDj4sT*?K1m)g;d|31{a+MxFFa?76Q zWbg>|;^g^YG-i}vX-oN+^r$DT&b2imHNi97B`pV42U+SfqYP6Dw?f9uuD^!auoW1A zqG(4r0Uf$2+`Ce8(M3Tk7N{V4X@TFNe$M7_?Tv_NcxN}3JzH_kg{?loCe}np{M6|u z8d}^dt?n4>*nRB|6IO|7j5Y%09ROp#u&WiYG11QgsH1D!+y_#9v-FL=Lue`mp1kqQ zwf1vO^l9rcZGN~SnH*#|QBQAH`!^c@JdVr{g zDzUsBqWcM#`#-&S4wG5U*AU9&Lq}#9(8*u&a1p_by)%!R-1|X<#?D{&Urbv zLAXk>61UVX^>4HFPm~H_qHvXK2U8G8docXk*Psya4oI%s>!%Y9C~+RQx1F@;#-oXl(8EKX ztFibKV$qr3BT7xLlbIf({$gaTF z{Vl^qQZvzefP?j-9z!CFL}0L4IX_V-<8REb`I+BLp#@v{&2Mo-Ag zzWC$dG5<^0;0`upWnoevbf8-hm-*v{U2B1>^7lUCH8cnMm8GXh&vPU6ybdGzra`7~ zqpwesyNgm;e0g0byGHy@k3!qbQB**pgS=*wTkVNRrCcTh_%19@bsFpuHc{y$(?WsB zJlYwUP-8g{a77;#N4$+!zq>*lXU_reE=7>)_374>tQw;mGGx*xz=` z^b}f76~{qE;W%v`HhRK|5Mr?JkZI2Vldn0VBQC%7?Jmv769dIy9wq*VsUT3 zPgP|)Bn2pZYqu&KkT&!n_dk#ni1%|JT!1~|HOeIcgi-4`rEEH@3}=JKpj@$9b!e>v z&#KK*mCTUa#%aeV9@$FGAVcWcavSD=sNGp|q)NpK(I@h_rDiA2o=CEk`ARE|!0RbG z#jZ=0B1^IPHsk1GX8C<<4zG0{Ik)?;Cg&ab?)Rt1NTl1YY2Z+xSf5-vYg`y%zr6kZ zU}7Gmbv-2Md$#Jy^<9xs{ z3rV#)I{-lYTH0gUTp>c73uFcNqdMlyZV}$bH`z=cQKXj@Td6Zh7k#A3YWQMo&xbnr zDK;cJE&okf6J2P+Fp2aSCag@zY)=`Z*-54m9i`3W0tP_FM??=Z2*^W=Uf5%Y4ij&i z%fPpT$}LEKP(Rt(jH#Wvv6{JX)$Q@Rp&bqE;0!S2bkHSx1IAY4y6QTRPTeZCWKA#t zj|W5*Z8(5mC!4!g!cFHkt?I3NN$st%lfJn+Pr$AHxZQ0-gl_I@tb}BJj3=7_nv>+O zu%!KBQ_ZJRu0oa4%Kis%2p&kO+Y?8|rliS*0Q+(w)sm%zi1O^A`LlfZkf@>y#*Q`+ z=_&xHI~8d9x>s&xe*d3(*T*Yv#9KhXA%}E(nDCLDLavDAd!D%{ypl#+C*(a<=O`NP zJ03_3R0mW4!`Z1~^>L1#T=UW_alTSc@qqHXt_IE&f~+JMoS5nezt_N2M!q z7*79jN<6SgFE}TjM-2ZoxOm+RyMgMU>?xy?fje_PFDYJV>R;!Tu)>-4a`Y-V+PAXC z9oBc8{_deE7Tyk(qAIPQsEBubpBcu>$U3py!(x6>RBsty4Ku)T)hm6N^BAjF>1~o- z-Km#hi@+b3q>covUk`#-A-1JEnl8Xo00;G${%DazdjIG{YKp5 zvlvrgy1b<^B9>!cWGvB~=@*Js+ppH^yjK=56gcAV=%p)s3iMAq5068)LUUeVl z3YX4mo?ob6ExO8}>#3Z!zB%6udid}y_E||>gCzeBEvTS#4Qn{?+a-(@E&xzPsvVLh zd}h*4Nc-^7c>D#(feMjjoSa4~?gKrb&Cmt5Snen5vdMtxH6Yse;m(a-tERA4Ptaco zJ`ABSM5PUs$04##1~qpU9!z9=MnM1WMw?(BCS=d&b-EdAS>=B8E690}FJf60h~cyj zzrK3L2h?Vw>zw)CovFk9c<)7V4hC5+wfR^&++Clg!6AU(!DYTC_UEfzKFI)RGZUqn z)sqbdu|D&f#+o-44{#{i`lQU=&gZ)k4@2_g2Hv^)|-|p9Bg|g@o1X5=tB@=gExQlx8n0i8VJ3&Q7Ex-OqR{AKe+U7*16a=J>9k;V1b3=*g6 zn~gaqqSif?LDRD$u^ZFd%E9)ymo{>)=5^jLT>oI%DXI6C{-A(+OP)48GeB_R4WAX| zfVOy@Dn(={(`?nwT`;1jB76!CK%-=i&?*xR4)CZ}9+4Z`<5oOjxugqHE?`jr%pFwb z#muN`DiBfNqUgU_D1$|Z()c1wziUd7)$gxQhW8YCbZ>LrWco8c^EOn5nSrDU=+x!& zw5H30XpNEH6Hi<-pOeb68NaTskjtw;w7&$P?)ZE_$M5Fh-J)t+Z!n|pr>yPzP0U>K zd-;d0QW5}AcK8jHN&l05TyWjb5%$7Ryop|Y?)yXIXN^Xa<1J$iLio1B{WxC;>H3!Rz@uXg-nYM8&7jc%tTK99G@A>S5`06YQ$D{QdoZ~6P znw76>=q5dHuSh_m?K(91BYLm!@`qOO8*nTL#CoHQ02rUvDCiIYxewAA$oqIm)P@fr zKCnDnIEjvpv^c6Sz;5N*g>GY2E*$SpRR%siW6zUJkZc^EE>%hy;VMra~~iGro(0Gxu{!e!WbhL3c`PhTa4?7SBl55CeO5Wy`iUXHtTR+N?d ziBhHtb6&B4c?n32S;%o#+|92+?u^MV_ABQ^nG-nB4;x7m+-QUQFn|0YUXwe9dFQWi zACcbKeCkD$IYST0ooz=_x^_*!ijX@xDtyMzuU=;;LICK;R%cprxicsj!B|EV+ai`L zY686%85+H#x_d4+>ArV>WDDd3a;>oHG00#EAeao9Y2;n=6*N(+XxhpA`X+9t1?xB5hkqu*qO|u96C&n)=Ystn@x^)nsfp0yPlC9ZCsYj zsFHNdG9^#txMH9nEnDOciHGUxP)5eGiD_vK!&0MwGS-SkRh(y~p1N)CkW9YE3^!ry zC=Lt#wQ6KXYO?n#{S=tng3mC%LyA(Oi^)QV+foE?b}Hf=(1FULp70k<`?K))d1k=f zF2gh`CB>WUkE*mngpX!<9kz2}?Ev69$&+gf!$U7O$Al*X`xaQh3a9HwG^kn*@= z_@(m?+I|^B!3vxz@p0I3A%eV4cFc`?144SjYK{-+6~Ci_yO^A&BiPWYbSv$7Ypo|# z<9jIo;5B8ASA(cvguAs$_crBy5t2541$VsQXSmF;sMO=~#Rl0&!F7#O@VI!P%Y>FC zjoGknzEWvGM0y`2p5$=aYm`T;)wjekN2}2Q09dF~mEnMs0wnU{$+vxTvN{K}fpN4t zk?WqT2?<&^9^;LOBCbBnJ<%7>3v6MnMz*oX^h1lS{{0J zR02)7v#$HpA@Vp^g;6VrzL8I;*ONllil`HG%ize4^qk={L$Q!IA3b)V{br$s^Ttn~ z67**SO-|&EKvlZO6lYH^3A%al%+ptBW3mip3JOBKk^b0=_V5VrLNq%1pXv&D;O&x+I0f5Dt@P4Lh`Ay8}YHZyM2ar}g%b z)2|wfZBF`IkO-;~DQ{c(jOy2&o_9_4=XKhq2k`qk^`oF4=+b~d(BLb6Kkh`jPsq1K zv})54nnw9WYd_mkjo1P1jayWC@!I&t%paxmr; z3&21Iq|#w_3Bd*i>(7>!{7&wl-E}W@Qnqx^W)eV`a1cTO zQf^bT4+it`APae0dg0-bsSQyC46w-*tX`GK(-WVTLdd#V%x(7h&}t*IVJyXskhjr*t%|3>NV|TxBk|HYj??5PQDvII^7`C$h|# zgu7p5grY=(`$#aGzMqTFSUp^qfjjjz>*aQz5_5<39N|Er&gdh|K4X_W;6S(z9NWkZ zTVManQ9Ix)F%9m${j~B5$N9>1O-xx2*W<0{Ll^sQka%RbdfHgVR(agLG|8% zE@uy5yc4|3+X3?+)eAQeb&=r2ynT;Bf?pbR4wC2+A0;MD9Ush;{q#b1lCc*~&drl0K2vma!9cdGdx7p5BiBExiK#jb3 z_o$H9e&A1$l)`$V<~YyZsMtpE5T=IaNq-(cTJ5t5tFxMsYeX_y0j$sB-ZX@ODHMf8 z=7AHD)`}*N*(+goWXY5;O!g%>$X7NFhhLvV4jnK^z`9~?lezpi#nDde^|HGRB8DQs z=xl&e5x_@XD-gp3DdOS0Su7|OoB`E%&g!L@E(-YsV3%V*ps8$g82el^6(2=3h>S@h)-B=7TTof*GWdS7JaR4B_JH~Q86Obvb-)O*MlS1VxoXd?WPg3?q& zH&;lDCd_!|pFfl+VNV}H!T(~&ruUy7lM?xd~ zR;F|JF>k<@Dd42d%4|@u*PN}L`26dN@nyxLm1^VsnbvsIS;C00MkbYzZh!lOkeY}Q zhfo5L_Rb-MFE3NAM{Ivsn(0A+yrbS<F$nHfl=0ed-2ipK{tJO_!oUof(3Hb)IPF8PO z^TY`eOOfr_u}X!hN9{16)mGc>{#tFuQfQhZytTf^UyR>TIo@+TMtK{Dn)-C<=ySrL zdO4sP`)qMiCzv{a97K-{D>O>#nyhk=wc0B`pHLNnU^dS`E+W@M&4pgVgJ00OTR(~) zYhB>!mwK_iYqFid+Ns)FMLKkd>)^u{LC%!>nVM9D+-&u$U(H9Z(No3)4uXK9Q|U}` z)=i`HYdl}-&1%R+&H2q!zc~?06AIJ)Oh8QYtZ(GG$a{OzG&aLbDcz{MdqSAOofZL! zw@gX1?KP=C#qCpxh|KA!N11j8U%|Kp_p;4iH_J?Dxz8I~8YP}@XWKtMj$}+uZ!;fV zDYuKO%e5Z8YD8vE=bZOs)IjG=JbVsK3~0BmwNmVx$JNi?qP*{L5AmOH4m0S*@B0G!>H%Rz&f z`ax^K#O^wm+k%zn-CV6~1$W!JEM7!0yE*cPCyO&3-Y81h8bAY`qL*}ATAJDIOEWiw-qq&e%z4pwi1E( zz%gpFNubbw--?Y@(m?hN5m{=T)jaHC(&mAfc*7xld1CvCILCSyrEo=>Q6hC^a{Q#O zJ>NK$eqQmN6mF0u5lWGWk}(O7nw;r|BrNNECF=a##RCviBO=uLMpFu_VYvb>9LiXh zp1gXTg-El^vdJ6+i^B~+eMvh=Qaj|*1uTN|ok?;rhmzO}EGPg5t~q@B6389lN04)C zFGwMdNt>${`?@zzuL4-3cc;p<)mhHZ!<<{~L*XL|;av>*d0uo8U_vGUx*`5)5PtdP zofa}V(w7WuN+A`Wo~Ge6{)LWrL@au_fWMN);HC{&7%URRkmX~krrSHl(2H>Qrab~m z>l-Nj@i{61tpd!?4y#OO9%MOJ;ODBsl5hivk$hg}H{Y*D3s2q~Hrj#HKn-2~3SwsG zPzn)#SgNF|jWaPkZ6dQSpNsbbrG8uO4HJ+?G6ejp(M*F*4699t@ELzAFX=3*XMjX& zLX0t@{CHd=NPm%wdoBZ>E6J|thcq>Pm&DP=AQTY$%0LkXr7Xi`FFF7r>)Hb!(b=GM zC|>4wJ1BY}R3)aLRMVGdra(A`0i#afl7rK?bLc@8 zq_Fs%%Wk*hW}VrH?;4}~@4_`-js!A*T!eFO~RGwh5W#mX{K$a2l~hsUpLHDKc{s;i@hpWF6l7EpeHp|7RG zA5MAvfjTo0LsGBJF>v@L$3^G^ID30|*pL(?CLYxRX>oYyXVwLB3hH~*M$Ny2j*L(6 zpbzvzhvLt4w|}Qj*QT7I*YmF$Hz~WKgP)&M@;&;ISydzLdtAm`-3RVPyVA|o7Ry%i zaaBI&a<0t)j#K4zTMHgXVZymH2Hy_mBekXQc*Kl!meJgIziN7R%70upZnoe7lqClf zwFDz(U$zU<*uQ}6#^2)h=4`DZ7oL?rQBDUTjDb78z?LAGma0Y~M#Cg8EgHf@E*}Xe1#5rG3r#pqK z@XeYu!Aqw7VXs(=;P=6#O*hYcNJ-f$s|_PhK22@c=A3*cu6axg8%ZbGZiar*s<)sy z+Z2|Xq6}>hDmMa+>>_hY900PF`co{65asXB?zqQcWI4(shBYQ3Yo2=L@2D&nTB00k zWy1f5_vT|R0vpX68)g8y-+!__rz+)Q4x(;o{!D=YuViq4e;2k0uYY_XCGnBdh^LaY z72Wdf)n@m;r!@gT?fkd(jW%Kl)y#)fB`GyDx44CdR_RWDQIsr?JG2bJRDdUvWwt8Qnf3f-g4NO2A zdMB}PZjjk;D#vmitb2J$!shwa#j8rMfPeXws7R#!m6+5LU|}_G?CR=_Pr+m2Vv58O z>)NpQt`GD)ic=(WY)%))*!4m`+zMc)?|p{XLdd*|jYc=?n-#WrsD=;dJwnhxmJn#T z3qr+v)A)N!rM1_wO?LG{fd>`teV`ZxIWkz$rvzq9CGs3${!NpfJWmox=2fwZNIY!2 zW-vql934vP{3e6Eae>N(K9y*t7|9;(L6-#CxP6rQ2j&N@0hQEnlu{JA6#N7_UEVM+9~dIrn}#vmLQdXz;qAY*3jQsfq>Epo5Zr8#h~jQjI2YNKxji1>bYLWC+RN zhn3H)R5LNQzVFS0>oK432A@~vq}L7io>RR-py@!JVu=5(lIMG)bXN-oPRXA~gDg(s zJ}u4neDc|)9KVf9UKY0^LG!q~u2oI8H|$pE&%P=&+zb1;43RMS@RJxz2@e3gvGhDi zmQyV;SVdXVj#VqVOG;J&QBHwH12EIuBSpvV)M(grpD?S0;(pEYZmg!A5zAyY!xi_{DvNCa zu5uvp{uSG@fv|MV3iTYv|1{s>D)9OO@Ss@Z^T+@7=_*yP$uh?gJeAzJhAH>)%qqT~ zuXNj`t<~2?gcX0hz@E?Pw(m#>@EC}1npSN8;lbhvBv|jufTeO{U!xNT56UEB_{_QZ zLcIMNV0_H%B$N}`dq%$Bn<^#2D55}91RX-5uTcL@z+x}we*lKm?Do^3-EULfwNw`ce83Kv~o7^=+DBTAuizkdHS~+z(49fdhv3KLU9FZk^Kb37T^WZt^%a%B#ML zmV$Dj)En3S)7EV>930B^1xia0;wjH0{Yx)1l@$z5#p%IG?tC@LrC ze-O_QoLj#`j-ItSjtbZ_I^>*W*)K}p4VhePhPyW`ZR>Rzyb%11``@jN|0I45@;ffz zQL-;GXm{H;=z3N<@mKB**GS#j#C<#|XAjy}5-pAd8Sz98y@;tdu6c?THNu8$10{C^ z+>buj6b{?moy6ga9BzCX`lq|YzkCt@qFVx29r_H1KHz|u zk5rw0!wPX$WLuse=}%w0e&<(KQNT|F%Pb(ct2^si=IE3ZP32HCpidY(HrV?*KQxv5#AUv8x$?5q>+zhulS(53}zWv@2$Em5nxzkhbVz=Zs zUh?~lj81_{!hRs`IV~cFi1XDxa&r3}!J-$VeWpCX1K<3_S0(osf2*Sc=*6abPj1Vf zHrLS*(C}lz2#KnXn4uensJY7g8;9-h zxBS=31_3be9%Z??z*l(#=|RZtd9rl)pL=`z?eYFSi!R?y`MaG~pq+V!rzd|;h5!BK zHt6xAcvwxlRkVi`kCWStLt|X^ujdo~u@x+&w@tKvr3#nXfPb7O#wo@Ae}~|4*q16E zpY3*I8bKmNU!=$HA$g;DuK4&X{p|{1pnxSgD~q>({pjU(brDeKgD*xd^8en^KM@Fu zcDwP|-wbSj=f~&7TR{XQO8GTb_3zL5ssY!+(l5yVez$ku!+=4COcO>P)`0j(jHm5-cY&xpxL@0B~`0zg9A@rkJ9*umu=1#(YEpf}*3=n1= zVm?1d?v+-#_NB%Xy^FG&M;?=VZd*at5*YBdy_}%&{nRtV*K+jhp(6I#J<;7quKyS` zF3a)F1-IyQn@(1mx2v7ifM4&6h4@PX{dM!jMl;1&}+;&T2A=s338lzDBxCiNfO@s!tmNhG(@*AM zznx*UScP^V>1E*(w{vAM3G@;u73+Dk-x?tP>OIQ7fwU&$Uk}RRGup%BDJ#TaWK7&d zIAp9-RdR$QJ@|qyacMQhi3D9=gt>Q=e?Qr6%80!Yn__DN_{wry=L)wMRnotpm#q+$!1pb0s2JFW9OBdSZ1|rl0L*zw#H;He{;5}mF`e;qM5%N8b!=)bFj>eBE|JP7kqooSh zrgVj%TV1DLw3c zpu4mL0*M>s=zdM2pC||))odM<42Rc4+MXA4Y=nS@6^rAQf3JnQE8+p&wXhC?cI}Sn z2_f)}>NRmTfB%Xf%9%=txkUSht4}ufZ&JMk9c=*ix9)^&9qzx$Kd+}Xy{MKD<*qQVDpJK%d-UwVN<-vP`ZSUScFY(Nra2z2d z!XZm8Edp?!YUWALRR-A#axlggE(f8bY?q*;K3Uk4xiZ|p4d6Gg z3wrEfOdXtT3P+5*kT<&o53AxxW59cAsK)3oYwZ7b|H4{3KC1GsC8%=^2y4r{dJk+R zAhZVl$0pL>e0&%NM5l0f6;&9wj1NXK*K_pB7ZmQy1!IH=Foj-2(nk2mCAHyi|&5bKbPjMv_hs z;y^H(U*RN5id3ScK6l0WU;3Ed5iMQ4wqMVMgUjey5GD8~Qxe^r=dg~QUNVO?>8)_o zC@j-X36{S*o)M*;CWNZdCzX z)GhYcn8^z#ZnH!l8ivE&>_$2?m<>jW|rfs4$FtTW`MVblP^1ZHd z)v-<~Bhc+OIe_7Fz;rOD7R5xfbnE7ed#PGba~yZ$Z*!q?AO7ctTEcl^&q!7B-p%B@(LCL;m8Cxh7m9kX!Fv=3cD8@Ep zOe)E~8;lvrZZNhnnK3ipx32s1xw}61eO=f6`RDg|{2q_bKl7k?JMY))obx)b=Q-zj zB-s&B_1Y)jQuE7uA4Jv8L%BG;Pc{2cd7g{T_Td7{KK%7j1!n%H za|PAk<_^A<1A)Y|;vh_XvAu+uoB&aBF*PaO+A}G-oB% zNdO;cFnjSB1^)~Q`33_q()mKTez)Y5=gdcso-)p)qFo?d`aeD$^l!y!khS_MS5&8B zi|2zcPxvS`3pmGE;P1@QE(N4-{q!{bI^R0+C0|)--EgZtq=@3QAW{z??N%^MEEACS z!FlYjGXAQ~bp9V6K05AFBgca?Zgm7mR?YOF!EMFTEbjF>ygFiG_c#HI(~5F8T&A5b zYSYc?uW~wf&iTtGHIw;1S3o`J_VNAEqH3_TQgD`8>&k*Zx6@CJATXx7TWzq@|=4yECareAtzF1cEYM&nVJ?xX5P z{q!=IZCsMC@)v!%H&k?GiqcQ{`l+Zx9vEWQ;E}6+WIiuorDk4)1k8UFvmNXaqbBca zpkyc5+UH7U9u|W5FD!%)JC!NIAodlacZ$@H~`ZYO~stIP#mq?;C6V zK@+=EskTBt^rcJknjs5I;=t&%Ew3E&i!-KM$9ATK)k5A4;GlK9;(so}NwW_R6?RN0 zCEKmE4!K?bD3&6~Om}$@JH8C6_wskrMN#rksjc9VHaH$exbCvR@5*fmVq$D`JR?Ab zFq-7#l9kly=$^fMXK_!JcnwvVxS4_0?UQGZ9q~KE&MkP$gGWT;!r0ADy?<*KyDBH< z%-nbJXy5FNk8AnwXM)*1&&fxg8wU}5^2)QZ#XnkUP=o9h=lI({*XO$=@51Oz{)(t< z(m~+8r|f1j`}KA9#0c(t>e2g7Ot(3l#ZKT?UH-XZ|M(Dl{#(IQ!}G?we)37W&h@?5 zRy)txV-7{_I zz)I^ha~4{JzjkpO75rW6SkLI_y!%!@dXSmp!2HO2*G>?}TW z4ICVQwN(G|gxBIJTTIP5Vq!+I487T|9NAIzYQV7B4ZE_HZuMwN@aIO>*D2DHx; zOY+@j+O5pdPQs-QCAGKQ)1@F4B}8|{V{dU>RCWw4U_OL#KH?~5>tjvPfYQm#{2T2V z14|x+-dU5P>z^XGy*@e^XqOnJ@Ay}upYTfp7JYZE(1i9xeJE#j=;OKfkDcT{>pdlZsVoX)`f%%txRR;9zcvUZLAkrz3r;lJ_lBb6^_hhR{I`VjT3= zl0p7gh(kaMw6gJRh9-wL6+0R{ophY%E6+wu6_YH(oVsjbvR}3E{kXy{2seo`*RYl- zgLJ|R(FzoO`VCK;9GN-2k&NmL{6NKRK@aUK!NRG+qUHhmP1s(0h0l4?}&sRaK< z+{%}JXAdKwMs}&5?fV#<=-xUJITf+c-w=I+=xvM*h_sEeYr0wFcxSR9XaZFC1%6G6 z3$^;4aQ<5@vM9I}yxzT9@V@-Jbg+4H^$gTY!PhfnWl6Sip-;biIqcz`3v>%0dNoRy z&gS#$dznZ6vKls%O-J^8`natSv~zzicUQD3z~SXNp)yo+bZKr`W50fSJ@4u`_ zQgfo)HhlzhjFQI{rkAu((-1*+!-t$Rm!;==oW)EvG%dAq>yeb_)?U=ceMIv^Nsz*#?WsQJ=n~j$#ucAutXxw-X_rX2^pze=*{~{RqU4P8r zto;&V;eHJ4G-*2tvVodLqA0a9te?{uY?G|Z@vnEKXETS zUTMX$A;dfG#(dX=N7LRKW-rYxbWBP#Il7f_Qz>Ku-Z3Q8n(r`0D*R z|0eSK=W%q1;~t!2Z;X0W(lKmB9k+Gp%E&eRQ7uIbUm@-~Sc%X{kAYQ`E4xqo^cRy3 zG{9_*9j@Og%b8vdn-ExTB4P524a%iTT6Yf#^Sa3cRpROn*EA+=BSdxehS?&X&~Ynww-r;&rE+}Pa=XEhTn)?|6w6J;#O?D zqa&zPJ|}Ie)BDB{nu=!N#cG7$@YbE_H{`4N3XzBZ=gS)E$jM^3I!^rMs{#jkAFpA~ z-EZ=(B)BfRzvyaP#*5Z3IUAIgNpuAeG?Ce;3c2@?+r!BNoDB)~~pOR0HM0lsBrMb0+#wzN({?t`0>BarH zX?-lGsy{?Ma{PU6A(jJFNTE|lw<)3(?c|o1m2T7X@7J*bMz=O*yMlUk*{>#k$}vI* z_dK=rGsn=p$M$9IY+FXr={vzSik@aYwug$#p{iKnk8`>VQ<0u|u`gh6g8O+3VhI35yi<%DmhuC7AYaN}U zXnvyzznmRnLxx|@;&}ayXmxxgF{_FZLmj(KGmTk6;oIF$<^|VAY#fgGWC^F;X}77m z*^)o|W4|)avo2*ID)&S{ayZ~<*TBfqB6Rnbgr|2)r}8p#bRht>)_5%9^W^%XP(a7i ztck}6(SCU9u^Zi?$rgyqib2%Mq1z;UDP}WZHl{J50lygu3kwuhC3Frn`XOd$mDs11 zF-c!y&tC^RDS4_ZjQcqAKuHTO$nE{8SS8JJl$7&(^N-PaB&V%$uFAHt8p6`)$Xsw0 zj-9b};#tW}z+Cf>qS!>DckH6VQ?*K*V-+k;Uwd^kLlx~TIvOw$9TYh40q};j%r*qS z+f*dK8ILD+g*|v*oCp@CIEQ5c;oui7YVjS_t~&zThA|F}miskaVi(-BrqnhyiBBOO zMY;1-Q{7_;cq9q`&ZYTcpT{MWU=*-<52g?!SF4+FYx=GY8E!Z}S^7 z>+x?qd)voCV_ApG?F4N7=$%hLa@7%k_bY`LnqiD%W;gq>Oi{m6qu(F^akj^n}OTbo0cQyaq^!rRfKqW4}zzTyXKf-shH z`=sm}6+>$7a)gExGDSP~oXL-@CF9Y{+3cbsa+3|m2y@Dls6NriWt{SS(_N1K>DsG< z+p?(h8fM5Cu1XVz)?)oax2g;C1J$t$wDQCyHSa@S;UrQW3Tz@b;LyoZ(YRoNrksA~ z{OmM73O7sR(VUbRvkPite6!|K;JN!5hmw^5$ol4m5xr!~-v zp+$3VKFQ?FMF`mejPm4*e8d zP6ZTgEEMsoS8{b}qjK7o(NQ|k7+M^osTpXPxL-B>Hs(3U5}Prk&q1p$b!lly=Z(9c zUsOr%?U=z9EL^);CaguNnXHe~4ig!V`QfY%UJ&`QR>G<}rhM-x@xo5)5roT>UQ$&D zcOxwiVmG&i{CLfV987UqsVTw^NBJtU^9^#_@ z@I?4=zNb8yADlmvNY%w;3r6pB@0;cIJ^o0n_NbN(tbuM_DQ&^6=o#Z5kS9vX2GwD* z1g2{}leWDJTg%Avw(Mb=)|I1*OA_1Lo$w3mN06eCm7FS@s8xxcxiri~`};>R!vsZ7 zuZ%vQ6X}zr8{&=17zU{hG}FW`N-lor#HZj9o#9j6rj{h_P|LzL9%%!yC&k|&2Tbe{ zVi$?ojAi2M?0ld6e%$DzU48r}KtD^$R?)Rr>1c8a`?P$6e1%rFWTPFJ*nkJA@Vb{f90+Ca{cyuC(4APp~OqsGuS%fJN_Jh;XqW#Qm-}K z9{*0opgku5?U8{Zci*dRhs1t5U4Qnpk9&I zQ^h8=ue(&7lj``%;}o=v<4GVU?rs`-Vrq{g6#9ewPBobqo%d6M94H=3%G1N48>&lK ztR#b%FGUVTpV$7;;am*8CJaA6G#VW_x>XZo>J%^U+G>POguRD)TAiq<9qF{xR}jd5 z$_Rg5F;b#Hx}e2aita0W=zn2qDbektN4^nuSlX>KDxkhix01ecL4c-V0k9-_&h-Gd zPF2Ll3a4SHv0M4W#PpFeLw<>uDnlZ%X<5#u@6slAuh+}!`6sxHPe}_$k~Qp-2xFs& z=2Fb-S0Ufun^%nC&toiw`xmXz znHz;eaQ#MAOSRf$rz`!+H|cy8QIn0}4Z>JwhYwI0eHqFTFSK4o+p*>yT-I8RHEqAo zqwN+};F~4o&{qyErHsseJzP6xRUgfz(q+XfWp`c=yfS`@njIYcajo@{b%kSq)*D%r z+PEd$(ZvR}Ud46mtFQ{I(iCEBI5>PbOLOLjt9p)iw$-g?rQofaQo&LyigLiH1SKn1 z)AgoVs4Sn;a|eGkFhRuu9fR^6MRZw@4E98q_7_cK1GK6!@z!}uLvt4$x~`Fli;}Wc zL)w^1s?q6adQs!fn8Q|Z`Ox<-Ng{`9kO7QtBrJn8GMCj8TQ30#j>$YDoUAzn+iH%g zi~_xtwL=&ut%N-HrFc}oWz1x}l9hH4@h0mfQ%C2V)0Wl2hDR+bg4;jK7kgWq1Ps{Q zkus-DtBExZ;F|p^ieC6@)|uXU8QIik%~|?<{6;t0{7X`f*op$Q*8cr!$u^g-z^tkE z+Fb|5R;V>ME&St22U_qqVe;6vM_x>sjqcimDK(=siL_IBQI*PqJ*op&WBrm=P6Gwi zaB?(iWvo{9qm}~v`O-+TmVBCEm~$nf!jPYZlsy>Ln}v$XjAFc>&6e;ZrbSNlEksrh z&Ba6CmicAzmcu=9m(#P$V$&q770KU&{aTu@@=Jad?Xbz_tQW<4*CLv%eRqQTM<4`~ zeD%o6LC$BC&VCOssC7ajM|Vfmn=kfJ%ic~dVNZFP0*B?8Q2T_|m(tE15z$ySFC|A|{J4Ca1>pXTGV`OmhbN zEe77fT+^M<{-}5k@LW0U_;Y%UiukcH>yafHfZMEUB4SfL-P&n*a!ISCZHi}t5AO5R zgL#Tm9Oq-k8fHbi%jvyL-`^`!n7yv+nn@-!Jh^cCw;Mqm5kkf)p?FHMq-ubhjjkDX_{qhIo-9IF zusC^~@fKtQop@jk2~K+fXU?)N;}C{lg+Qx{IwerG<)86c&4=l z@+Ubu&~5lWO1@mY=P&x&&v~vz?Xv~&TGseb;-|dI;9<_YnvuC4lKNTS0(77rmxUZz zbwSS1%!k(EW>k=9#-ioiM@-p zHIYTuPQmx7x8F8C>}QWK!t? zn(Y-=i)e+h!4TOTXC77@^h6YMdxn~W$b)!V+}JfsR$V{pBjr{$W1ZI8$~lQ~nz-i_ zqiMUt@^Wyi)>2nku++gGlnOq$nBOgQVsq>~u5WInuJ@{cs>EJzAwB0v@m9(kJmahS zR__L#&OX%`VQ-~0{*5u78Gq$R_I`#mRn11Z8$5N_1_EYy;!A(OoTeh!5|G zj{yfM9=mbz1n_nd7Z3w&^0WpYEqI)ZM*h)?OA9co*oQ`%xA(P3qHb6~?3EA?Y|%o9G%VEKGG)VK;UA*Wl4vPo`Mb z=9}1-cT^@&Y^M@`(7Lb2Oo!K2f(vLu^cIle3qVcb-z|HS!?|;6-V>;LF=JMRTr`cf zO|Bc5p~o^BB^@%3^NSD==3*R)u>-<*M8wg)yAzi)oJ4#5cQ$|MF+$KG z)ck8ZCw!~Boyg*jkk1u^8=En;e%wx;@4C4kbM6(1?LP`@J61WyS}u~&q%Ro404EGk z#x5(qg@7y;BN54|Y!9O zVF}~(6q6bU;&Oe?OAB*7H6^%Ik1CoA*b{Pra0(3%QiHkaR$q?=VkAMuftl07e+)>tp^}EY)K(aXr!OT`+<#KSgJU8 zvKGC(?iE^S`4SsYZ>K+&960cXm1PP={u0%_zbq;!X1@e8MKiltPGF0<*TQCad|{7Bpa9r)SvWN>&k0J3(kO_;s@ccR!B$ z!4-c37$mgpJtFMv`KZs~Tzu*!78YF0^o$ZPPp!v8KmSyykjM>9IMk5=A%>zAeV6lQ ziV^v-2P$(G43E!39x|f&WDd=xcLeCj0osMB7eUkYIA}8b{=GikH1P+$bB)?!M;4q8 zdanV1`W{L{-?Dc&mXXY{gAJP?>@Yk(Xgf1>AC>O&+Jk>jpZbkK`8|pEPmt-~eD(N{ zVdC9yLl_>o_SPa#Q)0$Wo`*I!dI3QxVd7HxasNc$Sm=#M-5}FYC>y*i&1a)-;&9Y} zo`H4wj{%33-OEfhjY)Sv7^i5)PCp-yWQLu}k z^5Z5J7Zq=^HUp`m%VRAMOfY_zunD#*hfG+5i8H2r%P@Ocz$}6%CLeC_WGCK zx2_G*x4+)2J+HN(!7Z{)bcU_JwYCN_6*;kKklUn?f>W`9W1@1@phY+&bSJfG%FD5;fCCEAPx5nARW?L zh?&_6`;po@63xTC_X{=aHpUW&zFCA(&}r46LEFmyx7u(5I&Zc+M-=W4S1BmCz^K~h z23+Q2jr|qv^LbtNRtjTs^WE%?8{aFLg*s550{|66=GSRa9(-6F@;Tu@tm&Yr2xaJe z4!Lsdww?RGQI`LK`ahHg%s1T@xl(y|0qq~Ac8-^~Iv9YFC0IviZkyM-mAO7%&>ybV zT(8I|)T7o$j3sf%KjPRP4b6*QJiairaZ8=vP6)Wd$YHy(U|uwx+!B0JTwL52$%tBU zlV?&o_ag0-QB1CMR@SMR6{<+8L4NqPt1r(U$C+y3o8m#E#>X_>UuBA-+`e^T3>iMM zb%|MGFW_p67u4y4uH?3?l6*lh>5Y26RPpzeO*PWVh^++%7t%Q9bhb;JG5u!Q(-?+$ z)_Iap<>SO|ZHE=~9GHkIZ907#a>65b)FLl@+9@D%{t?G3!;V_e@^pzP+PQlk_bDl7 zh5Fgj<9Tg`LwhC}zZcZiq{5`xu<`|mb==%AF10LuoeOKNXs!J8iDzGW(_EfcD~%yv za86$LH}wTnopbt@LETzU(gm%B4cQsEg3P;(WUWQRQhTNKxz8;3KHuprj7AQx`}iMnd{=z4%MMMntan`{qD_X-{eMd`CkF+(D!?ftISP z#vPgMndhUw_{tZUM-Xza-@F(JMgeKQuhXUmMqT&!Z;mz0R}orR9Nf^+N&DLzZig17Bo+qrjlNdJFNJF>h~D|}9sm=(+obHw4|nGu2kxB$eDIfQvx43D z28-FAEC~SMt#71!!3F^l`T7^ho)Nzsnc|sQ2jcVl-p9lyVm7ksv>Tpfde;V-FdUX| zB2b#-x6>8lb!G(d@bF=LSGXd`>saj$a;e!?P+-m$k=lPBeevnGu4Yfdw8U@TR;QNz zN4Q~e-+-_idF6(44J8@+bz0&j2|!r_vU4)9P_)riAdtE}rOkx|<%WlpyjTXq6Z>y* z+q<=grrK6Se)>?QosKo}BFWp_kg`wH1KA?=z^z2$isE&CmYRz<>UE(f5XIHJ6*Yc<(lj~^i@kwer=nXQUFF1 zS30m7#zPs{`6gjzuet$?65T%tn>ewwJuDGU9rC<62f{LHA$~t3_j;4dC)qGc?&X*i z8G(u*$9g}<$QEue0}j1q12U3a^2!(;!>`uqvsJh=2ZAYWC3(V%n&UaHjOCBElIn=# zfV|17uo9p1J(YbDd%r{xpUu5$kZ~OXArB@g8q*>Xn(PS2Le4m}Y@*}Q-UmC4B+~Yr zD4fd*bsB!LuvU~((xaeaB58xrm4qyYEXOES-iM04CHS<|9A;R5AMi2DciR>|cwJYn zZZVf0tzJT$85RSA=*Ik`nyo8ZH!l`~U%)8b;HO^?~FhaWG2cfC% z2ReBB*?7J6=3s3os#m)rCVUF8Cgd}Ryxk(Uzs$bsK;E(Rzm9`&lxJO4%=Nu|sRBMH z0csI!U-B-y<5iQ%S^VUMH5?!(EC&r)@s5|+TWzmVOAq8kEu>8bO-bt&0tFFv>m7CG zwZ3)@-xqUcDh|9UT6cDqD=vOR5~={kM1@v;oM zFn?SrT&Gu!t`bXcuoqO)Zoh^I?(NzwPQc!_(S6sIDm`=m`lRGuHD}OqbJpeq0ZnIf z)t3Axly``+yV=+7#i*=k@*H2jw23t`8SbYp5zV_gzdY^3~(c$VUgmnt~zgQdV)BOh_JwUM=VJOwaiPF*=l z>H5zE4X5HsGrS7;!rObiBIo;RpE$ue<0R8}!~g=7t$^Vq(f-%>rKqkC;ocFMufn<) zRA&=%de>KH&5_`)!0M0J6bjrI@B|HY;v4yZF~5c<4l`XSW1<)AVy?`zR&au%-$_1g zj(}O^!FEg9&X6TzX{_kYzSw0u^-*Wt)o6=*OJ^+}OO2ZWw>rCOaPFltv5}9*=2~4R z_SbpC23}k7{^L}*ak6169=k+mtWT+I(M4BWcIKpjWj3@rSED(AD~D^lhqctyC7{Gw zL)6Cn^`WfU{=PG^7B{XZL_?RQyE;S1>#s*|U~~rWv~DdsDcJx}!2k`Wv9SZpB=9}D zO{*g=Q{K~Ct#}7Lz6~U6i%B~ilUP>EJDXGITZ7&CYS|*?RW>&hYM90uw-)2RSzq&{ z6rU(Fk2Mf!3`nWaDzh?_Mb=l+lHP%Fk$pW+x2w)l%FCQ9VVN#Xz6x_j`Ohd%pN6j5 zbQ#@ZZN4Ouz|cCsGvrZ7ct44rnpf`9{+N;|OAO$N{oYC(jjC?C&Cl}Yr=5+f&u#?G zY4Rk-pa&)^RPyThnU-_*GWxE5wh!%lAUH$tQgEXt3FDtfiViKdQg&Sa#_9l@L(AsAAq;_s|=vI%N-lq zt#9NgN2k~2SwoDbT`qh z%Bow@J_CD36}h9atB4Z4S)~38cJAN5AL4bS$*TNL3`D3fX5W7hVYRE^s^G3b@X<0 zg#=;Pxjrzp?v-`_;KJ#8VL4oLx$ z1JD5)zgB+a?Bz<-nY@_hiA$YRrRKVF_@1XCs~wg5>qHWA7N4lilUX%wPKUcs5Msx- zqjuWn_K3zPHg{v5q{CiA>Re>R>17f0jY4P(07YR;2XFt-{uG(_hC5kv?NylcwxrLO zAlWsC`3+D4z?#9fx&4N2f6AJCYFHQDv(T_G;zsr`!5&cn-zkSyANyM%FXa$`is+t$ zf%ZXPQRP9g<(frvs`59y=X*jQzCEtP{cxKdC<|9cXDffwmh^1w;6N?$bkXIy=jEpw zMd2nx5XcNIz`D|juYM8Xz|5nyWBCn9WN^JasUY?P8<2>KPAtl~j&nvoM5{Yvay@_~ z)gHm(CyF~0Z%m`Gn_(M^anAHWH%}n}P$a4j#z@$)WsVyI(3fk0t010u>9kX(r}B^FJgs1083vfQCeEqI%j`&EP8f_>?^=~Y&Af~s;;C! z8KVhxVvLb)J0)0h>|S5{rksGHwXm4to*%>Zgzb%dhHjXaOG*A1GN1b-VS69Sl(CW1!#0-j`1UHCdg+&J&xu!hLE<$M! z_j?EFRJh}n*9Cb8w>E!lUf?NiDXWI{tE078P*ya(5>?L$^Ex{L+a@Y>bZsT%R zMAz6Y@^>c880C+q1b;KOru4cd~C zZX%+m(Hj3m(R1VqW=K2sLXFdu_%a-vdyNxW#`bEw<_*CqD1rf*xyiBDd&XG63`PH< z9yc5ou!-*lur{!>qTHK;;l}-u(TL^xC&hw?_t_L&hk6dZje3jATi8wB% z>TTT#GwZZ+w-k-l>2zM(1TbaR;R=RiD@D?J=V))#a~Of=^fpE~kN{F09^eo()PCLd z9^W7jx*pZx^#L2g?+YMJ_`v(|Ha;SaRHv98T5@FKZu^Zf_Y1_kGPZ>cdk$GE0Ii8} zKV~@xE3tRxo+WG#5XI=t4;4u}2qKTY^!ZA?LbF%3Q!8HfOtNUb*GW@b&EzP|cc8$C z2dOT2!bXxd;8GF$XvXPa*T>lWb?t<7+WT>2{uXlHn{gU-o5p^61^HNu>pxRJDBu*% zIri$u8V{Gb0yP2SY(zMh8TU=kG#&1shLrm8 zP0bW(Lh2cKL7&AEBeZ>e>eB2ZTDbut%=uJC*`n9OV~mugyWd{77%giNnh5#U=7VDC zY+e49xCyUa60ncxlPSqL5FvkhzjaBONVdL3^b}zik_u0aCh8p1=UMijs#V{s| zz-0_8^9ZMbO4m;kB(PQ}j?7G`)HxPnF0qkL_=$%^`VZ|1&0jx1T^9%OpGs}bTVp;V z=sQprN3qLQC8!JO3}95^(S%T8*qk%6kd#mg&kbje(=;W{fo#O_!hDul-d$s%;QaB> zl1lrC4(-nec?V}I>)r3-l0-`4XLgu$xTU;*Ywh8oXyJQP74KOCZCMwSOsd@xZU#m8AO z#$PMwxjG^W8;lS<61GKIL>JSJYv-2m|JdO_MQZ3R^Rq!V;Z2pw7udM75g+>R)$pvX z6!|xSFE5q3BbI$sKG1cEME^W%(+&1xN{U5H-no@Mn$g$lkDKe5%@IQ9$2xs#`T#Gv zc>6QpCzW@4?kM$nz+!t-ileL-?r7%sNo-Isq+|oG7O$3@m|88@nhsC$HmUA_pT_mp z0&;GA*VqWH&*LrqJ{JQrX-F0}s>JoiZXN(?V)s<9RF_$$(1s3!bnJ=uD8BveAN_l2 zVDjFY&Dg`^=l_#hnsd9LU$0EONu-hQc9o9KfX*)DcUr*m4jW%ns$?bVvObD&y;s*Q zUFsaNb1i$-zIQWG_JTqDK7`%X3<-Wk&_t%o(@nHjN^VSGuKjw)$IIrxaA2>o!qm)n z4|bY-8*=L=w1%daC-sVecET+bHJO4B+;G7rU6TY7)%#%%4(;jZ#3#D4JZPbj_bH)n zOY@Uen7pWY2ldRr?4JOj)>4|sbUiGWp3Aq>|Bs7UKVk62^k@k~Hr!o?Xj~*M&m<|Y z-9A@UI1(KNR7n>3>`^v?|*RtpcZd7M7uB` zLkTEVbAOQwpH~vQFRb3B&D>q2CUU5a)rMq?V5vZcw2Q~mZMXQId+ipatk0j;D zpjsZ>cQXLjMx(=qB!EVw!#6Kh044tqw-7@<5|U8(Q)>9@L71JM`yI_@CCSr`C+o&z zlB3Z#+jz_oAzlG_v6m{{`06)cYe8-uhM(d|Za4(#CUYqMb>vgZQJL$nAE-#niU%Yg zku;r@mK#YxK^iu&kHR)Ajkw)_V2FQe+YPOjL zty3K-6}&W5W<^?gTmmM#W6$Gg?L|NxDS2GA*Jnz@RetzY6iVQZ#+F||q?5k!qwC%( zo?bQ){f+|B-SbD`ks4$tzq9z@ts%@ni)C(&7G@a*7xfPdYg zJ!kI8{?lU8KaoOIRGt*^=`q*JgfFv^qYXYKos4Y^j%-oA!^pd1h7g`;ks;8h(5FMQ zwdw>F-<~-gC@E=8_sZ85*iv^eR$1E`Q!g=#*^-}`iLz(D}`(a!f?xlC($z*rjIq*~^x zDYZPf(Q@Zr&A?{l_BRv;nDEf98+8Z>^0FT)Z*?Py9d0(bTUbpR++u0&>cl)*kgu1Y z?{MA5X4811ooicXC%gx^T&O&WsU;$*%Btu9QRF_xe}FL>{lplZT@=pz4~!9ZpMz}# zwz&nPJCjr^Hor^EIYunsy$e2d)Nj>>cTmD?tmQ5AY{{}`i$-p7TH0%Fdwv7t@X%F7 zf6+}V8DPTf$7sLH$?Vpj9KX!mx@D(4KE<> zII)9DfQfUueh+JxV=J+39pB12XKExeV}&APden&hkYHkWjkTe|jVvAbiqKRkFqd)- zs74O9v>I3z^_TF@{#JmqLMe}HZ6leIYvLfvuR*66Kz%IAUk?;TDZ@-aE78L5g@TZL z@;e4lR0Hh3c<2G4v8UF}gUeL1L92sk^u-S>9v208A}g&#fU>{io}h{!sz7#XX>BoD z56ijSq?umktSiL1aoS$s6TM|4m>5cEjq29QlRKA?4ECuQ;;wmKp^$8;YnCr*U(+4h z1M47Y8bA-~Bj-G86fn`X*m(Q~T-|~1Nlil7#s~G~Eug?I>&<$F3?%JVO`>aEQ`8W_ zyPId@SSnetA`T+6*|iyfdh$HdIk^Tp2~@_+?^n+2d0JZliiMVF5jPu-s(FT5&C!O{ z-(2))-PE!N${2L=>*x~gyLU(9Ws1PnX`mxmyP|Lr(G6~`1l`WzjW8o=F|7T!8h34`U=mIJ_zo6CsgH-Lq(gtEZT29A8Z)ZA*#?K-kn|X>~(wf&Vpte+_SPyldkSP%oMX`CT)--B)b%67F zv5|b@^avXvz{Q zY$!8Z?%pvAw?!2P)NUsks?1)#;#I=K&12rDU?c+LIU>~O3W-KeEcJE(Z(XzdfjtqW z>19=x%`TiND_RFFuwpTRm>NTRthooD#7?s12E^R~Hw12+X|8%N9nDej=pUTfC8 zn=0j2Ut&P@Bi2I-_s*$~ScaGT!E$%32R7<*vGpS4DsAhpH!ZpuDzgjv5TS){v zsAzB0m=Eu4b1jvzXZd(CXj?T_qw53dvBFBeBjptpkB-91@?uAOZ&!RJzZorA#@2S| zD(!z{8zC2>8C^-P7LECFy)36aKhztuug*XO6u*eENdU`B;=<+Y|fC3_Ibz@nh`l74&zB_m@FbmCg%F1G!i z=IQr&BkS?7zi!t6;VN3d>#}PF-Hw+$HlAc6nMtqpd|csQ$`2xBb7tBX)V*ULV6CP} zd8Kutpw_iks-LWKWtM2SsQ)AH`Y+$6G%?dT0#BHR*57qGfi0=nJlrdnAJ0P5 z^9MR2*=L8B13g!JCt?cMY{$4kDydA(y|oefVNA>2pR#m*9bW~GyF@3S%KNpc{5y8-|5 ziIwM#bbfvyq}D)3F5A1gd!Q`w3|QMJCX@WaafB!p@eQxe31%M=WWK@+bW^feW?%Yi zNPqW#&w`m*Sf(x%0UsY+hca0&>c!D{A@Q_LQ+95iMQ49KpzmpH=vE9HbKLfIqj9yd zXJp{?I}W6i-TJ3x-3k`6t1oT`op%^ZC68y3YoL6`MZvTKsXL_HjR+aQV z#4_7%yXG4u>&s$QI`t_oza zKeFl5o+tC}x-^0~=SGhHuO7t-JjyagISF`Ffo}5-3kwI^m$3b|LjURO-LnK*k2A|W z;%OJfc$ftb4X)fH$)-1lUOz@ye-Cdv{~svfKYk>|9#9|)!ku?2|M~CiF38DC!17)^ z;>Gfxiv08E?hPIUeuZBDC}8S_&yr`MKk`t+sVRoz$gdRM3=b#78L%2 zm2w;aq~z5X{9g)L!?Jg8@$k0G-`B|hVbKg90a8AY>;L=K#y<#IdJ1rxHQnq{_y4ZR z`42m*a}kj8^n+CWU)T5VJ*J^F6LVZ?sMd(kFAn8Dc*MaIfRx9dD#rcqg!Ja%YVeu9J)-MkF z-U$h_T4S%>p8fL*MgXCqlGNM#Q6^iH2Y8KZ<(7Zaw)~kYFB}JWIQG8sh`rFux`!0H zG3&S9lU{*8a4Svbl$~8s5xn&7Yi&>WOz*S%eswpzPA(axhziCxcVy`YRM*a%9Dw;M zoGV?{Mjr?m*DnGi_yA6_gD1u2b24^v!&RX zfDbzt!|Hj~OfOFPm}d-R z{GC@dH+#CYh5go8wfPgGCNkll-V|UVv1MS`Myo=pD=97ygKD4ea;Vvum?cZu9oJ=! zyG%yh==rPQ@Sf%FnS9klyt8R(ykUTig=F>V-dKg)j2U(ZUAos*rq*QS`xStyg-rh4ic7cc|*xS zovY`Z4a`w>F{mwX6b3@x3W(eKOS#~?a(ypRS66ocI7-rtfHom_BtOjFt>@5$5BL{; zvwPpg-?=Y4*CHo_+^PUBkbdQp^Aa43*AKhvm`Og9b*ME?mv#1M+_-)r6o;mfC!F_d ztbTYzy{aSk>e#?voniN0%L1oYOV4DIu)6Wk2j6XiP4|9L~Qdm`~QZsd2Ev0b|X-4+MnQZ}$@a z^8LR9CI|fSsaikmbbgnE8=+R%yvgzC=o|A*ShM*~;K;AUcuxvHOb98D5@+11t^%J0 zAnr4WCoWP<%|L-nyJ+lA>X{y3_?^)+L8YK_JsmlAj$JyxKUKqfH-G+Z)2Vc6hg-A> zB$VA6ipT&cV~p1{-O0cF=Gho#fcM31D4VqPVQcJ7#K9w^#r2gg>ji8w~GQ!Wdl;;TF4`=JYIuuulIVxD%#T|*-d2URhGwUBY0ma$?axBEP_EU(5^^hfxlwaB2KadguukEWcv%;tSVaL<(fZ z>NP+=6e_Rb`ek2RcXzkIrG@^Ynbl7`JoXuPU3l65GAg}yQ+!w1Oo8rsA2$r_?vg`A zRXwc3{7%N`uM$5g`mk%cGi9N(Q4t)ap3HGsSy@hoz>$FSY5c8$l?6?w5bBlt5TOJJ z=|5j@8Rv#CE0c7pwaJ>M+aJ`6&b&g6DB?u!i4#0HXa=FSY5-SuB-{MW3tHO4`hTv# zOe`0Ht7QC>!jUNQo|8CigfZ6}sGR34>$H~FKIi*SiXeXzx{uRCeU^%-2jw40I zIDj+j@y%bBvj5_TXzep%nXd*+bmUZF@Zaez|9Oo3`qhHuPsj5Qaq`dpqWxmhEdLM( z_kZH-Zr1;;&L7R>|8(d7EbIRxzoVnZDFs5nZH2)=RP$tL?a1=^02vVp0YOASQihb21_h)$q(K@9=^hkCq`PB~9#XnN6a`~mN;E|;z~*XNwG&p!L?1Ki1dIQdE;49D#Z9Zr;vvSe%Q==x}@x7JPyq~fA4 zH>O=XGYK;9{Z1?Y@9|3e0GRu)iIz>tKPecV`M~Rc`zD5{|59)h2w+ZnlJo%7_R)jl zne$ENTjDTR%Hv;q{|1qX(IFCRc9&>?3RZ^Q)g8l&&6i!T}T4mti0pcdtCB>-HRQgkLce?Po z4gTlgkZD46%Gpj6PuE7zEbQqIPh;MVn;XHdHXQ%qDpFH`)9^`2OxuEd;B>gz`9!SR z`XpVj8iHHA7F}r7IZ(1|=E}kwtC>J&_}B8I_VV^Ch;b2w`uBgZlpz!-YH9#jRDH?% ze~1q1kIN6G8Gj_uqzFpwu&s+zGz{Cm)gi2;+~YZ%aX0%q98;(L>ce)U`Oxhl{FMQ{ z|6mS7D?oD{aI^DI;%=mE-RyLltMB_fESVCQ_ZvP@S=irv5~RpLdO%yFl#;xK-3ORu zpARU>T`T0w3NyPdcsyfR!GSQ~g>$g@Ne9&@uRYWPqF`Ud7Ed+eWKg-1D20rv2agNl z(K6-MuR4vVs(kvmO~@<|$93+pOmze(k&ZS>1icd0;K^~bbq-2^_+t%Fbi{l&uU3~$ zJ-xQ~0ft{7{@2W-)0Tgtc>lE~{%HJfxoeVMa~HbV8St~}A6rUk;{Sev6$&ai9^{WY zk^lew{DGS7JOWO$Izyt{oTJmSL{b+ApEehPQ_>Gcjp23Q^h7CoRyg3(u5goQnqHud zXD284rw6>njTgr^b;|ljf^!o|uA+)ai zC)<-rm6BJy%K%`sV2;9*tRbu^rky6gXK;{xgDs;hvar6t2+LDu@pT2^u3ZmV8EzJ zC!~kD8Wy>(?PC_hC0d|%;5rHBM~@zzJAa}~V2j<9)&t|=36A(J;OooDZ6l7YeAi*2 zx!k`7x!>a$Re)7?TRba4M=YBUKfm@XqdJg^iCC$5(ZG-T8yd#t40M1E z^Fn;ARK1qr~>uLz&(S4P*pGQcWuNOGSqP13!7`o&F| znBae1aVaSO`I4*~cmUfI%~5`BeT00bF@H+|&qr$oydH|{$_!mTJy(fT`djxC$0CW% z^)oxT>dh>s|C%sr6JX1BS%OrA|JcEXf4E9B zHiq_$4uxF#>(#Ek%}OcW52|vGS<`xTO|WK$e)azg`JhtwVae&!UV?3Q5X%lk*jdNS zkPcET;P6J>VNz595LPou@tjS5sh%n`q4LW5HY^F2P!oB&BhLCTTiTTfls$G#dwx`k zlqrsp3LyFTgCQ>1m*0CKz&>bzUFPw-$s^u#yMYXu@%aq26g7{!_(`k(J2PzN=(v|I zoj}}wV-9A`f8j8#6#%VW3nnKXj0EN6C)GXz>~x!Mb#r}?{lL~Vtz1?PB=<6{(G(7# zl5D=tz_>Scba_XIZv}Q6!`m?-}I0xPvD~J8lBZO0{Em0PmZWW={uv)fLqvd_W_t za!FSO95uOaJ>97O4RhxtC=1|3{5r}rJp9K^0$K*|dDl>#azkCZpbOXYi{s%4ctuYe zw9W4%{+ihVm*CgP_!P&Tp(fXAjFpUU&d>9@DnQAfShXVP*?DjLo$ zDL$%GPukhFx_h@VuRe7@?bY}*G+JT3eoefn-Opw8{_tXZMK7?-r0?Tr#W@Lpaz!y!i8BA9Ms5)!F{HNM+hVPM>S6L*D zAiSN#1ZF#&tyO8-HqxiLIGiD@{yXv!xo6rNTfGt;#b~j;7xwdwRRZ>7vVc2@4cd2a zzUgSUVG-Wwy7JZmEY(A&{fm<*LvZe0qeVXXq{%G>fxok0qnay6y4ka`u`s&h%!SiC@WbacBa``#0`d!1_q zgR3SYVfHgYxbE4vV6&p8C$GT9J>1NjSDo!IOtk%owK_#+>vD$sL_N292h#ZSxRR%i zd6l-uhdZgNKU~ciCqkRftyQ}CpOZPQdSBghmq0)H)j`r-AX;^m`t}jv!5N|TlzRnu zHc7xGp~c~(p`Me0r*3l}wpW|qaSuM1nE$L>I;8;UrmQpW>gz7NQ@@sbp1*rGt84e` z4ne3{1$=kFeW}hzFKPEk}@bD_0aAG8ZZJ@#UF8h zOZfY@dtlRXi^VV2w2SVEoWODapPEkISJY+vbd4Lt$FGcZTOzYtrbFAvYcImsXgMVO zGpPl*P^!5@8FMZ{*s%7XvpE~uYtDs1@PFtQscsgA%_}LRcqYnu2guc=-Fpt$@!nBC zPYVAPw2l8`%UcZn0o4pRmy;_wU!g!NUf~`rKc1yJvA129S$V2hfr9cSjME@KpPpTF zl=W$NexeQ|*-OyXdG_T-y4e0acEM>+4Ba+-9^hazlnJ~N5%>KpboK^hc*Zv4j>N^m zFFt4E&S$8<_D;)O*L}_W`(O9hZ&1<;rkht3jH`*MRZyIt8K z*-Z9mUP*4r_iqSQ{>uWXeEdvH}=RgDfTfBy@_;bQ~Y-n4!7nif`YSto=LU>nHF6;7Gxe3hqc}-HULe#vnZ%|6V$!|aI`}@;+ zhBGsD2GC^> zW8yon8+@F>OZSD*No=&fgITAgIx-9HxmPSSRVp#KgFN*}ls4=wzPIl4X(?d$9Z($` z8XO@vp7(D?*9?p6?sh z1>2QW#5bwtlGq*Jvd0+la40d^NmTUh>{hWC^7p%h--^HPoT#+JH30X)IL-@(Djo=l zM1D!+BM}`Pq2t2b2YCDlb>Y({WjgwkTJ%vsLrk%@@?vk-|ACQOC9z z+HPG^ottX=u2~NHOj}M1ts>)_w@TFsUOG1;S+B|VkM0z#ppqR}U>Q1R0PCcLxClCp7Tl3V=Oiw+YSHa(GHn%*AiR7d`rr#{OmRSb!iI zxfL&u*R~QZmbss!lt#YYHuvpS=q7N_i^JgKYq_ZuQ@=jhCCABA5KYEi5atBtG%{VN^Z|%tk9Sr4GunahCqmubzG_5Yb^|}~m1Gd&kM2q*pme-tD zo!&=O_H4YBP3K+c+3O78@ph3~gL_enaELXW*%&xb$WY=dUXhJ#hU=DG2q%XtoYOy^ zVu-ze3lIx0A2r1iHK>T&TIWVv&C(`UW6Fw#Dfbd%(6Odc!8urN(BI}KABZ9t-fZ;R zRNL$dYvwnbc~;F&73u4kvI?`RW;5y=Ba9%653Z<^PcvywT;|7P`Z^`YDY17YKkc_D z?=`;5xj-HB)Q6|`_wyjZ-iy8o`r-%Cill;EndcH3$SrKnYHg-RTRfea)kUsvz7VkLd;d^~DFQA01>x?&X` zne=%`6)=IE5ts(1qSHjhgvGB8mcV^XHD{I>;>XmFzPhET*9El&=g4z$cI->C=H|CR zI!;U_Dr0%{AuQyqm%}dJI;Le5g5z=84M@(YT=d9$m6w_ zWlmaE6Gbv_>`yJKNPu_kJ@}1=d*hg_QJbSS(90sS89M)+=j1q*hBmAqPh5U*w!Gwo z!22a>-;+swauH6OG?`C#*(ulKiq z#;frxw)uOXWA{4-6XO;GYIeokqaK!>Ah(y1MGZLf^FB6cBCx5kAj@a`-Tb4=BziHZ zW2O?y|0?wNrEBGWr@aj$sE~lS?5DbgzV4qJRsN(4M*3wpCx33CrpUiIiJ8-?Zyi@3 zn08Ekv-YspZpApJ@pAq0qW4duO6lo?~VQ{3p9bcn45(?cpRW7oMD2I?cay4$f9q32lMa{4$I3phx%KEv_t>dyjAJ<#Cv;pt%%~;U(BH9$H|V@4|uD#{S!UdhsWL@bvXyY?h>}L zIvQ2B?z}|$W9!+w9J9H#cg-ppHY>EJ-%S>C2Z@gBBPo7`utY5wRQ+r}I%I=B^ucXb zX`2SB(a`$J>IkMacf6e>_pH8JR1gd{C&fLSz=ke*CJ@{NNi$4?8rP)fPM5)VXE)sO zWah@xOde9n@Yd)YRn~jp$pp$@0pG2LP?hO6M(%6BEYn!I7-Hpw27p2KjFH=dTU2)7 zE!bv`cBw-+8^|H3IJSuFW(t=PE27zxzh^UOBhx+F7;?U5V^lzh%N-JXQc0OvJ5t$k z2^M9kM`?ScEr4}dF{j-O@F zA~mkNd&g_rex$dwfPa52?ls->;5hl4ZRhJ51!`HM>kGsg48`M5wk5WN>%3X_?nVv4 z;v~epcI-^a!9VvJ79qLXrHmk(;P;0WOkbyqGX5m#o7(4|Akj0TQEly1{s~Ikz#Ynz zCtiO#zpm2U7fQFJ2n2MR3@|cQKP#vu+<8`efQHV+WY6rqgSm?9NRGM9)@x z!JytTQkRVZsL|JjT(f(QtazO$yHL$D#ntfT`=l)dOO}&s!o2jALvKzftlN`rJ3U@j z40L9NOjmd|_HTNXxi#}RvOA)yu%_V1JpGZ0qjVJR1@I@CaksTwUd7^Rul&{|RY>`O zb+7+E{KaEfccRB%YA)DW-F4%UK!7K$F9r~#=F$k}DVuPsi?#iQeDu4E zMV70#-cc9?QJ77B2w*v;+t3wLfAud$?0YJ(>U8URgc;;#~Y{_SI` z00t+qOe6CjMGi^uvHc23w?w9q-A2p12CE8Q-Y>M*x!;_{wHR*P`@Q>Qbk7&&ExTKM zp@Y%q_{svJTP&+0YPxc+()Q|jzUw4X)Nif1QTrI&ASvecndxd$&}^wx<x=|Y*kRa#FUxP zG8b*BaUEf=SKk_Zyn)9Mn}>I?D(%nSt@)sKcmot%pTgfFOFFm24T<;U&RXR~D!)Ykq~AnH371xuh%hIl&@ zL$!{az_Y(ji{u08g8j0gM`EV?_i;oM0=7f6?j%k9)+@7!jsEEq20Z2{kXIi|O6v5) zq`sNcDs;}dg)1>Qhd8_xmG`qmjVuM3KV3P_=`vH@-CBQgQc!v5ce3>qWJBZiyo?73 z{KpB9q3xx%@X`%vP`khWM6;4FcmtVufSJj#8?zT~^18|sPw3li-BslE^rF4{QRgl* z<~-H`XCXR-Q%M^1T7$bQ3#CysxIYDbX??wW!-^WO6aC~IraMh3 z7H5H$TVnxR$vvU4Wy)gzQa9^?=@Z&cEoAH8=+7nSP7XMW=9in2tXHt|y$sRsTb(YF ztM@EuXTqxbSkxXDn81oJIxc6yR3@`|(!NReZQIYo&jqU`7?Lh0Epd3AghLd+_!rZe z*Wk_>d;QsYzaE*aX3ZS$+E|HT!a`+>q`ZoZoaq^2#D!+FSP;$GOt%RfACHVZk(oE6 z!PVGDXy*>ieV38&bsB3d7H^5$#8K;X;2&OER7SDjG2HlQ%(9epyPU|Ph-PXV>>QsH zDEXR{XuU#?l<3R5ib)!E(s}R2Ksh;nRpn&P=K!|6(u56X=nzlX3wB_(IBK?IUlE7N z?v8#8hzi(9Nf&%)^H~s4R1Jko3E4A?ODqEIyj=|;XOT)8BMyt^A?^DPGz@NNgm=af zPa7(p=n-H3k1Ft7u?IN^Y^TU<%3eUyMN343DWjWaRll!FztS|`@iTK^r9PQMlb)0 z0JA$!8IT@xvuHp1SuA^Ga1P;Xnq95AV$Cs>3r2;ltw(oc3Jt!@C>W8BC$c z$?f~w8~I9pn5NPP=4BoLA0hvF@5}wiaLmcJC1n&`|GW)IKI>^+?Td4_z>giY45nD4 z1WMvN;FweQ(Y^8EJt3#rRC?)R3Ns4!shU@swcUY3#*grb6Ao6^_5U>cFNrMTb-r=S zv3{ujpw@bs3*k6k&avRj*TlmKlvdBmX)0x%gXD;AM#p&bH!rY#AFHT;!>8%{kW#pt z8Qkt7>?DDZse(&oLH1AvNNR$E{|n+0@RR;)u%!Fsv?Bzf+)}TsZ!yn$$-Xx$koKY-Pi2;^di| zj%LPq@?DSXHDA|>RyC0u?2Q(;%7&B`e_D3TX95+@sn;8X5e9>^9J&TN#K+a!B#|N_ zC7opT&Bbf!b=&!WtIDk-$gR7w)7xuMy^v)-sB$9gF5~Ze9 z#*1v=*_qaTgWb7i6D;zz0Cb*8)3EHN1Gu=s-DoV-@NXn7c+f~uqIJ5o3pd-<6l1-UIBd+R}Zaw_8p9J%xA1qyG<)Q=5Mg=9Z?MmmWk!g_Ple5 zsm<5vxf}qLE|{U_YZ7% z<;h1`0r=S_pvSl+#r=Nz@v3OBxu3@`#tUYD%01h> zfCqTERq4R>=?y!aOqeQ?DAs?NOxdkwgYXw05L-s!2XOl2gqFzlrVvsS^d1TM)%W-H zLHmYdfSpCf7VYbV%AuaTASg#MUtAwFCb4EdhnI3A=vt z!*(-`bi(>=Qz{ZvHW@}18#QsEb(z?iZ{JtK=OB2UvFKuej`#!s{opC5k=7f}li)hs z$I3`hFzyafG67xq!>KP)J~1Am$2uL_VbFoosmJ8`YP;!iN08uQ`zLD2J@kh$(g&NC zmifcGIHsQMaBuJe!z_|5Hfz@y&AWloR+Pe_Y68wi*{TnI$?cwE6tAiY?e`vWOQU%!?D)}ly#@|c7ou1Rm zjNr3;D(#jdo#4@{P7D84X^Cik0Nf&=jxsD*3%WetP@oijzaPyvU1iy$Ae(bMB&N>Y zhSJj3D+-^K3GmjMIRF5a;P?gXMseJdVkh?0PZ{9H-!0cS74DfA*zMsq%gcE~5l{_oy*)*?| z5A2tByBB2^a2S%NXBeWM5!~+OPnXOnL#W`~Zb5bb5rTP?R9XfjmBZZ;RAT%iJ2sN{bo649fQrM0am?xC*zXpVFS;v< z+02uZS`px@6rO?g3ToxZ6HVl6_m|dIKttR&h6H`FJ2f$BhCZ)ty{MCrC!xf0N#RPQ zoI7a-1cxXn>yxhWphGQ93Gz_6v#_4uE>Qmi5$)TZG84$@Q=Q}1Z@73w`po}dowm=SC8i@)pir7A*=e#2yUhGq*@WJyt`M%>}9Y00<4 z7&hBD{(O;kzHa7Pnr$_)}37n zr^xX5<@j>^cCJCAOxDY~pC9XT?>s_P@9%n-8hiY$=h14V9wWo!Y0YnGJ=#hv1}i7c z3-XyisQWcD(ivqIgp~jTzBDlk+j>2(k1p`&D-WpHcgi9mTOv&r=-oZerirxh#twd# zDpi@i*)H=I$rQ!Ow;m~`v^JK8v%@E`7WC@HD@dy z;EnIH`C9-PlqAMS%ejrouy<$VlKGKH?vj9cy|c-J#L~@27b76=WTfz}REE~BnUu`? ztt-=5z~ACe2~+>g+w_Uot*GNR{AAjcUDz~8RVUkdAXUUjZQsK}2O=)R3y^sKU)}kS z#9IY@wCd`xg0J_kMf?Nf3VXsM7&b4pSg5r|>oE5-Wm9^~%dLQ4i$;Tm)1^8-e7*Ed zgL&sIZCQd9&+xaDYdUlzb~1ab$@kb)Qq6OZke7gLJ!|LmwNb;#n$Lqyy9HZXGI%OpNmX*^VyBKihNKf%^`dD#MdK7;hXg#rO$icwo0GI65D%6A5S1bT&XK=6wf_yELC$(nvwN0+ z&cIRwKB^ zmP$4YX`F}s^K(_&XiDruW(o7=!-rbszv|f^_w&y8>|uMjxEd>^;`j^~5Q`Se^mm4m zi=fQK<14J9Cg15Q$B(x7i&UGK@A|Dtw>d`zr*58LpA4gZo~oJO{fN5jBNelITpe{< zI)^c>ymAabnXy1`z{hX~DKJ|BbRBkbKV?Ibb$S{xY<+6@6BS@Sml(woY%cVy$dy>^ z#-lqj8ayipeyY|8;qAPN%_HSzIKmqfByuvE+nr0+)`|o!@WiF<4}`%_)t=8^bZM`x zbk7xj`U+0%`kmvy7kh6=O3dvubcx($cG-1UJ+{%I22CZs^oc@u2Tx?jlvaNt<3ujrU(n~u^qZjtuhyahJyO4oa# zcdRYKs%K)++i*>2bfWGAn>!ePI;(zGmu$6OEQ{Z{2*C~#VOsKPW*&O%FCai3&AU;n zMYlevwUqWCC+fXsjkrqrzGdy{G2J(8QhqeI`Be0Njy(R6GR@8RK!Y7eUvF+aTiJ^UT~mT$oo0=@I!shsDe$UXf-R3xAqUGc46r(5 zQ|K98x46E4%@W4V>VQV`a}(jk3lyt${=-T8b29f7l3o5Vf=V*;<1}=&oPeng**hnr zPo|8ZJId5DysqshTa)~wSOHNe@x`X?NBKMTie_x;Qn=biDFPjEB-$6a5%wLj8uvQA z*;3-3T@%m>rVon*)=xg`acMs&Hx>dI85>2NP3G?niwih-AkK|4K1~s!{(zS>gek zeb&hQA@;%S{f8{e?a+6E2Ah=E|>U)~*9eZFT4GIFsPeo$}hYQ*>- zHSq?obK9l$m3&lKcCbCPt-tT5?|4BzIf7>t^@rSYt;;beX!m$o+uhR_SeE?JfS*bZ`4HcA`sTV=M+eARgd}#zn8#}>MS*LPg#c) z6(Q@rH&fLAiUif5d(OR2fAk&If$l60)Hn6|hHAroQ7|pRZL@)fg1p0ZB+haa5MJHt zq&walgKje{SAj^oepWEZ2J^ol?0evk2iLPvZqkuXj;Qw*32M6ba^x9Q?_g{5Z@;No z0!IjI-gLjpa)Az$;eA3DE;E9*sJLcSo*qe4$2Hrg7UQ@bscVWK$*P*3 ziU1f2Va?39Ns~O%y3&y;I`bnp^L!NdA7wEb7HLoAkIrTLEZ<#x72N8zNWSiB(+;$j zaj?~Vx6(lRfhngC4Ah+Vh16=%m5}U`#&X6+`Kig_$COv^CQDerq}LJ$*5>kd9(vCS z&2@Lp#ePc`9PRY5R1{rtP=BM;^xG$S!MVxP!`>M>&!D27C4JMqzkozjK2tEv=6AW@ zjvWfvo2WE1L%FNVEz0ISnsH}t;RMTk|88sZ9KmX%<>TL_q7G2CZEb+IRmg@e0Y|?O zYt3|*+GtiFD_xTTjuVz7aQ0op*A?9@)rX<<1(?4*sn4jrpv1f;E3%Pd4dY0))P1;+ z5g=iZ-x8b`Lc|X`BC4Cj`C0uiDZF=sk*5i5LqJBqOMb;hWdtPcCs1d)@ z3Sh(SofS!CMzq4(YHx>#nnai>c{fXE(G6yKG;66=4Q+5gUiEVYV#X?w#FGsS;x?%6 zQu({p)5SIDi!YN^qF;2b{rtz1`x-@|fjd=Bnq9A>Y3*}IW||Rk_yqT9tfCvRt;&?{ zIwPYVzwQgmer|gM@N${sc4p}UvpG@bc6<-chPjqmH0CJ|GfYKBE$fUKfxmD#-bwz1 z*M3nF)8h<&`^TQPjjyobiJsS3z>`+j*M>*Q5~z_^OmDNNO3j$Da;ddFNU9tpVKAm$ z#PJXB3?MXCt@Cq1N<84e_uQ=-N*O*s2ZKyKCw1MX3~bXtwy#3vhdD`6I3NlH{w`|= z)tf>^x!NwNe_%~3<1Pe(p^)srgHD3=M~&ZMkP}>+Gotwjko;vJTeOk)anFAOt-CC= zTX41tck@%dI&}XetyQ;Fk9GDNS=ajsfNJzK(ta{^t;K-+4RP{Kf!A2+%wLP=rVi#a|VBN>hM^WGnSceqXPG z4FYcnYehfKV6$Q_3mSI(xquk$9(?(|_&Ys)NC6_vnIPD_FwCa0{rlZu%)8fFHfI?p zbC4N39`A;+0_)R(J}p3elR@cyp2P3?&dioj-}^|Ov~{CBbhVw}OG|`88OTmEWZ4n# z=^5TXPkW&E+gQD7f2uzEh@-MkE=BIO$tKW$G{L;lw|W9FGkhX@XI`4;Yz@v&EuoR? zS;N6gY!OlkHf&yB-|E1_;+x(tWT?r;wdEe|eo^!Gw8~4a_Cg2?^>Z#}i^@3AoASq} zC|zxJ%CQ5hs6pp_nn4)!XTu$cx^XiA z5xpO*GyL=rFDX>1Ulf1OObvAcsBgp7^vgy;VgUd89%ftvd|r?!T9R^6haoaahfill zBOzQAP{8nQR{@Zp8wCvY)A&RwE9A+?yjarbov>#sF_!WJHDrV*`xw;>p*~<$He-{W zFp)!rlyf)Wb&eVLmWb_OI!ho16;_g`RiKm`M=gk4)TC+adt%aOau&%y#QPv*eK1o* z`&vSS-YY)&c$x`AmIW z_0f8(F}>$ZwLJ&2QkEv1qxePBre$rA`RL($B^y|kZVA?_zVb+!U zW^`kI;|LCtCG{BZyJ$B0?SYPIxVn%fbunWZYtD_Q|9Jt4t5_`x>X`-BJp@{4;MOHh zswtY!EJmJzRzWvA(0(1mpJ|&i8wVp##Mg#mjAVkv5YUjlX2khjJ-I4c#@OBcFuthu zmiv$8f_!W*oh~fKJFYH|W9)uFaBmH+kf?^HOrY6*!w3TRACj9UDOb*)%7tV&HC6k= zN1oo!pA5TFmDpIQ+y*}+rasGw^uJuYWtQrX-^uRM%Cg}V6|LkWn`Ov%Qb#q&@Tq0* zdgS4xE}`$`*8TzpvD4i!6RauomUTL2iRF6yd5K(B42M@;B!53eh^_8>ikA7zO0&@_ z%+@Rt9>YQ@iBus+Z2uO^g*$Xeh$Vx9ou5TTizy~^#bhg$yxUN7yZRx9=w{r0MGtwo z*SOu@TVIiga3?Xi_*+&iQv{^&ZSX%SeEZnCUyez%SsO7cXpMP1N=ChV3BYWw$NzUk zauc*ld=ncG%|NXJeG0nsOK{p@@C$%T{B>Bz^KYMw7pbQJ6pbOU$S-{uQQ?h27AeQj zNvNFr#HT|<4u3y(k-a3Iv=1+rB~>P!Q1XN?@>#=EF@l)Cfb?X*kMXK$P6%@0qbb9- zsgnwnz)$jyWBFtQrapf|ZmEvd106s+tJH$vqThBo&>?fZu<9k{zwhx8o=KF&r&Sa` zk*I)@*5-}6QcC8upS83ekp=2cvx-?ud5X2bN5{Jg02v|patn~V*t9=$nyxTWX%bA= zS+6I>At+3|fk`cVXy@mY~lVaB4TY!&tO^!R7LVG0< zpQkmF%tNEDpL5y^63@>OH-gO@F?rJOfG3-ZC*!nwj;KiPt5oG0F&%tyj5-}V`;(XT z)jm{l?KVm58iyV{S3S8mls=G=+%%iB1J~Y-eo@I#+|ejiZ(w9_Du?>qQ26|ytszq;8Nnn6*szLuI+5<8$a}LPM;0P5PgL!XxO?t;ey48j(tfOdBi-s4 zqm#+$vD$9-YF~F$iqc>@EeDT;6x^hM`QNeO3g8Kv5c)-mOgHxxHor+i%8B~IV zOs+Q3yYr_cQL!y|#LY>fIC+|iBj$aLT$u753gNxK=;+wJ#jG1d$)x6yao=vQ4e+bE z+A4x^rIZu}4Afn?I=3}_x7FvPn$OW-{i#-GWzkU@!T8?OxqSu}r5*D#7C)&wlP)p~ zDVoBd$D|*wM;8vau4z`@RA+#Sy&eFj-CCJ-ullFyhM{-FLKV^$9j#Y!58(J$90+_doj^ z8uh_kZ5^YIj~}H_JQ^)9mP71gpD*J*ComQ(PeCL~$qH)DquFY%@6YhSSVt`tDds)e znuuP|0oub~CQM`wT6<fZy1zk8vXH@mqFkGlOr%gU2bfLnw63UH*Lk z)(Xfq#{ieM4#wPZiWutWKNUW!rVGRY2FaM@h!oiHlk34Ht!o$Ay1QYJ%95JCsc%7A z{aO0E3bHKtA68uJFOnZUq6;qOlBQWzTYY-% zP{(z)yMC1tx=q6-G4!R5Cf>Ol>_AXd2DLh&Pg63glIz~)a0`YULV$3%qjKYF&Cse% zr-+*P#uMF_H*P6D7(qi+!NFA1tCttyo>4HR0GX*LrRA%k|M&6#!Ry@bSbR2Ul+C)` zZeW%(2(!r?M+!U=^^u4;E!`9bNW47R#+D}RUHa*xRaVs? z%VrwE>V*0ah)l%qMhRZ$3H=X|`0tnEtDe1(` z4)Qq z$rDuN^>)Z)`Ug^z&pyuLWmDnZTP zv8XBV;;<(#mt=?0C+d$1216(~#n_`}zgM{8? z%f(T@DoWnF=@N&H2sHc3LgwI0$?Z{MrV7s56o@-4JQu{*zECd;pas?x$&_ltt=6O^ zShc6yfj%(J|4p8TeUS4)t3j!-Vu)5$@MrV^2Oj}K08p(6-zud$26h5$CB}?( zEN{(%45h0Fi4z!#wUe{G7kmrV>3wpRNa&n0J{bZyPOkoJ@-b>#8_J^d`x4OC6d2Ul z04o@Uw@6Qp7vvGTX$X#8Fym__Xi)t)Do!RPiE(}*MBeTQV_k(;wM5^rF1xz>R;5H?_me~{~)H3s5}Y%!eoo3OxQcu z>AawbEs|*gB#CZ(*w_6EHlyvm)2*79U^4QWNxh-l9|IVcAW~?5R>cq*QqRJ%Xq{-+ z28pRdm>XgB-W#X;%I%Vm-*iq$8htKsnsEfMx{!U*dv1X86apwuIhIc6l+#%6jn&3OY@y0EYS3myM>RRjJ5f+~AOs4myaHTn_mY5M*SKm)7<1h-&QM-@*V;PeMc;Oa4 z_yAFKJ029qnns5Q(IC{B9@wV?MloRl4Q^{nOvPF6f8LFgAxo+P*01+z zXsSa`)MMK{b^qwRXi>PV$b{2cQ7~*lUxu`jnWge8)0ZE{lod`VJv4c(Dq{_ zbH<&3pxV6_7tgTTT&tV}Cq#mBbIhRN-R%vJG(PJATTS#HB9C#TBREDQ`82 z6CJZcz;9G|4JBc`h@CDs+A!iaEtGU=#cY+@C|Te*(O9ydm)L!mZ1#C4&C!=Zq@+B} z7OlsuHGqKPks*Hnddb1cWd_UCB01z|vVNBvxnjPW_j&Fc?+DA&3&1GKV}Yi8w$LM= zkEh{Hz;4se??nB9WjnPoDCnt7+06hKDZfW8ScV0O45w3zznOj8Uj1H%m2fYNux)Ar z?(tmxbE_VN-2hpXk?K(*L@kMs#Bb39*($+t_M_oPAw?4`L)QX=x-h8(%ZJUQ)E zK+d_uy0-@{Cy!@cca1!f*v~tAAeRM-+NA`TS0Ol7)isyhtNj4p_=#Lhv_rJ*vY8{x zp1nPVEjyC9L+r9CZmiXQ1ypbKxvW>lRnJY6bfW(pI4j3gGUV@Kky(m$nKl?o{CRt? zoyEa#`|5PPkfC^Y7zONMNuGASX+lmxnzu6UoOY--n|$Xo_NYc%7Gk+J(IjR!tbn=* zP?nq5-6~$EdGj3^Ucm|&ggtR~CRhs21@|qQLjd{88dzQ^B)e8L#hqRlPSm~AXG%m$ zcCdfieJ;up=C5&)Y~&o5#&0`|z)uFi0e|j?aDu9M`O6mIGp_**dIVStfa+w67!=ad zs=fHO$zzOgBjF30!@-Oa{YvND&0S#aW5FbD*DRA>5{U}wPvMDKEvSB=PCC&kx+|;- zC=?ztcxRznmI4o$r(2&MLJF8c(j zGmn#mO(CsQcbzJY*Cm2P-EyYZ)=Ag>rvnj9Ui4I6W?$+^+@fl*bcYqCRz+?(+)i+o z(IE~Yhq)61U5k{*T|fB8GW=H}>=uM*7J6&-9(=&huEmI_Q%X(+1=S z=~9|dA|GAW-V(n$T)_1z0eSpzhF_lREXF3TRhDDx9+s_3C~)7mDV4}JIs*z$Gi`?#_L;MBJTv;_=gG)Ul99o8$jUwjsK|0x%LS^h&z zc>q~|=M`I!!yph^d^6otW{yiG;ze3f!ebdJt@5|DZXRyt#YC&blv?Y6CSaku;m414 zo~e*di0UwpAYBFDjsk*+0s~fi#6Qvn$U$CA?$uO{wFdwrRLAQ9&0DyVxezS#|FQR$ z0ab2W+pv@@LZmThL>ff8L8ZGvQV@{tZV(U<5a~t`3F+=e>F!nu>F)aG!rW)?v(LNF z^Yc6ZmM+$P&pGCZYvg=)KL#0XozlwAy|4oq04ejVfq0{S!+4ee?drD=z98VKYm-i9 zGA~MTvP1|W4nBJUq|9@Wx6fuV!TweZnbMfe4igo`NDZ)ijdFOxG?CMqnG~l?`T+fV zNb0us#&pg6jQd3pG5eR7OfR)h02B+5n$MPJ$14lJ1|u5d11d$9-uj{5)Jb_;K}M`s zq=f-rB+6CR6Ol8LF7#>O;6a4vq$t_@0GyB9+e!$mg|OwA%2EoEg)_PJZiKN~t*B?OwJI!AW-}yU7XhYU`!;Dg^C*t6s^s zgWA1}N8HGaM_kEfvM-cukUzQZkE!k3o-4k0dgV~JX-^dQ_4s&iCdN?IHuei(k?^yF zygQ&YQfu&vNQy0jYHr4Orq(gd#e9cyEN_NVNx)#1>Xb_b_T1ir_>|KO-Gx;I$n=vc-{P1?v^UF)wvG58OH^C8(i=aIZeX zU)H|eV}tS1zNenaas&2OXokztb|I)}ZUc=M48R7PzOj0eLf4mRaxi8 zHVvPlR8#pF$<&Ta?c_Dv-9PX>3nwikctRWfMJn*?KihH4f! zD4bamI+0x9M0R!;eV6M(8wa{Q1yIpJ*yGhfxH6`Meex*XJHx7`yXh^uF~$c4aV2YP zYtmgKX_A_by$g6l_p{>%aNw!623|p;h@i_;tm8C=C0H?>Av*fuXtvo=U?WnXN7a^DgkZF%1dZA(uSfmMhN=0J4TkA$6Je~@p#vY{t1rAWm}2b~%2quJB0A+byoW#G z3|N`=a*V9&PMB{U)4X&=SL)7$c->;ry1?->blgK!1H(932FO>O3Xufvsp^FL@e9E2 zTPw`WFoo_~YmgDG6qesP0BxR$jUBMK{ zf5GW7aB1ZMgF!>n^@5iWxH9>v1&+Wy?|YfZuwZ0Sx)rnxgkuNTA?9kNpIc2D`XdQQvQ-c9_>)j|A?GjcAv*0rKJ z(3$A`3RF8a3k=2tRXx;$FXPvqFKUEmqEoK2GvxpsKq;{?!6r8pWpUZ8ws?m<-58t$ zv-4|<<_l{&1-r-en~%P&Gs)wGqoeMTRYi=`x%hf^IK2@p#7l4r&L@5bjh_^P3mY)? z?F27XHF_)Tx1b}c2>>$Xay0OTg2~{r6RRoPk(hzKr2%0uEFmIC-kK1CO)N7B|JDIk z8U#L`j^;lBbCsNyMhkRdaGyR6z5;g=^F(!0Gb!ecoJ~oyvpZF#(tLM}^`7geMCWz? z*Z`KWW^373MI+|({8c&PG}o8q4vY)Mi#{DQWb4Gf_pg0l;Y2j?jDMV{G^r6Ehfuq0zaL5lxzUua}(|+S+_fw1E>VOiT&^xseVV z41yzBlN{E$wG4;;7BMM_?_bAj)*&0j>IlAL;&MHg=b-D4X%8FKk8wP zW`imD{2Rky>jJWqY^ZZx@dwRv!6}Zv5#3SXyE`=n&2pqEL0zmPk>qkD5eWCE^1z#; zJraD_Wg`aq8Q2KuogrWaR&eOaR34Vgiz2!b-ER>s;Mu8n_NvGv+3>pfbt^!&1SbD+!NV zg;lYTI=Gv@)NuVHk-JHxo!EqWg|EZf9B;5Nh4sm7JV)dp{5Nj$;NONvhYvG|93or2 za>q+sslfU^bay{Ce~5XhG-@6CyC0!T+$O=f{I322>-!qaO#jUq@CndhCqIrYA+j6z zF&RKRf-Z$J>55k}UsUhhIE)BS~|Px`-=4q zHJ*q&tvYIngb)e)d0#oOv^$3B9{bd(`u+IOHz_=bzxI$bS3uR!J!Xvu4}W|EBB$HY z9^X1A?(%=ry1z*K+j@R{d{qYy@Tgr!nVhj!29FmL|)5{U>km z6Epnqr*8i|uwP5~Z8eu4`Oh%{4IF1Cphy489=i()1-`Gk73KTUuYWgA|Nb%1qxv72 z{zs<&ant{V?ti-Je=7WcmhOLm;QuFp09qpnt_g?)O)47uV^#61H3ym`=@i=_yw#4^ zq1=wfWx@dZ@|EV+&cFncr$+&bqGhQMd|cC36P@q4s>>4PTYkA-cs_Bh@FQUrG`$p1 z$q`TV6VJVsy!3M31@)JCHKB2JvdzRDZPZ;j6^;7-LTb=zfImV_0PY0Ew5!%i1D(%r zGU-R30gpaNjb5J19W>i!Co;&d?GNuv`39w!bkzm%nH+=o&N&7Fbw3Q*Svsj2Jq5_M z;R@uN`dRC(pB|(s_t4C}o1S_YVs{h}(VuT=Or??a)}`dMiPU@p%p*wyjmxjiKJwVl zkmA{|#P3=Py4Lr8l5QoipP?X-Hl_$cBMP^(c005T<34EYuxd%ed#i!>&1r!y+*9Ej zVpaHx<0io^&`X2hRECn5fcf`enxFUvtR_cqRgQrmx{!%pO3z>{Pp$>_ByY{KBHmGGTjz;qKw*5SsK91XnwH4PKsQ#< zJ9gvax3pSF>Ayhm1cVrJ)tRCh6Fvv^S=2c4fm41?irp{V{s(;j16-pgd8k2(SL_T! z9-$ZCc@3)4?|!6N>#w*AF#|IBcL$xzE(250hngAvF2sPBEt)6rz9 zustUbNv&o1qOs&)$Cjy>TG<(YE;gL!gY_$zLJqv7Ro7Vx$YYG&s=>(7YHc;awf{si zR+uu#vymEc9x!@`waLL59sWxnlD1YZk{1jy``fxH=#7jUDXAxH2*7(`|-a|<2)i@_NwhPqSkGv{D?EKUrU29D3kcg3l*=~+XK^) zI9j={2c$SuK}Q5z%>6w&)y;E1=!^?1hpwi#U7~bv9}iK7TK9k!Dqf9B2_pr*N3kqC ztgkmTV-BVt9L+X`%=bRbYDek{30&hK16NV_KR(D2FMcu5!50BAA;W6zW;&}K7>kl z(f(e3F03V~Z8>j5Y{;8NyoSt3JZ_kdl)-2Q4y6rrRh~ZGO24l=jIUbwG&9^HcWEr(zb-W4f$vXs3*Mop~q?eGNb8%*vEXaxZ^Yuv#H}({Oz5hM~QcI96t# zt4uY->*91LM8etH7g|}`ml;*YZgQPBqY&Tenc`A!ZBRI6!Na#%(B|iznG^mG+-KDa zqxM7VG(FprB}AE6b)MN+J##%FI)LA7NJ#Ejsbl~UfjFR_mg)_~dy#XA(+ApbHc>4W4|#lbe6=o}du=VTv6woFJ*Lx5q@`jG7Dx!3ha2XseY z38>~YXQR}0j|2O_s{)-}#HD~jbOe)|-n zA@3P1NimdOvBkIgd0*u-nQLH@GNmCSteqL$Ng%^uWiL%LnLd3V-=ABeK5=G+Rbsxh zsMV@*wh=XEjVD4!5%5V(p5hUbl`I~PLFzq$&ETr5?Y(}&?V9uLVlyCB{w0njk`LcE zPdbL)e$qB6bWezH>lIc@p5h#>61oBhm~_h{8MiW=Ngk#ZM@>dZL{rCZPCC8-G+Oxd zhz1=6=Y25x)%2BHutfQ$x1bbr9o&2khdkLHNbuccW8a1dA6AQ_<;tnzx>h%f#C62; zRxNLvN!9HJ<70`VbAu}JyH?uovEt&M`3MuJN-O1@k3S;E=h^4LI@;v}hTmDJ72lIngAduwBP7lN*=l9<_k}*2 z<_xPA=mD$+cE2 zKgg(jP~8?I<>19^A|ri%&|b8#5JC>ov^uhd*8KGEzs1sfiS?u>VcNwwGTwH*CHQMu z4eik;!N>Bcjz?9u4^H8kg0{d=nmKxUwX$gvp9J5Yd}1`3g7Pq4=FN9^L6_BKGx zP%7F{f9Q=6)8XOj+4LG-O|(250&>06=gJAKzBO|mXEbfq_L@-%3B0{e5d?znvFmN4 zU>M3Bs47*S*SosTpYC+`D~2%_>eTpBMDO8<SDbuf}A?R7x zfBPY3K&v1}{d@-+5Ram-2wVNieLcd0lp2)4?JtZCoLfdcvSkbe6*Oh~ zTG?7QT?t%l3kCkG&%p3Yg@XK3&u0h%dFao`1KX}YAbu+^{S%=4$sWWL@L;y* zo%>2}7fW@8*3%YxKp{V#RC3-Z#u@YD*+RVzQVh5*7|U}SaH$cP0zUKzXBQWx<1nO5 zqs+J$sxNk1v07lay!q!Z0;GoQ){v` z$AJ$EHcIH+ThHHZgJF|`ECPDM37?fyVRBWEET7ll%AH40kFa7O8%QQ$`}Z3lG`#UX z>EK9^3dxdYbDFZK;$C`mQMIqR5lDSfGioGTBU@Y9efXHFpsucztFE?QkLQ= zdLKSxV6IyDb*eQN^u%Vlkm3|U8=1bDir2&*;126-?0`xH0U87&7Q3mMK^I`o`Mv%Q zsPQLLB7xSwHahrmTYEQBuUT-_n;y7u>|O1ni}zqYD85BK3_<`I1eYJP8z0txTR%%jwHN6UhAPp8upJdGc1G=| z+lLw<65ZLEPSDvtKQ?~9s+AUe3M`~c@vJG9E4`e*aoTww-BU2_p#zkd(u3yW&oq$p zxkt>|ay6d*=;dZZIuy$tXt}qLbC;PLZ#77hA@6TYe5{VHNn>7~wlIkOV%4os+Y#Bh zvrca_A!gC*T;# zOOvX%=B#b>vFMl^381GubQ}EVr_5P)3(>q1IQnZDiTxe z*2WQ1Af%8Fq_~AH(3A2?R=!fqUZpYq@UE0ojR!IN=PgF79n-Vaw}r;JHL8g>4_;4B zr$?z<54F4t!0BeL5+;~vmzXJa+tU#q-ibPv;;1RA=33+_2t__4g>=W1@sB4sB`Q$X z<++-A|Xn{rFM74xoE7= zYnGr)lR;U_Qg-kYkd@t6S@#VVE>iZFgt|C`^v>*WyC5`_(BQSvSFOs;Mzg)EC0~qp zufTdzkcDMvsRrhK2?XtDoZOW-O)@!j(^b&8#Uay^kU<vi@Nwl@ z7e|h-$=)f!g6J6dHQYv<<25-HNuipgjM5sX^Nb3g2t-O54Z}A6Z|j zt-+jZEK0<L0+aIXpR~u{s*6NuUZ2v35`yl5r4Fu;B3+G-;KV#Y=7V+QUO{u^2rf&|jfe zD>YGY%QbZ=d-BEIh3!0l36uyO37^~MHlp2FE3&UpuX>lUKMvFSnHsX(GQQ+TL|~V+ zTD>D>)zC84rBDf`I&u-H>_Ns(SIqAlAK%GT{UURa+j`v4J=hQzPxU;>`IwPx8Hg+2 zX}M_D(CFRq9L@7L;na%vt*SL*m>mOL79|QMirW~4_TP_e!eiBJzGvXIXtZ263e+>X zDUDve9eaDO0*|7dMOpJs*^HHI<07gUdi>D>ja*0QQT5U}$#wAyXCmwa<^gbuV4OEj z0;cMTMdOZiyJojSTM-fH7rXo@a}BvzIy|r)e*TymqLpySHd+eoXzg;YZphK zEAF-@12go|aIn$5_Dt%>{33J3{;%a>pgx*mzQvL(Ertv!OD5yRXpEUO!FfjR&X}ccVypoP|xobZ?td?6@t){?J z*|*|5G2d3ugY#nZSt?;=`n}=p%ydKLdY*mXu+8F$qMTMqbH!4DJ59=haymoM`!>&cWOo>#?*Wl+kr@k znXr@Tfzx!vja@M(iN#zwMHyEPccX>p4)rJA;SW!%l^B)Sa972-EYaFhPs7;H=y0+` z60`3w;k{klD{J>eT%};BWB)+AcO{7X=<65Vm#@k;c%9owfqf&erzMeo>Gas_t96vW z(Lw)CYP_M#1xj0mLz|po-?7b62cv^|_4%!e^KqK4im)SwMB+o>%7 zPIw8QVOqEZ=9sp3v?=9LE8Oy@*4$uUbRS1~cP6BvSdxe~H|d1tVB#tQYGTYMeAl*!I>5GePn4JD*C8 z@uo*tt53S)B;e~?Jum9|%VvljEk;YJd>Cpsxyc$F!L-|rxb^VR)FhT+(+*t8giN#R zVR>NeYhK+}BnB#%?JDs@Kh%3CB`&lAGKkpHYYw$gqllHcKF3PYp6I+v!dbF8VmvJB zPhe-!+|Xwwk(ye3OV)pDw}}3gy?##=fp|DNox4Rud*STab-iwNit6;DI@u;ND0C$I z9LsU9;o>ur*W;E!HiK3lJS{Td3p_*vBlwxkow83s_se~~<%z=exV^$Aw26*r3g0%- z9O)PFjG9TK&s-jl;8Re)VH?UGP#JbF6VR7%<{*7Y`1pM&bW95wvDumN`(pD6vHh96 z*PStC^^;hf2?v8CAGjQG$cBJMq-M$*%*Z^)C`p_5?*cAA-TjHBzym&&J0I~~-*(2; z_1@DceVQ10za(4gNIlg|mkGTZm?XK<)kOVD!w7QuPpP)Ae;QH#LTJSbd8GQ$Q-lU^ zqcep)tk~b%+$)}_SnRVNaG+UGci0=mSzFViHundSUyYZQ7%4<4(Zz{xtmFo?dRF!ft5qt99vL0^#o~ZQx@$K%ANZmXQPr7DSxTn7LPIVLSp z@8=#6ONk}92O=Tf>oxMA z;ccCb4>VtdSl#J4KR^p5Vmo^qcULh>Mc|lS9xrKLB#|P?D!9|x{0+B-mKMiFb&(0i zO&+`WNgi#Bx$=r4%`o8Mn(R|_P{>iy{L)@Xp!7+!UhEAp2*|zc@IT$Wzp@LSq|k6M zEtp8BedJrYAH;V`Nu!kg`XL&}s03G>l&&(DEQAG9E215-ows|i(I?HkZfaJ-;4}h? zRynjU#1P&+q+dO>**Bi6*VA$_Oj%dtwQwKnFnq}R8Wim6jz6Nvntif8AkEidkmOE+ zLle%1`r6c6^J7+CEo-4(iTCx_R#FP}V2*B?dZhvt)fWl2RY}2?j}vI6mo4c);Zi07 z4)I=7hAvT#>!(uq%Rq7rsNRWoe7AlJ1AdBG#gE?uzS>LMBR$3Fr*=Sp4EqEF9*Ym72NynHZp`2PNNPsjlAOhQ1Uzawg# z1f2x@OQ7MW-g1;61||Sh_|Jp7Es0Eu{Yh)-OwAgn!2*bvEc@tRZs6xBUV%lz0u`V) z6vYrQ;N=@X2%w83g37Y(PIlPu2kQA*82bG0o);BNF7Ug)5@oGFC;s}bf%ESdjxG`p z9`-p~jtV#x$SlF0{K)X#>n@q6AntwNr1eUsT$&X!%WtusR#zz5%1p+~MP+qR???;W>RO7#()kDOu|YyZ|5d+qP0U7lv;9IEbJ(a`>r zAjI4OM=KhOu<`(%w)HvwAJ<6?RuAKOc3}kS=;p=$LmulXRD>2{DvhB77PJZepcx_I z;Jai81dz3=9Yp)9!}&=){sm}BY+`1W5WE1}wQsXCejr0ne(>GZ0C4+&O7(ww%oRWv zIFIElOfd1%Tk((kQUUvF*akz}@?A3jxX^zk7r;3D=$+j1_Ca7m!Y#q_bC8$7{WQkG z@=FEqTax61D`|X=<)E6B@E>c^!fLa$dcKQOan`eHRkyP}wxcH1nMzyZNVUeLpH#U5 zZxzGuk4gS?F~KezjP7VBtcr?Eh_{t|5)M?Dcg+BJ_dh$K*8WNyIK``jXoqc~aKGR= zAayIY=l$S2OUK!=B?l6#b8gCQdm(EliaRFYqS-)RHpt$#nsn}b&mAkTLTI2L~ZC(^1~p@c)(&OUqSfuM+RvR7y;9qo9KhX%0pH3_=l8t zBmiQR;HB{LZ)=lFLCsUfA4vgk~;XQKn3Cr`1FIDp9t7 z*9~-LjDVp(zvuV2JLtiKJ5={&?-6I@QtG2sGj!oovT7L$;W0?tr=i*Z{se6* z&)$5Cp&2f%h#2^r=*5Frtkc)wygq2Ci2cpZu#@ZG)6{z;m-hIA9lFj>+kUG58m$7a zSx3h}(`hj)?y*Sz^DXrk6(00=C?jw0)5H@6qwN=pD0PE9C6}6uU4<{%)7$uc{eLE; ziYB09N8IuO_(`p=&2lHl}wYf14bOPiY?O;+w)3GGRJ#b<8j z=*V`Bp(FQqsw87NU~ZuTUzVTMfC9TU>h|#P@b*!*icvHZB#SVpdR? z>qo-~q=vNW_@F`_zkE#~`vzn)9t5mSPV@I}Fyw=3)L z%RIEOll*nIud+PoiB%f&lJU{8J5a6tKPgmn@-}!Rk3BW{^JD+W^iMBYjtr3N4Fe$8 z=RYjG2yBlzuw%6y6%s4?;p*?4_s6GPG6DbPa@k;^RKHK0K|=orLW={zDk|^H?fi$! z3eAHc1_X(t8pC&*{YI}&%zL=#*aX$9dcGTcsG%Pdrp5^E?CkPON+P1TaliDQMce9T zDxe`FzwU8xa(XA%RM-MebU3W$Kb+_V*`=ldM;hb;bSWfqO77RWKNazSX+SNAnS22w z5SFPD`fpV64?1N4@+nxVoPwPPhTXLVDn%%NHS*Vwh#vw`*MHG9Cj{sVdh37u?%(Km zesZw1fTqugU?cI&nGdhRvv}#1{r01qnA-gJ9-7=`)8X%ZO0D$v7n}dZX?eg>gQHi( z$K})J@BRE%lmHwV25nW^uOGF(x&r5QQ-`Sn1J3KNd;#g-iyXEL5@4dw`G+uYUbqyJ z%dY?hwa0!_mHfVd9G&QKZ9#ykVghh}JIue*As%9YY&d=`*MW*+HqoCh06CbN^{vRR z!b`r>5&T_#|KdQB0j*_Po@~Kgg{PB>9V7uv-%zOb>qnlbfE>{ztYNnqiJ#raq4|xA z{^Du;FcE;()M$Z3_lTca_P<5bYVpwSP1TO)afa#ZW296o#YV<$P4Am}UlkM*A}k@1 ztsYGmS9Cl__=~xJF3Xcm8IayIi4N@PsFoT=00SAH{TVYF5l3)xvT#L%(Fb0`K0fO{=%7FpJzVPH(J);riHHgdKA?3 zk8%Ay51Qu!DvtB20m;~Q#ewyrkct3i4 z0~GSaBXb)w7`1fk(`)XTt==2rkVgaTDY!J0o2tiuuV^DrSuHp<^_x&sb3#q?2`$k1 z!%;Qze?hum?6kRn48&orNDuJYOg0)Mk=ONV$uetH)c)Sq)`!I=UctEGu2&z~*uY)I zmKO~V@j0wu!|D<|1M%`&k(2gU{KtxFMM*xdE8gfy6x2D5BD;@`K3T0tQ5$n#e%*et zly7!<`Ss^pd2$VjHDHkYQW5sUN(ZVdUnnF(JDd-e1AMP7r)7{KKQ4WSdi(b6)J4sa z2jDzoT-|GO-{G@;Bjc|=hN2V@U@mS5ra>yf`AbMi z+$*{`rr<+!;h28%m(zw%=d7#c-y_khm(%)<(K zGN3-*U&^&|3Imeu5|%{25p>Co=UPx(x-ZHER>a_({!0!0h3=Z|!hu>wgASlkYgGx* zX;t2mu20u6^yrtltraqFSS{wdJ{wL6Q#TmyY`f807nQ{e=Ov1d3SoUsvcLW~gwxh2 zW11|6WA=oG$;srq61b-UxPBn#zFZhg!^@0~w*iM1> zP9BM8$YpwAcRC|>#j(h7!@}mZ*`ndIdu>uk%cPVO9lP}tC}t^$SenbH_k>1Ctse@g zWopW1ADa>c_Mz>*F@uXR|gd(>xpA!b^0u%0`At~Z zT%9lP*2G*3s<&z;77G?at{uMJkg4E4{Di~tf)XuPWKTRwGS+`RuZgR-#MxcF#!164 zZ-R>4=UNE<_*J~9)k@NN#plSvFXKHB_~;bdckNwVt##WNtYt2y#*bTWjd9A!d(>} zf#)^1Tm3O#nf6X(Le|b_V&{Dmb{lP!_6WK(&M0uz``x>^ShcafH<=bmNJs>Rr0i!` zSD!D*Q>64zOxXzDn?EC`HW-wzK>y*L-9nnIz5N`=IPBc{@%zV)FNmyJFLVuv-I|Bf zG|1+9;s)Xu^hfmgdrj^a-2xU07mw!ewI4r>AP^>>2Vn$26+b~J?)9P+LO%^V*7iz zfFfZb);|_EwmzVKY0yK;c;10=gUv2FD~q0(68Y>jV0N=1$BL4Ul~u}&Eb@SboS1UF zCxHpa^~46Rs=ZYCabc-!*#7p`oTx6N)gk|Uyb9?7nc=WN0bTTgYrxGNQqsf}(<(D| zi%p1F_-0d`JCR3DPEP;yB!N7vSIo^YH-4FyrpLwpH|}TT-Irht(|nT>fqv`O-KYpE zdCc>E6Zc~#8hW*JE~kCMJ4spxALWXT#vU2wp+Ev)F&fn?9dfbvi)FiKsxGdWD;rb# z!QWngHYI_Fsn#zgNSmvdEHx6VI?P-7CMl}Y&4 zRa9FT0SXFXcufwfp5lxdrPZF;BJ`x|7jpEqwqLaLO6vw;y(a8e8_MJj#CtxGNF_}o zDl6kP(a-C$^*q>?YyA#sWQRoQh@(}dhXftIV~bvy`uO@J4qG~&rvOURWvz$62$Ud( z{0HKBWCG&FQiFMBfOwsBQ%ZSa{4#94x7o~f7rR}zP0SF}ZtgWEJ^Cuumbbre7tL!+ z%DXlruSkz3hhpJx4TSq6$%sPHnE#Fr6FG7D*L2nP!WPk-*B97KBmpZg<`){h^4dqx z556d$(p7-VL794sgcs+oUUeoHQ;v$_TOX*p?H13~HJiQUw}b%C#C7+~W43JOWz*&p zI5||a<_!O6M(afN^REp!FK*tt#wMMVf?h-sOvrLWOBz2Xei#A1%5I66;Ve78cfygD zZf7;@eYtv}VG}a5X+Qt8G#zoq2=kCepFzxa$y^K)6we*;xus{tji1mIC1wR~eutjP z1s+rleDcfBI3$2o90bvve+W#K!JFLU{QdpetrxiMR>%Fclutc9Jl?l24b{;#o|vjp ze$=5Txe~>mjsjU|{p5XO-yN8O9Y+Pz;C;gSMkpwYYCOQp{hTAPEQ=gr$YyUhDhH=% zZNBxBX>krEx5Z`#zLayBCf(|I0qc;{Qi2Erar7AD5+ZyQ-4R9tpGlOCi0((p4}*r* zb9!%*o==HbYGTj5f^~Z$N6Ap)G24ukde3ebJ=Ik3jh{Wn65eD_vQ|&Hhqj9gcdlj? z6e`bdN4(!YSq2b=-F`iVJN3=iD&-#fZL3}#t+KTJ^Y-lYT=&}Vu9s#c|6`c?;_jO4 zEk=Mbng1#3J)uT~-!tc6Wkn0CJ<>!=@F&*@6zxFO;3R>qm86O-gR$667%yytC(n4sm=#%=I1)7`0?CaiCF^FhzQ7YO(h=knemc! z>@^PWeaf(b5x8#829JnvBQY{$00ly?!HuWES;jW5gdIt(_7LsB z_B8pL60H{Th&T=L4P4yd4TJL+U|zBB$4}C7yK!9h^v`{K1Zdq&q=1wsQeAC?{q9qV zqu;}Y$Bx38ugp;@*+%DMaMlIkLd$=QtZ3lCfFjezEv)o;t~g#>FH!r^N>gQ%u}bk= z=YxHYx%QZchEe0F<|$rgR~xbvX}+|+F%`Rg236sBZ)J2Wsp6lRQ~|GLo_g@LwCTh) z*DclzzqAgwhk4RhJM;$LI`3}n-yc>`T$r1CVYgAH5D{bj>W9WUuQ20y%xoU6;}8jf zbjNWKB<-G43eHq|sXL01+_{5I=6k)FE$l;kOD3p=mhj$SeMZ)^O-Wr@{!}ok zsXFmTf`Uz5MX#zmEkZ*0nx#?nv%1qSWo4O^`#Y?tehQ;Y(vXdc7%*V~94$5w)A@%k zVg!u9+0By=u3H=*LT)FnYuK%iBfcLo@ra1PX?&PRrp9WJCTRpiFWVr;1d+PIhpF}Q zW|q3VyTR_LX!QBi_0}kc>t^bbu{Rmn*|95jB45A1c5%w&!gYjlb~o$nNm7V+Dzo$K zgt_8__mPqci=7*oEJG$%W{c6pjKO9`XJx+L6Ap*C}pVQE%s==HbCNb zwMy#a1!d?V?dB8+?0n0|Ft`k{saa9~qF!Giz#aoCp#7hyz^JPRpvjz`4uCIEkksF4 z<~_feR4_3Gyu(NQn@2m8%;v-Bw}&sXvLc!6k)HeVe3%t*-I^-)&$5n0hB!Go%^KBH zIr=|7LwWAYD-@~|v9+pthxcpmEgE;p*c_=rj3VR!{x}uR!_~TTv1rMh9+|LH|*V6IOu@m(4B^YRkDL*W^YolZ-yNj=8mB!k}ei|*1Z;ha#SfA#6 z4~0J&YQZYB6sJ9zXJW2XQV$-$a@wB5uUt%$;<=74xzcKJO4~nnlUzBAxcQqIZ++l7 zVebus`rWkn0{v+KLGEKfgA4!6mA{FOT~=&-;AV50&jt`+yS+-4k}a5ee~x zQE?iqS4xr5P?mPrMqNFdJ$=Q-NB`+6nZ;S{>jk?7T78Y%99zQtvn&c33Wx;- zmXrz^SDHs{-mqa%PF9+-9q$wQ0`IJ$qXSEsp3u9hD()u`9q2%X1YDUVdR@{@bAOw| z$@Mr0ErkK@#xzzM1Uea)TQAspbjo+ICbf(SNBkF^PQh7>&xM)+zoTqY}(%;(cJ(#_w(x3BnAelM9!e- zXqAf27ILnA5%FbkowfjP_gA8K@bH2&HwgwhkRiBKau7E2Y2WCnybSDe?4GS8_ij>7 zPN8>8Gi8Vio##p|;g9(@K^EI5+E#{}q2TDy;o);x1`V|OG;tX83w+SPbDeaSNe!yQ~$Il#={xD{$GSifwmfQobrtJ+4PpGv1q->z^t68Gk`M^ z6}TtfMO^N-cArCm)%5tf!}gsA_J&}{9zj?gp*I-KtVYE&iB#=G0F6I12?w_oAuV?Y z#;i6MHbXV?XSpkkMRA!h0+tCcUoPn(z$0E?_4d8C@@8!(0rZ?Ou!Vr$z+ErT2YbduvOon=Sl;dFBT`hO8_2unai4FCBNh zNYACy`VnRq!JNfx8n4Cr=NOTkIHQV(kr1O0*$vyPH~(X690eP=A&*MXk=#zF(xxSj)`v^{kw=*gg2wzOKDPbS82WwUXkJ=4uch0n zg;(LcA_t#pea9Cg(tuq}lWzV~>)PR=eVh-RNAss`w?HyTF3k0NR!fubQUmA%4Y1NN z{p0BWB7zDW2nTDZzpy_B@;;#;^|#anmRTE0ZVci(qLTZ9--2!qXO~gg7${=?N2(mG z?)nKOJG}h6&et^iU;7XM#1W~(Fn+3{ecGJqaBBGhY?EHTwG{f+fdAuL(P0`inkKb%cVH2WAE)+-C}Y!U$_$*8JD>2Dy4`;H z{scyuNUiuZ7)C&{VT=QT@>Lo%4%7h>&qB4}!+(=^^Bj@l2LZ5a)%-YW#plD<5Rey# za8y@WSXptEyQe=a`U=#{J*`m9`LW;8LZ%PE&mQ9 z$E!LS!ocaC0@INKb0_A;^$#SBjG4wD&>+^?P08=6ECUrlB4lW$>%Yx^YI4Cec_f#^ z(7ea9=rRo&cP&aiKB={^k%(PmNM$=%9b;Nmb;A)}P$40annHo|GP+I(q}4p}(gevv zO%OCk^xxzntLiKkQ_L@<`o}^PY(`3!- zpu*#cMHG;FvP-Ei_%8MTEgyrxC8gO1%~uj#qB2>R(b0;jC7B)wPH=nzBe0czT|F;A1JmU)1 z{U}4x+;ZdkrvL52Qb*72gfE+#8!oMDaUE}+t6dgYPYphjZ03nHe|$I12J+dKwUH6c z1|1U@+%Gt^avKIVMUDtL_sw5SKb&Zom{=*Pra+5@y@>%5>SRXm%AWA|+Rzjk-T&9n z_p{67Wc}Z&+gA~=cs=ksU-H@EXI_X~-zeQzvY_9(LgXrs<|Do!RkS`9rd+VHa$~X% zJxQO(^1gwrv(0HA0YbpLDT7Laf<_t&i}O{%m&@m5>+0?qFT1GX$b8)|V5T=l<*2@( zAxzs`s{BTEnF;?filQPpwZb z`K6_i?%CPdgE(4^eP@0o+lqx;6XNa+rQX0}xsS_8C>}&bNhwkroSwcYUQPolAfg&O z17)sQhV*=jTG}Z%?!|dtXYsIN+>~*3Czx`v<)UX{!uy*s{*^xj@w_$o=8dy5I=*Wc zhIak5UQ1dZS<-Qgu1WIeM5aA4H_tO7wt_<}OKj*Hvx8K{5GRPASU=`Mq+yPu-W#cY z*}}`Gc#Sf`8>FDi9nT_{P2P|qgp&D%WW7X;!P?}rfPct&>QSy@dsu8;clQSK8yb9k z{QLGWrSIyENiQ?V0pF{1Ky6X;PR28k)wm66wpgmEe=k!>_INxi+RQXrdvc{)D!6|} z*cw>Ag@RU40)hL)C5IDJZu%_U+=M804*JH(QxW9t#$qW|zhb&ajBhF1+QzWNT5?f=`2%bCRAH&Dh zAvH$0GQPNfDkF07;9{+6u~4uhGdM%0=*9ACn>Sv*Wh)A|J87e*p*j6DE9EdRJ`vjc zP*VKESv$(a=Ypi$h6>{eA_i03MXB0b@!NQ%139N!K8k^?I?Ib4ibEf}SAEck*kmKN zh^=AMrOyH}G!{t@J&&342+3k~>RZ>h@h+I`5diU4NT9^)@&8V|hBu!e*HHZYs%W;4 z7X~-8R%3rZXd}<61Mf|CZdlF4Hz}cCe#`<`-`uhSVT3N-P*7Vz*Le8Y7PHhCHp}MX znzUwy-M7oD2>!>% zY5~{_{3@@rfiGLTo+?Q9)^3YiptW#Ksms>sQVpS+eF{m^9@)6~+)2vz$S3^*LAEEw z@(iL*a-H59ne4+=!u15vEg0bd7>)|q62ChBgi`X^uU|9b-7VN|__P`EXTsA*Ye*fv;G)kR7NM@JbQr+ga?{+RIQKEjp&f{2VqNeT2N& z+>#LmV|7F1&33TnrHI+F$)LJ6Q0Z zSx$_rk!XD(X5P?(^*PZx@>aV{iEvYEn}b7 z&0?$oO-EB%TYlJSV=XD$DRG0`FTF1xsdM0GQcJH9+aqx?pZ22xRFkGeK4f(jUOugF zu6f-Q(Q;{3v0~$Zi%pPlX~)G3`_TOoU#E9LiBzfe!C$M^Kk4MU_tx&1bvJ3o8;;)v zRR-m&{&kzSb<`Pk-mEb=L6J>8bD#ogx}o6wxCQ{Gye+GJGN~@1Db^j!j#;%WCDx;R zR(nFId7*3bsLz$({FaLO{&BVhm;G!+Z#D4{R=~61?v!w1p{*3_@4fl$?49g7o!7c0( z2{XL4JqU;C|H|dqI~@cOvGuP81BY8qK%%gdV3F)yTD5H6S4&mAfsG zCFNC}KlkQdr51k&&_AL5EoBhLw#C zf2m2#g-%Yl?CB2K`cP970V`|X45C#}BF{q`o0q%stMdkW=H}+xshB;g+~!+7ZVw)$ zO!|?VND|iH)(nLLL{LdOe%yZX2IInO&@B0}YL_&?;BFxV z_XKx$m!QEN4iYT5yKB%SxLa^{cMT4~-5n0@aAv2c@4a77_geD{enahgs~#&0l)2N^ z@WFGDeow}!0!7hJpn-jJq#q1me@tz_=&$n({ep-@)i;VF>UfL|5$lPk5 zQ&*oyLPP5f#ZPi@QFZMT&waVtMbux%NK- zBZ8XwV*>-Lovws}KP^U4V{GMXXZ)=AQR+`$vHyO>#S1Q7cAQNgWNjS25ekh1jx%Eru##xUqd*1RN?$*=+jp85lef%p+nKU=se==6OeBgl6gRrH zw(7i5C8*4=P$a{Fp;i`j;hGo|re zB7R5YL3BuY{NnO*j%p*<`Sqm)Ae2$e5{OhC94Ff`6geVAg*UU@U-&hzxhi1yDP+oF^$zqT*O2|9EQtqxqZvOh!kC{4}o@3PH8% z6Oi+JzO}6`nw&z8_QDNnyIK8Ue+M%Ggyv*Lgf0aiLRh8(i{Uaq+pZ&%RF_EQWW~M;x4SkLaI#o?tY~^aI}Igj)b5lg z+)%L`i7=nJxw)!D`voV-*qdt_clGMsO;0OhNw)m1anX8H0b81J#4tP@78ce*b2n+4 zCUH*!yBj7kj)@ZG;Usk4`Gx;2X6?|oiOE0961UqM6`fVC{pc&51Tn4L zfmoCw{ZTd@aNbHqUzldTs$mfeea$?w_A)l>unS`zxaAB>u#Jcx4f`#87XNIIAk&O?bgmGe4R~wG};3kkiRlPoefw)N@72uaWBYo9dyYZm@ckDHX^#fURWDJVlT}w(KZeC` za)ox=-*ya}cuk#xOQpHqRVEYq2tnSM4kxjd^_XA-OCbjqUC=C`&?QUf9lM4JGzP)K z^=1i3evj9ff0-45h10Jw531#`Vd@RsJE&p$PlNJDgcC|ily-k)P(gx^02lAYo1r_q zIVqc=jUFw+^v3~e_2oN&DO`Fyx&vP44*0u&H_U%L!Cl9URpw*bL{HuDMtAv(d-4kr zGgactcJ1H!KP%=pBqQ0rL|yUJ4#Q7P{4{$j&kV$x@Vp13J4+_O!>O^quC_QJw3>%) zZJFukiZshd5Yw&)6X8%!+50oo%`qi!c}t-%;A6IZgjq|y9wUe;j3sPAw+!C{ z&r8Ro3l%ruu=fF1;(6ssn~9*z!38=K3*XW`+9tsxTo#KJMkVAzQ;NYDZgv7uv{}s3 z*7C!KdDR_~DS2@)OE<+qa~W$vpo^WZtcngqL`8xY#AOZAX&h15g93&JhE@NKA#iJV z_Z0dcspp8HLS@;fYu7c8N`a2_KZMObPK4#277*o8ya#?;*cEoqH7%peKwcKZo+pc? z$M$!HwSWmluLa|4NOURs#%9L%cP4BaWIZwBRBrKNNoZt=6z`4x6!#{|$$csm?kzf~ z)Jh3F;O@X#vr$^sx?_-&1~xWle>RU)sBU@a)M>q7=>7r}gb4rah1kS7Q(X2|0iQ%R zOB>nFGVy=DJ|@siiy6BgLx_n_cI}Q2CrD_H%x6ymwwC_cP!?DGHzMy5SK4s`4}L)e zpDX$4Ef?cghK|cSMQkZDS30A%2PZa<+LZ*N8-6AV{)X!OxvP9yPGMiGa4f#bBY=b? ztrmDhF9)hP5$0$bLD5)R=NhA}OVkt8i;2s$(%`VQ2bDLU}D>PMuqN+>f(F5^aZl$v+vV8-515&?V0gD zi)EEO%7aBlpXaN3m+^Qi*uAgr3yRh{ZVhQIJg6l-JmDxlG#U14?Jy^6s&mpq2lh~> zm11WKvNFf2W?R@sWnQq_!mstORL-TYb{JOc-Me0h#M7zjnRW$T0}VxforawgXed#c z_%>+bfh|?p?$HSaV?G4^Wx$r!}GC%OPx;%_A|cjwc#pS z@?z!kRY#+s!*%r_EKtY{TfarvO8GG%o6#)xJ}n+^@6tO z%vy{(yf?a&YlE7#_-n3vAnAGBf0I1_K>CN;M6?!6tnc^Gne4m* z+_y{r(BW1mCc-o6EfXk6HB;IJtW3)W$bdqlVq*vModOovUhyex`LZ7xU5lp5ey!ME zMNsnajll_hd^=^~%oSg8P%6hz3$2xuDUizxSc={D=81^#(nG9q^%3<;2-7rd%JMlgQsVk+k zf>J=DJ-##atw+QXN$&>L(|~v7d#9G-jC*Au2R2C5BY&_< zj@w~x=VLm*FE&;zr8-^5gU|Ux9fopcj;D+X7P=nW9R@>ci*|i_RsHp%R|RzDkm>>o zv9K+=?jieQnkJY`q-Eg32Nx5IYFGG|Ox|@Pm*7{UgJ2SS7X^b%zC1v>;M?C3lqcBc zU7O>3RZ?`R$ZMIhX|dAcOZw`ixcT^y{f-?KFj(X|L8R`j^)z?e=^q#G2hqJ({gC>G zC0oYyQ?)C7kB5s^H*5|^Iy2qv=~3@&h5LS{q+va8R9B=v>$EF7jOsrm)YVm%t7HPp z-tN|P3}VWArW8W;;{?gYh<*o%B4!{-sO-dHy1@1?BdJ39e2Q@I_ly(SG>K%cSHm%v zvnbmco;W}L%u7E`U%0>uBKCjtNjl$f4Ih@BsibGrd>-o&od#Q{Ux#(SI0H0}JOWKz zAwK5lhiu-l=nz=Rl-Jk_VSW8o*8fpHhVml9=hU}oeg^sW*?0gjJCK>XI}Dg`(oH=D zwdu&T@&_jt*qZ5VZ8HLyU^F+5oJ?5RUZ%7tH6Ij{JKZ_HJ{6<~fX@n8i&ou;Gx40a zlWRF&d7c^9e%s21GhsE(#fY3vaEZStGi)e7VxKGsy_1ZFT{I@m=ow|jW^vOcn{G$j zO|9Lvgk^i%Dx|W56gVju^%>tu4DS~5j27zCh|@^%=ivj$ z@(bgOaW-qm^BIbB*$JF#=FjPP{(r$l|DJQ9khRpvKJdKLHCycqacTI(V)SuQ&-ZpZ zNyJ8}T~but{dAAhGG#+MR=K2_j||Uyg|PmSx2sZ3)O3X+xWVK>J6+E(*4*gOFLUF> zEC`v{da?>6)YM|C`B=RZ^AS4GsgSXIi*{LUQ-pis5v)FI?PE;4F~#1JV~|JCQUYj?$luHBN2AGM(3%=cGfeScKE*24l#%M`sf;7i zirEV*>cwWa=9IYF&C*3z;@+w(KI+x?MAUmzr7OiCkqzWT1Qn|yoxrcJ-SM(^(7Y9DWIn~-SLLFQ0A7$(g3id@Il z;=3_)VDD3m+z4OgceCZz${A)o0pItB3 z!|r5W^q+NlQQv(;;3Pe24>JEI2tD#_M4{Uk7fIz%8BygJ z4*Y8xkOUw|UC_%KBQ|E8RDbMyV~=C@X?ag!3bJ9c*+M_jpckTD;qKIWaiux3^Q8L| zOwakVSTu~8ECXHbr;XZ=x~v^WOXLC%Y~NxpoGKIX>R*0ztDjDOxz=GI)uNE}XMCRK zyFPryxm}6jvM^c7vANyC<9U*fvQ1?MWN9R9*qErDP49h#-fzq8mqJ=1@!OV~69>XQ zu2`CUE7S(5Q`^Fuze$P<^*0Gu$~xhsb}sVZimrqG`tIjKxjKM(3CA|K4Y$SWL~hpk`r#YX0;jhw>>)u++3MZ}spPf>0rPN(|^ax~4 z1Fd}G-t2(;-XtNeB+&W%`cPFKzg7u(fjA-N=V|FIV`K;+70s+BlYZo4-dwTSEjCnr zjw*ky#_Ex*U~k64f)|Yi-!f3c+jBrU*}q8Fo9ccZ))ez z#b(_~e({><+uI`wSwYa4UcBV|k}c*7Nd^>%$&v(-kq43ugg1Uc;PS_HIrArXKELEo zei_!LlUz98U!iaN?8LA)(7R@aB}{1s>(yqBmd)W!L@5{ zZZ6B~ACHA*gSPpZw5nD6N3VAbY9c;j;7@Iu!Y}p$|AYR?4(OU4X{>U2#SuVKgvkA9xSg|D zYQ&>cqc@xTgbwCKgQ#O*;%0oeZGHYIc&<^qLZdJ9w4rPU9Y_JLG8%K0Cw)z;y9PTw zbXb?==WFU}^i;{Ley6rmF=Q(z?C^T(c*dV)56Tb1Sl6bTK&I*OGVz+|1wFm0w>XTS z1(T~T<%uV0$ZG5Gw>FY=?PvHYsnhE4VaySyP$sQ5`Ks~>qi8a(Dj)68?nHw%Q6+y* z_b1fUxx%|-gu?)Kw_fr%A&EOE@W>eO89O_>ij>;cv+RtVS%$*6Z1XoA<58i#!o{A2 z9Y&CeIU5gjI^xJt3Opl8T|c7_-WjNkC(&pk=9#;ShYXu0u)Pqo>Tb=-x!pu6m53R= zqX+V=$AES0o>*q}Jr1kU_?xEI!k7F*Y`>Riq?h-_J-J(<67G&CjW4QbxJR}+ZJN6A z5Y%s;>yS(i2z%XunxgDghcKQrjrkEC$pO`1p}iqkw-<^FKufg?te9 z#)aU~^zo_XO8aFP0LwrBC18DSyc*?2Fsoec{cYq?CF;h9hmqh$)TKhUI_zsB`+JY~ z?N4SngQ@+xwfqq6&ut?T5IUs=Ki>q_VHKL?*`_@-;Z)vzi=UZhm8LJ_6@cT^o4HZX zkge_^EESf{=+?z577Bm{D|DUZ6K|TvJu58WUd*$Un`p`lzeT>8{Yk*@l_U{F<)TzA z!PKNRNO6B_dJkTTG?~xrT995FZ%#8lyge++`ZKq2G@W#l_cE2I1F}X|83YskYpPDa z?3gA5H4x?RT&UBgATV*UBDOd{A-JCX7{E2ctdb{CjER7$GTnaju3C=k6JMM^N+-Hh z$!&QsvCwwp&&F109drNH$j*|hu|-zflOG%5HT-7euDB#R z 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 LmLhGn4Zpj49NQl12RUvf$bd@)(%I-K)4| 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%0DhIUI`l;V^_e#t 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 z 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


9}td z!31(LkVk$-DWCrcH4S&gpj6oTU^>%M%u=YS!9)QjR?2kJPrfur<^M~Y+W$+NdgcKa zgGqhnIWmxVP69`kq5tmREnzkj&?He4WvXr&RP1r_6PdoRBOGQ>S^bz4E@tt9^!9W{ zo}+c%TvsfA**SkPL~=1y$Dj>=PocKSL9%`jDHZ@`qup20dLcT;+H$o)6lE^fDvSxJ z>ZD<-aVLtYdW!qb>FyD+3fWleoAzDzirVC1SfQr2s5u+xGQZKB1Yx)&LaTor(^wO7 zduN&1>9X&T=(9CCU(e(*?lx!7A*8&*c!a)HXcl%lj)z75vcX{&^8MCo(Q%|qzf)fG zWUM)(*!5xs9(?P~hzs_(Yvy5N+NHU>JeUA6Nao&l7npFrpE=HZFgCdRxyNKW%v%2j z=Z0)I&w;Zb?6|$F-{3{$gx;mZWG1|g_R62*CLvKgN2kesA}aCUh-}PXWBnkhlCDDP zd`Yp5yp2XKV|sBZc(;F`BIq232&>iXAh=+B%}pu{5EQqX))$lFKh2WcsB+I2#8_xp zLWYmcpJVW^^k=_nT0tuC$vplRkyr53SVct-9N1-dhpXd3osUy@*9GAV-lX}vXUyMftS ze0;qgkq6V>d&K-ONWknO26e)s=0)e=8WrsH)|4i#_*Q-W{&mP4*`8N=gLI%p+NdH^ z9YwofT+z70xvpj#gHTv87Ufm2;oG=g9^9V836c`i3$e3{=Zy`|^RMUhLWIr2ig4;Cx|~3K6zIw&|~?Ek#%oOeb++$`Wxfa`eDRGzs4Ck#~BZ zy3PmGKWpu=N*mEGP^dc`MXY#g(kk%bk=PIRY7{EC?lhW~I`Zb&_w#B;TQ3D6CyKqM zWs(21Z~yS=x#{t=Tq0Y8uSsp$N{#r3a_8dboEzkw^{aJbIG{w2{XXH4mZ$nWq83rD zT`wwjnV^eeILGiI6z;%-wpH9gxLyZxthMLemosDeTp>v;CgpE*73WRGBdJF9EoaP> zPqSIFp*IHC(}UvLr;N2ItsCc0We)O$j*`1MdX0CsQjUn>$_j+3KT?c1YAwppC$HCt z?+U{rA&@t`nZrzTQFCnql`VpQ(e{L?UZnd4ZVSz08#As1{hAf^m+zjMX@G#-!`XU; zX}T0@f@>FvpdDpx8EVm+6Z)8cyaT|ZF$60t;$TVtUX3VwGn&s{>T zT#_MI$qMUnin7#L)jKJsUwsu_hF>u01~ninUgxleHU2{i*XjY;-`!hSLYc_3g`3^O zN#w9%ch*h{RLu>HcHFLZ z%E)HRg1wu)XdIVTKG>f>v2V2yD!t(wy{>eA8kjX)TU(>}{7mZW=coI;n6Nw9Y}M3I zPHpS`2c)QnR{`>ld>@85K0XFr?Bx?2JPs2thD~vK7Eb(nbYw(^I*L}ERU}%Xrstmu zGoEa|d`^|{zHxoF$7Ji-)YeR?cCB*IMOs8#=R$9}@rvnUJ;7JIW!^l^Rt$IpTR&fz z_7e{*Nz1(m9ucxGpaJ?9Yt-X_*6ZW$ehJ4nd$Dj(;!1)?INcc*mOqEiU+o~DbVo3= zoiWTq%$=hPhH`$8B@9jqeG*=8Zw?6bg4<&<5_TcoirY2%#y|Q56X?ywWYF(j#Tw29 zUn_moo=S{~g0&XLO=^~*+Z@@KXV;45u!0GOoVA+Bi+k>rBcqtg{2QLWfGRt!oc6yV#ef5Sm^jVI~39Tq!}f?npo7w?8NO`ca)a!>zO)t;YAhynfn2Og4dXIK(eQ+RkfAWqh`b~l_&5wcc(5}fuQ z+@-roR@k@(9!)@J?o7HnrQ1-Xja6)VDc_qcULbXCF!d=lAsLlo1^YWM0w!OjHl@hT z-m9wHB|n85t*vXpF+0+K3h=ghu#w~f6PYT9YXfOpZJt_fsJ38VL=Zb~r;Ojk`udyC zgYU99ko~X^yYp02FT5|t_lJk@5UdJj^QT(~jJQGrwoXU2{z$Mf8h&tc{+Y(mxY-jx z&9<5qcX^d|^YGCvf*g=5gx~x9lV92);E_^1L@Cz~H&Q>H=vyqa~{$^#FB&8`k%nm?ow@pz#TFiJ;%maNqI311kkfrOe~ z^?+Z%@SluNYU!_yUN4yM@B2Ylg)v3NR`-Ohh{Mys3;0i`mg2e0iIl8(eS^W?s5!}` zoW#<>3@Ew60XQ86XJ*7d5+umR9avGix2WK2Dt35k>kW*%*P$7W#qq0^%A4@%knkRV zhEPRwqogwF#mt*>CVHgR+I`p{3vvDMr3o;_^%ZE*<|~t{zqO1D8y@FqC(>do#b~f- zZC8>oD9t{qMhDreG}5svMs2-o1gfJNCcAlX3u+H@4zsAKw#u%y=*^Kx8SZ?K+?>p? zIUVj$ACBwNZ5zu~9zRPsHFiUhPVun+NC_)Mn=zAq$$X;-zH5imF}Ewo=4ZWMF9zaN zi|K#T^+gwAnKdsWF0CB+_K>2rrXCb#lYrP!ph0P<+^wM#!ljxU)bZR(TftM*X(Xsm z_i^FET|3Z|MrL`~=L>YkfiD2ojyljWceuT7+7Gpffb&O+SJpm>1;+_Fx(+`>Mxg!) zGvThv2>NFQA5Xx-O&e)W9RJmJ3Nws&?B$pX6u0LZDySu=7{tF|YXC3g(dm_h8m*po zD$kwf1qD$ z*-fAGVgteJ@DL8!rjH*csnT#$r$5V|s%QF~j;wXEyIhlbcWQp0Yy8e+rfMHOoWcsF z-dh~m;Lu}{dmZV?H4C*|Z*lXTpfXl}9*(_0S|f?$g;6BT@DhUDxUc4d4YCu6J*@xU z%T>wr$^T8QV#^OzH^ydn1j*T_SAI#JVR(EkejyI851d=*NqDmrYc6cQj`C}B+g^Me zmb|{go01lp5?gc_E`KSHV;Hty3gkL6_0M=Ejx9`(C)|edOAC%}8^vjig3y=8V{j1n zSD>p`ziF3Dt+oA-24YmUJb@8qFyhS`^(VveG&pnxu0cdFYnv8hHn+Y8gcm1GqIB$w z_tPrR$lW|FB}2tCeqjYafyu9|Qopw|9jkoc!eYupW-|JzlM+gf1X}o2zQL=6QTioGeg&p_3BCK&>cUfY-T((^ zT@18poWu2gZZ+=2;A;KVhe-TV;Yrmr;CNgp_c$vFdS_&0P$=fTvUS}V?{Sy5)c;VH z>%TUs4(e2+oF}VKq|`j#*(pW5az)~(a5dExLMCl8?xIzM<1f$^s8;UK6GkAae|l-2 z$Q@4Z9;W4^?j($3TK}#R^#{nH1l1L8@J;9z1E6gX-|OK2Dm(w_)~n74Dvykn`d>np z-uiD707Lwqf=RJ3&YTGdZ)AR%hdz@(d&R7(hyzFD=N6;;4yqlMo@CgDaMc>)pD$*3 zWlUkczG=#0F^}_hFs{93$UJQ=wVwK~4y~`zFDI+W=aZ|4gSC@?*--kU;P}VKuf~*w zZ$uc&1lVX=RbkVtZsAU1WG-kNN8EqG`L%)iYI~h`f-haJur?n zb;xDyWsmVSI%tDGDA?oDSo2X};U6ErDEarVvBIKqhgTO8qD~za*pQZ)2mk7!h39_h z5|zn}JqLhFu==+%e~B{x8Xq@3*q2eGON)CBX(PZ_s8&QlXBlYr)S3EKkC!O$m;`BA z`~W%Bd+aOIn6JWG0KEv53e{JCzWU`-LH~#sNEq?8I@rALI9MI%L$ykRw}Op3r=~tQ z;QvM0y@E;>d5JJ1P`|b(bN-jf`fI}vD8Yqcf|$y)ANMa>(g*gZ4!FZ5N0gMt8xW90 zn6zF6!Q}`>eSgdnJZ_!eb8xEt2K1v@<{{9A@|Gg$zuX`68h@xHzdm|xfDCHal;83m z!rKK&y0r`(BUl&#uB8lV_3Ll*eFa^U2O4au$%}9Q+ot)yjrPTs@906>w>PA&-eRLn znp-FS<))x-GAM%HT+q4w|30waWBK(8{x6Y;f*v%c^NRn)fY2{m)vJOM5(sZj#D6n?M!_W1CV20iDuz)4$oVO%^0KA#E8V|7SS=KeW!-yIkQ- zj^mWZKXUwSEo{6bS*|7gi&x|SpS_xU!_=IDfr$xT02!Z%garM~fSsM)B{MJTaoAt( zzAB9IQt;&laE<561kfZfwFxFDSq)=h7=YHM2+sd`@u!YeeZb1|2b)4eDe{GI&iV_n zqZ%5XUJJe5 zcjoL2rydNJclVw5+HIl>zi%LR8%GNS718k`kMdw~C>fbF*{9 zA*o6BG<%=uPNa^=%`e@~tx)ZzQ85Os7>hloCmK8*I=a^944-hAG3oj-rq_4{WcX4`wO^|brBpJ%O=c_0wH9mCmoS$^k3kKw(O9pJJKdtyq3}p>Lf~0WvMb&vn*R`=b+ z8b>1%4>Rdz|Bki(0qW1uEG{%27N;j|hp0kTCZD%mqYsI>9j>HSw>zJ_?EXY3bxJY4 z$PV#1lFjEm``Ut1sW(Jq2Y0VY5FxDap3|@NLY;`)ju_Lugg3d5rSfnPx~18^U;>QE zz0i=$z$&?mcrwBRw7cT2-V+N|SZ5m3qpyY(uYU{VWGB0@$-HrG2ZAS2OK%B$TDok$VN3z( zzjQmIFFjPdoHKlq>er%KKwC}$+cthZoLJs1bm zb_)yoY>bt+R`f{geR!FNOPsxz{HC6#Q>tZ6S|+|~56#zzeyn>e_W3I;DCUlX_iU?s z7MAmXGM=b;n6ddI^~j9nZDHQrm5$4$JABW;J~U1-$}KiG2B2R#*CaQtO|I~qTjmZ- zo!ehtYpp1_(mZqf##a$g-WWlDI6>;uj#rNa+)lBZN6^06JsJ_bJYGaj%}g#A#Uy3Y zN)88h+XID7m(fk-*7q5IE{0!z#BV!Z^id^lDvpiync0I+J)eul=y=y3OLlAef3A_5 zS%ERGZ{8LbSdgSFVRa2qr4}T%RP&_L55kUZw~jicW>5H@F7JN&TA=;ntGXA2&#Pyi zi+Zh5jPzEj8alI!t94#w_s*SYlT^3QX0I!sYIJ(K+fYy2;fK9UWv&XWBU zdP$m2mE5*tek2kwSvCm|)k+|EsS?i@b{XbP4VCRNPW5jdqbG>mFAdVQtkc}VAns$7 zAIf}qz>SapSoUtnB`P(!_)8pj+0-vxcoUkEo&EAWTfil?3wPzDrD0na7a99@y5mGl zgh$>efAN2L>;bLR=oaPQOwi%Nwsp9HG~Rk51gu6oU_MLA;9Q}HW5p8Az)EZ$$V5qy zZiG=*f;c1%lR3eGYBO#wJD6>;7T6_&~H6ax}_WN2ToFB1{1$aO_}KKu}JR5Qs>iGN_D zs|Q{XQyj@9?^Q)fWu@hKb4)NMZoapxvqbnyFYyWz!q@8im^WloA3OB!rwXIgLj^A${sUKKy-)PT|S8F*5-l zkd7E0$I0X#IpFS&b=&uFUYEO42;{W`ksd_HsBQonu`tJA}k%w*%Dao$0Tt2Ay z3LJW~lOp;|PIaE)fS*9>_s4%Pb?`1j^m1b_SOS^@l8$QH=SK3 z4(B|<9^T<~$>Zbs*XR31*)?Y{`S})gpp@ultz`}l9y5H)1lGwcU;#+ZS1ckICAE_B z#pRSFOk)CfKMelB7um)u9HfF47iCxfMqm}syOSJ#`X&0OEaE(BGpT2IMR zeSI;`g^thjq=NRrK8tUG7ly5^2t}?%Ahjy;=?5GSSSAcv!oX@g)uS_1L<9x6eXBw8 zabfWJc9(wcD{uif%+ratBf<^r1_P}TT0_km6^q>_^@|4Sy+G>WrR9-U5%{SCzO!G;$AIh#N-m7xuI480Qns^e3cUCC*1EUjj#h9F- zNCstAa}*!srWx`ZeS^UHs}Ybi^BdxpZF^(ez2Wu)b3qG>!N?m+ zoW4&Jx;1ve-5)-ueWkL~>P_rjIne(sI6k}K6^(m2SzTWZJ@SrN+R}sFO}FMKzq9*R zb+Fo-2;!9X;a7FSa zljkCSUP++SU-(pQkJlh<7TbO83)lyvp~FSsy=WbDyANqRAI}{ z6*k-62qloK36WG!5><`mVqAitRTtJX&wIQuQI)75Y>JQoab~-Mu1Y>#ZxDP;NHn++ z1;%+B-w;1X_9llx;RWwQgFT~O8TZD|6qPEnlsO@j1jXz(~bV&y7S_aWoZ%hzD1Y-syKu=|7|N=xhCq@nc*DQL2kg`HR+C+awTsh&}6Zxqiga zCPGldxPsd&#+>OEOa%e6ng~v|>^dshh}FCQ_FkZUmENIzgjNNPa7NQiX^Knq_0P%v zmr;HHuXORn69LTtA87?7XX0=fGyoKFbAeuy;+&Y(RU&7p${R`jXjbbb|2BGOn+j1~ zP@5Os7spie-OOyAxOxnmhM888Ld8h~ z$`28>Z8xqj9C=Z@xaNpyS;NWQEc!P$k9*$S)ZrGDU+MomCn(_1%PYCtq6_Is*L*#n zaW6)v1g6gw&u6H3EC#0}s#t2ZkFoAY^(nj6!{RX8npH|isF7UC?*WzdX-&%{N(t$M z(5P@ecodp7nf3Haug}|73)q8R`O+=TN-AQd42D2=N;nYKVJDmV8tWIFF%Q_pGb(S7nYT{pW+9M9gXI`d`ZlUC=8uC_scq` zv>W2gMZhpkc5v+*Mv7Xk{&SQRTl+5q$|L=Zdu~OFyxDKO?PS90>!}vCOy1w9zfv}Z zT!baeCbJlPQ#o&?ugJ|UmBpnYys)D3DwloEN18{WW{&(}zmRF!?b^ySokuFNdXp5C z*42eh@0KRN$lCBrqy*NWv=QfyP6yCnmDCP5Cd$~qaotTkKo=v~Ii24^E7Reb1yb-O zz$JRvmucYOSMY;`wvNTaeA3~wC_YD(Sz>DrqZ>M>gvrhBXCj=YR^*JCrxI-dbtR(oDjyvFVW4D72iR-%jPPafKTKk)*2wai+Me*$Fr zs=fU1AqU8PtvL0;G1gHXNapl%$)Up|Gy7#n`vu#B@07(NtKW#dPK3Ww)dqV?F;1K( zHax^?sIhK!^$=|}yt!NbCLKDdyBk%l)%|t8dj>`2@wiA#3n9>@ z?EymMH}vt#Z%S`ao_I_CE8o2(ar~11oW*9j!A=}8aW!%GZ*Fp(R0OZFI3r{fPlmsX zN8?;;N7TY;0s=~9*Cf|UvBuk!eY*UaQPx}g_da3bGLxlNvh&!kZp}=!z@&DGCJq*8 zaMLT%py?XvhKX~;Ogh`ux)n+o9!y0sIxqkrSwe zBX{=xBwax{uyuW2Pk`#edn)R!3b~{sWp0#HvY}3`ya$I=I+8kEGfe+g^3^YtJ0(o@ zIdMl7f>EBx$y8pqR+_2m>nw<@0nyoJS$Pj&@>`j3%Q3%d}++Yvr!FX;cdb4g&Ys zQ%1jlJ!}Ti9o)}&r18-(V=6ks%@N})n6p*sqfQB_UOYPy<%EFNl@(3m_+tzWc52Ry zLwS2!><9@W3KH_XFz5^n*^6uyEOvX59v&rr-HxZ5awiv>H!c@h@nm?){<)=oPA8lhoC?}yKmN41T64|1AV@GL zlO~!0oRzaL2v_7n&E!A55rgGa@Kv!(XP=PL_NTUAp69M+-?o=sahRJ?zV7nsN)}cT~M&Isu+g-@UF5FstRu$~^tj;IC z=Obu|M9&l~XY+xCzGNZeF8!AJb0rW$f+ji}GEyVph6woxb=40PpZ!Z)Tu722Z!p`PnjMTbE|){kxU7iow=7Q zalvMAzxyBp81MvyNanvU9aNqn=Zd)$Lih}zxT*1AFM)mHq^p#eQa24i|qq>;8j#QiFKcwkAT) z54bOoM%jsL*nqqnR1@6KSP1_#lwWS`6n@)%Kfjb3@@8?C?DSR@_izT$Ink$wkBB5v zeVL2+?2cE>jvJeqHl507Y;;W`_FlbwxdwEfc?{W)TOaGMEKhm=h7d2~&12H%Fqw0h z>~55HL3#Klb~BPy)w4TE+~U|^L|^sElMfK(#%ic+FqubZL=`G`-Dzt!(n!5Gsy2Hr>+fR-Du*^iCkD!E(nT4OD8p zg4jtv0LD%zYD3ce` z+I`&XrDWfvPK4*Ppbu+LI7de|n~N&lp7{)WL4&IL?&%%6x3#~fbaAY)csv#Y)nrq5 zfA)THA+CP&F?!n6)@ZF0t=kx>eg(>IPzM}z=rZsWidzA9T>lu!2Qfer`3CM;O}FHK z+kz&o)eaXWvYLf(Lb){Rb|k=THLPaU@lY#0E&`vK3uBT<6tp${QjTPok>Sko;cJO0 z+Of2khZ9yJ#(}7!^d@0<++=)5`ui$LNS(-Hh4N!p!xe1*49R9*Qtya{h_b>mgneak zzs>cS+ECch*^Yc!9NH9_I&}?-QEfQ{$rmI z${-eH5{oj6MOnq7Y-3T5u_%{Vlt(NI*jCN=*eQd&YgX~B*ca}ncBYdH2DMs zh=-4U5ek*&0E;kjp7bI`t$D!?SgMF}R57mlLl(+H9Dy%74ZWQ#xyTkjM0)&zYngUC z(#^e#)Em+F*_3K~^FteWjDK!S5=y+^-Ynte6OXnsx#O&!b~@m#MYN~b`_JeHNh{Py zxEa6a9X{dp&e6y%3cUlo#~t=)8u_{>*EJSO%%%Dgz^TCeD~HQm%~c@gb8S z3!_I()6)F91A9i2k{k&Q8rG__<^2*hz_I8wt_Rx4v&tbl{&nx6kCi9a(A%U8_X08N zO3Uh>B3np_%(=Gso;g{97nH*UxK3QKX1AZ)((}BtZRC& zL6E%*!PLjfMC&k7YuvRiwTo)MMw__hqiD{^mg$wqQs(qkxf7F)5 z=5)00(YZCRTwd{Os<(GaOX_Bd>*NQ;5txygZOBVfsj0ZZnsCSZ(qmBG3S`MXeDsk33l5kkv}EM3qyuUUScEFFAwQ)LFw?8SS>j#G1 z%AJqhK}+SlyPXW~>Z#c7UP|;=<$X#YY^8QwZ4FwoxT_oaKDx>+-e<2gz1UF9HVrE0 zt#Qt)$!9P!D#5ZZ(?N1$#~iU~+321nSEhQoN~1t1H+{Z-!XksI|CaobL^}nN0mjxh z)H{|tsa?VlL&u;as_s_mE@Kle&!+uq)Osj8t@s6VPkZ3m?ftqE1vgnIWjzT!@@PdY z^6;+pL;@COjx2EQ4%y5=MyrbQ2Yz(ISUF=}MtL4iOZ2wF7wx4MCe;lx^R(RCJK42! zU)dGBH@XlkY_r!ii(8g^Q5J%Aa|*CbHLSuF6vKn0;sy<$gyY&R}A4 zEc?OA2J2F0dN;hE1FmPY_SInHLwjmS89hvQ??Ax?q)G2jp1qA5ZHYmTqTDSSiA=uk8glj&`%ycbeO{{x1xpajs@xq&DmF zO_s}YHuwQDAD`U%d8t1KH4BUTrx!7detuJC9{DxTp=ZUnj?PL7Sbn{;B1J>xpd zH1`wbH9?;*r`exIDTX5SC3c^;oM%eK&L8F_$u~tI9^MtS8J6eX%1`5Ft}%)np4Y@+ z>wD5GRJw{56O2Pi@V!r-5--nUNK6kaWVupgghQlA<|aSieL?1$}Q7!;KZR& zI*sk6>}s1A!r~9&SF3o%Kva@iFMJrr?{6C!<`ZKY5A(Csf-A5Kh}Ml3hHW|YaH1M= zscKkiIJ21s?JHnKmZ=m4j?x3A7tIjCTpLSyR|b|)h@+cWC%x>lUh=e_z39|e=qifIe@NU3})cP7}M4-8%&N>fPQ%`?CAfkFO{ zxe@Fv1%-1=BCuIN9RYzsfZ3y8ntq*xfwf>B~zS+ozvTJ5uQlr+kcmiz`1~iPxTcxV?{iSM|-zjyq0WN?&~P_`{;cj z%gFzbujfreor*DhnsT#Xb)aNZ$m$E@q{e>BaPZ-=k3TWvmvWt~CRLloO6byNxAkm} zxPp|=n0%nR0i5)m|E&$5Gih@4KPTd6A_+|3yPA^>Cz%3ICdM1ca0ogIe+}fpNrrR1 z+)w-h#kts!AZ<>H{7$w#%s+K5^C~qdh=@=a9AjrYa{pLI+=)Lp8wS4-}GDh z-ANkz>h_ch0m11^1$|lkfLEJofOM!{v4NHiq)t$Gco2s^pm;13QmQCtStL~wcHrFi{?)5jx28Ks;)NiY zS_fN-iFG5z=4x3gf1$%&PdjZNl&LI4Q_GV_DqA>YJ!=F1S*2FdKx&N!zg#iE%PvYsgY^v<%VDIfd-0C(oTVurGRX9+vK)b+hO<=Fjf7L3Z|r zcLtg=Wh+{ldSA$CYAP*U2e`(IUq$|!pzAazup2}IeBk)Re$3i$&gO^O>DPaMyK*3I zY}{bEJnmygylPX{dM**bfxG?JyS)~*H`R7y= z5oM_~8ggZ#}|m9LybtdBVlf{aiX*RZBzgS?onpD#QaKawc^oQ-oFLLMpHAs!jg` zBOgJdL)=c!5PWQVFp-eA_4VM9B>j6fjeAK_zA~qY&JTWL!>|KBBr~k!-A!d{$zy#Z z$uTTjvUI9bqUv7?QF*=4!YCUQi|CnDtHCMrNxjnX+4V^3jL;dKa0@1-=}d@SePsuz zMembWOVZLjYWf2A{)7d7{O&OjOIjXQ76TOpDyPhz~ zjnzW-jTDl^qF|a;I`l#ZIW>ByoJCBnmC;VWB#|}H@;C1$F{0 z3vPRRO`a!6(E;!bBo}*s%*TH^h3|o6?Zn-2EB3fvq&P>Hfst;@2rwSX(-|mJ^g@M( zT5#Bo3eatAoJvjy_U|}L#h!wcf(*}ln_uJOQ}DvB#N-@d53y2KlLz)ILgpdkMn1aP z33k=ID#>5Oqd5-^-2`f+c2)^0jF_<@(4|SiMpu>7Ky7Cx!c{Y~GcHj!<`BKEsZGV{ zAgh#M45kn`9nB7IB2$~|j59DXndU?C$cI1WyJ=o+wrS^z8Pb_)A=9{j|9+?7i{Ri~ zJ#3w)eM{>O_goBjQhNN5W(((E7>1%=8l7Uqa;5RZ)~jPue5pHxjScX3eee8?)dv>- zh&z6`g8L_K>g)+@OV9_PN0lT$)k>SGIHbCgmSRg(4WIs|l8Eh+`(S~a7yj*Z@`Obv zZvDz^3s0#mH`M;;$tu^bXH>V<7m5%2GZYiDb6gOo17a9OhGZz61*nb^Z^Ys?2A&0h zo6oo;rka9m#wRuFk8m{`^T;f??@=1i-}8yVN$bRMsGHgM_ola^9j34yb*^OVul{<$ zb>izc*J5JJ*AuzgY5=A`jw>Y`KuV9(eny2q_%{}c6JW#eE@hR4<+5hC;`19Ze#Y?v zIpBQ#I7J%QI6=zGp^^|x**RkK5*YKOhXp0D#T+hwuKnGOO|yK^YO3v!W=*ppZ92I{ zcR9IF%^E)yr+bdI5t=D8-q6uTVeTU*;P#)*Dgb~;0MEtu81aDJzRWG!_zXb=^GIrE z5j$->me(fyu^0f9puYJLhCb^$^8=2ceR760UQ<-@=@(hy7}8MzUq_XXe-ZNe*Zide zeEmxuBVYKXBvb<}o^B9Y#vk$IZyi=ZA=v1XwHk&=Y`o8$Jv_o@WY%BKhTMw1KtvgzhO$JpATILDb4CPw(HsMV6#$!$Akw!f# zHoDV}1*${BXJfuZ9Y9ytW6#tNpzOE#Hv0NKu#H-^) z_X0_&?`!&IITqpvcx-$d@<-4onwWyzFe6zPGhkoFFe(WtuH>y!hZ_TKpu$YLRnv-z zq7`8(Hhms*2Ccs=l*PxtgYXo$8|Tr5=Uy-Tj2$FRBkoD_loOBr0_lJMN!l0)3a6bE ztU2%l9z-doptdhk2vo#znc~HoV6JyW+cX#iamcg`K~B=7sMr(s(5nnnW;AZD-fZuCFTE;Wg^nBXpz+9$lXIq~X@d&+HoevLEBKAGkD-Lz@*=V%l5LF;M&I z`Oe(CyU87ug@5r`z$+gG_+@5|U^vTiQP)qHb|6}ZP*OM#$MjzKgOvZ8peY>H37RVb z@_=`k?MoD$+9|bErQ)zmH-Uk1QGUuxV^ua03Q;-M6RxQURpS`_(YZK)O2Gqtnt5LQ=u-(oyn1d$g z*=#Pe@k`9;mwz?=G}OzmxZdyCk1qg=^yr_)lfkfFIB)@AoUobPKft10dtxBF#fkzG z(}wjVCDzIxm0ljU*YwBVE88z9BME^VAF5jS?Ap~#6sA5Gm>PkCAOM9NPv*-EN(&Jl z96IqOMM%^W`2OK-=_2mU> z({~;u2#HQoI{Yi@_#gZE)xVi4J4ZzK3=nOd`~L)4yd((;ys#dIGpq;5Xx;K%#ld`o znPO{3rp5d?W{7!(PMveO^&o7nAJpTQvM8|J&plW^G2?m+KxXS1994T9e+|-|#P$Sz zS)oj3;n>J zoKuV!Ylo(#oyq`A>SM0m7vMJ)wa`oR4<78O<2$Isoxo586hGi5r}-UI^R~EaH9osO zP=y%wY35vF$^ zqr3qMlbqdXUSY1lk2D(DkGx2M9zHe;^OE!&kCO69hk@BWI--DZGa^!1QM4z~Jy8^I*=(8u0 zB!qSo)v~~5FdCV!X}9NgFT~Ju&BeM&I{;AE)sJt^7@y;2igu=RTddYLefbc%RDNj% ztBSiac?Ck1mfyU`NZie4Yk?%5&n3v93%Psq28-oEyH<8;PftCZ{k3Qw#aB5&D}AZC zgSkD|)jnB(j(%xhTa*~hiM!ehoE>w`w0vx_s$+4$Ur%; zMu^z@38HTN&WUtzK>3S@RpeF~xKtrqNvx+05P zz&m|_*-u6s#yiQN)A)oJ& zx0c{%Am=ozVPp`nZI9xBXP|s?#;cs-m8pNE1S;QYP8J{^T<%!-d(8WR+gKb90qVpV zJ96>6hXgj$%mkXia+@ZdyWEc{;RgHi45Iu|4$C$1dV?!W8UTcE5nV;!SCH-@n6VzV zxxybHz$!It;k?+~AKh9KS%a=KsQ|Qox8hz!rc|P zNcUunh0yLaG|Gw<9={>e=^u<&a5EpBz8ZLz9Z+Ik+jslzZ?CnM+M|3{q#W)Ge?!`+ z<|c@_EIn}?X$?>68Flf^Hg2Q`UiXH6)lJIk@$y6N!|h?N*`hlyGvJHi{1)Bc+N&;K z`b#hK5#Jw<_dn^SAqIHYFPEu*dcTGn09xZ}JmTm4pY8)lmn7Qc7ch8t9Y_NoJjHXn z%5s^9>in-S{*dZ015X4o$e;iW?A*72_g_fQe^50)zX)Ion8Q=-0X9p_YRm7R`DWRF zi0je~05VS@m+uh<2)`r&PwA6M;p6sgvfQ;A;!?K$E!&og@n| z3jn%mzOZ#3s2Q<_F}(pu^}=(ZKcD&L zIxv+F9-pnG1P-#uv3&XSi@&QX&^Sv$u{BMMJA>Dl5_ymO{y&x~1pYFGKfjwd;0kaK z1d!)I!{&o@qU$UR7de}+{(R>32SAeZ?hF2^oHUOyJKe7@eyg4SxEKV?1wMH*o5gUQeGx2g zxmlhB@WX03UjyIsnJMhE0xPDtl0{e7h{za=+|1kGwBWoPtuufgoH<>9M_-P=BP+YI z2^7(Cqp$b$iU2>m{T^8p&gp%L9K(RGT(oPN73J)LgZ?FEJPdXs_PLuWkPHbVBkwU_I z>qR(|cq)3NID6{6hk*o#>~9SB6h|ROIy*dBBqLF@n9Z&GDWLlv0mXNLqXS-_`(wlB zUj}_F^L;GNCu52COQF0dVGkxBFT5;9wlCe z&P8vCN^HX!jdQH0oCAY9qBtxfrVf1H?t)GvbzA@t#!wE4YZJfj@pqr?&jB=^x|{is zYy-V^Z+fU0+&8KYr>(jxl5$k=Wfrwdj(U^QvHNSC$U!h+qC?7+&ygH82A@WiZhPO(q7fRtLnxCz zH3@uTpVHF)*=2rz-SHD|9-hn3jwd7El%Z-7Z-RLWjUK2>v z^{erJt0M1mlK}Q|Yims{&NudPG{Z>Atr&2Xn5)Q|t|qy_u&i{?t;z}jb0MSO{(}q~ z7*BMlQY;nlQGiOaC_Uvlfqv5YGIk>Kj(E{b>#4GQCQG|uKVv^~!B<^C&G16F-G5riZ%)mj z>jXzCs!I157W0Cn0ACb7 zB9|zBy#Tx|?PP}^aIX;&=$GPE{`!wgOa4;E)suw1b&xj7FXh_wh6Vaf3MI8bGQeqy zL3V1p^}t3=c}v`H-@fHCI^X=uR`pf!uUxsJ5GfYbr#G0*Z=qBmV5Qzla5@RFK2m2; z!Qdgl0BA%1D?)4p)*oH=*1%jKA@;PXtX<{4Zn@)eED|$S>Qep#Z=PsOL$aUS6f&>% z$T5>j2!a^H(Jx!0uK~uw_g`UI05<@=b~7ihU8L9=sw7=jSwo6nTF6W27jG?S%5Wh4 ziF*8(?>CSfeO4xz0L?XMXDXl+mpzf>T`?;>#-cd#V^M>PsNEr2wCp`(4ie!vi*e2lRMNRGstP zPc-%Z4LVG5@6IETUXoRo7l7>I0U*sy@MqW0g@qsfzj2nN)voG9e$e}bc{CrRRP4C&u0g6=?NdaKF7 z1TfeC65#VsZV`2Ii;aITD!KzIyER07B!<^GmB4rPAEI~VNy){)i2ZLl?bHq6i?hvv zU?AeA@Lm6>Td)IHf(?ONbo_f-JarrRLhst{@`)O@zx*M>pCR&>Y^U;10uTgPO`4A} zlb7;6s&&OorW@4k+;W;zV%IHwc~X`D_(8*RqsL@Hfq{!tjj|`msWE`?V!z->nIr`F zI-F5F^BgVTEw@$uwpCnZif>Etgz1i0dOVS9f%VY_Ug3_~O_x-@8$*Ym_YicNz(6Df@1EM7IKruqhZJfVS#JQJBA_rOZ2Lc(LivhRcNB22@1&8Lx5DlKgaZf5#E| z;V05dI^jj=Ew&iNkNVc83l?|RDP3>W0^s%0G=kw7`=RaVRu&^&-ow;H+|G*2r@@AN zGwGfer}wvLSu{*+TVCh1$MTvoko$^H`gp;pZ|kO6B(J~$LbXNU3d?2L#&#;=SZtAY zfe$aLgp{g%3{RKxahUx`iA8~-x8utRJMX$1rnEut#GQG^OxSg$T@dTLDeE4KACBo3|Ct zE_hD)@9YTHA0LT3t_s#A(2A_xwVkL|KHSF^B_+BN5HON}3gnDu+l>S~x0YRZT}MkR zqORTzAqdv1aZL&$V@$nzm(&LRQdZglRd+a)Oq=yy*xqoqGp>0a_im=8e#J8~ z{mSqQz<3T4z60*96L0+Q2KURLzW+qw4T!K&c$?|1UrI$#$MSr4QX~mwT)Ss~rt+%_ zv6MLW0nIP%Ku?L_%Hl3ZH9OFb@lk$$`QcQ8eO*~544TOfw(CuiL7s6AZj)rW+@st> z{9OzDpIrTJ4>JFoJ?I;v5MB|U*wq5Sl1Cfs0b(2{ITLu62F)H|t}vMe^}GWtJ_zf# z>xwVqo0j6=w%S3DXy!dq8_d%&SnSWjS|vP`=8=%lmpa@kaa|pUHwPbU9Ubfejm8gZ zo*8*Z4N5RYbRrJcTkqM96c0khD&5x~Tlb{ot7oa$CZibm``G{qDS7Ru29MqXs)I0K zWdzmh&aX~k-7Ua@MqA4T^;Sm*_IWm)?Fy4+KZOX3$+qq( zeQqW&4GZ+}wW~*DN*dTF%H%Pkd}`!?5@I1{0#(CY6G4laPu8~D-(f6|%So}A3|<<{ z9Wht&+Ej@HmeM5&u5{IyP4boqSoJ*wXhx@aoVO2l0t;-MuwUKj1_$R-57i{o#9`fIu`6xmS;Odi%4G zmLtWp?Eo)nJ&G%{%V_Fw!))8IQx^)y$zq}2yo7@Yd7uG?+m51D}wfh`*?!B(BH=FM^(5+Y{ zUq)t3kdizwJM>VKtC-aN1j~+XHFEk_1D3uiU>2*OQ~$LZKwt#0IBUuXd4S%5PXpUN z^0_SbDYL3V)tiI1x4xJfyk`f)}|G}1RZg+ZISXwiOmm;3eU(4xmYak z2o}_X8p*aqR+3aH+n0OOy%HA{lzVJHztLVXPV67r6KKq%F=F@-KzP=2X<$*e(D<#> ztvRR8*tc2^*$$oM*bv}k6D+7?vdW3brh3*KC|unfhygZ^2C8fkMG5T$7ce!LRgryV z2dj;5Ia)kxiO8Z$L+IkJctLP5nXPG480h@h5uT&;dtqg{GM>V`Gi8>&`VkTrCCiFM zcY0(QFHuw5NmdL;aT^(8=5{<2gjUdwH&uQ5$(-VnuHAcGF6$Qo8r1=0S9m(eyq-iN z&hcJ2gVV^&&GEP|^UJ%SwFZco=T;k*Z6X+i&>6s5 z$d4dq46kWHLP+`?Bj(GxiFku$xOj9FJGe9;R}lVi;}~6-k?k?u7TOFo<2Pdcrc-3Nt(S*Zv_9v* zWUOXWOREHyj#-0`be|G!D7`d4*e!Ynqims}IBATdI)ygVw&sr_!XU7AHVQNPt|AN1 z$w9@Z{Q%}^XrZ@xB_w#RTImKiC7M^J4v0xQ{WshSIraf}s_Zn^S;DaxcWP{R-4spn zp^D21VNT2Ujj+ZOnj>eyPJ+`@a_1JQth)$&7HJ)_|i2wdHk8N+^~=dU{cd)?;9DWfuwlK{Np1 z^4=Izx~z=0Ej}Ajb*g_(L|)SL@Iv+Rkrx`~59Fsqd)iAg5f)=ta#*4612Ez*4NUV2 zfQ`H~uLZC}KF}4F{iN-k)+uy%>?srP*2oQSMikKLs)rmk)dS~yhk|v0e%XSY$ClBl zvPPvSZLemW>SKv$E(1G42G&-RSW#2a=|bw;@gta+5)>+nBzSv8yoaobira92)C2Ss z!W}Y7MN@y|3H8}E2?Q&1$rT`WVB2-n<&)c+V$Qb)$ok@>N5X`)3hQOf(ZG7S7W#Vv zRO?5(rq8K7A;Yl3I8_L4s}v>0pQ!`%i|cUf6u($~I;r_7Z<*Ibj6Z38x>+85cuk&+ zUm1Oa4cWT5jOjO;>Lwx1R88*o45C>fP0l1u&UtSMll9r1ZryPkCAc$I3T)!ClUqQa43jo@%ux#O- ziOZ2!_G|It?SC1c^G2CxX}z`PQGb|FF?m9ckunuX!^*blg(DwTb>i%|wn#0P0t<9Q zD&=QhynG_2m-!zoVDLB|J(i9J|Cm6W-#{nPcL?qcuIB4V6NK|UKaSrIshQ0dd*-$)ZY@$ zxY$1mG;XxVH3yTgdmy_?TMzf8>?@K%hbyr;K}j}>omk}jha#Z^!quJCu>2Ow_;^gn zUbj1UiFwx$YqGcbK4QJaa=!=2g5VbWA0*Fjy=SA$V}o#m!2)=b-AOeggPh7`9RLp0 zO&yH%#4S#WdF>=piG=I9^mt>Gz;}T4x}jPwYFY8=^~-{TEXsOqri795k4%tPCu4H` zPa73B_jY5)XvZXm-d;0$)jvrfryMvS;qh!N)ojziMCK$@xz7Y7 z(5<+c;yg(v|{u^CKdKGDGG~&en*RG z8px(B1y};vVd3tD2|s`$s^2@p0RpMGj(oo4UD4o!KD6k{YYuC)(Pnhw+e);L>v_g^ zKWVvJ^GEN?!>(sJ;u08%nfu$|H+0`TNeR8Ypd5gt?4n=g?8L7zGN~|+^H2S)ywPXO zbF9LlN(0&ZtR>uNFfaZKKYP;iyvBFgc5Dm`Hu|pvG_DGnmlykd@|uk6a{k%M54K`I zDPO{XFaJie{%bkkPs#`77V$zQM+Xy%jVs2AwZMWc`;e)h-pzQT~Pk;l1Za2~^P60_HrFJsH%$W-etr}Di zOsb}(PiYl!Ntw&JjM)oJem*2T3OT&fV5yg`EbTBhzqA~Sh~78xIrYp1fv;sriI~jM zO!oGE-K}SRGFJf|q4+Hc>~t!zG`^EX8@mmVzoyb3;kE@IfBx|$#aVl0^(8~>>0kHOznA;$nJ!Fw)eTW~cxF9i+xJ{3Vt;kC%n;!(@1QTI z;c~_yx8=G>(AmiA(yA>*b}<$ZC*Q6kAVq$rEx*q4<6u5^G)a6#6j@?ns4b5a$SER* z`{gW-o^W+Z>le#t_UfjV2f?=M6K4!=lgu4D=JxBuHtH0Bx|`sMv5|4xP9;_)fSvf# zTd%?is4(bHRBHWXU<;M-pU0EinHvZj^>D}s`Crhh10uPuabq6Q@Cl}o=h7|5rc52@hES0{)SH`tD6&)=UWY*I=07H8vx1d^XYOsoZVEt%QK54w3BFdej=RU z{+8ly;v>COnTo>YN3dGc!30Y~0QQ!QEM@fl{<>d;p81ePyJNdMK{$jy#l%WqWrymw z)`^!Dv*auFhq1FyTg3)-*krE2l|o4Q592z9KQv!0g7{5PK2#lvV=M#aE}&Scm2=eB z%X7-toQ`R*g+^?Q+ov}92!jZ$ z^8UAM9xh}lu%UIJRluo`^8Cr_Z=VJS$uS!Ats`yS#9`Cz_Sjsj999V=S@iWc#VLsj z(6a@XF;;al`HbL+YDxTDv?4H^4Ot7%?HQSZaUUGazP$_OqbJo(#hZ(O9=iTYa!XJMAD!JnLT_e zkuS)mR)el@`*F)rt=EdZrW<7MH~oBFt~gFL??$qw3I~+kQr{(lSj}Xuy#MIR?Q@#1 zir>AX-9G?YF9xrjv%(n!Ql2ORVj=nk2K~>;pmQl`i#r=YLOyWS0w5~08a&!w^!dI# zhu{QqM7Z9vD$dMpxbXnYG&k;Chb&&dmKzLX(YoUbWH22tMVR&ly7S^~-5&Vjml*Qj z*r4UHNfJ)8gKdtc>%O{aE^xhkfSR|tC(|SY(57_dy70Yehp)t`2)7{iPeAW`@P{N8s~6lC0DdR_OO^Ln%z6Ujh>$<6$Y z6EKZe`pmHJXb*F)Q=VVV^by7cL z*^z8^s;h_x<|ta%HayruPGAgVvd*U1fi*&pop230G)5N*3kUhl|31g0z4*wGR`ITa$t$VE}m5sV-51 zLV!kbq8%>hs{|mzdhc%>oi1RJ@$3iY3JV{;>K#)u6wUEqL-DaE3}HN^X@Y`fF_R)Q z?Es%KbvbN%p_3mZypsqfwMR%k`~GO9PETY}w}FIp0K(5;pv~gwp2=dj$rF8+lysm_ zcnrGQrr5GEls{;lQ|gSwYI&`W2=+Vzn(q}+LghKjJ-Op9CHa!*lq_7szIl;JRXMz% zGIB7Dv#~ z1k~(=I4ZWIB$kXVYASz=tsKoDY@DI$Xk4v%;GUm#Z(6s@oxX_UADq!+P5JASY@p^) zx7_U%`F)Rq7bAefnsrd$OxmtLB9R|%G*j|VKSmY*ScE#4DOh*N8dtlPt~b=h(T78R zBt=PmOY$y9OgfTwc)eS`jX)2aXqa{~Dji32fI>+J00N&S-MsQ-+fb=bFIrT8UN@Vv z^o3QX-lwlrKnX)1tzYZ%vfNB&urTI(uLpw zd+x$*vnIm93UsRlrh7KB6E^Va#1@UKjxU_~4GszcxY)RtuQnq|)XN??>UOXNcb~n` z-Y2qs<{L)gLrE7?(h72%Kn%omeWHhus@$Of0?2Yi(}>asx-zu?sENR96&9wk{aR%=6Vo>9w)Rv_4d+<@>1P z-*EVP0M4pM?Eq=8)}gsf!0zkq5klyc!z%OT>%y~M0Mbi|IVh8vS*WsN<_3Ge*Cyk#X^Eh{AJ>;QDTEm6hwi83uu#q&?8 zEvtJN3&L5*>Z-rQEw6U2cqvihVX;Nv=sXo380c!Jcp|@cHPn5-Dw?NQzaSK7H^PCW z$YEvJ$@@OGZ-#m@5W?>=8n_H>lF=vWRQ>d~9)I;KcQXWc(O)Ly>iJ?)DS9+sZX=Xx z)dhKHQ%8GyE)xyODu+(J2%~0kf8l$&UMT}W4>}Z-QD-@eMgc^j{w~mBsG)m~{V?Df z<5U)$)d1b^>|wA4(-s=6*{8}wR0(c%1g81Uc$A;j`V)-t_j8vFOU&oUPlx%9m+lwW zZ&A9O?=T(@ns)r$7g}?Qk+$mx{*d27^7cnD_5^d9t3!a9iC#Wk8THAIpUXX$b*J2o z8zY#BX~g|+fr$>H#HnuGFALy(^;}%GnyMFly4Vrd zDQo$OD$DvNd&2t_4~5tdr+lt5(UzlH%-JBR-@bjT=a3~r#(Zv7vN2ODxXr%Y#u;$9 zxJsyh?CNRcY?Nu55tw?Ok=kDlAUPCa*<$8(9(XLQ{#aq`^QXhA?z7%b`vfpDG}`I+ z(a@mD(KBnk!>*Y3=>C4;si3#TwOC4UeQA$IK>1 z35Wl!YiU|D2krr>j}`dNI8c()3Cbq-dCYu!1)xqUVDBcaK+#DqJy%MH;X>p~3c3m( zT*J$533h#;HwUBv3LMvMeR3FR%l94cFLw%IY+ECGQ(b!>)V0@*+(v6kit8jxRB_3D zL{5UyYndi((Lok~3uuivhTJ8Tev^1--8L&&8N__{OS(Xv=dwF2N!(#|U2AhP%KFE< zr&F%)S>}L1FxO=|!r4rwG~S*M()kk2X;$l*D5){;ouU||fRQuFw;NPl&k;kw%vMPKxxLuk!})b?$}e8#FD-zo(6BHF8y9qcttgd|at^%e zxia2n8qKm_EIHz+IoYDnQ)AiY4L8QS`_SQjCSJ$1CtYR)EkN>EQD6C2F81rUw7$R- zgC+4!Ks&mm^*G&;t=Wz(-wyngA81+t@ACbk&Pboh!D>Kay(smV+8Y~BX`r!0+)O2G z)_D_@nSbmRoYW?y?OsGrgr8r^6O$$@rCaE^Xg0+es(Yhtaip{7p({59VA3AL6qc!v zfZ-2>Xad(H?7bH=`zY$Yej@uG#DU_A+ekJ++(ZI^nkYXSg@lf{m$@kk%79FtuCQN`h;-(N&eda)any&I( z?URsFLTSa-t?iGV8bK)hgE5y+s5N|5Frr#2T6EuTQ|!1fSB!dp`?!rQ$QOLOLeV4$ z?-E00j+9M(xq~`QBR3DdvH>({QrZ-9<*)BoQN=|4$rNRuKKT_bEQ*~>Ns;=m0nh*B za{!E&8$XYiw*Y8z=dW2j(2X9dY`DH1PwjgVA z{syi2te0aRyy7>_tu!MoEvqGAW4i1b$x@76+JXX9sEjWnXJRJBe3sSWm)&NZa)wdp zMtRi>utuXbbBkPKnxLFfq2ay#ushLzZo`eL^C<_GHLX$CbE6jvhoXL5bAhENx)->2 zGb3vtl9R~1^2?S!!X%sToJeOo+qI^Fm1~gm&C{2H6I#2Wfza`jiVc620TL1CKQ}E$WajZeL$w>x35+5NOUCE#%$(z=`7j>sE z#!`oS0VK8C)#!77nf~32=WTO3w!a4nC7q&5{$mAqQ71Ibb*>W$8VloJ`JBN+zN!^-B)uIKOY2&nti1oyU{Q@1>Ya}#CeBD#Hoe@1#y44*RO=!?Dd!o7C76F| zXC0GXE!OQzW!RTyp3Y=)uO>$F!vJT zoRFfAR+|{9nA@L_{9`-CGQoc8xY&jYJ|`*qWap>_JK9i{<1Dj$m|~Fg?7_lo`8}Sf~$tHk^@jOB7)vp{sJBHWNyRT%1R`axdTJrtJ zZ5(&u+wP}9fAxS|m%0w$x%8bN}onrF^R**`X>6!-`^P zzT}V(VWT8zZ|X4>1RQBxzgKfsqI*SNldjIFchWs{P?*pSWaLPrgDdux8xJ!lkdOleb!!I3uX_#UxU`kc9Yvq@`Nkib0 zC|;T@8`{jtE#GzJHuE7~@SjUuo{tBpsMnR{Md28?baz73P z(<^Ih9Lisf!!K<-_0O>O8&yQUmL|My-B~VDDy!sm$gfP2!JR?&r0%xeWW){TLR^IZ z3_RiZdq6CF!_f3Qpo$gB=kzPt^-eet`iz z=A()NG$kt;Gv!C^9fl^{Y7rXTjbmyC(F5H@YIY_gNG9o^44F7Q8unP)_=34@3AM{{ zhWd(p(P*qJ;47sqDCr`V5S-4w7v%eRo8aZ2@c^tjak+R{NDG;;-zn|E z%`KRghsUC~SP^9$2HmhjJ)FGW(Zo>%F>%B{pgpC1=~~uTMs61Rl?Gs?pyH=2fRNz} zGX9nN9IOXW^m9(ped-1dO!5b!zos$osDmF1K+;Q@F76uWucyJ|aOkwz)#q;S6_<)Q z2JvCMMNx;fD_B!PrE8%9V*GAzz!%N9@rH~`X2lzIMk$`h_rZ;32d7^&>u+GR#jvTp zJA*yw<<{L~r!nJs zPae-k?#;($PXwIhkNiy*xdAaeI%db=${1vV)O6w9EFQTIVFX2IuoVcIH}B z!y~%k-?;del5$vvN?R7bc;iii-6Cw#VT<$+hwC^ZBz>4o(z&pI_bZInuqpe1b1mk97r)4vgQBb_4+_;f{T%jp725=#Qrg5w0wEPc5u9Er6Wuc z6xHc(Hxr&-D*_ovZpas3Vhc@HtWP8M`@g9;Bno*G#<_&qck^0z;k^Tz=%10s+Ycl-8gY-OzA9%rc;DNsKM#LHwl1&kaC?4drq@UkCg42$!#D*HRzl}reQx2$QmwRI_>Re13!#JauBN1PtgXnK=(Wa1K5DkC&{cc|FCG|*F+ZF%3{)F#gc2v zL)qvCh}%Z2y$3Y^ipvqHYMm`q-Q~_kv}1hUbLsSFn)^$MtVLcb{jO`~^6H%DF7|_& zsS6%O29g%*u6h|UMBgCd^sR?B0wrzFx3ESrpUH^~!^{t46xPi*y%` za!Vn+GKHH!F80l(IzMVp(HYyBR?>I5&^GF{1Cy4C zElQD*+e~4tKlG35@-i?n&_JncQ}s*AJ{!t9zR?ZY9PYz*J+YDjt9yLWxtl-Y}^N~NL}kvn?Y zLAI`EDKjh?+s_z=eD?L0=90Ngdqn@HT5_4g&~__C%ny7?UUp6tpBJaeh!b_Yx0xLg z&G9bufm%y#BS6RwioR0<99-qUul*^A_cL3#13x*qvMGL00|(dBtV{nec-5Vhz~s#= zWAt%OpftluSH#ug7uF8Tt*Vhj)yv)X{e>SXt=+&sww)#vFUC(jpRQbbWEQwzm!!Dh z+?YJn53zwmQ|rXGqt8z&I;T$6l)NOWmcN0Dh-`ly4 z@NzL~WS)h9U&rINK>nQ&&aij9lqibdy0gSplcE= zkr#A=fi|&5@O&_$@3n}(?fjid-2p|pYRE%vq$_LFiq!@B%O5ql3QUVTTHLWaM*_wb z&beALv1}Ltv=%Oil!9f5prKI3!HPekS>y>&(v^TXBBWo?X&5hIDomA~d^O94H&d^{Zqa;`M zxJqkXcAil=#L2!Qq-wg!;&ls#nQHhw?622iPMK%J=dj9rWEcn+9k&!{F0nd+6nAb-TmoKkL0hQ0V?&~k} z{3SVStOKA!wjps9sEhZ0*vtSk?SwNNTS2e5RBCS&6ET`tgUhz5JsN$*=e9j=EMAbj zCA0T^`_&$G_ga3ZNqu@=%w)v|rb>^~WZ;fv`J%j$c6ZouUZ;$9fA|}xIOH-uz=@kt z?+a3NT(uw&*;Wo*gOoZdyEzdUM0e^%`^d;2)#uk1{^^&~=HAM#oPlDs$7?D~{w91+ zYplRa{gtC7a9kZfJ)@3FH1%q}34C6f7|!*B4^XjEhyTA?=<2N}J*z0JiibF+phWz*;0$S|>U6j;M~87% zn)#kpEi0noYmLG|v+FX|`E~xS=M2tF1!G3Bp?fK63s97Wp#)Q5vr4KOn~UeEAg$D) z=73UTg}g+peBFKhlnwMlo`d)SO&q6%d~rureenpNHnt9VSC4BJFb-JG!!tf`^s`dq zVT1m-w=;^Q0<&BEvPQ`}@&HWKe%KFaQn{;D{xM(aDolCZcr!Q+;_}8o@W6ar`yp3J zgAP)C_h{y2>dTtEF?r-&s<&J)qm7atKlC>x`;oo7EM2B*xLZ)QDznS!OY$J(Y%Q5F zbH5%46`>cRXG1GjW*Ot0uXvxiY$^+yteVpor`D+Hdmm2{(ry3Pyt9^I0!mfdzzCZm zm-ejrChcDuL^QOtUtCB1Aasi_$wt>k80B#YfGAX2*M{Fo2#5z*=hfDiJqk$%_xi#f z^s+Zwy4nEJwoeC?O4Ia!L`C=g*J6NBQpi*EYjFJP2PC9v=Xidr14e^?d(ZthY5?5j z_w`i&SgB*o*&Tn?Sc7#?l!%#_OZRxKL{)0j;W z=Ekt>$i?-e$5g3|9=bH=Raf4!qTono#g)+9t1AWZE5F~e3+W-{Q#E@!b?26IS%9Hs z*7aB`d5h#ts)VJnr;X z%WbJ~lG!xsJ>WVnp$fxsoklDcf_75?A-$sHvx#+LIyfOtU?zTM~iwL+jJ4^9Yy6`0|vllH)Z^3vNrR0#3-!OmB}MK=1Ynbrm83Un#S znn289D`QMhyh$-N$$$SGJZS3qlZeHg2Cb?FQtSzoFfYp38j@lv`naMPqAGh~s^nE; zORs5y|5BfHtDoM~K2Z`B|7K-@qBFCz*d>Fx7@IMnPz*hKscA~5(Q9d-=xAcHEtcff zdYX4wx&iAYZi}y^mge|ogr@F`O9W90v!ZtQU36j6@9m{sE4e-Sm&@rhUkO!$_WP4l z`lh9zds|))?E=47|ERGyEQ|k`lAoi~Ib~Qkd#MB1CE6Twmglpc4(ODw1CzdeXwE(d zVATa4LVjKKcW{8fsb_cU3!uqy=bGI=BxnaXo;(XeCh&wU?>8q7&6gT_8AdwtvawWw zgv1(DPcyLeL+6OL2hhD#|DNu#Bgwq>PJX@ZbZO%)1G+s$TU?>SviV(>R_6h{mTNC` zVtsSrw5M0dRlFL(AgKbHl;jWQ+`)M_itcM=%eL~Ze#tF&M0Ub`r`pIM<(u6GwY6=x z;%pTR3KVe}6TB1KM;;we_{65Xb)C(-z=KLyxNO;eiV(Z6|DZ!{@fe*kSa5LLqD!Z- zRprp8OS*2GMZ9{Iqo^I2csRzE{$#y8|JrECj*a(0?&i#p^HZd$c$kZ* zE;I}!A>8g8MjMO6cxeg{c{XJyX(uU^4k_y_oLg46aOXvVG{EE$k zsDT~xs{H-7IxkJ&ex-%y#=KF$rIqP2C_laJ8=cr}X;_{K@>V<6PYaqW=vB9}9n!Kh z(Us_5XmcP%>|QT%sM9cf99NtqS!EbrrpR_c@-y?nsf7!AR5ctd+L^7B(+XwvW`%Sv zT{~r$;Hgo#e=?y;Jio(4)^z9Xz@ISAALh&g=1FhsCp}*U+EBErOh0M7cm6=BgLlq< zcS3y)_1gIsbGP!Tsjg{smzO=S^#_jKbCfEwAh(Kejq3!s%c%+%OYW|29L zL}m{9U_*0L+GuH_f-Y|EjmcGhE)jH*(a7aj%*Pqf=)~O=Wm!L*y<~>;FOOQl{kZrd zaHQ~$<7-2R!PSNY*`Jc#Sw)@GuV1H2I+{7;OXk|M;J(MEm|krv9fwrERHO}=%y8Cv zU1Gm4DF(5!_E=F>)3`oIARUPxo+WyzweR+d1odD`{3mnxYi%8%BF9{2$!$TQ z-^%L1a5FkgX;a(VH-DT)JNvCA{rBqkpB2LRJ4Rv09!9>LM#IdHmVl2ciw5DugFT*qnlnuC{d>T+_(UQ+h@qRVU2$NiJDE?hMGm@8MTZMIBYa%`d!UPydsfRjL`Cr z+Wa_(jJWLwkR0BGhl}+0_j5}~41aHFVT^90`%JbzUe!Ai?{tjwWl;zi89^OG^7Zm# zN=twqa}p&zU&7WxXR`Z3MlELFFsPCmcz}i9hAw;5Mu|*WE$qMj@`{e9gJIi^1kf z5_*C#A?Lv^bJR$cNjQEIT8@|)c|gi?1vL_5URvI04C?vNer49tXN-TascX!i`zcIV zcoC(|DwZu0mei*apFGp4&AtA1zxkrQ?;8q=c4wLT&AJEIUxB#1a~T8GdFhxg+rTGC zp?il}xS&kcM19E6i^ADZ(>$K!GFzyo6eu&kKl2-5h)-L?bSPUL!arvRhQNk_o2Gxwtch>zdPakXh3g@v4Q| zL{&#hJNavsNNP*gkBu9KoXbr%%cWDC`+nWb#k^t8Keq9{iidUGo5kL1K4_ydr*5Cc z6_<|*ag8hwcDpIM7N)+};se z#q4Zw{k1g8u(j=-aPxOi)&~hPNbk3)y3fShtB8vb?dGZR&qS$J1U00$d1`;RWa{`q z@-u9O&3pU@cfw^yotwO_pdTQP%uL+FyL zA`J86;{#wOm=aJZx3$evR#v`j9xR0fW`QBe?eRkG7B|jjY+f0Ya-02*9LBH#%7Dn;?m0=qoE-MBVBDO*0VU1*KKwV0tQZ`LjKLme=7R+a7*# z*D*P~gYnHxow_v3o(QS#q2)+6PXmsQq^g8)3{8KqSrDJhakqaxUKk-_UsJ69^lXzQ zy-B{#N8C;e;fDQGZ6f>%#UM;ksIP0Z!0RUWTP8wMeqwX-4}~W}fo}$}D3gMtIg2Gv zU-P(pJ>|WJ==^BKwIUI%%fj~CHz%j^>J|^(jL&pT=6&pTSQ%Iam#?+?kphl{Wa$0h ztOt6ewR)9cw|yJ7%Ne)A%pE*3{ev1b6EB#jFBUNsY;hS~seu$VkQ^JL0CwK3Mv=HYVw61Ao?}AN9yk|m z%Ah?fy(D*ImrP#5F80}7fZ9`3Tbtvq)WR~AWBu09zHL)#K@ghUs>zlW8c*td8DNWi zT(P#3G|U#i6%Q{CMH%Y$j2x2OHmi&qi4k8I;3cSBM7{+5EGAf@UvZ_q)d!0}-yI4Z zF-7?0%9?ER3i#tWCPf2YX}z*CY;nLAXe|WDAiyCEw@hcBQOJ z*O>SEEag-gu;}>qT&``Hso;wj(vl4_&QVcZ)7N;cR1suXZ{Ap!(TlkS!7i_fs=^dU zm1#7_*1Pms(y5!T+Ue!KFmH~CR(e?S^gw0K!Jj-q>9)M_a>%)G(saK;u zG-!Dj5UM7`^Q#{We=ot=e{p>T+OVE*V2HdnM++4PPn0!0^bdF z$TPoAj0;q}Zh>aKa{1$3Lx~!bkh5N>ig=rcO}&{=#lXVcG}i1I=4h#)z8S$wd}d{F zXQ|f;7USHjndz@en^d8EmDMv#hLh1+dix&H`~(BnqiW0cT@HW$`FPTr?d&yW(W`nP zglLB!WkvcDkS#UtaZAgn;=w$yc^`8RCS&eR$fKxlhRah&r}28@9qo$X(bI#-Ts2ut zeU?FVK-OvLlEEL^Q@Z2fn@w#Om_q0zHKNnk-f}?!6lM?;H#G+Q!>V9_5GA{qaS9HGKV?*YME7~^?BV;bIz*EkIuY9o=*UPt!ns54gF{=5VnmzjH zev5TSruqepZXSW1Qu1tLtE2Wr-`JiQo43dA$8L{b~34;U6W zr#|eU|JYz~*#UB;#v}4$(O3p2(61=$sDOJQvpeRc3oO;5`FkiXF80Pt^*)_-`|xLh zJFUn;>tnp1ns}Nslk>xI%(o8M;Q`FDYxM5eXPXcSoC3W1)}G!b99vuOYpmdqI^5&s zurs)LC_|S7%7&X}+s9Gz*=22f*Ut281}euwcOR&DU04TqB2}L`o%T>*kx`AoI02^X zTdb~E(Te1=xIGHf$@1Nc!j0y!8Mq+Rf9G{64TtMzzSy$XlGa-qzvEAekoMEa<#gva zKJ zPeBx*$`!1Mnf!H#+}^Xp-mF8NFaD4N1BO%nBpLi&`u`Lmd_tan|IY36d1C*Q65Iip z{8`0LoRG&syO_-|yNYQVihRyr^KZ!DE!_yiryiJ9!x`sD*2Ih@+tUevvJZ#QVITxbcn zZ^@h%ZNaK>XG7>s-al**4BWhQ?f3Q%;~eY>UoM#Z`tI0$Pl0<>`NhQUad2=nt-SpB z%Y)Ug$-gy!+YLzRSpksV)F;b@07oYEiQYdL84*DB*Hvw190l+n8Mv^2R6qZC^}k%> ztKx~2rfUhH+4*lu(f`^J0AbdDQA5an3b9^O`W?7%;uN3euYL4i@oC`A+<64xJ!j(p zF@IOT6ROYOt`-11K(Z%q(71DZBd7eoDLyrwID)AK;0VS4a)h5Et`Y2407oE;J9!`z`nr0PPNqYoST!*=ew0ld9@?^^@Sx~K|bAm8kpX_^;3Ka{2nsKTT4UzcV*mlJ3!T+ z+-)B2V?qJg+|!qlE##DKf~Vf`!ig+C0#HN$H}&kNBI!BK^D02Fx|99j7q_65DtV3> zLitxOi;^}YF!lHV9~*&DB|4y&z4y8teUTuq;JR>4AmGTR0s>97mp@3fX?)D%s(BnK zkhmm{9sCr>?Z{h*X)w)Tt@v`b)CT}F1|LZ7B$s?y<5}A8ukzoQIb2zRo2*b2Nz-S9 zLa$+&pa^fD>Vibp2zg?L{tgTDG*tts4oEd6a- z;3`90Pug&=HS3z0=-s=a8hx0~D(t<&LEZb@zf!$)4{y#&=VZsKEytCXmAkJ9ONa5@ zQYX{*P-v4o@{|-WdMDbRH;KHkH0bmV+PiVW$*2vPnf#yK=Uw;-zW3x*c_JXR$Zq$y z@*ePc2X4{&1i+p70^=9iq8sy5Kc4n5T+MeuA>jNXxp>v`ar+br4S!wjz>R{ADME~S zP@eIZWVCa4IihW8r2+4`-KP&9hXgawl*CsyA3d$m*opS9Hl~Z*D|&ZU$SAYH>&rQ} zmu{pzya9aJqZ00!2KSh_fI5BoiolS`}wen6?ISz~;nKM*b)gp;zZqTUBxztvBSEQ`Rda zgpf9x)x1=C`nJoReE$FO!X6UrzI!|xBzb{)-!OZ%GMY8TEa-`ps0BHX!Vx@{alG2% z^2bNxSYui37-7>pum{Gvp>6DEdTuX&di+xx@N$zMpdxtP(D)x^#+4H)&GXA&HGzom z`T^+Ii11E=O#8$3{rbBybCPkI5jjN1JRX~)d1>TxfVW;uX9VS zCI)2x$-H?CPm1nB#z-<-f1*MYP9__⁣L~^sz$halIrz3qdn4uLsr-Oe}*;ia;x2 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 MKe_G2?Fl&hZ|=0c(*OVf literal 0 HcmV?d00001 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 0000000..2f0628a --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,52 @@ +name: 🧪 Vitest Unit Tests +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + unit-tests: + name: Run unit tests + timeout-minutes: 10 + runs-on: ubuntu-latest + steps: + # we use pinned versions because there are safer to use: https://x.com/paulmillr/status/1900948425325031448 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + name: 🛎️ Checkout repository + + - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 + name: 📦 Setup pnpm + + - uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # 4.3.0 + name: 📚 Setup Node.js + with: + node-version: lts/* + cache: "pnpm" + + - name: 🚚 Install dependencies + run: pnpm install + + - name: 🧪 Run Vitest tests + id: vitest + run: pnpm vitest run --reporter=verbose + + - name: 📧 Send email on failure + if: failure() + uses: dawidd6/action-send-mail@611879133a9569642c41be66f4a323286e9b8a3b # v4 + with: + server_address: smtp.gmail.com + server_port: 587 + from: GitHub Actions + to: ${{ secrets.EMAIL_USERNAME }} + username: ${{ secrets.EMAIL_USERNAME }} + password: ${{ secrets.EMAIL_PASSWORD }} + subject: ❌ Unit Tests Failed for ${{ github.repository }} + body: | + Unit tests for ${{ github.repository }} have failed. + + Branch: ${{ github.ref_name }} + Commit: ${{ github.sha }} + + For more details, please check: + - GitHub Actions run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/.prettierrc.js b/.prettierrc.js index fafae7a..b6049d4 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -2,7 +2,15 @@ /** @typedef {import("@ianvs/prettier-plugin-sort-imports").PluginConfig} SortImportsConfig*/ const config = { - trailingComma: "es5", + trailingComma: "all", + singleQuote: false, + semi: true, + arrowParens: "always", + bracketSpacing: true, + endOfLine: "lf", + printWidth: 80, + tabWidth: 2, + useTabs: false, plugins: [require.resolve("prettier-plugin-tailwindcss")], }; diff --git a/README.md b/README.md index a16d5b8..abd863c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,19 @@ -# [EasyInvoicePDF](https://easyinvoicepdf.com) +# 🧾 [EasyInvoicePDF](https://easyinvoicepdf.com) -[EasyInvoicePDF](https://easyinvoicepdf.com) – Free & Open-Source Invoice Generator | Live Preview, No Sign-Up, Runs in Your Browser. +> Free & Open-Source Invoice Generator. Create professional invoices instantly in your browser with live preview, multiple templates, and no sign-up required. **[Try it now → easyinvoicepdf.com](https://easyinvoicepdf.com)** -❤️ Love EasyInvoicePDF? Help keep it free and open-source! [Buy me a coffee](https://buymeacoffee.com/vladsazon) to support new features, better templates, and continued maintenance. Even a small contribution makes a big difference. Thank you for being part of this journey! ✨ +## Features + +- ⚡ **Live Preview**: See changes in real-time as you type +- 🔗 **Shareable Links**: Send invoices directly to clients without attachments +- ⭐ **No Sign-Up Required**: Start creating invoices immediately without any registration +- 📱 **Browser Only**: No server uploads, your data stays private +- 🌍 **Multi-Language**: Support for 10+ languages and all major currencies +- 🧮 **European VAT**: Automatic VAT calculation and formatting +- 🎨 **Multiple Templates**: Including modern **Stripe-style design** +- 📄 **Instant PDF**: One-click download ready for printing or sending + +**❤️ Support the project**: [Buy me a coffee](https://buymeacoffee.com/vladsazon) to help keep EasyInvoicePDF free and open-source! #### Default Invoice Template @@ -10,16 +21,7 @@ #### Stripe Invoice Template -stripe template - -## Features - -- **Live Preview**: See your invoice update in real-time as you make changes, ensuring it looks exactly how you want. -- **Shareable Links**: Generate links to share your invoices directly with clients without sending attachments. -- **Instant Download**: Download your invoice as a PDF file with one click, ready to be sent or printed. -- **Browser Only**: Runs entirely in your browser—no server-side processing or data storage. Your data stays private and secure. -- **Multiple Languages & Currencies**: Create invoices in multiple languages with support for all major currencies and automatic formatting. -- **European VAT Support**: Automatically calculate European VAT rates and totals for your invoices. +stripe template ## Demo Video 🎥 diff --git a/e2e/about.test.ts b/e2e/about.test.ts index 55b4d05..8957b9e 100644 --- a/e2e/about.test.ts +++ b/e2e/about.test.ts @@ -14,7 +14,7 @@ test.describe("About page", () => { await expect(page).toHaveURL("/en/about"); await expect(page).toHaveTitle( - "About | Free Invoice Generator – Live Preview, No Sign-Up" + "About | Free Invoice Generator – Live Preview, No Sign-Up", ); const header = page.getByRole("banner"); @@ -35,19 +35,19 @@ test.describe("About page", () => { level: 1, name: "Create professional invoices in seconds", exact: true, - }) + }), ).toBeVisible(); await expect( heroSection.getByText( - "EasyInvoicePDF is a free, open-source tool that lets you create, customize, and download professional invoices with real-time preview." - ) + "EasyInvoicePDF is a free, open-source tool that lets you create, customize, and download professional invoices with real-time preview.", + ), ).toBeVisible(); await expect( heroSection .getByText("No sign-up required. 100% free and open-source.") - .filter({ visible: true }) + .filter({ visible: true }), ).toBeVisible(); const video = heroSection.getByTestId("hero-about-page-video"); @@ -55,7 +55,7 @@ test.describe("About page", () => { await expect(video).toBeVisible(); await expect(video).toHaveAttribute( "poster", - `${STATIC_ASSETS_URL}/easy-invoice-video-placeholder.webp` + `${STATIC_ASSETS_URL}/easy-invoice-video-placeholder.webp`, ); await expect(video).toHaveAttribute("muted"); await expect(video).toHaveAttribute("loop"); @@ -66,7 +66,7 @@ test.describe("About page", () => { const videoSource = video.locator("source"); await expect(videoSource).toHaveAttribute( "src", - `${VIDEO_DEMO_URL}#t=0.001` + `${VIDEO_DEMO_URL}#t=0.001`, ); await expect(videoSource).toHaveAttribute("type", "video/mp4"); @@ -75,25 +75,25 @@ test.describe("About page", () => { await expect(featuresSection).toBeVisible(); await expect( - featuresSection.getByTestId("features-coming-soon") - ).toHaveText("Pro version and API coming soon"); + featuresSection.getByTestId("features-coming-soon"), + ).toHaveText("E-invoices support coming soon"); await expect( featuresSection.getByRole("heading", { level: 2, name: "Everything you need for professional invoicing", exact: true, - }) + }), ).toBeVisible(); await expect( featuresSection.getByText( - "Our simple yet powerful invoice generator includes all the features you need to create professional invoices quickly." - ) + "Our simple yet powerful invoice generator includes all the features you need to create professional invoices quickly.", + ), ).toBeVisible(); await expect( - featuresSection.getByText("Pro version and API coming soon") + featuresSection.getByText("E-invoices support coming soon"), ).toBeVisible(); // check FAQ section @@ -105,7 +105,7 @@ test.describe("About page", () => { level: 2, name: "Frequently Asked Questions", exact: true, - }) + }), ).toBeVisible(); await expect(faqSection.getByText("What is EasyInvoicePDF?")).toBeVisible(); @@ -120,13 +120,13 @@ test.describe("About page", () => { level: 2, name: "Subscribe to our newsletter", exact: true, - }) + }), ).toBeVisible(); await expect( subscribeFormSection.getByText( - "Get updates on new features and improvements from EasyInvoicePDF.com" - ) + "Get updates on new features and improvements from EasyInvoicePDF.com", + ), ).toBeVisible(); const subscribeForm = subscribeFormSection.getByTestId("subscribe-form"); @@ -140,7 +140,7 @@ test.describe("About page", () => { await expect(subscribeFormEmailInput).toHaveAttribute("required"); await expect(subscribeFormEmailInput).toHaveAttribute( "autocomplete", - "email" + "email", ); const subscribeFormButton = subscribeForm.getByRole("button", { @@ -180,18 +180,18 @@ test.describe("About page", () => { await expect(footer.getByText("Subscribe to our newsletter")).toBeVisible(); await expect( - footer.getByText("All emails will be sent in English") + footer.getByText("All emails will be sent in English"), ).toBeVisible(); const newsletterForm = footer.getByTestId("subscribe-form"); await expect(newsletterForm).toBeVisible(); await expect( - newsletterForm.getByPlaceholder("Enter your email") + newsletterForm.getByPlaceholder("Enter your email"), ).toBeVisible(); await expect( - newsletterForm.getByRole("button", { name: "Subscribe" }) + newsletterForm.getByRole("button", { name: "Subscribe" }), ).toBeVisible(); // now check all the rest of the footer links @@ -238,7 +238,7 @@ test.describe("About page", () => { await expect(shareFeedbackLink).toBeVisible(); await expect(shareFeedbackLink).toHaveAttribute( "href", - "https://pdfinvoicegenerator.userjot.com/?cursor=1&order=top&limit=10" + "https://pdfinvoicegenerator.userjot.com/?cursor=1&order=top&limit=10", ); await expect(shareFeedbackLink).toHaveAttribute("target", "_blank"); @@ -276,19 +276,19 @@ test.describe("About page", () => { level: 1, name: "Créez des factures professionnelles en quelques secondes", exact: true, - }) + }), ).toBeVisible(); await expect( heroSection.getByText( - "EasyInvoicePDF est un outil gratuit et open-source qui vous permet de créer, personnaliser et télécharger des factures professionnelles avec aperçu en temps réel. Fonctionne entièrement dans votre navigateur." - ) + "EasyInvoicePDF est un outil gratuit et open-source qui vous permet de créer, personnaliser et télécharger des factures professionnelles avec aperçu en temps réel. Fonctionne entièrement dans votre navigateur.", + ), ).toBeVisible(); await expect( heroSection .getByText("Aucune inscription requise. 100% gratuit et open-source.") - .filter({ visible: true }) + .filter({ visible: true }), ).toBeVisible(); // Check Features section in French @@ -296,11 +296,11 @@ test.describe("About page", () => { await expect(featuresSection).toBeVisible(); await expect(featuresSection.getByTestId("features-badge")).toHaveText( - "Fonctionnalités" + "Fonctionnalités", ); await expect( - featuresSection.getByTestId("features-coming-soon") + featuresSection.getByTestId("features-coming-soon"), ).toHaveText("Version Pro et API bientôt disponibles"); await expect( @@ -308,7 +308,7 @@ test.describe("About page", () => { level: 2, name: "Tout ce dont vous avez besoin pour une facturation professionnelle", exact: true, - }) + }), ).toBeVisible(); // check subscribe form section in French @@ -320,13 +320,13 @@ test.describe("About page", () => { level: 2, name: "Abonnez-vous à notre newsletter", exact: true, - }) + }), ).toBeVisible(); await expect( subscribeFormSection.getByText( - "Recevez des mises à jour sur les nouvelles fonctionnalités et améliorations de EasyInvoicePDF.com" - ) + "Recevez des mises à jour sur les nouvelles fonctionnalités et améliorations de EasyInvoicePDF.com", + ), ).toBeVisible(); // Check footer in French @@ -335,19 +335,19 @@ test.describe("About page", () => { // Check newsletter subscription form in French await expect( - footer.getByText("Abonnez-vous à notre newsletter") + footer.getByText("Abonnez-vous à notre newsletter"), ).toBeVisible(); await expect( - footer.getByText("Tous les emails seront envoyés en anglais") + footer.getByText("Tous les emails seront envoyés en anglais"), ).toBeVisible(); const newsletterForm = footer.getByTestId("subscribe-form"); await expect(newsletterForm).toBeVisible(); await expect( - newsletterForm.getByPlaceholder("Entrez votre email") + newsletterForm.getByPlaceholder("Entrez votre email"), ).toBeVisible(); await expect( - newsletterForm.getByRole("button", { name: "S'abonner", exact: true }) + newsletterForm.getByRole("button", { name: "S'abonner", exact: true }), ).toBeVisible(); const footerLinks = footer.getByTestId("footer-social-links"); @@ -395,21 +395,21 @@ test.describe("About page", () => { level: 1, name: "Erstellen Sie professionelle Rechnungen in Sekunden", exact: true, - }) + }), ).toBeVisible(); await expect( heroSection.getByText( - "EasyInvoicePDF ist ein kostenloses Open-Source-Tool, mit dem Sie professionelle Rechnungen mit Echtzeit-Vorschau erstellen, anpassen und herunterladen können." - ) + "EasyInvoicePDF ist ein kostenloses Open-Source-Tool, mit dem Sie professionelle Rechnungen mit Echtzeit-Vorschau erstellen, anpassen und herunterladen können.", + ), ).toBeVisible(); await expect( heroSection .getByText( - "Keine Anmeldung erforderlich. 100% kostenlos und Open-Source." + "Keine Anmeldung erforderlich. 100% kostenlos und Open-Source.", ) - .filter({ visible: true }) + .filter({ visible: true }), ).toBeVisible(); // Check Features section in German @@ -417,11 +417,11 @@ test.describe("About page", () => { await expect(featuresSection).toBeVisible(); await expect(featuresSection.getByTestId("features-badge")).toHaveText( - "Funktionen" + "Funktionen", ); await expect( - featuresSection.getByTestId("features-coming-soon") + featuresSection.getByTestId("features-coming-soon"), ).toHaveText("Pro-Version und API in Kürze verfügbar"); await expect( @@ -429,7 +429,7 @@ test.describe("About page", () => { level: 2, name: "Alles, was Sie für professionelle Rechnungsstellung brauchen", exact: true, - }) + }), ).toBeVisible(); // Check footer in German @@ -439,21 +439,21 @@ test.describe("About page", () => { // Check newsletter subscription form in German await expect(footer.getByText("Newsletter abonnieren")).toBeVisible(); await expect( - footer.getByText("Alle E-Mails werden in englischer Sprache versendet") + footer.getByText("Alle E-Mails werden in englischer Sprache versendet"), ).toBeVisible(); const newsletterForm = footer.getByTestId("subscribe-form"); await expect(newsletterForm).toBeVisible(); await expect( - newsletterForm.getByPlaceholder("E-Mail eingeben") + newsletterForm.getByPlaceholder("E-Mail eingeben"), ).toBeVisible(); await expect( - newsletterForm.getByRole("button", { name: "Abonnieren", exact: true }) + newsletterForm.getByRole("button", { name: "Abonnieren", exact: true }), ).toBeVisible(); const footerLinks = footer.getByTestId("footer-social-links"); await expect( - footerLinks.getByRole("link", { name: "Funktionen", exact: true }) + footerLinks.getByRole("link", { name: "Funktionen", exact: true }), ).toBeVisible(); }); @@ -473,7 +473,7 @@ test.describe("About page", () => { header.getByRole("link", { name: "Aller à l'application", exact: true, - }) + }), ).toBeVisible(); await expect(page).toHaveURL("/fr/about"); }); diff --git a/e2e/buyer.test.ts b/e2e/buyer.test.ts index a71f48d..20c61ef 100644 --- a/e2e/buyer.test.ts +++ b/e2e/buyer.test.ts @@ -44,7 +44,7 @@ test.describe("Buyer management", () => { // Verify VAT visibility switch is checked by default await expect( - manageBuyerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0) + manageBuyerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0), ).toBeChecked(); // Toggle VAT visibility switch @@ -59,7 +59,7 @@ test.describe("Buyer management", () => { .fill(testData.notes); const notesSwitch = manageBuyerDialog.getByTestId( - `buyerNotesDialogFieldVisibilitySwitch` + `buyerNotesDialogFieldVisibilitySwitch`, ); await expect(notesSwitch).toHaveRole("switch"); @@ -71,12 +71,12 @@ test.describe("Buyer management", () => { await expect( manageBuyerDialog.getByRole("switch", { name: "Apply to Current Invoice", - }) + }), ).toBeChecked(); // Cancel button is shown await expect( - manageBuyerDialog.getByRole("button", { name: "Cancel" }) + manageBuyerDialog.getByRole("button", { name: "Cancel" }), ).toBeVisible(); // Save buyer @@ -84,7 +84,7 @@ test.describe("Buyer management", () => { // Verify success toast message is visible await expect( - page.getByText("Buyer added successfully", { exact: true }) + page.getByText("Buyer added successfully", { exact: true }), ).toBeVisible(); // Verify buyer data is actually saved in localStorage @@ -123,13 +123,13 @@ test.describe("Buyer management", () => { if (desktopTooltipExists) { // Get desktop tooltip icons and hover over the first one because we use tooltip const desktopTooltips = buyerForm.getByTestId( - "form-section-tooltip-info-icon-desktop" + "form-section-tooltip-info-icon-desktop", ); await desktopTooltips.first().hover(); } else { // Get mobile tooltip icons and click the first one because we use popover const mobileTooltips = buyerForm.getByTestId( - "form-section-tooltip-info-icon-mobile" + "form-section-tooltip-info-icon-mobile", ); await mobileTooltips.first().click(); } @@ -138,7 +138,7 @@ test.describe("Buyer management", () => { const nameInput = buyerForm.getByRole("textbox", { name: "Name" }); await expect(nameInput).toHaveAttribute( "title", - "Buyer details are locked. Click the Edit Buyer button (Pencil icon) to modify." + "Buyer details are locked. Click the Edit Buyer button (Pencil icon) to modify.", ); // Buyer Name @@ -147,18 +147,18 @@ test.describe("Buyer management", () => { // Buyer Address await expect( - buyerForm.getByRole("textbox", { name: "Address" }) + buyerForm.getByRole("textbox", { name: "Address" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - buyerForm.getByRole("textbox", { name: "Address" }) + buyerForm.getByRole("textbox", { name: "Address" }), ).toHaveValue(testData.address); // Buyer VAT Number await expect( - buyerForm.getByRole("textbox", { name: "VAT Number" }) + buyerForm.getByRole("textbox", { name: "VAT Number" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - buyerForm.getByRole("textbox", { name: "VAT Number" }) + buyerForm.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(testData.vatNo); const vatNumberSwitch = buyerForm.getByTestId(`buyerVatNoFieldIsVisible`); @@ -168,30 +168,30 @@ test.describe("Buyer management", () => { // Buyer Email await expect( - buyerForm.getByRole("textbox", { name: "Email" }) + buyerForm.getByRole("textbox", { name: "Email" }), ).toHaveAttribute("aria-readonly", "true"); await expect(buyerForm.getByRole("textbox", { name: "Email" })).toHaveValue( - testData.email + testData.email, ); // Buyer Notes await expect( - buyerForm.getByRole("textbox", { name: "Notes" }) + buyerForm.getByRole("textbox", { name: "Notes" }), ).toHaveAttribute("aria-readonly", "true"); await expect(buyerForm.getByRole("textbox", { name: "Notes" })).toHaveValue( - testData.notes + testData.notes, ); const notesInvoiceFormSwitch = buyerForm.getByTestId( - `buyerNotesInvoiceFormFieldVisibilitySwitch` + `buyerNotesInvoiceFormFieldVisibilitySwitch`, ); await expect(notesInvoiceFormSwitch).toBeChecked(); await expect(notesInvoiceFormSwitch).toBeDisabled(); // Verify the buyer appears in the dropdown await expect( - buyerForm.getByRole("combobox", { name: "Select Buyer" }) + buyerForm.getByRole("combobox", { name: "Select Buyer" }), ).toContainText(testData.name); // ------- TEST EDIT FUNCTIONALITY ------- @@ -199,31 +199,31 @@ test.describe("Buyer management", () => { // Verify all fields are populated in edit dialog await expect( - manageBuyerDialog.getByRole("textbox", { name: "Name" }) + manageBuyerDialog.getByRole("textbox", { name: "Name" }), ).toHaveValue(testData.name); await expect( - manageBuyerDialog.getByRole("textbox", { name: "Address" }) + manageBuyerDialog.getByRole("textbox", { name: "Address" }), ).toHaveValue(testData.address); await expect( - manageBuyerDialog.getByRole("textbox", { name: "VAT Number" }) + manageBuyerDialog.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(testData.vatNo); await expect( - manageBuyerDialog.getByRole("textbox", { name: "Email" }) + manageBuyerDialog.getByRole("textbox", { name: "Email" }), ).toHaveValue(testData.email); // Verify visibility switch state persisted in edit dialog await expect( - manageBuyerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0) + manageBuyerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0), ).not.toBeChecked(); // Verify notes text await expect( - manageBuyerDialog.getByRole("textbox", { name: "Notes" }) + manageBuyerDialog.getByRole("textbox", { name: "Notes" }), ).toHaveValue(testData.notes); // Verify notes visibility switch is checked const notesDialogFormSwitch = manageBuyerDialog.getByTestId( - `buyerNotesDialogFieldVisibilitySwitch` + `buyerNotesDialogFieldVisibilitySwitch`, ); await expect(notesDialogFormSwitch).toHaveRole("switch"); @@ -252,18 +252,18 @@ test.describe("Buyer management", () => { // Verify success toast for update await expect( - page.getByText("Buyer updated successfully", { exact: true }) + page.getByText("Buyer updated successfully", { exact: true }), ).toBeVisible(); // ------- TEST UPDATED INFORMATION IN INVOICE FORM ------- // Verify updated information is displayed await expect(buyerForm.getByRole("textbox", { name: "Name" })).toHaveValue( - updatedName + updatedName, ); // Verify VAT visibility is now enabled await expect( - buyerForm.getByTestId(`buyerVatNoFieldIsVisible`) + buyerForm.getByTestId(`buyerVatNoFieldIsVisible`), ).toBeChecked(); // Verify notes visibility switch is unchecked @@ -305,7 +305,7 @@ test.describe("Buyer management", () => { // Verify buyer was added const buyerForm = page.getByTestId(`buyer-information-section`); await expect( - buyerForm.getByRole("combobox", { name: "Select Buyer" }) + buyerForm.getByRole("combobox", { name: "Select Buyer" }), ).toContainText(testData.name); // Click delete button @@ -315,8 +315,8 @@ test.describe("Buyer management", () => { await expect(page.getByRole("alertdialog")).toBeVisible(); await expect( page.getByText( - `Are you sure you want to delete "${testData.name}" buyer?` - ) + `Are you sure you want to delete "${testData.name}" buyer?`, + ), ).toBeVisible(); // Cancel button is shown @@ -335,8 +335,8 @@ test.describe("Buyer management", () => { await expect(page.getByRole("alertdialog")).toBeVisible(); await expect( page.getByText( - `Are you sure you want to delete "${testData.name}" buyer?` - ) + `Are you sure you want to delete "${testData.name}" buyer?`, + ), ).toBeVisible(); // Confirm deletion @@ -344,30 +344,30 @@ test.describe("Buyer management", () => { // Verify success message await expect( - page.getByText("Buyer deleted successfully", { exact: true }) + page.getByText("Buyer deleted successfully", { exact: true }), ).toBeVisible(); // Verify buyer is removed from dropdown // because we have only one buyer, dropdown will be completely hidden await expect( - buyerForm.getByRole("combobox", { name: "Select Buyer" }) + buyerForm.getByRole("combobox", { name: "Select Buyer" }), ).toBeHidden(); // Verify form is reset to default values await expect(buyerForm.getByRole("textbox", { name: "Name" })).toHaveValue( - DEFAULT_BUYER_DATA.name + DEFAULT_BUYER_DATA.name, ); await expect( - buyerForm.getByRole("textbox", { name: "Address" }) + buyerForm.getByRole("textbox", { name: "Address" }), ).toHaveValue(DEFAULT_BUYER_DATA.address); await expect(buyerForm.getByRole("textbox", { name: "Email" })).toHaveValue( - DEFAULT_BUYER_DATA.email + DEFAULT_BUYER_DATA.email, ); await expect( - buyerForm.getByRole("textbox", { name: "VAT Number" }) + buyerForm.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(DEFAULT_BUYER_DATA.vatNo); }); }); diff --git a/e2e/changelog.test.ts b/e2e/changelog.test.ts index 38940cb..28d755a 100644 --- a/e2e/changelog.test.ts +++ b/e2e/changelog.test.ts @@ -13,14 +13,14 @@ test.describe("Changelog page", () => { level: 1, name: "Changelog", exact: true, - }) + }), ).toBeVisible(); // Check subtitle await expect( page.getByText( - "All the latest updates, improvements, and fixes to EasyInvoicePDF" - ) + "All the latest updates, improvements, and fixes to EasyInvoicePDF", + ), ).toBeVisible(); // Check that changelog entries are present @@ -49,7 +49,7 @@ test.describe("Changelog page", () => { // Check that we're on an individual entry page by looking for "Back to All Posts" link await expect( - page.getByRole("link", { name: "Back to All Posts" }) + page.getByRole("link", { name: "Back to All Posts" }), ).toBeVisible(); }); @@ -84,24 +84,24 @@ test.describe("Changelog page", () => { // Check author information await expect(page.getByTestId("author-info-text")).toHaveText( - "Vlad SazonauFounder, EasyInvoicePDF" + "Vlad SazonauFounder, EasyInvoicePDF", ); await expect(page.getByTestId("author-info-img")).toBeVisible(); // Check social sharing buttons are present const twitterShareLink = page.locator( - 'a[href*="twitter.com/intent/tweet"]' + 'a[href*="twitter.com/intent/tweet"]', ); await expect(twitterShareLink).toBeVisible(); const linkedinShareLink = page.locator( - 'a[href*="linkedin.com/shareArticle"]' + 'a[href*="linkedin.com/shareArticle"]', ); await expect(linkedinShareLink).toBeVisible(); // Check "Go to App" CTA button const goToAppButtonContainer = page.getByTestId( - "go-to-app-button-container" + "go-to-app-button-container", ); const goToAppButton = goToAppButtonContainer.getByRole("link"); @@ -133,7 +133,7 @@ test.describe("Changelog page", () => { // Verify we're back on the main changelog page await expect(page).toHaveURL("/changelog"); await expect( - page.getByRole("heading", { level: 1, name: "Changelog" }) + page.getByRole("heading", { level: 1, name: "Changelog" }), ).toBeVisible(); }); @@ -151,7 +151,7 @@ test.describe("Changelog page", () => { // Verify the page loads correctly await expect( - page.getByRole("link", { name: "Back to All Posts" }) + page.getByRole("link", { name: "Back to All Posts" }), ).toBeVisible(); // Verify we can still navigate back diff --git a/e2e/default-invoice-template/pdf.test.ts b/e2e/default-invoice-template/pdf.test.ts index 55909d6..e6fa376 100644 --- a/e2e/default-invoice-template/pdf.test.ts +++ b/e2e/default-invoice-template/pdf.test.ts @@ -91,7 +91,7 @@ test.describe("PDF Preview", () => { // Save the file to a browser-specific temporary location const tmpPath = path.join( getDownloadDir({ browserName }), - suggestedFilename + suggestedFilename, ); await download.saveAs(tmpPath); @@ -108,12 +108,12 @@ test.describe("PDF Preview", () => { // Check invoice header details expect(pdfData.text).toContain( - `Invoice No. of: 1/${CURRENT_MONTH_AND_YEAR}` + `Invoice No. of: 1/${CURRENT_MONTH_AND_YEAR}`, ); expect(pdfData.text).toContain("Reverse Charge"); expect(pdfData.text).toContain(`Date of issue: ${TODAY}`); expect(pdfData.text).toContain( - `Date of sales/of executing the service: ${LAST_DAY_OF_CURRENT_MONTH}` + `Date of sales/of executing the service: ${LAST_DAY_OF_CURRENT_MONTH}`, ); // Check seller details @@ -154,7 +154,7 @@ test.describe("PDF Preview", () => { // Check page footer and metadata expect(pdfData.text).toContain( - `1/${CURRENT_MONTH_AND_YEAR}·€0.00 due ${PAYMENT_DATE}·Created with https://easyinvoicepdf.comPage 1 of 1` + `1/${CURRENT_MONTH_AND_YEAR}·€0.00 due ${PAYMENT_DATE}·Created with https://easyinvoicepdf.comPage 1 of 1`, ); }); @@ -195,7 +195,7 @@ test.describe("PDF Preview", () => { const pdfData = await pdf(dataBuffer); expect((pdfData.info as { Title: string }).Title).toContain( - `Faktura nr: 1/${CURRENT_MONTH_AND_YEAR} | Created with https://easyinvoicepdf.com` + `Faktura nr: 1/${CURRENT_MONTH_AND_YEAR} | Created with https://easyinvoicepdf.com`, ); // Verify PDF content @@ -209,7 +209,7 @@ test.describe("PDF Preview", () => { const lastDayOfCurrentMonth = dayjs().endOf("month").format("YYYY-MM-DD"); expect(pdfData.text).toContain( - `Data sprzedaży / wykonania usługi: ${lastDayOfCurrentMonth}` + `Data sprzedaży / wykonania usługi: ${lastDayOfCurrentMonth}`, ); expect(pdfData.text).toContain(`Razem do zapłaty: 0.00 EUR @@ -218,7 +218,7 @@ Pozostało do zapłaty: 0.00 EUR Kwota słownie: zero EUR 00/100`); expect(pdfData.text).toContain( - `1/${CURRENT_MONTH_AND_YEAR}·0,00 € do zapłaty do ${PAYMENT_DATE}·Utworzono za pomocą https://easyinvoicepdf.comStrona 1 z 1` + `1/${CURRENT_MONTH_AND_YEAR}·0,00 € do zapłaty do ${PAYMENT_DATE}·Utworzono za pomocą https://easyinvoicepdf.comStrona 1 z 1`, ); }); @@ -272,7 +272,7 @@ Kwota słownie: zero EUR 00/100`); // Toggle notes visibility on const sellerNotesSwitch = sellerSection.getByTestId( - `sellerNotesInvoiceFormFieldVisibilitySwitch` + `sellerNotesInvoiceFormFieldVisibilitySwitch`, ); await expect(sellerNotesSwitch).toHaveRole("switch"); @@ -302,7 +302,7 @@ Kwota słownie: zero EUR 00/100`); // Toggle notes visibility on const buyerNotesSwitch = buyerSection.getByTestId( - `buyerNotesInvoiceFormFieldVisibilitySwitch` + `buyerNotesInvoiceFormFieldVisibilitySwitch`, ); await expect(buyerNotesSwitch).toHaveRole("switch"); @@ -353,7 +353,7 @@ Kwota słownie: zero EUR 00/100`); // Save the file to a browser-specific temporary location const tmpPath = path.join( getDownloadDir({ browserName }), - suggestedFilename + suggestedFilename, ); await download.saveAs(tmpPath); @@ -368,12 +368,12 @@ Kwota słownie: zero EUR 00/100`); // Verify PDF content // Check invoice header details expect(pdfData.text).toContain( - `Invoice No. of: 1/${CURRENT_MONTH_AND_YEAR}` + `Invoice No. of: 1/${CURRENT_MONTH_AND_YEAR}`, ); expect(pdfData.text).toContain("HELLO FROM PLAYWRIGHT TEST!"); expect(pdfData.text).toContain(`Date of issue: ${today}`); expect(pdfData.text).toContain( - `Date of sales/of executing the service: ${lastDayOfCurrentMonth}` + `Date of sales/of executing the service: ${lastDayOfCurrentMonth}`, ); // Check seller details @@ -405,7 +405,7 @@ Kwota słownie: zero EUR 00/100`); expect(pdfData.text).toContain("Paid: 0.00 GBP"); expect(pdfData.text).toContain("Left to pay: 3 000.00 GBP"); expect(pdfData.text).toContain( - "Amount in words: three thousand GBP 00/100" + "Amount in words: three thousand GBP 00/100", ); // Check footer @@ -414,7 +414,7 @@ Kwota słownie: zero EUR 00/100`); expect(pdfData.text).toContain("Reverse charge"); expect(pdfData.text).toContain( - `1/${CURRENT_MONTH_AND_YEAR}·£3,000.00 due ${paymentDate}·Created with https://easyinvoicepdf.comPage 1 of 1` + `1/${CURRENT_MONTH_AND_YEAR}·£3,000.00 due ${paymentDate}·Created with https://easyinvoicepdf.comPage 1 of 1`, ); }); @@ -502,10 +502,10 @@ Kwota słownie: zero EUR 00/100`); // Verify preview tab is selected await expect( - page.getByRole("tabpanel", { name: "Preview PDF" }) + page.getByRole("tabpanel", { name: "Preview PDF" }), ).toBeVisible(); await expect( - page.getByRole("tabpanel", { name: "Edit Invoice" }) + page.getByRole("tabpanel", { name: "Edit Invoice" }), ).toBeHidden(); // Set up download handler @@ -523,7 +523,7 @@ Kwota słownie: zero EUR 00/100`); // Save the file to a browser-specific temporary location const tmpPath = path.join( getDownloadDir({ browserName }), - suggestedFilename + suggestedFilename, ); await download.saveAs(tmpPath); @@ -542,7 +542,7 @@ Kwota słownie: zero EUR 00/100`); const lastDayOfCurrentMonth = dayjs().endOf("month").format("YYYY-MM-DD"); expect(pdfData.text).toContain( - `Date de vente/prestation de service: ${lastDayOfCurrentMonth}` + `Date de vente/prestation de service: ${lastDayOfCurrentMonth}`, ); // Verify calculations in Polish @@ -555,7 +555,7 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); await expect(page.getByTestId("download-pdf-toast")).toBeVisible(); await expect( - page.getByRole("link", { name: "Star on GitHub" }) + page.getByRole("link", { name: "Star on GitHub" }), ).toBeVisible(); await expect(page.getByTestId("toast-cta-btn")).toBeVisible(); @@ -565,10 +565,10 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); // Verify form tab is selected and data persists await expect( - page.getByRole("tabpanel", { name: "Edit Invoice" }) + page.getByRole("tabpanel", { name: "Edit Invoice" }), ).toBeVisible(); await expect( - page.getByRole("tabpanel", { name: "Preview PDF" }) + page.getByRole("tabpanel", { name: "Preview PDF" }), ).toBeHidden(); // Verify form data persists @@ -576,30 +576,30 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); await expect(invoiceNumberValueInput).toHaveValue("2/05-2024"); await expect( - finalSection.getByRole("textbox", { name: "Notes", exact: true }) + finalSection.getByRole("textbox", { name: "Notes", exact: true }), ).toHaveValue("Mobile test note"); // Verify seller information persists await expect( - sellerSection.getByRole("textbox", { name: "Name" }) + sellerSection.getByRole("textbox", { name: "Name" }), ).toHaveValue("Mobile Test Seller"); await expect( - sellerSection.getByRole("textbox", { name: "Address" }) + sellerSection.getByRole("textbox", { name: "Address" }), ).toHaveValue("456 Mobile St"); // Verify invoice item persists await expect( invoiceItemsSection.getByRole("spinbutton", { name: "Amount (Quantity)", - }) + }), ).toHaveValue("3"); await expect( invoiceItemsSection.getByRole("spinbutton", { name: "Net Price (Rate or Unit Price)", - }) + }), ).toHaveValue("50"); await expect( - invoiceItemsSection.getByRole("textbox", { name: "VAT", exact: true }) + invoiceItemsSection.getByRole("textbox", { name: "VAT", exact: true }), ).toHaveValue("23"); // Verify calculations are correct @@ -607,19 +607,19 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); invoiceItemsSection.getByRole("textbox", { name: "Net Amount", exact: true, - }) + }), ).toHaveValue("150.00"); await expect( invoiceItemsSection.getByRole("textbox", { name: "VAT Amount", exact: true, - }) + }), ).toHaveValue("34.50"); await expect( invoiceItemsSection.getByRole("textbox", { name: "Pre-tax Amount", exact: true, - }) + }), ).toHaveValue("184.50"); }); @@ -641,11 +641,11 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); }); await expect(invoiceNumberLabelInput).toHaveValue( - INITIAL_INVOICE_DATA.invoiceNumberObject.label + INITIAL_INVOICE_DATA.invoiceNumberObject.label, ); await expect(invoiceNumberValueInput).toHaveValue( - INITIAL_INVOICE_DATA.invoiceNumberObject.value + INITIAL_INVOICE_DATA.invoiceNumberObject.value, ); const languageSelect = page.getByRole("combobox", { @@ -655,11 +655,11 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); await languageSelect.selectOption("pl"); await expect(invoiceNumberLabelInput).toHaveValue( - `${TRANSLATIONS.pl.invoiceNumber}:` + `${TRANSLATIONS.pl.invoiceNumber}:`, ); await expect(invoiceNumberValueInput).toHaveValue( - `1/${CURRENT_MONTH_AND_YEAR}` + `1/${CURRENT_MONTH_AND_YEAR}`, ); // I can fill in a new invoice number @@ -697,7 +697,7 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); await languageSelect.selectOption("pt"); await expect(invoiceNumberLabelInput).toHaveValue( - `${TRANSLATIONS.pt.invoiceNumber}:` + `${TRANSLATIONS.pt.invoiceNumber}:`, ); await invoiceNumberLabelInput.fill("Fatura TEST PORTUGUESE N°:"); @@ -705,7 +705,7 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); await expect( page.getByRole("button", { name: `Switch to default label ("Fatura N°:")`, - }) + }), ).toBeVisible(); // we wait until this button is visible and enabled, that means that the PDF preview has been regenerated @@ -738,7 +738,7 @@ Montant en lettres: cent quatre-vingt-quatre GBP 50/100`); // Verify PDF content expect(pdfData.text).toContain( - `Fatura TEST PORTUGUESE N°: 1/${CURRENT_MONTH_AND_YEAR}` + `Fatura TEST PORTUGUESE N°: 1/${CURRENT_MONTH_AND_YEAR}`, ); expect(pdfData.text).toContain("Data de emissão"); }); diff --git a/e2e/generate-invoice-link.test.ts b/e2e/generate-invoice-link.test.ts new file mode 100644 index 0000000..590468e --- /dev/null +++ b/e2e/generate-invoice-link.test.ts @@ -0,0 +1,299 @@ +import { expect, test } from "@playwright/test"; + +test.describe("Generate Invoice Link", () => { + test.beforeEach(async ({ page }) => { + await page.goto("/"); + }); + + test("can share invoice and data is persisted in new tab", async ({ + page, + context, + }) => { + // Fill in some test data + const invoiceNumberFieldset = page.getByRole("group", { + name: "Invoice Number", + }); + + const invoiceNumberValueField = invoiceNumberFieldset.getByRole("textbox", { + name: "Value", + }); + + await invoiceNumberValueField.fill("SHARE-TEST-001"); + + const finalSection = page.getByTestId(`final-section`); + + await finalSection + .getByRole("textbox", { name: "Notes", exact: true }) + .fill("Test note for sharing"); + + // Fill in seller information + const sellerSection = page.getByTestId("seller-information-section"); + await sellerSection + .getByRole("textbox", { name: "Name" }) + .fill("Test Seller"); + await sellerSection + .getByRole("textbox", { name: "Address" }) + .fill("123 Test St"); + await sellerSection + .getByRole("textbox", { name: "Email" }) + .fill("seller@test.com"); + + // Fill in an invoice item + const invoiceItemsSection = page.getByTestId("invoice-items-section"); + await invoiceItemsSection + .getByRole("spinbutton", { name: "Amount (Quantity)" }) + .fill("5"); + await invoiceItemsSection + .getByRole("spinbutton", { + name: "Net Price (Rate or Unit Price)", + }) + .fill("100"); + await invoiceItemsSection + .getByRole("textbox", { name: "VAT", exact: true }) + .fill("23"); + + // wait for debounce timeout + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(600); + + // Generate share link + await page + .getByRole("button", { name: "Generate a link to invoice" }) + .click(); + + // Wait for URL to update with share data + await page.waitForURL((url) => url.searchParams.has("data")); + + // Get the current URL which should now contain the share data + const sharedUrl = page.url(); + expect(sharedUrl).toContain("?template=default&data="); + + // Open URL in new tab + const newPage = await context.newPage(); + await newPage.goto(sharedUrl); + + // Get elements from the new page context + const newInvoiceNumberFieldset = newPage.getByRole("group", { + name: "Invoice Number", + }); + + // Verify data is loaded in new tab + await expect( + newInvoiceNumberFieldset.getByRole("textbox", { name: "Value" }), + ).toHaveValue("SHARE-TEST-001"); + + const newPageFinalSection = newPage.getByTestId(`final-section`); + + await expect( + newPageFinalSection.getByRole("textbox", { name: "Notes", exact: true }), + ).toHaveValue("Test note for sharing"); + + // Verify seller information + const newSellerSection = newPage.getByTestId("seller-information-section"); + await expect( + newSellerSection.getByRole("textbox", { name: "Name" }), + ).toHaveValue("Test Seller"); + await expect( + newSellerSection.getByRole("textbox", { name: "Address" }), + ).toHaveValue("123 Test St"); + await expect( + newSellerSection.getByRole("textbox", { name: "Email" }), + ).toHaveValue("seller@test.com"); + + // Verify invoice item + const newInvoiceItemsSection = newPage.getByTestId("invoice-items-section"); + await expect( + newInvoiceItemsSection.getByRole("spinbutton", { + name: "Amount (Quantity)", + }), + ).toHaveValue("5"); + await expect( + newInvoiceItemsSection.getByRole("spinbutton", { + name: "Net Price (Rate or Unit Price)", + }), + ).toHaveValue("100"); + await expect( + newInvoiceItemsSection.getByRole("textbox", { name: "VAT", exact: true }), + ).toHaveValue("23"); + + // Close the new page + await newPage.close(); + }); + + test("shows notification when invoice link is broken", async ({ page }) => { + // Navigate to page with invalid data parameter + await page.goto("/?data=invalid-data-string"); + + // Verify error toast appears + await expect( + page.getByText("The shared invoice URL appears to be incorrect"), + ).toBeVisible(); + + // Verify error description is shown + await expect( + page.getByText( + "Please verify that you have copied the complete invoice URL. The link may be truncated or corrupted.", + ), + ).toBeVisible(); + + const clearUrlButton = page.getByRole("button", { + name: "Clear URL", + }); + // Verify clear URL button is present + await expect(clearUrlButton).toBeVisible(); + + // Click clear URL button + await clearUrlButton.click(); + + // Verify toast is dismissed + await expect( + page.getByText("The shared invoice URL appears to be incorrect"), + ).toBeHidden(); + + await expect( + page.getByText( + "Please verify that you have copied the complete invoice URL. The link may be truncated or corrupted.", + ), + ).toBeHidden(); + + // Wait for URL to be cleared and verify + await expect(page).toHaveURL("/?template=default"); + }); + + test("backwards compatibility: old uncompressed URLs work the same as new compressed URLs", async ({ + page, + }) => { + // Test URLs provided in the user query - these are old format URLs before compression was implemented + + const oldUncompressedUrl = + "N4IgNghgdg5grhGBTEAuEAHMIA0IAmEALkgGID2ATgLbFogCyTDABACI4sCaPXuIAYziVKSKAICe9AKoBlNvxLUsxFOgDORSgEsMKPGHIxy9ftqgA3ctoFIAcnGoAjJJQDyTgFZIBRNKEgXbHRSCABrImEIFihKdDwLCDA4NRAARgB6AAYADgBaACYsgoBWEABfPEISNwAzAEl1dRT6ItK83Ly0sqrVOtlXCxtUtpKO-IBmNLNLa1sAFQk9egAlJAtXdSQWAGEACwhKZBmrYcW9Um0kMHxGgDVtdW0nMDUtFLwtsFfKfxBtfD0NIAdgALFkAGw5UElCagiZZHogKAQaipABS5D2UHY5H0IAg+Hwoia9AAMuQoPhKZxpABpfiJIh2EzoNIFOElCGM4gsy7XW7qB5PF5vSgfEBIWjaYIgTxYqAAAWlYAAdAJyNR+BABBq4FBmY4XL82RyYdy8Dq9QaHM5XPybvdHs9Xmh3khPgB3bS1IgAIRsQLNXP46m9voDAgdguFLrFEqg5BI6noyb8eETyejTpFrtQtSSW0qICccAkrj+AKBwNhoIhWRhJWBDf4KLR9AAggI0bsTJaiSSU+g7EhPdwqGFOHYuLTZB2eczWelgxaQEy+VdHULnaK3eKPZKVfQdWjlRAZerNa2k0ghyBr1nNzGd3n3cXtEohwBtUDmU62eolFtY0czjPcE1RVJZHIX1PUObY2HWa5yAwNEDVbSDs23XN4wPIgliQOoAHF5mkUw8HwvRiNIrDY13fNCwPVFyH1PxUDSS1qBYg1aJfXC8H1D96C2SghlsfhBKIXicPAg8oCQIgAAUdHE9iSiyDSMwU5ThmksDUHdBI6GHRSFz0+jDORBSOy41i0G6DSsi0ogbO4qSn1Aiz9yMlzbPQ1AnLXYhXNY8zX28zBRHmCAAA8Qv8hzNMipBorivz3IFTzwpScoAF0KKTJJ7PUpKmWi0VZEcWhKAkLL+MwCAJDQogGAUvZyEBdBvVEFgtGgdRagrPAMEa5rWqIdr8DC+qRqasQiDYFp0FGcZClBUMtF0JBFMatwoDAcwkGkShZQfW9ViQygthYAQDiOfFM1vabZOGzZKQ7OAJqobQAC8kHweZyDWWxtA2Z6DIivQrvez72p0P6AfIRpmjIDzsP0t8gA"; + + // Navigate to old uncompressed URL + await page.goto(`/?data=${oldUncompressedUrl}`); + + // Verify the page loads without error + await expect(page).toHaveURL( + `/?data=${oldUncompressedUrl}&template=stripe`, + ); + + const oldUrl = page.url(); + + const generalInfoSection = page.getByTestId("general-information-section"); + + await expect( + generalInfoSection.getByRole("combobox", { + name: "Invoice PDF Language", + }), + ).toHaveValue("pl"); + + // Verify the Stripe template is selected + await expect( + page.getByRole("combobox", { name: "Invoice Template" }), + ).toHaveValue("stripe"); + + // Invoice Number + const invoiceNumberFieldset = page.getByRole("group", { + name: "Invoice Number", + }); + + await expect( + invoiceNumberFieldset.getByRole("textbox", { name: "Label" }), + ).toHaveValue("Faktura nr:"); + + await expect( + invoiceNumberFieldset.getByRole("textbox", { name: "Value" }), + ).toHaveValue("1/08-2025"); + + // Verify seller information is loaded + const sellerSection = page.getByTestId("seller-information-section"); + const sellerNameField = sellerSection.getByRole("textbox", { + name: "Name", + }); + await expect(sellerNameField).toHaveValue("John Doe"); + + // Verify buyer information is loaded + const buyerSection = page.getByTestId("buyer-information-section"); + const buyerNameField = buyerSection.getByRole("textbox", { name: "Name" }); + await expect(buyerNameField).toHaveValue("Acme Co"); + + // Verify invoice items are loaded + const invoiceItemsSection = page.getByTestId("invoice-items-section"); + const itemAmountField = invoiceItemsSection.getByRole("spinbutton", { + name: "Net Price (Rate or Unit Price)", + }); + await expect(itemAmountField).toHaveValue("15000"); + + // ______________________________________________ + // now check that the compressed URL of the same invoice works the same + // ______________________________________________ + + const newCompressedUrl = + "/?template=stripe&data=N4IghiBcIA4DYgDQgEZRAWSxgBAEURwE0SikQBjdAVQGU9yATdAZwBcAnASxgFNz+0cgDMooAB7oAYmADWbAK4cwOAHYdoyAJ7oAjAHoADAA4AtACZD5gKwgAvsgDm6SzdMnTu28gAWLq9buZgDMuuRc6ABKvABuvBwsvDgAwj5gHI78yABWUJwKvMiyYiAAXnoA7AAshgBsxlXWwVXBht4gAILoAFIA9j6q+L1ZIABC6AAyvaqM04TUANLkyXrmzda15AyQ+YUgAKLo2f2qAAIAtmBccAB0FL3n5FKr65vIAOJ5HAXIABIvjTeIAAkl8fiA2Og2Lx2OQFFBhGA4IkHCAEJBQOVoLoKk0qrVDI1rBVCeQutAOhRzklkr1yONoAA5XgAd2IvQ4skIjKI81oXWQK2xa0BWzBe0O0DAVN4Fyut3uj2QkKEyHhO2+vFRj0gAG1QIZxchukbOuhaL1hGwWekknhYrw4L0YNTVJDkEsNeCJuhyBgEUjEshGVBdMgAPKmgAKrHiMS4FBGAEVTZFQ9ZDJnkLRTQAVdCMmPIaimgBq6czhmQAHVTQANKBVkBkL17ABaFczdgAushVJ2m3TW8gYOgWVwOElOGBVCxhPFyABHU0cfxuDzmKrkFi+5VRB0JJIUNIZEbq3bIGKmlniuxAA"; + + await page.goto(newCompressedUrl); + + // Verify the page loads without error + await expect(page).toHaveURL(newCompressedUrl); + + const newUrl = page.url(); + + const newGeneralInfoSection = page.getByTestId( + "general-information-section", + ); + + await expect( + newGeneralInfoSection.getByRole("combobox", { + name: "Invoice PDF Language", + }), + ).toHaveValue("pl"); + + // Verify the Stripe template is selected + await expect( + page.getByRole("combobox", { name: "Invoice Template" }), + ).toHaveValue("stripe"); + + // Invoice Number + const newInvoiceNumberFieldset = page.getByRole("group", { + name: "Invoice Number", + }); + + await expect( + newInvoiceNumberFieldset.getByRole("textbox", { name: "Label" }), + ).toHaveValue("Faktura nr:"); + + await expect( + newInvoiceNumberFieldset.getByRole("textbox", { name: "Value" }), + ).toHaveValue("1/08-2025"); + + // Verify seller information is loaded + const newSellerSection = page.getByTestId("seller-information-section"); + const newSellerNameField = newSellerSection.getByRole("textbox", { + name: "Name", + }); + await expect(newSellerNameField).toHaveValue("John Doe"); + + // Verify buyer information is loaded + const newBuyerSection = page.getByTestId("buyer-information-section"); + const newBuyerNameField = newBuyerSection.getByRole("textbox", { + name: "Name", + }); + await expect(newBuyerNameField).toHaveValue("Acme Co"); + + // Verify invoice items are loaded + const newInvoiceItemsSection = page.getByTestId("invoice-items-section"); + const newItemAmountField = newInvoiceItemsSection.getByRole("spinbutton", { + name: "Net Price (Rate or Unit Price)", + }); + await expect(newItemAmountField).toHaveValue("15000"); + + // Verify the compressed URL is shorter than the original + expect(newUrl.length).toBeLessThan(oldUrl.length); + + // Calculate and verify the compression ratio + const compressionRatio = + ((oldUrl.length - newUrl.length) / oldUrl.length) * 100; + + // Verify significant compression occurred (at least 20% reduction) + expect(compressionRatio).toBeGreaterThan(20); + }); +}); diff --git a/e2e/invoice-form.test.ts b/e2e/invoice-form.test.ts index 836ba52..a47bd38 100644 --- a/e2e/invoice-form.test.ts +++ b/e2e/invoice-form.test.ts @@ -13,7 +13,7 @@ import { import { expect, test } from "@playwright/test"; import dayjs from "dayjs"; import { INITIAL_INVOICE_DATA } from "../src/app/constants"; -import { GITHUB_URL, VIDEO_DEMO_URL } from "@/config"; +import { VIDEO_DEMO_URL } from "@/config"; test.describe("Invoice Generator Page", () => { test.beforeEach(async ({ page }) => { @@ -22,45 +22,90 @@ test.describe("Invoice Generator Page", () => { test("should redirect from /:locale/app to /", async ({ page }) => { await page.goto("/en/app"); - await expect(page).toHaveURL("/"); + await expect(page).toHaveURL("/?template=default"); + }); + + test("displays correct OG meta tags for default template", async ({ + page, + }) => { + // Navigate to default template + await page.goto("/?template=default"); + + await expect(page).toHaveURL("/?template=default"); + + const templateCombobox = page.getByRole("combobox", { + name: "Invoice Template", + }); + await expect(templateCombobox).toHaveValue("default"); + + // Check that OG image changed to Stripe template + await expect(page.locator('meta[property="og:image"]')).toHaveAttribute( + "content", + "https://static.easyinvoicepdf.com/easy-invoice-opengraph-image.png?v=5", + ); + + // Check other meta tags for Stripe template + await expect(page.locator('meta[property="og:title"]')).toHaveAttribute( + "content", + "App | Free Invoice Generator – Live Preview, No Sign-Up", + ); + await expect( + page.locator('meta[property="og:description"]'), + ).toHaveAttribute( + "content", + "Create and download professional invoices instantly with EasyInvoicePDF.com. Free and open-source. No signup required.", + ); + await expect(page.locator('meta[property="og:site_name"]')).toHaveAttribute( + "content", + "EasyInvoicePDF.com | Free Invoice Generator", + ); + + // Verify OG image dimensions + await expect( + page.locator('meta[property="og:image:width"]'), + ).toHaveAttribute("content", "1200"); + await expect( + page.locator('meta[property="og:image:height"]'), + ).toHaveAttribute("content", "630"); + await expect(page.locator('meta[property="og:image:alt"]')).toHaveAttribute( + "content", + "EasyInvoicePDF.com - Free Invoice Generator with Live PDF Preview", + ); }); test("displays correct buttons and links in header", async ({ page }) => { // Check URL is correct - await expect(page).toHaveURL("/"); + await expect(page).toHaveURL("/?template=default"); // Check title and branding await expect(page).toHaveTitle( - "App | Free Invoice Generator – Live Preview, No Sign-Up" + "App | Free Invoice Generator – Live Preview, No Sign-Up", ); const header = page.getByTestId("header"); await expect(header).toBeVisible(); await expect( - header.getByRole("link", { name: "EasyInvoicePDF" }) + header.getByRole("link", { name: "EasyInvoicePDF" }), ).toBeVisible(); await expect( - header.getByText("Free Invoice Generator with Live PDF Preview") + header.getByText("Free Invoice Generator with Live PDF Preview"), ).toBeVisible(); // Check main action buttons await expect( - page.getByRole("link", { name: "Support Project" }) + page.getByRole("link", { name: "Support Project" }), ).toBeVisible(); await expect( - page.getByRole("button", { name: "Generate a link to invoice" }) + page.getByRole("button", { name: "Generate a link to invoice" }), ).toBeVisible(); await expect( - page.getByRole("link", { name: "Download PDF in English" }) + page.getByRole("link", { name: "Download PDF in English" }), ).toBeVisible(); await expect( - header.getByRole("link", { name: "Open Source" }) - ).toBeVisible(); - await expect( - header.getByRole("link", { name: "Share your feedback" }) + header.getByRole("link", { name: "Share your feedback" }), ).toBeVisible(); const howItWorksButton = header.getByRole("button", { @@ -73,13 +118,13 @@ test.describe("Invoice Generator Page", () => { await howItWorksButton.click(); await expect( - page.getByRole("heading", { name: "How EasyInvoicePDF Works" }) + page.getByRole("heading", { name: "How EasyInvoicePDF Works" }), ).toBeVisible(); await expect( page.getByText( - "Watch this quick demo to learn how to create and customize your invoices." - ) + "Watch this quick demo to learn how to create and customize your invoices.", + ), ).toBeVisible(); // Check that video is displayed in dialog @@ -99,19 +144,18 @@ test.describe("Invoice Generator Page", () => { await expect(dialog).toBeHidden(); await expect( - dialog.getByRole("heading", { name: "How EasyInvoicePDF Works" }) + dialog.getByRole("heading", { name: "How EasyInvoicePDF Works" }), ).toBeHidden(); - await expect( - header.getByRole("link", { name: "Open Source" }) - ).toHaveAttribute("href", GITHUB_URL); + // Verify GitHub Star CTA button is visible + await expect(page.getByTestId("github-star-cta-button")).toBeVisible(); // Verify buttons are enabled await expect( - page.getByRole("button", { name: "Generate a link to invoice" }) + page.getByRole("button", { name: "Generate a link to invoice" }), ).toBeEnabled(); await expect( - page.getByRole("link", { name: "Download PDF in English" }) + page.getByRole("link", { name: "Download PDF in English" }), ).toBeEnabled(); }); @@ -135,7 +179,7 @@ test.describe("Invoice Generator Page", () => { // **CHECK GENERAL INFORMATION SECTION** const generalInfoSection = page.getByTestId(`general-information-section`); await expect( - generalInfoSection.getByText("General Information", { exact: true }) + generalInfoSection.getByText("General Information", { exact: true }), ).toBeVisible(); // Check all supported languages are available as options with correct labels @@ -151,7 +195,7 @@ test.describe("Invoice Generator Page", () => { const languageName = LANGUAGE_TO_LABEL[lang]; await expect( - languageSelect.locator(`option[value="${lang}"]`) + languageSelect.locator(`option[value="${lang}"]`), ).toHaveText(languageName); } @@ -171,7 +215,7 @@ test.describe("Invoice Generator Page", () => { `${currency} ${currencySymbol} ${currencyFullName}`.trim(); await expect( - currencySelect.locator(`option[value="${currency}"]`) + currencySelect.locator(`option[value="${currency}"]`), ).toHaveText(expectedLabel); } @@ -188,9 +232,9 @@ test.describe("Invoice Generator Page", () => { const isDefault = dateFormat === SUPPORTED_DATE_FORMATS[0]; await expect( - dateFormatSelect.locator(`option[value="${dateFormat}"]`) + dateFormatSelect.locator(`option[value="${dateFormat}"]`), ).toHaveText( - `${dateFormat} (Preview: ${preview}) ${isDefault ? "(default)" : ""}` + `${dateFormat} (Preview: ${preview}) ${isDefault ? "(default)" : ""}`, ); } @@ -200,106 +244,106 @@ test.describe("Invoice Generator Page", () => { }); await expect( - invoiceNumberFieldset.getByRole("textbox", { name: "Label" }) + invoiceNumberFieldset.getByRole("textbox", { name: "Label" }), ).toHaveValue(INITIAL_INVOICE_DATA.invoiceNumberObject.label); await expect( - invoiceNumberFieldset.getByRole("textbox", { name: "Value" }) + invoiceNumberFieldset.getByRole("textbox", { name: "Value" }), ).toHaveValue(INITIAL_INVOICE_DATA.invoiceNumberObject.value); // Date of Issue await expect( - generalInfoSection.getByRole("textbox", { name: "Date of Issue" }) + generalInfoSection.getByRole("textbox", { name: "Date of Issue" }), ).toHaveValue(INITIAL_INVOICE_DATA.dateOfIssue); // Date of Service await expect( - generalInfoSection.getByRole("textbox", { name: "Date of Service" }) + generalInfoSection.getByRole("textbox", { name: "Date of Service" }), ).toHaveValue(INITIAL_INVOICE_DATA.dateOfService); // Invoice Type await expect( - generalInfoSection.getByRole("textbox", { name: "Invoice Type" }) + generalInfoSection.getByRole("textbox", { name: "Invoice Type" }), ).toHaveValue(INITIAL_INVOICE_DATA.invoiceType); // Visibility toggles await expect( - generalInfoSection.getByRole("switch", { name: "Show in PDF" }) + generalInfoSection.getByRole("switch", { name: "Show in PDF" }), ).toBeChecked(); // **CHECK SELLER INFORMATION SECTION** const sellerSection = page.getByTestId(`seller-information-section`); await expect( - sellerSection.getByText("Seller Information", { exact: true }) + sellerSection.getByText("Seller Information", { exact: true }), ).toBeVisible(); // Name field await expect( - sellerSection.getByRole("textbox", { name: "Name" }) + sellerSection.getByRole("textbox", { name: "Name" }), ).toHaveValue(INITIAL_INVOICE_DATA.seller.name); // Address field await expect( - sellerSection.getByRole("textbox", { name: "Address" }) + sellerSection.getByRole("textbox", { name: "Address" }), ).toHaveValue(INITIAL_INVOICE_DATA.seller.address); // VAT Number field and visibility toggle await expect( - sellerSection.getByRole("textbox", { name: "VAT Number" }) + sellerSection.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(INITIAL_INVOICE_DATA.seller.vatNo); await expect( - sellerSection.getByRole("switch", { name: /Show in PDF/i }).nth(0) + sellerSection.getByRole("switch", { name: /Show in PDF/i }).nth(0), ).toBeChecked(); // Email field await expect( - sellerSection.getByRole("textbox", { name: "Email" }) + sellerSection.getByRole("textbox", { name: "Email" }), ).toHaveValue(INITIAL_INVOICE_DATA.seller.email); // Account Number field and visibility toggle await expect( - sellerSection.getByRole("textbox", { name: "Account Number" }) + sellerSection.getByRole("textbox", { name: "Account Number" }), ).toHaveValue(INITIAL_INVOICE_DATA.seller.accountNumber); await expect( - sellerSection.getByRole("switch", { name: /Show in PDF/i }).nth(1) + sellerSection.getByRole("switch", { name: /Show in PDF/i }).nth(1), ).toBeChecked(); // SWIFT/BIC field and visibility toggle await expect( - sellerSection.getByRole("textbox", { name: "SWIFT/BIC" }) + sellerSection.getByRole("textbox", { name: "SWIFT/BIC" }), ).toHaveValue(INITIAL_INVOICE_DATA.seller.swiftBic); await expect( - sellerSection.getByRole("switch", { name: /Show in PDF/i }).nth(2) + sellerSection.getByRole("switch", { name: /Show in PDF/i }).nth(2), ).toBeChecked(); // Verify Seller Management button is present await expect( - sellerSection.getByRole("button", { name: "New Seller" }) + sellerSection.getByRole("button", { name: "New Seller" }), ).toBeVisible(); // **CHECK BUYER INFORMATION SECTION** const buyerSection = page.getByTestId(`buyer-information-section`); await expect( - buyerSection.getByText("Buyer Information", { exact: true }) + buyerSection.getByText("Buyer Information", { exact: true }), ).toBeVisible(); // Name field await expect( - buyerSection.getByRole("textbox", { name: "Name" }) + buyerSection.getByRole("textbox", { name: "Name" }), ).toHaveValue(INITIAL_INVOICE_DATA.buyer.name); // Address field await expect( - buyerSection.getByRole("textbox", { name: "Address" }) + buyerSection.getByRole("textbox", { name: "Address" }), ).toHaveValue(INITIAL_INVOICE_DATA.buyer.address); // VAT Number field and visibility toggle await expect( - buyerSection.getByRole("textbox", { name: "VAT Number" }) + buyerSection.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(INITIAL_INVOICE_DATA.buyer.vatNo); const buyerVatNoFieldIsVisibleSwitch = buyerSection.getByTestId( - `buyerVatNoFieldIsVisible` + `buyerVatNoFieldIsVisible`, ); await expect(buyerVatNoFieldIsVisibleSwitch).toHaveRole("switch"); @@ -307,29 +351,31 @@ test.describe("Invoice Generator Page", () => { // Email field await expect( - buyerSection.getByRole("textbox", { name: "Email" }) + buyerSection.getByRole("textbox", { name: "Email" }), ).toHaveValue(INITIAL_INVOICE_DATA.buyer.email); // Verify Buyer Management button is present await expect( - buyerSection.getByRole("button", { name: "New Buyer" }) + buyerSection.getByRole("button", { name: "New Buyer" }), ).toBeVisible(); // **Check INVOICE ITEMS section** const invoiceItemsSection = page.getByTestId(`invoice-items-section`); await expect( - invoiceItemsSection.getByText("Invoice Items", { exact: true }) + invoiceItemsSection.getByText("Invoice Items", { exact: true }), ).toBeVisible(); // Check visibility toggles in settings await expect( - invoiceItemsSection.getByRole("switch", { name: /Show "Number" Column/i }) + invoiceItemsSection.getByRole("switch", { + name: /Show "Number" Column/i, + }), ).toBeChecked(); await expect( invoiceItemsSection.getByRole("switch", { name: /Show "VAT Table Summary"/i, - }) + }), ).toBeChecked(); // Check first invoice item fields @@ -337,54 +383,54 @@ test.describe("Invoice Generator Page", () => { // Name field and visibility toggle await expect( - invoiceItemsSection.getByRole("textbox", { name: "Name" }) + invoiceItemsSection.getByRole("textbox", { name: "Name" }), ).toHaveValue(firstItem.name); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(0) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(0), ).toBeChecked(); // Type of GTU field and visibility toggle await expect( - invoiceItemsSection.getByRole("textbox", { name: "Type of GTU" }) + invoiceItemsSection.getByRole("textbox", { name: "Type of GTU" }), ).toHaveValue(firstItem.typeOfGTU); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(1) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(1), ).not.toBeChecked(); // we don't want to show this in PDF by default // Amount field and visibility toggle await expect( invoiceItemsSection.getByRole("spinbutton", { name: "Amount (Quantity)", - }) + }), ).toHaveValue(firstItem.amount.toString()); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(2) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(2), ).toBeChecked(); // Unit field and visibility toggle await expect( - invoiceItemsSection.getByRole("textbox", { name: "Unit" }) + invoiceItemsSection.getByRole("textbox", { name: "Unit" }), ).toHaveValue(firstItem.unit); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(3) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(3), ).toBeChecked(); // Net Price field and visibility toggle await expect( invoiceItemsSection.getByRole("spinbutton", { name: "Net Price (Rate or Unit Price)", - }) + }), ).toHaveValue(firstItem.netPrice.toString()); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(4) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(4), ).toBeChecked(); // VAT field and visibility toggle await expect( - invoiceItemsSection.getByRole("textbox", { name: "VAT", exact: true }) + invoiceItemsSection.getByRole("textbox", { name: "VAT", exact: true }), ).toHaveValue(firstItem.vat); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(5) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(5), ).toBeChecked(); // Net Amount field (read-only) and visibility toggle @@ -392,15 +438,15 @@ test.describe("Invoice Generator Page", () => { invoiceItemsSection.getByRole("textbox", { name: "Net Amount", exact: true, - }) + }), ).toHaveValue( firstItem.netAmount.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2, - }) + }), ); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(6) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(6), ).toBeChecked(); // VAT Amount field (read-only) and visibility toggle @@ -408,15 +454,15 @@ test.describe("Invoice Generator Page", () => { invoiceItemsSection.getByRole("textbox", { name: "VAT Amount", exact: true, - }) + }), ).toHaveValue( firstItem.vatAmount.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2, - }) + }), ); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(7) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(7), ).toBeChecked(); // Pre-tax Amount field (read-only) and visibility toggle @@ -424,20 +470,20 @@ test.describe("Invoice Generator Page", () => { invoiceItemsSection.getByRole("textbox", { name: "Pre-tax Amount", exact: true, - }) + }), ).toHaveValue( firstItem.preTaxAmount.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2, - }) + }), ); await expect( - invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(8) + invoiceItemsSection.getByRole("switch", { name: /Show in PDF/i }).nth(8), ).toBeChecked(); // Verify Add Invoice Item button is present await expect( - invoiceItemsSection.getByRole("button", { name: "Add invoice item" }) + invoiceItemsSection.getByRole("button", { name: "Add invoice item" }), ).toBeVisible(); }); @@ -449,7 +495,7 @@ test.describe("Invoice Generator Page", () => { .getByRole("button", { name: "Add invoice item" }) .click(); await expect( - invoiceItemsSection.getByText("Item 2", { exact: true }) + invoiceItemsSection.getByText("Item 2", { exact: true }), ).toBeVisible(); // Fill in new item details @@ -462,7 +508,7 @@ test.describe("Invoice Generator Page", () => { // Set up dialog handler before triggering the action page.on("dialog", async (dialog) => { expect(dialog.message()).toBe( - "Are you sure you want to delete invoice item #2?" + "Are you sure you want to delete invoice item #2?", ); await dialog.accept(); }); @@ -473,7 +519,7 @@ test.describe("Invoice Generator Page", () => { .click(); await expect( - invoiceItemsSection.getByText("Item 2", { exact: true }) + invoiceItemsSection.getByText("Item 2", { exact: true }), ).toBeHidden(); }); @@ -499,13 +545,13 @@ test.describe("Invoice Generator Page", () => { invoiceItemsSection.getByRole("textbox", { name: "Net Amount", exact: true, - }) + }), ).toHaveValue("200.00"); await expect( invoiceItemsSection.getByRole("textbox", { name: "VAT Amount", exact: true, - }) + }), ).toHaveValue("46.00"); const finalSection = page.getByTestId(`final-section`); @@ -513,7 +559,7 @@ test.describe("Invoice Generator Page", () => { finalSection.getByRole("textbox", { name: "Total", exact: true, - }) + }), ).toHaveValue("246.00"); }); @@ -533,15 +579,15 @@ test.describe("Invoice Generator Page", () => { await invoiceItemsSection.getByRole("textbox", { name: "Name" }).clear(); await expect( - page.getByText("Seller name is required", { exact: true }) + page.getByText("Seller name is required", { exact: true }), ).toBeVisible(); await expect( - page.getByText("Buyer name is required", { exact: true }) + page.getByText("Buyer name is required", { exact: true }), ).toBeVisible(); await expect( - page.getByText("Item name is required", { exact: true }) + page.getByText("Item name is required", { exact: true }), ).toBeVisible(); const dateOfIssue = dayjs().format("YYYY-MM-DD"); @@ -562,7 +608,7 @@ test.describe("Invoice Generator Page", () => { // Check if the date of issue is filled in correctly await expect( - page.getByRole("textbox", { name: "Date of Issue" }) + page.getByRole("textbox", { name: "Date of Issue" }), ).toHaveValue(dateOfIssue); // Fill in seller name @@ -578,11 +624,11 @@ test.describe("Invoice Generator Page", () => { // Check for error messages to be hidden await expect( - page.getByText("Seller name is required", { exact: true }) + page.getByText("Seller name is required", { exact: true }), ).toBeHidden(); await expect( - page.getByText("Buyer name is required", { exact: true }) + page.getByText("Buyer name is required", { exact: true }), ).toBeHidden(); }); @@ -636,12 +682,12 @@ test.describe("Invoice Generator Page", () => { "textbox", { name: "Value", - } + }, ); await expect(invoiceNumberValueField2).toHaveValue("TEST/2024"); await expect( - finalSection.getByRole("textbox", { name: "Notes", exact: true }) + finalSection.getByRole("textbox", { name: "Notes", exact: true }), ).toHaveValue("Test note"); }); @@ -659,7 +705,7 @@ test.describe("Invoice Generator Page", () => { await expect(netAmountFormElement).toHaveText("€EUR"); await expect( - invoiceItemsSection.getByText("Preview: €0.00 (zero EUR 00/100)") + invoiceItemsSection.getByText("Preview: €0.00 (zero EUR 00/100)"), ).toBeVisible(); const currencySelect = page.getByRole("combobox", { name: "Currency" }); @@ -687,8 +733,8 @@ test.describe("Invoice Generator Page", () => { "Preview: $100.75 (one hundred USD 75/100)", { exact: true, - } - ) + }, + ), ).toBeVisible(); const finalSection = page.getByTestId(`final-section`); @@ -696,7 +742,7 @@ test.describe("Invoice Generator Page", () => { finalSection.getByRole("textbox", { name: "Total", exact: true, - }) + }), ).toHaveValue("201.50"); }); @@ -716,7 +762,7 @@ test.describe("Invoice Generator Page", () => { const sectionElement = page.getByTestId(section.id); await expect(sectionElement).toBeVisible(); await expect( - sectionElement.getByRole("region", { name: section.label }) + sectionElement.getByRole("region", { name: section.label }), ).toBeVisible(); } @@ -735,25 +781,25 @@ test.describe("Invoice Generator Page", () => { await expect( page .getByTestId("general-information-section") - .getByRole("region", { name: "General Information" }) + .getByRole("region", { name: "General Information" }), ).toBeVisible(); await expect( page .getByTestId("seller-information-section") - .getByRole("region", { name: "Seller Information" }) + .getByRole("region", { name: "Seller Information" }), ).toBeHidden(); await expect( page .getByTestId("buyer-information-section") - .getByRole("region", { name: "Buyer Information" }) + .getByRole("region", { name: "Buyer Information" }), ).toBeVisible(); await expect( page .getByTestId("invoice-items-section") - .getByRole("region", { name: "Invoice Items" }) + .getByRole("region", { name: "Invoice Items" }), ).toBeHidden(); // Verify the state is saved in localStorage @@ -779,25 +825,25 @@ test.describe("Invoice Generator Page", () => { await expect( page .getByTestId("general-information-section") - .getByRole("region", { name: "General Information" }) + .getByRole("region", { name: "General Information" }), ).toBeVisible(); await expect( page .getByTestId("seller-information-section") - .getByRole("region", { name: "Seller Information" }) + .getByRole("region", { name: "Seller Information" }), ).toBeHidden(); await expect( page .getByTestId("buyer-information-section") - .getByRole("region", { name: "Buyer Information" }) + .getByRole("region", { name: "Buyer Information" }), ).toBeVisible(); await expect( page .getByTestId("invoice-items-section") - .getByRole("region", { name: "Invoice Items" }) + .getByRole("region", { name: "Invoice Items" }), ).toBeHidden(); // Toggle states after reload @@ -815,25 +861,25 @@ test.describe("Invoice Generator Page", () => { await expect( page .getByTestId("general-information-section") - .getByRole("region", { name: "General Information" }) + .getByRole("region", { name: "General Information" }), ).toBeHidden(); await expect( page .getByTestId("seller-information-section") - .getByRole("region", { name: "Seller Information" }) + .getByRole("region", { name: "Seller Information" }), ).toBeVisible(); await expect( page .getByTestId("buyer-information-section") - .getByRole("region", { name: "Buyer Information" }) + .getByRole("region", { name: "Buyer Information" }), ).toBeVisible(); await expect( page .getByTestId("invoice-items-section") - .getByRole("region", { name: "Invoice Items" }) + .getByRole("region", { name: "Invoice Items" }), ).toBeHidden(); // Verify updated state is saved in localStorage @@ -871,20 +917,20 @@ test.describe("Invoice Generator Page", () => { await amountInput.fill("1000000000000"); // 1 trillion await expect( - page.getByText("Amount must not exceed 9 999 999 999.99") + page.getByText("Amount must not exceed 9 999 999 999.99"), ).toBeVisible(); // Test valid values await amountInput.fill("1"); await expect(page.getByText("Amount must be positive")).toBeHidden(); await expect( - page.getByText("Amount must not exceed 9 999 999 999.99") + page.getByText("Amount must not exceed 9 999 999 999.99"), ).toBeHidden(); await amountInput.fill("9999999999.99"); // Maximum valid value await expect(page.getByText("Amount must be positive")).toBeHidden(); await expect( - page.getByText("Amount must not exceed 9 999 999 999.99") + page.getByText("Amount must not exceed 9 999 999 999.99"), ).toBeHidden(); // **NET PRICE FIELD** @@ -900,7 +946,7 @@ test.describe("Invoice Generator Page", () => { // Test exceeding maximum value await netPriceInput.fill("1000000000000"); // 1 trillion await expect( - page.getByText("Net price must not exceed 100 billion") + page.getByText("Net price must not exceed 100 billion"), ).toBeVisible(); // Test zero value @@ -911,7 +957,7 @@ test.describe("Invoice Generator Page", () => { await netPriceInput.fill("1"); await expect(page.getByText("Net price must be >= 0")).toBeHidden(); await expect( - page.getByText("Net price must not exceed 100 billion") + page.getByText("Net price must not exceed 100 billion"), ).toBeHidden(); // **VAT FIELD** @@ -930,7 +976,7 @@ test.describe("Invoice Generator Page", () => { await vatInput.fill("abc"); await expect( - page.getByText("Must be a valid number (0-100) or NP or OO") + page.getByText("Must be a valid number (0-100) or NP or OO"), ).toBeVisible(); // Try valid values @@ -939,12 +985,12 @@ test.describe("Invoice Generator Page", () => { await vatInput.fill("NP"); await expect( - page.getByText("Must be a valid number (0-100) or NP or OO") + page.getByText("Must be a valid number (0-100) or NP or OO"), ).toBeHidden(); await vatInput.fill("OO"); await expect( - page.getByText("Must be a valid number (0-100) or NP or OO") + page.getByText("Must be a valid number (0-100) or NP or OO"), ).toBeHidden(); }); @@ -1017,171 +1063,29 @@ test.describe("Invoice Generator Page", () => { invoiceItemsSection.getByRole("textbox", { name: "Net Amount", exact: true, - }) + }), ).toHaveValue(testCase.expected.net); await expect( invoiceItemsSection.getByRole("textbox", { name: "VAT Amount", exact: true, - }) + }), ).toHaveValue(testCase.expected.vatAmount); await expect( invoiceItemsSection.getByRole("textbox", { name: "Pre-tax Amount", exact: true, - }) + }), ).toHaveValue(testCase.expected.total); await expect( page.getByRole("textbox", { name: "Total", exact: true, - }) + }), ).toHaveValue(testCase.expected.total); } }); - - test("can share invoice and data is persisted in new tab", async ({ - page, - context, - }) => { - // Fill in some test data - const invoiceNumberFieldset = page.getByRole("group", { - name: "Invoice Number", - }); - - const invoiceNumberValueField = invoiceNumberFieldset.getByRole("textbox", { - name: "Value", - }); - - await invoiceNumberValueField.fill("SHARE-TEST-001"); - - const finalSection = page.getByTestId(`final-section`); - - await finalSection - .getByRole("textbox", { name: "Notes", exact: true }) - .fill("Test note for sharing"); - - // Fill in seller information - const sellerSection = page.getByTestId("seller-information-section"); - await sellerSection - .getByRole("textbox", { name: "Name" }) - .fill("Test Seller"); - await sellerSection - .getByRole("textbox", { name: "Address" }) - .fill("123 Test St"); - await sellerSection - .getByRole("textbox", { name: "Email" }) - .fill("seller@test.com"); - - // Fill in an invoice item - const invoiceItemsSection = page.getByTestId("invoice-items-section"); - await invoiceItemsSection - .getByRole("spinbutton", { name: "Amount (Quantity)" }) - .fill("5"); - await invoiceItemsSection - .getByRole("spinbutton", { - name: "Net Price (Rate or Unit Price)", - }) - .fill("100"); - await invoiceItemsSection - .getByRole("textbox", { name: "VAT", exact: true }) - .fill("23"); - - // wait for debounce timeout - // eslint-disable-next-line playwright/no-wait-for-timeout - await page.waitForTimeout(600); - - // Generate share link - await page - .getByRole("button", { name: "Generate a link to invoice" }) - .click(); - - // Wait for URL to update with share data - await page.waitForURL((url) => url.searchParams.has("data")); - - // Get the current URL which should now contain the share data - const sharedUrl = page.url(); - expect(sharedUrl).toContain("?data="); - - // Open URL in new tab - const newPage = await context.newPage(); - await newPage.goto(sharedUrl); - - // Verify data is loaded in new tab - await expect( - invoiceNumberFieldset.getByRole("textbox", { name: "Value" }) - ).toHaveValue("SHARE-TEST-001"); - - const newPageFinalSection = newPage.getByTestId(`final-section`); - - await expect( - newPageFinalSection.getByRole("textbox", { name: "Notes", exact: true }) - ).toHaveValue("Test note for sharing"); - - // Verify seller information - const newSellerSection = newPage.getByTestId("seller-information-section"); - await expect( - newSellerSection.getByRole("textbox", { name: "Name" }) - ).toHaveValue("Test Seller"); - await expect( - newSellerSection.getByRole("textbox", { name: "Address" }) - ).toHaveValue("123 Test St"); - await expect( - newSellerSection.getByRole("textbox", { name: "Email" }) - ).toHaveValue("seller@test.com"); - - // Verify invoice item - const newInvoiceItemsSection = newPage.getByTestId("invoice-items-section"); - await expect( - newInvoiceItemsSection.getByRole("spinbutton", { - name: "Amount (Quantity)", - }) - ).toHaveValue("5"); - await expect( - newInvoiceItemsSection.getByRole("spinbutton", { - name: "Net Price (Rate or Unit Price)", - }) - ).toHaveValue("100"); - await expect( - newInvoiceItemsSection.getByRole("textbox", { name: "VAT", exact: true }) - ).toHaveValue("23"); - - // Close the new page - await newPage.close(); - }); - - test("shows notification when invoice link is broken", async ({ page }) => { - // Navigate to page with invalid data parameter - await page.goto("/?data=invalid-data-string"); - - // Verify error toast appears - await expect( - page.getByText("The shared invoice URL appears to be incorrect") - ).toBeVisible(); - - // Verify error description is shown - await expect( - page.getByText( - "Please verify that you have copied the complete invoice URL. The link may be truncated or corrupted." - ) - ).toBeVisible(); - - // Verify clear URL button is present - await expect(page.getByRole("button", { name: "Clear URL" })).toBeVisible(); - - // Click clear URL button - await page.getByRole("button", { name: "Clear URL" }).click(); - - // Verify toast is dismissed - await expect( - page.getByText("The shared invoice URL appears to be incorrect") - ).toBeHidden(); - - // Wait for URL to be cleared and verify - await expect(page).toHaveURL("/"); - await expect(page).not.toHaveURL(/\?data=/); - }); }); diff --git a/e2e/not-found-page.test.ts b/e2e/not-found-page.test.ts index 9c96c6f..5449a36 100644 --- a/e2e/not-found-page.test.ts +++ b/e2e/not-found-page.test.ts @@ -12,7 +12,7 @@ test.describe("Not Found page", () => { // Verify error message is displayed await expect(page.getByText("404")).toBeVisible(); await expect( - page.getByRole("heading", { name: "This page could not be found." }) + page.getByRole("heading", { name: "This page could not be found." }), ).toBeVisible(); // Check return home link @@ -34,7 +34,7 @@ test.describe("Not Found page", () => { // Verify error message is displayed in English (default locale) await expect(page.getByText("404")).toBeVisible(); await expect( - page.getByRole("heading", { name: "This page could not be found." }) + page.getByRole("heading", { name: "This page could not be found." }), ).toBeVisible(); // Check return home link diff --git a/e2e/seller.test.ts b/e2e/seller.test.ts index 2f660a5..591b1fc 100644 --- a/e2e/seller.test.ts +++ b/e2e/seller.test.ts @@ -55,13 +55,13 @@ test.describe("Seller management", () => { // Verify all switches are checked by default await expect( - manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0) + manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0), ).toBeChecked(); await expect( - manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(1) + manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(1), ).toBeChecked(); await expect( - manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(2) + manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(2), ).toBeChecked(); // Toggle some visibility switches @@ -80,7 +80,7 @@ test.describe("Seller management", () => { .fill(testData.notes); const notesSellerSwitch = manageSellerDialog.getByTestId( - `sellerNotesDialogFieldVisibilitySwitch` + `sellerNotesDialogFieldVisibilitySwitch`, ); await expect(notesSellerSwitch).toHaveRole("switch"); @@ -92,12 +92,12 @@ test.describe("Seller management", () => { await expect( manageSellerDialog.getByRole("switch", { name: "Apply to Current Invoice", - }) + }), ).toBeChecked(); // Cancel button is shown await expect( - manageSellerDialog.getByRole("button", { name: "Cancel" }) + manageSellerDialog.getByRole("button", { name: "Cancel" }), ).toBeVisible(); // Save seller @@ -134,7 +134,7 @@ test.describe("Seller management", () => { // Verify success toast message is visible await expect( - page.getByText("Seller added successfully", { exact: true }) + page.getByText("Seller added successfully", { exact: true }), ).toBeVisible(); // ------- TEST SAVED DETAILS IN INVOICE FORM ------- @@ -145,7 +145,7 @@ test.describe("Seller management", () => { const nameInput = sellerForm.getByRole("textbox", { name: "Name" }); await expect(nameInput).toHaveAttribute( "title", - "Seller details are locked. Click the Edit Seller button (Pencil icon) to modify." + "Seller details are locked. Click the Edit Seller button (Pencil icon) to modify.", ); // Seller Name @@ -154,18 +154,18 @@ test.describe("Seller management", () => { // Seller Address await expect( - sellerForm.getByRole("textbox", { name: "Address" }) + sellerForm.getByRole("textbox", { name: "Address" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - sellerForm.getByRole("textbox", { name: "Address" }) + sellerForm.getByRole("textbox", { name: "Address" }), ).toHaveValue(testData.address); // Seller VAT Number await expect( - sellerForm.getByRole("textbox", { name: "VAT Number" }) + sellerForm.getByRole("textbox", { name: "VAT Number" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - sellerForm.getByRole("textbox", { name: "VAT Number" }) + sellerForm.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(testData.vatNo); const vatNumberSwitch = sellerForm.getByTestId(`sellerVatNoFieldIsVisible`); @@ -175,22 +175,22 @@ test.describe("Seller management", () => { // Seller Email await expect( - sellerForm.getByRole("textbox", { name: "Email" }) + sellerForm.getByRole("textbox", { name: "Email" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - sellerForm.getByRole("textbox", { name: "Email" }) + sellerForm.getByRole("textbox", { name: "Email" }), ).toHaveValue(testData.email); // Seller Account Number await expect( - sellerForm.getByRole("textbox", { name: "Account Number" }) + sellerForm.getByRole("textbox", { name: "Account Number" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - sellerForm.getByRole("textbox", { name: "Account Number" }) + sellerForm.getByRole("textbox", { name: "Account Number" }), ).toHaveValue(testData.accountNumber); const accountNumberSwitch = sellerForm.getByTestId( - `sellerAccountNumberFieldIsVisible` + `sellerAccountNumberFieldIsVisible`, ); // Verify Account Number switch is visible await expect(accountNumberSwitch).not.toBeChecked(); @@ -198,14 +198,14 @@ test.describe("Seller management", () => { // Seller SWIFT/BIC await expect( - sellerForm.getByRole("textbox", { name: "SWIFT/BIC" }) + sellerForm.getByRole("textbox", { name: "SWIFT/BIC" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - sellerForm.getByRole("textbox", { name: "SWIFT/BIC" }) + sellerForm.getByRole("textbox", { name: "SWIFT/BIC" }), ).toHaveValue(testData.swiftBic); const swiftBicSwitch = sellerForm.getByTestId( - `sellerSwiftBicFieldIsVisible` + `sellerSwiftBicFieldIsVisible`, ); // Verify SWIFT/BIC switch is visible await expect(swiftBicSwitch).not.toBeChecked(); @@ -213,14 +213,14 @@ test.describe("Seller management", () => { // Seller Notes await expect( - sellerForm.getByRole("textbox", { name: "Notes" }) + sellerForm.getByRole("textbox", { name: "Notes" }), ).toHaveAttribute("aria-readonly", "true"); await expect( - sellerForm.getByRole("textbox", { name: "Notes" }) + sellerForm.getByRole("textbox", { name: "Notes" }), ).toHaveValue(testData.notes); const notesSwitch = sellerForm.getByTestId( - `sellerNotesInvoiceFormFieldVisibilitySwitch` + `sellerNotesInvoiceFormFieldVisibilitySwitch`, ); // Verify Notes switch is visible await expect(notesSwitch).toBeChecked(); @@ -228,7 +228,7 @@ test.describe("Seller management", () => { // Verify the seller appears in the dropdown await expect( - sellerForm.getByRole("combobox", { name: "Select Seller" }) + sellerForm.getByRole("combobox", { name: "Select Seller" }), ).toContainText(testData.name); // Test edit functionality @@ -237,43 +237,43 @@ test.describe("Seller management", () => { // ------- TEST EDIT FUNCTIONALITY IN SELLER MANAGEMENT DIALOG ------- // Verify all fields are populated in edit dialog await expect( - manageSellerDialog.getByRole("textbox", { name: "Name" }) + manageSellerDialog.getByRole("textbox", { name: "Name" }), ).toHaveValue(testData.name); await expect( - manageSellerDialog.getByRole("textbox", { name: "Address" }) + manageSellerDialog.getByRole("textbox", { name: "Address" }), ).toHaveValue(testData.address); await expect( - manageSellerDialog.getByRole("textbox", { name: "VAT Number" }) + manageSellerDialog.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(testData.vatNo); await expect( - manageSellerDialog.getByRole("textbox", { name: "Email" }) + manageSellerDialog.getByRole("textbox", { name: "Email" }), ).toHaveValue(testData.email); await expect( - manageSellerDialog.getByRole("textbox", { name: "Account Number" }) + manageSellerDialog.getByRole("textbox", { name: "Account Number" }), ).toHaveValue(testData.accountNumber); await expect( - manageSellerDialog.getByRole("textbox", { name: "SWIFT/BIC" }) + manageSellerDialog.getByRole("textbox", { name: "SWIFT/BIC" }), ).toHaveValue(testData.swiftBic); // Verify visibility switches state persisted in edit dialog await expect( - manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0) + manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(0), ).toBeChecked(); await expect( - manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(1) + manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(1), ).not.toBeChecked(); await expect( - manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(2) + manageSellerDialog.getByRole("switch", { name: "Show in PDF" }).nth(2), ).not.toBeChecked(); // Verify notes text await expect( - manageSellerDialog.getByRole("textbox", { name: "Notes" }) + manageSellerDialog.getByRole("textbox", { name: "Notes" }), ).toHaveValue(testData.notes); // Verify notes visibility switch is checked const notesManageSellerDialogFormSwitch = manageSellerDialog.getByTestId( - `sellerNotesDialogFieldVisibilitySwitch` + `sellerNotesDialogFieldVisibilitySwitch`, ); await expect(notesManageSellerDialogFormSwitch).toBeChecked(); @@ -323,7 +323,7 @@ test.describe("Seller management", () => { // Verify seller was added const sellerForm = page.getByTestId(`seller-information-section`); await expect( - sellerForm.getByRole("combobox", { name: "Select Seller" }) + sellerForm.getByRole("combobox", { name: "Select Seller" }), ).toContainText(testData.name); // Click delete button @@ -349,8 +349,8 @@ test.describe("Seller management", () => { await expect( page.getByText( - `Are you sure you want to delete "${testData.name}" seller?` - ) + `Are you sure you want to delete "${testData.name}" seller?`, + ), ).toBeVisible(); // Confirm deletion @@ -358,33 +358,33 @@ test.describe("Seller management", () => { // Verify success message await expect( - page.getByText("Seller deleted successfully", { exact: true }) + page.getByText("Seller deleted successfully", { exact: true }), ).toBeVisible(); // Verify seller is removed from dropdown // because we have only one seller, dropdown will be completely hidden await expect( - sellerForm.getByRole("combobox", { name: "Select Seller" }) + sellerForm.getByRole("combobox", { name: "Select Seller" }), ).toBeHidden(); // Verify form is reset to default values await expect(sellerForm.getByRole("textbox", { name: "Name" })).toHaveValue( - DEFAULT_SELLER_DATA.name + DEFAULT_SELLER_DATA.name, ); await expect( - sellerForm.getByRole("textbox", { name: "Address" }) + sellerForm.getByRole("textbox", { name: "Address" }), ).toHaveValue(DEFAULT_SELLER_DATA.address); await expect( - sellerForm.getByRole("textbox", { name: "Email" }) + sellerForm.getByRole("textbox", { name: "Email" }), ).toHaveValue(DEFAULT_SELLER_DATA.email); await expect( - sellerForm.getByRole("textbox", { name: "VAT Number" }) + sellerForm.getByRole("textbox", { name: "VAT Number" }), ).toHaveValue(DEFAULT_SELLER_DATA.vatNo); await expect( - sellerForm.getByRole("textbox", { name: "Account Number" }) + sellerForm.getByRole("textbox", { name: "Account Number" }), ).toHaveValue(DEFAULT_SELLER_DATA.accountNumber); await expect( - sellerForm.getByRole("textbox", { name: "SWIFT/BIC" }) + sellerForm.getByRole("textbox", { name: "SWIFT/BIC" }), ).toHaveValue(DEFAULT_SELLER_DATA.swiftBic); }); }); diff --git a/e2e/stripe-invoice-template/share-logic.test.ts b/e2e/stripe-invoice-template/share-logic.test.ts index 3527720..cb0a145 100644 --- a/e2e/stripe-invoice-template/share-logic.test.ts +++ b/e2e/stripe-invoice-template/share-logic.test.ts @@ -15,11 +15,19 @@ test.describe("Stripe Invoice Sharing Logic", () => { test("can share invoice with Stripe template and *WITHOUT* logo", async ({ page, }) => { + // Verify default template is selected by default + await expect(page).toHaveURL("/?template=default"); + // Switch to Stripe template await page .getByRole("combobox", { name: "Invoice Template" }) .selectOption("stripe"); + // Wait for URL to be updated + await page.waitForURL("/?template=stripe"); + + await expect(page).toHaveURL("/?template=stripe"); + // Verify share button is still enabled (no logo uploaded) const shareButton = page.getByRole("button", { name: "Generate a link to invoice", @@ -33,7 +41,65 @@ test.describe("Stripe Invoice Sharing Logic", () => { // Verify URL contains shared data await page.waitForURL((url) => url.searchParams.has("data")); - expect(page.url()).toContain("?data="); + const url = page.url(); + expect(url).toContain(`?template=stripe&data=`); + + // Verify data parameter is not empty + const urlObj = new URL(url); + const dataParam = urlObj.searchParams.get("data"); + expect(dataParam).toBeTruthy(); + expect(dataParam).not.toBe(""); + + // ------------------------------------------------------------ + // Open URL in new tab + // ------------------------------------------------------------ + const context = page.context(); + const newPage = await context.newPage(); + await newPage.goto(url); + + const newUrl = newPage.url(); + expect(newUrl).toContain(`?template=stripe&data=`); + + // Verify data parameter is not empty + const newUrlObj = new URL(newUrl); + const newDataParam = newUrlObj.searchParams.get("data"); + expect(newDataParam).toBeTruthy(); + expect(newDataParam).not.toBe(""); + + // Verify stripe template UI elements are visible + const newPageGeneralInfoSection = newPage.getByTestId( + "general-information-section", + ); + + // Verify logo upload section is visible (but empty since no logo was shared) + await expect( + newPageGeneralInfoSection.getByText("Company Logo (Optional)"), + ).toBeVisible(); + + // Verify payment URL section is visible + await expect( + newPageGeneralInfoSection.getByRole("textbox", { + name: "Payment Link URL (Optional)", + }), + ).toBeVisible(); + + const finalSection = newPage.getByTestId(`final-section`); + + // Verify that signature fields are hidden (there are only for default template) + await expect( + finalSection.getByRole("switch", { + name: 'Show "Person Authorized to Receive" Signature Field in the PDF', + }), + ).toBeHidden(); + + await expect( + finalSection.getByRole("switch", { + name: 'Show "Person Authorized to Issue" Signature Field in the PDF', + }), + ).toBeHidden(); + + // Close the new page + await newPage.close(); }); test("cannot share invoice with Stripe template and *WITH* logo", async ({ @@ -49,7 +115,7 @@ test.describe("Stripe Invoice Sharing Logic", () => { // Wait for logo to be uploaded const generalInfoSection = page.getByTestId("general-information-section"); await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); // Verify share button is disabled @@ -60,17 +126,16 @@ test.describe("Stripe Invoice Sharing Logic", () => { // click over share button to verify tooltip // on mobile, we need to click the button to show the toast because it's better UX for user (you can't hover on mobile) - // eslint-disable-next-line playwright/no-force-option - await shareButton.click({ force: true }); + await shareButton.click(); await expect(page.getByText("Unable to Share Invoice")).toBeVisible({ - timeout: 700, + timeout: 2000, }); await expect( page.getByText( - "Invoices with logos cannot be shared. Please remove the logo to generate a shareable link. You can still download the invoice as PDF and share it." - ) + "Invoices with logos cannot be shared. Please remove the logo to generate a shareable link. You can still download the invoice as PDF and share it.", + ), ).toBeVisible(); }); @@ -86,7 +151,7 @@ test.describe("Stripe Invoice Sharing Logic", () => { await page.evaluate((base64Data) => { const fileInput = document.querySelector( - "#logoUpload" + "#logoUpload", ) as HTMLInputElement; if (fileInput) { @@ -105,9 +170,13 @@ test.describe("Stripe Invoice Sharing Logic", () => { } }, SMALL_TEST_IMAGE_BASE64); + // Wait for logo to be uploaded + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(600); + const generalInfoSection = page.getByTestId("general-information-section"); await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); // Verify share button is disabled @@ -123,7 +192,7 @@ test.describe("Stripe Invoice Sharing Logic", () => { // Wait for logo to be removed await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeHidden(); // Verify share button is enabled again @@ -133,10 +202,18 @@ test.describe("Stripe Invoice Sharing Logic", () => { // Test that sharing works await shareButton.click(); await page.waitForURL((url) => url.searchParams.has("data")); - expect(page.url()).toContain("?data="); + + const url = page.url(); + expect(url).toContain(`?template=stripe&data=`); + + // Verify data parameter is not empty + const urlObj = new URL(url); + const dataParam = urlObj.searchParams.get("data"); + expect(dataParam).toBeTruthy(); + expect(dataParam).not.toBe(""); await expect( - page.getByText("Invoice link copied to clipboard!") + page.getByText("Invoice link copied to clipboard!"), ).toBeVisible(); }); @@ -157,7 +234,7 @@ test.describe("Stripe Invoice Sharing Logic", () => { // Upload a logo await page.evaluate((base64Data) => { const fileInput = document.querySelector( - "#logoUpload" + "#logoUpload", ) as HTMLInputElement; if (fileInput) { const byteString = atob(base64Data.split(",")[1]); @@ -194,12 +271,14 @@ test.describe("Stripe Invoice Sharing Logic", () => { .getByRole("combobox", { name: "Invoice Template" }) .selectOption("stripe"); + await page.waitForURL("/?template=stripe"); + await page.evaluate(uploadBase64LogoAsFile, SMALL_TEST_IMAGE_BASE64); // Wait for upload and verify share button is disabled const generalInfoSection = page.getByTestId("general-information-section"); await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); const shareButton = page.getByRole("button", { @@ -229,12 +308,14 @@ test.describe("Stripe Invoice Sharing Logic", () => { // Reload the page await page.reload(); + await page.waitForURL("/?template=stripe"); + // Verify state persists after reload await expect( - page.getByRole("combobox", { name: "Invoice Template" }) + page.getByRole("combobox", { name: "Invoice Template" }), ).toHaveValue("stripe"); await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); // Verify share button is still disabled @@ -275,8 +356,8 @@ test.describe("Stripe Invoice Sharing Logic", () => { await expect( page.getByText( - "Invoices with logos cannot be shared. Please remove the logo to generate a shareable link. You can still download the invoice as PDF and share it." - ) + "Invoices with logos cannot be shared. Please remove the logo to generate a shareable link. You can still download the invoice as PDF and share it.", + ), ).toBeVisible(); // Remove logo and verify sharing works again diff --git a/e2e/stripe-invoice-template/template.test.ts b/e2e/stripe-invoice-template/template.test.ts index b97b4b0..9df2520 100644 --- a/e2e/stripe-invoice-template/template.test.ts +++ b/e2e/stripe-invoice-template/template.test.ts @@ -68,24 +68,75 @@ test.describe("Stripe Invoice Template", () => { await page.evaluate(() => localStorage.clear()); }); + test("displays correct OG meta tags for Stripe template", async ({ + page, + }) => { + // Navigate to Stripe template + await page.goto("/?template=stripe"); + + await expect(page).toHaveURL("/?template=stripe"); + + const templateCombobox = page.getByRole("combobox", { + name: "Invoice Template", + }); + await expect(templateCombobox).toHaveValue("stripe"); + + // Check that OG image changed to Stripe template + await expect(page.locator('meta[property="og:image"]')).toHaveAttribute( + "content", + "https://static.easyinvoicepdf.com/stripe-og.png", + ); + + // Check other meta tags for Stripe template + await expect(page.locator('meta[property="og:title"]')).toHaveAttribute( + "content", + "Stripe Invoice Template | Free Invoice Generator", + ); + await expect( + page.locator('meta[property="og:description"]'), + ).toHaveAttribute( + "content", + "Create and download professional invoices instantly with EasyInvoicePDF.com. Free and open-source. No signup required.", + ); + await expect(page.locator('meta[property="og:site_name"]')).toHaveAttribute( + "content", + "EasyInvoicePDF.com | Free Invoice Generator", + ); + + // Verify OG image dimensions + await expect( + page.locator('meta[property="og:image:width"]'), + ).toHaveAttribute("content", "1200"); + await expect( + page.locator('meta[property="og:image:height"]'), + ).toHaveAttribute("content", "630"); + await expect(page.locator('meta[property="og:image:alt"]')).toHaveAttribute( + "content", + "Stripe Invoice Template", + ); + }); + test("logo upload section and payment link URL section only appear for Stripe template", async ({ page, }) => { + // Verify default template is selected by default + await expect(page).toHaveURL("/?template=default"); + const generalInfoSection = page.getByTestId("general-information-section"); // Initially default template - logo section should not be visible await expect( - generalInfoSection.getByText("Company Logo (Optional)") + generalInfoSection.getByText("Company Logo (Optional)"), ).toBeHidden(); await expect( - generalInfoSection.getByTestId("stripe-logo-upload-input") + generalInfoSection.getByTestId("stripe-logo-upload-input"), ).toBeHidden(); // Payment URL section should not be visible await expect( generalInfoSection.getByRole("textbox", { name: "Payment Link URL (Optional)", - }) + }), ).toBeHidden(); // Switch to Stripe template @@ -93,26 +144,31 @@ test.describe("Stripe Invoice Template", () => { .getByRole("combobox", { name: "Invoice Template" }) .selectOption("stripe"); + // Wait for URL to be updated + await page.waitForURL("/?template=stripe"); + + await expect(page).toHaveURL("/?template=stripe"); + // Logo section should now be visible await expect( - generalInfoSection.getByTestId("stripe-logo-upload-input") + generalInfoSection.getByTestId("stripe-logo-upload-input"), ).toBeVisible(); await expect( - generalInfoSection.getByText("Company Logo (Optional)") + generalInfoSection.getByText("Company Logo (Optional)"), ).toBeVisible(); await expect( - generalInfoSection.getByText("Click to upload your company logo") + generalInfoSection.getByText("Click to upload your company logo"), ).toBeVisible(); await expect( - generalInfoSection.getByText("JPEG, PNG or WebP (max 3MB)") + generalInfoSection.getByText("JPEG, PNG or WebP (max 3MB)"), ).toBeVisible(); // Payment URL section should now be visible await expect( generalInfoSection.getByRole("textbox", { name: "Payment Link URL (Optional)", - }) + }), ).toBeVisible(); // Switch back to default template @@ -122,18 +178,18 @@ test.describe("Stripe Invoice Template", () => { // Logo section should be hidden again await expect( - generalInfoSection.getByText("Company Logo (Optional)") + generalInfoSection.getByText("Company Logo (Optional)"), ).toBeHidden(); await expect( - generalInfoSection.getByTestId("stripe-logo-upload-input") + generalInfoSection.getByTestId("stripe-logo-upload-input"), ).toBeHidden(); // Payment URL section should be hidden again await expect( generalInfoSection.getByRole("textbox", { name: "Payment Link URL (Optional)", - }) + }), ).toBeHidden(); }); @@ -148,7 +204,7 @@ test.describe("Stripe Invoice Template", () => { // Create a mock file input event with invalid file type await page.evaluate(() => { const fileInput = document.querySelector( - "#logoUpload" + "#logoUpload", ) as HTMLInputElement; if (fileInput) { // Create a mock file with invalid type @@ -164,7 +220,7 @@ test.describe("Stripe Invoice Template", () => { // Should show error toast await expect( - page.getByText("Please select a valid image file (JPEG, PNG or WebP)") + page.getByText("Please select a valid image file (JPEG, PNG or WebP)"), ).toBeVisible(); }); @@ -179,7 +235,7 @@ test.describe("Stripe Invoice Template", () => { // Create a mock file input event with large file await page.evaluate(() => { const fileInput = document.querySelector( - "#logoUpload" + "#logoUpload", ) as HTMLInputElement; if (fileInput) { // Create a mock file that's too large (4MB) @@ -198,7 +254,7 @@ test.describe("Stripe Invoice Template", () => { // Should show error toast await expect( - page.getByText("Image size must be less than 3MB") + page.getByText("Image size must be less than 3MB"), ).toBeVisible(); }); @@ -220,22 +276,22 @@ test.describe("Stripe Invoice Template", () => { // Should show logo preview await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); await expect( generalInfoSection.getByText( - "Logo uploaded successfully. Click the X to remove it." - ) + "Logo uploaded successfully. Click the X to remove it.", + ), ).toBeVisible(); // Should show remove button await expect( - generalInfoSection.getByRole("button", { name: "Remove logo" }) + generalInfoSection.getByRole("button", { name: "Remove logo" }), ).toBeVisible(); // Upload area should be hidden await expect( - generalInfoSection.getByText("Click to upload your company logo") + generalInfoSection.getByText("Click to upload your company logo"), ).toBeHidden(); }); @@ -252,7 +308,7 @@ test.describe("Stripe Invoice Template", () => { // Wait for logo to be uploaded await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); // Click remove button @@ -265,12 +321,12 @@ test.describe("Stripe Invoice Template", () => { // Logo preview should be hidden await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeHidden(); // Upload area should be visible again await expect( - generalInfoSection.getByText("Click to upload your company logo") + generalInfoSection.getByText("Click to upload your company logo"), ).toBeVisible(); }); @@ -340,7 +396,7 @@ test.describe("Stripe Invoice Template", () => { const pdfData = await pdf(dataBuffer); expect((pdfData.info as { Title: string }).Title).toContain( - `Invoice 1/${CURRENT_MONTH_AND_YEAR} | Created with https://easyinvoicepdf.com` + `Invoice 1/${CURRENT_MONTH_AND_YEAR} | Created with https://easyinvoicepdf.com`, ); expect(pdfData.text).toContain("Invoice"); @@ -355,7 +411,7 @@ test.describe("Stripe Invoice Template", () => { expect(pdfData.text).toContain( "Account Number: Seller account num-\nber\n" + "SWIFT/BIC number: Seller swift bic\n" + - "Bill to\n" + "Bill to\n", ); expect(pdfData.text).toContain("Bill to"); @@ -371,7 +427,7 @@ test.describe("Stripe Invoice Template", () => { expect(pdfData.text).toContain("DescriptionQtyUnit PriceAmount"); expect(pdfData.text).toContain("Item name"); expect(pdfData.text).toContain( - `${START_OF_CURRENT_MONTH} – ${LAST_DAY_OF_CURRENT_MONTH}` + `${START_OF_CURRENT_MONTH} – ${LAST_DAY_OF_CURRENT_MONTH}`, ); expect(pdfData.text).toContain("1€0.00€0.00"); expect(pdfData.text).toContain("Subtotal€0.00"); @@ -379,7 +435,7 @@ test.describe("Stripe Invoice Template", () => { expect(pdfData.text).toContain("Amount Due€0.00"); expect(pdfData.text).toContain("Reverse charge"); expect(pdfData.text).toContain( - `1/${CURRENT_MONTH_AND_YEAR}·€0.00 due ${PAYMENT_DATE}·Created with https://easyinvoicepdf.comPage 1 of 1` + `1/${CURRENT_MONTH_AND_YEAR}·€0.00 due ${PAYMENT_DATE}·Created with https://easyinvoicepdf.comPage 1 of 1`, ); }); @@ -407,7 +463,7 @@ test.describe("Stripe Invoice Template", () => { // Should not show error for valid URL await expect(paymentUrlInput).toHaveValue( - "https://buy.stripe.com/test_payment_link" + "https://buy.stripe.com/test_payment_link", ); }); @@ -429,7 +485,7 @@ test.describe("Stripe Invoice Template", () => { // Wait a moment for any debounced localStorage updates // eslint-disable-next-line playwright/no-wait-for-timeout - await page.waitForTimeout(500); + await page.waitForTimeout(600); // Verify data is actually saved in localStorage const storedData = (await page.evaluate((key) => { @@ -449,19 +505,19 @@ test.describe("Stripe Invoice Template", () => { // Verify template is still Stripe await expect( - page.getByRole("combobox", { name: "Invoice Template" }) + page.getByRole("combobox", { name: "Invoice Template" }), ).toHaveValue("stripe"); // Verify payment URL persists await expect( generalInfoSection.getByRole("textbox", { name: "Payment Link URL (Optional)", - }) + }), ).toHaveValue("https://buy.stripe.com/test_payment_link"); // Verify logo persists await expect( - generalInfoSection.getByAltText("Company logo preview") + generalInfoSection.getByAltText("Company logo preview"), ).toBeVisible(); }); }); diff --git a/e2e/stripe-invoice-template/utils.ts b/e2e/stripe-invoice-template/utils.ts index 1bbf433..cbfb54a 100644 --- a/e2e/stripe-invoice-template/utils.ts +++ b/e2e/stripe-invoice-template/utils.ts @@ -10,7 +10,7 @@ export const SMALL_TEST_IMAGE_BASE64 = export const uploadBase64LogoAsFile = (base64Data: string) => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion const fileInput = document.querySelector( - "#logoUpload" + "#logoUpload", ) as HTMLInputElement | null; if (!fileInput) { diff --git a/eslint.config.mjs b/eslint.config.mjs index 62e0bd9..1424830 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -97,5 +97,5 @@ export default tseslint.config( projectService: true, }, }, - } + }, ); diff --git a/knip.ts b/knip.ts index fe9b225..d2e80fb 100644 --- a/knip.ts +++ b/knip.ts @@ -15,7 +15,6 @@ const config: KnipConfig = { "@ianvs/prettier-plugin-sort-imports", "react-email", "react-scan", - "@stagewise/toolbar-next", ], ignore: [ "lint-staged.config.js", diff --git a/lint-staged.config.js b/lint-staged.config.js index a8c267a..9c91b4e 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -4,7 +4,7 @@ module.exports = { "*": () => [ `pnpm run type-check:go`, `pnpm run lint`, - `pnpm run knip`, + // `pnpm run knip`, // TODO: temporarily disabled due to issues with knip `pnpm run prettify --write`, ], }; diff --git a/messages/en.json b/messages/en.json index a5c8a90..e5812bb 100644 --- a/messages/en.json +++ b/messages/en.json @@ -11,7 +11,7 @@ "badge": "Features", "title": "Everything you need for professional invoicing", "description": "Our simple yet powerful invoice generator includes all the features you need to create professional invoices quickly.", - "comingSoon": "Pro version and API coming soon", + "comingSoon": "E-invoices support coming soon", "items": { "livePreview": { "title": "Live Preview", diff --git a/next.config.mjs b/next.config.mjs index 9c1c77c..97d2252 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -22,7 +22,7 @@ async function validatei18nAndTranslationFiles() { // Import the translations schema using jiti // @ts-ignore const { translationsSchema, TRANSLATIONS } = await loadTsFileViaJiti.import( - "./src/app/schema/translations.ts" + "./src/app/schema/translations.ts", ); const result = translationsSchema.safeParse(TRANSLATIONS); @@ -41,7 +41,7 @@ async function validatei18nAndTranslationFiles() { // Import the messages schema using jiti // @ts-ignore const { messagesSchema } = await loadTsFileViaJiti.import( - "./src/app/schema/i18n-schema.ts" + "./src/app/schema/i18n-schema.ts", ); // Validate messages @@ -52,7 +52,7 @@ async function validatei18nAndTranslationFiles() { const validationPromises = is18nJSONMessageFiles.map(async (file) => { try { const messages = JSON.parse( - await fs.promises.readFile(path.join(messagesDir, file), "utf8") + await fs.promises.readFile(path.join(messagesDir, file), "utf8"), ); const result = messagesSchema.safeParse(messages); @@ -83,7 +83,7 @@ async function validatei18nAndTranslationFiles() { const hasErrors = results.some( (result) => result.status === "rejected" || - (result.status === "fulfilled" && !result.value.success) + (result.status === "fulfilled" && !result.value.success), ); if (hasErrors) { @@ -93,7 +93,7 @@ async function validatei18nAndTranslationFiles() { } else if (!result.value.success) { console.error( `❌ Invalid i18n messages in ${result.value.file}:`, - result.value.error + result.value.error, ); } }); diff --git a/package.json b/package.json index 164f536..55a5dfd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "pdf-invoice-generator", "version": "0.1.0", "private": true, - "packageManager": "pnpm@10.9.0", + "packageManager": "pnpm@10.14.0", "engines": { "node": ">=20.0.0" }, @@ -17,7 +17,8 @@ "prettify": "prettier --write --cache '**/*.{ts?(x),json,js,mjs,yml,yaml,md}'", "knip": "knip", "update-deps": "pnpm upgrade --interactive --latest", - "test": "pnpm exec playwright test --reporter=list", + "vitest": "vitest --reporter=verbose", + "vitest:ui": "vitest --ui", "e2e": "pnpm exec playwright test --reporter=list", "e2e:ui": "pnpm exec playwright test --ui", "dedupe": "pnpm dedupe", @@ -31,6 +32,7 @@ "@hookform/resolvers": "3.9.0", "@mdx-js/loader": "3.1.0", "@mdx-js/react": "3.1.0", + "@microlink/react-json-view": "1.27.0", "@next/mdx": "15.3.3", "@radix-ui/react-accordion": "1.2.3", "@radix-ui/react-alert-dialog": "1.1.6", @@ -88,15 +90,14 @@ "@eslint/eslintrc": "3.3.1", "@next/eslint-plugin-next": "15.2.3", "@playwright/test": "1.52.0", - "@stagewise/toolbar-next": "0.1.2", "@types/file-saver": "2.0.7", "@types/node": "22.8.1", "@types/pdf-parse": "1.1.5", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", - "@typescript/native-preview": "7.0.0-dev.20250525.1", + "@typescript/native-preview": "7.0.0-dev.20250819.1", "autoprefixer": "10.4.21", - "eslint": "9.26.0", + "eslint": "9.33.0", "eslint-config-next": "15.2.3", "eslint-plugin-playwright": "2.2.0", "eslint-plugin-react-you-might-not-need-an-effect": "0.0.39", @@ -110,7 +111,8 @@ "react-scan": "0.3.4", "schema-dts": "1.1.5", "tailwindcss": "3.4.14", - "typescript": "5.8.3", - "typescript-eslint": "8.32.0" + "typescript": "5.9.2", + "typescript-eslint": "8.40.0", + "vitest": "3.2.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7a5cb7..186bcb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,13 +12,16 @@ importers: version: 3.9.0(react-hook-form@7.53.1(react@18.3.1)) "@mdx-js/loader": specifier: 3.1.0 - version: 3.1.0(acorn@8.14.1)(webpack@5.98.0(esbuild@0.25.0)) + version: 3.1.0(acorn@8.15.0)(webpack@5.98.0) "@mdx-js/react": specifier: 3.1.0 version: 3.1.0(@types/react@18.3.12)(react@18.3.1) + "@microlink/react-json-view": + specifier: 1.27.0 + version: 1.27.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@next/mdx": specifier: 15.3.3 - version: 15.3.3(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0(esbuild@0.25.0)))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1)) + version: 15.3.3(@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1)) "@radix-ui/react-accordion": specifier: 1.2.3 version: 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -63,10 +66,10 @@ importers: version: 4.3.0(react@18.3.1) "@sentry/nextjs": specifier: 9.3.0 - version: 9.3.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.98.0(esbuild@0.25.0)) + version: 9.3.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.98.0) "@t3-oss/env-nextjs": specifier: 0.13.4 - version: 0.13.4(arktype@2.1.20)(typescript@5.8.3)(zod@3.24.4) + version: 0.13.4(arktype@2.1.20)(typescript@5.9.2)(zod@3.24.4) "@tailwindcss/typography": specifier: 0.5.16 version: 0.5.16(tailwindcss@3.4.14) @@ -99,7 +102,7 @@ importers: version: 1.11.13 eslint-plugin-react-hooks: specifier: 5.2.0 - version: 5.2.0(eslint@9.26.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.33.0(jiti@2.4.2)) file-saver: specifier: 2.0.5 version: 2.0.5 @@ -126,7 +129,7 @@ importers: version: 14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-intl: specifier: 4.0.2 - version: 4.0.2(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + version: 4.0.2(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.9.2) pdf-parse: specifier: 1.1.1 version: 1.1.1 @@ -182,9 +185,6 @@ importers: "@playwright/test": specifier: 1.52.0 version: 1.52.0 - "@stagewise/toolbar-next": - specifier: 0.1.2 - version: 0.1.2(@types/react@18.3.12)(jiti@2.4.2)(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(postcss@8.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0))(yaml@2.7.0) "@types/file-saver": specifier: 2.0.7 version: 2.0.7 @@ -201,29 +201,29 @@ importers: specifier: 18.3.1 version: 18.3.1 "@typescript/native-preview": - specifier: 7.0.0-dev.20250525.1 - version: 7.0.0-dev.20250525.1 + specifier: 7.0.0-dev.20250819.1 + version: 7.0.0-dev.20250819.1 autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.3) eslint: - specifier: 9.26.0 - version: 9.26.0(jiti@2.4.2) + specifier: 9.33.0 + version: 9.33.0(jiti@2.4.2) eslint-config-next: specifier: 15.2.3 - version: 15.2.3(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + version: 15.2.3(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) eslint-plugin-playwright: specifier: 2.2.0 - version: 2.2.0(eslint@9.26.0(jiti@2.4.2)) + version: 2.2.0(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-react-you-might-not-need-an-effect: specifier: 0.0.39 - version: 0.0.39(eslint@9.26.0(jiti@2.4.2)) + version: 0.0.39(eslint@9.33.0(jiti@2.4.2)) husky: specifier: 9.1.7 version: 9.1.7 knip: specifier: 5.55.1 - version: 5.55.1(@types/node@22.8.1)(typescript@5.8.3) + version: 5.55.1(@types/node@22.8.1)(typescript@5.9.2) lint-staged: specifier: 15.5.0 version: 15.5.0 @@ -249,11 +249,14 @@ importers: specifier: 3.4.14 version: 3.4.14 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 typescript-eslint: - specifier: 8.32.0 - version: 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + specifier: 8.40.0 + version: 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + vitest: + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0) packages: "@alloc/quick-lru@5.2.0": @@ -424,22 +427,22 @@ packages: integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==, } - "@emnapi/core@1.3.1": + "@emnapi/core@1.4.5": resolution: { - integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==, + integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==, } - "@emnapi/runtime@1.3.1": + "@emnapi/runtime@1.4.5": resolution: { - integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==, + integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==, } - "@emnapi/wasi-threads@1.0.1": + "@emnapi/wasi-threads@1.0.4": resolution: { - integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==, + integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==, } "@esbuild/aix-ppc64@0.25.0": @@ -683,24 +686,24 @@ packages: } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - "@eslint/config-array@0.20.0": + "@eslint/config-array@0.21.0": resolution: { - integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==, + integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@eslint/config-helpers@0.2.2": + "@eslint/config-helpers@0.3.1": resolution: { - integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==, + integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@eslint/core@0.13.0": + "@eslint/core@0.15.2": resolution: { - integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==, + integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -711,10 +714,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@eslint/js@9.26.0": + "@eslint/js@9.33.0": resolution: { - integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==, + integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -725,10 +728,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@eslint/plugin-kit@0.2.8": + "@eslint/plugin-kit@0.3.5": resolution: { - integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==, + integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -753,15 +756,6 @@ packages: react: ">=16.8.0" react-dom: ">=16.8.0" - "@floating-ui/react@0.26.28": - resolution: - { - integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==, - } - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - "@floating-ui/utils@0.2.9": resolution: { @@ -804,16 +798,6 @@ packages: integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==, } - "@headlessui/react@2.2.2": - resolution: - { - integrity: sha512-zbniWOYBQ8GHSUIOPY7BbdIn6PzUOq0z41RFrF30HbjsxG6Rrfk+6QulR8Kgf2Vwj2a/rE6i62q5vo+2gI5dJA==, - } - engines: { node: ">=10" } - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc - "@hookform/resolvers@3.9.0": resolution: { @@ -1050,12 +1034,11 @@ packages: } engines: { node: ">=12" } - "@jridgewell/gen-mapping@0.3.8": + "@jridgewell/gen-mapping@0.3.12": resolution: { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, + integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==, } - engines: { node: ">=6.0.0" } "@jridgewell/resolve-uri@3.1.2": resolution: @@ -1064,29 +1047,22 @@ packages: } engines: { node: ">=6.0.0" } - "@jridgewell/set-array@1.2.1": + "@jridgewell/source-map@0.3.10": resolution: { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/source-map@0.3.6": - resolution: - { - integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==, } - "@jridgewell/sourcemap-codec@1.5.0": + "@jridgewell/sourcemap-codec@1.5.4": resolution: { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==, } - "@jridgewell/trace-mapping@0.3.25": + "@jridgewell/trace-mapping@0.3.29": resolution: { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==, } "@mdx-js/loader@3.1.0": @@ -1115,17 +1091,20 @@ packages: "@types/react": ">=16" react: ">=16" - "@modelcontextprotocol/sdk@1.11.1": + "@microlink/react-json-view@1.27.0": resolution: { - integrity: sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==, + integrity: sha512-/IwWmMuRR2edvxrRYRBJzjyi4vGvIn/ltM8wqesz+HLZsoGKIUgwiwEkblOLZqXj8BGWmeRnyAdCqf0uACqRFw==, } - engines: { node: ">=18" } + engines: { node: ">=17" } + peerDependencies: + react: ">= 15" + react-dom: ">= 15" - "@napi-rs/wasm-runtime@0.2.7": + "@napi-rs/wasm-runtime@0.2.12": resolution: { - integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==, + integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, } "@next/env@14.2.15": @@ -1661,14 +1640,6 @@ packages: engines: { node: ">=18" } hasBin: true - "@preact/compat@18.3.1": - resolution: - { - integrity: sha512-Kog4PSRxtT4COtOXjsuQPV1vMXpUzREQfv+6Dmcy9/rMk0HOPK0HTE9fspFjAmY8R80T/T8gtgmZ68u5bOSngw==, - } - peerDependencies: - preact: "*" - "@preact/signals-core@1.8.0": resolution: { @@ -3801,10 +3772,10 @@ packages: integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, } - "@rushstack/eslint-patch@1.11.0": + "@rushstack/eslint-patch@1.12.0": resolution: { - integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==, + integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==, } "@schummar/icu-type-parser@1.21.5": @@ -4006,31 +3977,6 @@ packages: integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==, } - "@stagewise/toolbar-next@0.1.2": - resolution: - { - integrity: sha512-6/Z03eLmDz8AyMYIMvX/nnEBIK/gajtLi21aIho3u0qP+RM/7tDbphN9e4ssKOKj46MEPp/C8LkSR4ISOSbMQQ==, - } - peerDependencies: - "@types/react": ">=18.0.0" - next: ">=14.0.0" - react: ">=18.0.0" - - "@stagewise/toolbar-react@0.1.2": - resolution: - { - integrity: sha512-Vxt7f3TwFuHOgfxTFT4aBcojynat15qMUA+hArwb3EJxwjZR8VuN3Phi0K5RnniutphiBn5iNypzwGs5mFWmVw==, - } - peerDependencies: - "@types/react": ">=18.0.0" - react: ">=18.0.0" - - "@stagewise/toolbar@0.2.1": - resolution: - { - integrity: sha512-ITA68sqtXRklV6TDDyhT+3GDQqdtZFcZY9WBdPv6XUoATBHcOjpblt0yvQoOuMXAohbBGky4qgbDqxYgLsYbGQ==, - } - "@swc/counter@0.1.3": resolution: { @@ -4092,25 +4038,22 @@ packages: peerDependencies: tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - "@tanstack/react-virtual@3.13.9": + "@tybys/wasm-util@0.10.0": resolution: { - integrity: sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==, - } - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - "@tanstack/virtual-core@3.13.9": - resolution: - { - integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==, + integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==, } - "@tybys/wasm-util@0.9.0": + "@types/base16@1.0.5": resolution: { - integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, + integrity: sha512-OzOWrTluG9cwqidEzC/Q6FAmIPcnZfm8BFRlIx0+UIUqnuAmi5OS88O0RpT3Yz6qdmqObvUhasrbNsCofE4W9A==, + } + + "@types/chai@5.2.2": + resolution: + { + integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, } "@types/connect@3.4.38": @@ -4131,6 +4074,12 @@ packages: integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, } + "@types/deep-eql@4.0.2": + resolution: + { + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, + } + "@types/eslint-scope@3.7.7": resolution: { @@ -4155,6 +4104,12 @@ packages: integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, } + "@types/estree@1.0.8": + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } + "@types/file-saver@2.0.7": resolution: { @@ -4179,6 +4134,12 @@ packages: integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, } + "@types/lodash@4.17.20": + resolution: + { + integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==, + } + "@types/mdast@4.0.4": resolution: { @@ -4295,144 +4256,162 @@ packages: integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, } - "@typescript-eslint/eslint-plugin@8.32.0": + "@typescript-eslint/eslint-plugin@8.40.0": resolution: { - integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==, + integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + "@typescript-eslint/parser": ^8.40.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/parser@8.32.0": + "@typescript-eslint/parser@8.40.0": resolution: { - integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==, + integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/scope-manager@8.32.0": + "@typescript-eslint/project-service@8.40.0": resolution: { - integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==, + integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/scope-manager@8.40.0": + resolution: + { + integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/type-utils@8.32.0": + "@typescript-eslint/tsconfig-utils@8.40.0": resolution: { - integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==, + integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/type-utils@8.40.0": + resolution: + { + integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/types@8.32.0": + "@typescript-eslint/types@8.40.0": resolution: { - integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==, + integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/typescript-estree@8.32.0": + "@typescript-eslint/typescript-estree@8.40.0": resolution: { - integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==, + integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: ">=4.8.4 <5.9.0" + typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/utils@8.32.0": + "@typescript-eslint/utils@8.40.0": resolution: { - integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==, + integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/visitor-keys@8.32.0": + "@typescript-eslint/visitor-keys@8.40.0": resolution: { - integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==, + integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript/native-preview-darwin-arm64@7.0.0-dev.20250525.1": + "@typescript/native-preview-darwin-arm64@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-XyxwSahQ+9cqMYuvfeZ4niJpRTHUgCMhqN9eaXzMK193mXp7GAlJ4UnZm0NPF538mIXi9PTSAPwmbMYiDMyN1g==, + integrity: sha512-sZAKCg5lW10rg4REkm6Qv14+f2OVN4dX+AfznnxZp3iqj9am+0JCg67la3IVlhznY3jwvqJU6QK54vblK+my5A==, } engines: { node: ">=20.6.0" } cpu: [arm64] os: [darwin] - "@typescript/native-preview-darwin-x64@7.0.0-dev.20250525.1": + "@typescript/native-preview-darwin-x64@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-9qnW/SX2BHzIT7BO5ubdl69FGVA6C6x1c5akLYtlMAjg6ybKBIc2bmoVWd2eSR+B0382AoG4tziLRtDQhcfe+Q==, + integrity: sha512-EkcJWqnldvsEM59hNicAFGp0a3y4ebp60uJdlgxuOC3kFHffMHTUSxhuxySY4djKV9uei5RZR2O5s3XDrjcKoA==, } engines: { node: ">=20.6.0" } cpu: [x64] os: [darwin] - "@typescript/native-preview-linux-arm64@7.0.0-dev.20250525.1": + "@typescript/native-preview-linux-arm64@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-cLYmhcr3rrzVONUKLJkaMaWQCplmprBdpiiiQR8r+sp7nIFv6bCtYgE/p23bPgI5+FRixmCvP3XglDwU+ZRGBA==, + integrity: sha512-nG07i0oVCISBVPqoHKPpBwYUg3XJhuo/QOScvTagJ4o1XS63HCZOldC0cu26ZyvlrgBaWmteVMzyaaIluwupNQ==, } engines: { node: ">=20.6.0" } cpu: [arm64] os: [linux] - "@typescript/native-preview-linux-arm@7.0.0-dev.20250525.1": + "@typescript/native-preview-linux-arm@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-yi/8tRc3E2Y+RdV/KOVsJOsrz9eN9YYCFgf90tG3nlo+8UlA7oJvXQ2ealeadUX3kHU3uALWU4qnfNC6oTy2sg==, + integrity: sha512-yhfOqmxyscXYd6gkrvmDInVx5fntetIrIBHGw1ElNmnmlu5HgguXfEXLxYNMVnBRTzrHtHYPQ8jRd79X1uni+g==, } engines: { node: ">=20.6.0" } cpu: [arm] os: [linux] - "@typescript/native-preview-linux-x64@7.0.0-dev.20250525.1": + "@typescript/native-preview-linux-x64@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-oCr24rfRoppLS1MwGXhXZN1JMwCWfkKdJdzhSY8XJ10TTVLGhhjYaWgD51SlIJNfWH9i+e1/9x2ULIjb3/MrLA==, + integrity: sha512-HrVUxN+VBDiiyi3xk4Ih323ZXAyLWu4CNlI1MGqazhOvahKUjTTvuyzdyTWI7Bzf25KcHIXqfyD0PTqQQRMnVw==, } engines: { node: ">=20.6.0" } cpu: [x64] os: [linux] - "@typescript/native-preview-win32-arm64@7.0.0-dev.20250525.1": + "@typescript/native-preview-win32-arm64@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-xqS00+QZz1oEq7e9EIqs6dnmV4oE24/xRyXqY9b2FLPIXJJNHFKyT8/iLbtrSeOUFOBabpZuVMGGVhi0onTXoA==, + integrity: sha512-TRSeuNIA3CI8BmZhioj+QBFdsywadJWKvdC/dhawaYJJuhwz4jbPD7lg/SA2gWihqDC7ZhPq6eqSgaxobW5/uw==, } engines: { node: ">=20.6.0" } cpu: [arm64] os: [win32] - "@typescript/native-preview-win32-x64@7.0.0-dev.20250525.1": + "@typescript/native-preview-win32-x64@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-tHPIhwhQ3c+J5ENJgfwsEDpMuuID2GPvhYH4Zcy1I2oGJ15DIb53Sqc1dRw+syV3j4/TnQDNDOuUWjJAQvi/aA==, + integrity: sha512-LTLw0FtGmrSZ3mrERcDWJ1P7tvGMZAi5dhbwXBhGHiawX8kwWHZI3J+TqDnU2zrxL22164qsAee2LI4J2bwpNw==, } engines: { node: ">=20.6.0" } cpu: [x64] os: [win32] - "@typescript/native-preview@7.0.0-dev.20250525.1": + "@typescript/native-preview@7.0.0-dev.20250819.1": resolution: { - integrity: sha512-8rcNG2CkBwRc/5zDkbHgGZTYT2oHu4E9r3Ed3JnWrCb0Vf9jSK8bd7lpbTAOIza790Zn6FOiYI9T7SmcTVzxDQ==, + integrity: sha512-+gl0Sg+Ol5QibPacZziwHyImPtPzuYV1BF/n99LG6U9BAMOXoBamU+9Y5C+0gUdesmz5Ik9ZJpUuX4HTBzULig==, } engines: { node: ">=20.6.0" } hasBin: true @@ -4443,90 +4422,154 @@ packages: integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, } - "@unrs/rspack-resolver-binding-darwin-arm64@1.2.2": + "@unrs/resolver-binding-android-arm-eabi@1.11.1": resolution: { - integrity: sha512-i7z0B+C0P8Q63O/5PXJAzeFtA1ttY3OR2VSJgGv18S+PFNwD98xHgAgPOT1H5HIV6jlQP8Avzbp09qxJUdpPNw==, + integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==, + } + cpu: [arm] + os: [android] + + "@unrs/resolver-binding-android-arm64@1.11.1": + resolution: + { + integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==, + } + cpu: [arm64] + os: [android] + + "@unrs/resolver-binding-darwin-arm64@1.11.1": + resolution: + { + integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==, } cpu: [arm64] os: [darwin] - "@unrs/rspack-resolver-binding-darwin-x64@1.2.2": + "@unrs/resolver-binding-darwin-x64@1.11.1": resolution: { - integrity: sha512-YEdFzPjIbDUCfmehC6eS+AdJYtFWY35YYgWUnqqTM2oe/N58GhNy5yRllxYhxwJ9GcfHoNc6Ubze1yjkNv+9Qg==, + integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==, } cpu: [x64] os: [darwin] - "@unrs/rspack-resolver-binding-freebsd-x64@1.2.2": + "@unrs/resolver-binding-freebsd-x64@1.11.1": resolution: { - integrity: sha512-TU4ntNXDgPN2giQyyzSnGWf/dVCem5lvwxg0XYvsvz35h5H19WrhTmHgbrULMuypCB3aHe1enYUC9rPLDw45mA==, + integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==, } cpu: [x64] os: [freebsd] - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2": + "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": resolution: { - integrity: sha512-ik3w4/rU6RujBvNWiDnKdXi1smBhqxEDhccNi/j2rHaMjm0Fk49KkJ6XKsoUnD2kZ5xaMJf9JjailW/okfUPIw==, + integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==, } cpu: [arm] os: [linux] - "@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2": + "@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": resolution: { - integrity: sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ==, + integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==, + } + cpu: [arm] + os: [linux] + + "@unrs/resolver-binding-linux-arm64-gnu@1.11.1": + resolution: + { + integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==, } cpu: [arm64] os: [linux] - "@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2": + "@unrs/resolver-binding-linux-arm64-musl@1.11.1": resolution: { - integrity: sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ==, + integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==, } cpu: [arm64] os: [linux] - "@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2": + "@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": resolution: { - integrity: sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw==, + integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==, + } + cpu: [ppc64] + os: [linux] + + "@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + resolution: + { + integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==, + } + cpu: [riscv64] + os: [linux] + + "@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + resolution: + { + integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==, + } + cpu: [riscv64] + os: [linux] + + "@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + resolution: + { + integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==, + } + cpu: [s390x] + os: [linux] + + "@unrs/resolver-binding-linux-x64-gnu@1.11.1": + resolution: + { + integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==, } cpu: [x64] os: [linux] - "@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2": + "@unrs/resolver-binding-linux-x64-musl@1.11.1": resolution: { - integrity: sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg==, + integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==, } cpu: [x64] os: [linux] - "@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2": + "@unrs/resolver-binding-wasm32-wasi@1.11.1": resolution: { - integrity: sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog==, + integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==, } engines: { node: ">=14.0.0" } cpu: [wasm32] - "@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2": + "@unrs/resolver-binding-win32-arm64-msvc@1.11.1": resolution: { - integrity: sha512-7sWRJumhpXSi2lccX8aQpfFXHsSVASdWndLv8AmD8nDRA/5PBi8IplQVZNx2mYRx6+Bp91Z00kuVqpXO9NfCTg==, + integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==, } cpu: [arm64] os: [win32] - "@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2": + "@unrs/resolver-binding-win32-ia32-msvc@1.11.1": resolution: { - integrity: sha512-hewo/UMGP1a7O6FG/ThcPzSJdm/WwrYDNkdGgWl6M18H6K6MSitklomWpT9MUtT5KGj++QJb06va/14QBC4pvw==, + integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==, + } + cpu: [ia32] + os: [win32] + + "@unrs/resolver-binding-win32-x64-msvc@1.11.1": + resolution: + { + integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==, } cpu: [x64] os: [win32] @@ -4578,6 +4621,56 @@ packages: vue-router: optional: true + "@vitest/expect@3.2.4": + resolution: + { + integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, + } + + "@vitest/mocker@3.2.4": + resolution: + { + integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, + } + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + "@vitest/pretty-format@3.2.4": + resolution: + { + integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, + } + + "@vitest/runner@3.2.4": + resolution: + { + integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, + } + + "@vitest/snapshot@3.2.4": + resolution: + { + integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, + } + + "@vitest/spy@3.2.4": + resolution: + { + integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, + } + + "@vitest/utils@3.2.4": + resolution: + { + integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, + } + "@webassemblyjs/ast@1.14.1": resolution: { @@ -4693,13 +4786,6 @@ packages: } engines: { node: ">= 0.6" } - accepts@2.0.0: - resolution: - { - integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, - } - engines: { node: ">= 0.6" } - acorn-import-attributes@1.9.5: resolution: { @@ -4716,10 +4802,10 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: + acorn@8.15.0: resolution: { - integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, } engines: { node: ">=0.4.0" } hasBin: true @@ -4856,10 +4942,10 @@ packages: } engines: { node: ">= 0.4" } - array-includes@3.1.8: + array-includes@3.1.9: resolution: { - integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, + integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==, } engines: { node: ">= 0.4" } @@ -4905,6 +4991,13 @@ packages: } engines: { node: ">= 0.4" } + assertion-error@2.0.1: + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: ">=12" } + ast-types-flow@0.0.8: resolution: { @@ -4974,6 +5067,12 @@ packages: integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, } + base16@1.0.0: + resolution: + { + integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==, + } + base64-js@0.0.8: resolution: { @@ -5027,13 +5126,6 @@ packages: integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, } - body-parser@2.2.0: - resolution: - { - integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==, - } - engines: { node: ">=18" } - brace-expansion@1.1.11: resolution: { @@ -5065,10 +5157,10 @@ packages: integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==, } - browserslist@4.24.4: + browserslist@4.25.2: resolution: { - integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, + integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==, } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true @@ -5091,15 +5183,6 @@ packages: integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, } - bundle-require@5.1.0: - resolution: - { - integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - peerDependencies: - esbuild: ">=0.18" - busboy@1.6.0: resolution: { @@ -5107,13 +5190,6 @@ packages: } engines: { node: ">=10.16.0" } - bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } - cac@6.7.14: resolution: { @@ -5156,10 +5232,10 @@ packages: } engines: { node: ">= 6" } - caniuse-lite@1.0.30001707: + caniuse-lite@1.0.30001733: resolution: { - integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==, + integrity: sha512-e4QKw/O2Kavj2VQTKZWrwzkt3IxOmIlU6ajRb6LP64LHpBo1J67k2Hi4Vu/TgJWsNtynurfS0uK3MaUTCPfu5Q==, } canvas@3.1.0: @@ -5175,6 +5251,13 @@ packages: integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, } + chai@5.2.1: + resolution: + { + integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==, + } + engines: { node: ">=18" } + chalk@3.0.0: resolution: { @@ -5220,6 +5303,13 @@ packages: integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, } + check-error@2.1.1: + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: ">= 16" } + chokidar@3.6.0: resolution: { @@ -5329,6 +5419,12 @@ packages: integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, } + color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + color-convert@2.0.1: resolution: { @@ -5336,6 +5432,12 @@ packages: } engines: { node: ">=7.0.0" } + color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + color-name@1.1.4: resolution: { @@ -5348,6 +5450,12 @@ packages: integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, } + color@3.2.1: + resolution: + { + integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, + } + color@4.2.3: resolution: { @@ -5413,46 +5521,12 @@ packages: integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } - confbox@0.1.8: - resolution: - { - integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, - } - - consola@3.4.2: - resolution: - { - integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, - } - engines: { node: ^14.18.0 || >=16.10.0 } - - content-disposition@1.0.0: - resolution: - { - integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==, - } - engines: { node: ">= 0.6" } - - content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } - convert-source-map@2.0.0: resolution: { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, } - cookie-signature@1.2.2: - resolution: - { - integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, - } - engines: { node: ">=6.6.0" } - cookie@0.7.2: resolution: { @@ -5460,13 +5534,6 @@ packages: } engines: { node: ">= 0.6" } - copy-anything@3.0.5: - resolution: - { - integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, - } - engines: { node: ">=12.13" } - core-util-is@1.0.3: resolution: { @@ -5570,10 +5637,10 @@ packages: supports-color: optional: true - debug@4.4.0: + debug@4.4.1: resolution: { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, } engines: { node: ">=6.0" } peerDependencies: @@ -5601,6 +5668,13 @@ packages: } engines: { node: ">=10" } + deep-eql@5.0.2: + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: ">=6" } + deep-extend@0.6.0: resolution: { @@ -5648,13 +5722,6 @@ packages: } engines: { node: ">=0.4.0" } - depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: ">= 0.8" } - dequal@2.0.3: resolution: { @@ -5763,16 +5830,10 @@ packages: integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, } - ee-first@1.1.1: + electron-to-chromium@1.5.199: resolution: { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } - - electron-to-chromium@1.5.109: - resolution: - { - integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==, + integrity: sha512-3gl0S7zQd88kCAZRO/DnxtBKuhMO4h0EaQIN3YgZfV6+pW+5+bf2AdQeHNESCoaQqo/gjGVYEf2YM4O5HJQqpQ==, } emoji-regex@10.4.0: @@ -5793,13 +5854,6 @@ packages: integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, } - encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: ">= 0.8" } - end-of-stream@1.4.4: resolution: { @@ -5820,10 +5874,10 @@ packages: } engines: { node: ">=10.2.0" } - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: resolution: { - integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, + integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==, } engines: { node: ">=10.13.0" } @@ -5841,10 +5895,10 @@ packages: } engines: { node: ">=18" } - es-abstract@1.23.9: + es-abstract@1.24.0: resolution: { - integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, + integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==, } engines: { node: ">= 0.4" } @@ -5930,12 +5984,6 @@ packages: } engines: { node: ">=6" } - escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } - escape-string-regexp@4.0.0: resolution: { @@ -5968,10 +6016,10 @@ packages: integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, } - eslint-import-resolver-typescript@3.9.1: + eslint-import-resolver-typescript@3.10.1: resolution: { - integrity: sha512-euxa5rTGqHeqVxmOHT25hpk58PxkQ4mNoX6Yun4ooGaCHAxOCojJYNvjmyeOQxj/LyW+3fulH0+xtk+p2kPPTw==, + integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==, } engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: @@ -5984,10 +6032,10 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.0: + eslint-module-utils@2.12.1: resolution: { - integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, + integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==, } engines: { node: ">=4" } peerDependencies: @@ -6008,10 +6056,10 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.31.0: + eslint-plugin-import@2.32.0: resolution: { - integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, + integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==, } engines: { node: ">=4" } peerDependencies: @@ -6057,10 +6105,10 @@ packages: peerDependencies: eslint: ">=7.0.0" - eslint-plugin-react@7.37.4: + eslint-plugin-react@7.37.5: resolution: { - integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==, + integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==, } engines: { node: ">=4" } peerDependencies: @@ -6073,10 +6121,10 @@ packages: } engines: { node: ">=8.0.0" } - eslint-scope@8.3.0: + eslint-scope@8.4.0: resolution: { - integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==, + integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -6103,17 +6151,17 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - eslint-visitor-keys@4.2.0: + eslint-visitor-keys@4.2.1: resolution: { - integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, + integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - eslint@9.26.0: + eslint@9.33.0: resolution: { - integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==, + integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true @@ -6123,10 +6171,10 @@ packages: jiti: optional: true - espree@10.3.0: + espree@10.4.0: resolution: { - integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, + integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -6213,13 +6261,6 @@ packages: } engines: { node: ">=0.10.0" } - etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: ">= 0.6" } - eventemitter3@5.0.1: resolution: { @@ -6233,20 +6274,6 @@ packages: } engines: { node: ">=0.8.x" } - eventsource-parser@3.0.1: - resolution: - { - integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==, - } - engines: { node: ">=18.0.0" } - - eventsource@3.0.7: - resolution: - { - integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==, - } - engines: { node: ">=18.0.0" } - execa@8.0.1: resolution: { @@ -6261,21 +6288,12 @@ packages: } engines: { node: ">=6" } - express-rate-limit@7.5.0: + expect-type@1.2.2: resolution: { - integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==, + integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==, } - engines: { node: ">= 16" } - peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 - - express@5.1.0: - resolution: - { - integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==, - } - engines: { node: ">= 18" } + engines: { node: ">=12.0.0" } extend@3.0.2: resolution: @@ -6333,10 +6351,10 @@ packages: integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, } - fd-package-json@1.2.0: + fd-package-json@2.0.0: resolution: { - integrity: sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==, + integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==, } fdir@6.4.4: @@ -6370,13 +6388,6 @@ packages: } engines: { node: ">=8" } - finalhandler@2.1.0: - resolution: - { - integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==, - } - engines: { node: ">= 0.8" } - find-up@5.0.0: resolution: { @@ -6384,12 +6395,6 @@ packages: } engines: { node: ">=10" } - fix-dts-default-cjs-exports@1.0.1: - resolution: - { - integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==, - } - flat-cache@4.0.1: resolution: { @@ -6430,10 +6435,10 @@ packages: } engines: { node: ">= 6" } - formatly@0.2.3: + formatly@0.2.4: resolution: { - integrity: sha512-WH01vbXEjh9L3bqn5V620xUAWs32CmK4IzWRRY6ep5zpa/mrisL4d9+pRVuETORVDTQw8OycSO1WC68PL51RaA==, + integrity: sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==, } engines: { node: ">=18.3.0" } hasBin: true @@ -6444,26 +6449,12 @@ packages: integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==, } - forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: ">= 0.6" } - fraction.js@4.3.7: resolution: { integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, } - fresh@2.0.0: - resolution: - { - integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, - } - engines: { node: ">= 0.8" } - fs-constants@1.0.0: resolution: { @@ -6574,10 +6565,10 @@ packages: } engines: { node: ">= 0.4" } - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: resolution: { - integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, + integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==, } github-from-package@0.0.0: @@ -6807,13 +6798,6 @@ packages: integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, } - http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } - https-proxy-agent@5.0.1: resolution: { @@ -6849,13 +6833,6 @@ packages: integrity: sha512-fXHXcGFTXOvZTSkPJuGOQf5Lv5T/R2itiiCVPg9LxAje5D00O0pP83yJShFq5V89Ly//Gt6acj7z8pbBr34stw==, } - iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } - ieee754@1.2.1: resolution: { @@ -6869,6 +6846,13 @@ packages: } engines: { node: ">= 4" } + ignore@7.0.5: + resolution: + { + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, + } + engines: { node: ">= 4" } + immediate@3.0.6: resolution: { @@ -6926,13 +6910,6 @@ packages: integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==, } - ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: ">= 0.10" } - is-alphabetical@2.0.1: resolution: { @@ -6986,10 +6963,10 @@ packages: } engines: { node: ">= 0.4" } - is-bun-module@1.3.0: + is-bun-module@2.0.0: resolution: { - integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==, + integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==, } is-callable@1.2.7: @@ -7095,6 +7072,13 @@ packages: } engines: { node: ">= 0.4" } + is-negative-zero@2.0.3: + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } + is-number-object@1.1.1: resolution: { @@ -7116,12 +7100,6 @@ packages: } engines: { node: ">=12" } - is-promise@4.0.0: - resolution: - { - integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, - } - is-reference@1.2.1: resolution: { @@ -7224,13 +7202,6 @@ packages: } engines: { node: ">= 0.4" } - is-what@4.1.16: - resolution: - { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, - } - engines: { node: ">=12.13" } - isarray@1.0.0: resolution: { @@ -7269,12 +7240,6 @@ packages: integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, } - javascript-time-ago@2.5.11: - resolution: - { - integrity: sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==, - } - jay-peg@1.1.1: resolution: { @@ -7302,19 +7267,18 @@ packages: } hasBin: true - joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: ">=10" } - js-tokens@4.0.0: resolution: { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, } + js-tokens@9.0.1: + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } + js-yaml@4.1.0: resolution: { @@ -7503,13 +7467,6 @@ packages: } engines: { node: ">=18.0.0" } - load-tsconfig@0.2.5: - resolution: - { - integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - loader-runner@4.3.0: resolution: { @@ -7530,6 +7487,12 @@ packages: integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, } + lodash.curry@4.1.1: + resolution: + { + integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==, + } + lodash.isplainobject@4.0.6: resolution: { @@ -7542,12 +7505,6 @@ packages: integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, } - lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } - log-symbols@4.1.0: resolution: { @@ -7575,6 +7532,12 @@ packages: } hasBin: true + loupe@3.2.0: + resolution: + { + integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==, + } + lru-cache@10.4.3: resolution: { @@ -7595,14 +7558,6 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.503.0: - resolution: - { - integrity: sha512-HGGkdlPWQ0vTF8jJ5TdIqhQXZi6uh3LnNgfZ8MHiuxFfX3RZeA79r2MW2tHAZKlAVfoNE8esm3p+O6VkIvpj6w==, - } - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lz-string@1.5.0: resolution: { @@ -7773,20 +7728,6 @@ packages: integrity: sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==, } - media-typer@1.1.0: - resolution: - { - integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, - } - engines: { node: ">= 0.8" } - - merge-descriptors@2.0.0: - resolution: - { - integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, - } - engines: { node: ">=18" } - merge-refs@1.3.0: resolution: { @@ -8035,13 +7976,6 @@ packages: } engines: { node: ">= 0.6" } - mime-db@1.54.0: - resolution: - { - integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, - } - engines: { node: ">= 0.6" } - mime-types@2.1.35: resolution: { @@ -8049,13 +7983,6 @@ packages: } engines: { node: ">= 0.6" } - mime-types@3.0.1: - resolution: - { - integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==, - } - engines: { node: ">= 0.6" } - mimic-fn@2.1.0: resolution: { @@ -8130,12 +8057,6 @@ packages: integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, } - mlly@1.7.4: - resolution: - { - integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==, - } - module-details-from-path@1.0.3: resolution: { @@ -8182,6 +8103,14 @@ packages: integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==, } + napi-postinstall@0.3.3: + resolution: + { + integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + hasBin: true + natural-compare@1.4.0: resolution: { @@ -8393,13 +8322,6 @@ packages: } engines: { node: ">= 0.4" } - on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } - once@1.4.0: resolution: { @@ -8505,13 +8427,6 @@ packages: integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==, } - parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } - path-exists@4.0.0: resolution: { @@ -8546,13 +8461,6 @@ packages: } engines: { node: ">=16 || 14 >=14.18" } - path-to-regexp@8.2.0: - resolution: - { - integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==, - } - engines: { node: ">=16" } - path2d@0.2.2: resolution: { @@ -8566,6 +8474,13 @@ packages: integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, } + pathval@2.0.1: + resolution: + { + integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==, + } + engines: { node: ">= 14.16" } + pdf-parse@1.1.1: resolution: { @@ -8619,10 +8534,10 @@ packages: } engines: { node: ">=8.6" } - picomatch@4.0.2: + picomatch@4.0.3: resolution: { - integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, } engines: { node: ">=12" } @@ -8648,19 +8563,6 @@ packages: } engines: { node: ">= 6" } - pkce-challenge@5.0.0: - resolution: - { - integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==, - } - engines: { node: ">=16.20.0" } - - pkg-types@1.3.1: - resolution: - { - integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, - } - playwright-core@1.52.0: resolution: { @@ -8717,27 +8619,6 @@ packages: ts-node: optional: true - postcss-load-config@6.0.1: - resolution: - { - integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, - } - engines: { node: ">= 18" } - peerDependencies: - jiti: ">=1.21.0" - postcss: ">=8.0.9" - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss-nested@6.2.0: resolution: { @@ -8747,14 +8628,6 @@ packages: peerDependencies: postcss: ^8.2.14 - postcss-prefix-selector@2.1.1: - resolution: - { - integrity: sha512-ZBgf427Et6+XnrnJ9VXtJEKCjJwTvn2wn/qMg+wvvlRhIeFIAxdbrlZZ0CSsWYMJfcyPLBh8ogj5O1kb/Mcx3g==, - } - peerDependencies: - postcss: ^8.0.0 - postcss-selector-parser@6.0.10: resolution: { @@ -8944,13 +8817,6 @@ packages: integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==, } - proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: ">= 0.10" } - proxy-from-env@1.1.0: resolution: { @@ -8995,20 +8861,6 @@ packages: integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, } - range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - - raw-body@3.0.0: - resolution: - { - integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==, - } - engines: { node: ">= 0.8" } - rc@1.2.8: resolution: { @@ -9034,6 +8886,12 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-base16-styling@0.9.1: + resolution: + { + integrity: sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==, + } + react-dom@18.3.1: resolution: { @@ -9077,6 +8935,12 @@ packages: integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, } + react-lifecycles-compat@3.0.4: + resolution: + { + integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==, + } + react-pdf@9.2.1: resolution: { @@ -9179,6 +9043,15 @@ packages: "@types/react": optional: true + react-textarea-autosize@8.5.9: + resolution: + { + integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==, + } + engines: { node: ">=10" } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react@18.3.1: resolution: { @@ -9269,12 +9142,6 @@ packages: integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==, } - relative-time-format@1.1.6: - resolution: - { - integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==, - } - remark-gfm@4.0.1: resolution: { @@ -9333,13 +9200,6 @@ packages: } engines: { node: ">=4" } - resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } - resolve-pkg-maps@1.0.0: resolution: { @@ -9417,20 +9277,6 @@ packages: engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true - router@2.2.0: - resolution: - { - integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, - } - engines: { node: ">= 18" } - - rspack-resolver@1.2.2: - resolution: - { - integrity: sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw==, - } - deprecated: Please migrate to the brand new `@rspack/resolver` or `unrs-resolver` instead - run-parallel@1.2.0: resolution: { @@ -9470,12 +9316,6 @@ packages: } engines: { node: ">= 0.4" } - safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - scheduler@0.23.2: resolution: { @@ -9514,34 +9354,20 @@ packages: } hasBin: true - semver@7.7.1: + semver@7.7.2: resolution: { - integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, } engines: { node: ">=10" } hasBin: true - send@1.2.0: - resolution: - { - integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==, - } - engines: { node: ">= 18" } - serialize-javascript@6.0.2: resolution: { integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, } - serve-static@2.2.0: - resolution: - { - integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==, - } - engines: { node: ">= 18" } - set-function-length@1.2.2: resolution: { @@ -9569,12 +9395,6 @@ packages: integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, } - setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } - sharp@0.33.5: resolution: { @@ -9630,6 +9450,12 @@ packages: } engines: { node: ">= 0.4" } + siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + signal-exit@3.0.7: resolution: { @@ -9681,10 +9507,10 @@ packages: } engines: { node: ">=18" } - smol-toml@1.3.4: + smol-toml@1.4.2: resolution: { - integrity: sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==, + integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==, } engines: { node: ">= 18" } @@ -9744,13 +9570,6 @@ packages: } engines: { node: ">= 8" } - source-map@0.8.0-beta.0: - resolution: - { - integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, - } - engines: { node: ">= 8" } - space-separated-tokens@2.0.2: resolution: { @@ -9763,6 +9582,12 @@ packages: integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==, } + stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + stacktrace-parser@0.1.11: resolution: { @@ -9770,12 +9595,18 @@ packages: } engines: { node: ">=6" } - statuses@2.0.1: + std-env@3.9.0: resolution: { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, } - engines: { node: ">= 0.8" } + + stop-iteration-iterator@1.1.0: + resolution: + { + integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, + } + engines: { node: ">= 0.4" } streamsearch@1.1.0: resolution: @@ -9920,6 +9751,12 @@ packages: } engines: { node: ">=14.16" } + strip-literal@3.0.0: + resolution: + { + integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, + } + style-to-js@1.1.17: resolution: { @@ -9972,13 +9809,6 @@ packages: engines: { node: ">=16 || 14 >=14.17" } hasBin: true - superjson@2.2.2: - resolution: - { - integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==, - } - engines: { node: ">=16" } - supports-color@7.2.0: resolution: { @@ -10006,24 +9836,12 @@ packages: integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==, } - tabbable@6.2.0: - resolution: - { - integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==, - } - tailwind-merge@2.6.0: resolution: { integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==, } - tailwind-merge@3.3.0: - resolution: - { - integrity: sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==, - } - tailwindcss-animate@1.0.7: resolution: { @@ -10040,16 +9858,10 @@ packages: engines: { node: ">=14.0.0" } hasBin: true - tailwindcss@4.1.7: + tapable@2.2.2: resolution: { - integrity: sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg==, - } - - tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==, } engines: { node: ">=6" } @@ -10085,10 +9897,10 @@ packages: uglify-js: optional: true - terser@5.39.0: + terser@5.43.1: resolution: { - integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==, + integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==, } engines: { node: ">=10" } hasBin: true @@ -10118,19 +9930,46 @@ packages: integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, } + tinybench@2.9.0: + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } + tinyexec@0.3.2: resolution: { integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, } - tinyglobby@0.2.13: + tinyglobby@0.2.14: resolution: { - integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==, + integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, } engines: { node: ">=12.0.0" } + tinypool@1.1.1: + resolution: + { + integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + + tinyrainbow@2.0.0: + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: ">=14.0.0" } + + tinyspy@4.0.3: + resolution: + { + integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, + } + engines: { node: ">=14.0.0" } + to-regex-range@5.0.1: resolution: { @@ -10138,32 +9977,12 @@ packages: } engines: { node: ">=8.0" } - toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } - tr46@0.0.3: resolution: { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, } - tr46@1.0.1: - resolution: - { - integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, - } - - tree-kill@1.2.2: - resolution: - { - integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, - } - hasBin: true - trim-lines@3.0.1: resolution: { @@ -10203,28 +10022,6 @@ packages: integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, } - tsup@8.5.0: - resolution: - { - integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==, - } - engines: { node: ">=18" } - hasBin: true - peerDependencies: - "@microsoft/api-extractor": ^7.36.0 - "@swc/core": ^1 - postcss: ^8.4.12 - typescript: ">=4.5.0" - peerDependenciesMeta: - "@microsoft/api-extractor": - optional: true - "@swc/core": - optional: true - postcss: - optional: true - typescript: - optional: true - tsx@4.19.4: resolution: { @@ -10260,13 +10057,6 @@ packages: } engines: { node: ">=8" } - type-is@2.0.1: - resolution: - { - integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, - } - engines: { node: ">= 0.6" } - typed-array-buffer@1.0.3: resolution: { @@ -10295,20 +10085,20 @@ packages: } engines: { node: ">= 0.4" } - typescript-eslint@8.32.0: + typescript-eslint@8.40.0: resolution: { - integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==, + integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: ">=4.8.4 <6.0.0" - typescript@5.8.3: + typescript@5.9.2: resolution: { - integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, + integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==, } engines: { node: ">=14.17" } hasBin: true @@ -10326,12 +10116,6 @@ packages: } hasBin: true - ufo@1.6.1: - resolution: - { - integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, - } - unbox-primitive@1.1.0: resolution: { @@ -10399,13 +10183,6 @@ packages: integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, } - unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } - unplugin@1.0.1: resolution: { @@ -10419,6 +10196,12 @@ packages: } engines: { node: ">=18.12.0" } + unrs-resolver@1.11.1: + resolution: + { + integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==, + } + update-browserslist-db@1.1.3: resolution: { @@ -10453,6 +10236,18 @@ packages: "@types/react": optional: true + use-composed-ref@1.4.0: + resolution: + { + integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + use-debounce@10.0.4: resolution: { @@ -10470,6 +10265,30 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + use-isomorphic-layout-effect@1.2.1: + resolution: + { + integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + + use-latest@1.3.0: + resolution: + { + integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + use-sidecar@1.1.3: resolution: { @@ -10530,13 +10349,13 @@ packages: } engines: { node: ">= 6" } - vite-plugin-css-injected-by-js@3.5.2: + vite-node@3.2.4: resolution: { - integrity: sha512-2MpU/Y+SCZyWUB6ua3HbJCrgnF0KACAsmzOQt1UvRVJCGF6S8xdA3ZUhWcWdM9ivG4I5az8PnQmwwrkC2CAQrQ==, + integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, } - peerDependencies: - vite: ">2.0.0-0" + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true vite@6.3.5: resolution: @@ -10581,11 +10400,43 @@ packages: yaml: optional: true - walk-up-path@3.0.1: + vitest@3.2.4: resolution: { - integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==, + integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.2.4 + "@vitest/ui": 3.2.4 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + walk-up-path@4.0.0: + resolution: + { + integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==, + } + engines: { node: 20 || >=22 } warning@4.0.3: resolution: @@ -10593,10 +10444,10 @@ packages: integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==, } - watchpack@2.4.2: + watchpack@2.4.4: resolution: { - integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==, + integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==, } engines: { node: ">=10.13.0" } @@ -10612,16 +10463,10 @@ packages: integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, } - webidl-conversions@4.0.2: + webpack-sources@3.3.3: resolution: { - integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, - } - - webpack-sources@3.2.3: - resolution: - { - integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, + integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==, } engines: { node: ">=10.13.0" } @@ -10656,12 +10501,6 @@ packages: integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, } - whatwg-url@7.1.0: - resolution: - { - integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, - } - which-boxed-primitive@1.1.1: resolution: { @@ -10698,6 +10537,14 @@ packages: engines: { node: ">= 8" } hasBin: true + why-is-node-running@2.3.0: + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: ">=8" } + hasBin: true + word-wrap@1.2.5: resolution: { @@ -10781,22 +10628,14 @@ packages: integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==, } - zod-to-json-schema@3.24.5: + zod-validation-error@3.5.3: resolution: { - integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==, - } - peerDependencies: - zod: ^3.24.1 - - zod-validation-error@3.4.1: - resolution: - { - integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==, + integrity: sha512-OT5Y8lbUadqVZCsnyFaTQ4/O2mys4tj7PqhdbBCp7McPwvIEKfPtdA6QfPeFQK2/Rz5LgwmAXRJTugBNBi0btw==, } engines: { node: ">=18.0.0" } peerDependencies: - zod: ^3.24.4 + zod: ^3.25.0 || ^4.0.0 zod@3.24.4: resolution: @@ -10804,27 +10643,6 @@ packages: integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==, } - zustand@5.0.5: - resolution: - { - integrity: sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==, - } - engines: { node: ">=12.20.0" } - peerDependencies: - "@types/react": ">=18.0.0" - immer: ">=9.0.6" - react: ">=18.0.0" - use-sync-external-store: ">=1.2.0" - peerDependenciesMeta: - "@types/react": - optional: true - immer: - optional: true - react: - optional: true - use-sync-external-store: - optional: true - zwitch@2.0.4: resolution: { @@ -10836,8 +10654,8 @@ snapshots: "@ampproject/remapping@2.3.0": dependencies: - "@jridgewell/gen-mapping": 0.3.8 - "@jridgewell/trace-mapping": 0.3.25 + "@jridgewell/gen-mapping": 0.3.12 + "@jridgewell/trace-mapping": 0.3.29 "@ark/schema@0.46.0": dependencies: @@ -10866,7 +10684,7 @@ snapshots: "@babel/traverse": 7.26.9 "@babel/types": 7.26.9 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10877,15 +10695,15 @@ snapshots: dependencies: "@babel/parser": 7.26.9 "@babel/types": 7.26.9 - "@jridgewell/gen-mapping": 0.3.8 - "@jridgewell/trace-mapping": 0.3.25 + "@jridgewell/gen-mapping": 0.3.12 + "@jridgewell/trace-mapping": 0.3.29 jsesc: 3.1.0 "@babel/helper-compilation-targets@7.26.5": dependencies: "@babel/compat-data": 7.26.8 "@babel/helper-validator-option": 7.25.9 - browserslist: 4.24.4 + browserslist: 4.25.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -10941,7 +10759,7 @@ snapshots: "@babel/parser": 7.26.9 "@babel/template": 7.26.9 "@babel/types": 7.26.9 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10953,7 +10771,7 @@ snapshots: "@babel/parser": 7.26.9 "@babel/template": 7.26.9 "@babel/types": 7.26.9 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10974,18 +10792,18 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - "@emnapi/core@1.3.1": + "@emnapi/core@1.4.5": dependencies: - "@emnapi/wasi-threads": 1.0.1 + "@emnapi/wasi-threads": 1.0.4 tslib: 2.8.1 optional: true - "@emnapi/runtime@1.3.1": + "@emnapi/runtime@1.4.5": dependencies: tslib: 2.8.1 optional: true - "@emnapi/wasi-threads@1.0.1": + "@emnapi/wasi-threads@1.0.4": dependencies: tslib: 2.8.1 optional: true @@ -11065,32 +10883,32 @@ snapshots: "@esbuild/win32-x64@0.25.0": optional: true - "@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@2.4.2))": + "@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.4.2))": dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 "@eslint-community/regexpp@4.12.1": {} - "@eslint/config-array@0.20.0": + "@eslint/config-array@0.21.0": dependencies: "@eslint/object-schema": 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - "@eslint/config-helpers@0.2.2": {} + "@eslint/config-helpers@0.3.1": {} - "@eslint/core@0.13.0": + "@eslint/core@0.15.2": dependencies: "@types/json-schema": 7.0.15 "@eslint/eslintrc@3.3.1": dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -11100,13 +10918,13 @@ snapshots: transitivePeerDependencies: - supports-color - "@eslint/js@9.26.0": {} + "@eslint/js@9.33.0": {} "@eslint/object-schema@2.1.6": {} - "@eslint/plugin-kit@0.2.8": + "@eslint/plugin-kit@0.3.5": dependencies: - "@eslint/core": 0.13.0 + "@eslint/core": 0.15.2 levn: 0.4.1 "@floating-ui/core@1.6.9": @@ -11124,14 +10942,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - "@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@floating-ui/react-dom": 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@floating-ui/utils": 0.2.9 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - "@floating-ui/utils@0.2.9": {} "@formatjs/ecma402-abstract@2.3.4": @@ -11164,16 +10974,6 @@ snapshots: dependencies: tslib: 2.8.1 - "@headlessui/react@2.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@floating-ui/react": 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@react-aria/focus": 3.20.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@react-aria/interactions": 3.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@tanstack/react-virtual": 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.5.0(react@18.3.1) - "@hookform/resolvers@3.9.0(react-hook-form@7.53.1(react@18.3.1))": dependencies: react-hook-form: 7.53.1(react@18.3.1) @@ -11257,7 +11057,7 @@ snapshots: "@img/sharp-wasm32@0.33.5": dependencies: - "@emnapi/runtime": 1.3.1 + "@emnapi/runtime": 1.4.5 optional: true "@img/sharp-win32-ia32@0.33.5": @@ -11292,41 +11092,38 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - "@jridgewell/gen-mapping@0.3.8": + "@jridgewell/gen-mapping@0.3.12": dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.5.0 - "@jridgewell/trace-mapping": 0.3.25 + "@jridgewell/sourcemap-codec": 1.5.4 + "@jridgewell/trace-mapping": 0.3.29 "@jridgewell/resolve-uri@3.1.2": {} - "@jridgewell/set-array@1.2.1": {} - - "@jridgewell/source-map@0.3.6": + "@jridgewell/source-map@0.3.10": dependencies: - "@jridgewell/gen-mapping": 0.3.8 - "@jridgewell/trace-mapping": 0.3.25 + "@jridgewell/gen-mapping": 0.3.12 + "@jridgewell/trace-mapping": 0.3.29 - "@jridgewell/sourcemap-codec@1.5.0": {} + "@jridgewell/sourcemap-codec@1.5.4": {} - "@jridgewell/trace-mapping@0.3.25": + "@jridgewell/trace-mapping@0.3.29": dependencies: "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/sourcemap-codec": 1.5.4 - "@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0(esbuild@0.25.0))": + "@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.98.0)": dependencies: - "@mdx-js/mdx": 3.1.0(acorn@8.14.1) + "@mdx-js/mdx": 3.1.0(acorn@8.15.0) source-map: 0.7.4 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0 transitivePeerDependencies: - acorn - supports-color - "@mdx-js/mdx@3.1.0(acorn@8.14.1)": + "@mdx-js/mdx@3.1.0(acorn@8.15.0)": dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/estree-jsx": 1.0.5 "@types/hast": 3.0.4 "@types/mdx": 2.0.13 @@ -11338,7 +11135,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.1) + recma-jsx: 1.0.0(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.0 @@ -11360,26 +11157,21 @@ snapshots: "@types/react": 18.3.12 react: 18.3.1 - "@modelcontextprotocol/sdk@1.11.1": + "@microlink/react-json-view@1.27.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) + react: 18.3.1 + react-base16-styling: 0.9.1 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.5.9(@types/react@18.3.12)(react@18.3.1) transitivePeerDependencies: - - supports-color + - "@types/react" - "@napi-rs/wasm-runtime@0.2.7": + "@napi-rs/wasm-runtime@0.2.12": dependencies: - "@emnapi/core": 1.3.1 - "@emnapi/runtime": 1.3.1 - "@tybys/wasm-util": 0.9.0 + "@emnapi/core": 1.4.5 + "@emnapi/runtime": 1.4.5 + "@tybys/wasm-util": 0.10.0 optional: true "@next/env@14.2.15": {} @@ -11390,11 +11182,11 @@ snapshots: dependencies: fast-glob: 3.3.1 - "@next/mdx@15.3.3(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.98.0(esbuild@0.25.0)))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))": + "@next/mdx@15.3.3(@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))": dependencies: source-map: 0.7.4 optionalDependencies: - "@mdx-js/loader": 3.1.0(acorn@8.14.1)(webpack@5.98.0(esbuild@0.25.0)) + "@mdx-js/loader": 3.1.0(acorn@8.15.0)(webpack@5.98.0) "@mdx-js/react": 3.1.0(@types/react@18.3.12)(react@18.3.1) "@next/swc-darwin-arm64@14.2.15": @@ -11559,7 +11351,7 @@ snapshots: "@opentelemetry/instrumentation": 0.57.2(@opentelemetry/api@1.9.0) "@opentelemetry/semantic-conventions": 1.28.0 forwarded-parse: 2.1.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -11684,7 +11476,7 @@ snapshots: "@types/shimmer": 1.2.0 import-in-the-middle: 1.13.1 require-in-the-middle: 7.5.2 - semver: 7.7.1 + semver: 7.7.2 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -11725,10 +11517,6 @@ snapshots: dependencies: playwright: 1.52.0 - "@preact/compat@18.3.1(preact@10.26.6)": - dependencies: - preact: 10.26.6 - "@preact/signals-core@1.8.0": {} "@preact/signals@1.3.2(preact@10.26.6)": @@ -13570,18 +13358,18 @@ snapshots: "@rollup/pluginutils": 5.1.4(rollup@3.29.5) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.17 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 3.29.5 "@rollup/pluginutils@5.1.4(rollup@3.29.5)": dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 3.29.5 @@ -13647,7 +13435,7 @@ snapshots: "@rtsao/scc@1.1.0": {} - "@rushstack/eslint-patch@1.11.0": {} + "@rushstack/eslint-patch@1.12.0": {} "@schummar/icu-type-parser@1.21.5": {} @@ -13740,7 +13528,7 @@ snapshots: "@sentry/core@9.3.0": {} - "@sentry/nextjs@9.3.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.98.0(esbuild@0.25.0))": + "@sentry/nextjs@9.3.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.98.0)": dependencies: "@opentelemetry/api": 1.9.0 "@opentelemetry/semantic-conventions": 1.30.0 @@ -13751,7 +13539,7 @@ snapshots: "@sentry/opentelemetry": 9.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0) "@sentry/react": 9.3.0(react@18.3.1) "@sentry/vercel-edge": 9.3.0 - "@sentry/webpack-plugin": 3.1.2(webpack@5.98.0(esbuild@0.25.0)) + "@sentry/webpack-plugin": 3.1.2(webpack@5.98.0) chalk: 3.0.0 next: 14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resolve: 1.22.8 @@ -13828,94 +13616,18 @@ snapshots: "@opentelemetry/api": 1.9.0 "@sentry/core": 9.3.0 - "@sentry/webpack-plugin@3.1.2(webpack@5.98.0(esbuild@0.25.0))": + "@sentry/webpack-plugin@3.1.2(webpack@5.98.0)": dependencies: "@sentry/bundler-plugin-core": 3.1.2 unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0 transitivePeerDependencies: - encoding - supports-color "@socket.io/component-emitter@3.1.2": {} - "@stagewise/toolbar-next@0.1.2(@types/react@18.3.12)(jiti@2.4.2)(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(postcss@8.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0))(yaml@2.7.0)": - dependencies: - "@stagewise/toolbar-react": 0.1.2(@types/react@18.3.12)(jiti@2.4.2)(postcss@8.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0))(yaml@2.7.0) - "@types/react": 18.3.12 - next: 14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - transitivePeerDependencies: - - "@microsoft/api-extractor" - - "@swc/core" - - encoding - - immer - - jiti - - postcss - - react-dom - - supports-color - - tsx - - typescript - - use-sync-external-store - - vite - - yaml - - "@stagewise/toolbar-react@0.1.2(@types/react@18.3.12)(jiti@2.4.2)(postcss@8.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0))(yaml@2.7.0)": - dependencies: - "@stagewise/toolbar": 0.2.1(@types/react@18.3.12)(jiti@2.4.2)(postcss@8.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0))(yaml@2.7.0) - "@types/react": 18.3.12 - react: 18.3.1 - transitivePeerDependencies: - - "@microsoft/api-extractor" - - "@swc/core" - - encoding - - immer - - jiti - - postcss - - react-dom - - supports-color - - tsx - - typescript - - use-sync-external-store - - vite - - yaml - - "@stagewise/toolbar@0.2.1(@types/react@18.3.12)(jiti@2.4.2)(postcss@8.5.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tsx@4.19.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0))(yaml@2.7.0)": - dependencies: - "@headlessui/react": 2.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@preact/compat": 18.3.1(preact@10.26.6) - clsx: 2.1.1 - javascript-time-ago: 2.5.11 - lucide-react: 0.503.0(react@18.3.1) - postcss-prefix-selector: 2.1.1(postcss@8.5.3) - preact: 10.26.6 - react-remove-scroll: 2.6.3(@types/react@18.3.12)(react@18.3.1) - superjson: 2.2.2 - tailwind-merge: 3.3.0 - tailwindcss: 4.1.7 - tsup: 8.5.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.7.0) - ua-parser-js: 2.0.3 - vite-plugin-css-injected-by-js: 3.5.2(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0)) - zod: 3.24.4 - zustand: 5.0.5(@types/react@18.3.12)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) - transitivePeerDependencies: - - "@microsoft/api-extractor" - - "@swc/core" - - "@types/react" - - encoding - - immer - - jiti - - postcss - - react - - react-dom - - supports-color - - tsx - - typescript - - use-sync-external-store - - vite - - yaml - "@swc/counter@0.1.3": {} "@swc/helpers@0.5.15": @@ -13927,18 +13639,18 @@ snapshots: "@swc/counter": 0.1.3 tslib: 2.8.1 - "@t3-oss/env-core@0.13.4(arktype@2.1.20)(typescript@5.8.3)(zod@3.24.4)": + "@t3-oss/env-core@0.13.4(arktype@2.1.20)(typescript@5.9.2)(zod@3.24.4)": dependencies: arktype: 2.1.20 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.24.4 - "@t3-oss/env-nextjs@0.13.4(arktype@2.1.20)(typescript@5.8.3)(zod@3.24.4)": + "@t3-oss/env-nextjs@0.13.4(arktype@2.1.20)(typescript@5.9.2)(zod@3.24.4)": dependencies: - "@t3-oss/env-core": 0.13.4(arktype@2.1.20)(typescript@5.8.3)(zod@3.24.4) + "@t3-oss/env-core": 0.13.4(arktype@2.1.20)(typescript@5.9.2)(zod@3.24.4) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.24.4 transitivePeerDependencies: - arktype @@ -13951,19 +13663,17 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.14 - "@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@tanstack/virtual-core": 3.13.9 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - "@tanstack/virtual-core@3.13.9": {} - - "@tybys/wasm-util@0.9.0": + "@tybys/wasm-util@0.10.0": dependencies: tslib: 2.8.1 optional: true + "@types/base16@1.0.5": {} + + "@types/chai@5.2.2": + dependencies: + "@types/deep-eql": 4.0.2 + "@types/connect@3.4.38": dependencies: "@types/node": 22.8.1 @@ -13976,22 +13686,26 @@ snapshots: dependencies: "@types/ms": 2.1.0 + "@types/deep-eql@4.0.2": {} + "@types/eslint-scope@3.7.7": dependencies: "@types/eslint": 9.6.1 - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/eslint@9.6.1": dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/json-schema": 7.0.15 "@types/estree-jsx@1.0.5": dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/estree@1.0.7": {} + "@types/estree@1.0.8": {} + "@types/file-saver@2.0.7": {} "@types/hast@3.0.4": @@ -14002,6 +13716,8 @@ snapshots: "@types/json5@0.0.29": {} + "@types/lodash@4.17.20": {} + "@types/mdast@4.0.4": dependencies: "@types/unist": 3.0.3 @@ -14068,149 +13784,189 @@ snapshots: "@types/unist@3.0.3": {} - "@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)": + "@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)": dependencies: "@eslint-community/regexpp": 4.12.1 - "@typescript-eslint/parser": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/scope-manager": 8.32.0 - "@typescript-eslint/type-utils": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/utils": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/visitor-keys": 8.32.0 - eslint: 9.26.0(jiti@2.4.2) + "@typescript-eslint/parser": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + "@typescript-eslint/scope-manager": 8.40.0 + "@typescript-eslint/type-utils": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + "@typescript-eslint/utils": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + "@typescript-eslint/visitor-keys": 8.40.0 + eslint: 9.33.0(jiti@2.4.2) graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)": + "@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)": dependencies: - "@typescript-eslint/scope-manager": 8.32.0 - "@typescript-eslint/types": 8.32.0 - "@typescript-eslint/typescript-estree": 8.32.0(typescript@5.8.3) - "@typescript-eslint/visitor-keys": 8.32.0 - debug: 4.4.0 - eslint: 9.26.0(jiti@2.4.2) - typescript: 5.8.3 + "@typescript-eslint/scope-manager": 8.40.0 + "@typescript-eslint/types": 8.40.0 + "@typescript-eslint/typescript-estree": 8.40.0(typescript@5.9.2) + "@typescript-eslint/visitor-keys": 8.40.0 + debug: 4.4.1 + eslint: 9.33.0(jiti@2.4.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.32.0": + "@typescript-eslint/project-service@8.40.0(typescript@5.9.2)": dependencies: - "@typescript-eslint/types": 8.32.0 - "@typescript-eslint/visitor-keys": 8.32.0 - - "@typescript-eslint/type-utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)": - dependencies: - "@typescript-eslint/typescript-estree": 8.32.0(typescript@5.8.3) - "@typescript-eslint/utils": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.0 - eslint: 9.26.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + "@typescript-eslint/tsconfig-utils": 8.40.0(typescript@5.9.2) + "@typescript-eslint/types": 8.40.0 + debug: 4.4.1 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.32.0": {} - - "@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)": + "@typescript-eslint/scope-manager@8.40.0": dependencies: - "@typescript-eslint/types": 8.32.0 - "@typescript-eslint/visitor-keys": 8.32.0 - debug: 4.4.0 + "@typescript-eslint/types": 8.40.0 + "@typescript-eslint/visitor-keys": 8.40.0 + + "@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)": + dependencies: + typescript: 5.9.2 + + "@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)": + dependencies: + "@typescript-eslint/types": 8.40.0 + "@typescript-eslint/typescript-estree": 8.40.0(typescript@5.9.2) + "@typescript-eslint/utils": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + debug: 4.4.1 + eslint: 9.33.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/types@8.40.0": {} + + "@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)": + dependencies: + "@typescript-eslint/project-service": 8.40.0(typescript@5.9.2) + "@typescript-eslint/tsconfig-utils": 8.40.0(typescript@5.9.2) + "@typescript-eslint/types": 8.40.0 + "@typescript-eslint/visitor-keys": 8.40.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)": + "@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)": dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.26.0(jiti@2.4.2)) - "@typescript-eslint/scope-manager": 8.32.0 - "@typescript-eslint/types": 8.32.0 - "@typescript-eslint/typescript-estree": 8.32.0(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) - typescript: 5.8.3 + "@eslint-community/eslint-utils": 4.7.0(eslint@9.33.0(jiti@2.4.2)) + "@typescript-eslint/scope-manager": 8.40.0 + "@typescript-eslint/types": 8.40.0 + "@typescript-eslint/typescript-estree": 8.40.0(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.32.0": + "@typescript-eslint/visitor-keys@8.40.0": dependencies: - "@typescript-eslint/types": 8.32.0 - eslint-visitor-keys: 4.2.0 + "@typescript-eslint/types": 8.40.0 + eslint-visitor-keys: 4.2.1 - "@typescript/native-preview-darwin-arm64@7.0.0-dev.20250525.1": + "@typescript/native-preview-darwin-arm64@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview-darwin-x64@7.0.0-dev.20250525.1": + "@typescript/native-preview-darwin-x64@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview-linux-arm64@7.0.0-dev.20250525.1": + "@typescript/native-preview-linux-arm64@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview-linux-arm@7.0.0-dev.20250525.1": + "@typescript/native-preview-linux-arm@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview-linux-x64@7.0.0-dev.20250525.1": + "@typescript/native-preview-linux-x64@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview-win32-arm64@7.0.0-dev.20250525.1": + "@typescript/native-preview-win32-arm64@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview-win32-x64@7.0.0-dev.20250525.1": + "@typescript/native-preview-win32-x64@7.0.0-dev.20250819.1": optional: true - "@typescript/native-preview@7.0.0-dev.20250525.1": + "@typescript/native-preview@7.0.0-dev.20250819.1": optionalDependencies: - "@typescript/native-preview-darwin-arm64": 7.0.0-dev.20250525.1 - "@typescript/native-preview-darwin-x64": 7.0.0-dev.20250525.1 - "@typescript/native-preview-linux-arm": 7.0.0-dev.20250525.1 - "@typescript/native-preview-linux-arm64": 7.0.0-dev.20250525.1 - "@typescript/native-preview-linux-x64": 7.0.0-dev.20250525.1 - "@typescript/native-preview-win32-arm64": 7.0.0-dev.20250525.1 - "@typescript/native-preview-win32-x64": 7.0.0-dev.20250525.1 + "@typescript/native-preview-darwin-arm64": 7.0.0-dev.20250819.1 + "@typescript/native-preview-darwin-x64": 7.0.0-dev.20250819.1 + "@typescript/native-preview-linux-arm": 7.0.0-dev.20250819.1 + "@typescript/native-preview-linux-arm64": 7.0.0-dev.20250819.1 + "@typescript/native-preview-linux-x64": 7.0.0-dev.20250819.1 + "@typescript/native-preview-win32-arm64": 7.0.0-dev.20250819.1 + "@typescript/native-preview-win32-x64": 7.0.0-dev.20250819.1 "@ungap/structured-clone@1.3.0": {} - "@unrs/rspack-resolver-binding-darwin-arm64@1.2.2": + "@unrs/resolver-binding-android-arm-eabi@1.11.1": optional: true - "@unrs/rspack-resolver-binding-darwin-x64@1.2.2": + "@unrs/resolver-binding-android-arm64@1.11.1": optional: true - "@unrs/rspack-resolver-binding-freebsd-x64@1.2.2": + "@unrs/resolver-binding-darwin-arm64@1.11.1": optional: true - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2": + "@unrs/resolver-binding-darwin-x64@1.11.1": optional: true - "@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2": + "@unrs/resolver-binding-freebsd-x64@1.11.1": optional: true - "@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2": + "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": optional: true - "@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2": + "@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": optional: true - "@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2": + "@unrs/resolver-binding-linux-arm64-gnu@1.11.1": optional: true - "@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2": + "@unrs/resolver-binding-linux-arm64-musl@1.11.1": + optional: true + + "@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": + optional: true + + "@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + optional: true + + "@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + optional: true + + "@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + optional: true + + "@unrs/resolver-binding-linux-x64-gnu@1.11.1": + optional: true + + "@unrs/resolver-binding-linux-x64-musl@1.11.1": + optional: true + + "@unrs/resolver-binding-wasm32-wasi@1.11.1": dependencies: - "@napi-rs/wasm-runtime": 0.2.7 + "@napi-rs/wasm-runtime": 0.2.12 optional: true - "@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2": + "@unrs/resolver-binding-win32-arm64-msvc@1.11.1": optional: true - "@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2": + "@unrs/resolver-binding-win32-ia32-msvc@1.11.1": + optional: true + + "@unrs/resolver-binding-win32-x64-msvc@1.11.1": optional: true "@upstash/core-analytics@0.0.10": @@ -14231,6 +13987,48 @@ snapshots: next: 14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 + "@vitest/expect@3.2.4": + dependencies: + "@types/chai": 5.2.2 + "@vitest/spy": 3.2.4 + "@vitest/utils": 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 + + "@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0))": + dependencies: + "@vitest/spy": 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0) + + "@vitest/pretty-format@3.2.4": + dependencies: + tinyrainbow: 2.0.0 + + "@vitest/runner@3.2.4": + dependencies: + "@vitest/utils": 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + "@vitest/snapshot@3.2.4": + dependencies: + "@vitest/pretty-format": 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + "@vitest/spy@3.2.4": + dependencies: + tinyspy: 4.0.3 + + "@vitest/utils@3.2.4": + dependencies: + "@vitest/pretty-format": 3.2.4 + loupe: 3.2.0 + tinyrainbow: 2.0.0 + "@webassemblyjs/ast@1.14.1": dependencies: "@webassemblyjs/helper-numbers": 1.13.2 @@ -14318,24 +14116,19 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - accepts@2.0.0: + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 + acorn: 8.15.0 - acorn-import-attributes@1.9.5(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} + acorn@8.15.0: {} agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -14405,20 +14198,22 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -14428,7 +14223,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -14437,21 +14232,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -14460,11 +14255,13 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} astring@1.9.0: {} @@ -14475,8 +14272,8 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.3): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001707 + browserslist: 4.25.2 + caniuse-lite: 1.0.30001733 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -14495,6 +14292,8 @@ snapshots: balanced-match@1.0.2: {} + base16@1.0.0: {} + base64-js@0.0.8: {} base64-js@1.5.1: {} @@ -14522,20 +14321,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.0 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -14557,12 +14342,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.24.4: + browserslist@4.25.2: dependencies: - caniuse-lite: 1.0.30001707 - electron-to-chromium: 1.5.109 + caniuse-lite: 1.0.30001733 + electron-to-chromium: 1.5.199 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.2) buffer-equal-constant-time@1.0.1: {} @@ -14573,17 +14358,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-require@5.1.0(esbuild@0.25.0): - dependencies: - esbuild: 0.25.0 - load-tsconfig: 0.2.5 - busboy@1.6.0: dependencies: streamsearch: 1.1.0 - bytes@3.1.2: {} - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -14607,7 +14385,7 @@ snapshots: camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001707: {} + caniuse-lite@1.0.30001733: {} canvas@3.1.0: dependencies: @@ -14617,6 +14395,14 @@ snapshots: ccount@2.0.1: {} + chai@5.2.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.0 + pathval: 2.0.1 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -14637,6 +14423,8 @@ snapshots: character-reference-invalid@2.0.1: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -14699,10 +14487,16 @@ snapshots: collapse-white-space@2.1.0: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} color-string@1.9.1: @@ -14710,6 +14504,11 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + color@4.2.3: dependencies: color-convert: 2.0.1 @@ -14736,26 +14535,10 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.8: {} - - consola@3.4.2: {} - - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - convert-source-map@2.0.0: {} - cookie-signature@1.2.2: {} - cookie@0.7.2: {} - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 - core-util-is@1.0.3: {} cors@2.8.5: @@ -14807,7 +14590,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -14822,6 +14605,8 @@ snapshots: mimic-response: 3.1.0 optional: true + deep-eql@5.0.2: {} + deep-extend@0.6.0: optional: true @@ -14847,8 +14632,6 @@ snapshots: delayed-stream@1.0.0: {} - depd@2.0.0: {} - dequal@2.0.3: {} detect-europe-js@0.1.2: {} @@ -14904,9 +14687,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - ee-first@1.1.1: {} - - electron-to-chromium@1.5.109: {} + electron-to-chromium@1.5.199: {} emoji-regex@10.4.0: {} @@ -14914,8 +14695,6 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@2.0.0: {} - end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -14939,16 +14718,16 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 entities@4.5.0: {} environment@1.1.0: {} - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -14977,7 +14756,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -14992,6 +14773,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -15011,7 +14793,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -15058,7 +14840,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: "@types/estree-jsx": 1.0.5 - acorn: 8.14.1 + acorn: 8.15.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 @@ -15092,27 +14874,25 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-config-next@15.2.3(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.2.3(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: "@next/eslint-plugin-next": 15.2.3 - "@rushstack/eslint-patch": 1.11.0 - "@typescript-eslint/eslint-plugin": 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/parser": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) + "@rushstack/eslint-patch": 1.12.0 + "@typescript-eslint/eslint-plugin": 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + "@typescript-eslint/parser": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.31.0)(eslint@9.26.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.9.1)(eslint@9.26.0(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.26.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.4(eslint@9.26.0(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.26.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.5(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.33.0(jiti@2.4.2)) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -15126,44 +14906,44 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.31.0)(eslint@9.26.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.33.0(jiti@2.4.2)): dependencies: "@nolyfill/is-core-module": 1.0.39 - debug: 4.4.0 - eslint: 9.26.0(jiti@2.4.2) - get-tsconfig: 4.10.0 - is-bun-module: 1.3.0 - rspack-resolver: 1.2.2 + debug: 4.4.1 + eslint: 9.33.0(jiti@2.4.2) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 + unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.9.1)(eslint@9.26.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.33.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.1)(eslint@9.26.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.33.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - "@typescript-eslint/parser": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) + "@typescript-eslint/parser": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.31.0)(eslint@9.26.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.33.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.9.1)(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.33.0(jiti@2.4.2)): dependencies: "@rtsao/scc": 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.9.1)(eslint@9.26.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.33.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15175,23 +14955,23 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - "@typescript-eslint/parser": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + "@typescript-eslint/parser": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.33.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.3 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -15200,29 +14980,29 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-playwright@2.2.0(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-playwright@2.2.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) globals: 13.24.0 - eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) - eslint-plugin-react-you-might-not-need-an-effect@0.0.39(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-react-you-might-not-need-an-effect@0.0.39(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.26.0(jiti@2.4.2) - eslint-utils: 3.0.0(eslint@9.26.0(jiti@2.4.2)) + eslint: 9.33.0(jiti@2.4.2) + eslint-utils: 3.0.0(eslint@9.33.0(jiti@2.4.2)) - eslint-plugin-react@7.37.4(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.33.0(jiti@2.4.2)): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -15241,46 +15021,45 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@9.26.0(jiti@2.4.2)): + eslint-utils@3.0.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.26.0(jiti@2.4.2): + eslint@9.33.0(jiti@2.4.2): dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.26.0(jiti@2.4.2)) + "@eslint-community/eslint-utils": 4.7.0(eslint@9.33.0(jiti@2.4.2)) "@eslint-community/regexpp": 4.12.1 - "@eslint/config-array": 0.20.0 - "@eslint/config-helpers": 0.2.2 - "@eslint/core": 0.13.0 + "@eslint/config-array": 0.21.0 + "@eslint/config-helpers": 0.3.1 + "@eslint/core": 0.15.2 "@eslint/eslintrc": 3.3.1 - "@eslint/js": 9.26.0 - "@eslint/plugin-kit": 0.2.8 + "@eslint/js": 9.33.0 + "@eslint/plugin-kit": 0.3.5 "@humanfs/node": 0.16.6 "@humanwhocodes/module-importer": 1.0.1 "@humanwhocodes/retry": 0.4.3 - "@modelcontextprotocol/sdk": 1.11.1 - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/json-schema": 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -15295,17 +15074,16 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - zod: 3.24.4 optionalDependencies: jiti: 2.4.2 transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esquery@1.6.0: dependencies: @@ -15321,7 +15099,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -15334,7 +15112,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -15352,22 +15130,14 @@ snapshots: estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 esutils@2.0.3: {} - etag@1.8.1: {} - eventemitter3@5.0.1: {} events@3.3.0: {} - eventsource-parser@3.0.1: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.1 - execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -15383,41 +15153,7 @@ snapshots: expand-template@2.0.3: optional: true - express-rate-limit@7.5.0(express@5.1.0): - dependencies: - express: 5.1.0 - - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + expect-type@1.2.2: {} extend@3.0.2: {} @@ -15451,13 +15187,13 @@ snapshots: dependencies: reusify: 1.0.4 - fd-package-json@1.2.0: + fd-package-json@2.0.0: dependencies: - walk-up-path: 3.0.1 + walk-up-path: 4.0.0 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.4(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 file-entry-cache@8.0.0: dependencies: @@ -15469,28 +15205,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - fix-dts-default-cjs-exports@1.0.1: - dependencies: - magic-string: 0.30.17 - mlly: 1.7.4 - rollup: 4.41.0 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -15526,18 +15245,14 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - formatly@0.2.3: + formatly@0.2.4: dependencies: - fd-package-json: 1.2.0 + fd-package-json: 2.0.0 forwarded-parse@2.1.2: {} - forwarded@0.2.0: {} - fraction.js@4.3.7: {} - fresh@2.0.0: {} - fs-constants@1.0.0: optional: true @@ -15614,7 +15329,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -15740,7 +15455,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/estree-jsx": 1.0.5 "@types/hast": 3.0.4 comma-separated-tokens: 2.0.3 @@ -15761,7 +15476,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/hast": 3.0.4 "@types/unist": 3.0.3 comma-separated-tokens: 2.0.3 @@ -15808,25 +15523,17 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -15836,14 +15543,12 @@ snapshots: hyphen@1.10.6: {} - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} ignore@5.3.2: {} + ignore@7.0.5: {} + immediate@3.0.6: {} import-fresh@3.3.0: @@ -15853,8 +15558,8 @@ snapshots: import-in-the-middle@1.13.1: dependencies: - acorn: 8.14.1 - acorn-import-attributes: 1.9.5(acorn@8.14.1) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.3 @@ -15880,8 +15585,6 @@ snapshots: "@formatjs/icu-messageformat-parser": 2.11.2 tslib: 2.8.1 - ipaddr.js@1.9.1: {} - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -15918,9 +15621,9 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-bun-module@1.3.0: + is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -15972,6 +15675,8 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -15981,11 +15686,9 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} - is-reference@1.2.1: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 is-regex@1.2.1: dependencies: @@ -16036,8 +15739,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-what@4.1.16: {} - isarray@1.0.0: {} isarray@2.0.5: {} @@ -16065,10 +15766,6 @@ snapshots: optionalDependencies: "@pkgjs/parseargs": 0.11.0 - javascript-time-ago@2.5.11: - dependencies: - relative-time-format: 1.1.6 - jay-peg@1.1.1: dependencies: restructure: 3.0.2 @@ -16083,10 +15780,10 @@ snapshots: jiti@2.4.2: {} - joycon@3.1.1: {} - js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -16115,7 +15812,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -16144,23 +15841,23 @@ snapshots: kleur@4.1.5: {} - knip@5.55.1(@types/node@22.8.1)(typescript@5.8.3): + knip@5.55.1(@types/node@22.8.1)(typescript@5.9.2): dependencies: "@nodelib/fs.walk": 1.2.8 "@types/node": 22.8.1 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.3 fast-glob: 3.3.3 - formatly: 0.2.3 + formatly: 0.2.4 jiti: 2.4.2 js-yaml: 4.1.0 minimist: 1.2.8 picocolors: 1.1.1 - picomatch: 4.0.2 - smol-toml: 1.3.4 + picomatch: 4.0.3 + smol-toml: 1.4.2 strip-json-comments: 5.0.1 - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.24.4 - zod-validation-error: 3.4.1(zod@3.24.4) + zod-validation-error: 3.5.3(zod@3.24.4) language-subtag-registry@0.3.23: {} @@ -16194,7 +15891,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.0 + debug: 4.4.1 execa: 8.0.1 lilconfig: 3.1.3 listr2: 8.2.5 @@ -16214,8 +15911,6 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - load-tsconfig@0.2.5: {} - loader-runner@4.3.0: {} locate-path@6.0.0: @@ -16224,12 +15919,12 @@ snapshots: lodash.castarray@4.4.0: {} + lodash.curry@4.1.1: {} + lodash.isplainobject@4.0.6: {} lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -16249,6 +15944,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.2.0: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -16259,19 +15956,15 @@ snapshots: dependencies: react: 18.3.1 - lucide-react@0.503.0(react@18.3.1): - dependencies: - react: 18.3.1 - lz-string@1.5.0: {} magic-string@0.30.17: dependencies: - "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/sourcemap-codec": 1.5.4 magic-string@0.30.8: dependencies: - "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/sourcemap-codec": 1.5.4 make-cancellable-promise@1.3.2: {} @@ -16455,10 +16148,6 @@ snapshots: media-engine@1.0.3: {} - media-typer@1.1.0: {} - - merge-descriptors@2.0.0: {} - merge-refs@1.3.0(@types/react@18.3.12): optionalDependencies: "@types/react": 18.3.12 @@ -16546,7 +16235,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -16557,7 +16246,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -16574,7 +16263,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -16586,8 +16275,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -16610,7 +16299,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -16674,7 +16363,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/unist": 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -16712,7 +16401,7 @@ snapshots: micromark@4.0.2: dependencies: "@types/debug": 4.1.12 - debug: 4.4.0 + debug: 4.4.1 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16738,16 +16427,10 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.54.0: {} - mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -16778,13 +16461,6 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mlly@1.7.4: - dependencies: - acorn: 8.14.1 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.1 - module-details-from-path@1.0.3: {} mri@1.2.0: {} @@ -16804,6 +16480,8 @@ snapshots: napi-build-utils@2.0.0: optional: true + napi-postinstall@0.3.3: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -16812,7 +16490,7 @@ snapshots: neo-async@2.6.2: {} - next-intl@4.0.2(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.8.3): + next-intl@4.0.2(next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.9.2): dependencies: "@formatjs/intl-localematcher": 0.5.10 negotiator: 1.0.0 @@ -16820,14 +16498,14 @@ snapshots: react: 18.3.1 use-intl: 4.0.2(react@18.3.1) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 next@14.2.15(@babel/core@7.26.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: "@next/env": 14.2.15 "@swc/helpers": 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001707 + caniuse-lite: 1.0.30001733 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -16855,7 +16533,7 @@ snapshots: "@swc/counter": 0.1.3 "@swc/helpers": 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001707 + caniuse-lite: 1.0.30001733 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16878,7 +16556,7 @@ snapshots: node-abi@3.75.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 optional: true node-addon-api@7.1.1: @@ -16932,14 +16610,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: @@ -16948,13 +16626,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 + optional: true onetime@5.1.2: dependencies: @@ -17030,8 +16705,6 @@ snapshots: leac: 0.6.0 peberminta: 0.9.0 - parseurl@1.3.3: {} - path-exists@4.0.0: {} path-key@3.1.1: {} @@ -17045,13 +16718,13 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@8.2.0: {} - path2d@0.2.2: optional: true pathe@2.0.3: {} + pathval@2.0.1: {} + pdf-parse@1.1.1: dependencies: debug: 3.2.7 @@ -17082,7 +16755,7 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -17090,14 +16763,6 @@ snapshots: pirates@4.0.6: {} - pkce-challenge@5.0.0: {} - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - playwright-core@1.52.0: {} playwright@1.52.0: @@ -17127,24 +16792,11 @@ snapshots: optionalDependencies: postcss: 8.5.3 - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.0): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 2.4.2 - postcss: 8.5.3 - tsx: 4.19.4 - yaml: 2.7.0 - postcss-nested@6.2.0(postcss@8.5.3): dependencies: postcss: 8.5.3 postcss-selector-parser: 6.1.2 - postcss-prefix-selector@2.1.1(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 @@ -17221,11 +16873,6 @@ snapshots: property-information@7.1.0: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} pump@3.0.2: @@ -17250,15 +16897,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - range-parser@1.2.1: {} - - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -17347,6 +16985,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-base16-styling@0.9.1: + dependencies: + "@babel/runtime": 7.26.9 + "@types/base16": 1.0.5 + "@types/lodash": 4.17.20 + base16: 1.0.0 + color: 3.2.1 + csstype: 3.1.3 + lodash.curry: 4.1.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -17394,6 +17042,8 @@ snapshots: react-is@16.13.1: {} + react-lifecycles-compat@3.0.4: {} + react-pdf@9.2.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 2.1.1 @@ -17510,6 +17160,15 @@ snapshots: optionalDependencies: "@types/react": 18.3.12 + react-textarea-autosize@8.5.9(@types/react@18.3.12)(react@18.3.1): + dependencies: + "@babel/runtime": 7.26.9 + react: 18.3.1 + use-composed-ref: 1.4.0(@types/react@18.3.12)(react@18.3.1) + use-latest: 1.3.0(@types/react@18.3.12)(react@18.3.1) + transitivePeerDependencies: + - "@types/react" + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -17542,13 +17201,13 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.14.1): + recma-jsx@1.0.0(acorn@8.15.0): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -17558,14 +17217,14 @@ snapshots: recma-parse@1.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -17574,7 +17233,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -17594,14 +17253,12 @@ snapshots: rehype-recma@1.0.0: dependencies: - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@types/hast": 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color - relative-time-format@1.1.6: {} - remark-gfm@4.0.1: dependencies: "@types/mdast": 4.0.4 @@ -17647,7 +17304,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 module-details-from-path: 1.0.3 resolve: 1.22.10 transitivePeerDependencies: @@ -17662,8 +17319,6 @@ snapshots: resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} resolve@1.22.10: @@ -17730,30 +17385,6 @@ snapshots: "@rollup/rollup-win32-x64-msvc": 4.41.0 fsevents: 2.3.3 - router@2.2.0: - dependencies: - debug: 4.4.0 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.2.0 - transitivePeerDependencies: - - supports-color - - rspack-resolver@1.2.2: - optionalDependencies: - "@unrs/rspack-resolver-binding-darwin-arm64": 1.2.2 - "@unrs/rspack-resolver-binding-darwin-x64": 1.2.2 - "@unrs/rspack-resolver-binding-freebsd-x64": 1.2.2 - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": 1.2.2 - "@unrs/rspack-resolver-binding-linux-arm64-gnu": 1.2.2 - "@unrs/rspack-resolver-binding-linux-arm64-musl": 1.2.2 - "@unrs/rspack-resolver-binding-linux-x64-gnu": 1.2.2 - "@unrs/rspack-resolver-binding-linux-x64-musl": 1.2.2 - "@unrs/rspack-resolver-binding-wasm32-wasi": 1.2.2 - "@unrs/rspack-resolver-binding-win32-arm64-msvc": 1.2.2 - "@unrs/rspack-resolver-binding-win32-x64-msvc": 1.2.2 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -17781,8 +17412,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safer-buffer@2.1.2: {} - scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -17804,37 +17433,12 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} - - send@1.2.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color + semver@7.7.2: {} serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -17859,13 +17463,11 @@ snapshots: setimmediate@1.0.5: {} - setprototypeof@1.2.0: {} - sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.7.1 + semver: 7.7.2 optionalDependencies: "@img/sharp-darwin-arm64": 0.33.5 "@img/sharp-darwin-x64": 0.33.5 @@ -17924,6 +17526,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -17954,7 +17558,7 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - smol-toml@1.3.4: {} + smol-toml@1.4.2: {} socket.io-adapter@2.5.5: dependencies: @@ -18002,19 +17606,22 @@ snapshots: source-map@0.7.4: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} stable-hash@0.0.5: {} + stackback@0.0.2: {} + stacktrace-parser@0.1.11: dependencies: type-fest: 0.7.1 - statuses@2.0.1: {} + std-env@3.9.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 streamsearch@1.1.0: {} @@ -18042,14 +17649,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -18063,7 +17670,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -18071,7 +17678,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -18120,6 +17727,10 @@ snapshots: strip-json-comments@5.0.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 @@ -18144,7 +17755,7 @@ snapshots: sucrase@3.35.0: dependencies: - "@jridgewell/gen-mapping": 0.3.8 + "@jridgewell/gen-mapping": 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -18152,10 +17763,6 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - superjson@2.2.2: - dependencies: - copy-anything: 3.0.5 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -18168,12 +17775,8 @@ snapshots: svg-arc-to-cubic-bezier@3.2.0: {} - tabbable@6.2.0: {} - tailwind-merge@2.6.0: {} - tailwind-merge@3.3.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.14): dependencies: tailwindcss: 3.4.14 @@ -18205,9 +17808,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@4.1.7: {} - - tapable@2.2.1: {} + tapable@2.2.2: {} tar-fs@2.1.2: dependencies: @@ -18226,21 +17827,19 @@ snapshots: readable-stream: 3.6.2 optional: true - terser-webpack-plugin@5.3.14(esbuild@0.25.0)(webpack@5.98.0(esbuild@0.25.0)): + terser-webpack-plugin@5.3.14(webpack@5.98.0): dependencies: - "@jridgewell/trace-mapping": 0.3.25 + "@jridgewell/trace-mapping": 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(esbuild@0.25.0) - optionalDependencies: - esbuild: 0.25.0 + terser: 5.43.1 + webpack: 5.98.0 - terser@5.39.0: + terser@5.43.1: dependencies: - "@jridgewell/source-map": 0.3.6 - acorn: 8.14.1 + "@jridgewell/source-map": 0.3.10 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -18256,34 +17855,34 @@ snapshots: tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} + tinyexec@0.3.2: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - tr46@0.0.3: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 ts-interface-checker@0.1.13: {} @@ -18296,38 +17895,10 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.7.0): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.0 - esbuild: 0.25.0 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.0) - resolve-from: 5.0.0 - rollup: 4.41.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.3 - typescript: 5.8.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsx@4.19.4: dependencies: esbuild: 0.25.0 - get-tsconfig: 4.10.0 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 @@ -18344,12 +17915,6 @@ snapshots: type-fest@0.7.1: {} - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -18383,17 +17948,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - "@typescript-eslint/eslint-plugin": 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/parser": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/utils": 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) - typescript: 5.8.3 + "@typescript-eslint/eslint-plugin": 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + "@typescript-eslint/parser": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + "@typescript-eslint/typescript-estree": 8.40.0(typescript@5.9.2) + "@typescript-eslint/utils": 8.40.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} + typescript@5.9.2: {} ua-is-frozen@0.1.2: {} @@ -18407,8 +17973,6 @@ snapshots: transitivePeerDependencies: - encoding - ufo@1.6.1: {} - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -18465,24 +18029,46 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - unpipe@1.0.0: {} - unplugin@1.0.1: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 chokidar: 3.6.0 - webpack-sources: 3.2.3 + webpack-sources: 3.3.3 webpack-virtual-modules: 0.5.0 unplugin@2.1.0: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 webpack-virtual-modules: 0.6.2 optional: true - update-browserslist-db@1.1.3(browserslist@4.24.4): + unrs-resolver@1.11.1: dependencies: - browserslist: 4.24.4 + napi-postinstall: 0.3.3 + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi": 1.11.1 + "@unrs/resolver-binding-android-arm64": 1.11.1 + "@unrs/resolver-binding-darwin-arm64": 1.11.1 + "@unrs/resolver-binding-darwin-x64": 1.11.1 + "@unrs/resolver-binding-freebsd-x64": 1.11.1 + "@unrs/resolver-binding-linux-arm-gnueabihf": 1.11.1 + "@unrs/resolver-binding-linux-arm-musleabihf": 1.11.1 + "@unrs/resolver-binding-linux-arm64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-arm64-musl": 1.11.1 + "@unrs/resolver-binding-linux-ppc64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-riscv64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-riscv64-musl": 1.11.1 + "@unrs/resolver-binding-linux-s390x-gnu": 1.11.1 + "@unrs/resolver-binding-linux-x64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-x64-musl": 1.11.1 + "@unrs/resolver-binding-wasm32-wasi": 1.11.1 + "@unrs/resolver-binding-win32-arm64-msvc": 1.11.1 + "@unrs/resolver-binding-win32-ia32-msvc": 1.11.1 + "@unrs/resolver-binding-win32-x64-msvc": 1.11.1 + + update-browserslist-db@1.1.3(browserslist@4.25.2): + dependencies: + browserslist: 4.25.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -18499,6 +18085,12 @@ snapshots: optionalDependencies: "@types/react": 18.3.12 + use-composed-ref@1.4.0(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.12 + use-debounce@10.0.4(react@18.3.1): dependencies: react: 18.3.1 @@ -18510,6 +18102,19 @@ snapshots: intl-messageformat: 10.7.16 react: 18.3.1 + use-isomorphic-layout-effect@1.2.1(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.12 + + use-latest@1.3.0(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.12 + use-sidecar@1.1.3(@types/react@18.3.12)(react@18.3.1): dependencies: detect-node-es: 1.1.0 @@ -18544,33 +18149,92 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - vite-plugin-css-injected-by-js@3.5.2(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0)): + vite-node@3.2.4(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0): dependencies: - vite: 6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0) + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0) + transitivePeerDependencies: + - "@types/node" + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.0): + vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0): dependencies: esbuild: 0.25.0 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.3 rollup: 4.41.0 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 optionalDependencies: "@types/node": 22.8.1 fsevents: 2.3.3 jiti: 2.4.2 - terser: 5.39.0 + terser: 5.43.1 tsx: 4.19.4 yaml: 2.7.0 - walk-up-path@3.0.1: {} + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0): + dependencies: + "@types/chai": 5.2.2 + "@vitest/expect": 3.2.4 + "@vitest/mocker": 3.2.4(vite@6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0)) + "@vitest/pretty-format": 3.2.4 + "@vitest/runner": 3.2.4 + "@vitest/snapshot": 3.2.4 + "@vitest/spy": 3.2.4 + "@vitest/utils": 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0) + vite-node: 3.2.4(@types/node@22.8.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.4)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + "@types/debug": 4.1.12 + "@types/node": 22.8.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + walk-up-path@4.0.0: {} warning@4.0.3: dependencies: loose-envify: 1.4.0 - watchpack@2.4.2: + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -18581,26 +18245,24 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - - webpack-sources@3.2.3: {} + webpack-sources@3.3.3: {} webpack-virtual-modules@0.5.0: {} webpack-virtual-modules@0.6.2: optional: true - webpack@5.98.0(esbuild@0.25.0): + webpack@5.98.0: dependencies: "@types/eslint-scope": 3.7.7 - "@types/estree": 1.0.7 + "@types/estree": 1.0.8 "@webassemblyjs/ast": 1.14.1 "@webassemblyjs/wasm-edit": 1.14.1 "@webassemblyjs/wasm-parser": 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 + acorn: 8.15.0 + browserslist: 4.25.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -18611,10 +18273,10 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(webpack@5.98.0(esbuild@0.25.0)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(webpack@5.98.0) + watchpack: 2.4.4 + webpack-sources: 3.3.3 transitivePeerDependencies: - "@swc/core" - esbuild @@ -18625,12 +18287,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -18676,6 +18332,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -18696,7 +18357,8 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 - wrappy@1.0.2: {} + wrappy@1.0.2: + optional: true ws@8.17.1: {} @@ -18710,20 +18372,10 @@ snapshots: yoga-layout@3.2.1: {} - zod-to-json-schema@3.24.5(zod@3.24.4): - dependencies: - zod: 3.24.4 - - zod-validation-error@3.4.1(zod@3.24.4): + zod-validation-error@3.5.3(zod@3.24.4): dependencies: zod: 3.24.4 zod@3.24.4: {} - zustand@5.0.5(@types/react@18.3.12)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): - optionalDependencies: - "@types/react": 18.3.12 - react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) - zwitch@2.0.4: {} diff --git a/src/actions/subscribe-action.ts b/src/actions/subscribe-action.ts index 1e5d049..d2b5414 100644 --- a/src/actions/subscribe-action.ts +++ b/src/actions/subscribe-action.ts @@ -39,7 +39,7 @@ export async function subscribeAction(formData: FormData) { // Check email rate limit const emailLimit = await checkRateLimit( validatedFields.email.toLowerCase(), - emailLimiter + emailLimiter, ); if (!emailLimit.success) { return { error: emailLimit.error }; @@ -53,7 +53,7 @@ export async function subscribeAction(formData: FormData) { if ( existingContacts?.data?.some( (contact) => - contact.email.toLowerCase() === validatedFields.email.toLowerCase() + contact.email.toLowerCase() === validatedFields.email.toLowerCase(), ) ) { return { error: "This email is already subscribed." }; diff --git a/src/app/(app)/components/cta-toasts/index.tsx b/src/app/(app)/components/cta-toasts/index.tsx index d76ef6c..2cffcb8 100644 --- a/src/app/(app)/components/cta-toasts/index.tsx +++ b/src/app/(app)/components/cta-toasts/index.tsx @@ -49,7 +49,7 @@ export function customPremiumToast(toast: Omit) { ), { duration: Infinity, - } + }, ); } @@ -71,12 +71,12 @@ export function customDefaultToast(toast: Omit) { ), { duration: Infinity, - } + }, ); } const SonnerCloseButton = ( - props: React.ButtonHTMLAttributes + props: React.ButtonHTMLAttributes, ) => { return ( + } + content="View localStorage data" + /> + + {/* Draggable Window */} + {isOpen ? ( +
+ {/* Header with drag handle */} +
+
+ +
+ + localStorage Viewer + + + {Object.keys(localStorageData).length} items + {lastUpdated && ` • Last updated: ${lastUpdated}`} + +
+
+
+ + + + } + content="Refresh data" + /> + setIsExpanded(!isExpanded)} + _size="sm" + _variant="ghost" + className="h-6 w-6 p-0" + > + {isExpanded ? ( + + ) : ( + + )} + + } + content={isExpanded ? "Collapse" : "Expand"} + /> + setIsOpen(false)} + _size="sm" + _variant="ghost" + className="h-6 w-6 p-0" + > + + + } + content="Close" + /> +
+
+ + {/* Content */} +
+
+ +
+
+
+ ) : null} + + ); +} diff --git a/src/app/(app)/components/index.tsx b/src/app/(app)/components/index.tsx index 388163d..953a8e9 100644 --- a/src/app/(app)/components/index.tsx +++ b/src/app/(app)/components/index.tsx @@ -35,7 +35,7 @@ const InvoicePDFViewer = dynamic( { ssr: false, loading: () => , - } + }, ); const AndroidPDFViewer = dynamic( @@ -43,7 +43,7 @@ const AndroidPDFViewer = dynamic( { ssr: false, loading: () => , - } + }, ); const PdfViewer = ({ @@ -131,7 +131,7 @@ export function InvoiceClientPage({
@@ -210,7 +210,7 @@ export function InvoiceClientPage({
diff --git a/src/app/(app)/components/invoice-form/index.tsx b/src/app/(app)/components/invoice-form/index.tsx index 83bd947..0c7b649 100644 --- a/src/app/(app)/components/invoice-form/index.tsx +++ b/src/app/(app)/components/invoice-form/index.tsx @@ -63,13 +63,13 @@ type AccordionKeys = Array<(typeof DEFAULT_ACCORDION_VALUES)[number]>; interface InvoiceFormProps { invoiceData: InvoiceData; - onInvoiceDataChange: (updatedData: InvoiceData) => void; + handleInvoiceDataChange: (updatedData: InvoiceData) => void; setCanShareInvoice: (canShareInvoice: boolean) => void; } export const InvoiceForm = memo(function InvoiceForm({ invoiceData, - onInvoiceDataChange, + handleInvoiceDataChange, setCanShareInvoice, }: InvoiceFormProps) { const form = useForm({ @@ -96,7 +96,7 @@ export const InvoiceForm = memo(function InvoiceForm({ const selectedDateFormat = useWatch({ control, name: "dateFormat" }); const isPaymentDueBeforeDateOfIssue = dayjs(paymentDue).isBefore( - dayjs(dateOfIssue) + dayjs(dateOfIssue), ); // payment due date is 14 days after the date of issue or the same day @@ -124,7 +124,7 @@ export const InvoiceForm = memo(function InvoiceForm({ ? Number( invoiceItems .reduce((sum, item) => sum + (item?.preTaxAmount || 0), 0) - .toFixed(2) + .toFixed(2), ) : 0; @@ -177,7 +177,7 @@ export const InvoiceForm = memo(function InvoiceForm({ } }, // debounce delay in ms - DEBOUNCE_TIMEOUT + DEBOUNCE_TIMEOUT, ); // subscribe to form changes to regenerate pdf on every input change @@ -211,12 +211,12 @@ export const InvoiceForm = memo(function InvoiceForm({ const currentFormData = watch(); debouncedRegeneratePdfOnFormChange(currentFormData); }, - [remove, watch, debouncedRegeneratePdfOnFormChange] + [remove, watch, debouncedRegeneratePdfOnFormChange], ); // TODO: refactor this and debouncedRegeneratePdfOnFormChange(), so data is saved to local storage, basically copy everything from debouncedRegeneratePdfOnFormChange() and use this onSubmit function in two places const onSubmit = (data: InvoiceData) => { - onInvoiceDataChange(data); + handleInvoiceDataChange(data); }; /** @@ -230,7 +230,7 @@ export const InvoiceForm = memo(function InvoiceForm({ // Try to load from localStorage try { const savedState = localStorage.getItem( - ACCORDION_STATE_LOCAL_STORAGE_KEY + ACCORDION_STATE_LOCAL_STORAGE_KEY, ); if (savedState) { @@ -273,7 +273,7 @@ export const InvoiceForm = memo(function InvoiceForm({ localStorage.setItem( ACCORDION_STATE_LOCAL_STORAGE_KEY, - JSON.stringify(stateToSave) + JSON.stringify(stateToSave), ); } catch (error) { console.error("Error saving accordion state:", error); @@ -310,7 +310,7 @@ export const InvoiceForm = memo(function InvoiceForm({ if (Array.isArray(error)) { return error.map((item, index) => Object.entries( - item as { [key: string]: { message?: string } } + item as { [key: string]: { message?: string } }, ).map(([fieldName, fieldError]) => (
  • {fieldError?.message || "Unknown error"}
  • - )) + )), ); } // Handle nested object errors if (error && typeof error === "object") { return Object.entries( - error as { [key: string]: { message?: string } } + error as { [key: string]: { message?: string } }, ).map(([nestedKey, nestedError]) => { return (
  • @@ -342,7 +342,7 @@ export const InvoiceForm = memo(function InvoiceForm({ , { closeButton: true, - } + }, ); })} > @@ -636,53 +636,58 @@ export const InvoiceForm = memo(function InvoiceForm({ )} -
    -
    - {/* Show/hide Person Authorized to Receive field in PDF switch */} -
    - + {/* + Stripe template doesn't have these fields + */} + {invoiceData.template === "default" && ( +
    +
    + {/* Show/hide Person Authorized to Receive field in PDF switch */} +
    + - ( - - )} - /> -
    + ( + + )} + /> +
    - {/* Show/hide Person Authorized to Issue field in PDF switch */} -
    - + {/* Show/hide Person Authorized to Issue field in PDF switch */} +
    + - ( - - )} - /> + ( + + )} + /> +
    -
    + )}
    ); @@ -703,7 +708,7 @@ const calculateItemTotals = (item: InvoiceItemData | null) => { const formattedVatAmount = Number(vatAmount.toFixed(2)); const formattedPreTaxAmount = Number( - (formattedNetAmount + formattedVatAmount).toFixed(2) + (formattedNetAmount + formattedVatAmount).toFixed(2), ); return { diff --git a/src/app/(app)/components/invoice-form/sections/general-information.tsx b/src/app/(app)/components/invoice-form/sections/general-information.tsx index 723d164..f33cf4e 100644 --- a/src/app/(app)/components/invoice-form/sections/general-information.tsx +++ b/src/app/(app)/components/invoice-form/sections/general-information.tsx @@ -101,7 +101,7 @@ export const GeneralInformation = memo(function GeneralInformation({ const isDateOfServiceEqualsEndOfCurrentMonth = dayjs(dateOfService).isSame( dayjs().endOf("month"), - "day" + "day", ); const isDefaultInvoiceNumberLabel = @@ -109,7 +109,7 @@ export const GeneralInformation = memo(function GeneralInformation({ // extract the month and year from the invoice number (i.e. 1/04-2025 -> 04-2025) const extractInvoiceMonthAndYear = /(\d{2}-\d{4})/.exec( - invoiceNumberValue ?? "" + invoiceNumberValue ?? "", )?.[1]; const isInvoiceNumberInCurrentMonth = @@ -144,7 +144,7 @@ export const GeneralInformation = memo(function GeneralInformation({ toast.error("Error uploading image. Please try again."); } }, - [setValue] + [setValue], ); const handleLogoRemove = useCallback(() => { @@ -325,7 +325,7 @@ export const GeneralInformation = memo(function GeneralInformation({ // we need to keep the invoice number suffix (e.g. 1/MM-YYYY) for better user experience, when switching language setValue( "invoiceNumberObject.label", - `${newInvoiceNumberLabel}:` + `${newInvoiceNumberLabel}:`, ); setValue("invoiceNumberObject.value", invoiceNumberValue); }} @@ -460,7 +460,7 @@ export const GeneralInformation = memo(function GeneralInformation({ onClick={() => { setValue( "invoiceNumberObject.label", - defaultInvoiceNumber + defaultInvoiceNumber, ); }} > @@ -504,7 +504,7 @@ export const GeneralInformation = memo(function GeneralInformation({ onClick={() => { setValue( "invoiceNumberObject.value", - `1/${CURRENT_MONTH_AND_YEAR}` + `1/${CURRENT_MONTH_AND_YEAR}`, ); }} > diff --git a/src/app/(app)/components/invoice-form/sections/invoice-items.tsx b/src/app/(app)/components/invoice-form/sections/invoice-items.tsx index 90a9fe8..38354d3 100644 --- a/src/app/(app)/components/invoice-form/sections/invoice-items.tsx +++ b/src/app/(app)/components/invoice-form/sections/invoice-items.tsx @@ -114,14 +114,14 @@ export const InvoiceItems = memo(function InvoiceItems({ type="button" onClick={() => { const canDelete = window.confirm( - `Are you sure you want to delete invoice item #${index + 1}?` + `Are you sure you want to delete invoice item #${index + 1}?`, ); if (canDelete) { handleRemoveItem(index); } }} - className="flex items-center justify-center rounded-full bg-red-600 p-2 transition-colors hover:bg-red-700" + className="flex items-center justify-center rounded-full bg-red-600 p-2 transition-colors hover:bg-red-700 active:scale-[98%] active:transition-transform" > Delete Invoice Item {index + 1} diff --git a/src/app/(app)/components/invoice-pdf-download-link.tsx b/src/app/(app)/components/invoice-pdf-download-link.tsx index fac34be..393db28 100644 --- a/src/app/(app)/components/invoice-pdf-download-link.tsx +++ b/src/app/(app)/components/invoice-pdf-download-link.tsx @@ -123,7 +123,7 @@ export function InvoicePDFDownloadLink({ if (!pdfLoading) { const timer = setTimeout( () => setIsLoading(false), - LOADING_BUTTON_TIMEOUT + LOADING_BUTTON_TIMEOUT, ); return () => clearTimeout(timer); } @@ -155,13 +155,13 @@ export function InvoicePDFDownloadLink({ onClick={handleClick} className={cn( "h-[36px] w-full rounded-lg bg-slate-900 px-4 py-2 text-center text-sm font-medium text-slate-50", - "shadow-sm shadow-black/5 outline-offset-2 hover:bg-slate-900/90", + "shadow-sm shadow-black/5 outline-offset-2 hover:bg-slate-900/90 active:scale-[98%] active:transition-transform", "focus-visible:border-indigo-500 focus-visible:ring focus-visible:ring-indigo-200 focus-visible:ring-opacity-50", "dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/90 lg:mb-0 lg:w-[210px]", { "pointer-events-none opacity-70": isLoading, "lg:w-[240px]": invoiceData.language === "pt", - } + }, )} > diff --git a/src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx b/src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx index 42409d5..727f6e6 100644 --- a/src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx +++ b/src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx @@ -46,7 +46,7 @@ export function InvoicePDFDownloadMultipleLanguages({ }, [language]); const generateAndZipPDFs = async ( - selectedLanguages: SupportedLanguages[] + selectedLanguages: SupportedLanguages[], ) => { try { // Generate PDF documents for each selected language @@ -83,7 +83,7 @@ export function InvoicePDFDownloadMultipleLanguages({ selectedLanguages.forEach((lang, index) => { zip.file( `invoice-${lang}-${invoiceNumberFormatted}.pdf`, - pdfBlobs[index] + pdfBlobs[index], ); }); diff --git a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-due-amount.tsx b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-due-amount.tsx index 30634c6..4ffc5b3 100644 --- a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-due-amount.tsx +++ b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-due-amount.tsx @@ -30,7 +30,7 @@ export function StripeDueAmount({ dayjs.locale(language); const paymentDueDate = dayjs(invoiceData.paymentDue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); // Check if payOnlineUrl is provided and valid diff --git a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-footer.tsx b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-footer.tsx index dad9c46..0b4c627 100644 --- a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-footer.tsx +++ b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-footer.tsx @@ -22,7 +22,7 @@ export function StripeFooter({ const invoiceNumber = `${invoiceNumberValue}`; const paymentDueDate = dayjs(invoiceData.paymentDue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); return ( diff --git a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-invoice-info.tsx b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-invoice-info.tsx index b2b0d14..74cf488 100644 --- a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-invoice-info.tsx +++ b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-invoice-info.tsx @@ -16,13 +16,13 @@ export function StripeInvoiceInfo({ const t = TRANSLATIONS[language]; const dateOfIssue = dayjs(invoiceData.dateOfIssue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); const invoiceNumberValue = invoiceData?.invoiceNumberObject?.value; const paymentDueDate = dayjs(invoiceData.paymentDue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); // for better readability, we need to adjust the column width based on the language diff --git a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-items-table.tsx b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-items-table.tsx index c025a2e..09bd809 100644 --- a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-items-table.tsx +++ b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-items-table.tsx @@ -31,7 +31,7 @@ export function StripeItemsTable({ // Check if any items have numeric VAT values (not "NP" or "OO") const hasNumericVat = invoiceData.items.some( - (item) => typeof item.vat === "number" + (item) => typeof item.vat === "number", ); // Calculate service period (example: Jan 01 2025 - Jan 31 2025) @@ -40,7 +40,7 @@ export function StripeItemsTable({ .format(invoiceData.dateFormat); const servicePeriodEnd = dayjs(invoiceData.dateOfService).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); const vatAmountFieldIsVisible = invoiceData.items[0].vatFieldIsVisible; diff --git a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-totals.tsx b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-totals.tsx index 088745f..e0df6f2 100644 --- a/src/app/(app)/components/invoice-pdf-stripe-template/stripe-totals.tsx +++ b/src/app/(app)/components/invoice-pdf-stripe-template/stripe-totals.tsx @@ -19,7 +19,7 @@ export function StripeTotals({ // Calculate subtotal (sum of all items) const subtotal = invoiceData.items.reduce( (sum, item) => sum + item.netAmount, - 0 + 0, ); const formattedSubtotal = formatCurrency({ amount: subtotal, @@ -35,7 +35,7 @@ export function StripeTotals({ // Check if any items have numeric VAT values (not "NP" or "OO") const hasNumericVat = invoiceData.items.some( - (item) => typeof item.vat === "number" + (item) => typeof item.vat === "number", ); return ( diff --git a/src/app/(app)/components/invoice-pdf-template/invoice-footer.tsx b/src/app/(app)/components/invoice-pdf-template/invoice-footer.tsx index d44dc22..85f13bf 100644 --- a/src/app/(app)/components/invoice-pdf-template/invoice-footer.tsx +++ b/src/app/(app)/components/invoice-pdf-template/invoice-footer.tsx @@ -19,7 +19,7 @@ export function InvoiceFooter({ const invoiceNumberValue = invoiceData?.invoiceNumberObject?.value; const paymentDueDate = dayjs(invoiceData.paymentDue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); const invoiceTotal = invoiceData?.total; diff --git a/src/app/(app)/components/invoice-pdf-template/invoice-header.tsx b/src/app/(app)/components/invoice-pdf-template/invoice-header.tsx index 74432bc..4230734 100644 --- a/src/app/(app)/components/invoice-pdf-template/invoice-header.tsx +++ b/src/app/(app)/components/invoice-pdf-template/invoice-header.tsx @@ -16,10 +16,10 @@ export function InvoiceHeader({ const t = TRANSLATIONS[language]; const dateOfIssue = dayjs(invoiceData.dateOfIssue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); const dateOfService = dayjs(invoiceData.dateOfService).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); const invoiceNumberLabel = invoiceData?.invoiceNumberObject?.label; diff --git a/src/app/(app)/components/invoice-pdf-template/invoice-payment-info.tsx b/src/app/(app)/components/invoice-pdf-template/invoice-payment-info.tsx index a7b920d..7d60e66 100644 --- a/src/app/(app)/components/invoice-pdf-template/invoice-payment-info.tsx +++ b/src/app/(app)/components/invoice-pdf-template/invoice-payment-info.tsx @@ -16,7 +16,7 @@ export function InvoicePaymentInfo({ const t = TRANSLATIONS[language]; const paymentDate = dayjs(invoiceData.paymentDue).format( - invoiceData.dateFormat + invoiceData.dateFormat, ); const paymentMethodIsVisible = invoiceData.paymentMethodFieldIsVisible; diff --git a/src/app/(app)/components/invoice-pdf-template/invoice-vat-summary-table.tsx b/src/app/(app)/components/invoice-pdf-template/invoice-vat-summary-table.tsx index 8bf7e5b..aba7136 100644 --- a/src/app/(app)/components/invoice-pdf-template/invoice-vat-summary-table.tsx +++ b/src/app/(app)/components/invoice-pdf-template/invoice-vat-summary-table.tsx @@ -35,7 +35,7 @@ export function InvoiceVATSummaryTable({ const totalNetAmount = sortedItems.reduce( (acc, item) => acc + item.netAmount, - 0 + 0, ); const formattedTotalNetAmount = totalNetAmount .toLocaleString("en-US", { @@ -46,7 +46,7 @@ export function InvoiceVATSummaryTable({ const totalVATAmount = sortedItems.reduce( (acc, item) => acc + item.vatAmount, - 0 + 0, ); const formattedTotalVATAmount = totalVATAmount .toLocaleString("en-US", { diff --git a/src/app/(app)/error.tsx b/src/app/(app)/error.tsx index 1d87675..aedb888 100644 --- a/src/app/(app)/error.tsx +++ b/src/app/(app)/error.tsx @@ -24,7 +24,7 @@ export default function Error({ { closeButton: true, richColors: true, - } + }, ); }, [error]); @@ -60,7 +60,7 @@ export default function Error({ // Clear the invoice data and start from scratch localStorage.setItem( PDF_DATA_LOCAL_STORAGE_KEY, - JSON.stringify(INITIAL_INVOICE_DATA) + JSON.stringify(INITIAL_INVOICE_DATA), ); // Attempt to recover by trying to re-render the segment diff --git a/src/app/(app)/page.client.tsx b/src/app/(app)/page.client.tsx index 96b8938..a27a59b 100644 --- a/src/app/(app)/page.client.tsx +++ b/src/app/(app)/page.client.tsx @@ -4,11 +4,9 @@ import { INITIAL_INVOICE_DATA } from "@/app/constants"; import { invoiceSchema, PDF_DATA_LOCAL_STORAGE_KEY, - SUPPORTED_LANGUAGES, + SUPPORTED_TEMPLATES, type InvoiceData, } from "@/app/schema"; -import { TRANSLATIONS } from "@/app/schema/translations"; -import { GithubIcon } from "@/components/etc/github-logo"; import { ProjectLogo } from "@/components/etc/project-logo"; import { Button } from "@/components/ui/button"; import { @@ -24,6 +22,7 @@ import Link from "next/link"; import { useRouter } from "next/navigation"; import { Footer } from "@/components/footer"; +import { GitHubStarCTA } from "@/components/github-star-cta"; import { ProjectLogoDescription } from "@/components/project-logo-description"; import { GITHUB_URL, VIDEO_DEMO_URL } from "@/config"; import { isLocalStorageAvailable } from "@/lib/check-local-storage"; @@ -35,8 +34,13 @@ import { compressToEncodedURIComponent, decompressFromEncodedURIComponent, } from "lz-string"; +import { + compressInvoiceData, + decompressInvoiceData, +} from "@/utils/url-compression"; +import dynamic from "next/dynamic"; import { useSearchParams } from "next/navigation"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { toast } from "sonner"; import { z } from "zod"; import { InvoiceClientPage } from "./components"; @@ -45,73 +49,35 @@ import { customPremiumToast, } from "./components/cta-toasts"; import { InvoicePDFDownloadLink } from "./components/invoice-pdf-download-link"; +import { handleInvoiceNumberBreakingChange } from "./utils/invoice-number-breaking-change"; +// import { DevLocalStorageView } from "./components/dev/dev-local-storage-view"; // import { InvoicePDFDownloadMultipleLanguages } from "./components/invoice-pdf-download-multiple-languages"; -/** - * This function handles the breaking change of the invoice number field. - * It removes the old "invoiceNumber" field and adds the new "invoiceNumberObject" field with label and value. - * @param json - The JSON object to handle the breaking change. - * @returns The updated JSON object. - */ -function handleInvoiceNumberBreakingChange(json: unknown) { - // check if the invoice number is in the json - if ( - typeof json === "object" && - json !== null && - "invoiceNumber" in json && - typeof json.invoiceNumber === "string" && - "language" in json - ) { - umamiTrackEvent("breaking_change_detected"); - - let lang: keyof typeof TRANSLATIONS; - - const invoiceLanguage = z - .enum(SUPPORTED_LANGUAGES) - .safeParse(json.language); - - if (!invoiceLanguage.success) { - console.error("Invalid invoice language:", invoiceLanguage.error); - - // fallback to default language - lang = SUPPORTED_LANGUAGES[0]; - } else { - lang = invoiceLanguage.data; - } - - const invoiceNumberLabel = TRANSLATIONS[lang].invoiceNumber; - - // Create new object without invoiceNumber and with invoiceNumberObject - const newJson = { - ...json, - // assign invoiceNumber to invoiceNumberObject.value - invoiceNumberObject: { - label: `${invoiceNumberLabel}:`, - value: json.invoiceNumber, - }, - }; - - // remove deprecated invoiceNumber from json - delete (newJson as Record).invoiceNumber; - - // update json - json = newJson; - - return json; - } - - return json; -} +const DevLocalStorageView = dynamic( + () => + import("./components/dev/dev-local-storage-view").then( + (mod) => mod.DevLocalStorageView, + ), + { ssr: false }, +); export function AppPageClient() { const router = useRouter(); const searchParams = useSearchParams(); + const urlTemplateSearchParam = searchParams.get("template"); + + // Validate template parameter with zod + const templateValidation = z + .enum(SUPPORTED_TEMPLATES) + .default("default") + .safeParse(urlTemplateSearchParam); + const { isDesktop } = useDeviceContext(); const isMobile = !isDesktop; const [invoiceDataState, setInvoiceDataState] = useState( - null + null, ); const [errorWhileGeneratingPdfIsShown, setErrorWhileGeneratingPdfIsShown] = @@ -119,6 +85,55 @@ export function AppPageClient() { const [canShareInvoice, setCanShareInvoice] = useState(true); + // Helper function to load from localStorage + const loadFromLocalStorage = useCallback(() => { + try { + const savedData = localStorage.getItem(PDF_DATA_LOCAL_STORAGE_KEY); + + if (savedData) { + const json: unknown = JSON.parse(savedData); + + // this should happen before parsing the data with zod + const updatedJson = handleInvoiceNumberBreakingChange(json); + + const parsedData = invoiceSchema.parse(updatedJson); + + // if template is in url, use it + if (templateValidation.success) { + parsedData.template = templateValidation.data; + } + + setInvoiceDataState(parsedData); + } else { + if (templateValidation.success) { + // if no data in local storage and template is in url, set initial data with template from url + setInvoiceDataState({ + ...INITIAL_INVOICE_DATA, + template: templateValidation.data, + }); + } else { + // if no data in local storage, set initial data + setInvoiceDataState(INITIAL_INVOICE_DATA); + } + } + } catch (error) { + console.error("Failed to load saved invoice data:", error); + + setInvoiceDataState(INITIAL_INVOICE_DATA); + + toast.error( + "Unable to load your saved invoice data. For your convenience, we've reset the form to default values. Please try creating a new invoice.", + { + duration: 20000, + closeButton: true, + richColors: true, + }, + ); + + Sentry.captureException(error); + } + }, [templateValidation.data, templateValidation.success]); + // Scroll to top on mount useEffect(() => { window.scrollTo({ top: 0, behavior: "smooth" }); @@ -127,20 +142,37 @@ export function AppPageClient() { // Initialize data from URL or localStorage on mount useEffect(() => { const compressedInvoiceDataInUrl = searchParams.get("data"); + const urlTemplateSearchParam = searchParams.get("template"); + + // Validate template parameter with zod + const templateValidation = z + .enum(SUPPORTED_TEMPLATES) + .default("default") + .safeParse(urlTemplateSearchParam); // first try to load from url if (compressedInvoiceDataInUrl) { try { const decompressed = decompressFromEncodedURIComponent( - compressedInvoiceDataInUrl + compressedInvoiceDataInUrl, ); + const parsedJSON: unknown = JSON.parse(decompressed); + // Restore original keys from compressed format, we store keys in compressed format to reduce URL size i.e. {name: "John Doe"} -> {n: "John Doe"} + const decompressedKeys = decompressInvoiceData( + parsedJSON as Record, + ); + // this should happen before parsing the data with zod - const updatedJson = handleInvoiceNumberBreakingChange(parsedJSON); + const updatedJson = handleInvoiceNumberBreakingChange(decompressedKeys); const validated = invoiceSchema.parse(updatedJson); + if (templateValidation.success) { + validated.template = templateValidation.data; + } + setInvoiceDataState(validated); } catch (error) { // fallback to local storage @@ -153,42 +185,7 @@ export function AppPageClient() { // if no data in url, load from local storage loadFromLocalStorage(); } - }, [searchParams]); - - // Helper function to load from localStorage - const loadFromLocalStorage = () => { - try { - const savedData = localStorage.getItem(PDF_DATA_LOCAL_STORAGE_KEY); - if (savedData) { - const json: unknown = JSON.parse(savedData); - - // this should happen before parsing the data with zod - const updatedJson = handleInvoiceNumberBreakingChange(json); - - const parsedData = invoiceSchema.parse(updatedJson); - - setInvoiceDataState(parsedData); - } else { - // if no data in local storage, set initial data - setInvoiceDataState(INITIAL_INVOICE_DATA); - } - } catch (error) { - console.error("Failed to load saved invoice data:", error); - - setInvoiceDataState(INITIAL_INVOICE_DATA); - - toast.error( - "Unable to load your saved invoice data. For your convenience, we've reset the form to default values. Please try creating a new invoice.", - { - duration: 20000, - closeButton: true, - richColors: true, - } - ); - - Sentry.captureException(error); - } - }; + }, [loadFromLocalStorage, searchParams]); // Save to localStorage whenever data changes on form update useEffect(() => { @@ -199,18 +196,30 @@ export function AppPageClient() { localStorage.setItem( PDF_DATA_LOCAL_STORAGE_KEY, - JSON.stringify(newInvoiceDataValidated) + JSON.stringify(newInvoiceDataValidated), ); - // Check if URL has data and current data is different + // Update template in search params if it exists + + const newSearchParams = new URLSearchParams(searchParams); + newSearchParams.set("template", newInvoiceDataValidated.template); + router.replace(`/?${newSearchParams.toString()}`); + + // Check if URL has data i.e. if user has shared invoice link const urlData = searchParams.get("data"); if (urlData) { try { const decompressed = decompressFromEncodedURIComponent(urlData); + const urlParsed: unknown = JSON.parse(decompressed); - const urlValidated = invoiceSchema.parse(urlParsed); + // Restore original keys from compressed format + const decompressedKeys = decompressInvoiceData( + urlParsed as Record, + ); + + const urlValidated = invoiceSchema.parse(decompressedKeys); if ( JSON.stringify(urlValidated) !== @@ -232,7 +241,7 @@ export function AppPageClient() { duration: 10000, closeButton: true, richColors: true, - } + }, ); // Clean URL if data differs @@ -241,7 +250,9 @@ export function AppPageClient() { } catch (error) { console.error("Failed to compare with URL data:", error); + // TODO: move to 'Initialize data from URL or localStorage on mount' useEffect? toast.error("The shared invoice URL appears to be incorrect", { + id: "invalid-invoice-url-error-toast", // prevent duplicate toasts description: (

    @@ -252,7 +263,7 @@ export function AppPageClient() { _variant="outline" _size="sm" onClick={() => { - router.replace("/"); + router.replace("/?template=default"); toast.dismiss(); }} > @@ -302,8 +313,8 @@ export function AppPageClient() { } }; - // Show cta toast after 40 seconds on the app page - const initialTimer = setTimeout(showCTAToast, 40_000); + // Show cta toast after 50 seconds on the app page + const initialTimer = setTimeout(showCTAToast, 50_000); return () => { clearTimeout(initialTimer); @@ -335,11 +346,16 @@ export function AppPageClient() { if (invoiceDataState) { try { const newInvoiceDataValidated = invoiceSchema.parse(invoiceDataState); - const stringified = JSON.stringify(newInvoiceDataValidated); - const compressedData = compressToEncodedURIComponent(stringified); + + // Compress JSON keys before stringifying to reduce URL size + const compressedKeys = compressInvoiceData(newInvoiceDataValidated); + const compressedJson = JSON.stringify(compressedKeys); + + const compressedData = compressToEncodedURIComponent(compressedJson); // Check if the compressed data length exceeds browser URL limits // Most browsers have a limit around 2000 characters for URLs + // With key compression, we can fit much larger invoices within this limit const URL_LENGTH_LIMIT = 2000; const estimatedUrlLength = window.location.origin.length + 7 + compressedData.length; // 7 for "/?data=" @@ -351,14 +367,19 @@ export function AppPageClient() { return; } - router.push(`/?data=${compressedData}`); + router.push( + `/?template=${newInvoiceDataValidated.template}&data=${compressedData}`, + ); // Construct full URL with locale and compressed data - const newFullUrl = `${window.location.origin}/?data=${compressedData}`; + const newFullUrl = `${window.location.origin}/?template=${newInvoiceDataValidated.template}&data=${compressedData}`; // Copy to clipboard await navigator.clipboard.writeText(newFullUrl); + // Dismiss any existing toast before showing new one + toast.dismiss(); + toast.success("Invoice link copied to clipboard!", { description: "Share this link to let others view and edit this invoice", @@ -382,6 +403,10 @@ export function AppPageClient() { return ( + {process.env.NEXT_PUBLIC_DEBUG_LOCAL_STORAGE_UI === "true" && ( + + )} +

    @@ -398,7 +423,7 @@ export function AppPageClient() {
    {" | "} Share your feedback - {" | "} - diff --git a/src/app/(app)/page.tsx b/src/app/(app)/page.tsx index 6cd7436..4cc6904 100644 --- a/src/app/(app)/page.tsx +++ b/src/app/(app)/page.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import { AppPageClient } from "./page.client"; +import { STATIC_ASSETS_URL } from "@/config"; // we generate metadata here, because we need access to searchParams (in layout we don't have it) export async function generateMetadata({ @@ -8,7 +9,12 @@ export async function generateMetadata({ searchParams: { [key: string]: string | string[] | undefined }; }): Promise { const hasShareableData = Boolean(searchParams?.data); - const isProd = process.env.VERCEL_ENV === "production"; + const isStripeTemplate = Boolean(searchParams?.template === "stripe"); + + const isProd = + process.env.VERCEL_ENV === "production" && + `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` === + "https://easyinvoicepdf.com"; const defaultRobotsConfig = { index: false, @@ -36,6 +42,22 @@ export async function generateMetadata({ alternates: { canonical: "/", }, + ...(isStripeTemplate && { + openGraph: { + title: "Stripe Invoice Template | Free Invoice Generator", + description: + "Create and download professional invoices instantly with EasyInvoicePDF.com. Free and open-source. No signup required.", + siteName: "EasyInvoicePDF.com | Free Invoice Generator", + images: [ + { + url: `${STATIC_ASSETS_URL}/stripe-og.png`, + width: 1200, + height: 630, + alt: "Stripe Invoice Template", + }, + ], + }, + }), }; } diff --git a/src/app/(app)/utils/__tests__/invoice-number-breaking-change.test.ts b/src/app/(app)/utils/__tests__/invoice-number-breaking-change.test.ts new file mode 100644 index 0000000..4a60a35 --- /dev/null +++ b/src/app/(app)/utils/__tests__/invoice-number-breaking-change.test.ts @@ -0,0 +1,372 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { handleInvoiceNumberBreakingChange } from "../invoice-number-breaking-change"; +import { SUPPORTED_LANGUAGES, type InvoiceData } from "@/app/schema"; +import { TRANSLATIONS } from "@/app/schema/translations"; + +// Mock the umami tracking function +vi.mock("@/lib/umami-analytics-track-event", () => ({ + umamiTrackEvent: vi.fn(), +})); + +import { umamiTrackEvent } from "@/lib/umami-analytics-track-event"; + +describe("handleInvoiceNumberBreakingChange", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe("valid input scenarios", () => { + it("should transform invoiceNumber to invoiceNumberObject with English language", () => { + const input = { + invoiceNumber: "INV-2024-001", + language: "en", + otherField: "preserved", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toEqual({ + language: "en", + otherField: "preserved", + invoiceNumberObject: { + label: `${TRANSLATIONS.en.invoiceNumber}:`, + value: "INV-2024-001", + }, + }); + + // Should not contain the old invoiceNumber field + expect(result).not.toHaveProperty("invoiceNumber"); + + // Should track the breaking change event + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + expect(umamiTrackEvent).toHaveBeenCalledTimes(1); + }); + + it("should transform invoiceNumber with Polish language", () => { + const input = { + invoiceNumber: "FAKT-001", + language: "pl", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toEqual({ + language: "pl", + invoiceNumberObject: { + label: `${TRANSLATIONS.pl.invoiceNumber}:`, + value: "FAKT-001", + }, + }); + + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + }); + + it("should transform invoiceNumber with German language", () => { + const input = { + invoiceNumber: "RG-2024-001", + language: "de", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toEqual({ + language: "de", + invoiceNumberObject: { + label: `${TRANSLATIONS.de.invoiceNumber}:`, + value: "RG-2024-001", + }, + }); + + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + }); + + it("should preserve all other fields when transforming", () => { + const input = { + invoiceNumber: "123", + language: "en", + dateOfIssue: "2024-01-15", + seller: { name: "ACME Corp" }, + buyer: { name: "Client Ltd" }, + items: [{ name: "Product A", amount: 1 }], + total: 100, + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toEqual({ + language: "en", + dateOfIssue: "2024-01-15", + seller: { name: "ACME Corp" }, + buyer: { name: "Client Ltd" }, + items: [{ name: "Product A", amount: 1 }], + total: 100, + invoiceNumberObject: { + label: `${TRANSLATIONS.en.invoiceNumber}:`, + value: "123", + }, + }); + }); + }); + + describe("invalid language scenarios", () => { + it("should fallback to default language when language is invalid", () => { + const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { + // do nothing + }); + + const input = { + invoiceNumber: "INV-001", + language: "invalid-lang", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + const defaultLanguage = SUPPORTED_LANGUAGES[0]; + expect(result).toEqual({ + language: "invalid-lang", + invoiceNumberObject: { + label: `${TRANSLATIONS[defaultLanguage].invoiceNumber}:`, + value: "INV-001", + }, + }); + + // Should log error for invalid language + expect(consoleSpy).toHaveBeenCalledWith( + "Invalid invoice language:", + expect.any(Object), + ); + + // Should still track the breaking change event + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + + consoleSpy.mockRestore(); + }); + + it("should fallback to default language when language is not a string", () => { + const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { + // do nothing + }); + + const input = { + invoiceNumber: "INV-001", + language: 123, + }; + + const result = handleInvoiceNumberBreakingChange(input); + + const defaultLanguage = SUPPORTED_LANGUAGES[0]; + expect(result).toEqual({ + language: 123, + invoiceNumberObject: { + label: `${TRANSLATIONS[defaultLanguage].invoiceNumber}:`, + value: "INV-001", + }, + }); + + expect(consoleSpy).toHaveBeenCalled(); + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + + consoleSpy.mockRestore(); + }); + }); + + describe("no transformation scenarios", () => { + it("should return unchanged when invoiceNumber field is missing", () => { + const input = { + language: "en", + dateOfIssue: "2024-01-15", + seller: { name: "ACME Corp" }, + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toBe(input); + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + + it("should return unchanged when language field is missing", () => { + const input = { + invoiceNumber: "INV-001", + dateOfIssue: "2024-01-15", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toBe(input); + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + + it("should return unchanged when invoiceNumber is not a string", () => { + const input = { + invoiceNumber: 123, + language: "en", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toBe(input); + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + + it("should transform even when invoiceNumber is empty string", () => { + const input = { + invoiceNumber: "", + language: "en", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toEqual({ + language: "en", + invoiceNumberObject: { + label: `${TRANSLATIONS.en.invoiceNumber}:`, + value: "", + }, + }); + + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + }); + + it("should return unchanged when input is null", () => { + const result = handleInvoiceNumberBreakingChange(null); + + expect(result).toBe(null); + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + + it("should return unchanged when input is undefined", () => { + const result = handleInvoiceNumberBreakingChange(undefined); + + expect(result).toBe(undefined); + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + + it("should return unchanged when input is not an object", () => { + const stringInput = "test"; + const numberInput = 42; + const booleanInput = true; + + expect(handleInvoiceNumberBreakingChange(stringInput)).toBe(stringInput); + expect(handleInvoiceNumberBreakingChange(numberInput)).toBe(numberInput); + expect(handleInvoiceNumberBreakingChange(booleanInput)).toBe( + booleanInput, + ); + + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + + it("should return unchanged when input is an array", () => { + const arrayInput = [1, 2, 3]; + const result = handleInvoiceNumberBreakingChange(arrayInput); + + expect(result).toBe(arrayInput); + expect(umamiTrackEvent).not.toHaveBeenCalled(); + }); + }); + + describe("edge cases", () => { + it("should handle input with existing invoiceNumberObject field", () => { + const input = { + invoiceNumber: "OLD-001", + language: "en", + invoiceNumberObject: { + label: "Existing Label:", + value: "Existing Value", + }, + } as unknown as InvoiceData; + + const result = handleInvoiceNumberBreakingChange(input); + + // Should overwrite the existing invoiceNumberObject + expect(result).toEqual({ + language: "en", + invoiceNumberObject: { + label: `${TRANSLATIONS.en.invoiceNumber}:`, + value: "OLD-001", + }, + }); + + expect(umamiTrackEvent).toHaveBeenCalledWith("breaking_change_detected"); + }); + + it("should handle all supported languages correctly", () => { + SUPPORTED_LANGUAGES.forEach((lang) => { + const input = { + invoiceNumber: `INV-${lang}`, + language: lang, + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(result).toEqual({ + language: lang, + invoiceNumberObject: { + label: `${TRANSLATIONS[lang].invoiceNumber}:`, + value: `INV-${lang}`, + }, + }); + }); + + // Should track one event per language + expect(umamiTrackEvent).toHaveBeenCalledTimes(SUPPORTED_LANGUAGES.length); + }); + + it("should handle special characters in invoiceNumber", () => { + const input = { + invoiceNumber: "INV/2024\\001-#@!", + language: "en", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect((result as InvoiceData).invoiceNumberObject?.value).toBe( + "INV/2024\\001-#@!", + ); + }); + + it("should handle very long invoiceNumber", () => { + const longInvoiceNumber = "A".repeat(1000); + const input = { + invoiceNumber: longInvoiceNumber, + language: "en", + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect((result as InvoiceData).invoiceNumberObject?.value).toBe( + longInvoiceNumber, + ); + }); + }); + + describe("type safety", () => { + it("should maintain proper typing after transformation", () => { + const input = { + invoiceNumber: "INV-001", + language: "en" as const, + numericField: 42, + booleanField: true, + arrayField: [1, 2, 3], + objectField: { nested: "value" }, + }; + + const result = handleInvoiceNumberBreakingChange(input); + + expect(typeof result).toBe("object"); + expect(result).not.toBe(null); + + if (typeof result === "object" && result !== null) { + expect("invoiceNumberObject" in result).toBe(true); + expect("invoiceNumber" in result).toBe(false); + + if ("invoiceNumberObject" in result) { + const invoiceNumberObject = (result as unknown as InvoiceData) + .invoiceNumberObject; + + expect(typeof invoiceNumberObject?.label).toBe("string"); + expect(typeof invoiceNumberObject?.value).toBe("string"); + } + } + }); + }); +}); diff --git a/src/app/(app)/utils/invoice-number-breaking-change.ts b/src/app/(app)/utils/invoice-number-breaking-change.ts new file mode 100644 index 0000000..f957b53 --- /dev/null +++ b/src/app/(app)/utils/invoice-number-breaking-change.ts @@ -0,0 +1,66 @@ +import { SUPPORTED_LANGUAGES } from "@/app/schema"; +import { TRANSLATIONS } from "@/app/schema/translations"; + +import { umamiTrackEvent } from "@/lib/umami-analytics-track-event"; +import { z } from "zod"; + +/** + * This function handles the breaking change of the invoice number field. + * It removes the old "invoiceNumber" field and adds the new "invoiceNumberObject" field with label and value. + * + * @example + * ```typescript + * const json = { invoiceNumber: "123", language: "en" }; + * const updatedJson = handleInvoiceNumberBreakingChange(json); + * // Returns: { invoiceNumberObject: { label: "Invoice Number:", value: "123" } + * ``` + */ +export function handleInvoiceNumberBreakingChange(json: unknown) { + // check if the invoice number is in the json + if ( + typeof json === "object" && + json !== null && + "invoiceNumber" in json && + typeof json.invoiceNumber === "string" && + "language" in json + ) { + umamiTrackEvent("breaking_change_detected"); + + let lang: keyof typeof TRANSLATIONS; + + const invoiceLanguage = z + .enum(SUPPORTED_LANGUAGES) + .safeParse(json.language); + + if (!invoiceLanguage.success) { + console.error("Invalid invoice language:", invoiceLanguage.error); + + // fallback to default language + lang = SUPPORTED_LANGUAGES[0]; + } else { + lang = invoiceLanguage.data; + } + + const invoiceNumberLabel = TRANSLATIONS[lang].invoiceNumber; + + // Create new object without invoiceNumber and with invoiceNumberObject + const newJson = { + ...json, + // assign invoiceNumber to invoiceNumberObject.value + invoiceNumberObject: { + label: `${invoiceNumberLabel}:`, + value: json.invoiceNumber, + }, + }; + + // remove deprecated invoiceNumber from json + delete (newJson as Record).invoiceNumber; + + // update json + json = newJson; + + return json; + } + + return json; +} diff --git a/src/app/[locale]/about/components/language-switcher.tsx b/src/app/[locale]/about/components/language-switcher.tsx index bca14bf..58ec8d2 100644 --- a/src/app/[locale]/about/components/language-switcher.tsx +++ b/src/app/[locale]/about/components/language-switcher.tsx @@ -85,7 +85,7 @@ export function LanguageSwitcher({ startTransition(() => { const pathnameWithoutLocale = pathname.replace( `/${locale}`, - "" + "", ); router.push(pathnameWithoutLocale || "/", { diff --git a/src/app/[locale]/about/page.tsx b/src/app/[locale]/about/page.tsx index 440d2b2..5b0229b 100644 --- a/src/app/[locale]/about/page.tsx +++ b/src/app/[locale]/about/page.tsx @@ -373,7 +373,7 @@ function FeaturesSection() { {FEATURES_CARDS.map((feature) => { const title = t(`features.items.${feature.translationKey}.title`); const description = t( - `features.items.${feature.translationKey}.description` + `features.items.${feature.translationKey}.description`, ); return ( diff --git a/src/app/[locale]/error.tsx b/src/app/[locale]/error.tsx index 3aa21e5..0812a6e 100644 --- a/src/app/[locale]/error.tsx +++ b/src/app/[locale]/error.tsx @@ -21,7 +21,7 @@ export default function Error({ error, reset }: Props) { { closeButton: true, richColors: true, - } + }, ); }, [error]); diff --git a/src/app/api/generate-invoice/route.tsx b/src/app/api/generate-invoice/route.tsx index e3ece41..3f1d7d4 100644 --- a/src/app/api/generate-invoice/route.tsx +++ b/src/app/api/generate-invoice/route.tsx @@ -23,6 +23,7 @@ import { import { env } from "@/env"; import { ipLimiter } from "@/lib/rate-limit"; +import { compressInvoiceData } from "@/utils/url-compression"; export const dynamic = "force-dynamic"; @@ -53,18 +54,18 @@ export async function GET(req: NextRequest) { headers: { "Content-Type": "application/json", }, - } + }, ); } const GENERATED_ENGLISH_INVOICE_PDF_DOCUMENT = renderToBuffer( + />, ).catch((err) => { console.error( "\n\n_________________________Error during `renderToBuffer` for English invoice:", - err + err, ); throw err; @@ -73,11 +74,11 @@ export async function GET(req: NextRequest) { const GENERATED_POLISH_INVOICE_PDF_DOCUMENT = renderToBuffer( + />, ).catch((err) => { console.error( "\n\n_________________________Error during `renderToBuffer` for Polish invoice:", - err + err, ); throw err; @@ -96,7 +97,7 @@ export async function GET(req: NextRequest) { ]).catch((err) => { console.error( "\n\n_________________________Error during `Promise.allSettled`:", - err + err, ); })) || []; @@ -111,7 +112,7 @@ export async function GET(req: NextRequest) { } else if (invoice.status === "rejected") { console.error( "\n\n_________________________Error in generate-invoice route:", - invoice?.reason || "Unknown error" + invoice?.reason || "Unknown error", ); } } @@ -134,17 +135,21 @@ export async function GET(req: NextRequest) { if (!ATTACHMENTS.length) { return NextResponse.json( { error: "No attachments found" }, - { status: 400 } + { status: 400 }, ); } const newInvoiceDataValidated = invoiceSchema.parse( - ENGLISH_INVOICE_REAL_DATA + ENGLISH_INVOICE_REAL_DATA, ); - const stringified = JSON.stringify(newInvoiceDataValidated); - const compressedData = compressToEncodedURIComponent(stringified); - const invoiceUrl = `https://easyinvoicepdf.com/?data=${compressedData}`; + // Compress JSON keys before stringifying to reduce URL size + const compressedKeys = compressInvoiceData(newInvoiceDataValidated); + const compressedJson = JSON.stringify(compressedKeys); + + const compressedData = compressToEncodedURIComponent(compressedJson); + + const invoiceUrl = `https://easyinvoicepdf.com/?template=${newInvoiceDataValidated.template}&data=${compressedData}`; const monthAndYear = dayjs().format("MMMM YYYY"); @@ -173,27 +178,31 @@ export async function GET(req: NextRequest) { fileName: attachment.filename, fileContent: Buffer.from(attachment.content), folderId: folderToUploadInvoices.id, - }) + }), ); const uploadResults = await Promise.allSettled(uploadPromises); const failedUploads = uploadResults.filter( - (result): result is PromiseRejectedResult => result.status === "rejected" + (result): result is PromiseRejectedResult => result.status === "rejected", ); if (failedUploads.length > 0) { console.error( "Some files failed to upload to Google Drive:", - failedUploads + failedUploads, ); return NextResponse.json( { error: "Failed to upload invoices to Google Drive" }, - { status: 500 } + { status: 500 }, ); } - const companyEmailLink = `https://outlook.office.com/mail/deeplink/compose?to=${env.INVOICE_EMAIL_COMPANY_TO}&subject=Invoice%20for%20${monthAndYear}&body=Hello%2C%0A%0AInvoice%20for%20${monthAndYear}%20in%20attachments%0A%0AHave%20a%20nice%20day`; + const companyEmailLink = + `https://outlook.office.com/mail/deeplink/compose` + + `?to=${encodeURIComponent(env.INVOICE_EMAIL_COMPANY_TO)}` + + `&subject=${encodeURIComponent(`Invoice for ${monthAndYear}`)}` + + `&body=${encodeURIComponent(`Hello,\nThe invoice for ${monthAndYear} is in the attachment.\n\nHave a nice day.`)}`; // we only need the value of the invoice number e.g. 1/05.2025 const invoiceNumberValue = @@ -258,7 +267,7 @@ EasyInvoicePDF.com`, ]); const failedNotifications = notificationResults.filter( - (result): result is PromiseRejectedResult => result.status === "rejected" + (result): result is PromiseRejectedResult => result.status === "rejected", ); if (failedNotifications.length > 0) { @@ -269,14 +278,14 @@ EasyInvoicePDF.com`, return NextResponse.json( { message: "Invoice sent successfully" }, - { status: 200 } + { status: 200 }, ); } catch (error) { console.error("Error in generate-invoice route:", error); return NextResponse.json( { error: "Failed to generate and send invoice" }, - { status: 500 } + { status: 500 }, ); } } diff --git a/src/app/changelog/[slug]/page.tsx b/src/app/changelog/[slug]/page.tsx index db5b5b5..e2c480f 100644 --- a/src/app/changelog/[slug]/page.tsx +++ b/src/app/changelog/[slug]/page.tsx @@ -173,7 +173,7 @@ export default async function ChangelogEntryPage({ rel="noopener noreferrer" className="transition-all hover:scale-110" href={`https://twitter.com/intent/tweet?text=${encodeURIComponent( - `EasyInvoicePDF: ${entry.metadata.title || `Update ${formattedDate}`}` + `EasyInvoicePDF: ${entry.metadata.title || `Update ${formattedDate}`}`, )}&url=${encodeURIComponent(`${APP_URL}/changelog/${slug}`)}`} > { "src", "app", "changelog", - "content" + "content", ); const files = await readdir(changelogDir); return files.filter((file) => file.endsWith(".mdx")); @@ -69,7 +69,7 @@ async function importChangelogFile(filename: string) { if (error instanceof z.ZodError) { console.error( `Invalid metadata in changelog file ${filename}:`, - error.errors + error.errors, ); return null; } @@ -119,7 +119,7 @@ export async function getChangelogEntries(): Promise { // Sort by date (newest first) return entries.sort( (a, b) => - new Date(b.metadata.date).getTime() - new Date(a.metadata.date).getTime() + new Date(b.metadata.date).getTime() - new Date(a.metadata.date).getTime(), ); } @@ -127,7 +127,7 @@ export async function getChangelogEntries(): Promise { * Gets a specific changelog entry by slug */ export async function getChangelogEntry( - slug: string + slug: string, ): Promise { const files = await getChangelogFiles(); const filename = files.find((file) => filenameToSlug(file) === slug); @@ -172,11 +172,11 @@ export function formatChangelogDate(date: string): string { * Gets the next changelog entry after the current one (based on date order) */ export async function getNextChangelogEntry( - currentSlug: string + currentSlug: string, ): Promise { const allEntries = await getChangelogEntries(); const currentIndex = allEntries.findIndex( - (entry) => entry.slug === currentSlug + (entry) => entry.slug === currentSlug, ); // If current entry is not found or is the first one (newest), return null @@ -192,11 +192,11 @@ export async function getNextChangelogEntry( * Gets the previous changelog entry before the current one (based on date order) */ export async function getPreviousChangelogEntry( - currentSlug: string + currentSlug: string, ): Promise { const allEntries = await getChangelogEntries(); const currentIndex = allEntries.findIndex( - (entry) => entry.slug === currentSlug + (entry) => entry.slug === currentSlug, ); // If current entry is not found or is the last one (oldest), return null diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2a484f8..fb60f24 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,7 +2,6 @@ import { DeviceContextProvider } from "@/contexts/device-context"; import { checkDeviceUserAgent } from "@/lib/check-device.server"; import { NextIntlClientProvider } from "next-intl"; // import { ReactScan } from "@/components/dev/react-scan"; -// import { DevToolbar } from "@/components/dev/stagewise-toolbar"; import { SpeedInsights } from "@vercel/speed-insights/next"; import type { Metadata, Viewport } from "next"; @@ -153,9 +152,6 @@ export default async function RootLayout({ {children} - {/* Stagewise toolbar for development */} - {/* */} - {/* https://sonner.emilkowal.ski/ */} {/* should only be enabled in production */} diff --git a/src/app/robots.ts b/src/app/robots.ts index 04f7118..d4b96cc 100644 --- a/src/app/robots.ts +++ b/src/app/robots.ts @@ -12,10 +12,14 @@ export default function robots(): MetadataRoute.Robots { "/", // Allow about pages in all languages ...SUPPORTED_LANGUAGES.map((locale) => `/${locale}/about`), + // Allow template parameter URLs + "/?template=*", ], disallow: [ // Disallow shared invoice URLs, like /?data=* - "/?data=*", + "/?*data=*", + "/?template=*&data=*", + "/?data=*&template=*", // Disallow subscription confirmation pages with and without tokens "/confirm-subscription", "/confirm-subscription?*", diff --git a/src/app/schema/index.ts b/src/app/schema/index.ts index ef293a0..50b9fe9 100644 --- a/src/app/schema/index.ts +++ b/src/app/schema/index.ts @@ -395,7 +395,7 @@ export const invoiceSchema = z.object({ }, "Logo must be a valid image (JPEG, PNG or WebP) in base64 format") .optional() .describe( - "Stripe template specific field. Logo must be a valid image (JPEG, PNG or WebP) in base64 format" + "Stripe template specific field. Logo must be a valid image (JPEG, PNG or WebP) in base64 format", ), /** @@ -447,7 +447,7 @@ export const invoiceSchema = z.object({ return val; }) .describe( - "Invoice date of service. Default is the last day of the current month" + "Invoice date of service. Default is the last day of the current month", ), invoiceType: z @@ -506,9 +506,9 @@ export const invoiceSchema = z.object({ .url("Please enter a valid URL or leave empty") .refine( (url) => url.startsWith("https://"), - "URL must start with https://" + "URL must start with https://", ), // Validate HTTPS URL format - ]) + ]), ) .optional() .describe("Stripe template specific field. URL field for payment link"), @@ -557,7 +557,7 @@ const uniqueCurrencies = new Set(SUPPORTED_CURRENCIES); if (uniqueCurrencies.size !== SUPPORTED_CURRENCIES.length) { const duplicates = SUPPORTED_CURRENCIES.filter( - (currency, index) => SUPPORTED_CURRENCIES.indexOf(currency) !== index + (currency, index) => SUPPORTED_CURRENCIES.indexOf(currency) !== index, ); const currencyFullNames = duplicates.map((currency) => { @@ -567,8 +567,6 @@ if (uniqueCurrencies.size !== SUPPORTED_CURRENCIES.length) { }); throw new Error( - `SUPPORTED_CURRENCIES contains duplicate entries: ${currencyFullNames.join( - ", " - )}` + `SUPPORTED_CURRENCIES contains duplicate entries: ${currencyFullNames.join(", ")}`, ); } diff --git a/src/app/schema/translations.ts b/src/app/schema/translations.ts index b93a009..9a5f676 100644 --- a/src/app/schema/translations.ts +++ b/src/app/schema/translations.ts @@ -119,7 +119,7 @@ export const translationSchema = z // ...etc // } const languageToSchemaMap = Object.fromEntries( - SUPPORTED_LANGUAGES.map((lang) => [lang, translationSchema]) + SUPPORTED_LANGUAGES.map((lang) => [lang, translationSchema]), ); // Schema for all translations export const translationsSchema = z.object(languageToSchemaMap); diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 0fb5340..245a77d 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -6,7 +6,7 @@ export default function sitemap(): MetadataRoute.Sitemap { const lastModified = new Date(); const languages = Object.fromEntries( - SUPPORTED_LANGUAGES.map((lang) => [lang, `${APP_URL}/${lang}/about`]) + SUPPORTED_LANGUAGES.map((lang) => [lang, `${APP_URL}/${lang}/about`]), ); const sitemapEntries: MetadataRoute.Sitemap = [ diff --git a/src/components/buyer-dialog.tsx b/src/components/buyer-dialog.tsx index f5c1ea1..2cc6aac 100644 --- a/src/components/buyer-dialog.tsx +++ b/src/components/buyer-dialog.tsx @@ -37,7 +37,7 @@ interface BuyerDialogProps { onClose: React.Dispatch>; handleBuyerAdd?: ( buyer: BuyerData, - { shouldApplyNewBuyerToInvoice }: { shouldApplyNewBuyerToInvoice: boolean } + { shouldApplyNewBuyerToInvoice }: { shouldApplyNewBuyerToInvoice: boolean }, ) => void; handleBuyerEdit?: (buyer: BuyerData) => void; initialData: BuyerData | null; @@ -96,7 +96,7 @@ export function BuyerDialog({ vatNoFieldIsVisible: true, notes: "", notesFieldIsVisible: true, - } + }, ); } }, [shouldApplyFormValues, formValues, initialData, isEditMode, form]); @@ -117,7 +117,7 @@ export function BuyerDialog({ if (!existingBuyersValidationResult.success) { console.error( "Invalid existing buyers data:", - existingBuyersValidationResult.error + existingBuyersValidationResult.error, ); // Show error toast @@ -135,7 +135,7 @@ export function BuyerDialog({ // Validate buyer data against existing buyers const isDuplicateName = existingBuyersValidationResult.data.some( (buyer: BuyerData) => - buyer.name === formValues.name && buyer.id !== formValues.id + buyer.name === formValues.name && buyer.id !== formValues.id, ); if (isDuplicateName) { diff --git a/src/components/buyer-management.tsx b/src/components/buyer-management.tsx index 7b139a8..b403d6d 100644 --- a/src/components/buyer-management.tsx +++ b/src/components/buyer-management.tsx @@ -46,7 +46,7 @@ export function BuyerManagement({ const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [buyersSelectOptions, setBuyersSelectOptions] = useState( - [] + [], ); // const [selectedBuyerId, setSelectedBuyerId] = useState(""); const [editingBuyer, setEditingBuyer] = useState(null); @@ -86,7 +86,7 @@ export function BuyerManagement({ // Update buyers when a new one is added const handleBuyerAdd = ( newBuyer: BuyerData, - { shouldApplyNewBuyerToInvoice }: { shouldApplyNewBuyerToInvoice: boolean } + { shouldApplyNewBuyerToInvoice }: { shouldApplyNewBuyerToInvoice: boolean }, ) => { try { const newBuyerWithId = { @@ -130,12 +130,12 @@ export function BuyerManagement({ const handleBuyerEdit = (editedBuyer: BuyerData) => { try { const updatedBuyers = buyersSelectOptions.map((buyer) => - buyer.id === editedBuyer.id ? editedBuyer : buyer + buyer.id === editedBuyer.id ? editedBuyer : buyer, ); localStorage.setItem( BUYERS_LOCAL_STORAGE_KEY, - JSON.stringify(updatedBuyers) + JSON.stringify(updatedBuyers), ); setBuyersSelectOptions(updatedBuyers); @@ -167,7 +167,7 @@ export function BuyerManagement({ if (id) { setSelectedBuyerId(id); const selectedBuyer = buyersSelectOptions.find( - (buyer) => buyer.id === id + (buyer) => buyer.id === id, ); if (selectedBuyer) { @@ -187,12 +187,12 @@ export function BuyerManagement({ try { setBuyersSelectOptions((prevBuyers) => { const updatedBuyers = prevBuyers.filter( - (buyer) => buyer.id !== selectedBuyerId + (buyer) => buyer.id !== selectedBuyerId, ); localStorage.setItem( BUYERS_LOCAL_STORAGE_KEY, - JSON.stringify(updatedBuyers) + JSON.stringify(updatedBuyers), ); return updatedBuyers; }); @@ -222,7 +222,7 @@ export function BuyerManagement({ }; const activeBuyer = buyersSelectOptions.find( - (buyer) => buyer.id === selectedBuyerId + (buyer) => buyer.id === selectedBuyerId, ); return ( @@ -240,7 +240,7 @@ export function BuyerManagement({ id={buyerSelectId} className={cn( "block h-8 max-w-[200px] text-[12px]", - !selectedBuyerId && "italic text-gray-700" + !selectedBuyerId && "italic text-gray-700", )} onChange={handleBuyerChange} value={selectedBuyerId} diff --git a/src/components/dev/stagewise-toolbar.tsx b/src/components/dev/stagewise-toolbar.tsx deleted file mode 100644 index ab57629..0000000 --- a/src/components/dev/stagewise-toolbar.tsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client"; - -import { StagewiseToolbar } from "@stagewise/toolbar-next"; - -const stagewiseConfig = { - plugins: [], -}; - -export function DevToolbar() { - if (process.env.NODE_ENV !== "development") { - return null; - } - - return ; -} diff --git a/src/components/etc/github-logo.tsx b/src/components/etc/github-logo.tsx index 1bef374..e8b7727 100644 --- a/src/components/etc/github-logo.tsx +++ b/src/components/etc/github-logo.tsx @@ -8,7 +8,7 @@ export function GithubIcon({ className }: { className?: string }) { xmlns="http://www.w3.org/2000/svg" className={cn( "h-5 w-5 transition-all group-hover:fill-blue-600", - className + className, )} > View on GitHub diff --git a/src/components/github-star-cta.tsx b/src/components/github-star-cta.tsx new file mode 100644 index 0000000..677d9c3 --- /dev/null +++ b/src/components/github-star-cta.tsx @@ -0,0 +1,40 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { GITHUB_URL } from "@/config"; +import { umamiTrackEvent } from "@/lib/umami-analytics-track-event"; +import { cn } from "@/lib/utils"; +import { Star } from "lucide-react"; +import Link from "next/link"; + +export function GitHubStarCTA() { + const handleStarClick = () => { + umamiTrackEvent("github_star_cta_clicked"); + }; + + return ( +
    + +
    + ); +} diff --git a/src/components/go-to-app-button-cta.tsx b/src/components/go-to-app-button-cta.tsx index d722181..c26a88a 100644 --- a/src/components/go-to-app-button-cta.tsx +++ b/src/components/go-to-app-button-cta.tsx @@ -16,7 +16,7 @@ export function GoToAppButton({ _variant="outline" className={cn( "group relative overflow-hidden border-slate-200 px-8 shadow-sm transition-all duration-300 hover:border-slate-200/80 hover:shadow-lg", - className + className, )} asChild > @@ -39,7 +39,7 @@ export function BlackGoToAppButton({ {children} diff --git a/src/components/seller-dialog.tsx b/src/components/seller-dialog.tsx index cc396c5..c5386a8 100644 --- a/src/components/seller-dialog.tsx +++ b/src/components/seller-dialog.tsx @@ -39,7 +39,7 @@ interface SellerDialogProps { seller: SellerData, { shouldApplyNewSellerToInvoice, - }: { shouldApplyNewSellerToInvoice: boolean } + }: { shouldApplyNewSellerToInvoice: boolean }, ) => void; handleSellerEdit?: (seller: SellerData) => void; initialData: SellerData | null; @@ -108,7 +108,7 @@ export function SellerDialog({ swiftBicFieldIsVisible: true, notes: "", notesFieldIsVisible: true, - } + }, ); } }, [shouldApplyFormValues, formValues, initialData, isEditMode, form]); @@ -129,7 +129,7 @@ export function SellerDialog({ if (!existingSellersValidationResult.success) { console.error( "Invalid existing sellers data:", - existingSellersValidationResult.error + existingSellersValidationResult.error, ); // Show error toast @@ -149,7 +149,7 @@ export function SellerDialog({ // Validate seller data against existing sellers const isDuplicateName = existingSellersValidationResult.data.some( (seller: SellerData) => - seller.name === formValues.name && seller.id !== formValues.id + seller.name === formValues.name && seller.id !== formValues.id, ); if (isDuplicateName) { diff --git a/src/components/seller-management.tsx b/src/components/seller-management.tsx index 5e7c9d5..dcecc6a 100644 --- a/src/components/seller-management.tsx +++ b/src/components/seller-management.tsx @@ -82,7 +82,7 @@ export function SellerManagement({ const selectedSeller = validationResult.data.find( (seller: SellerData) => { return seller?.id === invoiceData?.seller?.id; - } + }, ); setSellersSelectOptions(validationResult.data); @@ -99,7 +99,7 @@ export function SellerManagement({ newSeller: SellerData, { shouldApplyNewSellerToInvoice, - }: { shouldApplyNewSellerToInvoice: boolean } + }: { shouldApplyNewSellerToInvoice: boolean }, ) => { try { const newSellerWithId = { @@ -113,7 +113,7 @@ export function SellerManagement({ // Save to localStorage localStorage.setItem( SELLERS_LOCAL_STORAGE_KEY, - JSON.stringify(newSellers) + JSON.stringify(newSellers), ); // Update the sellers state @@ -146,12 +146,12 @@ export function SellerManagement({ const handleSellerEdit = (editedSeller: SellerData) => { try { const updatedSellers = sellersSelectOptions.map((seller) => - seller.id === editedSeller.id ? editedSeller : seller + seller.id === editedSeller.id ? editedSeller : seller, ); localStorage.setItem( SELLERS_LOCAL_STORAGE_KEY, - JSON.stringify(updatedSellers) + JSON.stringify(updatedSellers), ); setSellersSelectOptions(updatedSellers); @@ -183,7 +183,7 @@ export function SellerManagement({ if (id) { setSelectedSellerId(id); const selectedSeller = sellersSelectOptions.find( - (seller) => seller.id === id + (seller) => seller.id === id, ); if (selectedSeller) { @@ -203,12 +203,12 @@ export function SellerManagement({ try { setSellersSelectOptions((prevSellers) => { const updatedSellers = prevSellers.filter( - (seller) => seller.id !== selectedSellerId + (seller) => seller.id !== selectedSellerId, ); localStorage.setItem( SELLERS_LOCAL_STORAGE_KEY, - JSON.stringify(updatedSellers) + JSON.stringify(updatedSellers), ); return updatedSellers; }); @@ -238,7 +238,7 @@ export function SellerManagement({ }; const activeSeller = sellersSelectOptions.find( - (seller) => seller.id === selectedSellerId + (seller) => seller.id === selectedSellerId, ); return ( @@ -256,7 +256,7 @@ export function SellerManagement({ id={sellerSelectId} className={cn( "block h-8 max-w-[200px] text-[12px]", - !selectedSellerId && "italic text-gray-700" + !selectedSellerId && "italic text-gray-700", )} onChange={handleSellerChange} value={selectedSellerId} diff --git a/src/components/subscribe-input.tsx b/src/components/subscribe-input.tsx index 3a52c27..2f3d4e1 100644 --- a/src/components/subscribe-input.tsx +++ b/src/components/subscribe-input.tsx @@ -26,7 +26,7 @@ function SubmitButton({ className={cn( "absolute right-2 top-1.5 transition-all duration-200", "hover:opacity-90 active:scale-95", - pending && "cursor-not-allowed opacity-80" + pending && "cursor-not-allowed opacity-80", )} disabled={pending} > @@ -64,7 +64,7 @@ export function SubscribeInput({ className={cn( "flex h-12 items-center justify-between", "rounded-lg border bg-emerald-50 px-4 py-2", - "duration-300 animate-in fade-in-0 slide-in-from-top-1" + "duration-300 animate-in fade-in-0 slide-in-from-top-1", )} >

    @@ -111,7 +111,7 @@ export function SubscribeInput({ "placeholder:text-muted-foreground/60", "transition-all duration-200", "focus:ring-primary/20 focus:ring-2 focus:ring-offset-0", - "hover:border-primary/50" + "hover:border-primary/50", )} required /> diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx index cd5e887..44935d9 100644 --- a/src/components/ui/accordion.tsx +++ b/src/components/ui/accordion.tsx @@ -30,7 +30,7 @@ const AccordionTrigger = React.forwardRef< ref={ref} className={cn( "flex flex-1 items-center justify-between py-4 font-medium transition-all [&[data-state=open]>svg]:rotate-180", - className + className, )} {...props} > diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx index 223c378..872dd3b 100644 --- a/src/components/ui/alert-dialog.tsx +++ b/src/components/ui/alert-dialog.tsx @@ -19,7 +19,7 @@ const AlertDialogOverlay = React.forwardRef< @@ -52,7 +52,7 @@ const AlertDialogHeader = ({

    @@ -66,7 +66,7 @@ const AlertDialogFooter = ({
    @@ -119,7 +119,7 @@ const AlertDialogCancel = React.forwardRef< className={cn( buttonVariants({ _variant: "outline" }), "mt-2 sm:mt-0", - className + className, )} {...props} /> diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx index 3bfbad9..3aa69f7 100644 --- a/src/components/ui/badge.tsx +++ b/src/components/ui/badge.tsx @@ -20,7 +20,7 @@ const badgeVariants = cva( defaultVariants: { variant: "default", }, - } + }, ); export interface BadgeProps diff --git a/src/components/ui/button-helper.tsx b/src/components/ui/button-helper.tsx index c280670..487f38f 100644 --- a/src/components/ui/button-helper.tsx +++ b/src/components/ui/button-helper.tsx @@ -14,7 +14,7 @@ export const ButtonHelper = ({ _size="sm" className={cn( "h-5 max-w-full whitespace-normal text-pretty p-0 text-left underline", - className + className, )} {...props} > diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 04644fd..d29c2b7 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -5,7 +5,7 @@ import * as React from "react"; import { cn } from "@/lib/utils"; const buttonVariants = cva( - "inline-flex items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium transition-colors outline-offset-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring/70 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0 [&[data-disabled=true]]:opacity-50", + "inline-flex items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium transition-colors outline-offset-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring/70 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0 [&[data-disabled=true]]:opacity-50 active:scale-[98%] active:transition-transform", { variants: { _variant: { @@ -32,7 +32,7 @@ const buttonVariants = cva( _variant: "default", _size: "default", }, - } + }, ); export interface ButtonProps @@ -47,7 +47,7 @@ export interface ButtonProps const Button = React.forwardRef( ( { className, _variant, _size, asChild = false, type = "button", ...props }, - ref + ref, ) => { const Comp = asChild ? Slot : "button"; return ( @@ -58,7 +58,7 @@ const Button = React.forwardRef( {...props} /> ); - } + }, ); Button.displayName = "Button"; diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx index 6cac29a..d7955a1 100644 --- a/src/components/ui/command.tsx +++ b/src/components/ui/command.tsx @@ -16,7 +16,7 @@ const Command = React.forwardRef< ref={ref} className={cn( "flex h-full w-full flex-col overflow-hidden rounded-md bg-white text-slate-950 dark:bg-slate-950 dark:text-slate-50", - className + className, )} {...props} /> @@ -45,7 +45,7 @@ const CommandInput = React.forwardRef< ref={ref} className={cn( "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-slate-500 disabled:cursor-not-allowed disabled:opacity-50 dark:placeholder:text-slate-400", - className + className, )} {...props} /> @@ -88,7 +88,7 @@ const CommandGroup = React.forwardRef< ref={ref} className={cn( "overflow-hidden p-1 text-slate-950 dark:text-slate-50 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-slate-500 dark:[&_[cmdk-group-heading]]:text-slate-400", - className + className, )} {...props} /> @@ -116,7 +116,7 @@ const CommandItem = React.forwardRef< ref={ref} className={cn( "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-slate-100 data-[selected=true]:text-slate-900 data-[disabled=true]:opacity-50 dark:data-[selected='true']:bg-slate-800 dark:data-[selected=true]:text-slate-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", - className + className, )} {...props} /> @@ -132,7 +132,7 @@ const CommandShortcut = ({ diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx index 4205ad7..e5b9ccb 100644 --- a/src/components/ui/dialog.tsx +++ b/src/components/ui/dialog.tsx @@ -22,7 +22,7 @@ const DialogOverlay = React.forwardRef< ref={ref} className={cn( "fixed inset-0 z-[101] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", - className + className, )} {...props} /> @@ -39,7 +39,7 @@ const DialogContent = React.forwardRef< ref={ref} className={cn( "fixed left-1/2 top-1/2 z-[101] grid max-h-[calc(100%-4rem)] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto rounded-xl border border-slate-200 bg-white p-6 shadow-lg shadow-black/5 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] dark:border-slate-800 dark:bg-slate-950 sm:max-w-[400px] sm:rounded-xl", - className + className, )} {...props} > @@ -64,7 +64,7 @@ const DialogHeader = ({
    @@ -78,7 +78,7 @@ const DialogFooter = ({
    diff --git a/src/components/ui/disclosure.tsx b/src/components/ui/disclosure.tsx index 6cd5a2c..0462281 100644 --- a/src/components/ui/disclosure.tsx +++ b/src/components/ui/disclosure.tsx @@ -35,7 +35,7 @@ const DisclosureGroup = React.forwardRef( {...props} className={composeTailwindRenderProps( className, - "peer cursor-pointer disabled:cursor-not-allowed disabled:opacity-75" + "peer cursor-pointer disabled:cursor-not-allowed disabled:opacity-75", )} > {(values) => ( @@ -45,7 +45,7 @@ const DisclosureGroup = React.forwardRef( )} ); - } + }, ); DisclosureGroup.displayName = "DisclosureGroup"; @@ -61,13 +61,13 @@ const Disclosure = React.forwardRef( {...props} className={composeTailwindRenderProps( className, - "w-full min-w-60 border-b disabled:opacity-60" + "w-full min-w-60 border-b disabled:opacity-60", )} > {children} ); - } + }, ); Disclosure.displayName = "Disclosure"; @@ -83,7 +83,7 @@ const DisclosureTrigger = React.forwardRef( slot="trigger" className={composeTailwindRenderProps( className, - "flex w-full items-center justify-between gap-x-2 py-3 text-left text-base font-medium disabled:cursor-default disabled:opacity-50 forced-colors:disabled:text-[GrayText] [&[aria-expanded=true]_[data-slot=disclosure-chevron]]:rotate-180" + "flex w-full items-center justify-between gap-x-2 py-3 text-left text-base font-medium disabled:cursor-default disabled:opacity-50 forced-colors:disabled:text-[GrayText] [&[aria-expanded=true]_[data-slot=disclosure-chevron]]:rotate-180", )} {...props} > @@ -104,7 +104,7 @@ const DisclosureTrigger = React.forwardRef( ); - } + }, ); DisclosureTrigger.displayName = "DisclosureTrigger"; @@ -121,7 +121,7 @@ const DisclosurePanel = React.forwardRef< data-slot="disclosure-panel" className={composeTailwindRenderProps( className, - "cursor-text overflow-hidden text-sm text-slate-600 transition-all duration-200 ease-in-out" + "cursor-text overflow-hidden text-sm text-slate-600 transition-all duration-200 ease-in-out", )} {...props} > @@ -138,10 +138,10 @@ DisclosurePanel.displayName = "DisclosurePanel"; function composeTailwindRenderProps( className: string | ((v: T) => string) | undefined, - tailwind: string + tailwind: string, ): string | ((v: T) => string) { return composeRenderProps(className, (className) => - twMerge(tailwind, className) + twMerge(tailwind, className), ); } diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index a5ef08e..ea9f6da 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -55,7 +55,7 @@ function DropdownMenuContent({ isCloseFromMouse.current = true; onPointerDown?.(e); }, - [onPointerDown] + [onPointerDown], ); const handlePointerDownOutside = React.useCallback( @@ -63,7 +63,7 @@ function DropdownMenuContent({ isCloseFromMouse.current = true; onPointerDownOutside?.(e); }, - [onPointerDownOutside] + [onPointerDownOutside], ); const handleCloseAutoFocus = React.useCallback( @@ -79,7 +79,7 @@ function DropdownMenuContent({ e.preventDefault(); isCloseFromMouse.current = false; }, - [onCloseAutoFocus] + [onCloseAutoFocus], ); return ( @@ -89,7 +89,7 @@ function DropdownMenuContent({ sideOffset={sideOffset} className={cn( "z-50 min-w-40 overflow-hidden rounded-md border border-slate-200 bg-white p-1 text-slate-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50", - className + className, )} onPointerDown={handlePointerDown} onPointerDownOutside={handlePointerDownOutside} @@ -124,7 +124,7 @@ function DropdownMenuItem({ data-variant={variant} className={cn( "data-[variant=destructive]:*:[svg]:!text-destructive-foreground outline-hidden relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-slate-100 hover:text-slate-900 data-[disabled]:pointer-events-none data-[highlighted]:bg-slate-100 data-[variant=destructive]:data-[highlighted]:bg-red-500/10 data-[inset]:pl-8 data-[highlighted]:text-slate-900 data-[variant=destructive]:data-[highlighted]:text-slate-50 data-[variant=destructive]:text-slate-50 data-[disabled]:opacity-50 data-[highlighted]:outline-none data-[variant=destructive]:hover:bg-red-500/10 data-[variant=destructive]:hover:text-slate-50 dark:hover:bg-slate-800 dark:hover:text-slate-50 dark:data-[highlighted]:bg-slate-800 dark:data-[variant=destructive]:data-[highlighted]:bg-red-900/10 dark:data-[highlighted]:text-slate-50 dark:data-[variant=destructive]:data-[highlighted]:text-slate-50 dark:data-[variant=destructive]:text-slate-50 dark:data-[variant=destructive]:hover:bg-red-900/10 dark:data-[variant=destructive]:hover:text-slate-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", - className + className, )} {...props} /> @@ -142,7 +142,7 @@ function DropdownMenuCheckboxItem({ data-slot="dropdown-menu-checkbox-item" className={cn( "outline-hidden relative flex cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-8 pr-2 text-sm focus:bg-slate-100 focus:text-slate-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-slate-800 dark:focus:text-slate-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", - className + className, )} checked={checked} {...props} @@ -178,7 +178,7 @@ function DropdownMenuRadioItem({ data-slot="dropdown-menu-radio-item" className={cn( "outline-hidden relative flex cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-8 pr-2 text-sm focus:bg-slate-100 focus:text-slate-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-slate-800 dark:focus:text-slate-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", - className + className, )} {...props} > @@ -205,7 +205,7 @@ function DropdownMenuLabel({ data-inset={inset} className={cn( "px-2 py-1.5 text-xs font-medium text-slate-500 data-[inset]:pl-8 dark:text-slate-400", - className + className, )} {...props} /> @@ -221,7 +221,7 @@ function DropdownMenuSeparator({ data-slot="dropdown-menu-separator" className={cn( "-mx-1 my-1 h-px bg-slate-200 dark:bg-slate-800", - className + className, )} {...props} /> @@ -237,7 +237,7 @@ function DropdownMenuShortcut({ data-slot="dropdown-menu-shortcut" className={cn( "-me-1 ms-auto inline-flex h-5 max-h-full items-center rounded border border-slate-200 bg-white px-1 font-[inherit] text-[0.625rem] font-medium text-slate-500/70 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-400/70", - className + className, )} {...props} /> @@ -264,7 +264,7 @@ function DropdownMenuSubTrigger({ data-inset={inset} className={cn( "outline-hidden flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm focus:bg-slate-100 focus:text-slate-900 data-[state=open]:bg-slate-100 data-[inset]:pl-8 data-[state=open]:text-slate-900 dark:focus:bg-slate-800 dark:focus:text-slate-50 dark:data-[state=open]:bg-slate-800 dark:data-[state=open]:text-slate-50", - className + className, )} {...props} > @@ -286,7 +286,7 @@ function DropdownMenuSubContent({ data-slot="dropdown-menu-sub-content" className={cn( "z-50 min-w-40 overflow-hidden rounded-md border border-slate-200 bg-white p-1 text-slate-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50", - className + className, )} {...props} /> diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx index 54b7f4c..6c68d77 100644 --- a/src/components/ui/form.tsx +++ b/src/components/ui/form.tsx @@ -25,7 +25,7 @@ type FormFieldContextValue< }; const FormFieldContext = React.createContext( - {} as FormFieldContextValue + {} as FormFieldContextValue, ); const FormField = < @@ -69,7 +69,7 @@ type FormItemContextValue = { }; const FormItemContext = React.createContext( - {} as FormItemContextValue + {} as FormItemContextValue, ); const FormItem = React.forwardRef< @@ -160,7 +160,7 @@ const FormMessage = React.forwardRef< id={formMessageId} className={cn( "text-[13px] font-medium text-red-500 dark:text-red-900", - className + className, )} {...props} > diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index cce4637..39e27fa 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -15,14 +15,14 @@ const Input = React.memo( "[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none", type === "file" && "p-0 pr-3 italic text-slate-500/70 file:me-3 file:h-full file:border-0 file:border-r file:border-solid file:border-slate-200 file:bg-transparent file:px-3 file:text-sm file:font-medium file:not-italic file:text-slate-950 dark:text-slate-400/70 dark:file:border-slate-800 dark:file:text-slate-50", - className + className, )} ref={ref} {...props} /> ); - } - ) + }, + ), ); Input.displayName = "Input"; diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index fedbaaf..a984897 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -13,11 +13,11 @@ const Label = React.memo( ref={ref} className={cn( "block text-balance text-xs font-medium text-gray-900 peer-disabled:cursor-not-allowed peer-disabled:opacity-70 dark:text-slate-50", - className + className, )} {...props} /> - )) + )), ); Label.displayName = "Label"; diff --git a/src/components/ui/money-input.tsx b/src/components/ui/money-input.tsx index 7e16641..9ff6b12 100644 --- a/src/components/ui/money-input.tsx +++ b/src/components/ui/money-input.tsx @@ -54,7 +54,7 @@ const MoneyInput = React.memo( className={cn( "-me-px rounded-e-none ps-6 shadow-none", getCurrencyPadding(currencySymbol), - props.className + props.className, )} placeholder="0.00" /> @@ -64,7 +64,7 @@ const MoneyInput = React.memo(
    ); - }) + }), ); MoneyInput.displayName = "MoneyInput"; @@ -97,7 +97,7 @@ const ReadOnlyMoneyInput = React.memo( "-me-px block w-full cursor-not-allowed rounded-md rounded-e-none border border-gray-300 bg-gray-100 px-3 py-2 ps-6", getCurrencyPadding(currencySymbol), "focus-visible:border-indigo-500 focus-visible:ring focus-visible:ring-indigo-200 focus-visible:ring-opacity-50", - props.className + props.className, )} placeholder="0.00" type="text" @@ -110,7 +110,7 @@ const ReadOnlyMoneyInput = React.memo(
    ); - }) + }), ); ReadOnlyMoneyInput.displayName = "ReadOnlyMoneyInput"; diff --git a/src/components/ui/multi-select.tsx b/src/components/ui/multi-select.tsx index e5f5024..ce26fa4 100644 --- a/src/components/ui/multi-select.tsx +++ b/src/components/ui/multi-select.tsx @@ -47,7 +47,7 @@ const multiSelectVariants = cva( defaultVariants: { variant: "default", }, - } + }, ); /** @@ -153,12 +153,12 @@ export const MultiSelect = React.forwardRef< handleDownload, ...props }, - ref + ref, ) => { const [isPopoverOpen, setIsPopoverOpen] = React.useState(false); const handleInputKeyDown = ( - event: React.KeyboardEvent + event: React.KeyboardEvent, ) => { if (event.key === "Enter") { setIsPopoverOpen(true); @@ -222,7 +222,7 @@ export const MultiSelect = React.forwardRef< selectedLanguages.length === 1 && "lg:w-[200px]", selectedLanguages.length === 2 && "lg:w-[240px]", selectedLanguages.length >= 3 && "lg:w-[280px]", - className + className, )} >
    @@ -249,7 +249,7 @@ export const MultiSelect = React.forwardRef< {`+ ${selectedLanguages.length - maxCount} more`} @@ -276,7 +276,7 @@ export const MultiSelect = React.forwardRef<
    ); - } + }, ); SelectNative.displayName = "SelectNative"; diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx index ff5e25f..d52497a 100644 --- a/src/components/ui/separator.tsx +++ b/src/components/ui/separator.tsx @@ -11,7 +11,7 @@ const Separator = React.forwardRef< >( ( { className, orientation = "horizontal", decorative = true, ...props }, - ref + ref, ) => ( - ) + ), ); Separator.displayName = SeparatorPrimitive.Root.displayName; diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx index c850c1c..432b8fc 100644 --- a/src/components/ui/switch.tsx +++ b/src/components/ui/switch.tsx @@ -16,18 +16,18 @@ const Switch = React.memo( - )) + )), ); Switch.displayName = SwitchPrimitives.Root.displayName; diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx index 82628fd..23245d7 100644 --- a/src/components/ui/tabs.tsx +++ b/src/components/ui/tabs.tsx @@ -27,7 +27,7 @@ function TabsList({ data-slot="tabs-list" className={cn( "inline-flex w-fit items-center justify-center gap-2 rounded-md bg-slate-200 p-1 text-slate-700 dark:bg-slate-800 dark:text-slate-300", - className + className, )} {...props} /> @@ -43,7 +43,7 @@ function TabsTrigger({ data-slot="tabs-trigger" className={cn( "inline-flex items-center justify-center whitespace-nowrap rounded-[4px] px-3 py-1.5 text-sm font-medium ring-offset-white transition-all hover:bg-slate-100 hover:text-slate-900 focus-visible:border-indigo-500 focus-visible:ring focus-visible:ring-indigo-200 focus-visible:ring-opacity-50 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-slate-950 data-[state=active]:shadow-sm dark:ring-offset-slate-950 dark:hover:bg-slate-800 dark:hover:text-slate-50 dark:focus-visible:ring-slate-300 dark:data-[state=active]:bg-slate-950 dark:data-[state=active]:text-slate-50", - className + className, )} {...props} /> diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx index 28ddc21..fe4052e 100644 --- a/src/components/ui/textarea.tsx +++ b/src/components/ui/textarea.tsx @@ -10,7 +10,7 @@ const Textarea = React.forwardRef<