From 12c7c22af2d81de5d13ea11eae7169f8f7b58215 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Fri, 15 Jan 2021 11:36:24 +0100 Subject: [PATCH 01/14] remove Y.js form drawing demo --- docs/src/demos/Examples/Drawing/index.vue | 10 ---------- docs/src/docPages/examples/drawing.md | 8 -------- 2 files changed, 18 deletions(-) diff --git a/docs/src/demos/Examples/Drawing/index.vue b/docs/src/demos/Examples/Drawing/index.vue index a5b3f506..dd101ddf 100644 --- a/docs/src/demos/Examples/Drawing/index.vue +++ b/docs/src/demos/Examples/Drawing/index.vue @@ -5,12 +5,9 @@ diff --git a/docs/src/docPages/examples/drawing.md b/docs/src/docPages/examples/drawing.md index 0fa36728..4104151e 100644 --- a/docs/src/docPages/examples/drawing.md +++ b/docs/src/docPages/examples/drawing.md @@ -2,12 +2,4 @@ Did you ever wanted to draw in a text editor? Me neither. Anyway, here is an example how that could work with tiptap. If you want to build something like that, [learn more about node views](/guide/node-views). -:::warning Shared Document -Be nice! The content of this editor is shared with other users from the Internet. -::: - - - -Here is another instance of that demo, to illustrate how changes can be synced. Be nice, those changes are synced to all users on this page. Open another tab to test that out! - From d8cf302b436ae285b1009dd4fd6f957bf1c8c358 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Fri, 15 Jan 2021 11:42:53 +0100 Subject: [PATCH 02/14] clean up --- docs/src/demos/Examples/Drawing/index.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/src/demos/Examples/Drawing/index.vue b/docs/src/demos/Examples/Drawing/index.vue index dd101ddf..ef1e3bcc 100644 --- a/docs/src/demos/Examples/Drawing/index.vue +++ b/docs/src/demos/Examples/Drawing/index.vue @@ -18,7 +18,6 @@ export default { data() { return { editor: null, - provider: null, } }, From e6cbb5511f4d312699818116dccefbf6c71707fe Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Mon, 18 Jan 2021 14:39:26 +0100 Subject: [PATCH 03/14] docs: add new placeholder pages --- docs/src/docPages/api/nodes/emoji.md | 7 +++++++ docs/src/docPages/api/nodes/hashtag.md | 7 +++++++ docs/src/docPages/api/nodes/mention.md | 7 +++++++ docs/src/links.yaml | 9 +++++++++ 4 files changed, 30 insertions(+) create mode 100644 docs/src/docPages/api/nodes/emoji.md create mode 100644 docs/src/docPages/api/nodes/hashtag.md create mode 100644 docs/src/docPages/api/nodes/mention.md diff --git a/docs/src/docPages/api/nodes/emoji.md b/docs/src/docPages/api/nodes/emoji.md new file mode 100644 index 00000000..9eeafdf0 --- /dev/null +++ b/docs/src/docPages/api/nodes/emoji.md @@ -0,0 +1,7 @@ +# Emoji + +:::pro Fund the development 💖 +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +::: + +TODO diff --git a/docs/src/docPages/api/nodes/hashtag.md b/docs/src/docPages/api/nodes/hashtag.md new file mode 100644 index 00000000..03676616 --- /dev/null +++ b/docs/src/docPages/api/nodes/hashtag.md @@ -0,0 +1,7 @@ +# Hashtag + +:::pro Fund the development 💖 +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +::: + +TODO diff --git a/docs/src/docPages/api/nodes/mention.md b/docs/src/docPages/api/nodes/mention.md new file mode 100644 index 00000000..7340d0bd --- /dev/null +++ b/docs/src/docPages/api/nodes/mention.md @@ -0,0 +1,7 @@ +# Mention + +:::pro Fund the development 💖 +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +::: + +TODO diff --git a/docs/src/links.yaml b/docs/src/links.yaml index 7b7a40a3..97ea23c8 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -90,8 +90,14 @@ link: /api/nodes/code-block - title: Document link: /api/nodes/document + - title: Emoji + link: /api/nodes/emoji + draft: true - title: HardBreak link: /api/nodes/hard-break + - title: Hashtag + link: /api/nodes/hashtag + draft: true - title: Heading link: /api/nodes/heading - title: HorizontalRule @@ -100,6 +106,9 @@ link: /api/nodes/image - title: ListItem link: /api/nodes/list-item + - title: Mention + link: /api/nodes/mention + draft: true - title: OrderedList link: /api/nodes/ordered-list - title: Paragraph From b93168e97aefa93a602788820ff349061d6e0bf3 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Mon, 18 Jan 2021 15:07:49 +0100 Subject: [PATCH 04/14] docs: improve the sponsor page, remove the feedback page --- docs/src/docPages/overview/feedback.md | 7 ----- docs/src/docPages/sponsor.md | 32 +++++++++++++++----- docs/src/layouts/App/index.vue | 8 ++--- docs/src/layouts/App/style.scss | 12 ++++++++ docs/src/links.yaml | 40 +++++++++++-------------- docs/src/templates/DocPage/style.scss | 4 +++ docs/static/philipp-and-hans.jpg | Bin 0 -> 100330 bytes 7 files changed, 60 insertions(+), 43 deletions(-) delete mode 100644 docs/src/docPages/overview/feedback.md create mode 100644 docs/static/philipp-and-hans.jpg diff --git a/docs/src/docPages/overview/feedback.md b/docs/src/docPages/overview/feedback.md deleted file mode 100644 index 8844146e..00000000 --- a/docs/src/docPages/overview/feedback.md +++ /dev/null @@ -1,7 +0,0 @@ -# Feedback - -We’re looking for your feedback to improve tiptap 2 before the first public release! Share everything that helps to make it better for everyone! - -* Create issues on GitHub! [Link](https://github.com/ueberdosis/tiptap-next/issues) -* Send an email! [humans@tiptap.dev](mailto:humans@tiptap.dev) -* Follow us on Twitter! [@hanspagel](https://twitter.com/hanspagel), [@_philippkuehn](https://twitter.com/_philippkuehn), or [@_ueberdosis](https://twitter.com/_ueberdosis) diff --git a/docs/src/docPages/sponsor.md b/docs/src/docPages/sponsor.md index 366806d0..31f4857f 100644 --- a/docs/src/docPages/sponsor.md +++ b/docs/src/docPages/sponsor.md @@ -1,11 +1,12 @@ # Become a sponsor -To deliver a top-notch developer experience and user experience, we put hundreds of hours of unpaid work into tiptap. Your funding helps us to make this work more and more financially sustainable. This enables us, to provide helpful support, maintain all our packages, keep everything up to date, and develop new features and extensions for tiptap. +To deliver a top-notch developer experience and user experience, we put ~~hundreds~~ thousands of hours of unpaid work into tiptap. Your funding helps us to make this work more and more financially sustainable. This enables us to provide helpful support, maintain all our packages, keep everything up to date, and develop new features and extensions for tiptap. -If you’re using tiptap in a commercial project or just want to give back to the open source community, you can [sponsor us on GitHub](https://github.com/sponsors/ueberdosis). +Give back to the open source community and [sponsor us on GitHub](https://github.com/sponsors/ueberdosis)! 💖 ## Your benefits as a sponsor * Give back to the open source community * Get early access to private repositories +* Ensure the further maintenace and development of tiptap * Your issues and pull requests get a `sponsor 💖` label * Get a sponsor badge in all your comments on GitHub * Show support in your GitHub profile @@ -13,11 +14,28 @@ If you’re using tiptap in a commercial project or just want to give back to th Does that sound good? [Sponsor us on GitHub!](https://github.com/sponsors/ueberdosis) -## I can’t use GitHub. -If you’re a company, don’t want to use GitHub, don’t have a credit card or want a proper invoice form us, just reach out to us at [humans@tiptap.dev](mailto:humans@tiptap.dev). +## The maintainers of tiptap +If you’re thankful for tiptap, you should say thank you to all 12 lovely people of [überdosis](https://twitter.com/_ueberdosis). The amazing company we’re all building together and the amazing company that funded the initial development costs of tiptap 2. -## I want consulting. -We don’t do any calls, consulting or personal support. If you have an issue, a question, want to talk something through or anything else, [please use GitHub issues](https://github.com/ueberdosis/tiptap-next/issues), to keep everything accessible for the whole community. +AND you should definitely hire us if you want us to design und build an amazing digital product for you. Bonus points if it’s somehow text editing related. -## Can we have a call? +But here are the friendly faces of the two maintainer of tiptap, Philipp Kühn (left) and Hans Pagel (right). You’ve probably read our names in the thousands of commits, pull requests or Tweets already. + +![Philipp and Hans, the maintainers of tiptap, looking happy](/philipp-and-hans.jpg) + +## More peace of mind +Companies betting on tiptap probably want some peace of mind and ensure that we keep maintaining tiptap, but don’t forget that our work is based on the work of other lovely people that you should definitel sponsor too: + +* [Sponsor Marijn Haverbeke](https://marijnhaverbeke.nl/fund/) (ProseMirror) +* [Sponsor Kevin Jahns](https://github.com/sponsors/dmonad) (Y.js) + +## Frequently asked questions + +### I can’t use GitHub. How can I support you? +If you’re a company, don’t want to use GitHub, don’t have a credit card or want a proper invoice from us, just reach out to us at [humans@tiptap.dev](mailto:humans@tiptap.dev). + +### I want consulting. What’s your rate? +We don’t do any calls, consulting or personal support for tiptap. If you have an issue, a question, want to talk something through or anything else, [please use GitHub issues](https://github.com/ueberdosis/tiptap-next/issues) to keep everything accessible for the whole community. + +### Can we have a call? Nope, we are big fans of asynchronous communication. If you really need to reach out in private, send us an email to [humans@tiptap.dev](mailto:humans@tiptap.dev), but don’t expect technical email support. diff --git a/docs/src/layouts/App/index.vue b/docs/src/layouts/App/index.vue index 1ccb734f..03fe948b 100644 --- a/docs/src/layouts/App/index.vue +++ b/docs/src/layouts/App/index.vue @@ -87,9 +87,7 @@ 'app__link': true, 'app__link--exact': $router.currentRoute.path === item.link, 'app__link--active': $router.currentRoute.path.startsWith(item.link), - 'app__link--draft': item.draft === true, - 'app__link--pro': item.pro === true, - 'app__link--new': item.new === true, + [`app__link--${item.type}`]: item.type !== null, 'app__link--with-children': !!item.items }" :to="item.redirect || item.link" @@ -104,9 +102,7 @@ 'app__link': true, 'app__link--exact': $router.currentRoute.path === item.link, 'app__link--active': $router.currentRoute.path.startsWith(item.link), - 'app__link--draft': item.draft === true, - 'app__link--pro': item.pro === true, - 'app__link--new': item.new === true, + [`app__link--${item.type}`]: item.type !== null, }" :to="item.link" exact diff --git a/docs/src/layouts/App/style.scss b/docs/src/layouts/App/style.scss index 7212bd80..fd6c98d3 100644 --- a/docs/src/layouts/App/style.scss +++ b/docs/src/layouts/App/style.scss @@ -255,6 +255,18 @@ $menuBreakPoint: 800px; } } + &--sponsor { + color: $colorWhite; + + &::after { + content: '💖'; + font-family: 'JetBrainsMono', monospace; + text-transform: uppercase; + padding: 0 0.5em; + border-radius: 5px; + } + } + &--with-children::after { content: '↓'; color: rgba($colorWhite, 0.2); diff --git a/docs/src/links.yaml b/docs/src/links.yaml index 97ea23c8..2cc56537 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -8,8 +8,9 @@ link: /overview/upgrade-guide - title: Contributing link: /overview/contributing - - title: Feedback - link: /overview/feedback + - title: Become a sponsor + link: /sponsor + type: sponsor - title: Examples link: /examples @@ -19,7 +20,7 @@ link: /examples/basic - title: Collaborative editing link: /examples/collaborative-editing - pro: true + type: pro - title: Markdown shortcuts link: /examples/markdown-shortcuts - title: Formatting @@ -48,11 +49,11 @@ skip: true - title: Alpine.js link: /guide/getting-started/alpinejs - draft: true + type: draft skip: true - title: Livewire link: /guide/getting-started/livewire - draft: true + type: draft skip: true - title: Configure the editor link: /guide/configuration @@ -66,12 +67,12 @@ link: /guide/build-extensions - title: Complex node views link: /guide/node-views - draft: true + type: draft - title: Working with TypeScript link: /guide/working-with-typescript - title: Collaborative editing link: /guide/collaborative-editing - pro: true + type: pro - title: API items: @@ -92,12 +93,12 @@ link: /api/nodes/document - title: Emoji link: /api/nodes/emoji - draft: true + type: draft - title: HardBreak link: /api/nodes/hard-break - title: Hashtag link: /api/nodes/hashtag - draft: true + type: draft - title: Heading link: /api/nodes/heading - title: HorizontalRule @@ -108,20 +109,20 @@ link: /api/nodes/list-item - title: Mention link: /api/nodes/mention - draft: true + type: draft - title: OrderedList link: /api/nodes/ordered-list - title: Paragraph link: /api/nodes/paragraph - title: Table link: /api/nodes/table - draft: true + type: draft - title: TableRow link: /api/nodes/table-row - draft: true + type: draft - title: TableCell link: /api/nodes/table-cell - draft: true + type: draft - title: TaskList link: /api/nodes/task-list - title: TaskItem @@ -152,10 +153,10 @@ items: - title: Collaboration link: /api/extensions/collaboration - pro: true + type: pro - title: CollaborationCursor link: /api/extensions/collaboration-cursor - pro: true + type: pro - title: Dropcursor link: /api/extensions/dropcursor - title: Focus @@ -168,7 +169,7 @@ link: /api/extensions/history - title: Suggestion link: /api/extensions/suggestion - draft: true + type: draft - title: TextAlign link: /api/extensions/text-align - title: Typography @@ -182,13 +183,6 @@ - title: Keyboard Shortcuts link: /api/keyboard-shortcuts -- title: Sponsoring - items: - - title: Become a sponsor - link: /sponsor - - title: Monthly reports - link: /reports - - title: Links items: - title: Documentation for tiptap 1.x diff --git a/docs/src/templates/DocPage/style.scss b/docs/src/templates/DocPage/style.scss index 69ce9963..f51005ca 100644 --- a/docs/src/templates/DocPage/style.scss +++ b/docs/src/templates/DocPage/style.scss @@ -67,6 +67,10 @@ } } + > p > img { + max-width: 100%; + } + :first-child { margin-top: 0; } diff --git a/docs/static/philipp-and-hans.jpg b/docs/static/philipp-and-hans.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81da5472f2e827e243dcbee772793307c06109c3 GIT binary patch literal 100330 zcmbsRcRU>5_W%yh>TgklXsZN4kmzNxq7$M;3(*qMYplM=3PRK%I;%x=qSqyo=&asr zwADpfvfBIE_vickp4aPn{(bJ9nb&J(&fHV(x#ym_bI$xb`|m11qow{-9RPs<0EDl= zzY9P(K!Pu%B&1|yq~v$-m70ozf{OYc4K2Rj<6>ZDz;9gaJnUfnE+xRrD> zjjglP&T%upF~Np!hPa)hub%!4RdodN2oa#~1qglu06+i;vi~DfplldQE?oMkS32V> zWRL4TkUy`KV9Eti^DKO|dR@2^oTaPf`?_zkA9Lld8>uwg0?EyUmUoW(|278Ui3BOq z(*uB#BA^HYXlMY?e^jak)r}QC&{#4||AG-*%;PHjSr^HIRAE2<5f0`^ype3MJBD4| ziD^pd_c)WcPtbOcdy;`F?ws_BUIhU9|0)swKw|(X(h%Ws;M*rAl{MQo43=Jk2V}Z% zUI-8fgwCtP8M2jK2*keuYa|4Vx4k+Oxmf?PT_@Uh8X5UjN2NpI3q`Zvr{?(mFQ8)+P+j9| zTKUyYS3Ew|>Zr!#tMm}Ebcf}H{~=?x4HqW?f`1jz*LV3uS#>)!&JS=>ZUyN2vP<9l zl_EGlx_e_rPf-OXAMvSL*k-o{(XGTe^+< znnNvvN)9bv@u^nl)ffsX+F`v*E?|P2#%Kx%T0~KTNGSE4Db)*^69%vT1=Nb|ED%7X zTH2Zd1Mrr z7NKUbi{{6c-=;pg4zpvvUBa{Z0RjGMd?#5OU$AEnzZ&ssDTpd#iw!WF9fGF}5P?TR zZyt>YV2E<6gBg*Be3s*VWjz_W;(;8+u9~ZNo6xs=160yu{7A|es@BFdm zRtaH%u;4D#TsEl6Rnonv+}PHG@%!G5idZuM(x{l`f9_+t1c#&>nU)~{5Dght zjwh!_W5L0_bT2vK=9p%i&kD{5P;GZbf@1XY=|o~QIgm#{0B}adVM5+qxJO#;=K+gH z56>R=pS@j;ZhJ{#%x{v|&cVGLOkS1;7n$=7nHMY>5Q_}3e33Ac5M-vL7C7TA|u0Ck=7_9|a)Uw}}p5L}l zwI&cIzZZA0aPr3PdC6R^2}{c#o*)j^u^aVG4S@d+&&250-KsWjNZD?@v8SYw{{CD_ zMr`zNw88yfxV>$K>Gh9ppUMr!1q)RRPpvI?ubv|!^m0%uUxVyPGXhf?)r21{1oZg1 z^}1dJv13R(O_Q+f=_Ik3TiXk(7^{suuEe+f+pyXXIs&vSnXw{z+oLVUjU zzNkt(kf}gb#G|fF3j;j-k+9wA>&8Rja{W_l^KXReuoW?QwOX~8J`G*!I|qm%dwdWh zqpXaXd6AZtt;X)-{O@@{RS=%-%lP(tv%?uM!A!nX8$wi_R}6A{uyVqIJ@Ehg6Q(sl((h#urxE!#;s1MZj40Z=G08CWhMcOTZJkE02N&&#O0&Z7?!%rP>&)gy{=A zk_f$A)btjKk87ioE9MB6*)n(Y_=(2kaj)F;zSm7#xGF0;X!tOgw_#3IQMo$piV!CZ zDK07vRIp80UO{HW)V%AK6D|b*HU=2}L+)PEw1MyNH5A&BoB(_5@Meu115u25f(fas zZrsf5vUo3gSKwQ(M(o*>SM#4(BA!r%rF|r4+*#SakYrD&iC##I;;T$Tr_pBhg~B!1@#3qM%RPl)erhV@b=$nj*HJQb>g9KxqHAVxe`MxFWOPWf8B1MyuGd%8lIH3==C z<`h^zfRi{Ru6pcQHOM)cY~iX##sk#=dN9s)^lO84z`@olBNrrDiC|b=^am*c!Nn@C zFf($f)kPl$^^~-HYFz6=kpFMWa#>k5!|nyj7zyk3Q+V2o(fuUk`AbIIG?;Lq{yysG z{B}cClmyNHhI6h)otL5`n(jL)tZ`3hqA((=H7>(t#a#^)r5Q@>=cJ z5zI~<`*B;ZNul343nDEUgk05Ib}>}2NGf&(HQ1zAc?7(-*_Tvu6lWS&tk>RN$;ADJ zR{g0|8p;PQOYeRv`*#WYyMWMaB&h!|n7w;Wi3QDyIm%l<@-Z7eWm^7N)BkqyS9V(P z*ldw9m7Lf+_dO$kIB?{39OIPF4(rg5g1$UX^5XySzSuB@JS8ndSyXwoY6wJc8pBd{ zx7*i!dq>ijyQcJB@_wM=WtWsamZ+J%LiQ}b@qIWljw<0CgLGyDj}*+c@sF|o3c5JR zSvm-+^2pr0krSX+SpB+vUU5eJ3~e%Fz2LLTUjng~jFzx8^XOZ4ZY@KtBFKwh{>O4V zJOVytff4M59(tBl8GB+)g>#gqJv*3>tYV5IazJdFGDtaADSoc8%RBXR!+}C<`jSMd z9*|S%X7AREWkR|b+!5*mj7}!}yiw{658~xxW^X)TyhJ`$S4HK%ogzTUm=4;8_ZRXZK63a-XE7 z^sck#9tJi%+Spn5tzzMf#j^~ZD40bFkj1Xw`gNXt@Gu*EtKc+th_P{7ebW)W2e;-+ z9yvOGot%#=v2T}f=8B$rhh2C30i#iu?d!{E{GRwbg1 zVT+h}Qh{bz_IeD`U(OP|KhOMmQH`EBFvat_AffPvp)%8UcNZ2D{9uZt3Gdh}w(4Y! z5UG2;gRGoAajGiivy8)LLl1PuGRyf}I=EvYA&DFY+lKo2yI*=EJ zuxeyUPbWnFMt|~ZIRax^#;NGN%320CeVGG;r~1oHABP(ha@sk&+HEvb# zTzEE%m3^SpJ~M>GjO{Nc>e~ibXV=4@c$BhHOD@$|IXBOF%(wk?vKfguL&v4i7!kAY zxQ-QE4u+`1^kvK#6!Fs(cXx$3WxZ(7-bhT z2)MnA-@GJkwo^RZdtbT}aO;f>osdz7JrTRA)~E?IqAeY`UVm46;asz}_A1cs5S~>` zq*FOK+1)8TE_)CEQU&|kpqybb1`kM&FeBw82%Y|EeJ7W_DzH5J_y~sA=@ttpgGJf# zp_tpsV%U?kpRM11YE3e{F4kqWQp-3(h9-yF)~s*ryehqyt5u*ecs+KQ!#jmR^ql+) zKpe5RJEq*}w!W>gRay~!1>Z5wulW29=1&ovCBH2t%kU$~`+=<*l}G8OFeh~c1P}%E&_oc!;e}ewDt;x zf+hv3VWWx$#;BK^-!V_wAp=-g$`Py=x{C$vZh|oiRmL5u6!KNt)EVfN`5hdXykUQN zbb58|GKQ}(GTAb?LyICLt;m=O{c@|?XZzfJfOB%I!yPpZUvhtx?7^%vv=)ejkCf4N zc}%u;Dy9$-(X-dh7pl2beNH^}ggm7O^bO0S!BpOXD64AYzz$`l@w*Tujk5BTMYOeT zbt(EZ`v|fbAe-|q@WtTd%lFa;>}iwC@KIPJZlRkh>%(qy$A#i^sgq90tKz41z6K=4 zkkgO^Np+#EJbh{ll|aynnAT5-e7y|o%xj^rd4C^qT~ zxb=i1s{&iBs^L>s&_iQ$qqT}GjwYY>7T-}l^esq!Kqpz3pr>=@pxxKD;n;>YIoov%lPsWXN}q{T1$#a!cqr(5v3_66tt)&PYEf;98Zj;FQ1cWh{~XvxC3K{3(K_^7=5pc2 zJwbYNaap(St@KUjun&slTEzXQO2z6GyCAAIn#ZDg7`ZogVCf%*cMz_YtXpSI>+X3# zR^<;#W|F_`Iyv#8uKT7@sZ_D!FuOy}+fXSaJddB|fxuIa?niTXw6xP)D%O zLD5)x)95NwqpjBX&(XP}5$ZZQZd7~&r!2ci6Z^PB=}BlIa(ctm1D?2zi*J3UUYCq( zT55&H)RINnTu=E`T$C+)cQho(Gu^6f&CLfhYV*jMWcJ%z%j`hAR%LiHH^~JpFY#|_ z5d*d4(d2pF!w%4)@5@pGa6hvOgd&-zn1vZIm1ZqO6JRs$;;@p_i_D2UX-aKCp zk>sx;5^G9}Mj(Xgy@YK^>9ey{AHM%$6z@#R#3 zqCK#6(%uEKX^bENxg)uA(VL!|Ufa_( zul|1iCgOh(|I>R5qTrR_=5tmnbfWM(pPk;a!}QLg$w6pY$+E`Qzkom9{e{rJO!*Zc zxrEYH_OLt?7}acE46&H?X!BjyQje7Uz0oKcxT10-M3uQIz(X~e$?i)E88~K8HKxjx zz_e&+RpFg58Tbac3ch%(H1ON13I$GxOz*_BKQSoGGHl;y|N49Oa2oxAvf5&}?)%Jg zT13PAg}|s0L@)DZuW+Uz12bWO;s4VHEfAJ#nZCTH>17ZK5^Cn1Y}}469sK+4qQkDK zX2&X~;lY5B390ilv^`%7kG>I@-@D=&m8_XD8sF(=?D$bX0*@et7+X}q+`F=d%#UAO z?An?hK-gd9D6FVBfIi%12_9f8-f9_w*dlM1x#m3V#Iz%3U$`LV{mzjEv!R8uZ) zyX54T(cmYLVH-T1(|-%z%hQ_TN*JvT){7XcY)Q=3O4V`xB;wKyvZz)vw#xehz;491 z9|y4iUjIbO&!^tA8q^pH=v-M zdK|QnbtJJfdMany7?P0gg(xF`XyRlY+Bcq0edmL=F>JqUtaJQtn@>YQUvZW>i;o$d zq8hlMnG`zAa9{#CexkCgQDX)9&R-Cz{HqIB?bo!>_b1RxyK^@iGuYmJ|6IJbZlj>xf$;Ijgj`8MG=H9^&D;!nO>D;~CjM7&w3q$f zxK&y`W}s>R)l`vr1pkXJ8lyk~!Ox`85DVpV>f}jOs-%Ave)Tqxq=|IP9n+Hbt9h>I z`AnVP9Y*oZYe8sdH|COV!2beu`+GYnT5#rTX$}b^n{@%YRCkd%9T|}0w*oal@Rya8 z#XPjs<>30@7C1ZWH9wpys8!x-Ren!KXtBH0iiM&4$9G2oE&(cHQ}V56vwh2(omh#o zf);(ykF0}d92pr0e>?6GZb+lHR^kFa>mCGaU{=(yxyaJ8Co5MOpTO(o14CibF`JJu z>w|?FS>KEEm#?ff5d|fLkvd@Nb=>TU_*S_zTZsHwexW-0NJ*K@-bd?`Lzg*;h-$fNm_wX_Z$Vs?+`JGOPF&phv zs+#f?KW}huh|>H(&XtDqf4V%sSHC{`a{X6#DTtQdJ3LMDM*3B3C`K z7ckx7eiqx`6#hne=fU=iznc4#c>_K+wl8`($qE|AqIY_E19$9sqJC?y7%tEnD-na) z=(vC32D3P5Xt@?8nkoY#6fUhHvt@%Oqgbkmevuo}&|MVcY;7sVeo|r=);!k`Fd%y+ zTyucUjFMFJtjY;Mixjo2Lw$u!n@Eh(J?(xK#W`-gKqea6@hTDNyjXV}e`@gJ(_Ez5 zgM4L6uun>I&4J(O(swEVOzv&K%Qw8ZzWL!{m4mk6;n>jGGU1(o>$MU2B#Q$%VX~co zBeRo`!qQ6)F%}~yHUBU^IZ~prHcIy=x-5TsqDDdEPxph6nQnhIJccjeM+1?<(o*$U zi8C`tS1%=#Y>H^I^x1UPnc@2ne1BFZ7rwrwvb}U=P;>&USxPM|V7dKJT6?H|z=2b3EXF zf3Kz_f&E60IkTs+Db!Cs?Te#}L8S)uc_wz%aR&$p6fQ3eXOZIz5 zeqAqS{YKkdiz(i!SvA_b%6ir23T{!Q!MEMJ@gi{N5IFa~98loi&gRRnYjq=oRFqAq zR9U6)>pe1`%u77mkt{R*@SsUD%|UU2VzjLsy=wVhjz%|HAlJw>PoMyCCSBmm7j|6J zENGOh8{h}4wG?L_bFsFwddd5^cj)Rd`8)MfxDcxHOl?{TY@k9Z`)jN=H)^Ye!*BbY zx(R~k>Mw_gYt9G0g!AlB{{aO+uH`i>ksWs&Zs5# z{>}wczmNO1#F1p;cw$x2ZW)n(;G;0rBQFS zLy&!0)&-cVGfQ?jZm^>W|6*YD7V;Oiuynj-j{O^u{0nn&yZ_hhA1ld+8e7OWG7SF| zpB+8l%N!p3Hgz0gMb%5)Yd?n(f}>H)?f(L@b(n8!VT3gE7Uvz2wRzU)qhOOs&!ztub?S5z)15(MSzmtYn zo*&*Yd9eLBO%u63FtgUKIM-qcdE2|>UQv~}d4~>znH$tL<;1w?*}Jxmuof3&%-!u* zz(^DB^~#sUoA8(K-Tr!Ck|&T^74qcs=*jGtB>s7eZDEYtl^=J{G46Bi{?v=s4pUQR zlVGHOst8r`g5TG>kx`y&{1RRQnqfyexo5dwdvn*byTONVY`rJ8wHDa@`U}sI3*`E> z#)Xn3dOp|7mN6#c&YHbu6HO`6I~df5gle|PW;VJ-HjnXrFi`feLOX5iS~{z!O=2}T zbEY-&5{uRd-}2&oqx;%h=3a?RmMvvGO9@NI`fM9vSIcj}B$^Yeq5V2i2OAuI%+B$t zMw2;s`A=4RE_IsJR8vjuo26)!V|nw$)cQ&4X6)|nUB?{?f|ZW)+9Mv%GxbXCzIJdf%pJVCQ(;qpywG z3$~3*Fp`Qy21KACdKz{a?!e39R{iyMQ}Ux?KWOUpqQgHmq)4x6pFnbKB2IeVe(VjM z+YwB@e1ER`DfrV!ap|B5Jlx5$ZlIv&Lc*}-QXioA%hS{L#NndLMm1 zF_>*2_31jsvOY`RR%l9D$H`|muQNoGK?xj;=@r>UTxJErlztRyNUG5uVmWlr)Wfnb zbk=8sJwRP{XTcrD0%5LV%M5p08YZV!%ePzW-)MvNkj^z+@2Bk2P-Fb7j^6JK%J>E3 z<>ONXs)FbHyJkK{Jh<$jl1|uip867NKLq@y%d}USAd5?KwkQa>L3m zn0=wW)y`7c@+$F>RGV!Vo0!Hs|te zvp42>)o|pkVBh8Sisa9^{Zl6;x;?A9ND7f6bb?2CUye%{1Jev7?h{i=hJ1pJJQ2f^ z-o*R7-$peVy)ffIEX?G^EI~X|!Fx*Z z6g_?NK4lGlHDzV!FLEn4(bgI3v#XK|)sZ z&qmaFrZBywZWp*BOsW$`5Hk$ zXso3FZnWbYe&Im&**ntY>Jxd^CDG^LD+%}7!X44N&iby+^xw2#O3xnZH)Q7>Kj{th zNfWTtFk(`YEcubB76og`sD7uSN{(0CGE^MYV*Hr|4GCZXk{3-j_mVa7`-Uw76wgvc z%YZ4rYS;{lhv%ANhDMZ5;(eEwnqe7GQ#J6Ie!7FISIRO4IJ!Wz%1h-gU0>mc=+LoC zKEH`(Vq(eiKiQ~%D3%2u8Q9hB&osxoB)lidBaqZU@FRfO6mGZ$c~l-ka+s7WN;n^G zYE_-2(W;937x;8$4cYoKJ!)armrB&46_*9)75Ct5;MASg-yc3qQp&FCl*&oY8Mf_jz{>4NuBWROCOZqG_mwvpn% zP@#mxak(GYd(B(^>(6(`a?H#L_UU<}%P+H+{S6FA2}JxQE2Ev%)KFs{FXB0r&+f(1 zfbW-zLpt;#y0&XmdwyN|df<`+SRjA$$ikEriD`&gBnMeT)f8z+qT>PJuua&i5%(tL z$S)y)PZQ11%0e@Pd?Bc4{(`Igp9a6Qi0@nRsxYPt&QFa`)2!?FBnpa@Q`iS5Ur^F2 zzPwYULb|oyQtFaBF*dV2fxDc6A_w;AN%9i(4FEMITmRno?>Wh%-oGy)V7pM;%^FF4 z`Uc)U^V7q-Bf#XQk&dF;ob}6`sIvK7Pl4b(l}$-+8P|+-Fh}!tl(@@S&&co|)agAX zsB7Syjq(`>(ZFuNZt{51)MZFoBFukoO5di0k~A70*@Bp2`2)}}kRXm#X`s*bRQIRN z>{5<4LcGJ;SH&^)AByZvhTT3M!490|%;i%dYl4NKsI#{Omm2jim4$YVPU=eCuHP`+xWCEJ72kfn_!kCFwdNUH=e{jUBmBA~1apfy%A|P%3 zlD*Tg*RwHTg#*j~Fff4`{Tp?CAQk7xISEH-NUG8({f{9Dc76nBIkr)lq+{ldGU@Po z2&C;@s_XOl*%~TKSu|fVwCbN6dV&@jFF=&gc3WOIHNZ^$gRdL832I!a&_IpyG_9=^ zhQKu1oOECq2`3<$HT5!9Onx9Zl!J0OP&&UG z^EdeG`t?E=^X#!(+=bMESiBt59N(AeGL+_v3qe{nT7#0C&a(EH+7>|p%-CSQa&N1y zgblTdR~4hmJGy>v$$f1qclRwlq)tkoaRk7^C8nmY2&j_M_Thu6US4t+B&q*Q==Hpg z<-Tn}^_|WsY>#BXsh^!WUaxPtcB-y9Q#DoRQ_3gt$__DvT13w-{`t5osZ_9XWs9L& zSKA{d5BQ5ay~^pr$Ef5`hzz4~JW$?_l+1Y(oSq1#>FYvUA&APJ@yXC;L$$sd4UHmu zY+xS1^>Mpn*ypG12l82@U3aeOnf!`e_oeSjxX;bVmnHjbU^A+@S3S#NQ4z( zSF^S9rr0R*{EN>kH)7La%2#VLnp3Ny<^>YI#q(AkeP>dS7`E-#H%AU+UlS@)b}^IY>t&JpvN^&Xm66(&EpIMO2e41tr(MbZx{&OL&r1 zuv60hknnTD7Fp-W%1vYQOA`{4VbkY{c?gnS8B99_CDoJCX5uiuU1o^xMGx1RJoL@b zj>pKLZ8Ty*io`IMO+|f0zm7BM{ZF+;jsoNPIob>GOa{?rE8(&0-HWla0Bg?G!R%4U zh3jW7BT@yaU)44RTxH?TB0OgvCHHYBHz>;b>W^_Tu*p^f5(LSfReA>_sdi1Ndw1!D zZ>j!J|H$yK>b7@&?vZ>$0Un%T^N2ix_gn~q1|1K-`4%}YJ99}v{gL8*_Bb~4fNaxj z>%o?z!x7wCg6OE%_FZ!%T5u!wxoT+PCk+aEeP=GZK)>;Cf88iqm;SMqCcG#7VxLHf zMt{lJ-Z}!~ofRnUKAWpuj4o86dt485Jo78vSTic$LJtM>`heojO>%zD!5iZp zef$T*+~&&%vOU(&UtTVShhC$9DBPdatrs$!^t*_?ik^b!I}0j$i7Fb=JiUQ$%LFB7 zAn^fp&J-5U1VTFJ!c+mvIqqjiclx%QybtFaUeCPBU=^&r&hD11v?4!B|J|<36sm~F z2oO;XPB$K?>rgreoSmHPUCp>Z=j`t(RKBqE;O-APrLJBpAk{LDVA>$1ttX*2`9=@Q zcbJFHbI6@iK3c*Uqrd;C-iIa|u)Gf)s}R)wQ6qifUA@pEfy!?7AGh{n9$sqKV69k6 zbq&guToqK4na{%qlyTPw9_frKPwwc66@l9WZr`_bYN6(3#)tH^kj%hty0x|zVSyh$*hX5YXvBiilE-1Km+PWYAHkn{Yw z%#N=+ntTrioeI($p%i}I|Gj5;q?m#hAvCevR@7PUpcdO%bvX&!9`7I8M|rvJl&p-{ zHGS_Z|8py?-pfW-CIkNzM~@GQHOQkReslv}{@EL#-gr^FQ6HeoL3TELD<`&i(z>Qq)jt13VxtX(ZL-s6qOt zGEUp8ihm-r*0{eQ?)d8Y;`tv(K)^#W-r=LCxur>C#9(UCZalPVdd>epZiYalr&Gvp801S-z2$;Owh@>nknDxABa0+(& zE|7A6$kZz3w>|0bU_i=^f8MWsIj0_4p85)T&5hSOU}ClC``;vr@!>UPSHgllUhSPz z;^nW)7OUxduuBb_9q_?euQCDdL=8eU5D{s;BiV~f(=od5N3OaWS#ck7W=iT+l?;Yu znb^0lRYo3R=P#uXEpq0tEmtgtt18fs8)mf04u5lQKcrab&NO`1YWz_9liAGT@8%m% zC7NzmAv-O4wliVvepq`G=*TLzp`bY5G~tg{j&#Wc-Z_3Oy355W<3+{=1r@}rDzdz| z^h1@eLK)hg8;o=f>ggQKSJIG*`q{$g)ud!TwpG)t1onfTjO(&pdd8{5=nUgUV{E$O9WhCH9DV*n<2692(AqQt1 z7fhubONP}~kIsuHQW_>==!=8t=kDq*q@M&|8EU+gV-^*JN7%0xstx@>>m4Ck}RY z_Du_ZBw(% z1u1=+1E<{rz0WJ;~|dqQG|aqo*x=k6@uN?G@>BYgd2k23h`(RYOsMV zo&Lzkk(IU~yl=Ge{{YaDN@TInPyisiazaXW=1J8VtIz+30lxX^M@b17w1V$B>E?c7T+)$gkG1lEJ6QJmS;}!I2${8>TNsIhlAed;TM1h(z=oNtfp1 zH|09sTlKBK?mT)SUz08{K2$XTyb+8|2fQ6V5!%{NxEs7!`#gB|mUp)_=FyAim_GWw zBv~xLOuo)(!^XTp$ZA8#s#PriCLK!Q)h_$@3VYA|Tk!`btg2So&NtAfDlsMyo*>Fb zpew8-ww9jlINEl5)Xe$EvITESw4~G|K4v~P6yd=P{75GxO|^X5UK1=HpZMY+`jC+A z#mo2?_fff0OPqjKa~~6_dH~QfOGrAx_7?J?^O~hkTGQ@ z1eV2^C~QFq@`2Cn3!Lc6G24NTc;>8HpNPHs^)UME3<1_n{Pdl2os;Q%o=soCo3fYs z9-nnCIfWWff>v{bJ%&kIrh56t%zSiT-cS(w_km(vZA2X+c-@e^Rb1=U`er^Cg^&BH zxl|fDSA;lRt%Br(Cg9#uQX--s`)o-5 zJR>Ao0A3-P7gSAkzXPP!HW~^!5=^Idgn%so8%_o&*Pg#-nx%M!G)tU^8gr)O9=J9A6iG3+OS@zQJ8SUq2yc<CmV*YfN2mSEa?Q;&q_N~A?May@}8ECZC5_Xu(%OZ*epRnT3Ve%E( z`ZNEFEn_iBjlfaHmkJdN8-$gm{Zc6iaQ6Yjx)RgKllsRGn-f{#X#8DBVw1wA10JNI`>73j&xY zsI^0aj~HHT`M}mf|M?*VQg9?J2d8}K`0#><5KtTi2y9@kKRfF(v3=TH<)1*jU%r{W z*&wWzr(v_a{`-XxBq4!s=B>BBukWVZ(+p8I3!6|e<6dE@Kp!C2u$RZ$)KtL>5K+Vf zfx1vlodF+)?PO1N=YA5HK~7%XJ=+Ilku<$4#S)r?M0l8V5N4;&XUAG{AJ#Lg-Too; z&J%_EEWQXf7;_4H;UE#`f4tKH@)s!Sm9K(dadkz+S^$sL8-Bmp@0JD@#|2oA$8X5+ zVg$r~1@69e7@J5%87FNo2T7tU%wXA{rc-7J;QIJe`pmI=!l18q|!3U!MzGT z4b~E0C?qpZhp-SmRxpb!)}fF#`ym1Q%+xith=*hTqZNMH8cDBX>uZK7=BS*1z4HY^1ccXa_S{?07tdFIUnSaM&*w9JT$Uf+6VxJ^ z<2Lr}!{rt1m)n=oP=Gd9SRUGxM-@S?ev%Ua2)ZA>gHXM{OGDnYoue+f&?NF5P|+k1 zTmRu<^@(LWgU9ECy%G7%bNLKS8qQ~aofW=SZyc| zMErM|fKja>oP=dD!YS~#xUYHlEiy@1XK+ShZb`52&o2mDNRD`C!yCI5%#Zn};n&vYDO0)87vgjS7<|-Vi z32X}GlZDxO1w^%X*CRwGl>ci(*~yWs(ZErQ?v-U7RXTET$F)9Sv4QB3s2k_~53Mw@ z9yFX)pLn}pCyG4~ILM$pnwg;x{F>c<9ZEdr63(=fPvRMcc+pt@MQiNS=YGo*`UUsF z#*C=Jchn*gUmxXB1q+M3CyOF`X>a`A&77+*NxCl@i@vc?h%{l|N$t=RQJ%QhOcm@- z6V64zI)oJ)A#V+)a`RXpO<&;=Ji@hJE_=LG^IYlqe%~p^BK#-o9<2x$XDH+NjGy_` z&*a=$^u*eaR~@RRb;ZTLFDx6yH}tuLMO{8I?Rb$fa0&+$>)CBxREI7Fe;Wjs(srnt z+@N4|=Gf;*6Pu{^=?l*EUhVISQHn9<5-Zha<5Pc7R=4<79O@-pyo5&*SK`9dQvU)< z6f^i9@jq};)Gs0>0-+r2_Kuay8a7aR;Nj*ecaUaLAS$+OcOo|xB1WXP)zm^q!eXHq z&M7B%9ao)Zs_Lny$M;V99d$m3f@#pFBH#0X$|>gKnYOejTE@)fjb}_wP9G6boPoh1 zd>VQ>PH7BBAvgX|ik55t%%eo+?#A75k&$Be_UpiKwXIAG#E%OQjiOJWf;uv_eR{Fi z!euAGduvN@>?8Ad>e)f1&%B50bu6!bYo;aeD9+HjFR*%7xPw6Wx zN|H_AjSPAyD%VPGi zt=^?wzqojP8iYN$nMcg%=*WolOidcD^w|!4@#9Lc?^Jb0 zBvdm!=X8CwSf|o)Gt9D~<^J99!e9`E!z0hKKo`xZ@`Ao5^c&jyNH70A`B|qxPb;n`Ta&$@!%Z}d9k*9Dc6v!S zPV~zCId5Xsr|6z!B&yBbTFzq&x0-Q^yX4MZ#-e#WimKm~)h5=z@bFX@AAYL#u)=Lb zI_^mGOxC+~>}ge1&w3Peq>$SB zNWg!JB-8&d_Sqlxrl|1cnyg&}or-?H(|b{zp~&{~?_v(Tmx^V9$J`^( zItZJNS)Oxo`qGcu;$>1{c`<-Hn>Vl%zMHEqBLIR@)I<35_cWF6+`7rd>eoyPLPg_!9Kb zB8lfC;O7<3uA3_R)x9$C^;6Y(PLB>>rLEt?!6(+bad$a+c>vPVUX`?jm+SV4QjKh! z=^5%dIajB+f@;BM`1HpQmq*^e@-zX^KJ1l=yzz>Ri^MbxRq&M0>gIfWHb9x(qy=|d z#qv8OOY=S_K)8VU(NLX}t0V5_isc%6_)K@XsBzl!L{okT>7g<*2;V8?xeEZ$Asm0e zoa-R;h|bQHCj}L=Q~!HYiCV$7+=@fIrg5C+F5of4(2In+`L|%VHskofjbn_;V_b%N zdtVzdC##WS-W~Uf-&q_WU;NPrNE<2^p0&FpE84d#Cg6sY9+J(UH8aivk1BE31E0F2 z+Q%_L+r*w`ybWmhO{RFjGK03=HuC=XkB+{bY z27o?MZkitZiP>97%h~n6PX6K`rTjxRd1A+W;S`69l(j#JJ70FOJivG=0&u9In{XO6 zL(?|q;P`rOoU4xOdHPc~6s6=sT8spELU5kDx>#66RtHv`WmRVPB78wNLA#)){?rQ- z<~+iY6>I={_~7nKtJ})#+h8KtP~{`J;@t7F8Y>UMy7~6!AG6G)>aE(dt%~EGrd;2; zjq>u`Wn38FK?SsLD1{HZ*^akkHw}f!B`=vjhYt-6D(F7x_#0w2VZN-$$zzL33c0F6J}cUvF~*R#i{#eZ$`>@BbV>P_?m5s+BZ? z75w<0AA|c#El@!A^g0!=3SD#;k7ZNH-Ej#Xa|p?I*C;##0U zaZ8Zm?(W5*KuK{e?vkLzy~Vu{Jh(d)*FtZ4&iTG|*Inz*k2f!wBxGi`Jp0*uCMo~Z zn)E%tUlJ@`v3iv8Y2HlnFU9 zv6VcDh6dxHy=wV{g}ajh&`S4PP3EV0m3NJ-@5VBb*3yY|Cy-X_JCc5g(%Ojx`IQQSXg24FffWd1eGKV;FK8v(vv1;b?r5okOZLCpJh1xm{2u62 z_a-*J_o2@zI!VC;8{I0;xdU5S&sM};ms!e64-q3m*{fbF>ujORC=n0N?6`YXq2m_T z4)p*%hvhQM9-${ft|N!u4~VZ<&dAo~yzMSXB4n7NeuVOaOHLGB)WS9!ye5z0V?1bQ01V_htju(!TJj>3Nw5fqnf1&Xly?Pr`| zA^z>-r;{X5m#ATvWm_b$vic|xEAvqK0@(2*bO=*dB?R=do^{CKn->Xv?M#=poWUd{ z=jjtROZR)B<`PY$-|ulJl?VInYTMgnLq9~J==Z6^YB7RQJcH^a6rC&R`0E}*-u)eH zPVTb$UhyxM!xqF)`>lQSK2Ei&=%5}4Xz1(DLxU;@b|8KsD5jqE0#Ri4Sb4FdWHXM8 zmsaq~gC{dnmwR$i9~;OYii4kdHo$9iTMc?x##ffamUq8$~^vAnv7zYq}KJzVp&P81MtF1m(*2BAhZ0@Lb=u6 z2K&#xS7NWx6qYby4GZB!GIASWr>GMYa7Ih?MrkGD+hwluJ#!DHgi=aG8{DKc&EAlx z%^L4Cdb_ZxUon;cZ54_K|DX0yRejAm&0p06`GZsmY&bUQ=ma>{P4bU@A09wVsG{EDqp7R#uTf`@uTSJy0OqeYo}|RtN-Sc>_yxi*-yzWW1&At3I1EO z8+U`^eHYPwUv|lF$bL$l@MMK884IH~ce)889`#Qc&f^h%i~%zj37v@7j=TDAJ0m*l z{^{h&szAI++pm0=1Mwj#IU9Gwx4^RMjxlO@1p#G zs?_PoCa)?`Ol&+I#5rgIpDldba(keck_0~OtJ@&-;vZG~MHN|@S85kTTSRcNi>1m&Da6_n-73-wGe(l~gg%;*_ zEqIk-d)hsOgB~qMta5&+??oCJ9W3VRVtp}H5S3YR^t`Z=^r_B#?bqiIk6Yo`88tdH z7I=9BzWYYjzI|cEgXklC=<}cd+t(Y2=wtlbN7t@1_WAL=)8Wl3$4-y<#=kecfp^CI z@LwqxhB=6v#lJVX2PFUf^_2hLQ{VqS_4i^BRHifL`uF*P`*8pHC$~sEMp*IX_9gewc`i-+{}a_Z13VLS=juMl`=j`U@-X1#PToUcLrrX`{2RlhEp9`Nv^ zm~ss@ufQ!D3HE{EW$nNW-Qo&~yh_6kA~@)N@e?sPAZ2h0Fe-4|Q~zR6Jd)r4de6cA!( ztCJpryh)sAa~iE(p~NERH`?>}n_{!$bkgI@mj8EioYnq+8fbGbcMBrX_^TiC5c2vp zK2Wg&;x30V?(hUIC?VyqlvI2o4C_5}iyjvp?3uL88!ES42eBk4!*$Pb*0X)X|| zuKEyY_tDm3G%}Kw0VLqH-2BU#K8Hn2x{H1^Ml8X8DQJ(w>WlOkALKbRRW8L-28+=9 zN$fzz`^qo%v_UC_nr{amRGzgT_W?bsok$}Vms`t1<%|hy{h4gITLpKae7{^x3>l3E}NV&2n=SVbG)V`uJEVbhqw#=$CxFqtsu*&%y(-Bz>ddJ3RSpO<3@y5DJ( z^|M?1WjHo>#OOZtP%KlB)|p2=dEXpIS?Za4D7FSVob!2#AAF;fV{yPQTjZJfUw<-8_ z)@gURL3M5=_ltj!UX+}m_D+jy&-m{3d~jdiNtY#lH?1c5=F^AW8-14Wy5WO?0S80a zI&|+`*RkvUYeS%V8g;I7=o2k3YrRIkc?0&X-*X==n@w-D-@KVin8|#j-|Ug=_-bFj zQw{NO=mh`xqUXq!MLWeP+Qo;Cl4=gBgBr@~4oU3Kyk0-D4{2sJHu|dr|5~MgT!BQv zvLDU%-$9pE<{x1N%}Va*OTzgDy~=ufx_Gm*(%#O%_)SnkG43;Rt+c1^r&32w!m((4 z+rHR6dP(xj9KpArWDJk8Af3&BkorM9by$4U;tB$w3QvdI@9Vt1v9_1IYPz$}ACbP{ zZJfxg<$aPRw^?r)A+<@?nrTW_QfJ>~)`k%`2ahB+gkMpU4IN~8oP0XyxqjBN z|2UZsQ(948n&FOG@^*cArdg0%4F!Ck7gjia;;^R6H*?l#1G6z6*ol6zvjlF}K7>d| z8aW*-d^fbt$d{BGXObM`=tyc$rZWiI1Y|Z75vgDCq3ah>0MA{uE_*xXn>3x)?wu>;GBl%}d6f08bqo7Pa~@uO{Tc~b z1o83;@=7o`EbtUNUU@;HyBAUUWR+HAi8n2@+-tdHp+jS`Ed^+EeY6ZZ78^yIcj51( zAYo+QMRecikum?9OU(a};b(}3>f8*8-VtKQam$51&wSI6VA(XG{LJ{0zRn@DL)Dsk z{#+*FYtQNLlm#S-#UE%Z>rPqzmMfy#kuFZ6HXX464v|!jX$iH29_05`0wRjfJJwFw za=I7zYkSuy(*-8ty|kDT60RGxjwx2zEfk|>!Uu|Acn4MG{%)^O$}2ipv5DK{N))io zuo6FXPfg+hYCrZP=@KlY#0pSC$&~jNjH}D4uAP8?kp5@&2(D1=$}_r{9M}6a`fMXU zSfw|YqRJ*UHP8?xurILc39(YA%(yFM7Q-muQj8fNd}749OOusQHF0Tw$PdiLAfR8$ zbFdL&)iR-J?~bpvR~@gf(3BCuR8A@FH&9^TLFuBu_V6_hBG$njC=w_E7EF;wq9a^(bqN9=CozXHSd7Pp`e;SS$z1vliI%RgV1 zeY5q%UPlRq)O~d*Ga7^znfF_475pW@a3$uVTZrgBC5)dW~KKlr8Ly!hxX5y zh+2o{vIS1wE0UF=Vf-q|GeF>)vWm>~44=o*h!WH~jQyMP%GR;gV%tW>*6zzA*vr9O znxAK?jr*Iu=%Hm+=sO`jccG1ve~@BJwFVfQky7iI{}!P_>-uVkN52*0;B`Z|yRrs|P4JfEE1Ez# z3Mjl5Wzx5@I1@4A?0#tHx<1c$o({Smad;zBT|lZBG1E#w=XFa?%DC?%^VnVZRxODIlhxwidb@0M8Nq6 z=`%ENO`|0Lz$?y5%s+L^*Q0ol7^~H9U~NPt;h$<_DEC&a%gCtae1d-*dFRM zStd4oIrPQZ64%JGnxhYAcB-WNHLA+FF*Ee_loDC%QKv*ZJt8*yC(cdcU*gxY$sIr# z{W#)d^($uJ11oggPJ2LdeLi#A>EdAbgsb{0u~El^P5p3e>FY$5X z+prGFO2hN7(r1U+^s0sOKDC=ndg*ECep_^pl8<{&<50)vck5Z?xfck z_74yyELjqv1Hk1Ug$P-gt0Q?cJMQf)!L2eupIwmQ1269mgnfyy0X59l?mK0vySYzo zjqWBAemhY=8a%<5BP-}$3VtLiw5-?CIxOAxBwCsZ??bWFr&CZqF)^ghHXrj(W^T}I z{DXA*2dTRHZ$JmYCGJ@JM`#)(P1*jn6&gnd53@(ZBc9Gi({-pcx9Lb+dLZR9jl+pCHpj9qbyC5Xsla`Y#m&6Dfy^(5g>ws zQ!AP-Gp*yt>dO|``q#4w{^Qw{3yGbmyNg;NxMyR0x~RJm;o|zs{-gk}Stb7@o2{8^ zjebflkI{&-P)7@MuNUvNmI4)RAGEPDeCTc5f7*$hU%;bQsgn*}ywj_}mwT9Fvl7Cr z-jzV8eW}bs_>Ns{u1oW9@QX7V-t9@YCfP`@eXvfZ+ZK}FE6Pc!rH!=}b2P(LOBKA9 za%wStg!!9^n)^r~u|LvmUAlFAvUQORP%p#rEVB7+Dqb+3|MKT96s!QT?4KiD@~TYh zQ>kb5?_iAeHCiBZakH9C6}E+0cMLY4vJ2Z6jcto*7thchdlFMiZ1< zLrl?H+3f9#d}=m|GOT#7fh5nh%>dAbnwpe-&pN6az#Gi~XfN`}EMg_u0^3+O{>1=? ziKO)3&F0uH2VIRqjArdXVhwzSI4$*0Q7JFwk!XJuNC?X4 zbCqMfAj9J@9lW*n{}!^`Xop+;sv;&fpr=-%nf_lbTizP;M(|+Xw0T#h9+07hyxIe| z0}{42tm=Z~K^5?&g49I5f*=#y&Q=GW(|e7vAuQoIR5q)vj^|EF6D(Ugr~Bu&kA#m3#tGUkdA{U4t&wgedC=WQIAe`A8&s4PSlWo!r3E;U*&sDo#RHJIK4 zr{C|hx(d0v&??bi zj}SRAYx8+nYAA%#jfvf>Xp#FB@)pDj!Sf86{5i`lGd2r%NZ7re1?d?cWpCx(AO1n2 z_-pHwWvUzOEJDdT+6fjx+d-7oWS#A#KNBv*6KNc{I}a!UkcA%#!ho?#Vx6|iKS*$( zqk$T|th=K^tHZf)$Rqw1L^+YrOT1I0@(Tr_WSlK1VB65#gYxt!6m0zk2SAy{WEQy* z<0#1k`zZHjK5Dmrby*gj=y|&;AGYd8v(7gUk%!T2WNhTDJ1YUI#^1 z=%tsNQS72k>vO++45|R+y-4PXrbNUQhNo0;s*BDHtBQ8hB}EH2(Iq9O4AwpvVq_$9 z1wA;7uu7q{!ObQYV?kyG8=cB3ZOefmfHn`}J%+GKFY3*eV|o8=}5a+y2E%$}fr-NbQw%XsegVuIP#)wr9T;UR|fHihTi zfL<6OFuCrh?73a>XSoR^P|OSnJ27Kviow1?rKIL4ncn*mmEly^AuHe-=A zinlkR+27@;8x0=0*wD2t52Z2h5rkHltl-~BUUM&dyK{KBOP3Qcym%zIRVzyZaPy|q zl~cm%uBqVodtpNh*E7`x{YQ7VPK^#0y00AaaaA`^pM?~3^{AaR8Zx|yHk#S|gY-pv zCal4?#Kc_X>zIRN>%MJaR9B3xP=hBp!|ZC|TT|bM{kwPLV}x+bu=RdTZzqIybwa=&hPg#a?Syx+vJO^iG$ZqC z)Uw}@3Dn{Uj%|m$(K1cMCx~G)?bk~3>8)O)scQD>YQckSUY=qG-1#xhZZgceZh-ub zqPKRzVSVxi_MimJktiK~h1GW;W|@4?X5n{dj9dX8`h=e_$FbuK{>6%!|6;|f1GsKE ziCG1rc_Weq{*VP$`?k39+S=MC&EetU#mdg%#R1*QVqso`2ccVcK$w+;^*u<{65h}r z>i3BECfLfaH?;iFJW*M;@o#$Lq|;NokjTvkR=mqyk&4 zf|Oc8ewL9yAKJG-Kh6OLzdFsShG9}u8y(uJHn_Od6PPj84iE6Lj5XSHu%U-(8M)S-s8%fj^NqU5@yI)5$g!a^EXNjhp^Jfv4gD}@&glx{ zeS63$MSMtnlpw(1$h{d#XkNH4^lkGBn3OutmFldzIrax>YW6?0ory?o2!aq1YhbsA zW+|(Eb5Nr8^riB%j$I3~LV0$3;|0e$+B4mn=-N}5qu$7w0Ttdc!tpY+#d-sTRyO0+ z9rg{of^c1sH#a)aW`)_=jpJH#v4bhNqgQ1^yAPi$VQ34VjJZh-=jaH$-O1F`a(rup zJw)CmNH+>XS)oUJys_S1EBKlQfB(QQ#lp;)A7hk!Bgtgly);+cF+TK8f#M#zYW0g5 zeU9!HTyla&X-5-KCE25}RiKU+XQ9RCYB_@=&QWx(p4mUnG<{B7J)?Z%Zph$FBE5PF z%Q4%Z)FmiR$|y^zT#F9rd;ieD-}`feSX0;dMkS3T!By4G^+T9hW61F;Ie{G+_?o(Sdri)egG?Z0!EJ=m|1cdMa3CEDV|%>{1} zoA7O}=V?;CYPsX8*0oF-qj;8*f=dLoI0Y`UuwcUlzFNW!iQdAf|$(paM!PE;TO+G2JYm+V1Ms!^k<$*nGN5;xvd~p z5?wz)D$6=njV?fF@smaH6=-GXN%3#+Me?7eGZwKGOEw49mR^EU@K+-LAVJ}dxUurL zWf;e?s(@?F!Quo&Ni^{tc2RB70-*r-)h^PGK(8;)X1qr;j+-wWG|1~`=tYB71>uV0 z(nt)tqB$MnRZvy+ozd#%tae1tu#`gBHGX|p zc(gJbi*1gwSJm14X!9?HgK#}gc4_Y(KZfAzYH03dWmn&EPnL^|epuO5wYtA!QC|AB zZb?A?p|Q`ziG1E&jFb$hX4+es{{CfDz6>6RMN#zg()yQzaN&INdHt^-{Z}GeRP1a3 zie+KezE^9}&bri}Wwi!%*POG@^_deWU)_AyJZc8GQ9pzWdO%eHm1%Z`-j><|M}R1} z9zMwUXc^(S5%!bvFUi#_@}P5Y?#tGoj};i(k+*ji&WDkobOvCjnH2v{yqTCjtVaUu zsuYIGt=6B2(8E5PX_CL%8J(W#jJ+VYYK_GTTzpOCi@HlaWgyiW>b=*&%HVNOAjAfE ziq}1Z@i!Ot7X3nfuyV`?3AcyW8Ctb*=`8Eh=gN6LULc&q{^QJZu+!#YCA#SyWMv5u4~=ZXDimNH z1By43kogXELfhbNLsAHD`4YkN%6*MAwzEdfQRF^*8-FCD?nM0NqxN{LMz8e_M9N{z zvz=%-d#*M8)|IGB!d$HAu|F#`qMRWyt|TFEE1O}TE+{l3!?%c=`ie~>tq!{r%P^~- z$h)+QT>L26O_rbq6~e*T87@#9OZr1)sw|6!V2bdWJShgb7>QDt3XCSrXRq`+7HPXn z!vRuK1ookRZ4k+KHXd362XWIWBeuK(HELP-qe)TzFRAxTx{D zOhH8)^_H!r>I5v&LwBrmhsbqfTVG*HJQye4{Y*@IG|$28x0X2)EAd8-R&)7D=dRHc zRYlHhxeq&4V)^H0;v=xlICE{LWKms#*T;l)&k3mxaL^6TPbJ;{s%XV%UVtN^53Y7DD5 zY#MIqoQZ!G9I-+7H@>;H#yQEkS-iW;V@bm)pw8atplw~x`*85lF|U6&ax4fn1-5)a z?VseOB~H*DJ6T>#8$7uz8>Lx8HSap)5R+-b93Mzf^eLm+;LWpP?={O?S5S3ZUxT)j z&KgL)&bhKLwa*C)Lw?{wW)Ag#J!aKf2~70JZ7;jPtL$UQA^JSvW&O`)ECDm@!ktfo zfnc`N0{_%aoR-U<8)@7v&IuAHM6@99u z(nZj92wk2bs%H)A(ov+RppQZkHOVKKJ)=E+)GE|>qLP)%Zx6XglC2*Y1yIt?clr<8 zbdlRReBaRJsT|JHMy#ic-*_lDw=b&8jP?+`(OX}LbW(b%E9No&stff|>*0Tes$Txc z%_h4~6e#ZVz`16wOc5S2EZ~(S&3?1AmIDUda}-_{;@>KGDyL$HNDELMC1}?sf}a`)NH~8)iurnt!qSP{-zvq51kPy z2XEw<*La1;$Sul7$YzrZ-) zb2Z?R!CHEtgMY5zH!#M>rIO4!eE9DCv+Q8T9D4{UQ_mMGPpK_$)^e~=<_0>75h&LhB1c}Kbiua3~V)&Pf^ErMdcDt}D+ z4KDpB{ZNW<^=32yg-6C)g}>Uo`mX!rmo={~%sY<2N$=q4nTi>rtIXJ^(bP;NJ1idS66o7fme-^mq^f7no^d}v~ zbBD zVXXki)qkl)hPefaz9+@kixPf~JWXzKvYPU8KoD+9q$okTGj+w!G1t*^;3TG_;|C}t zmea(J>mI7`YrZp`1ES|zkQjAmy3;|cPu0|i@sql{C-t*D0>f!@rSgOdbaQPL2eJ_O zutoUVcG1pc@VCNUE*)40Kq%k(r`G;=cGOm|#K*L3vabdAa`RPZaOeIYy>utWMa@=s zaKNgg=z-z#l=5@78Gd!C|LwAHgQ#u<3nE*H=X!#Gyc~@pa{B!zkJFj&{vh4g=>I|5 zb%qPtcE$7EikZ2hU$sWsjBZ|n$iJsNrUkW9f#z!lCxu98-Un3ZU>98O`)e6`_`{wb zV!3O*uU(MT1qhI}zw!nb6%$`3yb}_XlmL()DQ1YNsB5e-12s1=rbgXbi;DNAYa;n2 zQjUTwN~Z>Qc0f#qR3HO!`r48&C~prP=`4ORD_u1OA{<`6Tt=j^jUOwE_v%g-Vr~Hv z2jwTkld{K&mNHiNtcMPD(qw&XoF{jAvm-<*p+C&iid-9hDhk%0Nxxe6IG+tA+Oo2R zf4YIgA$I9B0}=oQrC637qGH5;tf&sgpZ+IMi)UTYBJ>VtCH^3^d&ZR1pI$7&?O@vf zVO1X23K3O53#_gy5%`y;Yg&{3v}EVl!D zGQuWp26--l_!;NdRz%o8>O7rXi$VKdkB)PC{@DRp(` zjg7QgV{)LZK<(pjNiKRcGcV-k*%@H~US8Q3cWgWP2(LSfMkSQ%6ruGPB^H8AO;;AG zaLyPLwMzF~t50_;Fh79a{oAM^HBf{S>vSg^?YH7v2Z)tN;j2jfzXebL<4Vy{Xy6`# zIiIV(Ry$X|j@|aq?z`{OxB-qf%W()($~TM1*$Dw`v47ad*&r1Lk}#R}a8t74;IQlh zIXf7R=PF4U?2{-}kQBUVYLR3bhZ#{! zANL5Tz%$Fb<%oi%^Z%Tp)?Vo^)G>r`$IY)6BuQsO>9+JivwMqcjUGNl9#ycgE8wjK z^O}u=7TOB9+_TWle6T1h#_%;A5>auR!4Kdi$ujvkj=zkWEl7*M0k4i$&!Gyk;l5?> zF=o2Q()3Ty zr$ooFyc=db)d-)TCY6~VOaou|aZl3_L~v}_3OSnzlkjtiRUY$ht2+otX`!Aey8Yt2 zbJ4PL$fl`NZ>udYT7$4JP-0R*`vso?@saGZIb05k-HnB$Nj*NYN>6DbN4%Q-g4YSV z<~awX9jgA8{nzbu1l4}Dt`ExKF!ysSJSogbrGi@Nlb>q6MeV2#(G)Ed6qB^r|FE;Q z)~X~Az5#^^KF_*kKcL1mf0%2!RCVu(@IAd{1B?ZW@q$S3nW8_i(=5ohMhU6Uy_?TE z=CXV@T4^!y^*1lF@Uq<6HGj|Nt9(?xzgbDOg0f#|v~3xG0g2NIgpYmDQ-0B_u|ndR zMlWLl+00}05#*l5+}?2bfDobzLW*~0@e3&+8!ef?YxeWm-E78RO7SM=g%$z`R_i+3N8FqVHFTZCoJ8W*{E zK9s$G^lYL9G( ze@3FVge8Gl=6Q&4a!CP&zhU}RhiLN4OVW{@{>ewps^%6}=x91>;*9rlB1d$dO0N@A zOLwz|K%ek;NJ zb|BX7D`Bc}#+27s#?fBXs4c?3As8sEQiLzZ68Gj;DPZ$NuL=aKvfaeX%;49}^-W^P z3qHGtgOsdID4rGM+jnpuZ|5djsmKa9&6so_LVh$V7Kol{X@n}M6k%b}JDTK$$1oRG9M<)wsy5vvNI+E4 zsMQY|`~P~sB!t8&X0{UBe)c>>)M_RL)FEb(oKPM3(b-8=3*|@2O*=3e-w|8^cYbzK z>P1xDr}P|V>YnxE@Qku*!nc>xr_xh(^u(NcGqJdo{IWG6JP(PKH16n=<9D}Vw$mp1 zn#J{&*hZ7ZKF#CjV$VmCT29%nc;+zvp}%uwC4JbgmSzN^mZc6=clU}XO6_OpoS-zH z)mY<}b%I%Ii|oy!nmyf}6rDcrRTRA(wvF=?Ub`z;Tx24LLBYFHXUd3_62_xqBce*G zcx>PWQgjQC{6>u6dEt9RK)xVhn|w?<$X-NvbVmM5Dd9Ju%qSr@O893-wMnPS`y1sQ zTAU}yF}W6feG!DAmuSDp{DE15wcV<0{dI$=EVF2I*9g8TrFHrl3-(_e$$btC((_IS zK29L=aMk*Vm^ZR9X|%vopBRy@WY3=AQhx27eF|#x-1-WM2=d*Ps|@2z0uA1XkJoWU zC;#qt{RR^hDCJke&{qw=ac_NfcqSVj*=F)ZDHcrmLO*IPTul*^lmb^Vmb5;}Vwd+? zqjyxEKAlM36R9$h&7z`c-_pdoXq={=(-*5T%}MGq6sq_3Va)gYR-@c%s-OU%iLB=F zBHhk>;X3kL*N;7U2nH*HDE&`N1wjIzf6|pnnjj05k59%i~Pfn-xDYA1#9< zU78YVlwriXdTOjpzpvDq#q+-mfM2}ja$Ac5;!h zjKA2`j^^XI)%G8xuR$9|G3+f|bv{Xn1)NbgF~z&-gRCIcvxUT-_#x0tN0AI&y;s$Z zbQXp#1I0F2X3T-Dm4V7inbTN@E zNO!F-9|xl!h_!HPEuWswTc#&PqUSE^{u3rgg4`UKUk87(=d7{{4K~n<+3(no16x6>RRo%>{~8I66T8fJC!zyYqS*y$(z#Wi5hnR9 zUhpSBE_;f2?PrzBssKHnM6Md9($rOcz8_Y(z7c`UWavb+v) z*j|x+d(8CmV!3o8N00^srt$Nb`s=l2IvpyuN}KsP8`x`S*X$Ig!1LZ0 z4<(eVKF9W&_}7J+sjtagBK&gY%lrA;gI|38kz&iB?jVHwT}I=0?|2zum7dlwRU z0nAQ-Z%7=d?)E;r6cI0!1=jixm!5MvGPFG$p`$gpN6RpBsAFG)*QV zAb{b#f>Iv{cy$mKY>aGjOb##9Z~+Sro$PODsmW8P;LqKc$}dE_dSU-Y;PTmunC}lx zPoE2+T??%gjP~rhOXphe=Db5j`f#%Si1*P#bL4gBjjuF>GPiU2bn%zR_|xgRTDyc; z@_6;N?093oQe~A!G8yet8|)e+xp^aJY$jSfW>S4PNVA{mGNnH0Ir-kWdIIUxkUoMk za6WlmFFsCd$-H^p$7r))rq;7}erkd8~)PwO%9UQuQgs7eFK=hP}=V1rr2d!f&v$1DFpAiI_94nSAY_K)-9 zn#}vM9kp=lxPT9yO3k{uj<>#vCV$+4(m@pyijqjmJ7=wbm6&~IA%(RSU zqZJ&_p#y%$7BI{D>w1qL19W!APmpo{I3B;MO~`W2VR@cI=9|nu8C~;00pZc0_9^EF zs9G{nFzV61eEZ7CcP^~r1!B*@es#kW>g+q3E?flP60T(f6&?O3Zu%QQyVq;(MTb$+ zZ8?#HP3ts9Bmg>I4p;?2w*z0c%2%AA2RJjx^heFftoDA4%rr*6Zkj)@cis#s0B@+Z zfemq{Eo{datF*0DgQ>VPLlFnkuD9vmkdUuSb;xeDk5C<0u zqU^ENTK_`is6R-GAcM*tXsFoR@x*sH#z(dz)*D7Nv+3~a% zYh=CCy1&0=oSx5>!^W}up*CZ^^A8eT=;jQDbDurKn_J?caq2%v1x1S~@gbKT90732 z*5XAzEnVSdsyoStJS{|p(cd-clC9b~D1p&Rnu;Q-d7M-$I3b*@zu1gF8yZ(gEX=v6 z!4#FGIIMHed~H8f<`<@f869Swu?~|foBaAI4YN_(?}#Qa);V z92z>RnfyUwu6z2|&XI#ia6(`DRJLgEN*445a$o2J;^n&D^!pPx7c+##mfKBlaE3}8 z0v-0g3a7|MkkfIb088|;HohJT3`aFGrI7OqXQ$}#$f|v!o!O5=m0nBDzn0DU;0yTJ04Yf+jVERgo_R-xRh`+ovJv!=VJ-2 zXkknoL^Eu(g(%n@4-E!^^o+H1e-(KdQ1Y#y>oDI{vE{c^b!Up+K~;*yX#2gJdbFQp zwfqb4kbts(ki>%E@?s=}X)=sPVtC+OS&bDeCL+(jq1jJxX*0;aX68j>fT{p0?(y_U znZ#U|wIhkD$sHRx<%dH+eiW!LA_z<+oLFxt5ptPihTEpyA0U<(A)HE2WhkqJTH?SB zyB^$&9na~#4AZhW_|Ta!O1M!o&d*80`SLXDr=raPql;~vdam}w#$?}A_j&=jr=6?5 zAVI;n^7K>y12qBD>V-Z-70c|{_>haXu5?cuhAwh9NlGd~g}B@_g1OTdJY*e(y23HO zW1MNV3nkr{lS$aDlr-PA2zLwcxljP2Iw(_qitpM$7K~Y579ES>lNi2skcyE9k!xfU zkYKxY)MG)lnB}OJfjME;w<)#3b=jjSiVx}JAZ6h#2Oo~rkQo8_Z(XBIg!#ZAwv{DL zsHs>EF^R|3%hTaGmSn|5cxjV3NlF^cPtWif?WMxd^{W086;P&CRmmDP&erO$nUNrp zE_|*Y?>>}`n5rnK zTG<6Gvt2lS%gUf8eG@92Carh00IvM{{RQ&1A+DcmPj+1O*J&R03um_9e_3)bMixa9 z^E7fIq+74SG~vXZCw_#3)$m@BH^0bl82r4uCv7KP^*+j_DF<4PLwp?7PEw^tyqLPZ z(P%VYS{f?&{QC5!HBCq7YEfria>(K9DzjmRPzhdCu&d^9xn+;MfNx4&=4JRc#p^*> zm!oj2o(wt~0j{0%M?_g@Zyu2wu#oy#)g_cJw6Kp$iixX*fl%PJrQ9nyq(;-XyZmdn z&|Ja{(I#!QfhY89wL>_4BOAq2Vdv)5oeo*iBCbfTY}cy5`D z?S#@Y#Cq4lGBT{2pCEcPrYR$EDlhh?%;Xjls6J79>ne1MCONFId{kiXf1x!y12is9 zALx;qZqiCKdSWAL-LtEzicq2qh3e*D)0vL~@RM2A>!M{=Xnx&jydTn~qw2}<`80z7 z%(Qv;VFi#AVMlzYU;Lg*^&%X|kaB&ly0_cS^b*VHK6ijG^(#x-^k;qr?ln^xKIFKw zlTFI%8_Gey9}CC&kNg^;*ULaZ5chl;`w)zA;)g^=1DVknfecYr`PqjhIK0~2h4~?}(3&VE*6o)N%lRh_<{)N86GP9CDF{v{yQ7jpx zO`}1SXH1Edn?j%Gel3@3art*_dxGHUg{Xqzs^Q(~Dc8n_yrUVs*|K79 zSmvsBHWu7-qmedo-T*giajyhMEQnu2qP66$&{EKHggW3*Gps1+e#8X{l+C1P3jW0cu*y#BQ*Y zWGQYx|9kl9<+E?nR-(bGU5?1Lly>E;sPis{99d$78{40SOuyr#4IMD5DI1(E1Y}iT zD}sYnLj9voU`DeN436v>zeD5R-FOiU8j3G)+holW1&~yM1YtcMBO|;;b-Mn98xLG42Haa!4% z!O0&sB5SFR`hZ+zoE5cu<1$NB%tR0&eY)} zIta)=dxVleyrJxn&lKHVghBRU{pE$+(kiuHs)A+_64O)pL`5A=mVs*tnXO zt)(buSi)vump^UZZ3#~)W8539$7RWljjf2&-GCn}qDFgSfM*4^5+HR=nX{Q<{(8FE z7+eAmUVIS|OX{LxgCc7Tr2llG_4Ce1fz414I|esJ0+#WT+lhn}W>E;7Glm*bK`Rzc zyQj>spo>ZES<^1*+0!If1PRs_5U)d(uq*XrawA?J z<@BnF`~&)7KCS6dfi_Q&$E0Wz#jzXkmv6hXN$;`&(6qRJD@!sl`T0C5o}$`}5K4kv z2C}nd@bdyilV`>KcL4ZDRbf^Zk^X}mOgk2H^2MdNWrut6z4aemRh{iGxrx7thK5v8 zo|I)4Iz~X{llp`gN{2SSS%pY)J)jnIQ|b*;(j5Qw5s+#E6DFZHHY}0N(HL1k#ZCXNO~J-c1Z- zw(oCcttt8G6$(5z6tS=W-p9Xwzf8u9;P}75MXYd!Ar);Z*{7PL8-9bC$%9J|&yjV8 zh6P^NzW1CuVkRcq!f~9QOx(~A)UCoz8XJ_FRYfPb0J&yD*YeKPn(5ITYL!t%1~Uc4rW({*1z7eDw_@M!d~xm*^-QU# zoNg*_JQehzkKN_LD|*o?tb2Vh<%u(vL%!`4NA`fZs1Oi-g&_(57(XPN`Mo-oR9TG9Q1L^7dTc^p;*i zQO4U}yFYY`3Q&r%AD0M?Z`H~rCV>IyY-Z{n!kB)xQO_yA>|5Ag%gO=GGP9CsD4*ba zHaCU#&gZB`^m>I~DMR8Le#P6J&eAO_fF?Z{m9v8Aiz@{MMiOJo1ml?ZagoTVZdtXh zq}FnQ2EZgUHa2?q8BtVo1}A%q#_8aPpRD&E&zesL1-60X{!`f*NwvKLk2H5BJJ_CE z=?i3AMZ+s-z#8GA3p0C{yww?1KLObmegzXEx1I2cN^h2h1A!glYE;v4S=x8WhpYE5 zRc#FPGtfi{X%^|<9J|3@EU_%;5jj(_+JGfY?fvHlpvbkGop7gbOWwGfu2O>UE+?W6 z8vL`%29$5rmPUQ)zGaihyHpk)$7R6OkEvf@$9jRTxYO_Ur!m7CGH@J|z7mkqmo=8f zq>f42Z<%Jfpu zIj=zC?uVfU&j%yOgr;bINa;TF=Bd6!XbzZ@Q1DFXCd*&ZRg-ulO4X~ZO_Y6q!)5Gy zVp;SX!8a_c_*5(c$9U*6<__mu#kSnsXG6lMsSMa#@^W()-(V2p{`ch%XA?oZI>!eri$E; z8jgREm>#iEYQukAywy#i^*vXf+~3;3l0ekGdiv2jXFS03w{m;;g0wY{x@%! z&N6CiaXT}sNWFDnX0nD_Qy$+|K^khX=1=R6tE{;R*iJ$(>Rt3HtxRVeTk}o^84Qua zK*w$7-)m=RGjlmLzI4jPfs<^fo?qi}E3_%mFuE^0 zqRjG8o&u-#;I=SiSLU(psN7YdgVIMcV=>n_tP8w2hecTNI4}^uwlWT0Gbn@K6xo+ZmA}yriRmbA$9v0o9BhKU<6=Ayr7^JdayhEh z?QlOh&wtzY)NeE?h_>{0!76k*#u`F(H5Ny4(-i+U7O|lh_022Kmp#LrFvbsgH#F8j z2;M`e(N^@i34F)H15?6%hHQQ4YrTmI@R&r@NLhqX1I9pg>tWrRESB;!s8i=+>af_3}9k8xj( zQs~+{m~+lAzur|VSo805?vNF|$sob$ECasDK)gp^wPYf-DK^J0y&_gMI-u+GT`9HP z4Jfq+*z^0!k!lL&FBJm*;V2JO`wEMN_DQs0eA$3E!TLiEq|5+bDNq}}^ob=7nKe_xwCVhkCc@XhSnLi*-x zeHQ2t#0;@xy83-q>ipo7ib7Kvx|U^F2|!VK=UXFw0@W z?@4g((uhSBw+R8OJ7q(PCC4|#!RnhW&Ly}YzJ9??u*VTyTHx0s9~veVhwyo6r^n3n zKQ2j>$#19@c?y>eMrj?BtQY=1GY$^LOA>bTR$OaPCR)-3+`QRpI~FtLS%SR~zz*V! zlgP&-{xybDlW>jyL8%kKpk5?i*#0k63*gwQ8e*#VZ#M+}`$9vrSM2<-ox#KIoVNLW z{N!{w5Dc7(IfPW&fJ8M7RN%w@88e|q=a7@S1>q5NFW;X(;vvl&IOsx)uLT9OZ|1G< zet8|{SfZ$LnzeY&@owrX4h&S1NRcm=%;XJ-Zm zWNHSw$WfvFI$-Q+@uy9<^JB3HYo@DTZN=$!avN{n3s5+e>ySWy1$kGe?Oog3yKJQ{$cOK7wR^0PG%>q$YMT9 z7u(l?FiQ#6x*Kl8S6A;zq|)g!KjUI2f4yN^_Ia*P|BAHz)s@&AWGy4u&0 zbx7=F1DH_$S{@`gIQ{O3aNk%23~}fh z$O8XlPZPkhjMSzhj*pA)q8Jcf*8Rh>qCjsnP|?V-$MZ2YiuWP;o>IrXqC%^oa{vMn zZK^CZ65i4vZg7ggA78Tn;tbS|AwSbWSuJ-v7SP|YE1G-i0&yZ@cmt*yJUUlHt@9_`7 zB@O>mz_(N=*DL0v$soi^;X*TK*1|#+5a7N1*hbXYfg#be@gDHV`d|4AKj+#G3 z8q|f)#k#S^L5!F!-@1nGNL#eBoW44=8%O})_XrN+QT6#xCKeuI1P8smX_C)R@d2np zPorU_4cAbvc1)^_bDlwt$MF;nvxU9S93X{pD=`%mgZk>V$((J&An)(MLP6Cr&{}mT z;+P02ZiABY_xWdt!dXCOdN4TLIZ_(#jXEkq^1cJmF%a1>wIWz%tZk?jiMij@wMGq` zFDQH`_r7eWjb9QE%`q{mKw~mUy9Ly%{DnSX4d&&EHX~>46FNCd_fh)1h zp@~%eL=bSN?=0MYZovz^-9^35T-YkOdm6Ti57asyPtFN8 zc;CAn6fM%Es;aCs_E_J>{Vd52L}=ScY_T<)oWkE`CTHIj6>RCTyjGZ(sxn)*T;eJ< zy1CsJ9X*AkOJrcYI$=#>yoP*XUiy?eSo4Gwsdo}#ib+qAXa7^(*Zg(IuU(RkT| z&$fc$b!M6e+b+Wh`*yw(_sL0ODuS#lh1X1O_>K$9d3m%7y1Oxa>Ff*{a)j`82jos= z=>PzCogmIxN-=#E^XCPOpBgB<$+?Q@|K>;93fGE)S(9r+gKN2IuYC0if`~^7JLXKu z)<-oOOw^}yP>}sd9%c7bl^61Mqso=s-^3mmLCksO5A`w-R2(F#0I@}2PKM4V|nWoJ6ky0hV7AJ zj}pC3{n*mmmHrJE@kdO=8Tw9R!k;U$gbOD8bQL3E;ha}~AR#GM0OdH>8=P$-^^}TH zCQXD7$Gx#KRySP!PUvWKS@W*$3I|qTQEMjV3euOUX6<_Go+q77HCb9^v+3X8AFVfy zuLu1LEW)T7xdv_*#@ ztQ!rI&lfEu=J!3^z!y4U_H#U2kg)1mR}$T zfq7n9srawAi_nE8`qT1%*y!Kw7J+iS?553Lw9y}TFxPf;D-C0NYovXO?KbG2z!g3< zC=4Vt>vzuZ=d$=xOgFQ11PtJ8D@Qk7NhO;p_Iz3|&fqcU_Or?t+9*Ruz;W)+2#Oat z^K6q*8nWL~U|UV*1h@^^!Bqvp%y(tUR&ZDT8I{46?oZTsW@JORQ17iQ=ShgWhYQ%f z%gESARnt??K1_)uQ4?>cbSko+u;}-G`5BVFo9??LxAQ*&=jBi0wVegnXcQ*lfv!Y3 zt?dKFNj>*9S1)LJ)kpZvPyVX6-kt(S(A0WSKGO8hw`L(s)WL5;mmS+2>k=}2et zrkVTzjW=R13623k6CvYSYY3wyI=j)m!A*DVatU$U@>h%|ggQT{=5tD_Q)Q@7hg~Kz zGoc6XV~=H}_F0Ltzrz0rxZ?d2RhjixdN0&)U&ECmvSwUtt+r)mj@O}7 zztm}{;3!KRb|f_o{(g_FIN4{So4Kc0okJ&@-z!tq+%TU*+TI)Nd)NuzDZK0ew zcHY9AocAqkQq4{<8;Glmb_^hABy00DVbs=5Yjr zEcel%ZHY^SzA;k-$|k>Jg=@hT9|_Nje6yJmScvI9O%L=`D*HA`Z%fHFaxy*)4#Q|N z8V3&K>itpI}JG_+r&a_{LUt6qh9VP2b%t0pWXczta%tgE6V(5=4pj%8!f^HmX z>0w6STJ3Ocs!{37wc-~1Pxs1xOZEbhOe@YkI;l{|)&FexMD9NDZ&|y*s8jF4UvYaCc+$275W{&~WHW29To$A|%<}4V zZ@7s=i2#9E_;x&qnT1=ga^WcsE`v-6%=1AHBigkk%Wo?Gx=dwH_1^T@_}w6j!+ee( z(7Rluis!gQ>o>lN6-QSai?*uh!2Nc9S*~9no(#2Ay9oGEE1HR+jyKV9VsF%I;;!+R zC$}N)M*&42HNK@pKc+75!NXW}CEpZKZ18R5ZB5iGf(H5sAh8;cU{ObaK3F-67Aa~$|# zrEs!SOrpf%${BDg7%Ik?tP?xND5gf)u%=|*XB@=?_x_!BM2PD=4BnlhAHrdMJWe3< z^|hLs?C;YO^tT*R%2=y0Ov(%SigTCX{O?2Si>Y$pJhYooP64TXzTx!~{C(S5{R%w< zef3=m%pJ21gUezt38>);!Yu-b+I(o?&p(b!v9z(wlvF{|Z?Zf$R-EjPUU6s7BbUsO z!U@yOmrc$;YR=tWR$it3t3C2H7XJ8e*WZ(WxuFt(?ZnaiJCOk!IHe3Ew27UAtS2iw z^0uI))-p+t)2=r@e@XTrZqvzp^^-z(RVS@VmfI^%^<_D+OpeYCZ_G~4VLHgKOZ})_ zbg362Axwf&qIWh)dOp5lYH8s2mSS^Zq|6#KpdAP>!GAo=X8-6dM)(?!G|H9QH zm3alf1Z$0r%|;q5>3^TtsI-3jJ?9u7QVT{0fAO1k`(LwUXsC#?i@otix*DQNE)gxQ z$HbFA(njkfxQI<(!bN7m-!bU^zRW)!XXOZheo4l2Ox&Y)42VvN?y?BM&%u@Y)M>AWcpn8=H&VYn>9t_TIQJFW2&IReTiyt;oSMQ znVo#a?jM1K39n0X)RB9ekwMcTJiPAjFZdh>EPEtO*VS4(+{>)`S#(VcoI|TNl=eo$C`eTtCyGg>c0%NxSBXEaz`} zivYOE^FMtNpX=AW$AH14k(d{k%A_Fpgo3_W&Sc&7Ox zQw*=A9|KHs26z?cBa$7&ts>lx^9*TvP#uk9p2i|l@9;QjbZ+j}zK_AF0%%F_#f^l4^KGHWFnK`a*YfqC!JdioF0HY5#F-5ga%_9^D`L8b zL!8x7OyLbZ^vTo)pbar8!XP#c-i?Z+k9+Xf?^YodG-(&;_?;tr?ieNMVGfLxPEVEc z*H$d%{z93(kjkL3@Dl7w@okq0dxsp#qebJ+zKE)MG78Xc@U2CCKzJz?=;Fh6G$rX4 z+bbgtT$%V&DxMe8`=Nf?!#tyM4ZQvnObG5eiZwtl?Y3)e)lKwOD{d>p=vpGLSa+Ae z<{u{ROv{m2m!)piHB#DmYeU8UgJQq8s2=2cL^&bspZ6^!7V1B&kEAv_%_#3{*SzVb;K{J?JJ6 zj?aOP%Fz^#Cf4&=Pa3A8G6=4U%{U&jwS0NbK^Ld85#s`bHya352B|KM?!@|YvNV_3 zzKXc)yBn_jpnzbF9DWX^i~JUCpK&AAs>i^QY4wAog~X#|&__7tW9AlU!Vxmtb_OzI zMT{k@zVL__>GUJ4AF62i9*G(1!To!wT`EycN{Z7hnvJAUY^z}P)M!}Q^DW$?%VC#w zq(N~jp5oY#Tizg+^^M0)JvrnxXRb5!*us!uxH|7JaZQTrhXltWhI`WkC5QELXpr6$tW{g`NFG8up)w4-QX7HqkmPQE1mQ@8`7{xG}OG zi5ML@7BhFthbE<@&EN9&YB2hr8&2$BwT-Ps;B=b@1M5FZc z{!g?BSBai73+lJNYfFESSkfzL5bpP8ea<8bNB~gLO{E)K>C2Hf8=1JS#ko3y`M=mr zz7t(l5xmex%>4iz+xuGQPMy3O4cy9i-N4xFrmMTyC>gPwdLB5kQ6jPXq$c)IaA&T2 zF7`0x(IScyaiF+x*wlIo5VvqQAnPYH=r!Q5i+(PmyK6(%D9!~~azUvFGkF@d1QvHo z{fL-42Q;L%tx}u{s~QxJOAh*%d2K+&T4M;DGIAe4JxD|iO|iAld$c(xPO1T5q;x_X zx0YA44#o3O6$vdm@Q|OYjx^=AhfD-{Y=xL{72A&+s4Piv-N|pJ>^F|Ew=oblT3=(h z=3lh~7??oGq`>qURw0X*Wu@NJWPP{+zqkZlEwT09jCdJ{NApzR*pcaoaqrhWV>Dj| zcB+}n4#}wW<`gaHGT^cje<btZu-$85z@kU zS1fX*EO#x?TEo?G)92z~o}qk6qieIx=f)M~d4Oe8&;7_8TbMs7C|glqkqw9YQtYPa zo$Gi62mS`KxpQ4KHEpzlePWSfpa~b7b62X%W^x89r!Y9WmKOofuBK`p z{mNx-zWH6p>DjEXqF8GML(%Fdyt|@ih7AC|iJCUf(y2pZs?>)lqowXO6oBfN$EMaj;N3!k-8xF)Vct?Jp{bKHEw zrJMSdcBIRBf}q!H`$qzdV}Qv9)s{UGZq316l>1!wVj7c3K=b^iGU?_5%$nv|JMC21 zyc)(}2?}ldEiyI}G2K`*qM|fDzfPW{OM^hEMD;7C)_iOD%%v-GKqi=qNq8$aX%187 zbH%~)z;#B$z}AC92RF@+K{ed@S{_(!J_odM__$#BiP;$I0G)!G$3&moFE|RVmhteE z4{qd3NphZq_*bB|T3Ndn#?^g_Lpkl+4)RuvmD9lemhLn>^FTFCwH@*fz_=Qo$8u=B zRO3I~a>?8o&1l1+R9hp10%%O~$QGp>@_n_kYIpHHJS3s9;s}hPBW4>uJS|elrJ_;V zg+H}*fWY;XC)+?9f;Or2TV>|c-H1@gmlYP{&O@^FIRz+CrcCih8C%0k<%W$)w9>fr zV91YGQ1>-NSM|_t+S$&Rje*Bzc%JWX!YHcd+#sQGdB@;B5bpO0c8;i_Z-`QdiBJcq zxnkhACPc2Lgx!~Y`4pUbK_qYCg(AU-p~ikEdWHB-fk`tTZ1l1yltGgDZ9zY%WuUg# z-O!wJ9PI*1cj>JjcGsI2z4vw50E!0T2B&TngI|r=L^yv=9RSPLrLDV{e2MecfT|3n zr1;TYXno%b;IfF}5dJV+gs>63eCMqV^}~o{&CP^r1{qh(S$5A8{ZLsNqTW+?Qpt?ZFkfQZr723hAM z$Q9jGIsq8+7@BPrexfM~=0Xd}E|~bMcvOW7P@v2{fhVBrj19Reny-7 z6qn_H_$#;ro#&rX4b>n}+oXAC`A<8Eb!YA^cy829V|^rWu`nMybwS-gxK#rF{dcNc z+yLDEM?f)c?)~$<5l2Cy@8e?q!i_0tQaNA4*eMF@I8s&4x_N*-K2nbTXF@IoasR6W;+kcu+zW2=STnZ&Ff{WzH0?zv$ecJ1qAE(Z zviqvN3^x+asr3nQwxa18wN;rQUJBy=j@A8iZBV~nHgM`YFKwECRn=|Bod1^F+`!

XP5%{z75&Mt9<`}f~g&Xo;2p-VIx^}fr4s&V8iX(xW4`WO4# za4k1%ZEeKYo9-nwe+^x1===)1{mx_elR|31@UL5)F9RG8Q5Z@?ld|B_Q6G`stYh^a zL=?w9B7alunk9_X0Q@#j?@-yl`+8n)-)>%I{vNaVy(66QYDP1IcI($!mQLvlJTzL}|r{d3C-* zz^TjB_KYk+3(m%2LI6}7S8zyEpwAx~hpsf$yArxu&Zc={AZiXUrEDlcqE<)`jxs)# z;U*ir->2XptSP-SRa5-2YYF_6wmtLmEyVgqVI=AM2VCI2!p)K*$^ z$3N+i(n2n;9+w`rrMQLQ>ohmN_EctUc^8q@eNS%EB}cj?x0qb`COqP@1#F7V0IaEZ!4yQ*ht%_Ln`5XnP!ATs=+12=fY_D zRK6^2GsZ%yI<)?8WIdxpj9!i_4^sR}k0XwaJY@$2$sGqpO|+ui|5-U7gvPO7$QMIB z8VPc}|8>V{SdGtv-l+_8XYPExqC#oDnFJU6O)NqLd|ly1_1w&+r-s9+|6ve0=bwq{ zzW@X$$!zPZIcYYs9~6Z*xBQF?5S#w6m-N3=YTQ7ZA}W4ja6?%pLy@(7L4axAwhf$v z``VPxHMJ02?=KW?blnDrJ!<+=Qhd3Gpox|{TX=tBIqzWvQppo({%IT&Z&Ei`o6W;% z5lQ=LBXPZ7bQbT1Bf*G5Y*objsGCBzyCE;C8qV<|6Fb&1H_v74R0+1z{xp=sg^By- z?<-!ghyG6xm_6 zny`^&n%56X9Z##rm9MXn5e43MYXzJwjD%c#%g@Alc2hc^=0dD`(<3IOpL$hhMWa#+ zlvd{raSlM=jzWiRbv_wKZ3yZ%i<@A3Q_b1pZ&RPC8Z=n=4URe+{K6+~kYvhQ8}|wQ zqqoQ#*PAzaiT{We|AWWn&Af&|?tcW#=hu6{ zQfg|r5mH8uIWLQA;h^v;0dU+pJng=ONnkXu;<3Sd1M5nbe>zihuUb{4yLpOc@$lb&&hWP{;Whjg->D$)dgI9z;?#q=;eJXkXAJ zNP{qB-x;YwLIHZx93w0Cl(Cpyx-App7x){)HeJ)n4+cR&_BFH-0DJ^9rp#tamY94j zVcbTn)+FfCk7#x|gzTP@w9_0bHzK$y`hilq_=%$TT!P!qqPmrJAmG@Mc^^3-44nL_ zy>8c72%Fue5RywWVqq@go{uG^%IyEk~f zTVyKB@&>p(?IBKY^Qxtl92**j&BK5u9HiIHF*?b8OceVupTI9mAd}Q&J%K5G{(kFeLe4$Z=>})wKMb`{hea0qmTQUh9)RYT9|3&Kj<@H%|PV z2a)3_`UgLY=b`nf2*9;7s^;H}D;kDW$ zdDaYd*TSiRkRa#M^?rA;W^og1^6m?(gh!D7%I2Jy95jE#;m9uEwAu~gK4#$7!f2_3 zpYN+8o~{g_AZxC+pY$~w#06(WrD!b^l633Taak^PXjIIl>)Ec%>3oJb?@ zD`39(#eU3Wjad?;74v^Id2yfUYHWjRQxb;mn1lVqi=o_FU|;xwpev!6drd|v8IM_>x zRR&EcylY$_sGNVB)J)d46~p4&ou%2}pu@f{cMgls;VwTPmx=h3bIQXm9v_h2u-zZ& z^0u-AsRz8uH^8r>-a(HH8tYp}wu*gvJQr!!>3XVN3fh0kM&QLb9E#oBXjR zsuJw3WL*tOmT6~!Ch1nlR#Ru(-z}Fc*1@h59VuU0A)jMXDS&k7-gTb%gd5Q62ew;K ziY!c4wxz$X=litoSv=p35FwENhCe>9ubSw)WK&@vxZ$BMGnbIc(S|4U$w&!?p$IQ3 z%lz>Re&tl$Q9Kgz?d~xLS3&FdqLkeZges_}He(}pnnL6IHnh6Px|*%Ju^m=F;!FKD z`Qih2mRs=`u)of;Uy)2s>U6yDJm-b!20JGkm(faxA9p-QNL`KH&xp(X7?I*wkVlus zTz)`#P{pvb)2khV1;FUlvWkcE)y+$ag@eSavX?d9Y!Vt#0Q`9&6n)QPl^Xt|!jz1{ ztcP8@7``@vpaO9wFGmGso&~Uw$4I`YZ@>m15S2iF4Q%^vm^22wsir=1lZ& zUlBp2ur-eezLrmFd~(Eln=W=q6)JMBpHvn+x@|r8dfbWk8EG!2zivlycBuh|W$6z? zoN$+HuC$^}@|rvvr@EFsBno%ga-$aVyT;}*WvJGIxQTx7L00lM@tC+}h3l*KXNCW!_>9XqmU7HIFd9P4#<1u=qs z6Gn{K4^*eQ$ry7NQYs#oaLGkrZM39?Ddkm|am~W=aucR{g{B<Jtx#}C7<+;?arcpLf5OnljVGvC&T<%5()_FA*R5W4U)%geOVoZ}1~ z&DN#{Orm3N71VR0(e4#NyH|R-|MUtWU_8EB4M%&n&t`rv7Edi%jc58nBUF6;Keytz zkbNBVK%^G4apQ@YL6I!}zgM&y^+TJn$Aj)`U)i;1zC;V}$b3D+Z!o8@bO&DO)0!By zHcei!{B5C^fqF-uIGh4HQ@u?pkJsY3_xsg=c~Hb6Q4?9gjwSnAaL0!Nykm>e^Oju< z;O3YJkb#-v&?7D4mM>4v{`a=Ydy2yErLevH7S`VyElJpnK9sGdL{cOd+}+=-b||2u zW^b-CYzuyj&1=gh51!yr(x|Q_w(9sma`MrQ=*P5)o3q^iIx_DapizRm z)VbkigrCK1C$Fk(!_eKVO6w_nI?rUX+PDj62A!#-(e~tNpcZnYvu7cLq|OW@!YphX zkcI=B@-$P*ocP%*!unHd_?CO-V>%kwgP5-OUkZ(DKm{R+g!dxwmw%N=gh!hpDP0~U z*L+Am3~%)cxTrk{X)A!lifb#}xGe5=BF2UDHJBr`FO(ch)=DH{90i4Tka_-o73rsL zlO=BWGV`~cVl4n*i4o`qsVypcy$xi(G>wpkAc4W{}2yJN4 zu~pXk<3nelJ=XV@ddnb)^|Ltx9!tUEo=GBHU|57$;T^gNbC-j|I#!|*)*-C1L5?0Zdd)Hl$2t5J?To@Hw? zi;3lPR**jwA!FPn_z}W`D8hyYaPGK*Igi)CC`MfwcT2X&tJL6U+V8;&Bi&7&p{?v>wYYC;Q>~A=x zY~aDO_{Z(?Iq*1p?$6yk{BpXLp*kqi{%8BN!zUcVP2ZK17JY$kx;p3OO#rmO@FVS* z6Pi~OJEMcb`qV;Vn}pi+YSxz617~OG#FHBsh}U6oy$Ql=NWo{LVy#XfFRt`=e~-w4 zrdom*oV$4@)gjUSi4DHmh+5Y~Iz<`zD7Cbw^(E<6hSIy;LoB8)b>TqtD<`Js>$hny znx@XZo`u9X5Ay6kA$-y(YWtvERT%_2?N~`D|JTm3M>cKgN8jsn z{SwXS5~x7`_0a^t!p`R zqy$>V_B}r-5$nq)zp*9%9MWj$uJTuy|CvH7;M1NeS2fvwY+}5wVHpo|%cXX{On+O<-W|2OFvJLtG7m z^|<<_P~y9A&oGK3(2KXp)vr6)-t`QlgXV1+#<08r(C=j}EDiT|K&&@sPaZykD9uAr z(8s{T_9n4xTl#fiOTISBNT@lKKx>by@jgR)w%U0zPR8k<$UTdv1JBks-;(r)mAnp@ z_``W=hSg<3VeAGiZ3*TLS*~r#*{3-DuJhC`!{06yVLSKFAA4FN??4pn`>_?}W~`)u z>36R-ox+68y}03imx|$84(k94kcG*F-jo=J{U%YfPIQfJ) z?M$S|&v-J_%!;?F{9Kzc41Zm{HjJEB9>zJOTF*hc4bajm_hEg~c?x2?`qme*h}5me zcgJd~J%4X#YgDyn{mHD4V)eW(ElIc8k$FEoHrKuH@XczEtR1Y^6dvV#{%9UQ6}?)K z-8a@@t_t8`&=j$Lz1i)pvz4PM)a2-js`5>y5S6i#S)CTM0)$R3Py|tvtUi+aN(X;9 znHRHt&*-^dm+>v%IghM0c=^>9V}P<%^`xc_g`Ot|2>rH%HULB1&0aEOG|0U`M|065 zA}BIKJ@31%+P5hykmxaf{nuA@FejUEURgpCCr!Q@TG~y2$t}aF7_}D(H^rBi$@xsi z52XKLoE_~{qS4S5nBGYJFGC*MY$(Q%f7LvAvRjqEfnU? z&rI-Q=3zCyU zCk9-E*-R_T+q3V@Mg*&}$r$hp1{#K<*#d2<-SWzz^coH zpA!p3FJ1|zOrMO3DeIa6WSPz)yfWTWXvhV~HDCsC5}sLdFg4m{4q_V=f&BJ*oH~pN zWTwm@<7xufuaIVbEANG!DJC!~xpIu2*^ByN!rn%lMERxzEx ztP_#4`}6Hiw0teHbLQ&|w)9~vOqKv%H5A0vhLmr6PFJOiz{c63B6A++w7{h_GNI(< zPqDzsMQ%|lD_eNgvec>eu>Xev8nUN#{dEJ=|K&2*P+sEwnOum_ma2u_w%AwA3}lSo znL#RSTBC`9E`(?@2Di%+91L}vbBN=l2SL4+;$0E_*4G!Dlpe@WkEzw3d6|dtwS~r2 z^_FpM+FT3iEKOSlkZ*jMxbNQ+x@1$!Q5qEKPPd58!H-H@Uj#;~>T`1yr-iKlSU|== z{cvqdJpF&W-SQ`P8~sr>qH$_oGq4bzN?G$Cu@Cqc9d2NlaIdGqyM6=44T6LJJJ2)0 zn%cILFz@Q>6|PZT2^Cj}uKXUDwt|JoPQ7mr4s&*9{fp+wh)JPj?IcFGzLtoK-kyC( zwo0iEu3@G8v{=6CoT>wMGWezXL+APIiy5{szLN}b2;KQi0)GH}p+FPP@k9~uE_B;c zE4>HNqv`65n?y;7AgGe_xlIxQFpUlqG<3x*JmJp}Y^F%Q`Ba6mR_`gli+If8{XtC` zoGCqh^Ho}d^Tm>D4Yf#!9*@+#dqd0lruF?P*EYG2!m|wfc^3^#6hZkG@VBx~ktGKY z?u34a-hx}kc~nf=xxqB3*2zQYxLh=slJBsiNyK4VX>DuQIu>cD-wh=Dym+=zI)AR$ zd?Zo#vjI*VTJ;$7Pu$0(`j#);t)U`R4k6Xj7ct#uiTEQ2wq{O8K?>b&%6~lCj33A$4ChW@7Qixl2+&92xtPeB;#d!5P=swo=I2C*N!8DO&)Ka! z#CsBL*Y(>N@S5mSjiXFm*J9oq_;|sIIVoEl5RO)Fl6#>?W)a*Zwt_~WrbbX_kHB}D zwmr(Z9+w5_(Sj7O?G+xi3paV%2C;CdKu6 zwks_~`UHzJ z1BRJ0IDMw^eW}c^y~2;lC;iKgw+gh%LU`9{?P(##=0?5l2SmFe*Ce2&tc$fSt%3(` zxxOtwkhHp))PEScPcbB&R^?j5Z;_(&Q1S+p#L#>1)8c98`oOZ(zZO$|-qnpOoRRqB zO0EzfP{ZN9SA5+Z#X;b$;Ab;eSFXj^e%HHLr;!f?n1Ged9o@O6YME)G=cH{J?JGt| zbvo4(j#hl+;D>&ZO-LJJs%YnjuBvi$zv)4Pm~4h`M79;W;SjeQD+8Wc>SX=hoxVVh zO-MduvAB`&sR|}u8k?KQT%P4tnn_6Xi?p^D+|Is@lf#V1z>^JVUu(0DlXXDCx?k4R zU06=j8{BK$!kAr~RJ*aPH5%^QS-NEpv{F+|Aaj4bg{z0f(CfLvx4fy1dvIwcoxO4k zWdu+NzlQoU9yTxO86N_@^|1~A>`)q!MHM2u=P9%mP@*kg9m}s!N(>7pR-66Kk3}!q z>wke;E)#s%et`bhWybhPLP^@ZOS@%}nx{1(hy^(=*fXPI^si*@kblwUvq5{#pIM9 zB#H%8I9hmZ)v~mmX?eNIwJK)ICM23%%msRtNAP(>KLJBY>*T%?cTWolr?0rq$<)9Bi)kwq$MN zABMKc{8+x@q5CM>SW40S5M@tBD4m`t!5~Y|Ha(dVm*7q;%6Y*nK#^!5h!F-|(A`Y9b=T8+ zMJ#=~M_H1Gt{cJ2n^-PsMT(XM%!>z?-dNf$Yrc2wUBG@-~wGj4x$aW%IB0diw%p^KTm~3mPpiNO1uq z(R&_}%>%T-QzQNEr44sLgGL4-$s_w;$Cy=uX%%xG3Hyw zghkm#j`mWCk-WSzpDf+5E%^6!x z$(h{bW7l1a73EhRKC-oDNhT`N+#m&F&d_*P7n^vHpwW8(uz9)PlGPj0o6^9w8<&kN z3eGP(?E1VVCXU8R^E5|-qQ84`ovP{h$USAk*tcb3q%_}kk`Ns9SL;ieqDrCTKLci5GQ%RQf96MBnG+WT#77lnRBsPGv6O;Nu zhsZ7Q&vw7}f3mOJ|2XLjQxY|xFlxk%wo{<%QL#aZ*K6&BOvfyXfuFlla|%!;EOX)@ z&n@E?{=GUtC3*AuP4P4$b7stkU|X37azcARHC@4>7>j} zE>23hW8x-INy}V8i<-2lbl=?@C zvrp^r1(0ptBMXkIZc*B6({E23WsGY_n~xO5BEjRTvk#%aQ6Rvb86VnhcdySuPj|@i zC__V#}CVZzbv-C5dI;7v?6Ouw( zZR;;Hxwn!9w%f9aeav7L&mB9A`09v-&5H-zmCu7Pde#vkiaaP?@iOB^n6N=OcE7}B zf}5w6S%vDF*FlP0b}6Fb85wXX2zu^+3B3NU3R(Z#=0h@PCGA{tI2_{?1XtH;(jD^g zmVb(oDut-yp~gI82-)K;-G|wnhx|xOHrEPG7t^DAgB)O>$0gF*%ZqEEYbWf=lDRncciNK#l+n~F+-dd*o_H0k)@eOJ{A}; z4j4T!Tn+fRlUUq(rez)LY_&(GG~pZeY`nND}aqlL7JfUELzVo}BiaZafuM zjV%1&(Gn=ey*EKopV zLd?cZKY07mYL<)~Z~g{*%F_tPD0f($K>6aOu%Oopjf0JPc#=Zs!@F|gxy|Cj{mT9P z*q27J`lT9uHR;(FYZ@coU9mi+^0C?a9oigny-P>3k{7cAs~^y(lK7)jd@qc!&teqq zlE9${T>Aa_J7&7??(smJz`p!);N`?>*?|0xw6<+V@6-z&1Bu)NlaZS&li19rH%9q? zh9598_$?f8$H-9!l-OedI~L^MLNtC`>is-twn?Ut@uCd;d*GF;_(3P@HRn-=h(~z_ zu`6ZKNcT!H5k*+CP0sa-`_sUb9p4YXbYF6h8jsOHT80Of$Pe{awoY{YR=WGHl8im2 z-lu(b<(IYF7QvV7hzr`9)=4n|G;N#8Yc{`RRmbA>s`>Sk^uGb%jTb}yo$tO8Pf?1e zYLO^=s$)j~EPZs@BvR};-=qOrMtYX?7VsYi@Z0DW)o+hJKDRS3Uxsbl4@JRydx3^! z9}AmDlaCP@OCX644_cqAp+f}oGeWRSeH;;~vWslE?3P$m3=mC8-k$YzTW_4FXf$4t{Fb_J47N!CZuV)_^O z=Q9zS)#}yLuAde>a@`&K#+eUpx0WCLChlr%{+4c-zgf!s4`c1`jge|mpYBwN+rAy! zxT&Vf+igy++5&g8w&$-Nd+o}#+0IApru&R~MdVm_3?D;=s%8*b<@*y3n&MquF_Rv0>a{)ZZ7khgyO5ZhYSFsU0{XX8!ai z9XzEVe}cg~Z5>JXo2jF);i>33oLzNU^)w)E7p8#!_g3zS$`)}p^`yl1@8@RF{`L4? z7^7E6&<%v8BENM*hTmgidw4%YB5(7bM6~Aq2DQol*y$52Y>gf#E8g~9(?OQEo5ULw zQ*JBOvV4D?74C&>pp1BX+!29Jemajh`?$cQdua$>P;MhYzC^6Er{Uo)ll)bnB$5&R zhgr9@ldT>t3VmJg3WU;{8IsFn^#&$-Hp)%##bAI^VB*-*E zRmJr2^N$PNjM^CQHzabScYy^jw}&%jZFWnCcdLiF-zw~nX;y@|ez4j752O1@dNk~d z_}*pPN^~^AEhrJs!12?z|K8BL0P@`#-e*!UH}qvBy}5w($A5O|7#!tVg6|T{edJ;e zEny#re0hOm-liCkD--%g`toM4 zZO@VZRW>z`j~!PwpHabM1@Y9Kn}ewP#&j93+5M zz(4Ul5m8%Y?)KYpe(NC>Se8{tXi=M<;0`0OSL|mBwtsqgKFj@v)xPoLrJF3vAKG|2 zN2}X6vK|3_XBOg#Qs(B4{45uI^Dr{gcwxI8CYCplgnps4bo%AU1jlp;IDr)7+}*af?~#y?d{@toEAj zd%{@nhw%H)ZlM_)o!xE|pHkP+!e2oHh%kD5OP)Xcl&fK5eY1}}k?yl;ps0iyiXW6* ziJZb4TDq91REP(}qE9K8#qlp~hrv3XSx7 z1Zk7=26J$63~0mD`<>akpN69}@zUej!d<&D05N)-!y*zFCI@7eV9dyL<^Y#1;6xDx zvd{G@=e#HpUI|z`Py&J^ee~VxSee#d(PAur0$)oO9qUIMf4Q$VR`=IIOl&ycb zWQT`8aDBPw{lduZ!^a=|j3~8Vxn?^YVc&F^cAiXlR4O3FpWJ)tTqVvu{ClaD$(~#> zW%tvbI4uMZZd(=q00KQ<;a31E)LeiziU)WgsM2xrQTGGmbE`KB3x=rL4rzIA?Q+On z2ChEhltae>{9FZshW_wo-Q&}H6SSzi85+07GcB|LvEo~ik+pAb#rv`1iz&Br9FHPOVV9qUx$PQs48~|7y z*f3E^k#ci1WDa;ganrk#7ZmCsTE9Z31CY=E00yQ2;2)`wrtdZ0<=vw5iY~yc-Twes zoD)rI=)BnolT133kK#%yS3&4P*PzteV&!GgorvlzIvFT5#MUtjcRh3rGP5dQ6AY>e zyfdBdYNy0s5u>MHNHX&Sx#OTF>R*^K)kV+5;UQp#9l6ZoQw`+p%w-A&WLc=4-X1$g z*)T_zVx_FH)mNH|#P4vuq}`lBx!*MaK#W3XaVBp2LX>jHi#_4NscO$b)pfk?W^I{` zaFiWr@#0goq;$tZD^VS#CRK?}isPc0=%RW`T%jo`+EbDOB2uL)Q&lV5r^ZvXtWRiF zcZ|DM{mMNWisjsAJ$U{Uq^t7{)sanONP(-p^GtuCg5lR?wvAjHK+v@=GGFZhUc0?L z8p|+QYQQnhD*ol@2P0$dt}YuFNL_oxK~nYw{suM?`2&v8HdEx$Q7z=S8B#~G`J2XF zTnHTGU6V5hL3-@%Deam8BhO7jck9RSIup#PchG7q%Y0ouJ#EN4C9ldJ8YdMKUg5tS zLqrM2e!X?xCH|)IDzVVnxECH{Gg+gEhXbgZfX8QvO;+X|P0S9@Ft%rMl8)KuX}NNI zMQbb~)|ZEfu(_CpX_$!fbP?Np$79*dunRX+2w!xna}Lq@k49v(#57)Fz)U&^J$9WK z72@Tr#;9u))J%UKdOa(xS4x#{M2`OekBRH~FwByJkUnM}13z6ZH_~*ibn~q1vCD~N9HT0Z9;||--MC|l=2aMD3(pmsxt{Z#0`A0aQ?NYZE-XF$%W#LL znXRw9Vh0Of%yzPKS)7_U8h%_yB_=>bQXrb*#uyVEHN`UU7ZbrTZ5!<4kV7_bvdwX1 zxpmZ>!dcT&x*Y}_bQ+uV*Nt5UZ7moqb1^F5`+*1;$3x+q^B*KPQ=QCl4ELL!V+19$ zRF6FK2t#!Vd8&_#=*-8&CfNK@kY5pwV&Y#V9`f3@9}FHfIVvR^fnk;>!)>rWR_2I9 z1_*V`bvyJqdX!yNabK=t6H*_;G2C?vC9DaDsSO<;;BnXLanic;(-+ctn@u9wqisjNJ4 zDe)n3B}(a9=x!Y~DqP}Q8|j{(9X<7WRID=ku-M~MELr}^OG|@YI(2=2D$BrHyi_i) z!xd!@&C?Iz1jV>2Uh%1VQ+=Q?S&}lf2%rX|j!V6=yGn1%{m-1qaC`A}7dspCEKPxl zX0^ld29qRdjP~&sLYE-lrsb)0FOnPC(xr9zg!uj);SBKxU{KBH;zu{HxHB2C4g4ld z^R6a4rF*#7FyBu&xn4Qxn#%{=YhRCZkIdUJw+%*nOWt6@O_HW)-tJX(FOoi1JTbtt z0%p@wEt7RU;NpAfydI5-tmQ7Nrx1*F9)i&e1Mq8!r$9nu`0lOjWsQ6$M@Dhb>GS-! zl>Yz@CnxcH$D`Gi=cXXTf9W`Ssq=-S_}8Z$9n7w*j_^>Lv{(#M5aQ|$V7<%3T{h_b zu^F!L>J8(PT^nyNKQnwY1Mw)Ui@qm1*}s{+v0e+*O}H{m#*_M%fbvvDRAPCLJf~&5 zq=e#pPHGbR-a0b+@1%|99S+p-{lGmN9Sy!v#5t9pb6L~g9lOhyo0ly_ynZFis-G!( zmet%>{FT&pL#16WH$FZ+O5Qat6&-Ie^Mu^v6T0!@3^N_&_xcMEmzc9H8B2z`1H`h< zAst7F;xl6d9d2hC-Izo8J*G0RA8ZsIffl0}d_@DKL_)2AxQknZbJ0FY=Ye#@;Oz|J z;JK7YmF5Y_5^d>%>FdWwqdyUaJT!bT*Qe@nxG;YebzX6G{4AUwA-N z1${$Qn71hDZDo(uOw3*;N12vjMWHtMmMm&h%P~eUxkZ{~H+z2OUvc>&@(|@UhkMA*>z=~Y)(S2x(B?NozkOcUC}`sMF2 zW3Pz+00sl0D_uN*-QzvrX#W6WKr*v6sd2CQhMaCt{jqazs4CnPz!^nP>ij{nA<7o$ znh2IVbLtA{#8j39>{%%B4Ta?K&P>zz8khVlr!%~Ni4HmmvpAD2CWk&Hw14NQ+1+Jy z*!rkIH&7f*8B)E=YF8I2#I2nF0Ft*U;#OnOGb|{>!I*jC3T|*iO-rw-@?P#{EN8cg zoDD17tI?=6sA^y4GimJ@vk3GM=|-kHi349VH0aEgui*3_lk*15l^~!sT>I!_IJtiW zNp=O)K1^Yo{{UCHSD`-!6Bm3e2iyB*83q^}$UciH=HmhgbAr#p5U2=%SAJQ71f$mx z4Jcy)S3~?*Zx0fIz4`f>`etgcRGVo?0Y#UN*HR^ct{X<*+1Ju$xgm(y4bRJ`MxW|1B zt-$<|9wJhSsDD4kfugYny-trk9X0`g0iRP>xPpjko1_Wq_%0 z)~YE$Z2d}$;rY3PT(_ve8Wz4Hrr1dEA(9O34)FdDT=|%|bZIRZ-4vX998NBU?`UuJ zF;kkjLGuS$l`&IHs;U0~GOUN(#7t+IS&vs(E@gS1(7ZGAkK8YxiH_c;8Q-Rw=}u!c z0$yg~WvzOL%sTA|vYj2m9WSOO^bMe?FbT$LPX7SI)k~&sm{|A6GM6qYi(PkHK-w?f`_C3qDMdkrZPR%9#3~B>wE`2PUjrdyZNvrHZN{^oY@Koy+8wFPi-xpMi7Fmo8mG$rN;IAP@h zJ>x`4bCToUCG=m)-WZF=;#;8-`aQavQoB`+(=HrhGMJk|8hkl|G5-Kb#H&_pV?A8{ z($F0_ze)iK(K16Ft+E!oH}*hP+A^JtQr>q1^E+klh^zs2S(Fp^38KtpUSe?<2ASCs z2nEaSjZ6;?V{Yqf5=nC#2pYM>r!~TCVkRw zuv*`8n!~y!*9Mdsh3w(_TQ&yFX`HDbsF+EdcE+)H`^%Zg_#xs#l(sJxhT&+%DjcxNyxFKgSR6O{*{JRvDP=Bm5wq-=5%jD^)-=oFJ;_Z@g=DdS3N#|D=bwQWi2woDy{7O5 z6bAE}xle|{e0-oK)2uN)VuKvYcB9?&nv2IJ?7#8(iAYgpwAPwP=L*)V)jTmW##-nZ zsOHOqv1z4{>bMjK2%wC;;Bz7rc|$~S9@NY0N#;v0gc-x(VG1*UiAykErA7f9bbpHw zTiKM?{{Y%!jy+%U_0(6Hk7Qim{6Jf(!(3-O{70#?!WpXhso7#=p4cwM>}GJWxJcC{ zlH|+mHwz3KwCadjE}D4DoWp55Q(Wh8&ea!o$|ozF+h^t)?5y5?J4>Mu2C=;Qik~hW z%pM#i_ZGfYe4b^a@op;TKf@e#J<5a7A1-NX%1FGnSF5?Re+hWr!8yGE`>YU63!)^$@iFl2F9 zi4JJ5O-m<>4dDn|U8@*ef0C&cgXJ;o@dD+Ag_P&)L9yjy+Z%#*YF3k8m&bSVVrLcv zBvDd}v=?D4^u#{=##Cb+^!GkGJB<94UI^zGWsk)axo9GrBv67sQH7vplh2r zmt)ivrAS8KQ#iB57QQ%?%$6_9B?z~Qu)}{ZKzkk~2-5W)8fD|$E-@H6xejU!2K7nW zUMt3h(#|KqR~!Q$N8AOj9h7kNusiT6E#MwZP3R-gRyNlX#G^aD_W?X2BKL+qh<(fG zc1Fz&H7jQAhP1;5o&y;@leFin0i7l{zD7saI#X1ntPQP#tR~< zAQgzU0|m*p!|NJ zW|E&@?iT7mS4F09KpxH|Z;i|hlRhB;g!p6BDZ~tQvMd1&m>TI}=;kU>ITp^^aC>FL z)plQcsxI@hYIcjD)dwE49YHdR@?0b4nMX0@KBju%!|?~eDj5>8Qo}y?DBAP&H7Z({ z%xM-NSe_lXY_+sYG0zKS^pgJo+MSMbPCsbT`_21d4YZaw(l4T7Df&{HwljDdsGMQ#iXDj zxuiT~>a|kG-G}3}F4Pq&zY@b$S4CqGo)vh{c}fiG;s})Jg6*?0Mob~i5*PC_n$I5N zRxvVO*1h*QvzyTY+P%hYd9QjdUXB-GBZa^8KPF)GY9~gfvHli6=9fV z192&tQN#lGD7RCC9-tb477~N;E1;&cNU4E03V4QVQt*1XVh9`m0Et}OA;j+}UCzLb z!p|@rr3M1exNi$6{}x`__hBNu+r zY~Q7pqlgMB%ABjamX;esW7x9APAe22h>cj4T1zw5UsA#0uy()xO8fOOF7dxau*!pe zScEy(EU}D5Xh8E*R%)?dQNUC$HEhgywXBh~LMr0Bb~|MTXPXaC$wOMHqMjnl#1a#c z`HYjif_NSK&F+MzZk7?X+En6mDL;jO1x?|J^nS?3JQ>3O0EeE8VYBhL`Ns1Rv(8{< zE%!p@{{RpeO13e7GLtZ9Kzznk{n32^8p0-tQ&r!Lz~C&IN+RZqXEm90;PG+cHo)9M zG-?`Z@fv1`9rY@We37Px0@1NeN(pM^r{DU-PpEy2kvU=$+5Z6Ibs^BRKNF^~CjB;_ zstkg0T@GSr=2&pf34%O~zUAe+;$<@_NHZ5MLHCScY7D06T9E9z`hhQ;Lc<)xpTzIE z(+`FJ^n z{n;E?itrxURJseWHZN2>M`o_vE3l}(#{C??*p1nP=$Rh_L}Yj#s#hnF_=wi^oIoAU z*pSvfOtOF_L3wh-mGN@iH1h_v6p6C62-epOas7?TDk{?DR&BnoLkSh7xR3^8QDD{L zKB{UQ6#$WimC~!D{2x6Z(J;v+AvOLUBN)+eG|Iz+n1dm*DqA(a(J5?d<9h}>*6JgH*NBdhDQ|JMG(bRn z{lu|1{!2fw8okpA%87Gj9_?j{ptD7BNQp3?iI%F&={7Y&8t@1FW^g#GI{tOFIJW*>dWNNAPN0OMAVp8Bl!j6Lq~mL?Mos z{6jF;L#TP1Iy!SIGmZ5v*-t`-YnW;i8l1vzqlB;F=Z0JngA-U)@_~~EIe^Mru9-Cq z-1{q_&Bu+``_MlUtDs8ErNuymB}(nk*GdkUz9mD5d4v|PueqpkX$|{!xZfD_Q#ND+ zz;G2X@CCj*%XzdS_!Kg*(<|lx)E%Kg_hvgsZ*xt)!xCdKU=KR|!5}fVn~mG9{puiJ zP`!JJfZmt&DBeAlDJWO*5pIYDlI|E1k5H9b@D2xou4*VC0@Hao{N#+&@N+vTvF{W` z%QA5;YvNnBV1(@-O8CL}fZ1J~_kj)Mp(^eYfc7VTAS7@WvfV% zN%)N_p0p(i1)k9*- zZQmpe=Ho0LejuJ)C;Ja(Xtr1m1X)y05i9OYjwUHcn%6t7^CH3;qg4|U5z6f^hVL|H zZc;?$I)N(;4}b@|63h#<1*+iR%&s`&zf5cfOO`&GmXn$AiFsU1j=V?5@MA4C?7l=s zIlLV`y5cd@0E1N`-d)1Zp1))VIg~iVVksMDR@r=ts43l}fRuV+7RY)918@WLrL}gH zCI-TatCIEFTaHaKg|4gBK>?DVlMy8c&v>I@Z16~+9hR^oP_cu`9pjP%lea5;er^a6 zk@?gqv92OpvL8VS^Vgr^dFW14Ns~8vmz{Ztnwxa@eZyBAhM_qB0GM$Om3(HWKRbkQ zW@$Pdt1KTd@fgh}nvJ))Rf?JK46ZmJRSNm&J?>rBXVlG1UYKINPy0S+l769rc7&)^ z9WxIwxl;R2bDVTK5Y@w?0eF=^c-380UD`<97g2mMl=&@`i$)H|HF}~D_zDm&ju}u7 zgu`+6xb`_=gz*eCf{<13<&o2Cb22g#Pj-e`2boX4x~GL8MvUzn!<0Ei}^%KMKnQV$uBVy+8R8eP?98{FUM z!w?TQYL#MK2K7V&s@v)m)YvyDV?KTMff^Gvr|p(|g+5t>0*xNQ#YXR0yf#LX&tp|8 z=W6O&pknIFc4Q3kX7d!nZZkpEH|h%q7n7#dYVPv^uHC&DFer zQMeodZ(=H>vMIFQI0A7%M{TNI1+UZvL}1-?EpaZ=^&4Jx!*Sg0HW6awsZ~*u`{}FyjH+h*%{=RRFFCN!A&2y9+U87^bolihQPz_qT1M}^!_@bUALeYWEZk7jR?FZWrRJ*;#)cc&m0Zd6Cla}U(~{S2edYnJ z3bWr(u7y!syG&F705fj5f{bm1b?zd`k;BU3hkl%NtV{j`CBvghgVJ-&EXp{W^mcOt z)K^e5wsQ`KF*PxNKfZ>Zl{xP(IhivU%%b*(8kXE0%e$z5+(%3}g*5(HH&em!4k3)s zaOqTWnf}eNCHRMKgVZMzH`g-ix)7bGFzI6j<+iS-W#h+w*ZF3i)`Pm@YAh(PctEZu zD5Jy}UhyUgb#lZ~SQ3r#D~U!~Nn6%sR{KRjJO1UttB#D?l!5q#BZrT2s*PDrd-s6r z@bPf%BPqgQ63l~8@OKunj4^V?lGSp=M+Gj!_<5Q85OTXeGKZ>e6H4g`U0%Fe0`kOR zQ~`K=i5DWl4{C!ziW+>yO8HCk1$PhPShnH|8fCrmoPoK=lp>}bs!}k*ZF?YOD}PZf zcq$c{gkbhy9%^iv6WQos4|Qcm$7ptNP4(GpX(7Ri`uXfU+$U-!irA zPJ08SkH<>I#%CQoOa2E!$3u6iew}G1-4+WdrXGG_natvOh0R%UA2OMq@ZxTKz=K~A zj^VX6%4Dwb#HAj1fmq;+-W!H1CBr?S)4pLoCnP^Ns8qil2D&(hcr*~4L;0Sk&q5Nq z8Huu&TH3&@2#X*u`vtRDH8gmS7hFZ5Q6Pm>7=Iry7bs>pEzFAvf0krlj%Eb5mG8}W zjxTpCRZJ=}u=5Rr(FJ*D^NSgJOHeaEWIS&$-fUS>gELn%3%pdla$}~k0tytk?GnN) zxvE)RSkHraE4BTTMDcM|bZZTDef0vfb^Z5nHuAKM6D3pOQ@*S)zhhSRazcdeyGkrm zv`)SFNuyOn)5pHwFH)7n1k;B z0LV++J;8&BL&wx5z}-S#AoR9;!_Pt*nCN4tnC=jWDl;A`9rO!GLd;~T#c<4UOGPG& z+qB6}4kHdODCgtU7h#CDT}830#!r~(-XqV??kip6KZu8KYz(g7uMErHm9B@5)fgi$!>_4>jN7XvJ{b1Qnnns!8Ka1Q2B$hm!K?n|JGh(-%n#*x>3n_h z`7-`uTl$z|ni*nlsqQjLw=nj6Kw%57WF6*)hzg(!+*{UErB=qbyUoNa7W4NPN-EXz z&8C6Pca9Zvnhqvb*~?P4ESkBBoRldS0-y}aP}h7g%9(V=h8K*7EM_Q-3a63pIA+Ph zaX6OG9S*(vUECqjq}`7<71D6k(?rT?e%%;u`G*}H;oItQ#M{!LGQ;8(J9R53DNA{Y z#Ow!08P_t|e9Xg8#<83GgO!)&R8C5SE6gTbLvWs_9;eL9G?y;f&r)1JT?tT#pg40- za1(;WvbVU@rIYq1q^Aj-HTE%mJ;O0Pc+6S4B66l6C5=Yag0A%eyhPj^YxThuwZpl} zU}E#xfwn1%(ohIn+5)nZM+7uGt_9dC8#5lgq9N78z7p&~>RLAl+=8YVl43E^aUAp~ z5R6!hEc)htTc-IIOn(75oOI)-@`PhKn!}P5dg(ib~ia*Ej(oZ z03hx{(zkra%SKluwMNB!aT5;SUYVKCE>Dte3FoKB@Vs>O(1%4TZ9fh;+M7+2VriQ* zm_wXG1Po|{9+ljSgQXP>>SvvFW4@W>)a-w=)5IJZfUKC8vKw_h=3odsFn-~DklGyU z=2>k+yvDj2cL%!+R0b0I6Y5{^zaF|0{KKc*Jxi7U0Elm5wsSJZv72W&f!_AjN~+qr zy>MZQOqs?=XWiICvPxnIc~uKVLjZ&aY#B!i$KvG{Z1%AS=Ah@C6@h_(VRZBF2r+%2 z=+60jM98G8^&XaxJ(0Hc;#9SmjyQAi1>%P-r3S59AU&Mk>nrXwhQ(a=e8I!MCef%u z-LXKD$i{9G5@TXixXy78v4rm!%suEY(SBw)-D*=4Q~v;lvw3QJ7~Myhf-aAV z$wsO5#YILt3tfAL1+1>#vvx~FS!K(ljBBc>NSoCVDsUfgp;-8g9fE&RxBwjxC{X^2am);JJdviO44&d#yh_DJWp@qP7|vOMMrY@9 z3hfSPhj?AW-r+U(Is8;Q9v=@v?=!S75aXs{mJsMdFx)pTeM0(-c0d1SLWa{{Ty%O<1hrKG_gkd8$4ZTF8I)h9VDluLr{^ zGGA_Jiq7{@_AOR-49*5P956{@CS}mNmb9gkt41lye6=(TthZMN4zEUGpOo_DUyf^; zt#v(fDjO&!-Lm#f6S*`)d5WiYLw2&%tvUIE(6ixG?FiL8;_jvbIeQTSxZqu|I`zei zxK(Jd1Ju4M;=IH)2aR38%mVDEJB&pvvWCYDOtC71+-FLU=3FboZxt;o37dBsB4B2Q z8UW>6?#e~QL^_;DtGUEpm(Nph=+bX5@k>SIbJDhSuW-HQazlY(>4ahI$4A8NDt49L z7|cA*dN(rZnK30QXO<7H&@;>(T;M`F%o;iGGt9g}{6ZB4Npm}c(=y?3O+r24-RWIU zAi{R(M23L;u=(cpwE$FG`WW7b%BhY#LXomQ7yA{)+zK~Xmx`Zo-rK2}`m(oNvcb2@ zH9?jplT(AF?8HgDm^}8ClFAs?RvMzWP3-RhWKi08l$m%bdXKf@A6=HtTm8caPc@0T zW3e<$az>V(jcqwdix+q;ljD(@v{)B4`e1yy8p?Sg2y+CH^doz?mXJ_b_>@))WI@v< z$_zCshAtdvoL57m(+EYP>jVyLbm=wzczT#C5YK@YIidhSS5oH-r>MGxBgBcsd$*Om zq6KR{bS096sC2!VcO<=-{{XQP6bYV7Q7b}QoTqWzIcOub(5mhK0Na(??~~?p*bYc5 zIDPk)K&%&ow53Op@i#XwH^oYvah>wZrdU3V$N_iXM~HtSW$1MrZ$BHO+|CQ>w@+r^ zV&h>3*m{PmIF#|%Q13XE%q8DJiy6D5weF{s9xqMK_+Zn2Q{an!Wfl|uU}fkhB;xKE zx`6aM{q!wn6!i^HiNy55dVV_oCnOhe_X*8M<9^_QIK8|MAyi9fcA03~b0~NL-R3?o zJ6O>f*QSiS^h8Z`WDY!$mV&fQ;v{~Ndzdwj>5ryk;MEfE))BBcJ4^suRjwmLdt&lH zes9Ac>j_I&mo-okxRkPr+`g(p-3Q4RFRGl6X~!=2-V=)Y(C9m2DzQ@hR_YY?vWiqE zG%m!l70JczKMrLk-^5l;Ih^CU`r!Sc1v``R&Yla3}M!DuJE+AZeG;_VcDx@GvWjq9bX1v zSfe(snO@eao$d{jU+)s|8PnBD^h<`YRQ$jo38!JsbW3W6^FtLcL)JXXq;YBW1-Z|o z#6Tn4quMNS&qe8d2y|-nzXCY>lSDhsx?IRQR}#C-jB`FGxcZkWX7w-Cf3TF%m{vi8 z#f+uqBsy2?>S?WQVDsRG?!V#>Ke@%O2=?tRle``-0enOM0JEE%GpKGAF~lMB(3hFA z9711BZf~aH3x^Wm=4ZOh_P7er3LSzvg4-W#8~Y)sh^c>1>IjaSv(#P2D&Zt4W@=yy zd8+RhONG^HaKn{*K`J*sxQk|5+uzqrJF`@C^-wOB>&)5~e~^Y}WP@G(5Zc&;^}F8; zs-ZW8e#xa9ci!i5or;xLHyp$EE`3azy5=T{CIB)wGkIaCuS`m7nZ+8O$(nP-$W2u| z!Uj4!jCJfodp7;dyz^tJeD$t+pScQAtNN5~xm?QxdZesa4r7k;jp;cN5MjsMSc`&I zXprAyJ<*R*c2C1qEJoDsARHab?H+GDun>M(NIa7$6I%mO8#7D2>aGw<%ZB>!AvS(kZ0HX17N_WWou*PiuwqJVO>A^>lH# zR7STiGZ)YQ0D2zfob)+(Wxv6;Wew~!R1)7DOq{^+1w+AXykcJo2w|IQ9r_dIUqf*7 zeNH-dhq!9zGP>~%&EHB6Wk)g*ws52^)g#;;25Dy!aguaJIv}fkvl}%7&oMtah zIu&#u>f$qWOvf5f`G!v2W8v*T50j$Aklw4u{;|PPt zQSp(QcHi|M1GV6}Mh5~x>;C}x1Rhf8&)vfSjqAL7C{;Y~4k(4~jRV8l;06Y`#7mX< zWt#f?nFrS$r=&L6HO==l#9cn2`+>)1#rb(4U^`WeuMvX=638%$YaVCg^xkOT=_$ow z~lZ47uUvru~D2<`07X?g;H0 z4${x+a}_`EfJ!R_Y*5vF!?JTS)iZdr(#h>rC_>=R6r++?0dZP7VWpi-I}Pcg6SojG zsaT_>!=o4qlaVv4{@f9^F*84l&q{*w)+1;cR7!N0W-2}Jke)1M`aMqBL;XT!6U)6l_o%{~*t6RX<=tdd zv*s{`o@)B|_)1QMyg~`YQ&_U~o5mo4p?>P59WzKad@gAL_`^-LO zoL5%aj1~U?(>pW$L8Hn2!LqIkcl9`*2tM@-Z_o7zRVln1l3vQ@9SRqonT4CY&=K!#`j-74q62Xkh7b1`iUh-f@I|=G`9>pI ztO1H}4XZ6GUAf=>YFCIQ4NG-#iJLKUh6ozFOfv2;5t4HGhNIH@4_qJz%S}1m)7?HJ z)SJ=r%Nm;PK9~lVmRHzw7{$Tg-R@SEP-NRP6{Z^&Hh9~&y8#$*s)x9s_c!`_1`>8E z(mNxAjKJ0M)X`_&rS3JV`*o;Lv^?)n9Gq`e1c7e(6$(w>Y*@uiklo%fD;U(P!q!gJ z6Gh{Xi11ESt|5Q!ZdYpYF@(6|ZdlisM%9Ci7?ffH#rlY6GE!g8WuOKB0J)@~SIxhK z1O)xWyS61v^eo4X#g=2}>y6HhrzBg+h&gAB;v7eObaPOi`uDt&`{13S@zVVDWZ-~) zPt>uRnrOL{g4#2JU7>rKIfn(xnDA$Q`g@mm4j}=TMMaoP&rTuI{up(+T9}6<<1ir! za3fu5nCsfbdz9ldlAE^/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 literal 0 HcmV?d00001 From 473f0575338edde5a140ba0dd9bdc7dbe091bc93 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Mon, 18 Jan 2021 15:47:49 +0100 Subject: [PATCH 05/14] move impressum, privacy policy and link to twitter to the main navigation --- docs/src/layouts/App/index.vue | 4 ---- docs/src/links.yaml | 10 ++++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/src/layouts/App/index.vue b/docs/src/layouts/App/index.vue index 03fe948b..3f5e4c82 100644 --- a/docs/src/layouts/App/index.vue +++ b/docs/src/layouts/App/index.vue @@ -65,10 +65,6 @@

Edit this page on GitHub · - Impressum - · - Privacy Policy - · Made with đź–¤ by ĂĽberdosis
diff --git a/docs/src/links.yaml b/docs/src/links.yaml index 2cc56537..e3176c41 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -183,7 +183,17 @@ - title: Keyboard Shortcuts link: /api/keyboard-shortcuts + - title: Links items: + - title: 'Follow on Twitter' + link: https://twitter.com/tiptap_editor - title: Documentation for tiptap 1.x link: https://v1.tiptap.dev + +- title: Legal + items: + - title: Impressum + link: /impressum + - title: Privacy Policy + link: /privacy-policy From 8f1ca0f4dd5f5c59d2ae0997abdb6feb481ad165 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Mon, 18 Jan 2021 16:13:36 +0100 Subject: [PATCH 06/14] improve the multiple editors example --- docs/package.json | 1 + .../demos/Examples/MultipleEditors/index.vue | 60 ++++++++++++++++--- .../src/docPages/examples/multiple-editors.md | 6 +- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/docs/package.json b/docs/package.json index f6b452d6..d456261e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,6 +28,7 @@ "vue-github-button": "^1.1.2", "vue-live": "^1.16.0", "y-indexeddb": "^9.0.6", + "y-prosemirror": "^1.0.5", "y-webrtc": "^10.1.7", "y-websocket": "^1.3.8", "yjs": "^13.4.7" diff --git a/docs/src/demos/Examples/MultipleEditors/index.vue b/docs/src/demos/Examples/MultipleEditors/index.vue index 33c6d230..672a5a35 100644 --- a/docs/src/demos/Examples/MultipleEditors/index.vue +++ b/docs/src/demos/Examples/MultipleEditors/index.vue @@ -18,6 +18,12 @@
+
+ JSON +
+
+ {{ json }} +
@@ -31,7 +37,7 @@ import TaskList from '@tiptap/extension-task-list' import TaskItem from '@tiptap/extension-task-item' import Collaboration from '@tiptap/extension-collaboration' import * as Y from 'yjs' -import { WebsocketProvider } from 'y-websocket' +import { yDocToProsemirrorJSON } from 'y-prosemirror' const ParagraphDocument = Document.extend({ content: 'paragraph', @@ -55,13 +61,12 @@ export default { title: null, tasks: null, description: null, + ydoc: null, } }, mounted() { - const ydoc = new Y.Doc() - - this.provider = new WebsocketProvider('wss://websocket.tiptap.dev', 'tiptap-multiple-editors-example', ydoc) + this.ydoc = new Y.Doc() this.title = new Editor({ extensions: [ @@ -69,10 +74,11 @@ export default { Paragraph, Text, Collaboration.configure({ - document: ydoc, + document: this.ydoc, field: 'title', }), ], + content: '

No matter what you do, this’ll be a single paragraph.', }) this.tasks = new Editor({ @@ -83,10 +89,17 @@ export default { TaskList, CustomTaskItem, Collaboration.configure({ - document: ydoc, + document: this.ydoc, field: 'tasks', }), ], + content: ` +

    +
  • And this
  • +
  • is a task list
  • +
  • and only a task list.
  • +
+ `, }) this.description = new Editor({ @@ -95,13 +108,28 @@ export default { Paragraph, Text, Collaboration.configure({ - document: ydoc, + document: this.ydoc, field: 'description', }), ], + content: ` +

+ This can be lengthy text. +

+ `, }) }, + computed: { + json() { + return { + title: yDocToProsemirrorJSON(this.ydoc, 'title'), + tasks: yDocToProsemirrorJSON(this.ydoc, 'tasks'), + description: yDocToProsemirrorJSON(this.ydoc, 'description'), + } + }, + }, + beforeDestroy() { this.title.destroy() this.tasks.destroy() @@ -150,5 +178,23 @@ export default { &--title { font-size: 1.6rem; } + + &--json { + background: #0D0D0D; + color: #FFF; + font-size: 0.8rem; + } +} + +pre { + font-family: 'JetBrainsMono', monospace; + padding: 0.75rem 1rem; + border-radius: 0.5rem; + + code { + color: inherit; + background: none; + font-size: 0.8rem; + } } diff --git a/docs/src/docPages/examples/multiple-editors.md b/docs/src/docPages/examples/multiple-editors.md index ccfe1c6e..da61e913 100644 --- a/docs/src/docPages/examples/multiple-editors.md +++ b/docs/src/docPages/examples/multiple-editors.md @@ -1,9 +1,5 @@ # Multiple editors -The following examples has three different instances of tiptap. The first is configured to have a single paragraph of text, the second to have a task list and the third to have text. All of them are stored in a single Y.js document, which is synced with other users. - -:::warning Shared Document -Be nice! The content of this editor is shared with other users from the Internet. -::: +The following example has three different instances of tiptap. The first is configured to have a single paragraph of text, the second to have a task list and the third to have text. All of them are stored in a single Y.js document, which can be synced with other users. From 1e478cd26ffb196384033deba82727642e30a665 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 12:26:41 +0100 Subject: [PATCH 07/14] examples: improve the todo app --- docs/src/demos/Examples/TodoApp/index.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/src/demos/Examples/TodoApp/index.vue b/docs/src/demos/Examples/TodoApp/index.vue index b8551d06..0e9bb4cd 100644 --- a/docs/src/demos/Examples/TodoApp/index.vue +++ b/docs/src/demos/Examples/TodoApp/index.vue @@ -43,8 +43,13 @@ export default { ], content: `
    -
  • A list item
  • -
  • And another one
  • +
  • flour +
  • baking powder
  • +
  • salt
  • +
  • sugar
  • +
  • milk
  • +
  • eggs
  • +
  • butter
`, }) @@ -70,5 +75,9 @@ ul[data-type="taskList"] { margin-right: 0.5rem; } } + + input[type="checkbox"] { + cursor: pointer; + } } From 5452095343fdef896b4cf81e7dbf9d5ff75e684e Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 14:49:07 +0100 Subject: [PATCH 08/14] experimental linters commit 5b31740d967bb61bfed6a2338d07e8fc6e4957b3 Author: Hans Pagel Date: Tue Jan 19 14:48:00 2021 +0100 refactoring, disable TS checks for now commit 6fcc5082287ba4dd5457b8ea6e6d8300efaaafb6 Author: Hans Pagel Date: Tue Jan 19 14:42:14 2021 +0100 move everything to a new experiments structure commit 2b5f394ad4c916f7ac364fa03d05e2f4311e9b1d Author: Hans Pagel Date: Mon Jan 18 20:22:35 2021 +0100 refactoring commit 91a3747adca114fbce0972a2a2efa751e94d4ea4 Author: Hans Pagel Date: Mon Jan 18 17:48:59 2021 +0100 refactoring commit 4550fa70059060b6702425970ba33bcf6a0f3e66 Author: Hans Pagel Date: Mon Jan 18 17:37:43 2021 +0100 load plugins in the example commit a7087af14044673c587c233c44a5e767ff23b160 Author: Hans Pagel Date: Mon Jan 18 17:31:47 2021 +0100 init new linter plugin --- .../Experiments/Linter/extension/Linter.ts | 98 +++++++++++++++++++ .../Linter/extension/LinterPlugin.ts | 23 +++++ .../Experiments/Linter/extension/index.ts | 8 ++ .../Linter/extension/plugins/BadWords.ts | 26 +++++ .../Linter/extension/plugins/HeadingLevel.ts | 30 ++++++ .../Linter/extension/plugins/Punctuation.ts | 37 +++++++ docs/src/demos/Experiments/Linter/index.vue | 96 ++++++++++++++++++ docs/src/docPages/experiments.md | 4 + docs/src/docPages/experiments/linter.md | 5 + 9 files changed, 327 insertions(+) create mode 100644 docs/src/demos/Experiments/Linter/extension/Linter.ts create mode 100644 docs/src/demos/Experiments/Linter/extension/LinterPlugin.ts create mode 100644 docs/src/demos/Experiments/Linter/extension/index.ts create mode 100644 docs/src/demos/Experiments/Linter/extension/plugins/BadWords.ts create mode 100644 docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts create mode 100644 docs/src/demos/Experiments/Linter/extension/plugins/Punctuation.ts create mode 100644 docs/src/demos/Experiments/Linter/index.vue create mode 100644 docs/src/docPages/experiments.md create mode 100644 docs/src/docPages/experiments/linter.md diff --git a/docs/src/demos/Experiments/Linter/extension/Linter.ts b/docs/src/demos/Experiments/Linter/extension/Linter.ts new file mode 100644 index 00000000..42fe777f --- /dev/null +++ b/docs/src/demos/Experiments/Linter/extension/Linter.ts @@ -0,0 +1,98 @@ +// @ts-nocheck +import { Extension } from '@tiptap/core' +import { Decoration, DecorationSet } from 'prosemirror-view' +import { Plugin, PluginKey, TextSelection } from 'prosemirror-state' + +function renderIcon(issue) { + const icon = document.createElement('div') + + icon.className = 'lint-icon' + icon.title = issue.message + icon.issue = issue + + return icon +} + +function runAllLinterPlugins(doc, plugins) { + const decorations: [any?] = [] + + const results = plugins.map(LinterPlugin => { + return new LinterPlugin(doc).scan().getResults() + }).flat() + + results.forEach(issue => { + decorations.push(Decoration.inline(issue.from, issue.to, { + class: 'problem', + }), + Decoration.widget(issue.from, renderIcon(issue))) + }) + + return DecorationSet.create(doc, decorations) +} + +export interface LinterOptions { + plugins: [any], +} + +export const Linter = Extension.create({ + name: 'linter', + + defaultOptions: { + plugins: [], + }, + + addProseMirrorPlugins() { + const { plugins } = this.options + + return [ + new Plugin({ + key: new PluginKey('linter'), + state: { + init(_, { doc }) { + return runAllLinterPlugins(doc, plugins) + }, + apply(transaction, prevState) { + return transaction.docChanged + ? runAllLinterPlugins(transaction.doc, plugins) + : prevState + }, + }, + props: { + decorations(state) { + return this.getState(state) + }, + handleClick(view, _, event) { + if (/lint-icon/.test(event.target.className)) { + const { from, to } = event.target.issue + + view.dispatch( + view.state.tr + .setSelection(TextSelection.create(view.state.doc, from, to)) + .scrollIntoView(), + ) + + return true + } + }, + handleDoubleClick(view, _, event) { + if (/lint-icon/.test(event.target.className)) { + const prob = event.target.issue + + if (prob.fix) { + prob.fix(view) + view.focus() + return true + } + } + }, + }, + }), + ] + }, +}) + +declare module '@tiptap/core' { + interface AllExtensions { + Linter: typeof Linter, + } +} diff --git a/docs/src/demos/Experiments/Linter/extension/LinterPlugin.ts b/docs/src/demos/Experiments/Linter/extension/LinterPlugin.ts new file mode 100644 index 00000000..46fc867a --- /dev/null +++ b/docs/src/demos/Experiments/Linter/extension/LinterPlugin.ts @@ -0,0 +1,23 @@ +// @ts-nocheck +export default class LinterPlugin { + protected doc + + private results = [] + + constructor(doc: any) { + this.doc = doc + } + + record(message: string, from: number, to: number, fix?: null) { + this.results.push({ + message, + from, + to, + fix, + }) + } + + getResults() { + return this.results + } +} diff --git a/docs/src/demos/Experiments/Linter/extension/index.ts b/docs/src/demos/Experiments/Linter/extension/index.ts new file mode 100644 index 00000000..29d42a68 --- /dev/null +++ b/docs/src/demos/Experiments/Linter/extension/index.ts @@ -0,0 +1,8 @@ +import { Linter } from './Linter' + +export * from './Linter' +export default Linter + +export { BadWords } from './plugins/BadWords' +export { Punctuation } from './plugins/Punctuation' +export { HeadingLevel } from './plugins/HeadingLevel' diff --git a/docs/src/demos/Experiments/Linter/extension/plugins/BadWords.ts b/docs/src/demos/Experiments/Linter/extension/plugins/BadWords.ts new file mode 100644 index 00000000..59194c21 --- /dev/null +++ b/docs/src/demos/Experiments/Linter/extension/plugins/BadWords.ts @@ -0,0 +1,26 @@ +// @ts-nocheck +import LinterPlugin from '../LinterPlugin' + +export class BadWords extends LinterPlugin { + + public regex = /\b(obviously|clearly|evidently|simply)\b/ig + + scan() { + this.doc.descendants((node: any, position: any) => { + if (!node.isText) { + return + } + + const matches = this.regex.exec(node.text) + + if (matches) { + this.record( + `Try not to say '${matches[0]}'`, + position + matches.index, position + matches.index + matches[0].length, + ) + } + }) + + return this + } +} diff --git a/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts b/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts new file mode 100644 index 00000000..ebb2cd8f --- /dev/null +++ b/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts @@ -0,0 +1,30 @@ +// @ts-nocheck +import LinterPlugin from '../LinterPlugin' + +export class HeadingLevel extends LinterPlugin { + fixHeader(level) { + return function ({ state, dispatch }) { + dispatch(state.tr.setNodeMarkup(this.from - 1, null, { level })) + } + } + + scan() { + let lastHeadLevel = null + + this.doc.descendants((node, position) => { + if (node.type.name == 'heading') { + // Check whether heading levels fit under the current level + const { level } = node.attrs + + if (lastHeadLevel != null && level > lastHeadLevel + 1) { + this.record(`Heading too small (${level} under ${lastHeadLevel})`, + position + 1, position + 1 + node.content.size, + this.fixHeader(lastHeadLevel + 1)) + } + lastHeadLevel = level + } + }) + + return this + } +} diff --git a/docs/src/demos/Experiments/Linter/extension/plugins/Punctuation.ts b/docs/src/demos/Experiments/Linter/extension/plugins/Punctuation.ts new file mode 100644 index 00000000..d3a228d7 --- /dev/null +++ b/docs/src/demos/Experiments/Linter/extension/plugins/Punctuation.ts @@ -0,0 +1,37 @@ +// @ts-nocheck +import LinterPlugin from '../LinterPlugin' + +export class Punctuation extends LinterPlugin { + public regex = / ([,.!?:]) ?/g + + fix(replacement: any) { + return function ({ state, dispatch }) { + dispatch( + state.tr.replaceWith( + this.from, this.to, + state.schema.text(replacement), + ), + ) + } + } + + scan() { + this.doc.descendants((node, position) => { + if (!node.isText) { + return + } + + const matches = this.regex.exec(node.text) + + if (matches) { + this.record( + 'Suspicious spacing around punctuation', + position + matches.index, position + matches.index + matches[0].length, + this.fix(`${matches[1]} `), + ) + } + }) + + return this + } +} diff --git a/docs/src/demos/Experiments/Linter/index.vue b/docs/src/demos/Experiments/Linter/index.vue new file mode 100644 index 00000000..b4c09f9c --- /dev/null +++ b/docs/src/demos/Experiments/Linter/index.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/docs/src/docPages/experiments.md b/docs/src/docPages/experiments.md new file mode 100644 index 00000000..70f7d340 --- /dev/null +++ b/docs/src/docPages/experiments.md @@ -0,0 +1,4 @@ +# Experiments +Congratulations! You’ve found our secret playground with a list of experiments. Be aware, that nothing here is ready to use. Feel free to play around, but please, don’t open an issue for a bug you’ve found here or send pull requests. :-) + +* [Linter](/experiments/linter) diff --git a/docs/src/docPages/experiments/linter.md b/docs/src/docPages/experiments/linter.md new file mode 100644 index 00000000..37d083f8 --- /dev/null +++ b/docs/src/docPages/experiments/linter.md @@ -0,0 +1,5 @@ +# Linter + +⚠️ Experiment + + From 7f63a0b2e0b22ddcc629b012bc8d287c8b8d665a Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 14:57:41 +0100 Subject: [PATCH 09/14] experimental annotations commit 41c0fe487b78fdabac4fc0abd922fc6b23b87821 Author: Hans Pagel Date: Tue Jan 19 14:55:36 2021 +0100 move to the new experiments structure commit 5b22dcaf042e247b138fc00ccaea1f1baa52b7a4 Author: Hans Pagel Date: Tue Jan 19 14:50:21 2021 +0100 enable typescript checks again commit 50d566f72c1eda9175075173e9b11c125fb0d767 Merge: 5352c488 a7d52bb0 Author: Hans Pagel Date: Tue Jan 19 14:49:47 2021 +0100 Merge branch 'feature/annotations' of github.com:ueberdosis/tiptap-next into feature/annotations commit 5352c4889f7d443148f6507bd0c372eec0b0a1dc Author: Hans Pagel Date: Fri Jan 15 22:44:52 2021 +0100 more fiddling with Y.js commit e7c7fb70e7724ac3134de0aa47db06bc72a7925a Author: Hans Pagel Date: Fri Jan 15 21:42:51 2021 +0100 fiddle around with Y.js commit a8b8268d6f3025a407caefed22c9db5657ca04f5 Author: Hans Pagel Date: Fri Jan 15 20:18:21 2021 +0100 refactoring commit 6bbc94ff417323bedac6c9cbcb541cbfdb471090 Author: Hans Pagel Date: Fri Jan 15 20:15:57 2021 +0100 refactoring commit dbdb3d3039bb818a973bb07c1c05c14ec73f6110 Author: Hans Pagel Date: Fri Jan 15 14:59:56 2021 +0100 refactoring commit 1d8038dd6b27f00d723b547d4ebb75351608b2d4 Author: Hans Pagel Date: Fri Jan 15 11:07:17 2021 +0100 clean up commit 4024ceaa7afddf890dd89610f487bd58231f1e09 Author: Hans Pagel Date: Thu Jan 14 22:01:09 2021 +0100 refactoring commit 4659583eee59571716cadaa821200f9cded5e2a0 Author: Hans Pagel Date: Thu Jan 14 21:49:08 2021 +0100 disable typescript errors for now commit 4a30fd13e4f91dd740fecd98e45972712ad9b742 Author: Hans Pagel Date: Thu Jan 14 21:48:23 2021 +0100 code style commit 1209ebafb21ab94f287d3c81db72dcb0d66d02d6 Author: Hans Pagel Date: Thu Jan 14 21:45:20 2021 +0100 add a comment, set default class commit 3a4394e4f107ad6df58d66eb690e25a4e58f9176 Author: Hans Pagel Date: Thu Jan 14 21:41:03 2021 +0100 strange refactoring (wip) commit 32e2d8a29bde0e282092799c69b1f32a85eb1251 Author: Hans Pagel Date: Thu Jan 14 17:19:12 2021 +0100 add extension documentation page, refactoring commit 4f9460895fce2c91399d230aa28d34d22bd11f8f Author: Hans Pagel Date: Thu Jan 14 15:23:16 2021 +0100 refactoring commit 59d23958d524eb6055772880a525ec6828b93e35 Author: Hans Pagel Date: Thu Jan 14 12:54:25 2021 +0100 refactoring commit 66ea1cd22634af1d00b19e95274ffa60bcbd5506 Author: Hans Pagel Date: Thu Jan 14 12:52:49 2021 +0100 clean up commit 0d6a624029ef2318c5567db0de776343beefeb27 Author: Hans Pagel Date: Thu Jan 14 12:33:54 2021 +0100 refactoring commit 887767f78da94cd15387b581cf6b5c0f565f4b12 Author: Hans Pagel Date: Thu Jan 14 12:12:58 2021 +0100 refactoring commit c15bda12bdc76d7f901ed27740d85467b07e372b Author: Hans Pagel Date: Wed Jan 13 22:23:57 2021 +0100 refactoring commit 97e7d1b527cde1382ee74e6b8494aca140b66f02 Author: Hans Pagel Date: Wed Jan 13 22:18:14 2021 +0100 clean up commit 2b28e35902209b95fa6beb12c7e64cb9efbb47ad Author: Hans Pagel Date: Wed Jan 13 22:15:18 2021 +0100 refactoring commit 8612666b567ef8d4d8497d3b4dc063ecab7d85ed Author: Hans Pagel Date: Wed Jan 13 22:11:15 2021 +0100 remove version commit f3169a29ea78a0b566a49c7885e687d9ecc09787 Author: Hans Pagel Date: Wed Jan 13 22:09:41 2021 +0100 code style commit 4d1c13ef4c00ddb49ad645983a092e7b4dbff60d Author: Hans Pagel Date: Wed Jan 13 22:07:05 2021 +0100 refactoring commit 393e05278ab26b1d516404949ac6b6557e138085 Author: Hans Pagel Date: Wed Jan 13 21:47:16 2021 +0100 refactoring commit 65ee8f272578bbc172a5a82f634cc483d1314e58 Author: Hans Pagel Date: Wed Jan 13 21:32:24 2021 +0100 add crappy styling commit 816f031d5903ae2cb12f8e216f9f459e1716ec12 Author: Hans Pagel Date: Wed Jan 13 21:24:29 2021 +0100 add basic annotation plugin commit fa5ef2334a05a3ff06242f2e4f9288fe8aa405ce Author: Hans Pagel Date: Wed Jan 13 16:19:15 2021 +0100 init new package commit a7d52bb0d4e2f7979ef87a341da0d15b68213f6a Author: Hans Pagel Date: Fri Jan 15 22:44:52 2021 +0100 more fiddling with Y.js commit 2ad9d5047e27bb6fe1dbe398f4b3ccface028d6b Author: Hans Pagel Date: Fri Jan 15 21:42:51 2021 +0100 fiddle around with Y.js commit 315dc512af2c26dd4f9d2c55b3b629530c60da8e Author: Hans Pagel Date: Fri Jan 15 20:18:21 2021 +0100 refactoring commit 058e79f7efc2385910846a93a6af7e4f40f0d976 Author: Hans Pagel Date: Fri Jan 15 20:15:57 2021 +0100 refactoring commit 576e645797a923aee43e059e7b3485bf924683a4 Author: Hans Pagel Date: Fri Jan 15 14:59:56 2021 +0100 refactoring commit 46798f194fdbb6b5781818e6386efc5c089b46cc Author: Hans Pagel Date: Fri Jan 15 11:07:17 2021 +0100 clean up commit ed7ebd39e13a1ed63931d19a08c2cc7a030f0e0a Author: Hans Pagel Date: Thu Jan 14 22:01:09 2021 +0100 refactoring commit 3d61a206c8f70601845da191e92693baf4cc7f28 Author: Hans Pagel Date: Thu Jan 14 21:49:08 2021 +0100 disable typescript errors for now commit cc2286d82ade7356fa998bfcd2dea2eafaa2f122 Author: Hans Pagel Date: Thu Jan 14 21:48:23 2021 +0100 code style commit bb9fb292693f929793663b83853083157c384136 Author: Hans Pagel Date: Thu Jan 14 21:45:20 2021 +0100 add a comment, set default class commit d547e74f092de6457a574b3d6b852bde3b408c8d Author: Hans Pagel Date: Thu Jan 14 21:41:03 2021 +0100 strange refactoring (wip) commit 99e415b4eba9e4fa704cbe77f053860bd7ae8b1b Author: Hans Pagel Date: Thu Jan 14 17:19:12 2021 +0100 add extension documentation page, refactoring commit ba585e6abe1b56c8c1fcd4e68057d967c23ad67e Author: Hans Pagel Date: Thu Jan 14 15:23:16 2021 +0100 refactoring commit 2981591b8b568e2b41f4f81930d67f75b0ffcd6d Author: Hans Pagel Date: Thu Jan 14 12:54:25 2021 +0100 refactoring commit 4083f3e3ac3f0d8ff54bae78ebb3e957f2f20309 Author: Hans Pagel Date: Thu Jan 14 12:52:49 2021 +0100 clean up commit 409a060be38d50fda542f988780481cffc94c54e Author: Hans Pagel Date: Thu Jan 14 12:33:54 2021 +0100 refactoring commit fb1d0dc46af4a067165dcca19c9b1ba8c7a5cfc9 Author: Hans Pagel Date: Thu Jan 14 12:12:58 2021 +0100 refactoring commit 6cba6e0d098c0f3d3d4ec1f0e74ab50aa7966d31 Author: Hans Pagel Date: Wed Jan 13 22:23:57 2021 +0100 refactoring commit 9f8b6ef0f5455e5c8b331258d9168d01c67e29b6 Author: Hans Pagel Date: Wed Jan 13 22:18:14 2021 +0100 clean up commit 514c4d08039352d9c96212116fc59cb676f86e0b Author: Hans Pagel Date: Wed Jan 13 22:15:18 2021 +0100 refactoring commit 3b0b99d0029130696b7651a9a417bcbee5a35b6d Author: Hans Pagel Date: Wed Jan 13 22:11:15 2021 +0100 remove version commit 64fc138d73d9981b8e187c703c68146be6276664 Author: Hans Pagel Date: Wed Jan 13 22:09:41 2021 +0100 code style commit cb42c8c504bc02c929bd041a1f1b87c3a8f068f8 Author: Hans Pagel Date: Wed Jan 13 22:07:05 2021 +0100 refactoring commit 4203615a35d34cd6988ac0377507f32f197860af Author: Hans Pagel Date: Wed Jan 13 21:47:16 2021 +0100 refactoring commit cf476d899193540013da22c4d078c1daca86f2d3 Author: Hans Pagel Date: Wed Jan 13 21:32:24 2021 +0100 add crappy styling commit 59a7639ee9c9fb7f3f57c376220a20baec93bba2 Author: Hans Pagel Date: Wed Jan 13 21:24:29 2021 +0100 add basic annotation plugin commit 8d2d9158cc1611da18432d76925c002731d51d09 Author: Hans Pagel Date: Wed Jan 13 16:19:15 2021 +0100 init new package --- .../Annotation/extension/AnnotationItem.ts | 10 ++ .../Annotation/extension/AnnotationPlugin.ts | 33 ++++ .../Annotation/extension/AnnotationState.ts | 95 ++++++++++++ .../Annotation/extension/annotation.ts | 70 +++++++++ .../Experiments/Annotation/extension/index.ts | 5 + .../Experiments/Annotation/index.spec.js | 7 + .../demos/Experiments/Annotation/index.vue | 87 +++++++++++ .../demos/Experiments/Comments/index.spec.js | 7 + docs/src/demos/Experiments/Comments/index.vue | 145 ++++++++++++++++++ .../src/docPages/api/extensions/annotation.md | 8 + docs/src/docPages/experiments.md | 2 + docs/src/docPages/experiments/annotation.md | 5 + docs/src/docPages/experiments/comments.md | 5 + docs/src/links.yaml | 7 + 14 files changed, 486 insertions(+) create mode 100644 docs/src/demos/Experiments/Annotation/extension/AnnotationItem.ts create mode 100644 docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts create mode 100644 docs/src/demos/Experiments/Annotation/extension/AnnotationState.ts create mode 100644 docs/src/demos/Experiments/Annotation/extension/annotation.ts create mode 100644 docs/src/demos/Experiments/Annotation/extension/index.ts create mode 100644 docs/src/demos/Experiments/Annotation/index.spec.js create mode 100644 docs/src/demos/Experiments/Annotation/index.vue create mode 100644 docs/src/demos/Experiments/Comments/index.spec.js create mode 100644 docs/src/demos/Experiments/Comments/index.vue create mode 100644 docs/src/docPages/api/extensions/annotation.md create mode 100644 docs/src/docPages/experiments/annotation.md create mode 100644 docs/src/docPages/experiments/comments.md diff --git a/docs/src/demos/Experiments/Annotation/extension/AnnotationItem.ts b/docs/src/demos/Experiments/Annotation/extension/AnnotationItem.ts new file mode 100644 index 00000000..56b85459 --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/extension/AnnotationItem.ts @@ -0,0 +1,10 @@ +export class AnnotationItem { + public id!: number + + public text!: string + + constructor(id: number, text: string) { + this.id = id + this.text = text + } +} diff --git a/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts b/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts new file mode 100644 index 00000000..290b9cef --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts @@ -0,0 +1,33 @@ +import { Plugin, PluginKey } from 'prosemirror-state' +import { AnnotationState } from './AnnotationState' + +export const AnnotationPluginKey = new PluginKey('annotation') + +export const AnnotationPlugin = (options: any) => new Plugin({ + key: AnnotationPluginKey, + state: { + init: AnnotationState.init, + apply(transaction, prevState) { + return prevState.apply(transaction) + }, + }, + props: { + decorations(state) { + const { decorations } = this.getState(state) + const { selection } = state + + if (!selection.empty) { + return decorations + } + + const annotations = this + .getState(state) + .annotationsAt(selection.from) + + options.onUpdate(annotations) + + return decorations + }, + + }, +}) diff --git a/docs/src/demos/Experiments/Annotation/extension/AnnotationState.ts b/docs/src/demos/Experiments/Annotation/extension/AnnotationState.ts new file mode 100644 index 00000000..23f65823 --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/extension/AnnotationState.ts @@ -0,0 +1,95 @@ +import { Decoration, DecorationSet } from 'prosemirror-view' +import { ySyncPluginKey } from 'y-prosemirror' +import { AnnotationPluginKey } from './AnnotationPlugin' + +export class AnnotationState { + private decorations: any + + constructor(decorations: any) { + this.decorations = decorations + } + + findAnnotation(id: number) { + const current = this.decorations.find() + + for (let i = 0; i < current.length; i += 1) { + if (current[i].spec.data.id === id) { + return current[i] + } + } + } + + annotationsAt(position: number) { + return this.decorations.find(position, position) + } + + apply(transaction: any) { + console.log('transaction', transaction.meta, transaction.docChanged, transaction) + + const yjsTransaction = transaction.getMeta(ySyncPluginKey) + if (yjsTransaction) { + // TODO: Map positions + // absolutePositionToRelativePosition(state.selection.anchor, pmbinding.type, pmbinding.mapping) + console.log('map positions', transaction, yjsTransaction) + + return this + + // const { binding } = yjsTransaction + // console.log({ binding }, { transaction }, transaction.docChanged) + // console.log('yjsTransaction.isChangeOrigin', yjsTransaction.isChangeOrigin) + + // console.log('yjs mapping', yjsTransaction.binding?.mapping) + // console.log('all decorations', this.decorations.find()) + // console.log('original prosemirror mapping', this.decorations.map(transaction.mapping, transaction.doc)) + // console.log('difference between ProseMirror & Y.js', transaction.mapping, yjsTransaction.binding?.mapping) + + // Code to sync the selection: + // export const getRelativeSelection = (pmbinding, state) => ({ + // anchor: absolutePositionToRelativePosition(state.selection.anchor, pmbinding.type, pmbinding.mapping), + // head: absolutePositionToRelativePosition(state.selection.head, pmbinding.type, pmbinding.mapping) + // }) + + // console.log(yjsTransaction.binding.mapping, transaction.curSelection.anchor) + } + + if (transaction.docChanged) { + // TODO: Fixes the initial load (complete replace of the document) + // return this + + // TODO: Fixes later changes (typing before the annotation) + const decorations = this.decorations.map(transaction.mapping, transaction.doc) + + return new AnnotationState(decorations) + } + + const action = transaction.getMeta(AnnotationPluginKey) + const actionType = action && action.type + + if (action) { + let { decorations } = this + + if (actionType === 'addAnnotation') { + decorations = decorations.add(transaction.doc, [ + Decoration.inline(action.from, action.to, { class: 'annotation' }, { data: action.data }), + ]) + } else if (actionType === 'deleteAnnotation') { + decorations = decorations.remove([ + this.findAnnotation(action.id), + ]) + } + + return new AnnotationState(decorations) + } + + return this + } + + static init(config: any, state: any) { + // TODO: Load initial decorations from Y.js? + const decorations = DecorationSet.create(state.doc, [ + Decoration.inline(105, 190, { class: 'annotation' }, { data: { id: 123, content: 'foobar' } }), + ]) + + return new AnnotationState(decorations) + } +} diff --git a/docs/src/demos/Experiments/Annotation/extension/annotation.ts b/docs/src/demos/Experiments/Annotation/extension/annotation.ts new file mode 100644 index 00000000..06c666b6 --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/extension/annotation.ts @@ -0,0 +1,70 @@ +import { Extension, Command } from '@tiptap/core' +import { AnnotationItem } from './AnnotationItem' +import { AnnotationPlugin, AnnotationPluginKey } from './AnnotationPlugin' + +function randomId() { + return Math.floor(Math.random() * 0xffffffff) +} + +export interface AnnotationOptions { + HTMLAttributes: { + [key: string]: any + }, + onUpdate: (items: [any?]) => {}, +} + +export const Annotation = Extension.create({ + name: 'annotation', + + defaultOptions: { + HTMLAttributes: { + class: 'annotation', + }, + onUpdate: decorations => decorations, + }, + + addCommands() { + return { + addAnnotation: (content: any): Command => ({ dispatch, state }) => { + const { selection } = state + + if (selection.empty) { + return false + } + + if (dispatch && content) { + dispatch(state.tr.setMeta(AnnotationPluginKey, { + type: 'addAnnotation', + from: selection.from, + to: selection.to, + data: new AnnotationItem( + randomId(), + content, + ), + })) + } + + return true + }, + deleteAnnotation: (id: number): Command => ({ dispatch, state }) => { + if (dispatch) { + dispatch(state.tr.setMeta(AnnotationPluginKey, { type: 'deleteAnnotation', id })) + } + + return true + }, + } + }, + + addProseMirrorPlugins() { + return [ + AnnotationPlugin(this.options), + ] + }, +}) + +declare module '@tiptap/core' { + interface AllExtensions { + Annotation: typeof Annotation, + } +} diff --git a/docs/src/demos/Experiments/Annotation/extension/index.ts b/docs/src/demos/Experiments/Annotation/extension/index.ts new file mode 100644 index 00000000..7c86e27d --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/extension/index.ts @@ -0,0 +1,5 @@ +import { Annotation } from './annotation' + +export * from './annotation' + +export default Annotation diff --git a/docs/src/demos/Experiments/Annotation/index.spec.js b/docs/src/demos/Experiments/Annotation/index.spec.js new file mode 100644 index 00000000..6a218007 --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/index.spec.js @@ -0,0 +1,7 @@ +context('/api/extensions/annotations', () => { + before(() => { + cy.visit('/api/extensions/annotations') + }) + + // TODO: Write tests +}) diff --git a/docs/src/demos/Experiments/Annotation/index.vue b/docs/src/demos/Experiments/Annotation/index.vue new file mode 100644 index 00000000..9ab11811 --- /dev/null +++ b/docs/src/demos/Experiments/Annotation/index.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/docs/src/demos/Experiments/Comments/index.spec.js b/docs/src/demos/Experiments/Comments/index.spec.js new file mode 100644 index 00000000..6f90b595 --- /dev/null +++ b/docs/src/demos/Experiments/Comments/index.spec.js @@ -0,0 +1,7 @@ +context('/examples/annotations', () => { + before(() => { + cy.visit('/examples/annotations') + }) + + // TODO: Write tests +}) diff --git a/docs/src/demos/Experiments/Comments/index.vue b/docs/src/demos/Experiments/Comments/index.vue new file mode 100644 index 00000000..c2388200 --- /dev/null +++ b/docs/src/demos/Experiments/Comments/index.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/docs/src/docPages/api/extensions/annotation.md b/docs/src/docPages/api/extensions/annotation.md new file mode 100644 index 00000000..c65fea66 --- /dev/null +++ b/docs/src/docPages/api/extensions/annotation.md @@ -0,0 +1,8 @@ +# Annotation +TODO + +## Source code +[packages/extension-annotation/](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-annotation/) + +## Usage + diff --git a/docs/src/docPages/experiments.md b/docs/src/docPages/experiments.md index 70f7d340..34e2966d 100644 --- a/docs/src/docPages/experiments.md +++ b/docs/src/docPages/experiments.md @@ -2,3 +2,5 @@ Congratulations! You’ve found our secret playground with a list of experiments. Be aware, that nothing here is ready to use. Feel free to play around, but please, don’t open an issue for a bug you’ve found here or send pull requests. :-) * [Linter](/experiments/linter) +* [Annotation](/experiments/annotation) +* [Comments](/experiments/comments) diff --git a/docs/src/docPages/experiments/annotation.md b/docs/src/docPages/experiments/annotation.md new file mode 100644 index 00000000..4d4ebbe5 --- /dev/null +++ b/docs/src/docPages/experiments/annotation.md @@ -0,0 +1,5 @@ +# Annotation + +⚠️ Experiment + + diff --git a/docs/src/docPages/experiments/comments.md b/docs/src/docPages/experiments/comments.md new file mode 100644 index 00000000..42fda436 --- /dev/null +++ b/docs/src/docPages/experiments/comments.md @@ -0,0 +1,5 @@ +# Comments + +⚠️ Experiment + + diff --git a/docs/src/links.yaml b/docs/src/links.yaml index e3176c41..d03fc02f 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -35,6 +35,10 @@ link: /examples/drawing - title: Multiple editors link: /examples/multiple-editors + - title: Comments + link: /examples/comments + draft: true + - title: Guide items: @@ -151,6 +155,9 @@ - title: Extensions link: /api/extensions items: + - title: Annotation + link: /api/extensions/annotation + draft: true - title: Collaboration link: /api/extensions/collaboration type: pro From 43b0e031b03fff0f597dde9f593fc8317f407244 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 15:03:34 +0100 Subject: [PATCH 10/14] fix linting error --- .../demos/Experiments/Linter/extension/plugins/HeadingLevel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts b/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts index ebb2cd8f..df78dacf 100644 --- a/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts +++ b/docs/src/demos/Experiments/Linter/extension/plugins/HeadingLevel.ts @@ -12,7 +12,7 @@ export class HeadingLevel extends LinterPlugin { let lastHeadLevel = null this.doc.descendants((node, position) => { - if (node.type.name == 'heading') { + if (node.type.name === 'heading') { // Check whether heading levels fit under the current level const { level } = node.attrs From 0ece2be7938f45d402d309c9d86559a6a8f12800 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 15:20:15 +0100 Subject: [PATCH 11/14] docs: add a draft for the accessibility page --- docs/src/docPages/guide/accessibility.md | 26 ++++++++++++ docs/src/docPages/guide/typescript.md | 51 ++++++++++++++++++++++++ docs/src/links.yaml | 7 +++- 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 docs/src/docPages/guide/accessibility.md create mode 100644 docs/src/docPages/guide/typescript.md diff --git a/docs/src/docPages/guide/accessibility.md b/docs/src/docPages/guide/accessibility.md new file mode 100644 index 00000000..8e5a68b9 --- /dev/null +++ b/docs/src/docPages/guide/accessibility.md @@ -0,0 +1,26 @@ +# Accessibility + +## toc + +## Introduction +We strive to make tiptap accessible to everyone, but to be honest, there’s not much work done now. From our current understanding, that’s what needs to be done: + +### Interface +An interface needs to have semantic markup, must be keyboard accessible and well documented. Currently, we don’t even provide an interface, so for now that’s totally up to you. But no worries, we’ll provide an interface soon and take accessibility into account early on. + +### Editor +The editor needs to produce semantic markup, must be keyboard accessible and well documented. The tiptap content is well structured so that’s a good foundation already. That said, we can add support and encourage the usage of additional attributes, for example the Alt-attribute for images. + +### Writing assistance (optional) +An optional writing assitance could help people writing content semanticly correct, for example pointing out an incorrect usage of heading levels. With that kind of assistance provided by the core developers, we could help to improve the content of a lot of applications. + +## Resources + +| Document | Section | Heading | +| -------- | ------- | -------------------------------------------------------------------------------------- | +| WCAG 2.1 | 1.1 | [Text Alternatives](https://www.w3.org/WAI/WCAG21/Understanding/text-alternatives) | +| WCAG 2.1 | 1.1.1 | [Non-text Content](https://www.w3.org/WAI/WCAG21/Understanding/non-text-content) | +| WCAG 2.1 | 2.1 | [Keyboard Accessible](https://www.w3.org/WAI/WCAG21/Understanding/keyboard-accessible) | +| WCAG 2.1 | 2.1.1 | [Keyboard](https://www.w3.org/WAI/WCAG21/Understanding/keyboard) | +| WCAG 2.1 | 4.1.1 | [Parsing](https://www.w3.org/WAI/WCAG21/Understanding/parsing) | +| WCAG 2.1 | 4.1.2 | [Name, Role, Value](https://www.w3.org/WAI/WCAG21/Understanding/name-role-value) | diff --git a/docs/src/docPages/guide/typescript.md b/docs/src/docPages/guide/typescript.md new file mode 100644 index 00000000..0e4a1a01 --- /dev/null +++ b/docs/src/docPages/guide/typescript.md @@ -0,0 +1,51 @@ +# Working with TypeScript + +## toc + +## Introduction +The whole tiptap is code base is written in TypeScript. If you haven’t heard of it or never used it, no worries. You don’t have to. + +TypeScript extends JavaScript by adding types (hence the name). It adds new syntax, which doesn’t exist in plain JavaScript. It’s actually removed before running in the browser, but this step – the compilation – is important to find bugs early. It checks if you passe the right types of data to functions. For a big and complex project, that’s very valuable. It means we’ll get notified of lot of bugs, before shipping code to you. + +Anyway, if you don’t use TypeScript in your project, that’s fine. You’ll still be able to use tiptap and even get a really nice autocomplete for the tiptap API (if your editor supports it, but most do). + +If you’re using TypeScript in your project and want to extend tiptap, there are two things that are good to know. + +## Options type +To extend or create default options for an extension, you’ll need to define a custom type, here is an example: + +```ts +import { Extension } from '@tiptap/core' + +export interface CustomExtensionOptions { + awesomeness: number, +} + +const CustomExtension = Extension.create({ + defaultOptions: { + awesomeness: 100, + }, +}) +``` + +## Command type +The core package also exports a `Command` type, which needs to be added to all commands that you specify in your code. Here is an example: + +```ts +import { Command, Extension } from '@tiptap/core' + +const CustomExtension = Extension.create({ + addCommands() { + return { + /** + * Comments will be added to the autocomplete. + */ + yourCommand: (): Command => ({ commands }) => { + // … + }, + } + }, +}) +``` + +That’s basically it. We’re doing all the rest automatically. diff --git a/docs/src/links.yaml b/docs/src/links.yaml index d03fc02f..6fbf3c01 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -72,11 +72,14 @@ - title: Complex node views link: /guide/node-views type: draft - - title: Working with TypeScript - link: /guide/working-with-typescript - title: Collaborative editing link: /guide/collaborative-editing type: pro + - title: Accessibility + link: /guide/accessibility + type: draft + - title: Working with TypeScript + link: /guide/typescript - title: API items: From c1e39abae6127498367ee920f24e0ef3276f8596 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 15:21:50 +0100 Subject: [PATCH 12/14] update the sponsor notice on all drafts --- docs/src/docPages/api/extensions/suggestion.md | 2 +- docs/src/docPages/api/nodes/emoji.md | 2 +- docs/src/docPages/api/nodes/hashtag.md | 2 +- docs/src/docPages/api/nodes/mention.md | 2 +- docs/src/docPages/api/nodes/table-cell.md | 2 +- docs/src/docPages/api/nodes/table-row.md | 2 +- docs/src/docPages/api/nodes/table.md | 2 +- docs/src/docPages/guide/accessibility.md | 4 ++++ 8 files changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/src/docPages/api/extensions/suggestion.md b/docs/src/docPages/api/extensions/suggestion.md index c8c92987..3539f167 100644 --- a/docs/src/docPages/api/extensions/suggestion.md +++ b/docs/src/docPages/api/extensions/suggestion.md @@ -1,7 +1,7 @@ # Suggestion :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/api/nodes/emoji.md b/docs/src/docPages/api/nodes/emoji.md index 9eeafdf0..f8705b6a 100644 --- a/docs/src/docPages/api/nodes/emoji.md +++ b/docs/src/docPages/api/nodes/emoji.md @@ -1,7 +1,7 @@ # Emoji :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/api/nodes/hashtag.md b/docs/src/docPages/api/nodes/hashtag.md index 03676616..e0aeaf3a 100644 --- a/docs/src/docPages/api/nodes/hashtag.md +++ b/docs/src/docPages/api/nodes/hashtag.md @@ -1,7 +1,7 @@ # Hashtag :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/api/nodes/mention.md b/docs/src/docPages/api/nodes/mention.md index 7340d0bd..e74457ea 100644 --- a/docs/src/docPages/api/nodes/mention.md +++ b/docs/src/docPages/api/nodes/mention.md @@ -1,7 +1,7 @@ # Mention :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/api/nodes/table-cell.md b/docs/src/docPages/api/nodes/table-cell.md index 17ee77ed..60f98068 100644 --- a/docs/src/docPages/api/nodes/table-cell.md +++ b/docs/src/docPages/api/nodes/table-cell.md @@ -1,7 +1,7 @@ # TableCell :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/api/nodes/table-row.md b/docs/src/docPages/api/nodes/table-row.md index cb997243..8e404803 100644 --- a/docs/src/docPages/api/nodes/table-row.md +++ b/docs/src/docPages/api/nodes/table-row.md @@ -1,7 +1,7 @@ # TableRow :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/api/nodes/table.md b/docs/src/docPages/api/nodes/table.md index 5e874697..9ffa2192 100644 --- a/docs/src/docPages/api/nodes/table.md +++ b/docs/src/docPages/api/nodes/table.md @@ -1,7 +1,7 @@ # Table :::pro Fund the development 💖 -We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund the open-source](/sponsor). +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for this extension, [become a sponsor and fund open source](/sponsor). ::: TODO diff --git a/docs/src/docPages/guide/accessibility.md b/docs/src/docPages/guide/accessibility.md index 8e5a68b9..711ecc5c 100644 --- a/docs/src/docPages/guide/accessibility.md +++ b/docs/src/docPages/guide/accessibility.md @@ -1,5 +1,9 @@ # Accessibility +:::pro Fund the development 💖 +We need your support to maintain, update, support and develop tiptap 2. If you’re waiting for progress here, [become a sponsor and fund open source](/sponsor). +::: + ## toc ## Introduction From a6008d8c9d70981dd8fc4c0a330928a5e2876ea4 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 18:01:25 +0100 Subject: [PATCH 13/14] add character limit experiment --- .../Annotation/extension/AnnotationPlugin.ts | 4 +- .../extension/CharacterLimit.ts | 64 ++++++++++++++++ .../CharacterLimit/extension/index.ts | 4 + .../Experiments/CharacterLimit/index.vue | 73 +++++++++++++++++++ .../Experiments/Linter/extension/Linter.ts | 4 +- docs/src/docPages/experiments.md | 1 + .../docPages/experiments/character-limit.md | 5 ++ 7 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts create mode 100644 docs/src/demos/Experiments/CharacterLimit/extension/index.ts create mode 100644 docs/src/demos/Experiments/CharacterLimit/index.vue create mode 100644 docs/src/docPages/experiments/character-limit.md diff --git a/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts b/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts index 290b9cef..7542bc59 100644 --- a/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts +++ b/docs/src/demos/Experiments/Annotation/extension/AnnotationPlugin.ts @@ -7,8 +7,8 @@ export const AnnotationPlugin = (options: any) => new Plugin({ key: AnnotationPluginKey, state: { init: AnnotationState.init, - apply(transaction, prevState) { - return prevState.apply(transaction) + apply(transaction, oldState) { + return oldState.apply(transaction) }, }, props: { diff --git a/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts b/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts new file mode 100644 index 00000000..42ff0a88 --- /dev/null +++ b/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts @@ -0,0 +1,64 @@ +// @ts-nocheck +import { Extension } from '@tiptap/core' +import { + Plugin, PluginKey, EditorState, Transaction, +} from 'prosemirror-state' + +export interface CharacterLimitOptions { + limit: number, +} + +export const CharacterLimit = Extension.create({ + name: 'characterLimit', + + defaultOptions: { + limit: 100, + }, + + addProseMirrorPlugins() { + const { options } = this + + return [ + new Plugin({ + + key: new PluginKey('characterLimit'), + + // state: { + // init(_, config) { + // // console.log(_, config) + // // const length = config.doc.content.size + + // // if (length > options.limit) { + // // console.log('too long', options.limit, config) + + // // const transaction = config.tr.insertText('', options.limit + 1, length) + + // // return config.apply(transaction) + // // } + // }, + // apply() { + // // + // }, + // }, + + appendTransaction: (transactions, oldState, newState) => { + const oldLength = oldState.doc.content.size + const newLength = newState.doc.content.size + + if (newLength > options.limit && newLength > oldLength) { + const newTr = newState.tr + newTr.insertText('', options.limit + 1, newLength) + + return newTr + } + }, + }), + ] + }, +}) + +declare module '@tiptap/core' { + interface AllExtensions { + CharacterLimit: typeof CharacterLimit, + } +} diff --git a/docs/src/demos/Experiments/CharacterLimit/extension/index.ts b/docs/src/demos/Experiments/CharacterLimit/extension/index.ts new file mode 100644 index 00000000..7770eb81 --- /dev/null +++ b/docs/src/demos/Experiments/CharacterLimit/extension/index.ts @@ -0,0 +1,4 @@ +import { CharacterLimit } from './CharacterLimit' + +export * from './CharacterLimit' +export default CharacterLimit diff --git a/docs/src/demos/Experiments/CharacterLimit/index.vue b/docs/src/demos/Experiments/CharacterLimit/index.vue new file mode 100644 index 00000000..16a4822c --- /dev/null +++ b/docs/src/demos/Experiments/CharacterLimit/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/docs/src/demos/Experiments/Linter/extension/Linter.ts b/docs/src/demos/Experiments/Linter/extension/Linter.ts index 42fe777f..4307ed66 100644 --- a/docs/src/demos/Experiments/Linter/extension/Linter.ts +++ b/docs/src/demos/Experiments/Linter/extension/Linter.ts @@ -51,10 +51,10 @@ export const Linter = Extension.create({ init(_, { doc }) { return runAllLinterPlugins(doc, plugins) }, - apply(transaction, prevState) { + apply(transaction, oldState) { return transaction.docChanged ? runAllLinterPlugins(transaction.doc, plugins) - : prevState + : oldState }, }, props: { diff --git a/docs/src/docPages/experiments.md b/docs/src/docPages/experiments.md index 34e2966d..262720b5 100644 --- a/docs/src/docPages/experiments.md +++ b/docs/src/docPages/experiments.md @@ -4,3 +4,4 @@ Congratulations! You’ve found our secret playground with a list of experiments * [Linter](/experiments/linter) * [Annotation](/experiments/annotation) * [Comments](/experiments/comments) +* [CharacterLimit](/experiments/character-limit) diff --git a/docs/src/docPages/experiments/character-limit.md b/docs/src/docPages/experiments/character-limit.md new file mode 100644 index 00000000..fa6a209a --- /dev/null +++ b/docs/src/docPages/experiments/character-limit.md @@ -0,0 +1,5 @@ +# CharacterLimit + +⚠️ Experiment + + From 03ca284a22c3106931665f92dd769474eed4b599 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 19 Jan 2021 19:42:44 +0100 Subject: [PATCH 14/14] fix linting errors --- .../Experiments/CharacterLimit/extension/CharacterLimit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts b/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts index 42ff0a88..6892f647 100644 --- a/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts +++ b/docs/src/demos/Experiments/CharacterLimit/extension/CharacterLimit.ts @@ -1,7 +1,7 @@ // @ts-nocheck import { Extension } from '@tiptap/core' import { - Plugin, PluginKey, EditorState, Transaction, + Plugin, PluginKey, } from 'prosemirror-state' export interface CharacterLimitOptions {