From 5bba615d62f0f489c2f4a3ba55849962c9e26a85 Mon Sep 17 00:00:00 2001 From: okxlin Date: Wed, 2 Aug 2023 07:47:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0cloudbeaver=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cloudbeaver/23.1.3/.env.sample | 3 + apps/cloudbeaver/23.1.3/data.yml | 18 ++++++ apps/cloudbeaver/23.1.3/docker-compose.yml | 19 ++++++ apps/cloudbeaver/README.md | 70 +++++++++++++++++++++ apps/cloudbeaver/data.yml | 20 ++++++ apps/cloudbeaver/latest/.env.sample | 3 + apps/cloudbeaver/latest/data.yml | 18 ++++++ apps/cloudbeaver/latest/docker-compose.yml | 19 ++++++ apps/cloudbeaver/logo.png | Bin 0 -> 10865 bytes 9 files changed, 170 insertions(+) create mode 100644 apps/cloudbeaver/23.1.3/.env.sample create mode 100644 apps/cloudbeaver/23.1.3/data.yml create mode 100644 apps/cloudbeaver/23.1.3/docker-compose.yml create mode 100644 apps/cloudbeaver/README.md create mode 100644 apps/cloudbeaver/data.yml create mode 100644 apps/cloudbeaver/latest/.env.sample create mode 100644 apps/cloudbeaver/latest/data.yml create mode 100644 apps/cloudbeaver/latest/docker-compose.yml create mode 100644 apps/cloudbeaver/logo.png diff --git a/apps/cloudbeaver/23.1.3/.env.sample b/apps/cloudbeaver/23.1.3/.env.sample new file mode 100644 index 00000000..dd21cf85 --- /dev/null +++ b/apps/cloudbeaver/23.1.3/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="cloudbeaver" +PANEL_APP_PORT_HTTP="40083" +DATA_PATH="./data" diff --git a/apps/cloudbeaver/23.1.3/data.yml b/apps/cloudbeaver/23.1.3/data.yml new file mode 100644 index 00000000..b7f6871e --- /dev/null +++ b/apps/cloudbeaver/23.1.3/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 40083 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + diff --git a/apps/cloudbeaver/23.1.3/docker-compose.yml b/apps/cloudbeaver/23.1.3/docker-compose.yml new file mode 100644 index 00000000..b1e00b92 --- /dev/null +++ b/apps/cloudbeaver/23.1.3/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + cloudbeaver: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8978" + volumes: + - "${DATA_PATH}:/opt/cloudbeaver/workspace" + tty: true + image: dbeaver/cloudbeaver:23.1.3 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/cloudbeaver/README.md b/apps/cloudbeaver/README.md new file mode 100644 index 00000000..93b613e3 --- /dev/null +++ b/apps/cloudbeaver/README.md @@ -0,0 +1,70 @@ +# CloudBeaver Community + + + +Cloud Database Manager - Community Edition. +CloudBeaver is a web server which provides rich web interface. Server itself is a Java application, web part is written on TypeScript and React. +It is free to use and open-source (licensed under [Apache 2](https://github.com/dbeaver/cloudbeaver/blob/devel/LICENSE) license). +See out [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) for more details. + +![](https://github.com/dbeaver/cloudbeaver/wiki/images/demo_screenshot_1.png) + +## Run in Docker + +- [Official Docker repository](https://hub.docker.com/r/dbeaver/cloudbeaver) +- [Running instructions](https://github.com/dbeaver/cloudbeaver/wiki/Run-Docker-Container) + +## Demo server + +You can see live demo of CloudBeaver here: https://demo.cloudbeaver.io + +[Database access instructions](https://github.com/dbeaver/cloudbeaver/wiki/Demo-Server) + +## Changelog + +### CloudBeaver 23.1.3 - 2023-07-24 + +- Users can simultaneously edit resources, allowing them to work together; +- We have improved the UX in the search bar - users can delete a query or request by clicking on the cross icon; +- The search request considers file names and exclude the .sql file extension for now; +- Different bug fixes and enhancements have been made. + +### CloudBeaver 23.1.2 - 2023-07-10 + +- We have improved the SQL Editor functionality by adding support for displaying tables with nested arrays of objects; +- The ability to compress files during export allows for faster download speeds, particularly for larger files; +- New Settings panel displays the product configuration settings such as Minimum fetch size, Maximum fetch size, and Default fetch size from the Data Editor; +- Different bug fixes and enhancements have been made. + +### CloudBeaver 23.1.1 - 2023-06-26 + +- Connections are consistently displayed now when they are pre-configured into the workspace in the Global Configuration json file. +- Different bug fixes and enhancements have been made. + +### CloudBeaver 23.1.0 - 2023-06-05 + +Changes since 23.0.0 + +- Data viewer: + - New grouping panel menu was added in the Data Viewer. This panel extracts unique values from the database column for count. Users can drag and drop the column to the grouping panel and get the results immediately. Sorting, filtering and exporting of the results are available on the Grouping panel. +- SQL Editor: + - We improved the performance of the SQL-editor - as a result, handling scripts with up to 10 000 lines does not present any challenges; + - In the SQL-editor, pressing Tab/Space followed by Enter now causes the cursor to move to a new line; + - In the SQL editor, when the cursor goes back on the query, the previous hints are displayed; + - Error when running SQL with semicolon has been fixed. +- Connections: + - If there is an error in saving the data, the tab for the chosen connection dialog will stay open to allow corrections; + - The URL-configuration for PostgreSQL now correctly displays only a single database. +- Driver management: + - The CE version now offers the updated sqlite-jdbc driver, version 3.41.2; + - CloudBeaver has the option to connect to H2 database version 2; + - The internal CloudBeaver database is upgraded to the newest H2 version 2 to avoid vulnerability issues. The database will be safely upgraded automatically for the servers with default configurations. You can perform this upgrade manually if you have a custom configuration for this database in your infrastructure. +- Connections: + - Option to increase the maximum size of text files displayed in the value panel (using the sqlTextPreviewMaxLength parameter) has been added; + - Support for custom logging configuration has been added. An external configuration file can be used instead of the default configuration. + + +### Old CloudBeaver releases + +You can find information about earlier releases on the CloudBeaver wiki https://github.com/dbeaver/cloudbeaver/wiki/Releases. + diff --git a/apps/cloudbeaver/data.yml b/apps/cloudbeaver/data.yml new file mode 100644 index 00000000..81edb866 --- /dev/null +++ b/apps/cloudbeaver/data.yml @@ -0,0 +1,20 @@ +name: CloudBeaver +tags: + - 工具 +title: 云数据库管理器 +type: 工具 +description: 云数据库管理器 +additionalProperties: + key: cloudbeaver + name: CloudBeaver + tags: + - Tool + shortDescZh: 云数据库管理器 + shortDescEn: Cloud Database Manager + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://dbeaver.com/ + github: https://github.com/dbeaver/cloudbeaver + document: https://dbeaver.com/docs/cloudbeaver/ \ No newline at end of file diff --git a/apps/cloudbeaver/latest/.env.sample b/apps/cloudbeaver/latest/.env.sample new file mode 100644 index 00000000..dd21cf85 --- /dev/null +++ b/apps/cloudbeaver/latest/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="cloudbeaver" +PANEL_APP_PORT_HTTP="40083" +DATA_PATH="./data" diff --git a/apps/cloudbeaver/latest/data.yml b/apps/cloudbeaver/latest/data.yml new file mode 100644 index 00000000..b7f6871e --- /dev/null +++ b/apps/cloudbeaver/latest/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 40083 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + diff --git a/apps/cloudbeaver/latest/docker-compose.yml b/apps/cloudbeaver/latest/docker-compose.yml new file mode 100644 index 00000000..af5f05e4 --- /dev/null +++ b/apps/cloudbeaver/latest/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + cloudbeaver: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8978" + volumes: + - "${DATA_PATH}:/opt/cloudbeaver/workspace" + tty: true + image: dbeaver/cloudbeaver:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/cloudbeaver/logo.png b/apps/cloudbeaver/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e2dc1d2cc285e5861ad116bbf4e399f31dfe65a4 GIT binary patch literal 10865 zcmeI2MN=FMu(dRaB$ zIj5?ZUDb;|^+YQxN}(YWAb?T=l>F^}j+w_|F9<5m^6=FHX`ruAe?J0smJp zUZp}FpFYt6WyD3)y>c$PyxXX>bdKMAmvuFMKM20$%x@murk12k5v2+T31g~|2W5~| zRFLT>$zU=glM1rZl2PbWcjs@XUHu^oNg~sy#)4)2lLMe27mE}gCYf`6IAOb}tXk5A zK1f}#QEkd}WgG$RPM4L0rUUL*J3VTvjB0hy{I@lVsumW&$cIwhupAsh@-~IGk}|KI5UaTEP-Ps>&KlW-1Ot@(Tj6D;YRR`obz!ODlhFiETr`qu^S zuYZQhYgT(NVP3Z&=hPkuVJ^uRDLiM{XaOvMh5-M$yj6~m)P>XO`=a+6G8!q;a!hRF z0;j>K4Ftbg_Vy;7_`qr{JaDVP_xOQsA~`Y+vz(7#Y*vogF&}m)mch0`xQS`4@S{W< ze#f6WF^J1{^xeH9PZKCaqsD%Wn`~G}FBf8olMRpdpEFkAX6@Gi6xxa1fe#EJUI;XLkfEH6ipA6$oVL4+}vm%EDR%JJe-5UH`U!K0QY| zo1InX!h!)Y%1zq0pr-4mene{4k=63N!3)Ir#x|B|aeAHix6(aUT3pgTq(w)9zE2l- zA@Nk~)HKQpnVow8^ZL*z1Hl#wU1C^{0xH^D*@JVm_(+Fe8&2#l>p62x$hyRK8l|f? zyJiIwC_fgXW2)Ho`-dmZCVqOikodBM2K*89M3I3b#T8F90d52?CHM|RiGYh2cFTQk zLbsXmd6}=w?e1lr7_%w0;vl*)_wFXWnoU_hfik1_yZV%VG&@`>C0xyF9tKd+PUFxYU=-GJ z2*GSXWeO7#SA4fVloU;7Fd&P1=LRQc-dXM*Q0-=KXVa7;sl_u99TF;8%B0jmZ69-E z&IIi$@~CDwkV_`pDvwO^Yi_fsN`xi8M3+iv-kcT6x5ckNH>N+n8|x`QTnq7RKuLVM zU`9HEnGF%WzeEdL@1$S$eCSRw8*W)q{z%@ch<@S$H5CXJsbJZ%1jPi2tJ)W}D3vpC zuO;O0JA4}q3peEW61yv4YJ_XrrZCe=Xf}0rhro3Xv41ZlkR*qq&_;Ys341IhH!;#d{RMpq2X0fXRe}HTs#*CaJ9spk~ zOQz~R98*O>p$%luO{5;%s4-`qM8frAGhXA|QW4)iAHJSuk0tDRSmf*RcUco`UQQD! zzkRUHzv=pWYftDs`b0B(_TflcoJ9(}Y@GpV57O`Vz^J>-(U)5^7iZxHVrvi&Jv4c z-EhxwMf3!g-2MB`}SIJ$FHv&1b;}-+6?BJ}ISY5M3`BSO0Lj&7h0M2OeFF{@E=E zx5@>bZb{EzxBE93JdB}G-R(`WjqOPDHziqy>*>rN!d*Sgb^SMRN166rIMXZR)E|`s z7rB@6n~Xrjd-P7gm)al>Q5)3Vuzkv#`2dl8TM%whxVRw?n^8k)Zj--RETsFHHai== z{vQ$a&9XSGnV{_HE^(NvGTO-5@C)*k4yF2PjL7+$->-{d`Oa+axThahD)%qiAXsR! z)|0X!ZxWUMzwS&qIh{6r?UW5*H-xqxJv8xsT+{cQo-u$ZO8w^bbNz}8oO93rX0PaVlWl~_k)aozYbP+fq zBnU5L<*9s7M_1=2nes>ew1Nm`giZt99(9qn8B(90m|Z_=B$7xcs9J-2ydd9UKAE(%EjlikuQs*9RGOVQwWf4H}O!zQjJK$X)TECwiD`!HIoN&} z7l?D|L)7Te2=i9L69s@Sxi5iC6ygU5d)7C?L$w&F5H*(lm1OM(2WFrK-h`8Cg8;!zcWpgcIl8;fKTa zRyA{fRQ8yq!K4cs-HkZM_=b+F{>Gfl15&C-@6g5E-;zTkqY19j(*j|5SS<4H7Kl)0 zvsVpqa?LyV;UJJQaf2|$>XBXMc}7F8TT5R3CXCUx|9Sglk(Ut{SLC#ShSOuADhFR$(T7_)(VQStDcg#s7O? zo$w6V-@M$+;q7pf_E59EY=Y?Pkn?{D_k)olk#3vp>-l#+4&CQUI{aOc!wZ`1;+UJC za^lf#g-fdFqLE!=4QfCM(m0+b%6YYoHq9LAnn1HczP}^C4|_9rcp4D~0qO%{emZ`j z;Rf$^WrTQ(CBN^khh=$6b$316wynBr$ZFdJsqpp!W99dFZXV;smX51|tM~SMInM=? z38#0+fy;&8SpLO@*u~OEOl^|BDt}=WPRZN^}>{$Q;1Z-ycWAI`1dQVuQe#$^b)gHq1^S7 z&1mT1<9$(?DcOQibRpO%3l&8~!vY+I^}XD{v_absX}W(6u~Nl;s#z6{))Ok`9Jp_w=1Y@4iwgNMvnV8!VOo1PnWcD&+95>KSc2+>UfgMwps z<76EpMy=zJQ@bPOj8zYJrUNvdkFUnn4Ari!&d9Bm$5zl${$BC7PxG`tiD|zbzlhAbD67EmEFWJ* zDws>ogP3ryWBoAt6idgKjrFtOa5+~_pC-I(?9wWY6clo%ua-P0P`_;C*BX_W0nX>) z`NyVqv7ep0aZ}5Ohp93FTY!&ac0#f-l#VC_PGJr}XbpJn20QYlMAcuiY2e)}N=$hc zv1U4OzgP)r<_uOU zn_=|SwuEBaz6%!>(jqS@fScXlc=1f{!v%bOm>K1Um`a!6WsQ}zNWCQl_tF{d1qwh5>h$`Hbqr}27TVoULScXnUJpVdn{X0D;muf zSI`)VRh2aFxs5{Ee*}e(=r#rws5n;+S)@~zFx%Zz%%1?v_R29ge*v<)H)UT#s|J)~ zyr&26Q}cUDCPM?P_be4xS)SH+ixUV$QZZBeO#cicI(qdPoP|U84bYiyPbx1xsv~Me z{H0VHlC;s_mWx=nwq(=e%&2y24Bqp#V>vAD+(7EkPuVOx}c(_6l&+wZ{kpwc9I zUnFGXAPIHdyd`4A4Dpmr3q;-o+-ZG}pE8a!@Q2az4=0Fsv;1yK+UYVv*BvQI2X19N zG%PX90<15Xs5X3QK}+T6w&4L-nHLfz%3)DanTxE3Y?*(G z!AUz^z@k|{ppUOVR;m?$ZH-KN5iA}bIRdyAJsm(ECXF!)l;@ZqKf?Aj|9-DziZtEi zJ?k^E*8HIrKqvQhd-%yVTHA_cl>~qgJWs7``y#>&AVm{f4X z_cSr+@7|DSEGiJyR4gQTDRs-M#8y+mLg`M$$VLN3f`(X0ma0hyc#A%se^;LxP z7kK&Uyt+p1WK32ij?S5vb;Lb)_GUcb7_q=%j?bwXPJ zg`?wA6C3T&Z$phJQ+y{yG@FetS)R$PjdSc8gW7A^S*dSDTK96`ud+trYl!U)D<^?A zje7juNmRD?I?5rZ5}VwM$af(pk#UzzBIa!RMl}0!V&W1AB7FNh87tLZY;&HGlI9 z@4lS{LvW_am+w{VYqhHqdu_Y(e2pT~x2W>Ay=2g!wuq>oEL|6|)jwiDiWtxD(cbl5 zMSus>)a|C>t#`A8@LH*Af4C-3>Kf}|`i4d#t zL*RN5Dc7sFqIKZtE7=vn4O?wI~A>?G7rSza1Z-S$^Kq=)6f z6su|oW6{RGT0CGM2?Jjed0eXja ze=KY{n}eK5M!C8?0hC5!*c8oADI`eb6JJB8vbDxhH_XF5)Rzctkp%0qbMv2mr?kX% zGvjs(#i1Z*O|~C`4ijg8#+KAO%g{e5kRl5^L{UW&4y@Qr0IQPF_Tsbe85;J4BV9D` zijx4U?tydi7c?+~*TIVAN>PgpnY7}h$`q9{4ar4tU=TR2oM^Lsbn(Lt-;&=2b`BGa zC3|859=d%|>l;LoIY6mv#-DG6G?nK1y(?!R;- zGmNXvUL8->Z10R*kL2_u5vr<5udO+VJ`x?JoMEw z9Rb2=saCKxa%<)a$utqBs1xD~yJo*V#7bP{i0u)lmhRv?k+q~Y9o|j z&E}NDb0=WR*j)5K4uB9&G~q&tOd(Q}t+CX*#;$*W~Fp%baGS+{|^K)1^sI z`%U)lo8Fzwd4;STHl%~4p*dpOVt==R^tg&d-8wibG8}sQl#JLbCd(fih~3l`dA2pi zCi4nh+akD(%?u{m(>JKuKa83rX=8)b7E#pUZTIl)u%UQ$Uk7pB&`HVhA`a4`)D5D? z&olH7XDTRd-ZRK3O{1#3J}>DM=}uHdCst{qkS>=_Ku?_p3|vc6zK}OoNSa0=)y(VX z7l!+pB)UzFnO!6D{(P;GG*GU0oE~QDFZjWdjZ@oHxA+{y?5z`Z!wmlvE25-(^CqU% zz2Cpo;#x*HB8&y{3*#j1tQ(g}dEm?#`O*2~@ZRTK$J9JsK=j@teP^Pv&po6He2riFuE!-L4W=|_hC}-YF72ST9TgQJ z%gSbXe#8uyDaWr>x^^T!MkA?1iso>8IdG@2__?E(=VB95>p?iu*hnR1U~Svw^z%3T156&K9(ov6;_Qf#JJID!q3c4 zKM(eLXNLe!nPtkj7~3q;N?2^r*Zj{Z zF-ok<-&o{rz8fv(^6;<~5-h|Si(OcAgwSU3gun18^1Wv&VQUV>chFvbM>9jsY{cg?k;A-iaES>8uvPTbO94p2 z0AFq6ywAfi4iG&reUN)zKOI|WkcrMlN7Xisn>Nf!`E0(fuW~cHN{)8twVOeSK*!;k zY!$++hjstji^7>m>4G<_;{zUgbQ#n={eShsOc~RTQgPYl`(SY-W`V6+%~vdI|ALkA znwgPLWvKLoXo*q0e-tHQ2S?^EkpI@0F6b9B@NHV7Dsmv+A$NqRbO9cxx9-es=AK75 z(T_q+O#Et*z>qzClo1Jc^Dw_%3{Va`dL$7>j{f*&=1pk;&m+vy$ASl{*@w?OW9!3B zksY_~7x?muQ}^ooz|V`GpLsN((1H#zN4|rSP{@a6Ao)#f_q4;h$F*#}?qX?^n+h&$ zeKuFZjT#28_YvB5Cr*-d;_ZSaTOor_wnTUr?Mdp8!JZBZP!6RM#w)VwvZ`fJ?6TXM z{tx@7NGCWqJ#bm>%VM9c1UtF?7pZyw#S$xS7FE4MwI$iMJ~sZCYV zof&y-l2kGbMKKRP%>K6th?3H=6fTcZQYZ6v0F^}vEbC7ds;Y758CDgi@X^a(Upob=Wh`__aYig8tBw+tT>&3PmwXpXpX59FSW5 zFqu?soLr-OOJ`j3*S9-R5zIH^z?t9va{S6g{&8Q{c$hx%D0ZXU;96ESrI)3o^F!(| z{WOMZQM;#Z5TYpFL*Cyv7ddI@E2Nd)ZmrnzPUn6I>l*3HmDlZjPC6x2DWIJN7lkxS z&lZ~O2-O?>CKt$3V1nxDfg)Oy95{s>&Gw-?d}Zr>wT|oY84x$H^>;8zxcI-$0|O9I z&;3u$ktC?28XfV2{>8S|SYeE~6J14e8{o(ZZua=D>a-zARR3FLk)x?bwsa^e>YVd5 z&zLaDZVr5x@Dv{*4IJloyZzbezTEe|AnsakwSh-Vb5FGTVOyvk3joJ)nYgA8fF4$v zhM{M`_@32ViwHv0#VZ!Z@P0+% z;-ryI=PDCQycgR#)mWKJ^biz=X~j-hVl4|E?3H`jz4RT)?1MAvb&jFG+nJ3*Cw1V9F7nb%UTV`lR0 zVl&yEv#EWXIgeZzD96LQ-tPagqeEaFdb(S6uan3H%cs2wl=@wkW=QXKoH0)GbeR#% z_LI3h+S{-diDo;X?WNhOO%*@m#t|#YEhCHJz-(kssfsArW_F%R6(Es%GVp#Cy52WIpWu1LE7*sDp)39ujJ0#*cEXt6m41xG|>r*G$ zG%LO}KRo`?c6L0GcHm5BwIJ5ZI}!r#5%oNnQMYQASeD$T(N&yPOP9v`Lld}x;uB-J zX>>MhtGJZgz5A7C$7slxyuZ$5vi^D!U2JO9E@2ZCvEvN5m~0`Fz?-4Hbwxgy6PWoi z(@j>;&E9RroT3e;)gNCiE0_uc1s~cXLK}Dy^r_Cl-49IqLE-#X0{{X=ZGUDyER7{2 z(4oWW7dd*+QsNQMQLZ<^MPuVGVk;DEu48)P%R@e*xE5+^{ zj@C*KFHsdnsU+RRzptJ%Jit)^;80xFat44_}7AL2*$)CHBiBV{}$O+=+aCUMv za#;CI`;HtL1~t29oI9tpRVSq>cnOMKqpILZ!sL z7EUZ(x0b#T;Q0X>9!3k9^eb)&ryFe#%{d8tALklidh-dUz3ADol+8n)fD?Nk?7N&74 z;xa3*WO28j%uI!sC{KNnTIF zAplr+PbRa_0_PdM9+!IOT<`H>8=x;z&*~gYKEVYa8i`P9Nh|J`4JOp);?IRop^ACM zeU=v!8Yu=q!eCc~+$O;G+?xBC7?;xxje}BGbQDKLlOot#GOG~?jf~aGSJ(JGfRif9 zu}`eDDc2o_F?E+Y19QY=@Im0OnP#JD6puA0Kjrvq-(x$irk-EYoM&RCO0b%qI8)m8 z?_HN<^PlDV9z%qlo83l_;#Fz3DmrN%fLU5E;Bt#MlwT~ISY&U`17G|HL=uUB%`(DX zWfc!4Z-(#mq14_rqNYms4#b+oVUVz$US z{QH7QVy=a$Z=d7iz?)Q+eh1buItBd9PbXaLHrE{%vO!Ez)A7dz&E!1gLk-FIU#%e` zGk>kAF43Z8^0f9{xm#UWwSbZ=0}?O@$6t3KUZjS(92-O8(z&nGcKY=Rjp8qPhlkYV z`H%qa$xz_U(}<^E`;DR*V{}Rl5iV&RNo9c>LNnzO*4LcTTr@R9-<`wMDPf1VsU(ux z##F#vUoRsk==^PKLLud;GNJ9S%KGKw)FdKOxM?k=IhG)&@2@o@Ghub4-PwtWgv{^P zeIZ&1luOr>xvupN)Q5}FU(-+BaEDrkAxgAJ=F!R$2_eg^Bz!fFwRm(|wkOwfu3jS0 zWYHu5d{uHNrh6ws5A$akw%uRhNRNM=t$l*#pp2FY@^|*b5hrMab2Q`;3AIRd;{E~fBg;#3NZYB*>DODC68a*!?U!mF`}=pWO6=It+e zSqJjO*d9atdV2kD@iarmK?VF8eZ9stlQ=S;Ebpg)V-$T%^+`i z)6n-wHEPwt(X8`~7}fo}7WVucnKP7bmxJ^}b(U;?3AU!!9A#MSpXfJ38l?%A)ku|{ z5S@-wVf9;W}4u7$7A-xWBl0Z zao=}nBvlN946Q2K4r|I5w_wXj$dikt|E!Q{!~FP&Fia&$b$UjU$6z^KQeH2yWp@eP zkLdLo`3bx7s}Eft|Le_2sN6c@5S88K(Z8#6Q{y6Qp*5S8ZLrFBf8)LV#~ZGA4kmhg z*7qMD} z+Bca6j7Qd-j$a)`s4-A)MIPT%jdjxY6O{JhgEHhrRMVrok>iVt#FmI178Ukm6|QuH znVCnw8t-=cuHCrJr2b-k$1I z;&Nb2tQy^=l+TMXUr56g2#4RvZJp18fuTp{OL_Dm(a4N)3!{+gYX{cOR;dzh*W^2$ z-ExfMVm@D=dXT~mT%vdwH|NO$PG_k9i%vdgz_bD^J6jPN{ia#ZbQJauf$bE~i`#+xt4x6VP@&6j6$h293)yvNT1GXh^T z>bv&0jl3@u=GEfL@k*z~mjblHG_iJN=y+|>GQ@%P@ZLqIs*D3!O8BLm2srlR?Rq#C zolgf+hn;#k99dN9tBTNSu7C$>!&|=TL&xoVT~lzr*Rfju&4PjNQ9i`P#WbsP_T=tD zY)ZgZ?L=U^`{_P`leN{|i-x=H+0}Mz3J+gy4QCbdd(3HS*VK=33`KOoz0zEX&AP{W zZ}^Thdu^?^e$7|x?s(0=b#iZ9xI-Kl{(e0}Du3V7edm?4`CgRo9?!ljKsy9q?{sTp6bL$@FWvQ)WBCUR{fI z43Ooj!FpqkG=CHV!72HE$Y!-$TUagp|RW6Ml6V9Br;Gvfp^2%BdPNrin-L_FG;j zhm~j