From e7ae3e85ce8ebf9c25fc8c7c541d99a363a762c3 Mon Sep 17 00:00:00 2001 From: LingKa Date: Thu, 12 Oct 2023 15:28:16 +0800 Subject: [PATCH] feat: deploy github page --- .../hardware-acceleration-cover-67e9ecca.png | Bin 0 -> 66260 bytes .../{index-500d1a02.js => index-015cf939.js} | 4 ++-- .../{index-12a2a854.js => index-047539e4.js} | 4 ++-- .../{index-93097ad1.js => index-148365b0.js} | 4 ++-- .../{index-6fc8a945.js => index-284b9c1c.js} | 4 ++-- .../{index-ccecb7fb.js => index-29c0b7ce.js} | 4 ++-- .../{index-0c25eea3.js => index-2b1c59a2.js} | 4 ++-- .../{index-b79df9da.js => index-2f7b64e5.js} | 4 ++-- .../{index-4270ced0.js => index-39390118.js} | 6 +++--- .../{index-fda9b0ab.js => index-3b5176dc.js} | 6 +++--- .../{index-70350f65.js => index-40aedb60.js} | 8 ++++---- .../{index-e197de7f.js => index-4b956329.js} | 4 ++-- .../{index-1492dd61.js => index-4e03dfad.js} | 4 ++-- .../{index-71801d47.js => index-595df927.js} | 4 ++-- .../{index-d9950506.js => index-64abe6eb.js} | 10 +++++----- .../{index-fa35d4ff.js => index-90047cd2.js} | 4 ++-- .../{index-74772a81.js => index-9f27369d.js} | 12 ++++++------ .../{index-696ef44a.js => index-a154d453.js} | 4 ++-- .../{index-b503fc36.js => index-a6eb2af0.js} | 6 +++--- .../{index-725430e4.js => index-b28a4a39.js} | 4 ++-- .../{index-a920aedb.js => index-b28c82c1.js} | 10 +++++----- .../{index-008dd03d.js => index-b2f220f4.js} | 4 ++-- .../{index-2d6d14a5.js => index-bae930d0.js} | 6 +++--- .../{index-89698b14.js => index-c86a9a07.js} | 4 ++-- .../{index-9b388911.js => index-ee7da202.js} | 4 ++-- .../{index-37f93c7b.js => index-f5cc00ea.js} | 4 ++-- .../{index-c719bd5c.js => index-f6eeef5e.js} | 4 ++-- .../{index-9d285d88.js => index-fe9ae8f0.js} | 4 ++-- zh-cn/assets/spinal-hdl-cover-9878c460.png | Bin 64854 -> 0 bytes zh-cn/index.html | 2 +- 30 files changed, 71 insertions(+), 71 deletions(-) create mode 100644 zh-cn/assets/hardware-acceleration-cover-67e9ecca.png rename zh-cn/assets/{index-500d1a02.js => index-015cf939.js} (92%) rename zh-cn/assets/{index-12a2a854.js => index-047539e4.js} (95%) rename zh-cn/assets/{index-93097ad1.js => index-148365b0.js} (95%) rename zh-cn/assets/{index-6fc8a945.js => index-284b9c1c.js} (96%) rename zh-cn/assets/{index-ccecb7fb.js => index-29c0b7ce.js} (99%) rename zh-cn/assets/{index-0c25eea3.js => index-2b1c59a2.js} (97%) rename zh-cn/assets/{index-b79df9da.js => index-2f7b64e5.js} (92%) rename zh-cn/assets/{index-4270ced0.js => index-39390118.js} (89%) rename zh-cn/assets/{index-fda9b0ab.js => index-3b5176dc.js} (99%) rename zh-cn/assets/{index-70350f65.js => index-40aedb60.js} (99%) rename zh-cn/assets/{index-e197de7f.js => index-4b956329.js} (97%) rename zh-cn/assets/{index-1492dd61.js => index-4e03dfad.js} (90%) rename zh-cn/assets/{index-71801d47.js => index-595df927.js} (95%) rename zh-cn/assets/{index-d9950506.js => index-64abe6eb.js} (99%) rename zh-cn/assets/{index-fa35d4ff.js => index-90047cd2.js} (98%) rename zh-cn/assets/{index-74772a81.js => index-9f27369d.js} (99%) rename zh-cn/assets/{index-696ef44a.js => index-a154d453.js} (98%) rename zh-cn/assets/{index-b503fc36.js => index-a6eb2af0.js} (98%) rename zh-cn/assets/{index-725430e4.js => index-b28a4a39.js} (99%) rename zh-cn/assets/{index-a920aedb.js => index-b28c82c1.js} (98%) rename zh-cn/assets/{index-008dd03d.js => index-b2f220f4.js} (96%) rename zh-cn/assets/{index-2d6d14a5.js => index-bae930d0.js} (95%) rename zh-cn/assets/{index-89698b14.js => index-c86a9a07.js} (92%) rename zh-cn/assets/{index-9b388911.js => index-ee7da202.js} (97%) rename zh-cn/assets/{index-37f93c7b.js => index-f5cc00ea.js} (96%) rename zh-cn/assets/{index-c719bd5c.js => index-f6eeef5e.js} (97%) rename zh-cn/assets/{index-9d285d88.js => index-fe9ae8f0.js} (98%) delete mode 100644 zh-cn/assets/spinal-hdl-cover-9878c460.png diff --git a/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png b/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3967839c9fbb18e6a705ac2e14d999f99e1c83 GIT binary patch literal 66260 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

obbhy7GNTM`BeQN){gRmFDhQKG} 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 z°w5w1VPSg{cu%`-om69A!8BB1E?oW+J}ron^2Nw2gd2PTeJd8}Dvv5}XtVZ9$7 zoBrt^Uk5xl?@#{>;1B=sefaEW$FQ}zg;vBx-M+UI#_!hKazU_@HB@ z-=*;V!p`1|aF|1BkyWL*kW*?7BeZfpV6n%Ik(^Zv@Uh>b7{qhyFfUmn^6Ef>knmNL*=vfPimF-QEXE%x3UI(Ib>SR<{wB# zvJNTSZV<6c2&EpgSy1#yO?JOCZGF0V8>g7MHK#1rUyhg`hi%l~R!4g&Xtt z=)EyEZ0Lu&KnEHb=^&kydZU8p~cV_FuzLVjwE zMbibA8I(boTg*G;6SXvxnaWq?esuZ{d?Yv^$8vDR?q>Z^3^-P@0d zEo^MAXnaV!;DadOGs`B67zA4VB@F)#*C!Z=CHTJYLE~hIfB@Di6`a7^BzD1=S?uQJ-%g$hZ=Ru+%tgIJ+PHxT?8NUHB=^uPiFsSOs#L7q0KNsIg3x8hZ z<`{aBq{D?(sxrdH(qn?+9hhn?OT-rb?0GqZAmuBHlzWulV4l}FluY!X?o~%PU?#?{ zxjxVuTH(t-$oo(PRJoUEN0Jp^Y=w`ab-2Q$QwQvf)MWD_7iPqdCC9`%iuHP!Q#c#8mR1z#;UL)omdQdG9%ak zdqA^j2qaFSC4H#^&it4a{zU(YnRR@MMqLmy$`8#zRCcCh37g}hfH8fxR13*#a=?I0 zGq%u(j;wIm+gk~K?(ePF1qkrvFF&s$**owHfBz%Q3hIV(_3FiHVxCnI>~Up77br_& zl18goA%(ZQaGd<$Ag>EcEr<;IEoe~x3CL*~#)O8z6RwXsDXmi+WaA07AC^{^;rQ?f zCYTPOevAMzMzIUoOy*6LgMX0+&I#0)Ryb)L=aR~l!US0l2BGfm9yw!+bvOZl`Y48l zK8oo>jLn6xg_Mb|o8WJ)nzi#k3wGOpa{)+6^ZA(66(e+>Af$VGjX z3|C@N^wI72qYyo%o6AeSR|n{ie1uTR*(;ND9;F~ zW29m*fLjrg^#=ozFgmT0j3Ie{BfF_6JQ`;^FN}_sCQ++mLtW4)BH^*Uqa}7898J)K zUVpD<(&Kb%{DX`p)ob!{WnuMU$MyM#Re5~yYz~KyW^izC2FDM2IDT9i(u+DSmDS+R zty&uw?wyC?_*j~; zvax`6r?#I`n%~9{(h#b^cmDw3aiK=jv@#yg_K=!#Y?BlQj^&J(Mle~QkhA8|^oTZ1 z)cK&;#T$9ybGQ=EslK1Vte?{FVsin=3mUImt^l-xhXxim5=A}N2La`<-|RD;`?50| zFo*9>>bJ-Q>1}o&yA+<2+0+iYZ3|rypL^~#YB+XER=p1CHCU;YRhN)liO4=Jy@w}c zDN{rmJt7A!P%L$^23!}tDNS|fPpoq)l02ImlH~c)*20rGfx8qZJz-RIJgRR{Mx}X+ z)kGijH0yJq894PTQXP)eM9WnxVAv&88O_&8-W>%G>uwcU<=J7m&_7ksh7rVPQ4nbc zOBkjHF!Ga`elT{Gh3DzGbd(ReUN@Hhs?4NAKv}AnEDHcFAs8hBp3zz+5E`%7pN;yw z`nxRGx{O(MG_8GlT*b8gy*cbZoWfxRprdOWK1?Sy+`0Xrem-g@eF>9X-|M2+WpcuDX+IAe zQE4tn_B$@3Ff0r4TxoE>El8Yi6);B2BicNUs=PT8r7>;{cqTiYL?L5Cro<#b#hmYKLDToV!dcAdB}Y#( z%agJ(2jCt!Zx1-rN@1r3fX2dkdz70I5Qw25RFC*=or+W$Msra zKY6+SMm995__S8PuVPeJ&FP~J1f;q#RY1yi-^%f2ALn}HZ2s`o#eeKi07bk=TS{5%{*y)XpsrVP_;|mhRO2r%6@$nJ;-HG*z z#Io96R7j(-0NE&dLgO4_2iN-jQb!g*61&C>TzHgnQ{Tu^q+T&uU<4@ZC%HEp%T5i` zE1`|X#6w^7fe~6?hG&8^AAUnhP&pzP!miFy-N|COc(9cH@GQ0yC7QB}0U5}UTd-*k zR5uMQX<>1*%*yw(vQ%9Wix4w@uYLmzOgafmL%W`IXF0`u)8EMOPGsZdW*L`2G*($FLl`%CGDo9 z%VDKBPI5j?wb((5_!$w@aiO#w$bLo@gfNvxR{>~T0cX5Xe-MP$>v!ucniUMft^kCB z!L%}*!{)pzBu?{Nm4VRejF{e((2h z!4pipRjoSn3O*=$eB}E+L`>-6!yU5tI6G`7y#hPL1rS~lr1ZKxxVD_Mp!`e!dk8c- zS3((T(M2Go(7B^SieyK<4O*?3!ScGo4FUlOSq+KB%Pc{VzHZE-8%ZSyRJGGqR+b>9 z42j?o#jr-y8iFK%Gbgz=W@Q|LJ2Y)uygvfJ{@@(v5;K^;i^_N=nj{F7E@oQpM1%sh zRw?l400efTgQAV5I%ilog2b~979TWYP|AetDV8`XSwr3YPxThJb)JBU2HP%<&q~_v zu)k^B6)ZC^PL0n}z%Waow7HWry=0Ui9!jW1N6^rTnxSKjSX4mZ)Fe|WyezgGx zX#9?h4r@8V!`gB*5$jU+DGV!|6;CW^3{3s&BmmMX*PR)Bv{4^)AtTV)+kH(?*4 zG8O=;;IjXshZj$#uz$a@p9(^#2b%3w5$XWg*|BIlm}M*S;!giPAMW7ie{K`*-=Dx2 z|KMHNKR6%&!aT;Pp#Oo7eFP2;4&mv}Gx8E{xXB5-bt6&*AZeIRWGg%Rl;sWOaxx%DV#9jIuR9r@X{REk1qI_4bT~m%=^xREosqp9uUg92muT&FD$gwfdK&p zKLXfd*V8@Sqz?|9idh+q5m?zl+%t-;_eKWOr3H4Uz`&gk7L}hY_p)G!rQiSqh6Djb z?5CBhRhMK;G7e_gr6BZmWJJDkfPkf61M+usY_(W7t=_SXiTjCm)eI10ig+`TerDS~ zH5Mo0Os!vNy2rGvazqaSxt>9ml1mgrm_h`p?ObCBAH@D#V-V5@E-a5BdfoaT}U&cbpCxywV3rbmwn%raiwBgEdY_du=#H7ROgfvoM{p~Ncr~t&X zzoLbW%fN^CVNMl@p&_b|;!WCf2PwH!W@KcKx?Jj&*uf32>tyr608|ReKy!Q6fMU)e zJta^=ol`ZjqbVNs5{W%@kI|p#py%8KSYXvq^Ldn2bl9wAPo&D7wnFD!50goPAN`>f zcu{po|KrW4uzmUl{OnI(r=w;L_V;0RZ56(^iePWQ{cc^z=jx)%jh+t%EJei(7%=bH zzYaVA?#$4ZV~hZxiT&yayME(0BV&Ts9HX0f?U!){QcRD5KtmhXoF$7S;%^qkGBKbE z!u`>l${3G3@_IHy121aQ`=E=10fXpmwS5+uu3ie&EUq5_n_l=cLey&pe6=E=57Ui$ZE7|3Yy(DKBdZdT+zMP~f3s~-VR>6g) zAl{h=vg(**0b_^Lkn4`0_?#{GZie6(sP9`{5{rn*>L2w}+;7u*la{w|rad=?C841L`;7V#_zV7zijAROS z-3YoE)S7&f@E;|V!SAhY0>^eK+F1=oR>AvVo*#O?*;D{lP_sx(bw*==h=R zi`tm0^f_ijeD!<>FONES^Q}ENdv*@5zrIb5jE9GZbXq4Wr|;ak4;$-iLrj5~i`W(j z04(IN@qv=*=;QW5=gn1M!4pf5ULMwdTY`>ZD6>iM&mrmHct{IIUjT4t?3VgPOg znT1YG9|+>K22Tj&)p4l8=5NtH^MjL5y;>K@k3tF}id~q@N)tVkbBLpYq?rVr86-*A z&N*%5T!Q2}jFOlEnP?-G!i9=)WLbdF#1jCc`Z29&Jbz0?KpkK|_Jzf|lzc`Q2pV`u z9h4oVZ02-xgfzW~f3Knu9#La#FFQ!5p`uPr?P?Owz9Z?wOF3D@^1q8PxxgNk0fGB2 z@r3d^Km=9&ody<*@Ej9SrSDV;tD6!i*n;+{f-sBB7}!d+;lby4K>;9;6s@W7wOLMJ z_3V)@GV#1XD@bJM7Y;K)mj^1{q z@9Lpn7erVdkN{8s30m;dMHiV>Tn}1qBZ}xa)Yt0jDuYF>`^xHi6&r6?2Dc0=%PX88 zODtiOxf2;sW>*&kAN2HIU0;P`G|yKn!0P5oWqf0CPwDCV<0^W++&>@-7>}O=NdpGZ zijXI5dI~ZYuayEb^qJI@#f&Srx-|Pf-T2(+|JiS7Z+tnr$$XNM`12SB${;9v10A5mnH&4$LuX*x01sc# zt5Q&yB+nx~VT7MsiezdO5Gc|ITqm*kA>hm5gv9=g)ymUE-^LR@>dH!BKZVWpWEEqx zIQj*RswsYqj))UC!7r`V&rWspcd9B5w1Q!>vg4{`Jv^+|ue~|Eyf=k|yEFQk?o{i~ z!JKkNW52OTOp}5|?fUGqX8?Zs@2LL{DEB0$OSvR!#KMNOKXx(SsZPda|6o22i}# z1#G_QZiw#@oW{!|+u+$9BU3qe*85yVuhfDL43zFFA}u&+>OBLc@`8vZpGDwm8NMqU zsGep1oA?=o6-tq zFhEnQo0^$5cvGLF?8I{TWZjL6)gwzDp4=q^0pF3p>m_x{rr>5}F#|;qJ+=CJ7P^)p zj46xqTgOS+PGk=H3`k*e4`(?z`#Dj(N-A0_Q)$bvD0m1vduF|zJ<$3h$!?siPW-&S z*_~4;2a=1m{(KGb02iTCGVs!k$rhvlJgp-nC77!Q#KXq({|-rpA^5lYqe@)-ef7n#3do$Jz7<*4IwKjhpYo=BYJ0%S%sg;SC@|%$R_s z934$zt#$&sDvYb%Yh`trOzz5jFt{2IV?3y0*?cyo0Npsp;uyzqhOmkAxMyo?4ouJH z%fdX#t=Jj+)%)Ydzxdog{}lkRgc9(DC;$3$b>Y0_re)Fpbet?q!x7YREuJ7@2(1gV zVFRf-^->v?>OmMVK*TVQIkCl*2LNG=rtP$pT=$_vTtLp2FU1niC!_SqCIk1YQ)p#9 zT4r3Jj7^$OvVbW$oalHZ+{4Yu)s9_=g{3zY#OaEw>#4!*){sH-dpLo>$f9eGA)49Qrn z^Jyhhkm@l-bE7wOPYmerE{9}H_mBbge1@3isa9}hlmE3V06+UvTky_zI{2eMdXL&L zsk$E2cRbsD3YTAdg-r3!pYK$o#mt2>IorJ_rqq#M2$cEA+CyC)IUH6Xn;y-$-6d{n zUM~X(orrPnh47?DiC20 z=_FStI6YC6F{Kzd&_D;;&M{l5edRPH^9+>FaE6fGIpUN zTacms8Ub6?w?Sz(_yj=@mvXaPS(!f*~)z+WL8;x6reA|-om41v&N$+>1uY(!h ziA)8pbjQ;}W^Pm6q8+uIxK40H` z>+t`+c=L~c@YJVnc3pa--n11dzUl#zO|;VbiAW>V&!vr(lHVj=6y5X8;hs&w2`~ur4~fm>w@DZ|EXa zeY}ETr|~wFwb<=e|frHbKNM###DW>-0gtD6pwbM(^4_a5Km_4Go{}k5e&yp&NVZZ zLh}d}vQ-Ckx`U%x2Vec_E?mD}En*k9i6I;v9Z(p;*|VqN-ra|ArY>w`83){fMAL zp8P$7&+6I=ood>R$HbUM5&@5Eg287_3hC+boII$P&>A)X9^U|qPDZbL&;zB|u0da= z!Syn=0yvf3+KAuk%j&Ou{`0?jKXeB)Czk5#_wM|wFVtUO`0TZR^T|4yesSKHYY0S0 zIB6k*4gm13gbG_q)qq#bWiWtNr!Hj5+J?x0Pn@%LBg;;Rz(aPe%z$F4I&`;IU>fO; z!~aJ{LY*{XMRnKBt&U;CWY7`%f?^&HCMAQ%izNYY0gwI_MUh?EbWapbEkKh4D46Ps zI2P^1vKNASRj@*FE;|w{eT&w`dRwU}TmMSX(J1q2q-&+)HsJhmuR*fHI`u)eI}3wq zbs8?}@#QK)w2MYr4s{e|Ra7Os_!AZB8)Pt;{Sdzs5TpeB$Ea)0aGd6tv=>pjc12wv za_kP?k10G35qO?qz~zi$$q;~+GdmjQ(vg=nRa3?V!ESv6;K%;<8r;5p1Yi0Ox8Yy@ z#%BF&jWPqyj*nnobs}d@Z^8Y0kKpo^SK;yF9UCPOOw(3J_N*cv|6RanJYA#WwwjVd zVzDsc3J;9wSc>L#5$j))6u0x~R5n`PH1UTHY{Yx;gbUI2;W_T;Gli^I&n8~KTxH6?Vt)c qaHD?w^&Zy$`17Cpm0dXD_5T5@yUi}iv0sb;0000封面

+const n="/zh-cn/assets/cover-bc86e95c.jpg",t="/zh-cn/assets/image1-d4391053.jpg",e=[n,t],r={label:"DatenLord开源产品技术分享 | Xline源码解读",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。本期源码解读将聚焦Xline的Curp共识协议,DatenLord分布式存储工程师赵佳炜将与大家分享在Xline中应用的Curp共识协议的设计与代码实现。",cover:"./cover.jpg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-04-24",title:"DatenLord open source product technology sharing l Xline source code interpretation"},o=[{label:"【源码解读】Xline Curp 共识协议的设计与实现",level:2}],l=`

封面

传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源分布式 KV 存储 Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。

本期源码解读将聚焦 Xline 的 Curp 共识协议,DatenLord 分布式存储工程师赵佳炜将与大家分享在 Xline 中应用的 Curp 共识协议的设计与代码实现

【源码解读】Xline Curp 共识协议的设计与实现

@@ -17,4 +17,4 @@ const n="/zh-cn/assets/cover-bc86e95c.jpg",t="/zh-cn/assets/image1-d4391053.jpg"

【直播预约】 欢迎您预约直播,或者登陆腾讯会议观看直播:
会议号:955-6910-3992

-

图片

`;export{e as assetURLs,l as default,o as metadata,r as toc}; +

图片

`;export{e as assetURLs,l as default,r as metadata,o as toc}; diff --git a/zh-cn/assets/index-12a2a854.js b/zh-cn/assets/index-047539e4.js similarity index 95% rename from zh-cn/assets/index-12a2a854.js rename to zh-cn/assets/index-047539e4.js index aff611b..333cd8a 100644 --- a/zh-cn/assets/index-12a2a854.js +++ b/zh-cn/assets/index-047539e4.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg",e=[o,t],n={label:"硬件敏捷开发与验证方法学研讨",description:"作为2022年第二届RISC-V中国峰会的同期活动,8月27日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。",cover:"./cover.png",location:"新加坡",date:"2022-08-23",title:"Hardware Agile Development and Verification Methodology Workshop"},s=[],r=`

作为 2022 年第二届 RISC-V 中国峰会的同期活动,8 月 27 日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。

+const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg",e=[o,t],n={label:"硬件敏捷开发与验证方法学研讨",description:"作为2022年第二届RISC-V中国峰会的同期活动,8月27日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。",cover:"./cover.png",location:"新加坡",date:"2022-08-23",title:"Hardware Agile Development and Verification Methodology Workshop"},s=[],l=`

作为 2022 年第二届 RISC-V 中国峰会的同期活动,8 月 27 日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。

如何提升数字芯片的开发和验证效率一直是业界关注的焦点。近年来随着 Chisel、SpinalHDL 等等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HLS。此外,基于 Python,以 Cocotb 和 pyuvm 为代表的新一代验证框架的推出,使得验证的周期得到一定程度的缩减,特别是基于 Python 的验证框架可以复用 Python 生态丰富的已有工具和模型,大大减少了 Golden Reference 的工作量。

更重要的是,这些新一代 HDL 打开了全新的数字芯片敏捷设计和验证的方法学大门。本次研讨将邀请业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。

参与本次研讨的听众可以深入了解业界关于硬件敏捷开发与验证的最前沿探索,诸如:

@@ -11,4 +11,4 @@ const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg"

活动时间:8 月 27 日,13:15-17:15
活动链接:https://t.elecfans.com/live/2113.html
感兴趣的听众可以添加海报中的群主二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨。

-

图片

`;export{e as assetURLs,r as default,n as metadata,s as toc}; +

图片

`;export{e as assetURLs,l as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-93097ad1.js b/zh-cn/assets/index-148365b0.js similarity index 95% rename from zh-cn/assets/index-93097ad1.js rename to zh-cn/assets/index-148365b0.js index a90e605..d6740dd 100644 --- a/zh-cn/assets/index-93097ad1.js +++ b/zh-cn/assets/index-148365b0.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/cover-6865ae02.png",e=[i],l={label:"Xline v0.4.1:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-06-21",title:"Xline v0.4.1: A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.4.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],s=`

封面

+const e="/zh-cn/assets/cover-6865ae02.png",i=[e],l={label:"Xline v0.4.1:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-06-21",title:"Xline v0.4.1: A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.4.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],s=`

封面

Xline 是什么?我们为什么要做 Xline?

Xline 是一个基于 Curp 协议的,用于管理元数据的分布式 KV 存储。 现有的分布式 KV 存储大多采用 Raft 共识协议,需要两次 RTT 才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个 RTT,从而提高性能。因此,Xline 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

@@ -43,4 +43,4 @@ const i="/zh-cn/assets/cover-6865ae02.png",e=[i],l={label:"Xline v0.4.1:一个
  • Curp 相关文章:
    https://medium.com/@datenlord/curp-revisit-the-consensus-protocol-384464be1600
  • Xline 官网:www.xline.cloud
  • -`;export{e as assetURLs,s as default,l as metadata,t as toc}; +`;export{i as assetURLs,s as default,l as metadata,t as toc}; diff --git a/zh-cn/assets/index-6fc8a945.js b/zh-cn/assets/index-284b9c1c.js similarity index 96% rename from zh-cn/assets/index-6fc8a945.js rename to zh-cn/assets/index-284b9c1c.js index b277748..a651103 100644 --- a/zh-cn/assets/index-6fc8a945.js +++ b/zh-cn/assets/index-284b9c1c.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg",t=[n,s],a={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},e=[{label:"芯片敏捷设计与验证之路",level:2},{label:"香山处理器敏捷开发与验证实践",level:2},{label:"通过 Chainsaw 实现硬件算子敏捷开发",level:2},{label:"Scala 在 IC 开发中的应用",level:2},{label:"NaxRiscv CPU: Introduction and Extension Demonstration",level:2},{label:"结束语",level:2}],o=`

    封面

    +const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg",t=[n,s],e={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},o=[{label:"芯片敏捷设计与验证之路",level:2},{label:"香山处理器敏捷开发与验证实践",level:2},{label:"通过 Chainsaw 实现硬件算子敏捷开发",level:2},{label:"Scala 在 IC 开发中的应用",level:2},{label:"NaxRiscv CPU: Introduction and Extension Demonstration",level:2},{label:"结束语",level:2}],a=`

    封面

    8 月 27 日,作为 2022 年第二届 RISC-V 中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代 HDL 在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。

    芯片敏捷设计与验证之路

    华南理工大学计算机科学与工程学院赖晓铮副教授首先分享了 “让硬件设计像软件设计一样简单”的愿景,即开发人员编写的代码只占工作量的 10%,剩下 90%由开源芯片生态系统提供。

    @@ -23,4 +23,4 @@ const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg"

    请点击如下链接:
    https://t.elecfans.com/live/2113.html收看本次研讨会的回放。
    也欢迎添加小助手微信,加入“硬件敏捷开发和验证方法学讨论群”,进行延伸讨论与互动,并第一时间获得后续相关活动的讯息。

    -

    图片

    `;export{t as assetURLs,o as default,a as metadata,e as toc}; +

    图片

    `;export{t as assetURLs,a as default,e as metadata,o as toc}; diff --git a/zh-cn/assets/index-ccecb7fb.js b/zh-cn/assets/index-29c0b7ce.js similarity index 99% rename from zh-cn/assets/index-ccecb7fb.js rename to zh-cn/assets/index-29c0b7ce.js index fda9d29..1b821d3 100644 --- a/zh-cn/assets/index-ccecb7fb.js +++ b/zh-cn/assets/index-29c0b7ce.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",a="/zh-cn/assets/image1-b7df4899.png",s="/zh-cn/assets/image2-a77c94e1.jpg",t=[e,a,s],r={label:"计算机体系结构 | MIT Training Q&A及小贴士",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175和6.375的课程和Lab学习都有一定的难度,要求采用Bluespec语言实现RISC-V处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["硬件加速"],date:"2022-06-11",title:"Computer Architecture l MIT Training Q&A and Tips"},n=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],c=`

    图片

    +const e="/zh-cn/assets/cover-1329fc54.png",a="/zh-cn/assets/image1-b7df4899.png",s="/zh-cn/assets/image2-a77c94e1.jpg",t=[e,a,s],r={label:"计算机体系结构 | MIT Training Q&A及小贴士",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175和6.375的课程和Lab学习都有一定的难度,要求采用Bluespec语言实现RISC-V处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["硬件加速"],date:"2022-06-11",title:"Computer Architecture l MIT Training Q&A and Tips"},i=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],c=`

    图片

    在 2023 年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175 和 6.375 的课程和 Lab 学习都有一定的难度,要求采用 Bluespec 语言实现 RISC-V 处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab 环节还涉及软硬件联合开发,要求基于所实现的 RISC-V 处理器运行真实的 RISC-V 程序,并给出性能评估。

    继 MIT6.175 和 MIT6.375 学习笔记之后,我们又整理了到目前为止,硬件设计学习社区里大家碰到的一些共同问题,希望我们的回复以及学习贴士对于想啃下这两门高难度课程,并想从事数字芯片设计的工程师或同学有所帮助。

    MIT Training Q & A

    @@ -76,4 +76,4 @@ A:我目前是用 docker 做的实验,6175 的 lab1-6 和 6375 的 lab1-4

    计算机体系结构| MIT6.175 和 MIT6.375 学习笔记

    达坦科技硬件设计学习社区持续开放,若想询问加入细节,请添加下方小助手微信号或邮件info@datenlord.com

    -

    图片

    `;export{t as assetURLs,c as default,r as metadata,n as toc}; +

    图片

    `;export{t as assetURLs,c as default,r as metadata,i as toc}; diff --git a/zh-cn/assets/index-0c25eea3.js b/zh-cn/assets/index-2b1c59a2.js similarity index 97% rename from zh-cn/assets/index-0c25eea3.js rename to zh-cn/assets/index-2b1c59a2.js index 25c7558..88f473f 100644 --- a/zh-cn/assets/index-0c25eea3.js +++ b/zh-cn/assets/index-2b1c59a2.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg",n="/zh-cn/assets/image2-9ad061db.jpg",o=[t,s,n],r={label:"Rust X DatenLord l Rust China Conf 2023 倒计时!",description:"Rust语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用Rust。达坦科技(DatenLord)旗下的开源项目Xline (用于元数据管理的分布式KV存储)就是用Rust写就的,我们也一直坚定地做Rust语言在中国的布道。",cover:"./cover.jpg",location:"中国香港",date:"2023-06-11",title:"Countdown to Rust X DatenLord l Rust China Conf 2023"},e=[{label:"倒计时",level:2},{label:"主会场",level:2},{label:"分论坛:Rust 语言与高性能实践",level:2},{label:"Workshop:Rust in System",level:2},{label:"报名注意事项",level:2}],g=`

    封面

    +const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg",n="/zh-cn/assets/image2-9ad061db.jpg",o=[t,s,n],r={label:"Rust X DatenLord l Rust China Conf 2023 倒计时!",description:"Rust语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用Rust。达坦科技(DatenLord)旗下的开源项目Xline (用于元数据管理的分布式KV存储)就是用Rust写就的,我们也一直坚定地做Rust语言在中国的布道。",cover:"./cover.jpg",location:"中国香港",date:"2023-06-11",title:"Countdown to Rust X DatenLord l Rust China Conf 2023"},e=[{label:"倒计时",level:2},{label:"主会场",level:2},{label:"分论坛:Rust 语言与高性能实践",level:2},{label:"Workshop:Rust in System",level:2},{label:"报名注意事项",level:2}],p=`

    封面

    倒计时

    Rust 语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用 Rust。达坦科技(DatenLord)旗下的开源项目 Xline (用于元数据管理的分布式 KV 存储)就是用 Rust 写就的,我们也一直坚定地做 Rust 语言在中国的布道。

    因此,2023 年 6 月 17-18 日 我们也将奔赴上海,支持 Rust 语言中文社区在疫情之后首次举办的大型线下 Rust 开发者大会。达坦科技的两位创始人将在 Rust China Conf 2023 上分别做主题演讲,在 6 月 17 日晚,达坦科技还将赞助举办一场干货满满的 workshop。

    @@ -31,4 +31,4 @@ const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg"

    添加小助手微信,进入达坦科技 Rust 前沿技术交流群

    封面

    更多关于 Rust China Conf 2023 官方信息,请查阅
    --https://rustcc.cn/2023rustchinaconf/

    `;export{o as assetURLs,g as default,r as metadata,e as toc}; +-https://rustcc.cn/2023rustchinaconf/

    `;export{o as assetURLs,p as default,r as metadata,e as toc}; diff --git a/zh-cn/assets/index-b79df9da.js b/zh-cn/assets/index-2f7b64e5.js similarity index 92% rename from zh-cn/assets/index-b79df9da.js rename to zh-cn/assets/index-2f7b64e5.js index a554c9f..25948c4 100644 --- a/zh-cn/assets/index-b79df9da.js +++ b/zh-cn/assets/index-2f7b64e5.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg",s="/zh-cn/assets/image2-f93efd4a.jpg",t="/zh-cn/assets/image3-50beaba8.png",o=[p,n,s,t],r={label:"SpinalHDL的使用和开发经验研讨会",description:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。",cover:"./cover.png",location:"中国香港",date:"2023-07-03",title:"SpinalHDL usage and development experience workshop"},a=[],g=`

    SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。

    +const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg",s="/zh-cn/assets/image2-f93efd4a.jpg",t="/zh-cn/assets/image3-50beaba8.png",o=[p,n,s,t],a={label:"SpinalHDL的使用和开发经验研讨会",description:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。",cover:"./cover.png",location:"中国香港",date:"2023-07-03",title:"SpinalHDL usage and development experience workshop"},r=[],e=`

    SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。

    达坦科技(DatenLord) 致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。

    达坦科技采用硬件加速提升存储性能,目前采用 FPGA、ASIC 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用。在 2022 年 12 月,达坦科技曾联合 SpinalHDL 社区举办一场题为《SpinalHDL 应用前景探索》的线上研讨会,收获海内外 SpinalHDL 爱好者的欢迎。

    而在北京时间 2023 年 7 月 7 日下午 14:00-17:00,达坦科技将联合 SpinalHDL 社区,以及四川芯测电子技术有限公司举办一场题为 SpinalHDL 的使用和开发经验研讨会,旨在和大家分享 SpinalHDL 最新的实践、挑战和经验的分享。

    @@ -13,4 +13,4 @@ const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg" 474-6575-9473

    图片

    对开源硬件感兴趣的朋友,可以添加小助手微信,加入达坦科技硬件群

    -

    图片

    `;export{o as assetURLs,g as default,r as metadata,a as toc}; +

    图片

    `;export{o as assetURLs,e as default,a as metadata,r as toc}; diff --git a/zh-cn/assets/index-4270ced0.js b/zh-cn/assets/index-39390118.js similarity index 89% rename from zh-cn/assets/index-4270ced0.js rename to zh-cn/assets/index-39390118.js index e0acf95..e7636fd 100644 --- a/zh-cn/assets/index-4270ced0.js +++ b/zh-cn/assets/index-39390118.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png",a=[t,e],s={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",location:"中国海南",tags:["Xline"],date:"2023-02-01",title:"Distributed laboratory live broadcast l Consensus algorithm and consistent metadata management across data centers"},n=[],i=`

    在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。

    +const t="/zh-cn/assets/image1-3ae2277f.jpg",a="/zh-cn/assets/image1-0a18e154.png",e=[t,a],s={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",location:"中国海南",tags:["Xline"],date:"2023-02-01",title:"Distributed laboratory live broadcast l Consensus algorithm and consistent metadata management across data centers"},i=[],n=`

    在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。

    本周四(2 月 2 日)晚上 8 点,达坦科技和分布式实验室合作,由达坦科技 Rust 分布式存储工程师赵佳炜讲述共识算法与跨数据中心一致性的元数据管理,并介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。

    图片

    直播亮点:

    @@ -9,6 +9,6 @@ const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png
  • Xline 接下来的优化方向。
  • 请添加分布式实验室小助手的微信,报名参与直播:

    -

    图片

    +

    图片

    达坦科技(DatenLord)推出的开源分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并保证数据的一致性,方便业务系统实现多地多中心多活部署。

    -

    GitHub 链接:https:github.com/datenlord/Xline

    `;export{a as assetURLs,i as default,s as metadata,n as toc}; +

    GitHub 链接:https:github.com/datenlord/Xline

    `;export{e as assetURLs,n as default,s as metadata,i as toc}; diff --git a/zh-cn/assets/index-fda9b0ab.js b/zh-cn/assets/index-3b5176dc.js similarity index 99% rename from zh-cn/assets/index-fda9b0ab.js rename to zh-cn/assets/index-3b5176dc.js index 9baff8e..1acad32 100644 --- a/zh-cn/assets/index-fda9b0ab.js +++ b/zh-cn/assets/index-3b5176dc.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",r="/zh-cn/assets/image5-184dc93a.png",o="/zh-cn/assets/image6-18c75b26.jpg",n="/zh-cn/assets/image7-6a4a9bfe.png",t="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,r,o,n,t,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},C=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],h=`

    2022 年 12 月 16 日,达坦科技联合 SpinalHDL 社区,举办了 SpinalHDL Webinar 2022。在题为《SpinalHDL 应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用 Spinal HDL 的实践、挑战和经验的分享。

    +const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",r="/zh-cn/assets/image5-184dc93a.png",o="/zh-cn/assets/image6-18c75b26.jpg",t="/zh-cn/assets/image7-6a4a9bfe.png",n="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,r,o,t,n,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},C=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],h=`

    2022 年 12 月 16 日,达坦科技联合 SpinalHDL 社区,举办了 SpinalHDL Webinar 2022。在题为《SpinalHDL 应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用 Spinal HDL 的实践、挑战和经验的分享。

    数据通路加速

    图片

    分享人:Tianrui Li

    @@ -32,12 +32,12 @@ const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg

    演讲摘要: This presentation / live demo shows how the NaxRiscv project (Out-of-order / superscalar RISC-V CPU) mix Scala and the SpinalHDL API to describe its hardware. By many aspect, it goes beyond the VexRiscv project, and should provide some usefull / interresting design patterns for the public.


    硬件设计流程

    -

    图片

    +

    图片

    分享人:Readon

    演讲主题: Recent progress on formal verification support on SpinalHDL

    演讲摘要: The formal verification is a technology to verify design, which helps to find the corner cases. SpinalHDL have provided an integration of this tech with SymbiYosys easily. The brief introduction on how to verify a design would be presented by example. Some new build blocks helping to simplify the verification process would be introduced. At last, a short overview of the verification of some facilities in SpinalHDL's lib would also be summarized.


    -

    图片

    +

    图片

    分享人:Sebastien-riou

    演讲主题: SpinalHDL for ASIC

    演讲摘要: The presentation is a highlights of a ASIC done entirely in SpinalHDL, fabricated in GF22FDX. Focus on pads, RAMs and FPGA for ASIC verification.

    diff --git a/zh-cn/assets/index-70350f65.js b/zh-cn/assets/index-40aedb60.js similarity index 99% rename from zh-cn/assets/index-70350f65.js rename to zh-cn/assets/index-40aedb60.js index aa648eb..7811479 100644 --- a/zh-cn/assets/index-70350f65.js +++ b/zh-cn/assets/index-40aedb60.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",c="/zh-cn/assets/image8-f5342e9f.png",i="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",m="/zh-cn/assets/image16-73064f95.png",g="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",S="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",f=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,m,g,R,_,b,j,S,E],y={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],v=`

    引 言

    +const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",c="/zh-cn/assets/image8-f5342e9f.png",i="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",g="/zh-cn/assets/image16-73064f95.png",m="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",S="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",f=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,g,m,R,_,b,j,S,E],y={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],F=`

    引 言

    循环冗余校验码,即 Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC 算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC 检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要 CRC 来保证数据传输的正确性。而不同的应用场景往往需要采用不同的 CRC 配置参数,同时对计算的性能也有不同的需求。例如,在基于 Ethernet 协议的网络传输中需要采用 IEEE802-3 协议所规定的 CRC 参数,同时需要高吞吐率的 CRC 实现以和网络带宽相匹配。

    对于一个具体的通信系统,CRC 既可以通过软件编程也可以硬件电路的形态来实现。相较于网络上丰富的软件库,开源的 CRC 硬件实现却相对落后,尤其是面向高性能的应用场景。例如,下述链接都提供了参数可配置的 CRC 硬件电路生成器,但这些实现方式都是直接将 CRC 算法映射到组合逻辑电路上,这往往会导致较长的组合逻辑延时进而降低电路的整体工作频率,无法满足高吞吐率的需求。

      @@ -64,10 +64,10 @@ const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png

      的查找表,其中第图片张查找表的第

      image

      个表项的值即为

      -

      image

      +

      image

      的 CRC 校验和。

      虽然有了定理 1 我们可以在一个周期内并行处理多个字节数据,但基于此还不能够完成 CRC 的硬件实现。在实际电路中数据总线的位宽是有限的,对于较长的输入数据,需要根据总线位宽将其分成多个帧并分配到多个周期进行传输。因此,我们还需要基于定理 2 累加不同周期计算得到的 CRC 校验值进而获得最终结果。在 blue-crc 的实现中,数据以大端字节序进行传输,即高位数据先传入进行处理, 假设输入数据总线位宽为 256-bit, 当前周期输入数据对应的多项式为 A(x), 该周期之前已经输入的数据为 A'(x), 每个周期我们除了计算 CRC[A(x)],还需要将该值累加到已经计算好的中间校验和 CRC[A'(x)]上,得到数据

      -

      image

      +

      image

      的校验和。根据定理 1 和 2,可以推导出累加的计算公式如下:

      image

      即需要将中间校验和 CRC[A'(x)]左移 256-bit,对其再次计算 CRC 校验值后和 CRC[A(x)]相加。同样我们可以通过硬件查找表的方式完成这里校验和的计算。

      @@ -266,4 +266,4 @@ CrcAxiStream#(32, 256 https://github.com/datenlord/blue-crc

      引用和链接

      [1] Y. Sun and M. S. Kim, "A Table-Based Algorithm for Pipelined CRC Calculation," 2010 IEEE International Conference on Communications, Cape Town, South Africa, 2010, pp. 1-5, doi: 10.1109/ICC.2010.5501903.

      -

      [2] Sun Y, Kim M S. A pipelined CRC calculation using lookup tables[C]//2010 7th IEEE Consumer Communications and Networking Conference. IEEE, 2010: 1-2.

      `;export{f as assetURLs,v as default,y as metadata,x as toc}; +

      [2] Sun Y, Kim M S. A pipelined CRC calculation using lookup tables[C]//2010 7th IEEE Consumer Communications and Networking Conference. IEEE, 2010: 1-2.

      `;export{f as assetURLs,F as default,y as metadata,x as toc}; diff --git a/zh-cn/assets/index-e197de7f.js b/zh-cn/assets/index-4b956329.js similarity index 97% rename from zh-cn/assets/index-e197de7f.js rename to zh-cn/assets/index-4b956329.js index 2565054..9794106 100644 --- a/zh-cn/assets/index-e197de7f.js +++ b/zh-cn/assets/index-4b956329.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-12543354.png",s="/zh-cn/assets/image1-0a18e154.png",n="/zh-cn/assets/image2-e7e1943c.png",a="/zh-cn/assets/image3-5eef7eef.jpg",e=[t,s,n,a],l={label:"欢迎报名Rust China Hackathon 2022 达坦科技组",description:"12月4日下午,DatenLord就2022Rust China Hackathon大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"Welcome to sign up for the Rust China Hackathon 2022 Datan Technology Group"},o=[{label:"赛事日程表",level:2},{label:"参赛福利",level:2},{label:"赛题评审",level:2},{label:"参赛及代码提交",level:2},{label:"赛题剖析",level:2},{label:"达坦科技 DatenLord 赛题",level:2}],p=`

      12 月 4 日下午,DatenLord 就 2022Rust China Hackathon 大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。

      +const t="/zh-cn/assets/cover-12543354.png",s="/zh-cn/assets/image1-0a18e154.png",n="/zh-cn/assets/image2-e7e1943c.png",a="/zh-cn/assets/image3-5eef7eef.jpg",e=[t,s,n,a],l={label:"欢迎报名Rust China Hackathon 2022 达坦科技组",description:"12月4日下午,DatenLord就2022Rust China Hackathon大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"Welcome to sign up for the Rust China Hackathon 2022 Datan Technology Group"},p=[{label:"赛事日程表",level:2},{label:"参赛福利",level:2},{label:"赛题评审",level:2},{label:"参赛及代码提交",level:2},{label:"赛题剖析",level:2},{label:"达坦科技 DatenLord 赛题",level:2}],o=`

      12 月 4 日下午,DatenLord 就 2022Rust China Hackathon 大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。

      本届 Hackathon 为 Rust 中文社区举办的第一届的线上黑客马拉松,大赛主题为「RustForFun」,分为「社区组」与「企业组」。达坦科技作为本届 Hackathon 的协办方,赞助参与本次企业组赛道。希望借此机会激发大家对 Rust 语言的学习热情,提高应用 Rust 的能力,同时结识志趣相投的好友,一起进行思维的碰撞。

      赛事日程表

        @@ -62,4 +62,4 @@ Xline 是达坦科技推出的分布式元数据 KV 存储器。在使用中, }

        评估标准
        -你的实现应遵从上述 Trait 并满足上述要求。我们将使用一定基准测试来进行评估,并根据其结果评分。在基准测试中,我们将发送大量并发请求,因此你也可以创建自己的性能测试来帮助进行优化。

        `;export{e as assetURLs,p as default,l as metadata,o as toc}; +你的实现应遵从上述 Trait 并满足上述要求。我们将使用一定基准测试来进行评估,并根据其结果评分。在基准测试中,我们将发送大量并发请求,因此你也可以创建自己的性能测试来帮助进行优化。

        `;export{e as assetURLs,o as default,l as metadata,p as toc}; diff --git a/zh-cn/assets/index-1492dd61.js b/zh-cn/assets/index-4e03dfad.js similarity index 90% rename from zh-cn/assets/index-1492dd61.js rename to zh-cn/assets/index-4e03dfad.js index abac758..796a94b 100644 --- a/zh-cn/assets/index-1492dd61.js +++ b/zh-cn/assets/index-4e03dfad.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",s="/zh-cn/assets/image1-0a18e154.png",a=[t,n,s],o={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},p=[{label:"线上研讨会",level:2}],r=`

        新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

        +const o="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",t="/zh-cn/assets/image1-0a18e154.png",s=[o,n,t],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},p=[{label:"线上研讨会",level:2}],r=`

        新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

        线上研讨会

        达坦科技(DatenLord) 致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。达坦科技采用硬件加速提升存储性能,目前采用 FPGA、ASIC 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用。

        为了让对开源硬件感兴趣的朋友进一步了解 SpinalHDL,在北京时间 2022 年 12 月 16 日下午 17:00-21:00,达坦科技联合 SpinalHDL 社区举办一场题为《SpinalHDL 应用前景探索》的线上研讨会(Webinar),本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程 (Flow)。

        @@ -11,4 +11,4 @@ const t="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg" 会议号:830 6630 7799
        密码:1216

        对开源硬件感兴趣的朋友,可以添加小助手微信,加入达坦科技硬件群

        -

        图片

        `;export{a as assetURLs,r as default,o as metadata,p as toc}; +

        图片

        `;export{s as assetURLs,r as default,a as metadata,p as toc}; diff --git a/zh-cn/assets/index-71801d47.js b/zh-cn/assets/index-595df927.js similarity index 95% rename from zh-cn/assets/index-71801d47.js rename to zh-cn/assets/index-595df927.js index 1fe4386..f272c30 100644 --- a/zh-cn/assets/index-71801d47.js +++ b/zh-cn/assets/index-595df927.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",s=[t,o],e={label:"活动预告 | 第二届硬件敏捷开发与验证方法学研讨会",description:"2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新加坡",date:"2023-08-20",title:"Upcoming Events l 2nd Hardware Agile Development and Verification Methodology Workshop"},n=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

        图片

        +const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",n=[t,o],e={label:"活动预告 | 第二届硬件敏捷开发与验证方法学研讨会",description:"2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新加坡",date:"2023-08-20",title:"Upcoming Events l 2nd Hardware Agile Development and Verification Methodology Workshop"},s=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

        图片

        2023 RISC-V中国峰会

        2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会

        随着数字芯片的设计规模和复杂度越来越大,加之芯片市场的竞争越来越激烈,如何提升数字芯片的开发和验证效率成为业界关注的焦点。虽然各种设计工具、验证方法学层出不穷,但是一直没有得到业界广泛认可。目前业界普遍采用的还是基于Verilog、SystemVerilog、VHDL和UVM的工具和方法。

        @@ -16,4 +16,4 @@ const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg"

        收看链接:
        https://wx.vzan.com/live/tvchat-904511107?v=1691984417574
        或欢迎点击下方链接预约公众号直播。

        -

        感兴趣的观众可以添加海报中的达坦科技小助手二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨

        `;export{s as assetURLs,r as default,e as metadata,n as toc}; +

        感兴趣的观众可以添加海报中的达坦科技小助手二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨

        `;export{n as assetURLs,r as default,e as metadata,s as toc}; diff --git a/zh-cn/assets/index-d9950506.js b/zh-cn/assets/index-64abe6eb.js similarity index 99% rename from zh-cn/assets/index-d9950506.js rename to zh-cn/assets/index-64abe6eb.js index f533556..05d04e4 100644 --- a/zh-cn/assets/index-d9950506.js +++ b/zh-cn/assets/index-64abe6eb.js @@ -1312,7 +1312,7 @@ Error generating stack: `+o.message+` bottom: 0; width: 20.14rem; height: 5.42rem; -`,r1=()=>{const{sectionId:e}=fn();return A.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),d.jsxs(Ft.Fragment,{children:[d.jsx(mn,{cover:Zx,children:"资源"}),d.jsxs(gN,{children:[d.jsxs(vN,{id:"community",children:[d.jsx(yN,{children:"社区"}),d.jsx(TA,{}),d.jsx(fN,{})]}),d.jsx(_N,{src:hN})]})]})},wN="/zh-cn/assets/tech-talk-cover-10b6e35c.png",xN="/zh-cn/assets/oss-showcase-cover-2a511b0a.png",SN="/zh-cn/assets/rust-showcase-cover-78294f4f.png",bN="/zh-cn/assets/spinal-hdl-cover-9878c460.png",kN=[{key:1,cover:wN,title:"前沿科技分享",text:"探索前沿技术,拥抱创新与改变",url:"/tech-talk"},{key:2,cover:xN,title:"开源产品分享",text:"软硬件融合创新实践的观察与输出",url:"/oss-showcase"},{key:3,cover:SN,title:"Rust语言应用及案例分享",text:"Rust编程语言的应用、实践与探索",url:"/rust-showcase"},{key:4,cover:bN,title:"SpinalHDL",text:"SpinalHDL的实践、挑战与应用前景",url:"/spinal-hdl"}],{Heading:DN}=Le,{CNHead4:CN}=DN,ON=m.section` +`,r1=()=>{const{sectionId:e}=fn();return A.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),d.jsxs(Ft.Fragment,{children:[d.jsx(mn,{cover:Zx,children:"资源"}),d.jsxs(gN,{children:[d.jsxs(vN,{id:"community",children:[d.jsx(yN,{children:"社区"}),d.jsx(TA,{}),d.jsx(fN,{})]}),d.jsx(_N,{src:hN})]})]})},wN="/zh-cn/assets/tech-talk-cover-10b6e35c.png",xN="/zh-cn/assets/oss-showcase-cover-2a511b0a.png",SN="/zh-cn/assets/rust-showcase-cover-78294f4f.png",bN="/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png",kN=[{key:1,cover:wN,title:"前沿科技分享",text:"探索前沿技术,拥抱创新与改变",url:"/tech-talk"},{key:2,cover:xN,title:"开源产品分享",text:"软硬件融合创新实践的观察与输出",url:"/oss-showcase"},{key:3,cover:SN,title:"Rust语言应用及案例分享",text:"Rust编程语言的应用、实践与探索",url:"/rust-showcase"},{key:4,cover:bN,title:"硬件加速",text:"硬件加速领域的实践、经验与挑战",url:"/spinal-hdl"}],{Heading:DN}=Le,{CNHead4:CN}=DN,ON=m.section` background: ${e=>e.theme.themeDark}; `,EN=m.div` max-width: 1440px; @@ -1444,7 +1444,7 @@ Error generating stack: `+o.message+` display: block; margin-inline: auto; color: #fff; -`,l1=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>T(()=>import("./index-2d6d14a5.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>T(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-12a2a854.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>T(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>T(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-1492dd61.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>T(()=>import("./index-008dd03d.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>T(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>T(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>T(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>T(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>T(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>T(()=>import("./index-b79df9da.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>T(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>T(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-71801d47.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>T(()=>import("./index-696ef44a.js"),[])}),u6=()=>{const e=Mt(),[t,r]=A.useState([]),n=async()=>{const i=await Promise.all(Object.keys(l1).map(o=>l1[o]()));r(i.reverse())};return A.useEffect(()=>{n()},[]),d.jsx(BN,{id:"dynamics",children:d.jsxs(GN,{children:[d.jsx(XN,{children:"达坦动态"}),d.jsx(KN,{children:t.map(({metadata:i,assetURLs:o},s)=>{const{title:l,date:c,cover:f,label:g,description:v}=i;if(s===0)return d.jsxs(QN,{children:[d.jsx(ZN,{src:f?o[0]:o1}),d.jsxs(e6,{children:[d.jsx(r6,{children:g}),d.jsx(i6,{children:v})]}),d.jsxs(a6,{onClick:()=>{e(`/events/${c}-${l.split(" ").join("-")}`)},children:[d.jsx(a1,{children:"详情"}),d.jsx(s1,{src:i1})]})]},l);if(s<5)return d.jsxs(qN,{children:[d.jsx(JN,{src:f?o[0]:o1}),d.jsxs(t6,{children:[d.jsx(n6,{children:g}),d.jsx(o6,{children:v})]}),d.jsxs(s6,{onClick:()=>{e(`/events/${c}-${l.split(" ").join("-")}`)},children:[d.jsx(a1,{children:"详情"}),d.jsx(s1,{src:i1})]})]},l)})}),d.jsx(l6,{onClick:()=>e("/events"),children:"了解更多"})]})})},c6="/zh-cn/assets/blog-test-image-c63d058c.png",d6="/zh-cn/assets/blog-cover-3d82a30d.png",{Heading:f6,Paragraph:h6}=Le,{CNHead4:m6,TitleLarge:p6}=f6,{CNBodyMedium:iS}=h6,g6=m.section` +`,l1=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>T(()=>import("./index-bae930d0.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>T(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-047539e4.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>T(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>T(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-4e03dfad.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>T(()=>import("./index-b2f220f4.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>T(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>T(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>T(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>T(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>T(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>T(()=>import("./index-2f7b64e5.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>T(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>T(()=>import("./index-c86a9a07.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-595df927.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>T(()=>import("./index-a154d453.js"),[])}),u6=()=>{const e=Mt(),[t,r]=A.useState([]),n=async()=>{const i=await Promise.all(Object.keys(l1).map(o=>l1[o]()));r(i.reverse())};return A.useEffect(()=>{n()},[]),d.jsx(BN,{id:"dynamics",children:d.jsxs(GN,{children:[d.jsx(XN,{children:"达坦动态"}),d.jsx(KN,{children:t.map(({metadata:i,assetURLs:o},s)=>{const{title:l,date:c,cover:f,label:g,description:v}=i;if(s===0)return d.jsxs(QN,{children:[d.jsx(ZN,{src:f?o[0]:o1}),d.jsxs(e6,{children:[d.jsx(r6,{children:g}),d.jsx(i6,{children:v})]}),d.jsxs(a6,{onClick:()=>{e(`/events/${c}-${l.split(" ").join("-")}`)},children:[d.jsx(a1,{children:"详情"}),d.jsx(s1,{src:i1})]})]},l);if(s<5)return d.jsxs(qN,{children:[d.jsx(JN,{src:f?o[0]:o1}),d.jsxs(t6,{children:[d.jsx(n6,{children:g}),d.jsx(o6,{children:v})]}),d.jsxs(s6,{onClick:()=>{e(`/events/${c}-${l.split(" ").join("-")}`)},children:[d.jsx(a1,{children:"详情"}),d.jsx(s1,{src:i1})]})]},l)})}),d.jsx(l6,{onClick:()=>e("/events"),children:"了解更多"})]})})},c6="/zh-cn/assets/blog-test-image-c63d058c.png",d6="/zh-cn/assets/blog-cover-3d82a30d.png",{Heading:f6,Paragraph:h6}=Le,{CNHead4:m6,TitleLarge:p6}=f6,{CNBodyMedium:iS}=h6,g6=m.section` background: #f7f7f9; `,v6=m.div` max-width: 1440px; @@ -1508,7 +1508,7 @@ Error generating stack: `+o.message+` border-radius: 0.5rem; border: none; cursor: pointer; -`,u1=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>T(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>T(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>T(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>T(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>T(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>T(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>T(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>T(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>T(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>T(()=>import("./index-ccecb7fb.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>T(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>T(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>T(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>T(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>T(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>T(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>T(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>T(()=>import("./index-74772a81.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>T(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>T(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>T(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>T(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>T(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>T(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>T(()=>import("./index-b503fc36.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>T(()=>import("./index-a920aedb.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>T(()=>import("./index-1d29045e.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>T(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>T(()=>import("./index-725430e4.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>T(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>T(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>T(()=>import("./index-fa35d4ff.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>T(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>T(()=>import("./index-70350f65.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>T(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>T(()=>import("./index-277ae463.js"),[])}),C6=()=>{const e=Mt(),[t,r]=A.useState([]),[n,i]=A.useState(""),o=async()=>{const s=await Promise.all(Object.keys(u1).map(l=>u1[l]()));r(s.reverse())};return A.useEffect(()=>{o()},[]),A.useEffect(()=>{var s;i(((s=t[0])==null?void 0:s.assetURLs[0])||c6)},[t]),d.jsx(g6,{id:"blog",children:d.jsxs(v6,{children:[d.jsx(y6,{children:"技术博客"}),d.jsxs(_6,{children:[d.jsxs(w6,{children:[d.jsx(x6,{src:d6}),t.map(({metadata:s},l)=>{const{title:c,date:f,label:g,description:v}=s;return l<4&&d.jsxs(S6,{children:[d.jsx(b6,{onClick:()=>{e(`/blogs/${f}-${c.split(" ").join("-")}`)},children:g}),d.jsx(k6,{children:v})]},c)})]}),d.jsx(D6,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},c1=()=>{const{sectionId:e}=fn();return A.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),d.jsxs(Ft.Fragment,{children:[d.jsx(mn,{cover:Zx,children:"资源"}),d.jsx(AN,{}),d.jsx(u6,{}),d.jsx(C6,{})]})},O6="/zh-cn/assets/cover-2eaea155.png",E6="/zh-cn/assets/SJTU-logo-a938b527.png",T6="/zh-cn/assets/BUPT-logo-4d861e45.png",R6="/zh-cn/assets/HNU-logo-a704fb8b.png",P6="/zh-cn/assets/SCUT-logo-aa4c3285.png",M6="/zh-cn/assets/SBU-logo-a0084f17.png",j6="/zh-cn/assets/image-cd6390ff.png",{Heading:L6,Paragraph:I6}=Le,{CNHead4:$6,CNHead5:A6}=L6,{CNBodyLarge:oS}=I6,N6=m.section` +`,u1=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>T(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>T(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>T(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>T(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>T(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>T(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>T(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>T(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>T(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>T(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>T(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>T(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>T(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>T(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>T(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>T(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>T(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>T(()=>import("./index-9f27369d.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>T(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>T(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>T(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>T(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>T(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>T(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>T(()=>import("./index-a6eb2af0.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>T(()=>import("./index-b28c82c1.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>T(()=>import("./index-1d29045e.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>T(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>T(()=>import("./index-b28a4a39.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>T(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>T(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>T(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>T(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>T(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>T(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>T(()=>import("./index-277ae463.js"),[])}),C6=()=>{const e=Mt(),[t,r]=A.useState([]),[n,i]=A.useState(""),o=async()=>{const s=await Promise.all(Object.keys(u1).map(l=>u1[l]()));r(s.reverse())};return A.useEffect(()=>{o()},[]),A.useEffect(()=>{var s;i(((s=t[0])==null?void 0:s.assetURLs[0])||c6)},[t]),d.jsx(g6,{id:"blog",children:d.jsxs(v6,{children:[d.jsx(y6,{children:"技术博客"}),d.jsxs(_6,{children:[d.jsxs(w6,{children:[d.jsx(x6,{src:d6}),t.map(({metadata:s},l)=>{const{title:c,date:f,label:g,description:v}=s;return l<4&&d.jsxs(S6,{children:[d.jsx(b6,{onClick:()=>{e(`/blogs/${f}-${c.split(" ").join("-")}`)},children:g}),d.jsx(k6,{children:v})]},c)})]}),d.jsx(D6,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},c1=()=>{const{sectionId:e}=fn();return A.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),d.jsxs(Ft.Fragment,{children:[d.jsx(mn,{cover:Zx,children:"资源"}),d.jsx(AN,{}),d.jsx(u6,{}),d.jsx(C6,{})]})},O6="/zh-cn/assets/cover-2eaea155.png",E6="/zh-cn/assets/SJTU-logo-a938b527.png",T6="/zh-cn/assets/BUPT-logo-4d861e45.png",R6="/zh-cn/assets/HNU-logo-a704fb8b.png",P6="/zh-cn/assets/SCUT-logo-aa4c3285.png",M6="/zh-cn/assets/SBU-logo-a0084f17.png",j6="/zh-cn/assets/image-cd6390ff.png",{Heading:L6,Paragraph:I6}=Le,{CNHead4:$6,CNHead5:A6}=L6,{CNBodyLarge:oS}=I6,N6=m.section` background: ${e=>e.theme.white00}; background: linear-gradient(180deg, #BFC5FB, #BFC5FB00 50%); `,z6=m.div` @@ -2172,7 +2172,7 @@ U.version="2.29.4";JY(Xe);U.fn=F;U.min=YV;U.max=HV;U.now=VV;U.utc=pn;U.unix=gW;U background: #d6e4ff; border-radius: 0.04rem; text-transform: capitalize; -`,d9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>T(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>T(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>T(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>T(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>T(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>T(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>T(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>T(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>T(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>T(()=>import("./index-ccecb7fb.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>T(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>T(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>T(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>T(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>T(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>T(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>T(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>T(()=>import("./index-74772a81.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>T(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>T(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>T(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>T(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>T(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>T(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>T(()=>import("./index-b503fc36.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>T(()=>import("./index-a920aedb.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>T(()=>import("./index-1d29045e.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>T(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>T(()=>import("./index-725430e4.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>T(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>T(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>T(()=>import("./index-fa35d4ff.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>T(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>T(()=>import("./index-70350f65.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>T(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>T(()=>import("./index-277ae463.js"),[])}),O1=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>T(()=>import("./index-2d6d14a5.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>T(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-12a2a854.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>T(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>T(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-1492dd61.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>T(()=>import("./index-008dd03d.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>T(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>T(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>T(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>T(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>T(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>T(()=>import("./index-b79df9da.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>T(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>T(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-71801d47.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>T(()=>import("./index-696ef44a.js"),[])}),f9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>T(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>T(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>T(()=>import("./index-6fc8a945.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-fda9b0ab.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-4ada4a0c.js"),[])}),h9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>T(()=>import("./index-9b388911.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>T(()=>import("./index-012df9e2.js"),[])}),m9=()=>{const e=Mt(),t=qn(),{title:r}=fn();A.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return d9;case"events":return O1;case"highlights":return f9;case"news-honor-dynamic":return h9;default:return O1}})(),[o,s]=A.useState([]),l=async()=>{s(await Promise.all(Object.keys(i).map(c=>i[c]())))};return A.useEffect(()=>{l()},[t.pathname]),d.jsxs(d.Fragment,{children:[d.jsx(mn,{cover:JW,children:r&&e9.get(r)}),d.jsx(t9,{children:d.jsx(r9,{children:o.reverse().map(({metadata:c,assetURLs:f})=>{const{date:g,title:v,label:x,description:b,author:k,editor:D,location:O,cover:y,tags:_}=c;return d.jsxs(n9,{children:[y&&d.jsx(i9,{src:y&&f[0]}),d.jsxs(o9,{children:[d.jsx(a9,{children:U(g).format("YYYY.M.D")}),d.jsx(s9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:x}),d.jsx(l9,{children:b}),d.jsxs(u9,{children:[k&&d.jsxs(d.Fragment,{children:[d.jsxs(fh,{children:["嘉宾:",k[0]]}),d.jsx(hh,{})]}),D&&d.jsxs(d.Fragment,{children:[d.jsxs(fh,{children:["编辑:",D[0]]}),d.jsx(hh,{})]}),d.jsxs(fh,{children:["发表于",O]}),_&&d.jsxs(d.Fragment,{children:[d.jsx(hh,{}),_.map(S=>d.jsx(c9,{children:S},S))]})]})]})]},v)})})})]})},p9=(e,t)=>{const r=A.useRef({});A.useEffect(()=>{const n=l=>{r.current=l.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const c=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&c.push(v)});const f=g=>s.findIndex(v=>v.id===g);if(c.length===1)e(c[0].target.id);else if(c.length>1){const g=c.sort((v,x)=>f(v.target.id)-f(x.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),s=Array.from(document.querySelectorAll("h2, h3"));return s.forEach(l=>o.observe(l)),()=>o.disconnect()},[t])},g9=m.div``,v9=m.div` +`,d9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>T(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>T(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>T(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>T(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>T(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>T(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>T(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>T(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>T(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>T(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>T(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>T(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>T(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>T(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>T(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>T(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>T(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>T(()=>import("./index-9f27369d.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>T(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>T(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>T(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>T(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>T(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>T(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>T(()=>import("./index-a6eb2af0.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>T(()=>import("./index-b28c82c1.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>T(()=>import("./index-1d29045e.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>T(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>T(()=>import("./index-b28a4a39.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>T(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>T(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>T(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>T(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>T(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>T(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>T(()=>import("./index-277ae463.js"),[])}),O1=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>T(()=>import("./index-bae930d0.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>T(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-047539e4.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>T(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>T(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-4e03dfad.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>T(()=>import("./index-b2f220f4.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>T(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>T(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>T(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>T(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>T(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>T(()=>import("./index-2f7b64e5.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>T(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>T(()=>import("./index-c86a9a07.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-595df927.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>T(()=>import("./index-a154d453.js"),[])}),f9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>T(()=>import("./index-f5cc00ea.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>T(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>T(()=>import("./index-284b9c1c.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-3b5176dc.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-4ada4a0c.js"),[])}),h9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>T(()=>import("./index-ee7da202.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>T(()=>import("./index-012df9e2.js"),[])}),m9=()=>{const e=Mt(),t=qn(),{title:r}=fn();A.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return d9;case"events":return O1;case"highlights":return f9;case"news-honor-dynamic":return h9;default:return O1}})(),[o,s]=A.useState([]),l=async()=>{s(await Promise.all(Object.keys(i).map(c=>i[c]())))};return A.useEffect(()=>{l()},[t.pathname]),d.jsxs(d.Fragment,{children:[d.jsx(mn,{cover:JW,children:r&&e9.get(r)}),d.jsx(t9,{children:d.jsx(r9,{children:o.reverse().map(({metadata:c,assetURLs:f})=>{const{date:g,title:v,label:x,description:b,author:k,editor:D,location:O,cover:y,tags:_}=c;return d.jsxs(n9,{children:[y&&d.jsx(i9,{src:y&&f[0]}),d.jsxs(o9,{children:[d.jsx(a9,{children:U(g).format("YYYY.M.D")}),d.jsx(s9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:x}),d.jsx(l9,{children:b}),d.jsxs(u9,{children:[k&&d.jsxs(d.Fragment,{children:[d.jsxs(fh,{children:["嘉宾:",k[0]]}),d.jsx(hh,{})]}),D&&d.jsxs(d.Fragment,{children:[d.jsxs(fh,{children:["编辑:",D[0]]}),d.jsx(hh,{})]}),d.jsxs(fh,{children:["发表于",O]}),_&&d.jsxs(d.Fragment,{children:[d.jsx(hh,{}),_.map(S=>d.jsx(c9,{children:S},S))]})]})]})]},v)})})})]})},p9=(e,t)=>{const r=A.useRef({});A.useEffect(()=>{const n=l=>{r.current=l.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const c=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&c.push(v)});const f=g=>s.findIndex(v=>v.id===g);if(c.length===1)e(c[0].target.id);else if(c.length>1){const g=c.sort((v,x)=>f(v.target.id)-f(x.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),s=Array.from(document.querySelectorAll("h2, h3"));return s.forEach(l=>o.observe(l)),()=>o.disconnect()},[t])},g9=m.div``,v9=m.div` display: flex; max-width: 1440px; margin-inline: auto; @@ -2213,7 +2213,7 @@ U.version="2.29.4";JY(Xe);U.fn=F;U.min=YV;U.max=HV;U.now=VV;U.utc=pn;U.unix=gW;U font-size: 0.18rem; line-height: 1.5; cursor: pointer; -`,k9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>T(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>T(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>T(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>T(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>T(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>T(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>T(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>T(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>T(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>T(()=>import("./index-ccecb7fb.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>T(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>T(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>T(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>T(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>T(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>T(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>T(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>T(()=>import("./index-74772a81.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>T(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>T(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>T(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>T(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>T(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>T(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>T(()=>import("./index-b503fc36.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>T(()=>import("./index-a920aedb.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>T(()=>import("./index-1d29045e.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>T(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>T(()=>import("./index-725430e4.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>T(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>T(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>T(()=>import("./index-fa35d4ff.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>T(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>T(()=>import("./index-70350f65.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>T(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>T(()=>import("./index-277ae463.js"),[])}),D9=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>T(()=>import("./index-2d6d14a5.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>T(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-12a2a854.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>T(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>T(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-1492dd61.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>T(()=>import("./index-008dd03d.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>T(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>T(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>T(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>T(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>T(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>T(()=>import("./index-b79df9da.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>T(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>T(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-71801d47.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>T(()=>import("./index-696ef44a.js"),[])}),C9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>T(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>T(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>T(()=>import("./index-6fc8a945.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-fda9b0ab.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-4ada4a0c.js"),[])}),O9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>T(()=>import("./index-9b388911.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>T(()=>import("./index-012df9e2.js"),[])}),E9=()=>{const{section:e,title:t}=fn(),[r,n]=A.useState(),[i,o]=A.useState("");p9(o,r);const s=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const f=await(async()=>{switch(e){case"blogs":return await k9[`/src/articles/${e}/${t}/index.md`]();case"events":return await D9[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await C9[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await O9[`/src/articles/${e}/${t}/index.md`]()}})();n(f)};A.useEffect(()=>{console.log(r)},[]),A.useEffect(()=>{s(),window.scrollTo(0,0)},[]);const l=c=>{var f;(f=document.querySelector(`#${c}`))==null||f.scrollIntoView({})};return d.jsx(g9,{children:d.jsxs(v9,{children:[(r==null?void 0:r.toc.length)!==0&&d.jsx(x9,{children:d.jsx(S9,{children:((r==null?void 0:r.toc)||[]).map(({label:c,level:f})=>{const g=c.split(" ").join("-").toLowerCase();return d.jsx(b9,{level:f,isActive:i===g,onClick:()=>l(g),children:c},c)})})}),d.jsxs(y9,{children:[d.jsx(_9,{children:r==null?void 0:r.metadata.label}),d.jsx(w9,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function ab(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var _c={},T9={get exports(){return _c},set exports(e){_c=e}},E1;function R9(){return E1||(E1=1,function(e,t){(function(r,n){e.exports=n()})(To,function(){var r;function n(){return r.apply(null,arguments)}function i(a){r=a}function o(a){return a instanceof Array||Object.prototype.toString.call(a)==="[object Array]"}function s(a){return a!=null&&Object.prototype.toString.call(a)==="[object Object]"}function l(a,u){return Object.prototype.hasOwnProperty.call(a,u)}function c(a){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(a).length===0;var u;for(u in a)if(l(a,u))return!1;return!0}function f(a){return a===void 0}function g(a){return typeof a=="number"||Object.prototype.toString.call(a)==="[object Number]"}function v(a){return a instanceof Date||Object.prototype.toString.call(a)==="[object Date]"}function x(a,u){var h=[],p,w=a.length;for(p=0;p>>0,p;for(p=0;p0)for(h=0;hT(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>T(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>T(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>T(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>T(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>T(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>T(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>T(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>T(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>T(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>T(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>T(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>T(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>T(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>T(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>T(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>T(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>T(()=>import("./index-9f27369d.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>T(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>T(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>T(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>T(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>T(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>T(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>T(()=>import("./index-a6eb2af0.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>T(()=>import("./index-b28c82c1.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>T(()=>import("./index-1d29045e.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>T(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>T(()=>import("./index-b28a4a39.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>T(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>T(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>T(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>T(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>T(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>T(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>T(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>T(()=>import("./index-277ae463.js"),[])}),D9=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>T(()=>import("./index-bae930d0.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>T(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-047539e4.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>T(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>T(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-4e03dfad.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>T(()=>import("./index-b2f220f4.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>T(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>T(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>T(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>T(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>T(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>T(()=>import("./index-2f7b64e5.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>T(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>T(()=>import("./index-c86a9a07.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>T(()=>import("./index-595df927.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>T(()=>import("./index-a154d453.js"),[])}),C9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>T(()=>import("./index-f5cc00ea.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>T(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>T(()=>import("./index-284b9c1c.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>T(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>T(()=>import("./index-3b5176dc.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>T(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>T(()=>import("./index-4ada4a0c.js"),[])}),O9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>T(()=>import("./index-ee7da202.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>T(()=>import("./index-012df9e2.js"),[])}),E9=()=>{const{section:e,title:t}=fn(),[r,n]=A.useState(),[i,o]=A.useState("");p9(o,r);const s=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const f=await(async()=>{switch(e){case"blogs":return await k9[`/src/articles/${e}/${t}/index.md`]();case"events":return await D9[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await C9[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await O9[`/src/articles/${e}/${t}/index.md`]()}})();n(f)};A.useEffect(()=>{console.log(r)},[]),A.useEffect(()=>{s(),window.scrollTo(0,0)},[]);const l=c=>{var f;(f=document.querySelector(`#${c}`))==null||f.scrollIntoView({})};return d.jsx(g9,{children:d.jsxs(v9,{children:[(r==null?void 0:r.toc.length)!==0&&d.jsx(x9,{children:d.jsx(S9,{children:((r==null?void 0:r.toc)||[]).map(({label:c,level:f})=>{const g=c.split(" ").join("-").toLowerCase();return d.jsx(b9,{level:f,isActive:i===g,onClick:()=>l(g),children:c},c)})})}),d.jsxs(y9,{children:[d.jsx(_9,{children:r==null?void 0:r.metadata.label}),d.jsx(w9,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function ab(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var _c={},T9={get exports(){return _c},set exports(e){_c=e}},E1;function R9(){return E1||(E1=1,function(e,t){(function(r,n){e.exports=n()})(To,function(){var r;function n(){return r.apply(null,arguments)}function i(a){r=a}function o(a){return a instanceof Array||Object.prototype.toString.call(a)==="[object Array]"}function s(a){return a!=null&&Object.prototype.toString.call(a)==="[object Object]"}function l(a,u){return Object.prototype.hasOwnProperty.call(a,u)}function c(a){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(a).length===0;var u;for(u in a)if(l(a,u))return!1;return!0}function f(a){return a===void 0}function g(a){return typeof a=="number"||Object.prototype.toString.call(a)==="[object Number]"}function v(a){return a instanceof Date||Object.prototype.toString.call(a)==="[object Date]"}function x(a,u){var h=[],p,w=a.length;for(p=0;p>>0,p;for(p=0;p0)for(h=0;h=0;return(E?h?"+":"":"-")+Math.pow(10,Math.max(0,w)).toString().substr(1)+p}var ce=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,he=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,at={},Ve={};function X(a,u,h,p){var w=p;typeof p=="string"&&(w=function(){return this[p]()}),a&&(Ve[a]=w),u&&(Ve[u[0]]=function(){return Q(w.apply(this,arguments),u[1],u[2])}),h&&(Ve[h]=function(){return this.localeData().ordinal(w.apply(this,arguments),a)})}function At(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function tr(a){var u=a.match(ce),h,p;for(h=0,p=u.length;h=0&&he.test(a);)a=a.replace(he,p),he.lastIndex=0,h-=1;return a}var cr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function Ai(a){var u=this._longDateFormat[a],h=this._longDateFormat[a.toUpperCase()];return u||!h?u:(this._longDateFormat[a]=h.match(ce).map(function(p){return p==="MMMM"||p==="MM"||p==="DD"||p==="dddd"?p.slice(1):p}).join(""),this._longDateFormat[a])}var Sr="Invalid date";function dr(){return this._invalidDate}var Ma="%d",ja=/\d{1,2}/;function La(a){return this._ordinal.replace("%d",a)}var ei={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function ml(a,u,h,p){var w=this._relativeTime[h];return G(w)?w(a,u,h,p):w.replace(/%d/i,a)}function pl(a,u){var h=this._relativeTime[a>0?"future":"past"];return G(h)?h(u):h.replace(/%s/i,u)}var ti={};function Dt(a,u){var h=a.toLowerCase();ti[h]=ti[h+"s"]=ti[u]=a}function Ct(a){return typeof a=="string"?ti[a]||ti[a.toLowerCase()]:void 0}function ri(a){var u={},h,p;for(p in a)l(a,p)&&(h=Ct(p),h&&(u[h]=a[p]));return u}var Ia={};function mt(a,u){Ia[a]=u}function Nd(a){var u=[],h;for(h in a)l(a,h)&&u.push({unit:h,priority:Ia[h]});return u.sort(function(p,w){return p.priority-w.priority}),u}function _o(a){return a%4===0&&a%100!==0||a%400===0}function Xt(a){return a<0?Math.ceil(a)||0:Math.floor(a)}function ge(a){var u=+a,h=0;return u!==0&&isFinite(u)&&(h=Xt(u)),h}function L(a,u){return function(h){return h!=null?(Y(this,a,h),n.updateOffset(this,u),this):$(this,a)}}function $(a,u){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+u]():NaN}function Y(a,u,h){a.isValid()&&!isNaN(h)&&(u==="FullYear"&&_o(a.year())&&a.month()===1&&a.date()===29?(h=ge(h),a._d["set"+(a._isUTC?"UTC":"")+u](h,a.month(),vl(h,a.month()))):a._d["set"+(a._isUTC?"UTC":"")+u](h))}function J(a){return a=Ct(a),G(this[a])?this[a]():this}function re(a,u){if(typeof a=="object"){a=ri(a);var h=Nd(a),p,w=h.length;for(p=0;p68?1900:2e3)};var ug=L("FullYear",!0);function Vb(){return _o(this.year())}function Fb(a,u,h,p,w,E,I){var oe;return a<100&&a>=0?(oe=new Date(a+400,u,h,p,w,E,I),isFinite(oe.getFullYear())&&oe.setFullYear(a)):oe=new Date(a,u,h,p,w,E,I),oe}function Na(a){var u,h;return a<100&&a>=0?(h=Array.prototype.slice.call(arguments),h[0]=a+400,u=new Date(Date.UTC.apply(null,h)),isFinite(u.getUTCFullYear())&&u.setUTCFullYear(a)):u=new Date(Date.UTC.apply(null,arguments)),u}function yl(a,u,h){var p=7+u-h,w=(7+Na(a,0,p).getUTCDay()-u)%7;return-w+p-1}function cg(a,u,h,p,w){var E=(7+h-p)%7,I=yl(a,p,w),oe=1+7*(u-1)+E+I,ve,ze;return oe<=0?(ve=a-1,ze=Aa(ve)+oe):oe>Aa(a)?(ve=a+1,ze=oe-Aa(a)):(ve=a,ze=oe),{year:ve,dayOfYear:ze}}function za(a,u,h){var p=yl(a.year(),u,h),w=Math.floor((a.dayOfYear()-p-1)/7)+1,E,I;return w<1?(I=a.year()-1,E=w+bn(I,u,h)):w>bn(a.year(),u,h)?(E=w-bn(a.year(),u,h),I=a.year()+1):(I=a.year(),E=w),{week:E,year:I}}function bn(a,u,h){var p=yl(a,u,h),w=yl(a+1,u,h);return(Aa(a)-p+w)/7}X("w",["ww",2],"wo","week"),X("W",["WW",2],"Wo","isoWeek"),Dt("week","w"),Dt("isoWeek","W"),mt("week",5),mt("isoWeek",5),K("w",se),K("ww",se,ie),K("W",se),K("WW",se,ie),wn(["w","ww","W","WW"],function(a,u,h,p){u[p.substr(0,1)]=ge(a)});function Wb(a){return za(a,this._week.dow,this._week.doy).week}var Ub={dow:0,doy:6};function Bb(){return this._week.dow}function Gb(){return this._week.doy}function Xb(a){var u=this.localeData().week(this);return a==null?u:this.add((a-u)*7,"d")}function Kb(a){var u=za(this,1,4).week;return a==null?u:this.add((a-u)*7,"d")}X("d",0,"do","day"),X("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),X("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),X("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),X("e",0,0,"weekday"),X("E",0,0,"isoWeekday"),Dt("day","d"),Dt("weekday","e"),Dt("isoWeekday","E"),mt("day",11),mt("weekday",11),mt("isoWeekday",11),K("d",se),K("e",se),K("E",se),K("dd",function(a,u){return u.weekdaysMinRegex(a)}),K("ddd",function(a,u){return u.weekdaysShortRegex(a)}),K("dddd",function(a,u){return u.weekdaysRegex(a)}),wn(["dd","ddd","dddd"],function(a,u,h,p){var w=h._locale.weekdaysParse(a,p,h._strict);w!=null?u.d=w:O(h).invalidWeekday=a}),wn(["d","e","E"],function(a,u,h,p){u[p]=ge(a)});function Qb(a,u){return typeof a!="string"?a:isNaN(a)?(a=u.weekdaysParse(a),typeof a=="number"?a:null):parseInt(a,10)}function qb(a,u){return typeof a=="string"?u.weekdaysParse(a)%7||7:isNaN(a)?null:a}function zd(a,u){return a.slice(u,7).concat(a.slice(0,u))}var Zb="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),dg="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Jb="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ek=_n,tk=_n,rk=_n;function nk(a,u){var h=o(this._weekdays)?this._weekdays:this._weekdays[a&&a!==!0&&this._weekdays.isFormat.test(u)?"format":"standalone"];return a===!0?zd(h,this._week.dow):a?h[a.day()]:h}function ik(a){return a===!0?zd(this._weekdaysShort,this._week.dow):a?this._weekdaysShort[a.day()]:this._weekdaysShort}function ok(a){return a===!0?zd(this._weekdaysMin,this._week.dow):a?this._weekdaysMin[a.day()]:this._weekdaysMin}function ak(a,u,h){var p,w,E,I=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)E=k([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(E,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(E,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(E,"").toLocaleLowerCase();return h?u==="dddd"?(w=ct.call(this._weekdaysParse,I),w!==-1?w:null):u==="ddd"?(w=ct.call(this._shortWeekdaysParse,I),w!==-1?w:null):(w=ct.call(this._minWeekdaysParse,I),w!==-1?w:null):u==="dddd"?(w=ct.call(this._weekdaysParse,I),w!==-1||(w=ct.call(this._shortWeekdaysParse,I),w!==-1)?w:(w=ct.call(this._minWeekdaysParse,I),w!==-1?w:null)):u==="ddd"?(w=ct.call(this._shortWeekdaysParse,I),w!==-1||(w=ct.call(this._weekdaysParse,I),w!==-1)?w:(w=ct.call(this._minWeekdaysParse,I),w!==-1?w:null)):(w=ct.call(this._minWeekdaysParse,I),w!==-1||(w=ct.call(this._weekdaysParse,I),w!==-1)?w:(w=ct.call(this._shortWeekdaysParse,I),w!==-1?w:null))}function sk(a,u,h){var p,w,E;if(this._weekdaysParseExact)return ak.call(this,a,u,h);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(w=k([2e3,1]).day(p),h&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(w,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(w,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(w,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(E="^"+this.weekdays(w,"")+"|^"+this.weekdaysShort(w,"")+"|^"+this.weekdaysMin(w,""),this._weekdaysParse[p]=new RegExp(E.replace(".",""),"i")),h&&u==="dddd"&&this._fullWeekdaysParse[p].test(a))return p;if(h&&u==="ddd"&&this._shortWeekdaysParse[p].test(a))return p;if(h&&u==="dd"&&this._minWeekdaysParse[p].test(a))return p;if(!h&&this._weekdaysParse[p].test(a))return p}}function lk(a){if(!this.isValid())return a!=null?this:NaN;var u=this._isUTC?this._d.getUTCDay():this._d.getDay();return a!=null?(a=Qb(a,this.localeData()),this.add(a-u,"d")):u}function uk(a){if(!this.isValid())return a!=null?this:NaN;var u=(this.day()+7-this.localeData()._week.dow)%7;return a==null?u:this.add(a-u,"d")}function ck(a){if(!this.isValid())return a!=null?this:NaN;if(a!=null){var u=qb(a,this.localeData());return this.day(this.day()%7?u:u-7)}else return this.day()||7}function dk(a){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Yd.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=ek),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function fk(a){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Yd.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=tk),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function hk(a){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Yd.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=rk),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yd(){function a(Kt,En){return En.length-Kt.length}var u=[],h=[],p=[],w=[],E,I,oe,ve,ze;for(E=0;E<7;E++)I=k([2e3,1]).day(E),oe=pt(this.weekdaysMin(I,"")),ve=pt(this.weekdaysShort(I,"")),ze=pt(this.weekdays(I,"")),u.push(oe),h.push(ve),p.push(ze),w.push(oe),w.push(ve),w.push(ze);u.sort(a),h.sort(a),p.sort(a),w.sort(a),this._weekdaysRegex=new RegExp("^("+w.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+p.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function Hd(){return this.hours()%12||12}function mk(){return this.hours()||24}X("H",["HH",2],0,"hour"),X("h",["hh",2],0,Hd),X("k",["kk",2],0,mk),X("hmm",0,0,function(){return""+Hd.apply(this)+Q(this.minutes(),2)}),X("hmmss",0,0,function(){return""+Hd.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),X("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),X("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)});function fg(a,u){X(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}fg("a",!0),fg("A",!1),Dt("hour","h"),mt("hour",13);function hg(a,u){return u._meridiemParse}K("a",hg),K("A",hg),K("H",se),K("h",se),K("k",se),K("HH",se,ie),K("hh",se,ie),K("kk",se,ie),K("hmm",_t),K("hmmss",ut),K("Hmm",_t),K("Hmmss",ut),me(["H","HH"],wt),me(["k","kk"],function(a,u,h){var p=ge(a);u[wt]=p===24?0:p}),me(["a","A"],function(a,u,h){h._isPm=h._locale.isPM(a),h._meridiem=a}),me(["h","hh"],function(a,u,h){u[wt]=ge(a),O(h).bigHour=!0}),me("hmm",function(a,u,h){var p=a.length-2;u[wt]=ge(a.substr(0,p)),u[$r]=ge(a.substr(p)),O(h).bigHour=!0}),me("hmmss",function(a,u,h){var p=a.length-4,w=a.length-2;u[wt]=ge(a.substr(0,p)),u[$r]=ge(a.substr(p,2)),u[Sn]=ge(a.substr(w)),O(h).bigHour=!0}),me("Hmm",function(a,u,h){var p=a.length-2;u[wt]=ge(a.substr(0,p)),u[$r]=ge(a.substr(p))}),me("Hmmss",function(a,u,h){var p=a.length-4,w=a.length-2;u[wt]=ge(a.substr(0,p)),u[$r]=ge(a.substr(p,2)),u[Sn]=ge(a.substr(w))});function pk(a){return(a+"").toLowerCase().charAt(0)==="p"}var gk=/[ap]\.?m?\.?/i,vk=L("Hours",!0);function yk(a,u,h){return a>11?h?"pm":"PM":h?"am":"AM"}var mg={calendar:W,longDateFormat:cr,invalidDate:Sr,ordinal:Ma,dayOfMonthOrdinalParse:ja,relativeTime:ei,months:Mb,monthsShort:ig,week:Ub,weekdays:Zb,weekdaysMin:Jb,weekdaysShort:dg,meridiemParse:gk},Qe={},Ya={},Ha;function _k(a,u){var h,p=Math.min(a.length,u.length);for(h=0;h0;){if(w=_l(E.slice(0,h).join("-")),w)return w;if(p&&p.length>=h&&_k(E,p)>=h-1)break;h--}u++}return Ha}function xk(a){return a.match("^[^/\\\\]*$")!=null}function _l(a){var u=null,h;if(Qe[a]===void 0&&e&&e.exports&&xk(a))try{u=Ha._abbr,h=ab,h("./locale/"+a),ii(u)}catch{Qe[a]=null}return Qe[a]}function ii(a,u){var h;return a&&(f(u)?h=kn(a):h=Vd(a,u),h?Ha=h:typeof console<"u"&&console.warn&&console.warn("Locale "+a+" not found. Did you forget to load it?")),Ha._abbr}function Vd(a,u){if(u!==null){var h,p=mg;if(u.abbr=a,Qe[a]!=null)te("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=Qe[a]._config;else if(u.parentLocale!=null)if(Qe[u.parentLocale]!=null)p=Qe[u.parentLocale]._config;else if(h=_l(u.parentLocale),h!=null)p=h._config;else return Ya[u.parentLocale]||(Ya[u.parentLocale]=[]),Ya[u.parentLocale].push({name:a,config:u}),null;return Qe[a]=new Ne(Ee(p,u)),Ya[a]&&Ya[a].forEach(function(w){Vd(w.name,w.config)}),ii(a),Qe[a]}else return delete Qe[a],null}function Sk(a,u){if(u!=null){var h,p,w=mg;Qe[a]!=null&&Qe[a].parentLocale!=null?Qe[a].set(Ee(Qe[a]._config,u)):(p=_l(a),p!=null&&(w=p._config),u=Ee(w,u),p==null&&(u.abbr=a),h=new Ne(u),h.parentLocale=Qe[a],Qe[a]=h),ii(a)}else Qe[a]!=null&&(Qe[a].parentLocale!=null?(Qe[a]=Qe[a].parentLocale,a===ii()&&ii(a)):Qe[a]!=null&&delete Qe[a]);return Qe[a]}function kn(a){var u;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Ha;if(!o(a)){if(u=_l(a),u)return u;a=[a]}return wk(a)}function bk(){return ht(Qe)}function Fd(a){var u,h=a._a;return h&&O(a).overflow===-2&&(u=h[xn]<0||h[xn]>11?xn:h[tn]<1||h[tn]>vl(h[Ot],h[xn])?tn:h[wt]<0||h[wt]>24||h[wt]===24&&(h[$r]!==0||h[Sn]!==0||h[zi]!==0)?wt:h[$r]<0||h[$r]>59?$r:h[Sn]<0||h[Sn]>59?Sn:h[zi]<0||h[zi]>999?zi:-1,O(a)._overflowDayOfYear&&(utn)&&(u=tn),O(a)._overflowWeeks&&u===-1&&(u=Tb),O(a)._overflowWeekday&&u===-1&&(u=Rb),O(a).overflow=u),a}var kk=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Dk=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ck=/Z|[+-]\d\d(?::?\d\d)?/,wl=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Wd=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ok=/^\/?Date\((-?\d+)/i,Ek=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Tk={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function gg(a){var u,h,p=a._i,w=kk.exec(p)||Dk.exec(p),E,I,oe,ve,ze=wl.length,Kt=Wd.length;if(w){for(O(a).iso=!0,u=0,h=ze;uAa(I)||a._dayOfYear===0)&&(O(a)._overflowDayOfYear=!0),h=Na(I,0,a._dayOfYear),a._a[xn]=h.getUTCMonth(),a._a[tn]=h.getUTCDate()),u=0;u<3&&a._a[u]==null;++u)a._a[u]=p[u]=w[u];for(;u<7;u++)a._a[u]=p[u]=a._a[u]==null?u===2?1:0:a._a[u];a._a[wt]===24&&a._a[$r]===0&&a._a[Sn]===0&&a._a[zi]===0&&(a._nextDay=!0,a._a[wt]=0),a._d=(a._useUTC?Na:Fb).apply(null,p),E=a._useUTC?a._d.getUTCDay():a._d.getDay(),a._tzm!=null&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[wt]=24),a._w&&typeof a._w.d<"u"&&a._w.d!==E&&(O(a).weekdayMismatch=!0)}}function Ak(a){var u,h,p,w,E,I,oe,ve,ze;u=a._w,u.GG!=null||u.W!=null||u.E!=null?(E=1,I=4,h=wo(u.GG,a._a[Ot],za(We(),1,4).year),p=wo(u.W,1),w=wo(u.E,1),(w<1||w>7)&&(ve=!0)):(E=a._locale._week.dow,I=a._locale._week.doy,ze=za(We(),E,I),h=wo(u.gg,a._a[Ot],ze.year),p=wo(u.w,ze.week),u.d!=null?(w=u.d,(w<0||w>6)&&(ve=!0)):u.e!=null?(w=u.e+E,(u.e<0||u.e>6)&&(ve=!0)):w=E),p<1||p>bn(h,E,I)?O(a)._overflowWeeks=!0:ve!=null?O(a)._overflowWeekday=!0:(oe=cg(h,p,w,E,I),a._a[Ot]=oe.year,a._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function Bd(a){if(a._f===n.ISO_8601){gg(a);return}if(a._f===n.RFC_2822){vg(a);return}a._a=[],O(a).empty=!0;var u=""+a._i,h,p,w,E,I,oe=u.length,ve=0,ze,Kt;for(w=Ir(a._f,a._locale).match(ce)||[],Kt=w.length,h=0;h0&&O(a).unusedInput.push(I),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Ve[E]?(p?O(a).empty=!1:O(a).unusedTokens.push(E),gl(E,p,a)):a._strict&&!p&&O(a).unusedTokens.push(E);O(a).charsLeftOver=oe-ve,u.length>0&&O(a).unusedInput.push(u),a._a[wt]<=12&&O(a).bigHour===!0&&a._a[wt]>0&&(O(a).bigHour=void 0),O(a).parsedDateParts=a._a.slice(0),O(a).meridiem=a._meridiem,a._a[wt]=Nk(a._locale,a._a[wt],a._meridiem),ze=O(a).era,ze!==null&&(a._a[Ot]=a._locale.erasConvertYear(ze,a._a[Ot])),Ud(a),Fd(a)}function Nk(a,u,h){var p;return h==null?u:a.meridiemHour!=null?a.meridiemHour(u,h):(a.isPM!=null&&(p=a.isPM(h),p&&u<12&&(u+=12),!p&&u===12&&(u=0)),u)}function zk(a){var u,h,p,w,E,I,oe=!1,ve=a._f.length;if(ve===0){O(a).invalidFormat=!0,a._d=new Date(NaN);return}for(w=0;wthis?this:a:S()});function wg(a,u){var h,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return We();for(h=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function aD(){if(!f(this._isDSTShifted))return this._isDSTShifted;var a={},u;return P(a,this),a=yg(a),a._a?(u=a._isUTC?k(a._a):We(a._a),this._isDSTShifted=this.isValid()&&qk(a._a,u.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function sD(){return this.isValid()?!this._isUTC:!1}function lD(){return this.isValid()?this._isUTC:!1}function Sg(){return this.isValid()?this._isUTC&&this._offset===0:!1}var uD=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,cD=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Ar(a,u){var h=a,p=null,w,E,I;return Sl(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:g(a)||!isNaN(+a)?(h={},u?h[u]=+a:h.milliseconds=+a):(p=uD.exec(a))?(w=p[1]==="-"?-1:1,h={y:0,d:ge(p[tn])*w,h:ge(p[wt])*w,m:ge(p[$r])*w,s:ge(p[Sn])*w,ms:ge(Gd(p[zi]*1e3))*w}):(p=cD.exec(a))?(w=p[1]==="-"?-1:1,h={y:Yi(p[2],w),M:Yi(p[3],w),w:Yi(p[4],w),d:Yi(p[5],w),h:Yi(p[6],w),m:Yi(p[7],w),s:Yi(p[8],w)}):h==null?h={}:typeof h=="object"&&("from"in h||"to"in h)&&(I=dD(We(h.from),We(h.to)),h={},h.ms=I.milliseconds,h.M=I.months),E=new xl(h),Sl(a)&&l(a,"_locale")&&(E._locale=a._locale),Sl(a)&&l(a,"_isValid")&&(E._isValid=a._isValid),E}Ar.fn=xl.prototype,Ar.invalid=Qk;function Yi(a,u){var h=a&&parseFloat(a.replace(",","."));return(isNaN(h)?0:h)*u}function bg(a,u){var h={};return h.months=u.month()-a.month()+(u.year()-a.year())*12,a.clone().add(h.months,"M").isAfter(u)&&--h.months,h.milliseconds=+u-+a.clone().add(h.months,"M"),h}function dD(a,u){var h;return a.isValid()&&u.isValid()?(u=Kd(u,a),a.isBefore(u)?h=bg(a,u):(h=bg(u,a),h.milliseconds=-h.milliseconds,h.months=-h.months),h):{milliseconds:0,months:0}}function kg(a,u){return function(h,p){var w,E;return p!==null&&!isNaN(+p)&&(te(u,"moment()."+u+"(period, number) is deprecated. Please use moment()."+u+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),E=h,h=p,p=E),w=Ar(h,p),Dg(this,w,a),this}}function Dg(a,u,h,p){var w=u._milliseconds,E=Gd(u._days),I=Gd(u._months);a.isValid()&&(p=p??!0,I&&ag(a,$(a,"Month")+I*h),E&&Y(a,"Date",$(a,"Date")+E*h),w&&a._d.setTime(a._d.valueOf()+w*h),p&&n.updateOffset(a,E||I))}var fD=kg(1,"add"),hD=kg(-1,"subtract");function Cg(a){return typeof a=="string"||a instanceof String}function mD(a){return M(a)||v(a)||Cg(a)||g(a)||gD(a)||pD(a)||a===null||a===void 0}function pD(a){var u=s(a)&&!c(a),h=!1,p=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],w,E,I=p.length;for(w=0;wh.valueOf():h.valueOf()9999?Lr(h,u?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):G(Date.prototype.toISOString)?u?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Lr(h,"Z")):Lr(h,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function RD(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",u="",h,p,w,E;return this.isLocal()||(a=this.utcOffset()===0?"moment.utc":"moment.parseZone",u="Z"),h="["+a+'("]',p=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",w="-MM-DD[T]HH:mm:ss.SSS",E=u+'[")]',this.format(h+p+w+E)}function PD(a){a||(a=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var u=Lr(this,a);return this.localeData().postformat(u)}function MD(a,u){return this.isValid()&&(M(a)&&a.isValid()||We(a).isValid())?Ar({to:this,from:a}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function jD(a){return this.from(We(),a)}function LD(a,u){return this.isValid()&&(M(a)&&a.isValid()||We(a).isValid())?Ar({from:this,to:a}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function ID(a){return this.to(We(),a)}function Og(a){var u;return a===void 0?this._locale._abbr:(u=kn(a),u!=null&&(this._locale=u),this)}var Eg=z("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return a===void 0?this.localeData():this.locale(a)});function Tg(){return this._locale}var kl=1e3,xo=60*kl,Dl=60*xo,Rg=(365*400+97)*24*Dl;function So(a,u){return(a%u+u)%u}function Pg(a,u,h){return a<100&&a>=0?new Date(a+400,u,h)-Rg:new Date(a,u,h).valueOf()}function Mg(a,u,h){return a<100&&a>=0?Date.UTC(a+400,u,h)-Rg:Date.UTC(a,u,h)}function $D(a){var u,h;if(a=Ct(a),a===void 0||a==="millisecond"||!this.isValid())return this;switch(h=this._isUTC?Mg:Pg,a){case"year":u=h(this.year(),0,1);break;case"quarter":u=h(this.year(),this.month()-this.month()%3,1);break;case"month":u=h(this.year(),this.month(),1);break;case"week":u=h(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":u=h(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":u=h(this.year(),this.month(),this.date());break;case"hour":u=this._d.valueOf(),u-=So(u+(this._isUTC?0:this.utcOffset()*xo),Dl);break;case"minute":u=this._d.valueOf(),u-=So(u,xo);break;case"second":u=this._d.valueOf(),u-=So(u,kl);break}return this._d.setTime(u),n.updateOffset(this,!0),this}function AD(a){var u,h;if(a=Ct(a),a===void 0||a==="millisecond"||!this.isValid())return this;switch(h=this._isUTC?Mg:Pg,a){case"year":u=h(this.year()+1,0,1)-1;break;case"quarter":u=h(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":u=h(this.year(),this.month()+1,1)-1;break;case"week":u=h(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":u=h(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":u=h(this.year(),this.month(),this.date()+1)-1;break;case"hour":u=this._d.valueOf(),u+=Dl-So(u+(this._isUTC?0:this.utcOffset()*xo),Dl)-1;break;case"minute":u=this._d.valueOf(),u+=xo-So(u,xo)-1;break;case"second":u=this._d.valueOf(),u+=kl-So(u,kl)-1;break}return this._d.setTime(u),n.updateOffset(this,!0),this}function ND(){return this._d.valueOf()-(this._offset||0)*6e4}function zD(){return Math.floor(this.valueOf()/1e3)}function YD(){return new Date(this.valueOf())}function HD(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function VD(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function FD(){return this.isValid()?this.toISOString():null}function WD(){return _(this)}function UD(){return b({},O(this))}function BD(){return O(this).overflow}function GD(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}X("N",0,0,"eraAbbr"),X("NN",0,0,"eraAbbr"),X("NNN",0,0,"eraAbbr"),X("NNNN",0,0,"eraName"),X("NNNNN",0,0,"eraNarrow"),X("y",["y",1],"yo","eraYear"),X("y",["yy",2],0,"eraYear"),X("y",["yyy",3],0,"eraYear"),X("y",["yyyy",4],0,"eraYear"),K("N",qd),K("NN",qd),K("NNN",qd),K("NNNN",iC),K("NNNNN",oC),me(["N","NN","NNN","NNNN","NNNNN"],function(a,u,h,p){var w=h._locale.erasParse(a,p,h._strict);w?O(h).era=w:O(h).invalidEra=a}),K("y",Jr),K("yy",Jr),K("yyy",Jr),K("yyyy",Jr),K("yo",aC),me(["y","yy","yyy","yyyy"],Ot),me(["yo"],function(a,u,h,p){var w;h._locale._eraYearOrdinalRegex&&(w=a.match(h._locale._eraYearOrdinalRegex)),h._locale.eraYearOrdinalParse?u[Ot]=h._locale.eraYearOrdinalParse(a,w):u[Ot]=parseInt(a,10)});function XD(a,u){var h,p,w,E=this._eras||kn("en")._eras;for(h=0,p=E.length;h=0)return E[p]}function QD(a,u){var h=a.since<=a.until?1:-1;return u===void 0?n(a.since).year():n(a.since).year()+(u-a.offset)*h}function qD(){var a,u,h,p=this.localeData().eras();for(a=0,u=p.length;aE&&(u=E),hC.call(this,a,u,h,p,w))}function hC(a,u,h,p,w){var E=cg(a,u,h,p,w),I=Na(E.year,0,E.dayOfYear);return this.year(I.getUTCFullYear()),this.month(I.getUTCMonth()),this.date(I.getUTCDate()),this}X("Q",0,"Qo","quarter"),Dt("quarter","Q"),mt("quarter",7),K("Q",fe),me("Q",function(a,u){u[xn]=(ge(a)-1)*3});function mC(a){return a==null?Math.ceil((this.month()+1)/3):this.month((a-1)*3+this.month()%3)}X("D",["DD",2],"Do","date"),Dt("date","D"),mt("date",9),K("D",se),K("DD",se,ie),K("Do",function(a,u){return a?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),me(["D","DD"],tn),me("Do",function(a,u){u[tn]=ge(a.match(se)[0])});var Lg=L("Date",!0);X("DDD",["DDDD",3],"DDDo","dayOfYear"),Dt("dayOfYear","DDD"),mt("dayOfYear",4),K("DDD",tt),K("DDDD",ue),me(["DDD","DDDD"],function(a,u,h){h._dayOfYear=ge(a)});function pC(a){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return a==null?u:this.add(a-u,"d")}X("m",["mm",2],0,"minute"),Dt("minute","m"),mt("minute",14),K("m",se),K("mm",se,ie),me(["m","mm"],$r);var gC=L("Minutes",!1);X("s",["ss",2],0,"second"),Dt("second","s"),mt("second",15),K("s",se),K("ss",se,ie),me(["s","ss"],Sn);var vC=L("Seconds",!1);X("S",0,0,function(){return~~(this.millisecond()/100)}),X(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),X(0,["SSS",3],0,"millisecond"),X(0,["SSSS",4],0,function(){return this.millisecond()*10}),X(0,["SSSSS",5],0,function(){return this.millisecond()*100}),X(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),X(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),X(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),X(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),Dt("millisecond","ms"),mt("millisecond",16),K("S",tt,fe),K("SS",tt,ie),K("SSS",tt,ue);var oi,Ig;for(oi="SSSS";oi.length<=9;oi+="S")K(oi,Jr);function yC(a,u){u[zi]=ge(("0."+a)*1e3)}for(oi="S";oi.length<=9;oi+="S")me(oi,yC);Ig=L("Milliseconds",!1),X("z",0,0,"zoneAbbr"),X("zz",0,0,"zoneName");function _C(){return this._isUTC?"UTC":""}function wC(){return this._isUTC?"Coordinated Universal Time":""}var V=j.prototype;V.add=fD,V.calendar=_D,V.clone=wD,V.diff=OD,V.endOf=AD,V.format=PD,V.from=MD,V.fromNow=jD,V.to=LD,V.toNow=ID,V.get=J,V.invalidAt=BD,V.isAfter=xD,V.isBefore=SD,V.isBetween=bD,V.isSame=kD,V.isSameOrAfter=DD,V.isSameOrBefore=CD,V.isValid=WD,V.lang=Eg,V.locale=Og,V.localeData=Tg,V.max=Wk,V.min=Fk,V.parsingFlags=UD,V.set=re,V.startOf=$D,V.subtract=hD,V.toArray=HD,V.toObject=VD,V.toDate=YD,V.toISOString=TD,V.inspect=RD,typeof Symbol<"u"&&Symbol.for!=null&&(V[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),V.toJSON=FD,V.toString=ED,V.unix=zD,V.valueOf=ND,V.creationData=GD,V.eraName=qD,V.eraNarrow=ZD,V.eraAbbr=JD,V.eraYear=eC,V.year=ug,V.isLeapYear=Vb,V.weekYear=sC,V.isoWeekYear=lC,V.quarter=V.quarters=mC,V.month=sg,V.daysInMonth=zb,V.week=V.weeks=Xb,V.isoWeek=V.isoWeeks=Kb,V.weeksInYear=dC,V.weeksInWeekYear=fC,V.isoWeeksInYear=uC,V.isoWeeksInISOWeekYear=cC,V.date=Lg,V.day=V.days=lk,V.weekday=uk,V.isoWeekday=ck,V.dayOfYear=pC,V.hour=V.hours=vk,V.minute=V.minutes=gC,V.second=V.seconds=vC,V.millisecond=V.milliseconds=Ig,V.utcOffset=Jk,V.utc=tD,V.local=rD,V.parseZone=nD,V.hasAlignedHourOffset=iD,V.isDST=oD,V.isLocal=sD,V.isUtcOffset=lD,V.isUtc=Sg,V.isUTC=Sg,V.zoneAbbr=_C,V.zoneName=wC,V.dates=z("dates accessor is deprecated. Use date instead.",Lg),V.months=z("months accessor is deprecated. Use month instead",sg),V.years=z("years accessor is deprecated. Use year instead",ug),V.zone=z("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",eD),V.isDSTShifted=z("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",aD);function xC(a){return We(a*1e3)}function SC(){return We.apply(null,arguments).parseZone()}function $g(a){return a}var Te=Ne.prototype;Te.calendar=le,Te.longDateFormat=Ai,Te.invalidDate=dr,Te.ordinal=La,Te.preparse=$g,Te.postformat=$g,Te.relativeTime=ml,Te.pastFuture=pl,Te.set=lt,Te.eras=XD,Te.erasParse=KD,Te.erasConvertYear=QD,Te.erasAbbrRegex=rC,Te.erasNameRegex=tC,Te.erasNarrowRegex=nC,Te.months=Ib,Te.monthsShort=$b,Te.monthsParse=Nb,Te.monthsRegex=Hb,Te.monthsShortRegex=Yb,Te.week=Wb,Te.firstDayOfYear=Gb,Te.firstDayOfWeek=Bb,Te.weekdays=nk,Te.weekdaysMin=ok,Te.weekdaysShort=ik,Te.weekdaysParse=sk,Te.weekdaysRegex=dk,Te.weekdaysShortRegex=fk,Te.weekdaysMinRegex=hk,Te.isPM=pk,Te.meridiem=yk;function Ol(a,u,h,p){var w=kn(),E=k().set(p,u);return w[h](E,a)}function Ag(a,u,h){if(g(a)&&(u=a,a=void 0),a=a||"",u!=null)return Ol(a,u,h,"month");var p,w=[];for(p=0;p<12;p++)w[p]=Ol(a,p,h,"month");return w}function Jd(a,u,h,p){typeof a=="boolean"?(g(u)&&(h=u,u=void 0),u=u||""):(u=a,h=u,a=!1,g(u)&&(h=u,u=void 0),u=u||"");var w=kn(),E=a?w._week.dow:0,I,oe=[];if(h!=null)return Ol(u,(h+E)%7,p,"day");for(I=0;I<7;I++)oe[I]=Ol(u,(I+E)%7,p,"day");return oe}function bC(a,u){return Ag(a,u,"months")}function kC(a,u){return Ag(a,u,"monthsShort")}function DC(a,u,h){return Jd(a,u,h,"weekdays")}function CC(a,u,h){return Jd(a,u,h,"weekdaysShort")}function OC(a,u,h){return Jd(a,u,h,"weekdaysMin")}ii("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var u=a%10,h=ge(a%100/10)===1?"th":u===1?"st":u===2?"nd":u===3?"rd":"th";return a+h}}),n.lang=z("moment.lang is deprecated. Use moment.locale instead.",ii),n.langData=z("moment.langData is deprecated. Use moment.localeData instead.",kn);var Dn=Math.abs;function EC(){var a=this._data;return this._milliseconds=Dn(this._milliseconds),this._days=Dn(this._days),this._months=Dn(this._months),a.milliseconds=Dn(a.milliseconds),a.seconds=Dn(a.seconds),a.minutes=Dn(a.minutes),a.hours=Dn(a.hours),a.months=Dn(a.months),a.years=Dn(a.years),this}function Ng(a,u,h,p){var w=Ar(u,h);return a._milliseconds+=p*w._milliseconds,a._days+=p*w._days,a._months+=p*w._months,a._bubble()}function TC(a,u){return Ng(this,a,u,1)}function RC(a,u){return Ng(this,a,u,-1)}function zg(a){return a<0?Math.floor(a):Math.ceil(a)}function PC(){var a=this._milliseconds,u=this._days,h=this._months,p=this._data,w,E,I,oe,ve;return a>=0&&u>=0&&h>=0||a<=0&&u<=0&&h<=0||(a+=zg(ef(h)+u)*864e5,u=0,h=0),p.milliseconds=a%1e3,w=Xt(a/1e3),p.seconds=w%60,E=Xt(w/60),p.minutes=E%60,I=Xt(E/60),p.hours=I%24,u+=Xt(I/24),ve=Xt(Yg(u)),h+=ve,u-=zg(ef(ve)),oe=Xt(h/12),h%=12,p.days=u,p.months=h,p.years=oe,this}function Yg(a){return a*4800/146097}function ef(a){return a*146097/4800}function MC(a){if(!this.isValid())return NaN;var u,h,p=this._milliseconds;if(a=Ct(a),a==="month"||a==="quarter"||a==="year")switch(u=this._days+p/864e5,h=this._months+Yg(u),a){case"month":return h;case"quarter":return h/3;case"year":return h/12}else switch(u=this._days+Math.round(ef(this._months)),a){case"week":return u/7+p/6048e5;case"day":return u+p/864e5;case"hour":return u*24+p/36e5;case"minute":return u*1440+p/6e4;case"second":return u*86400+p/1e3;case"millisecond":return Math.floor(u*864e5)+p;default:throw new Error("Unknown unit "+a)}}function jC(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+ge(this._months/12)*31536e6:NaN}function Cn(a){return function(){return this.as(a)}}var LC=Cn("ms"),IC=Cn("s"),$C=Cn("m"),AC=Cn("h"),NC=Cn("d"),zC=Cn("w"),YC=Cn("M"),HC=Cn("Q"),VC=Cn("y");function FC(){return Ar(this)}function WC(a){return a=Ct(a),this.isValid()?this[a+"s"]():NaN}function Hi(a){return function(){return this.isValid()?this._data[a]:NaN}}var UC=Hi("milliseconds"),BC=Hi("seconds"),GC=Hi("minutes"),XC=Hi("hours"),KC=Hi("days"),QC=Hi("months"),qC=Hi("years");function ZC(){return Xt(this.days()/7)}var On=Math.round,bo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function JC(a,u,h,p,w){return w.relativeTime(u||1,!!h,a,p)}function eO(a,u,h,p){var w=Ar(a).abs(),E=On(w.as("s")),I=On(w.as("m")),oe=On(w.as("h")),ve=On(w.as("d")),ze=On(w.as("M")),Kt=On(w.as("w")),En=On(w.as("y")),ai=E<=h.ss&&["s",E]||E0,ai[4]=p,JC.apply(null,ai)}function tO(a){return a===void 0?On:typeof a=="function"?(On=a,!0):!1}function rO(a,u){return bo[a]===void 0?!1:u===void 0?bo[a]:(bo[a]=u,a==="s"&&(bo.ss=u-1),!0)}function nO(a,u){if(!this.isValid())return this.localeData().invalidDate();var h=!1,p=bo,w,E;return typeof a=="object"&&(u=a,a=!1),typeof a=="boolean"&&(h=a),typeof u=="object"&&(p=Object.assign({},bo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),w=this.localeData(),E=eO(this,!h,p,w),h&&(E=w.pastFuture(+this,E)),w.postformat(E)}var tf=Math.abs;function ko(a){return(a>0)-(a<0)||+a}function El(){if(!this.isValid())return this.localeData().invalidDate();var a=tf(this._milliseconds)/1e3,u=tf(this._days),h=tf(this._months),p,w,E,I,oe=this.asSeconds(),ve,ze,Kt,En;return oe?(p=Xt(a/60),w=Xt(p/60),a%=60,p%=60,E=Xt(h/12),h%=12,I=a?a.toFixed(3).replace(/\.?0+$/,""):"",ve=oe<0?"-":"",ze=ko(this._months)!==ko(oe)?"-":"",Kt=ko(this._days)!==ko(oe)?"-":"",En=ko(this._milliseconds)!==ko(oe)?"-":"",ve+"P"+(E?ze+E+"Y":"")+(h?ze+h+"M":"")+(u?Kt+u+"D":"")+(w||p||a?"T":"")+(w?En+w+"H":"")+(p?En+p+"M":"")+(a?En+I+"S":"")):"P0D"}var De=xl.prototype;De.isValid=Kk,De.abs=EC,De.add=TC,De.subtract=RC,De.as=MC,De.asMilliseconds=LC,De.asSeconds=IC,De.asMinutes=$C,De.asHours=AC,De.asDays=NC,De.asWeeks=zC,De.asMonths=YC,De.asQuarters=HC,De.asYears=VC,De.valueOf=jC,De._bubble=PC,De.clone=FC,De.get=WC,De.milliseconds=UC,De.seconds=BC,De.minutes=GC,De.hours=XC,De.days=KC,De.weeks=ZC,De.months=QC,De.years=qC,De.humanize=nO,De.toISOString=El,De.toString=El,De.toJSON=El,De.locale=Og,De.localeData=Tg,De.toIsoString=z("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",El),De.lang=Eg,X("X",0,0,"unix"),X("x",0,0,"valueOf"),K("x",vn),K("X",$a),me("X",function(a,u,h){h._d=new Date(parseFloat(a)*1e3)}),me("x",function(a,u,h){h._d=new Date(ge(a))});//! moment.js diff --git a/zh-cn/assets/index-fa35d4ff.js b/zh-cn/assets/index-90047cd2.js similarity index 98% rename from zh-cn/assets/index-fa35d4ff.js rename to zh-cn/assets/index-90047cd2.js index b2c5c8f..28a7f70 100644 --- a/zh-cn/assets/index-fa35d4ff.js +++ b/zh-cn/assets/index-90047cd2.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png",i="/zh-cn/assets/image2-03115587.png",t="/zh-cn/assets/image3-8a8d1c33.png",a="/zh-cn/assets/image4-c1593056.png",p=[e,l,i,t,a],s={label:"Xline 源码解读(一) —— 初识 CURP 协议",description:"Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。",cover:"./cover.png",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-07-13",title:"Interpretation of Xline source code (1)——Introduction to CURP protocol"},n=[{label:"Xline 是什么",level:2},{label:"Xline 的整体架构",level:2},{label:"CURP 协议简介",level:2},{label:"CURP 是什么?",level:3},{label:"为什么选择 CURP 协议",level:3},{label:"fast path 与 slow path",level:3},{label:"Summary",level:2}],r=`

        封面

        +const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png",i="/zh-cn/assets/image2-03115587.png",t="/zh-cn/assets/image3-8a8d1c33.png",a="/zh-cn/assets/image4-c1593056.png",s=[e,l,i,t,a],p={label:"Xline 源码解读(一) —— 初识 CURP 协议",description:"Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。",cover:"./cover.png",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-07-13",title:"Interpretation of Xline source code (1)——Introduction to CURP protocol"},n=[{label:"Xline 是什么",level:2},{label:"Xline 的整体架构",level:2},{label:"CURP 协议简介",level:2},{label:"CURP 是什么?",level:3},{label:"为什么选择 CURP 协议",level:3},{label:"fast path 与 slow path",level:3},{label:"Summary",level:2}],r=`

        封面

        Xline 是什么

        Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的 meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。

        Xline 的整体架构

        @@ -77,4 +77,4 @@ b. follower 接收到请求后,由于 z = 9 与 witness 中的 z = 7 相冲突

        Xline 是一款提供跨数据中心强一致性的分布式 KV 存储,其核心问题之一便是如何在跨数据中心这种高延迟的广域网环境中提供高性能的强一致性保证。传统的分布式共识算法,如 Raft 和 Multi-Paxos,通过让所有操作都满足持久化存储和有序性前提来保证状态机一致性。而 CURP 协议则是对达成共识的场景做了更细粒度的划分,将协议分割成了前端(fast path)和后端(slow path),前端只保证了提案会被持久化到集群当中,而后端不仅保证了持久化,也保证了所有保存了该提案的节点会按照相同的顺序执行命令,保证了状态机的一致性。

        关于 CURP 协议的简介就到这里,更多的细节欢迎参考我们的其他文章和分享,如下:
        Curp 共识协议的重新思考

        -

        DatenLord | Xline Geo-distributed KV Storage

        `;export{p as assetURLs,r as default,s as metadata,n as toc}; +

        DatenLord | Xline Geo-distributed KV Storage

        `;export{s as assetURLs,r as default,p as metadata,n as toc}; diff --git a/zh-cn/assets/index-74772a81.js b/zh-cn/assets/index-9f27369d.js similarity index 99% rename from zh-cn/assets/index-74772a81.js rename to zh-cn/assets/index-9f27369d.js index 14210e5..7869e68 100644 --- a/zh-cn/assets/index-74772a81.js +++ b/zh-cn/assets/index-9f27369d.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",D="/zh-cn/assets/image16-2de227b5.png",m="/zh-cn/assets/image17-ecbf7b1e.png",S="/zh-cn/assets/image18-88f5d1b8.png",F="/zh-cn/assets/image19-5df924ff.png",R="/zh-cn/assets/image20-5dfde1d6.png",A="/zh-cn/assets/image21-90c388d7.png",T=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,D,m,S,F,R,A],b={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},u=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],C=`

        本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

        +const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",m="/zh-cn/assets/image16-2de227b5.png",D="/zh-cn/assets/image17-ecbf7b1e.png",S="/zh-cn/assets/image18-88f5d1b8.png",R="/zh-cn/assets/image19-5df924ff.png",F="/zh-cn/assets/image20-5dfde1d6.png",A="/zh-cn/assets/image21-90c388d7.png",T=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,m,D,S,R,F,A],b={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},u=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],L=`

        本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

        引言

        Poseidon 是一种全新的面向零知识证明(ZKP: Zero-Knowledge Proof)密码学协议设计的哈希算法。相比同类算法,包括经典的 SHA-256、SHA-3 以及 Pedersen 哈希函数,在零知识证明的应用场景下,Poseidon 能够显著地降低证明生成和验证的计算复杂度,极大地提升零知识证明系统整体的运行效率。基于上述优点,Poseidon 目前已被广泛应用在了各种区块链项目当中,包括去中心化存储系统 Filecoin、加密货币 Mina Protocol 和 Dusk Network 等,主要用于加速其中的零知识证明系统。

        0.1 Poseidon 与零知识证明

        @@ -210,9 +210,9 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

        在上述单元运算电路的基础上,实现高性能算法加速器的另一个关键在于设计一个高效的电路架构,即如何组织好每一个运算器,最大化每个单元的利用率

        由本文第二部分的介绍可知,TRIDENT 所加速的 Filecoin Poseidon 哈希实例的输入为个有限域元素,每个元素的位宽为 255 比特。具体的计算流程由

        RF 次 Full Round 循环和 RP 次 Partial Round 循环组成。两种循环的计算流程基本相似,都依次包括 AddRoundConstant、SBox 和 MDSMixing 三个阶段,在这三个阶段分别完成常数模加、五次方模幂和向量—矩阵乘法,两者唯一的区别在于 Partial Round 在 Sbox 阶段只需要完成中间状态第一个元素的计算。Full Round 和 Partial Round 每次循环/迭代的计算流程如下图(a)和(b)所示。如果将 Poseidon 哈希函数的所有循环都依次展开,可以将其看成是一条单向的数据流,在该数据流上不断地进行模加、模幂和矩阵运算。

        -

        图片

        -

        基于上述算法流程的定义,本次课题中实现的 Poseidon 加速器的具体硬件架构如下图所示。在 Poseidon 单次迭代的算法流程的基础上, 加速器的实现针对具体的 FPGA 架构特点和硬件资源限制做了如下几点优化:

        图片

        +

        基于上述算法流程的定义,本次课题中实现的 Poseidon 加速器的具体硬件架构如下图所示。在 Poseidon 单次迭代的算法流程的基础上, 加速器的实现针对具体的 FPGA 架构特点和硬件资源限制做了如下几点优化:

        +

        图片

        • 流水线处理:
        @@ -256,13 +256,13 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

        各项 FPGA 资源中 DSP Slices(70.01%)和 LUT(61.15%)的消耗最多, 主要用于 255-Bit Montgomery 模乘电路的实现上。这两项资源的不足也限制了在加速器中配置更多模乘器来提升计算并行度和整体的加速性能。

        在时序上,实现(Implementation)后 Poseidon 加速器刚好能够满足 100MHz 工作频率的要求。关键路径上,建立(set up)时间的余量为 0.069ns,保持(hold)时间的余量为 0.01ns。

        除了资源和时序外,FPGA 实现后的功耗信息如下图所示。由下图可见,在运行我们设计的加速器硬件时,FPGA 芯片的整体功耗在 24.7W 左右。而我们在性能测试中使用的 RTX 3070 GPU 加速卡的运行功耗在 120W 左右。

        -

        图片

        +

        图片

        ###  5.2 计算性能测试

        TRIDENT 项目中设计了两种方式测试 Poseidon 加速器的计算性能:

        1. C 语言程序测试结果:在 Xilinx 提供的 XDMA 驱动的基础上使用 C 语言编写简单的性能测试程序。该测试程序向 FPGA 加速器写入一定数量的输入数据,并记录加速器完成所有数据哈希运算所需要的时间。基于该测试程序,我们分别测试了 Poseidon 加速器在三种长度输入数据下的性能表现。当输入数据的大小为 arity2, 即中间状态向量元素个数 时,加速器在 0.877 秒内完成了 850000 次的哈希运算,数据吞吐率可达到 29.1651MB/s, 即每秒大约能够完成 1M 次哈希运算
        -

        图片

        +

        图片

        1. Lotus-Bench 测试结果:Lotus 中提供了计算机硬件在 Filecoin 计算负载下性能表现的基准测试程序 Lotus-Bench;与自己实现的 C 语言测试程序相比,Lotus-Bench 的测试更加接近实际的工作负载,能够得到更加准确的测试结果。在 Lotus-Bench 的基础上,我们分别测试了 CPU, GPU 和 FPGA 在 preCommit 阶段(该阶段主要完成 Poseidon 哈希函数的计算)处理 512MB 数据所需要的时间。FPGA 在 Lotus-Bench 测试下的算力可达到 15.65MB/s,大约是 AMD Ryzen 5900X CPU 实现的 2 倍,但和 RTX 3070 GPU 的加速性能相比仍有很大的提升空间.
        @@ -278,4 +278,4 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
      • 优化加速器架构:由于需要适配 Filecoin Poseidon 计算实例中不同大小的输入数据,目前在输入较小的情况下加速器中存在一些冗余的运算单元。通过进一步优化加速器的整体架构,使得在不同长度的输入数据下,所有运算单元都能得到更好的利用,能够进一步提升整体的加速性能。

      • -`;export{T as assetURLs,C as default,b as metadata,u as toc}; +`;export{T as assetURLs,L as default,b as metadata,u as toc}; diff --git a/zh-cn/assets/index-696ef44a.js b/zh-cn/assets/index-a154d453.js similarity index 98% rename from zh-cn/assets/index-696ef44a.js rename to zh-cn/assets/index-a154d453.js index cc57ed1..0e9d7ef 100644 --- a/zh-cn/assets/index-696ef44a.js +++ b/zh-cn/assets/index-a154d453.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办",description:"作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.png",location:"中国香港",date:"2023-09-07",title:"The 2nd Hardware Agile Development and Methodology Workshop l 2023 RISC V China Summit Concurrent Events Successfully Held"},l=[{label:"Part.1",level:2},{label:"Part.2",level:2},{label:"Part.3",level:2},{label:"Part.4",level:2},{label:"Part.5",level:2},{label:"Part.6",level:2},{label:"结束语",level:2}],r=`

        图片

        +const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办",description:"作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.png",location:"中国香港",date:"2023-09-07",title:"The 2nd Hardware Agile Development and Methodology Workshop l 2023 RISC V China Summit Concurrent Events Successfully Held"},l=[{label:"Part.1",level:2},{label:"Part.2",level:2},{label:"Part.3",level:2},{label:"Part.4",level:2},{label:"Part.5",level:2},{label:"Part.6",level:2},{label:"结束语",level:2}],p=`

        图片

        作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨会。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。

        Part.1

        《RISC-V敏捷硬件开发-软件定义芯片》

        @@ -19,4 +19,4 @@ const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷

        《MetaHVL硬件敏捷验证与协同仿真》

        华南理工大学计算机学院副教授赖晓铮的分享主题是《MetaHVL硬件敏捷验证与协同仿真》。赖老师从芯片设计的规模和芯片设计的成本是不成比例(规模是线性提升,成本是指数提升)的现状出发,提出硬件设计的流程有更敏捷的需求。而敏捷是包含设计和验证两个维度的全流程敏捷。他分享了运用创新EDA方法学和工具以进一步分离设计与实现;此外,提高设计抽象层次的同时,也需要提高验证的抽象层次。赖老师介绍了他在Meta-HVL项目研究的中期结论,即小规模设计的加速比明显,规模越大,DUT运行时间占比越大,则验证加速起到的作用越小。因此,时间应该花在提高验证的效率上,而不是把时间和资源花在加速验证代码的运行上。

        结束语

        -

        如何提升数字芯片的开发和验证效率一直是业界关注的焦点。新一代HDL打开了全新的数字芯片敏捷设计和验证的方法学大门。在本次研讨会上,业界和学界的各位专家分享了他们在各自领域的硬件敏捷开发与验证实践经验,希望这些前沿的探索可以为关注该领域的学习者和实践者提供一次深入探讨和交流的机会,以此进一步促进硬件敏捷开发与验证方法学的发展与落地。

        `;export{e as assetURLs,r as default,a as metadata,l as toc}; +

        如何提升数字芯片的开发和验证效率一直是业界关注的焦点。新一代HDL打开了全新的数字芯片敏捷设计和验证的方法学大门。在本次研讨会上,业界和学界的各位专家分享了他们在各自领域的硬件敏捷开发与验证实践经验,希望这些前沿的探索可以为关注该领域的学习者和实践者提供一次深入探讨和交流的机会,以此进一步促进硬件敏捷开发与验证方法学的发展与落地。

        `;export{e as assetURLs,p as default,a as metadata,l as toc}; diff --git a/zh-cn/assets/index-b503fc36.js b/zh-cn/assets/index-a6eb2af0.js similarity index 98% rename from zh-cn/assets/index-b503fc36.js rename to zh-cn/assets/index-a6eb2af0.js index f49e372..f8b2dc7 100644 --- a/zh-cn/assets/index-b503fc36.js +++ b/zh-cn/assets/index-a6eb2af0.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",t="/zh-cn/assets/image3-204919ac.png",l="/zh-cn/assets/image4-e50f112d.png",p="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,t,l,p],o={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},n=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

        数据库隔离级别介绍

        +const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",l="/zh-cn/assets/image3-204919ac.png",t="/zh-cn/assets/image4-e50f112d.png",p="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,l,t,p],o={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},n=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

        数据库隔离级别介绍

        数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:

        Table 1:

        图片

        @@ -8,12 +8,12 @@ const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png

        图片

        在 Read uncommitted 的隔离级别中,多个同时执行的事务是能够互相看到互相没有 commit 的写操作,因此可以认为这种隔离级别几乎没有作用。在上述例子中,Operation 2 读到的内容是 “AA”,Operation 4 读到的内容则是“DD”,即使第二个事务最终 Rollback 了。Read committed 有两个事务同时被执行,自上而下是执行顺序。

        Table 3:

        -

        图片

        +

        图片

        在 Read committed 的隔离级别中,只有被 Commit 后的结果可以被看到,因此在 Table 2 的执行顺序中,Operation 2 和 4 都能够读取到 “AA” 的值,即 Key 1 的值没有改变。如果按照 Table 3 中的情况执行两个事务,Operation 2 读到的值为 “AA”,Operation 5 读到的值为 “DD”,因为此时事务 2 已经执行成功。

        Repeatable read

        如果在 Table 3 中的事务 1 两次连续读操作,用户想要保证读到相同的值,那就需要使用 repeatable read 隔离级别。在这个隔离级别中,在同一个事务中对同一条数据的多次读取保证会得到相同的值,即使这个过程中该数据被其他已经提交的事务修改掉。当然该隔离级别也有一些情况无法保证隔离性,比如下列情况:

        Table 4:

        -

        图片

        +

        图片

        在 repeatable read 的隔离级别下,Operation 2 的返回结果是 ["CC"] —— 只有 Key 3 的值被返回了,但是 Operation 5 的返回值是 ["CC", "DD"]。总结一下,repeatable read 的隔离级别仍然无法很好处理涉及多条数据的情况,特别是当有新的数据插入或者删除的情况。

        Serializable

        最严格的隔离级别叫做 Serializable,这个级别的定义也是最清晰明了的,在这种隔离级别下的执行结果,就“仿佛”是将所有事务串行起来一条一条执行的结果。上面这句话中值得强调的是 “仿佛” 二字,为了提高性能,几乎没有数据库是采用真正物理意义上的串行执行来保证 Serializable 的,仅仅达到类似效果即可,实现的方法是可以多种多样的。在 Serializable 级别下还有一个细致的分类,叫做 Snapshot,该分类与 Serializable 类似但约束能力上稍弱。正是因为 Snapshot 在约束上的放松,使得其实现起来具有更好的性能,也是绝大多数数据库默认支持的隔离级别。下面我们就来说说 Snapshot,以及引申出来的 MVCC 实现方法。

        diff --git a/zh-cn/assets/index-725430e4.js b/zh-cn/assets/index-b28a4a39.js similarity index 99% rename from zh-cn/assets/index-725430e4.js rename to zh-cn/assets/index-b28a4a39.js index 4c486f2..90016c3 100644 --- a/zh-cn/assets/index-725430e4.js +++ b/zh-cn/assets/index-b28a4a39.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",d="/zh-cn/assets/image11-c5d501bb.png",h="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",y="/zh-cn/assets/image19-fb1e5167.png",S="/zh-cn/assets/image20-a391e7d8.jpg",_=[e,l,s,i,a,t,p,n,o,c,r,d,h,m,u,b,g,f,R,y,S],v={label:"计算机体系结构|MIT6.175和MIT6.375学习笔记",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了MIT6.175和MIT6.375的关键内容以及Lab实践的学习笔记。",cover:"./cover.png",location:"中国香港",author:["kazutoiris"],tags:["硬件加速"],date:"2023-05-17",title:"Computer Architecture|MIT6.175 and MIT6.375 Study Notes"},C=[{label:"MIT 6.175",level:2},{label:"环境搭建",level:3},{label:"四种 FIFO (Lab 4)",level:3},{label:"Ready 和 Valid 握手",level:3},{label:"EHR 寄存器 (Lab4)",level:3},{label:"RISC-V (Lab5)",level:3},{label:"Branch Prediction (Lab6)",level:3},{label:"DDR3 Memory (Lab7)",level:3},{label:"Cache Coherence (Project)",level:3},{label:"MIT 6.375",level:2},{label:"Bluespec 中的一些特性",level:3},{label:"CORDIC 算法",level:3},{label:"一些常用的概念",level:2},{label:"Setup Time 、Hold Time 和 Clock-to-Q Time",level:3},{label:"SRAM",level:3},{label:"DRAM",level:3},{label:"References",level:2}],M=`

        图片

        +const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",d="/zh-cn/assets/image11-c5d501bb.png",h="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",y="/zh-cn/assets/image19-fb1e5167.png",S="/zh-cn/assets/image20-a391e7d8.jpg",_=[e,l,s,i,a,t,p,n,o,c,r,d,h,m,u,b,g,f,R,y,S],v={label:"计算机体系结构|MIT6.175和MIT6.375学习笔记",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了MIT6.175和MIT6.375的关键内容以及Lab实践的学习笔记。",cover:"./cover.png",location:"中国香港",author:["kazutoiris"],tags:["硬件加速"],date:"2023-05-17",title:"Computer Architecture|MIT6.175 and MIT6.375 Study Notes"},F=[{label:"MIT 6.175",level:2},{label:"环境搭建",level:3},{label:"四种 FIFO (Lab 4)",level:3},{label:"Ready 和 Valid 握手",level:3},{label:"EHR 寄存器 (Lab4)",level:3},{label:"RISC-V (Lab5)",level:3},{label:"Branch Prediction (Lab6)",level:3},{label:"DDR3 Memory (Lab7)",level:3},{label:"Cache Coherence (Project)",level:3},{label:"MIT 6.375",level:2},{label:"Bluespec 中的一些特性",level:3},{label:"CORDIC 算法",level:3},{label:"一些常用的概念",level:2},{label:"Setup Time 、Hold Time 和 Clock-to-Q Time",level:3},{label:"SRAM",level:3},{label:"DRAM",level:3},{label:"References",level:2}],M=`

        图片

        在 2023 年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了 MIT6.175 和 MIT6.375 的关键内容以及 Lab 实践的学习笔记

        6.175 和 6.375 的课程和 Lab 学习都有一定的难度,要求采用 Bluespec 语言实现 RISC-V 处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab 环节还涉及软硬件联合开发,要求基于所实现的 RISC-V 处理器运行真实的 RISC-V 程序,并给出性能评估。希望第一期学员(GitHub:kazutoiris )的学习笔记对想从事数字芯片设计的工程师有所帮助。

        MIT 6.175

        @@ -380,4 +380,4 @@ All the images in this section are cited from [宇芯电子].


        达坦科技硬件设计学习社区持续开放,点击原文了解社区学习详情。若想询问加入细节,请添加下方小助手微信号或info@datenlord.com

        -

        图片

        `;export{_ as assetURLs,M as default,v as metadata,C as toc}; +

        图片

        `;export{_ as assetURLs,M as default,v as metadata,F as toc}; diff --git a/zh-cn/assets/index-a920aedb.js b/zh-cn/assets/index-b28c82c1.js similarity index 98% rename from zh-cn/assets/index-a920aedb.js rename to zh-cn/assets/index-b28c82c1.js index 1430b45..0941791 100644 --- a/zh-cn/assets/index-a920aedb.js +++ b/zh-cn/assets/index-b28c82c1.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",p="/zh-cn/assets/image4-5841c9d6.png",a="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",i="/zh-cn/assets/image7-97920b5a.png",r="/zh-cn/assets/image8-ecf5c6f3.png",t="/zh-cn/assets/image9-f47bad66.png",n="/zh-cn/assets/image10-b50adc27.png",l="/zh-cn/assets/image11-99ec2a51.png",m=[e,s,c,o,p,a,d,i,r,t,n,l],h={label:"从数学角度思考程序与验证正确性",description:"本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。",cover:"./cover.png",location:"中国香港",author:["田野"],tags:["Xline"],date:"2023-03-02",title:"Thinking about programs mathematically and verifying correctness"},g=[{label:"我们该如何写出正确的程序?",level:2},{label:"程序中会有什么样错误?",level:3},{label:"经验",level:3},{label:"形式化方法",level:3},{label:"TLA+",level:2},{label:"简单的例子",level:3},{label:"Two-Phase Commit",level:2},{label:"总结",level:2},{label:"我们的项目:Xline",level:2}],A=`

        封面

        +const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",a="/zh-cn/assets/image4-5841c9d6.png",p="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",r="/zh-cn/assets/image7-97920b5a.png",i="/zh-cn/assets/image8-ecf5c6f3.png",t="/zh-cn/assets/image9-f47bad66.png",n="/zh-cn/assets/image10-b50adc27.png",l="/zh-cn/assets/image11-99ec2a51.png",m=[e,s,c,o,a,p,d,r,i,t,n,l],h={label:"从数学角度思考程序与验证正确性",description:"本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。",cover:"./cover.png",location:"中国香港",author:["田野"],tags:["Xline"],date:"2023-03-02",title:"Thinking about programs mathematically and verifying correctness"},g=[{label:"我们该如何写出正确的程序?",level:2},{label:"程序中会有什么样错误?",level:3},{label:"经验",level:3},{label:"形式化方法",level:3},{label:"TLA+",level:2},{label:"简单的例子",level:3},{label:"Two-Phase Commit",level:2},{label:"总结",level:2},{label:"我们的项目:Xline",level:2}],A=`

        封面

        本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。

        我们该如何写出正确的程序?

        程序设计的目标永远是写出正确的程序。随着时间的推移,我们的程序越来越复杂,其中可能存在的错误也越来越多。想要写出正确的程序,首先应该了解程序中可能出现的错误有哪些。

        @@ -67,7 +67,7 @@ const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png"

        在其中用到了"或"连接两个状态,我们可以用布尔逻辑中的逻辑或 来表示。这样,我们就可以清晰地表示出程序的状态转换关系了。为了美观,在 TLA+ 中,首句前也可以补上相同的布尔逻辑符号:

        图片

        我们最终得到了这个简单程序在初始状态后的两个状态,下面我们将初始状态补全,并按照 TLA+ 语言的要求补全整个 specification:

        -

        图片

        +

        图片

        • EXTENDS 用于引入其他 specification 中定义的 module,这里引入了标准库中的 Integers,主要用在 i' ∈ 0..1000 上。
        • VARIABLES 用于定义变量,这里定义了 i 和 pc。
        • @@ -83,7 +83,7 @@ Next 用于定义状态转换关系。

          二阶段提交(英语:Two-phase Commit)是指在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。通常,二阶段提交也被称为是一种协议(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的 ACID 特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。—— Two-Phase Commit (Wikipedia)

          Leslie Lamport's The TLA+ Video Course 中,Lamport 以这样的方式类比解释 Two-Phase Commit:

          -

          图片

          +

          图片

          在婚礼上,牧师是协调者,新郎和新娘是参与者。当新郎和新娘都同意婚事时,牧师才会正式宣布婚事。如果有一方不同意,牧师就会中止婚事:

          1. 牧师问新郎:你是否同意这件婚事?
          2. @@ -105,14 +105,14 @@ Next 用于定义状态转换关系。

          3. 变量 msgs 作为消息池,用于记录所有正在传输的消息,初始值是一个空集。

        下面我们来定义系统做可能发生的动作。

        -

        图片

        +

        图片

        • TLA+ 中可以用上述方式定义类似于其它编程语言中"函数"概念的表达式,这样就无需对每一个 Resource Manager 都定义一个表达式了。
        • [type → "prepare", rm → r] 是一个 TLA+ 中的 record,类似于其它编程语言中的 struct。
        • UNCHANGED ⟨rmState, tmState, msgs⟩ 表示这个动作不会改变 rmStatetmStatemsgs 这三个变量的值。在 TLA+ 中,每一个变量的值是否改变都需要显式地声明。

        TM 的状态为 init,且在消息池中存在来自 rPrepared 消息,tmPrepared 在下一个状态的值会是 tmPrepared{r} 的并集。

        -

        图片

        +

        图片

        上面的两个动作分别是 Transaction Manager 进行 Commit 与 Abort。

        图片

        上述 4 个 Resource Manager 动作分别是 Resource Manager 选择 Prepare 与 Abort,以及处理由 Transaction Manager 决定的 Commit 与 Abort。

        diff --git a/zh-cn/assets/index-008dd03d.js b/zh-cn/assets/index-b2f220f4.js similarity index 96% rename from zh-cn/assets/index-008dd03d.js rename to zh-cn/assets/index-b2f220f4.js index 7966d81..aac8d66 100644 --- a/zh-cn/assets/index-008dd03d.js +++ b/zh-cn/assets/index-b2f220f4.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png",n="/zh-cn/assets/image2-b3df764b.png",l="/zh-cn/assets/image3-6b1d2584.png",s="/zh-cn/assets/image4-034a33e9.png",t="/zh-cn/assets/image5-6a5e807d.png",o=[i,e,n,l,s,t],r={label:"达坦科技2023开源毕业设计实习招募中",description:"自1984年Richard Stallman发起GMU和Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One的理念传播开后,之后的40年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了IT投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟",cover:"./cover.png",location:"海南",date:"2023-01-06",title:"Datan Technology 2023 Open Source Graduation Design Internship Recruitment"},p=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],a=`

        自 1984 年 Richard Stallman 发起 GMU 和 Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One 的理念传播开后,之后的 40 年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了 IT 投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟

        +const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png",n="/zh-cn/assets/image2-b3df764b.png",l="/zh-cn/assets/image3-6b1d2584.png",s="/zh-cn/assets/image4-034a33e9.png",t="/zh-cn/assets/image5-6a5e807d.png",o=[i,e,n,l,s,t],a={label:"达坦科技2023开源毕业设计实习招募中",description:"自1984年Richard Stallman发起GMU和Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One的理念传播开后,之后的40年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了IT投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟",cover:"./cover.png",location:"海南",date:"2023-01-06",title:"Datan Technology 2023 Open Source Graduation Design Internship Recruitment"},p=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],r=`

        自 1984 年 Richard Stallman 发起 GMU 和 Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One 的理念传播开后,之后的 40 年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了 IT 投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟

        图片

        相比而言,硬件开源之路更为崎岖。因为对物理器件的依赖度更高,复杂度更高,修改难度大,硬件开源之路走得比较缓慢。虽然是一条少有人走的路,但其正确性毋庸置疑。开源芯片生态(Open Source Chip Ecosystem-OSCE)的优势,包括可以节约市场化时间,以及知识产权的成本,EDA 工具、设施和劳动力。硬件开发者也期盼硬件设计可以像软件设计一样简单。

        图片

        @@ -46,4 +46,4 @@ const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png"

        欢迎您预约直播,或者登陆腾讯会议观看直播:

        图片

        对开源毕设感兴趣的朋友,欢迎添加小助手微信,加入达坦科技开源毕设群。

        -

        图片

        `;export{o as assetURLs,a as default,r as metadata,p as toc}; +

        图片

        `;export{o as assetURLs,r as default,a as metadata,p as toc}; diff --git a/zh-cn/assets/index-2d6d14a5.js b/zh-cn/assets/index-bae930d0.js similarity index 95% rename from zh-cn/assets/index-2d6d14a5.js rename to zh-cn/assets/index-bae930d0.js index cae8e0d..ce8c23b 100644 --- a/zh-cn/assets/index-2d6d14a5.js +++ b/zh-cn/assets/index-bae930d0.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",t="/zh-cn/assets/image2-4624885a.gif",s="/zh-cn/assets/image3-ea54df7e.jpg",a=[p,e,t,s],c={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},l=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],o=`

        嘉宾介绍

        +const p="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",s="/zh-cn/assets/image2-4624885a.gif",t="/zh-cn/assets/image3-ea54df7e.jpg",a=[p,e,s,t],c={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},l=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],o=`

        嘉宾介绍

        施继成

        达坦科技联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选 2022 年度 6 氪 S 级创业者名册,荣获中国“企业工具与底层软件”领域 “36 位 36 岁以下创业者“称号。

        讨论内容

        @@ -13,8 +13,8 @@ const p="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg"

        本次直播我们将在【腾讯会议】进行,欢迎大家观看,没时间观看直播的同学可以关注回放,会议结束后回放在阅码场官网上传,年卡阅码场会员和其他阅码场训练营专业群资深用户免费点播。

        图片

        特别鸣谢

        -

        图片

        +

        图片

        转发本文,文末留言提问、加群提问、或者现场提问,我们将赠送 1 本书,数量有限,送完为止。

        ↓ 扫码加入本次直播交流群;

        -

        图片

        +

        图片

        咨询的小伙伴,可添加小月@阅码场的微信 Linuxer2016 咨询

        `;export{a as assetURLs,o as default,c as metadata,l as toc}; diff --git a/zh-cn/assets/index-89698b14.js b/zh-cn/assets/index-c86a9a07.js similarity index 92% rename from zh-cn/assets/index-89698b14.js rename to zh-cn/assets/index-c86a9a07.js index 8ef61af..81f5753 100644 --- a/zh-cn/assets/index-89698b14.js +++ b/zh-cn/assets/index-c86a9a07.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",a="/zh-cn/assets/image2-20a7bcaa.jpg",n=[t,e,a],o={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},s=[{label:"CURP 协议",level:2}],c=`

        图片

        +const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",a="/zh-cn/assets/image2-20a7bcaa.jpg",n=[t,e,a],s={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},o=[{label:"CURP 协议",level:2}],c=`

        图片

        CURP 协议

        传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源的分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。

        Xline 中所使用的共识协议,即非 Paxos ,也非 Raft,而是一种新的名为 Curp 的共识协议,其全称为 “Consistent Unordered Replication Protocol”。CURP 协议发表于 2019 年,其协议主要论述的是主从备份的场景,共识场景仅仅在附录中有简单表述,缺乏严肃验证。

        @@ -6,4 +6,4 @@ const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg"

        本次直播分享,达坦科技联合思否,邀请达坦科技的联合创始人兼 CTO 施继成做一个关于 CURP 协议的工业化实践的直播,分享将论述 CURP 协议的正确性,同时以 KV 存储软件 Xline 为例子讲述如何在工业产品中使用该共识算法。

        图片

        会议号:474-6575-9473

        -

        图片

        `;export{n as assetURLs,c as default,o as metadata,s as toc}; +

        图片

        `;export{n as assetURLs,c as default,s as metadata,o as toc}; diff --git a/zh-cn/assets/index-9b388911.js b/zh-cn/assets/index-ee7da202.js similarity index 97% rename from zh-cn/assets/index-9b388911.js rename to zh-cn/assets/index-ee7da202.js index 060a27b..282e74e 100644 --- a/zh-cn/assets/index-9b388911.js +++ b/zh-cn/assets/index-ee7da202.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",e="/zh-cn/assets/image2-ee430ce0.png",a=[t,o,e],n={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},s=[],c=`

        封面

        +const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",e="/zh-cn/assets/image2-ee430ce0.png",a=[t,o,e],n={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},s=[],i=`

        封面

        2022 年 7 月 29 日至 7 月 30 日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。

        2022 年 CCF 芯片大会由中科院计算所孙凝晖院士、中科院微电子所刘明院士担任大会主席,集结国内外知名专家学者,围绕智能化时代的芯片技术主题,论述芯片领域国际最前沿、权威和新颖的学术观点,包括芯片设计与 EDA、新型体系架构、前沿存储技术、容错计算应用等方面的关键技术和应用前景。

        达坦科技致力于软硬件深度融合的跨云存储平台,其硬件负责人吴迪带领研发团队在今年的Xilinx 全球自适应计算挑战赛上刚获得Big Data Analytics 赛道一等奖。此次,达坦科技提交的论文“基于 SpinalHDL 和 Cocotb 的 Poseidon 哈希算法硬件加速器的敏捷开发”也成功入选,并受邀在大会做分享。达坦科技的翁万正在 30 日下午领域专用架构与敏捷设计论文分组,向与会者介绍了研究背景、方法技术和实验结果。

        @@ -6,4 +6,4 @@ const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg"

        Poseidon 是一种全新的面向零知识证明的(ZKP:Zero-Knowledge Proof)密码学协议设计的哈希算法。相比经典的 SHA-256 和 Keccak 哈希函数, 在零知识证明的应用场景下, Poseidon 能够显著地减少哈希函数的约束条件进而降低证明的计算复杂度, 极大提升零知识证明系统的运行效率。Poseidon 哈希函数的计算涉及高位宽模乘和矩阵乘法运算, 需要消耗大量计算资源。为了提升哈希计算的效率, 达坦基于流水线和折叠技术提出了一种面向 FPGA 平台的 Poseidon 硬件加速器架构。

        在该整体架构下, 针对高位宽模乘, 达坦科技基于 Karatsuba 乘法拆分算法实现了一种高性能蒙哥马利模乘器。针对函数中的向量—矩阵乘法计算, 达坦科技基于脉动矩阵结构提出了一种高吞吐率的硬件实现。最终, 在搭载有 Xilinx Virtex Ultrascale+ FPGA 芯片的 Varium C1100 加速卡上, 硬件加速器每秒最高能完成 0.99M 次哈希计算, 达到 AMD Ryzen 5900X 处理器 Poseidon 计算速度的两倍。

        图片

        -

        除了打造全新的广域网共识算法,达坦科技专注于自研面向存储网络的硬件加速,以期软硬件的深度融合能提升存储的性能。目前达坦科技的硬件项目 TRIDENT,已经在 Github 上开源,欢迎参与讨论:https://github.com/datenlord/TRIDENT。

        `;export{a as assetURLs,c as default,n as metadata,s as toc}; +

        除了打造全新的广域网共识算法,达坦科技专注于自研面向存储网络的硬件加速,以期软硬件的深度融合能提升存储的性能。目前达坦科技的硬件项目 TRIDENT,已经在 Github 上开源,欢迎参与讨论:https://github.com/datenlord/TRIDENT。

        `;export{a as assetURLs,i as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-37f93c7b.js b/zh-cn/assets/index-f5cc00ea.js similarity index 96% rename from zh-cn/assets/index-37f93c7b.js rename to zh-cn/assets/index-f5cc00ea.js index 0768265..0d38c01 100644 --- a/zh-cn/assets/index-37f93c7b.js +++ b/zh-cn/assets/index-f5cc00ea.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-d5e6eb74.jpg",t="/zh-cn/assets/image2-5d4b8e33.jpg",s="/zh-cn/assets/image3-a4b62ce6.jpg",a=[e,t,s],p={label:"创造性地精细造车轮:RDMA的Rust安全实践",description:"极客时间打造的QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台",location:"新加坡",date:"2022-07-28",title:"Creatively fine tuned wheels: RDMA's Rust safety practices"},i=[{label:"讲解回顾",level:2},{label:"达坦宗旨",level:2},{label:"联系我们",level:2},{label:"推荐阅读",level:2}],n=`

        极客时间打造的 QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台。

        +const e="/zh-cn/assets/image1-d5e6eb74.jpg",t="/zh-cn/assets/image2-5d4b8e33.jpg",s="/zh-cn/assets/image3-a4b62ce6.jpg",a=[e,t,s],p={label:"创造性地精细造车轮:RDMA的Rust安全实践",description:"极客时间打造的QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台",location:"新加坡",date:"2022-07-28",title:"Creatively fine tuned wheels: RDMA's Rust safety practices"},n=[{label:"讲解回顾",level:2},{label:"达坦宗旨",level:2},{label:"联系我们",level:2},{label:"推荐阅读",level:2}],i=`

        极客时间打造的 QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台。

        讲解回顾

        达坦科技联合创始人施继成受邀作为案例研习社的讲师,近日分享了达坦实用的、可落地的 Rust 技术应用开发经验和实践案例,介绍了达坦是如何使用以安全性著称的系统编程语言—Rust 去封装 RDMA 接口以达到安全高效的目的。

        图片

        @@ -19,4 +19,4 @@ const e="/zh-cn/assets/image1-d5e6eb74.jpg",t="/zh-cn/assets/image2-5d4b8e33.jpg

        有意加入 Rust 前沿交流讨论群,请扫如下的二维码

        图片

        推荐阅读

        -

        创业公司为什么要选 Rust 做 RDMA 库?Understanding Functor in Rust

        `;export{a as assetURLs,n as default,p as metadata,i as toc}; +

        创业公司为什么要选 Rust 做 RDMA 库?Understanding Functor in Rust

        `;export{a as assetURLs,i as default,p as metadata,n as toc}; diff --git a/zh-cn/assets/index-c719bd5c.js b/zh-cn/assets/index-f6eeef5e.js similarity index 97% rename from zh-cn/assets/index-c719bd5c.js rename to zh-cn/assets/index-f6eeef5e.js index 2516e15..77dbcfc 100644 --- a/zh-cn/assets/index-c719bd5c.js +++ b/zh-cn/assets/index-f6eeef5e.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-86fdf634.png",t="/zh-cn/assets/image2-639b53e5.png",a="/zh-cn/assets/image3-c2c092f7.jpg",p=[e,t,a],r={label:"Curp 共识协议的重新思考",description:"共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如Multi-Paxos 和Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。",location:"中国香港",tags:["Xline"],date:"2022-07-07",title:"Rethinking of the Curp Consensus Protocol"},s=[{label:"共识简介",level:2},{label:"Curp 共识协议",level:2},{label:"Curp 协议总结和讨论",level:2}],l=`

        共识简介

        +const e="/zh-cn/assets/image1-86fdf634.png",t="/zh-cn/assets/image2-639b53e5.png",a="/zh-cn/assets/image3-c2c092f7.jpg",p=[e,t,a],s={label:"Curp 共识协议的重新思考",description:"共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如Multi-Paxos 和Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。",location:"中国香港",tags:["Xline"],date:"2022-07-07",title:"Rethinking of the Curp Consensus Protocol"},r=[{label:"共识简介",level:2},{label:"Curp 共识协议",level:2},{label:"Curp 协议总结和讨论",level:2}],l=`

        共识简介

        共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如 Multi-Paxos 和 Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。

        首先来看 classic paxos 协议,如下图所示。Paxos 分为两个阶段(Phase),第一个阶段是 Prepare,主要任务是在 Log 上占一个 Slot,第二个阶段为 Accept,主要是确定这个 Slot 已经明确被占用了,且在两个阶段间没有被其他人抢占。当 Client 收到绝大多数人的 Accept Ok 回复之后,说明该条记录已经被提交,在整个系统达成了共识。这里 Client 和 Proposer 可以视为一个整体,整个过程在两个阶段分别有一次消息传递,总共发生两次消息传递。

        图片

        @@ -38,4 +38,4 @@ A5:首先恢复流程需要选举一个新的 Master(Leader),该流程和 Ra

        Curp 协议总结和讨论

        通过上一个章节的论述,我们不难发现 Curp 协议和 Raft 协议非常像,其中的不同点就在于“等待池子”,这个池子的目的在于给冲突的请求排序,多个冲突请求一定不能被所有节点的“池子”同时接受,此时最多只有一个请求被 commit,也有可能所有请求都需要等待 master 的同步。也就是这个改动,让协议在某些情况下有更优秀的性能表现。

        所以总结一下, Curp 协议在乐观情况下一个消息传递就能达到共识,悲观情况下会退化成 Raft 协议,需要两个消息传递才能达成共识。

        -

        关于 Curp 协议的更多细节请参考原始论文:https://www.usenix.org/system/files/nsdi19-park.pdf

        `;export{p as assetURLs,l as default,r as metadata,s as toc}; +

        关于 Curp 协议的更多细节请参考原始论文:https://www.usenix.org/system/files/nsdi19-park.pdf

        `;export{p as assetURLs,l as default,s as metadata,r as toc}; diff --git a/zh-cn/assets/index-9d285d88.js b/zh-cn/assets/index-fe9ae8f0.js similarity index 98% rename from zh-cn/assets/index-9d285d88.js rename to zh-cn/assets/index-fe9ae8f0.js index 4f0b969..9b7e61a 100644 --- a/zh-cn/assets/index-9d285d88.js +++ b/zh-cn/assets/index-fe9ae8f0.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/image1-130a4039.jpg",a=[l],o={label:"Rust语言无锁数据结构的内存管理",description:"正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。",location:"河南",author:["施继成"],tags:["Rust"],date:"2022-05-27",title:"Memory Management for Lock Free Data Structures in the Rust Language"},s=[{label:"无锁数据结构内存管理",level:2},{label:"Epoch-Based Reclamation",level:2},{label:"Rust 语言实现 EBR",level:2},{label:"总结",level:2}],p=`

        无锁数据结构内存管理

        +const l="/zh-cn/assets/image1-130a4039.jpg",o=[l],a={label:"Rust语言无锁数据结构的内存管理",description:"正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。",location:"河南",author:["施继成"],tags:["Rust"],date:"2022-05-27",title:"Memory Management for Lock Free Data Structures in the Rust Language"},s=[{label:"无锁数据结构内存管理",level:2},{label:"Epoch-Based Reclamation",level:2},{label:"Rust 语言实现 EBR",level:2},{label:"总结",level:2}],p=`

        无锁数据结构内存管理

        正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。无锁数据结构的性能优势主要来自于以下两点:

        1. 数据结构的锁设计往往比较粗粒度,在很多可以并发访问的情况下,访问者被锁阻塞,无法实现并发访问。
        2. @@ -44,4 +44,4 @@ const l="/zh-cn/assets/image1-130a4039.jpg",a=[l],o={label:"Rust语言无锁数

          第一行和前面的例子类似,第二行的语义为从 map 中寻找 key 对应的 value,获取 value 的引用,其生命周期不超过 guard 的生命周期。通过生命周期的方法,我们限定了 value 引用的使用范围为 guard 的存活范围。

          总结

          -

          本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

          `;export{a as assetURLs,p as default,o as metadata,s as toc}; +

          本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

          `;export{o as assetURLs,p as default,a as metadata,s as toc}; diff --git a/zh-cn/assets/spinal-hdl-cover-9878c460.png b/zh-cn/assets/spinal-hdl-cover-9878c460.png deleted file mode 100644 index 19f7887c6537afe13f2e8c717527b67cd53a9abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64854 zcmV)2K+M01P)%q(x7t9quNY2S^u02;1A(*$S%`e7^?vm+6+vznEO4b30gjnQuGE*Y^K z+zBamBr!G+!O=(@iKCg(h@ycbIRqY>=!R*aVcMd-dHrlvz4BFAnR)Ng=g+yBSq+dg zx4T}tYtB9QoZtC@)U@G3OuGehcx-ib<2QT#?l14| zt}b4?Ucu~q2ljRcP?i9Lx`rC}i`@t?9blruOS3HK5|*;HBQR=(8liv1NpsG@^3AmeR)UU zFXA;OA^QEq*nIeO{J8J=9Q=yqi8Vwl%S2}qD!jLcit-}dD zcmnSkf1l{2-zPxsm#=~Ubs~(v9^X?NuW9XuexX9kHR+hDsp`Q!sBEz~W@}2WL+>lO zpV-E}gYVl>&W}6eJ{_P-QwgapN9>ExE4XdfHQy|hg|rzu50?x7T6N^-P#2SUPI^zT z_(Lhzpo@3v4!@69?md0XWq@Bk^8eYuqrO`Y;y?S$_W%9&VazrHJ{K>3;Q~I!|9)@p z;IV$cf|;2Kto#WCkQU5LPeXUFix;f8K!aW%2CWth`UAd!vM8X{YD2FV`GM^teD-=h zz0n$8e(4oBcI*U9PfdGMvrhPfwzOO12TnIATNtx%Y??x6@qJwfrraJ^o+;VhXV>IDAh6HpOr0I{TeVx z!%s&Ct4is}!O8+&AM$*&>*#S2GH}k0sVcc1wRgWgsQEiD4_Gyav`?KX$)5x6Y3Bjm zU+OjrFz9iy4vo)z905;NOIa)J16=pfK?4*BYXcG7Kg5EMH+iO&iDHMer5h2{lEIX`tN?W`=5U~ zf8u5S;o`-M50_>6HDopS>}>DDUbhE}3rMfJ`*8E-P1xP-LVwT~l*AI_zTD8M5?aVY z2%zNq7Je^{eQIhF=I7@5;lAW zTbiI04gom-zR`K)cA3_s6^5fDO!Rk3LD}%hA)9Q=L(zs7Z;250^ zrC~rAM7o>ipb)Z>NZSiBIIiU8oTvcB|rV9KU;A@TF)i}`C{UEP&3^Fq$NqP?2NB70=>Vuj; z)A96L(dV9i?hzxB{bN7yv3xz2cJ)W`qLK{7UsT&fU-zTW^H{JI;{Y+a}#JT^uEamm9j2$J@c0d;j7uj@K)cn^(OE{7pg>eJ1&%UcLfY!AZ_+vGSOd32 z$Ky!j^l>eOv7qMP=Oc603A}^oNGW}-ZZzr~T$;@v8XZ0FNHFxiaovmwHNZ&E7qU(b z+4aL1&}!V93`hDg)mwuF1!*+7X=3GM^FSF@x=CeakO2&zJ6Lm2D=0XxQG^B?Me{NQ zV@!IFQOoT|M?EgUSjOz6P{9j^>vssGge}PRYh@+^MEa);5R@%4%TSPUG85%JpWhfl z6i_inK}@D%vqk_Wu?%4zbdS|Qn1-+#>F~^e@Vh||8O$JoP1TDGE(|&cF@YBT&LD;F z2M8<%Ds;Sj4s15^`@R5>fL(Akg?1 zVu26~VnswY@W03Io%rcDU+n$G_oxot>?%Y1;?BEPew z1kBFPvRO4bF$vpS+pxE{FJOTcOMunF#!0$JzycJ3E?#nh_V@ST+O<_UbLK1qk+B^4 z*B*KrYJz??N}u=Kx;FYd)Qxr2KMZKbZMn%a+E9~uB7I6LlGs2YEv{C|ZKY^7ZNCT% zn;66U#4*?QV~5J>rjxUh{P!jhjjIa>#Qc`^P-6!PoQBv+R=;A|DAO7O&fpy#AZLG# zEjG(%b-)z9A~9xdF^cH}Av*^Y0#XK8 zs*BKZVuncBqV7|x$;6%#whV5(3H(8#kW>>(-%3DOQ~l3z+ZR|Uqj zV_RLBoKPkD$4IH?-N+MEg-wJUd^ro4_H*+abat1XxpNZm_SR z^I8XHz$=P|CXxWDDbn+Uw|xP;OB(i@7;6`D1_MLDkh4KELqP!}zp=dT#sOc(a7d3K zEifpPNu3{@g+K%t)~E6^*u};4fhI7B`J#%qW`@N|uEFLOpSKclz;XQvTdCfN)l-DY}f z3N|*kkOA#k4`E>7ze+k5U3`0c7qz3~aOB7$GY4Wv-T^=bNsvxmSpDQ9R2XU`PKD$o zbW8=!%{?0t8Vn)tj9xqA-VdEeI+|xQm2Y$ zqQp2J>4rLc)1>6_X{4+M1R{LqIGn&tMnicrF$3rrvg;0mc1(j$0~mv`+#!=mOT+JL zY1q=gqIdq>TV-q{-AB6LM2egHTiYqLT8z0;aVi5sZHEyIP}J*V0KvUKxOpY@qxHm0 z#mp^bM9NlJ)2UThR*?WAF z4O$ODHL1jml75E-LZ7(|06G|i!h2uT{>%G?1iaSfsh+7`#ah;W64|u>&0k*p$G>G} z*JJb#jl}!=2hiW`GI$X11omLH7-+h)GhFxqs^#=IIYlgJ3RZ8fLKlx?0a{HIYiu;a z_lZSy+T7^Kd^(LjJ7?3)4v?EHxwk2q4Vk!V0Hh3~ zVX8s&am~DYd0qK)fOMP#5@gjl#CW7tiUwc=CDnhOjibthOzd?^pD~MJCgrAAV>Hd4 zyIv4deL##(YTT@ea`$yD?Y_{?6~RnA1U_W4QLGHv zf$a{OauX#~-C8N8bORWA7aJpX*0!^T7F?Ph?);4#{ejyL)QK`cl#xN|r4HH{a?0Rk z7=0h#jU|Q9ypu+UZeUSkYq+_+^D3n_J3KalU9OqA+#zc5e{j9Uth{N~M6|)CPM|||3yDP} z7qbFFox8{bGY^r8Y6lKxCJa2Hvrqt-u_OVeLbMsG!MaEwRe_phc8;VaahWRh@+xS_ zU>W@Wjp;B`x5rSc_EkmqFegxv8fzDYeBF!9Z*tn_Z*{;Cha{lbRPN zhV16}vw?XkkFkuH;04UQHq$6wYsecHWOPkHm+mi>GB{wFCevVTdhd4kpd+$s1?yL~j5Wq}xHK`)FJG@pAwyGsDJW_m?qR6yF zee%}dqE)vJ6It7B4q{s0cC1iRk3+KkbJbR!6tW+S#5IovRltDg)9yYq6>dvd$ToVs zCUlgiTN@z2ko%B=2nkTimbhsFR$yaelTEEcJMYxgG_+8(-rnBhN+8kt;GmBWG$ErG z+eB?`pe2KwYNt$S2B!Z2Bsey`#5#h2ghi<9)#obcAt~D4BG&ZGHT_vi}YM=j57=QxXN8!UjAWV`5^w z!Jlg$uNA~C?(MVihgLMGx;@X--ffJ4*lfAB9|Knujm|c24$E$^v(e{z8jqhoMZdiEWWTO=q>8;gZXlh)kAr^ig!}p&AW-FgCg`j0i2iN?pqogixvXN`Z+7&0O47K%qDsP`2Y{neHbb6SHV! z{bP0|_sngr(sHXg7+H@hr932sP<_`K90!q1_;VrRFTXGK{0cOs0#FU9bruQ=KETGz zk)qGb2K6FupHcNS-cf+6hK$odYD;wxa4sO}oz}Zs{D0QK8I5U_q?n!F0UkKb1!^OB z)a_cqq|i74^oX@v!hA@a#{G^Dj=}B@fzNeux#RbfC^D0&wY{~2p0O^>%}*oy=|Hbb zW>=Lugf$cx?x1Q{g9*#&HquVn`;bhaVXO%wyQT&jvI^JDbCk@7;bgNBR&>f_`~6gEF9U3sWzVWh5_KvMg6hFP(JbdZ4(GzgfM z3^L-RjXGq9XLT5}^BKTp?*(l1ST{!$Jivg;OsSwC5d~BX)T-cuFdb5v$H|3W{f*dC zoiUay2oTgYF5ar(pIN)n@-Q11L_d##UodS-*%jZT>o>vzxC-miO`0+m4HKU`FirhX ze@#)?fTHkW3`QS0{}e4oEPF2CJVw2+`V5DjZE7qDN=ADtWbG*p4CzrPz1D*axwt-h z)le?X!2Zf6EG``t;kkwS&A_6I3!Ym=BLjg80}tN#Pyh7K!4$gS|NH;$pThda7Cids zkHRnf{4etPX&=&wC}yao6GANtba!`$BdD)mzX6xtzT_2RmZArbccQiNQRt;O(=)P(c}yHU*Byi81w%7#k0_ z!LIWGc<7lYGdXI!8R(3M z$L4d<$X`Tp$sap@0+vsn(dRXpN5`BRywy=-m+A(v<>p+>Q6yxAh$aPF=P$fn8h9mOX~ycz=7mpBGZQ5($T-OIaRd^ zzzh&P)j)jfwK5xbiB}>#^OS{wxw}E)ZIrQyNUaQrnT~p)%p6ot9nXD=sjY}8EE9s+ ztzD=?BWO%nAr&Hld(lTL({+Nj2MY%QtxJhI2G(YWW2A!q7Bvnhit=u~q()1?} zIbn-LW59w5+sOor>YA%H6cN<3MW2YcwCrJePtXobk%|YQf@&WH<@S`Yp9c6S6(%bb zYl=)S+bAG$Zf+jF{q3jW?74Gja!s-6wTGI|0lMo?oHzoD3-f%P9tzL1bF&Cm3owl! zL{m6E^5{npkY?a}-+LyND`qBH%mKun0Kl*~ogM0((hf057&T)6U<5y6qOjIrbZ#2O z`xMgN8t2HTUJUpBrfvdFdJ(eoL>OX$!I?}$yQynGx1G|%J!%Pe;P2|%`m1VL0fx;t z8_6JM_pWDmQ%4a@Nr(PZWFx7SqR0SW?!_ltf&jQwZLLwF3Pj2b_)i&4t>zVLUdnE` zlQU9KfE=hf6|kbFTPz2ACopUkjVDxmPy%&}NN$ z#ndUDCV!xK+@1*RqtY!+u>ZFLJhVLNbiX%61^-uH0) z(Ek2D?Co?Bgbv``x$|)UgZDA;JowOqTdB7Fz{#(gxvqVex^W>1>QkngdER6SgB_Fsl#0IYVywurAXNDkeuZsccp`&E6I>EFI7HR4K5sa9j&I)CpiM$d!PG z1Y_>3Q95s-056lHLCncQ?q6bSwB2$27a(LNHU^_)wr6cj9;RcTd=){0F}1${xD}E5 zOd7VL4sP}e@)$hmli6LNmQqaSUY#`y9v>hzG#d;mkjb?JtXw*sdb@0vh0$ug2+};7 zK5?vn0*a1AJCpmJ*^lZST#3qxY$Gw5{vsm(^72VooL@pMXaeTvj({QqwX4^l(I>Qa=NA^Bi{RDo^}HL9 zrbOa4&%pQngI7M8fixY2rijpIo;2HO^KKNQWDnBzWuZMvNWuEXx}S0m*&1ayq(2L+ zq7t0BX<>xSf0qhsq5h}K;tfET=-SRKmy3_!quIGgXNmCt#GypB`kIAkqNo^v)dg`7$2y#xao z^-hHnyde#>K^n}eVNjy0$25nH>l}oU6BD8-7W9k<5XDnX`?q`Q?XrSpg=BQ5$!u6* z>(|%d=q*d^PVZu;rL-AL!9swh4j>x^9ZpTpz=uBcVfcH0?^E!DHex?7z4Q{i`toaV zfG++ofBCQAlRy7++;Jaz=ph84>#2-pe&Hn_diY^@{nc0D%9Sf%F4jBmx)Z%^yRi4> zo4#Levi#VO|0sOvi(g{!`Pj!lhTyp5=O)0q_{EE`qrgQP6#Y&*)HN)_?%pnZ@{^x{ z&wloE@bJSA!K<&n2A3~i_DP~t7a#xlPr(21&;9^CdUFW2b8yeS_wc#C|NWQX;Gheu zD{GB<9`0fd$z#3_+vNY&5lfjs4UyOR%L32V%1E(@`M- zNlpTliAZ^(M$zi@0x;mQ5fJ?N+^m8qnJ&RhE1f1#TZTT1t5F9iBmJrWRlx((H|2pGk^tsq1xW@6O1DtpEt zmO&0MTBoTgL{1lDlWG$eN$n)P#>7VbOu_5ht{JnI)^H?5Gn4d37HXvZm>13m9jN`; z^9*~?oK`%zR4V=h0}ab)8W+W;l{Upbk&Ou)%ul!A)Lk=h;`TNiIW>_ZPa2`TKw7vB z9JLp^i%?Q*&R)e)pM{!PZl`A8(?%vi8qcXyr{IU#i2Xc_Ktfv4Gv9rdUG*=%_!0uo z11MrIGYECNS-x1MlPfn?_?6hsB(fd4c}@X>s7hWpx|tr&(C z{_t+S^#a^=_g(OvZ-1Mg-Z#Gf4fxQ9KZw9{173UWHNMtsue}cUDxk>y7i@cf-~;c6 zyAb$j=Krt!>MyZgb?dFS@=Si)E+a^;uHE!oNUmgjUnDm~a5HB$MdhNLjl2aByKpk0=U@o-0|buN<##|9)pnSewU+ib?*&&B4q*?we+m01F{ zVP{FL0F?4tscSvj;|R)@GG|4OhE8Htf21w?7dcBJ0kL;s~Gcz*@_uhXeJpBHL8G!D& z=N?$Su?m+iU4hqLd7Z(Bwp-5L0q`EkJkT#0h>S^M|%K z-gpzN82{}aecNKYch^W3w~=~LAXtPh5Oj5gZu7k=^Q`TcFT-3AXnct0|p&tusx z@plG5rtduW-17{Wzl6tp@h>kT%Q;|{^U%W&@_ye%Fe1}!SW~eP%h^a8>auYRyunG4 zO>CAk2(gfctmHvO-5Q#tN(UIomHWY0^c3*2xElj3ad}gD3OxqE=6!{_ zmt^GV@NZ^b*DOGA=ZGE%=oz-TIE8Cg}7O294^RGZPk04xO#_*9gr;KHVGOc@>rpjr*R zl6QMH!qM}{Xzu91@$=Y6Paz&mvS6n7+=D*a$GZqNWI641_pyIqpT>UH@AqIA-?#J@ z<%Y6`-e}Pv_S=nXD{%JwX$}_L#Ex`SJz%-mOk1l}$ZYpXS;$1Pu+_*?`uIJ1xOTg6 ztnVBj4{W^TqvHcZtoHacdpzq?%6dX(R)Mx>*KkI(!07F? zR=R0S*LSHiGd?Plgy1n#5Tg!gVxH1}WPT1}8cYUJW?@M+iO&jJHB24>SUiV7a~u9$ z=)mFN8Q0m~b^XccX2Zy~tsK@YXuUKd{xfcExwU=IO@7nMNp;W?oIkQl`{ z;0Y!+0ncK;j{3)uV@KevOK-D@vWOn1Tx^!+S;7Q@2Bll2t-vQi@lh@OZ)bfUX67bg zb7K#VotQ?Od4fS^ZEc;wht~p|nt)kahR5B9mgorN0n_s<@`?{|`phXfj{3?|*x9LE zw;~Xcu5(@4kL(qi_XfF$CtI)A^Y6?ABd{Xj`7D}$=0!V+TGZLI=Xj?68tORjd*6GR z4Q_95!xujP=iH7zh%D?wAN&CCPvG>@OE0H58c58;&8;xhu)*x{kl0K}V8HJGQ1~1v z`8}lHy%Ad92+30sWsV$c9R@s6_v2%NgI8_rM}L>N8~ZNhHm;*+D(3l+X#|A>l}#%U z&Bk)tsL7;Y5{x0qASxz}X*G27nkJM@p<0%manx4k#LTDG^Jv-G-A!7hXbbLQm+MJA z6fWi_Q6Dmq+~F#!zEdfx#MG{wff|K2;E7Qgl*3E9j`y+D4t+pSK;*Gkfj$LW21wxy zDU6}g6u*Ts7f%;L0|FUy(FQMpyIR{^Md1M0uiCQ}ES_q^F$9@o7fM*XWdb@g>Xr|J z;1M;OJtPPl*xt9WPaO32;Q#@q!v3?5j+tF_((LSQGtkf^a|)$7K;5=C=<{-7&$Ry zH2L*k|1~vjYWU)pz6}5VzxTHpp#JcW{-hZTk>Otox&tq#xyqe9fD96~j!;n>P_14D zXGXQs<61_rN*kUtCO$s7L#=UA3d~9`HsD~y!sAtPT3##gSnguh1T5EZReO#Z*LNxn zQd2S4kuU?Bpi8w_>`u@iJ~n}f^7lmCEeuf&2%^+8)Y0FwXqsgKlxSk94-L4LPOgG! zX>n`HCOnQNg0mp79ud_$2$BVmPhBTa$p>!HdrUvob_*Gs(K>|O{I+SIrr#LIhLBiI z#*_sV<^22{-0iJ84euj@colS@it^kmm51w2gqdTa(Hyz8K)t2|vq#&=YABZsN)NH$Y^(yW+0}dA?YW3B7z|Tt_c%5k%Z@u{zy!F;w z4w$4Hz4_Lg95ua%<;+bB+J`FXGoSek1CCK#0vq}p4mz}tPe1*%1H_|`euO<>WR{uf zm2qb1AcOnBBk#u%p~t`9e%r0^ooAl)1{yP#DI`MaaR@5t8DOOOGF1CAqhF4xv?10y z>hTH*I&ci?pug+N3EXkgC?}0uBTj31wv`6P4Rj>}Hk}kHD`gOsUfiV7D0by0w4yd}h%( zE?Bg&hcfW_)3dNVI^MA%b#8&OTo;4JU?MSZh34UrA7eJ1L>whifk>u&a9<-3q>0?l zP-TFT)T_#l6wHMg*O1*B82O1}Na^zpI(4jK%x6=zsGze@!u+Wg962`$i|0!?at6J_ zb5x)TJR@^Na|!Es0~yTb&Nl2LnDo(Pst|N4GOh5t?VT+Ioqg^{w0>Wg*XSeDtKvH7 zbS7Y$k_aN$P~RvO4;Xk9OdH-V6GHtJl2V>xdE~pTO$3eEdD!140J;jtjvvoYB~vg| z3nCV@x4#8PmQKNRO(xeiT)DIc=k8cS+YqVQ>H+8cp=||0gM?`M8w`XEm6R;LK=wqg zQP4z4SeEV09TtSiqeSI<1l`@k-XzL3{aqA}Y5xy?=tGRa?|tukSwN=wWaG9co_K=2 zRjFPYwFCfR=!n3K=x2ZCr#W9WF`rNV+|TeYfA~j#$~E?Dzw%44fmHOhH{M9`E?S#W z8yEWp>LeIjo@Zw-fgL&AF9$LRGGIs`mzX^g#3f>3k1|f`oHK5eRa9WAd0zt`BO+C$ znftW!$!Z6tvD9wT09bNy1qr^9f>VOB7+Z@rBA^1Qu~?zO1>w@>#MQ~AU16TyV*2%heQO|O{hAO#Hy%j0W=LQPIJt6~BUpM`Gbina;X zbkrm?reh{e?Tp8mqM64sWYGTuWjhtE@T={@*iCXK)Yhv~yd&RI-C)t?;A1Ta!K5_{ z=Aqu2Ha-$(HXRgtY(|E8YBhP!5-AeUit_)JDUhL z=z!TrwnK>m$&xu>Gm3J)OCRNhB_?NJe!k5yO%$j|Ktug4WK6ER-(`o?(IdxfZdY`1 z&9>S?AGtnaqKMHLZNwAxu>rL>a&vWMHS3DP1d1$}YU#uhdbQS|Q!K!-<$1V%c?~YV zeFM(jzRciq+wHgVo@;BXT&l$=7?KnGZ!^_#o!xzGF?1inS~ zFu9qS-3L{Yd59<=@Wu_%fGD>R{RxmkV>5H>D_{8v>pm3tcn&^O2yZ8){I%~24?R{Vd5{!y5K*%ev5l}<& z`qb*Cu0iMSl+vkdV;Fp2)1!qD*lF)C=IOWrvS|-`uNqhv8m>zNm;!FDuS1$=lo}Il6mDScgZ{|8dgawu#Vo<&5AZ?R976(t zb#ymMeaZPvzo{~QDZpaM(q!L$U90B-L52Y)@OM4BMlFno0Ed96TPXu#zzS|ona9dk z%+%3bT-Km2Z|S`BHEVEcj_@d4sr$JS``zX!kD6)U*Kkyn@d^- z0PrakbzNus>bY_@1Pbg%bt3q4brZ}7#sbWHYwe8(dyAC{?gC1{1JYJt0zFUjB?3(e zv!_v~IorbbEto{vm7<7)*_b?kD#9L?dlk*3n+Pa_3dP_q>NJ$8f+Pksn|81dZsG4_ zHc==HEs;(jLjo~d9(Xze8gi!0OwV&V98jR4_Y5@5bfm7ty}k=a5Nu8$;W&5pRyehM zip?;Utkm4CbMUcB1P7j!sN3t)MX$h>VqO942)oHlx%=*WA>WRnckEYwW(|fCJ#cS+$nRz(v3)u(-#j z6d15XWM{WI_xA)R_Rud4z>zKw3{qnVy<5CgR3AnFkW#3;=3E zi6(-L#l&1Qfe5&DZKpyR5i^lmwVhhb9s@C9Ng!Sg)d+Di>-O?WAnnN|iL7ThPM za%zhJW+G)Df&fgdM}n+!r_D#(0~V~n@qFrN2{R|#Fn_uQ3kWpxOXx|S!5VK1?G#|E z_*op_`!$q7RyH@#MCu~Y>_CY?Qq~AW2rfI@I~;4q^C4*k8fGAaCFf@5VENQ3ICJ_IICbg_0@bYCT^*eTxs{=9(ls9w z#B57!Na&E@P^v%=lnYYvH#axoZ@Rtw(yM4beE}36O6+D35IPitG{0c17LT7yQ>-hs}10n-RHvnLT?&Xll#`pnERWEPX; z{?>t1hpRzEffwuWI-33Ky9g#I^mdVL1e7N_ga`;Ed&p?E(X860pgv^f1jJ@SnPY|8 zT*-mLv^3TXGZ_aPGDu5VHj7dq(>`=>bUb;rrqH3Xj2iCAlc$m0oQK(&dAWC68!R(N z^DLOAB|`y8^Pw#v6hQvHesFswkI>~#i=PQO|K&gbSL}K&gN&4S-Fq*ZRd;ZKpLymx zaOKJk&i(V;v#-JV3uj<$bsH9Q08XEl=@EbYM}G{j zy!;w3xkKffo}OeIlID6*6!QQ3|M^>}AuYkje)8k+(EILzZ+!i`jJiw9C%6okFW=w? zaQp3N;hwwh;U59xaHJI1fDq*)(=D{tHdKQFs2hk z=%wa3V3rdYe7g7}MI15P;m;MDxP6jaH9w8$sxG&}5lCViAVPEl0HoDMnJBLEZJ0xyrb8CY+?$vAP&04*Ruh$V!aAe=ZhcVNE z)2Ei;eUH2se)6Y2#vUr#UVPyNc>cL(nZ&HGu1la5xiWDCY?pHVUcZZ;s}=a}cfJkp zf8>Ms0M3i!oe`WXDd?|%k6M2joF;CpSM*>(aReBeHK>6O=!DxQTBf4g>l z1s=Tret6}z*Wvi_C5~|Z?4Ny6K!Q9InzYN<&Tstc&%--cufzM$+xETZUxd}Qb@N^E!2cY16}q3IN(npy?29i-5;u%CgN3D>B@6`2TB_@m z%4CX|G?pT2dFnzLQWQ;x0k4wt0=P#i3DRP2mCAk!jTMq0FYvimg|a;G8R_b3HxXMw z(9@QhE@Z5)7FKIUR8kvE^cT~kfE2(ddZz%BVVWH%rgYLsBeuJu6QMm*!qj33lgAKb zmJ3)og#z&L0w(4VgeQX9dj>KCe$H!EA2twJ)=>c7M$gjT{tga|d(g)3rb**x)T&5*uIpd;?>l4I?rCZ{#Wx(q-;r$v#6R=`H4i?BmuATd1@ z$9H7mDC#yRk=b0}P#X4NyF>x55BnF8t!irk1WhZ-7DrIuPPMQd!0WHR4Y%B~3@<*1CflVAIDK{rF1>vnnaUEJI=KX|y?z-VGy&)ieC=D$ za#j3$zy6CzX(iT#Jc`}E0xkY`{Mb>pi@)&YC*bz;=iq%0ya#r=J$MF9$gh0sJ8*#Z z^Zj?-0Z%>uGW_Wi--Nl@S$OE4d*EhIJX+$FB2SfhuI#%S*^RQIsOvw0t#F`G%rz*L zE!2F{+1xrP^T?$_spudA5QSM|$*PoKcQ<1KV&7ce>dPPa&LI#fJbTkrJJ zGFk&?U>OBs3Zp3tTMi4{>XCrd02wLtiWMm_4t)!dvNa?|L}zZv4E2D8?#SUrrGkwG z!4GytBx62gW_{$*5Ak~n4*cwAJ_n#TUbGb9Xu88~w>1j&-uJ!_#%(XZ^fLUbfB8Sd zv(G$_U?TZ%PAnbe^c?rzcNc7KY{A=aTtX(a!IM}2{(t-*A!}*zs;O_h@fwe=vvV`> z#FKx8l|8{`+V=h$+O%^(X6xh>-s=R?PZG6HFTp#PZouZvH{j~qH)Wv3M%>+1n;ySF zZ4MuHfDgX+0l52)Te%Kidi@f-b@@7qdOi60pZp2*z|F$lACQ<(c)<9&$Tn7L-AooD`2 zvxm(+n&O~>u?GTHi8;wJYI0Szn_^M-qtNVVo-KW~z+kh8INfMe<3(iw?ii*wn28k4 z5>u@LL?4oBkFvJQ1hE)wHwY+G#{h;ZWAJwEZ9SR%S6Jd_QvLPh z!A_19@?$^oV_XqmLvPhbP@E;-{?ku?o4f-)!X6w+q7Os2P(9${g?K9gL&52&-WaX@O#;-GW{O(Yb3r;fJR zTq3inGgm-oGV;=PLA_Mg{U~n@IRv(_;jANrSlQp=*qMD|GWgfV_BVl^rb(=iHr98I z!Z0y$`rF@^0KH1Vlx~E@U;>_jJ#+W&>^phQtXSNMHz966l1+tF>R#dteBB%v{6v{@dY^ z4?p}^5!x3?h`s&x+hOV0Npz)6vR|KE-2?<77m{qLjLe=J=x>jH^uut!nqUMXUw!gx z-YUebEMRYK55i6jXYV@+1GJ5AtlogX{EMeh@Vx}HvywobU4B7w>(B$?nXt6NDa8h0 zXPTRtK|Ay$T)1!+<`9TzlpyyZxfe-aqRDFnfTZYGEVxxXazuWR9R{Ms#bYd*&CqJ9 zMT_Y?%^xEcIzaR502#_bw?Q`64|NzP5N5=Hpc8dV zHN6To<4R{t$vqw|w~d-Xc8oN?JKq1ea4KE>onp6wF{I&`g>>ir|8;lM4ti*bj?IGF?Dj zZ(7ItT)TJ!`}n$vqtq(uFDuAk)=|SGa|uv$>|mpz$v{&CGFWzUQgm_9+}qtli2wy+ z1f2m#fmY0N#dH8+K%T#nHd$*r5{n3?xEWp*#+MKco(qTtV-kxy9bq^vjw9FUGc|)2 zfzI^w3~QFBPn~9wm=dUq<8__Xr{NMl8l)N zSD{@z1@TCPH($Pj=beG2v&Z0Pe)hxg=YLM~v))IsF`|K-!fF(DxWYBTR9!33$drLn z84NH}6_u4cDj53^orgmU6aWgn2b$C?%qM8Tp9BF04SchCR)uLyF}fxsbG-2SbqfA7 zbB^{QrdL$5v=6)40bG}n-d%$&+bby|3~a#J9R!DA0e40`pX)+uxVZsiM|yM zer*I8VlYUMU<&VTi6Y2pQY8b-9^62ai6Y@^1pRaiP;=i({fLgC3$03Qw>;_Xq9cwHGXpWG&7rJ^tR5-%n9QK0LyadN#r5#zwZt_ z!vK=cc?=LTzyTRhilz``GL3oBCH4%NW~V|XHVxtDfBqjlRmK!S)zf#53q0kogvcJq>Esbq)@&;T=?Hmesl zO%n5_K*d4D^O49@+S}V_ov-4y6CGq~WgS&jDflRefUp@}^RCo6iE3hVn1F(cEHW_J zFs)?pk@$Bqoruv>pPa=3n*#Zkkl8FPpM>LRu@sP-V{j;-m{|q!kloGf8giRA03`#U zL*oLW$%3pkQ%KA4rFnJ^ZEkMfmtV4l(3B6<|Q8Ye!;wZY;C(#2@a`YwB(}^~N5S5P}e5K|a zu_6MZUiUyfNz!0hNu(=de~)#e2g#pTS? z82X}95D4|rZ0jRaIzaQXyE8!7C<4$%1-n~)6tl^kBL*e_PuK*TD4YJ#c~1K*rNoD6o0M75h^kXhz|+i3I~s4U8ji zPuUXZLmPWEnLr(6BduwD#Xn-29du2%@Hb*9CGOXr5Ky7x3td*m_;U!xqs1&bz(4c_ z!8X#$b?l@!(KB?D;=l-C5L|Y)HX%}A90J5V*5@<=&@`T465DMD*+tc>ct-Zt&JMQ? z%1GJQcF*&!xE^Z;qJakLaY8h`Z%HB37TrbjHgiIC1)`{JzTIkhsu|j!T-}8xny;N1 zBoLdywnkxTPQo}4VTDTrDB3+a6hNcli8%!r0r&p4B6 zEK7>=o+l-vpYN7)OR%xI!EtYBY5aEhC!hW&k8SV4#qWHl2Ty%-8&+0&2tpOydg~TU z&#j^B`384d3hJvkexTr_=y%?B7c3q*1~i$lKrlLbfBfUJ;;(J=JKM^$?JVK@qbe6K#O(sydLgp|!27 zS=*l`>#`oGK;jb@_4?-h$yt$sMNr`+WK5L5C}ehapm-Gm4)T^DaFC~v+{{ zQqt=bG6ZBF?I|*E@H=EIttqVc4lsz6^xCF#0G~&|L<*(FgA9JvK^EC8?J212V8M5= z0yYK*_}7DNd@ei4RA>>(Z3LGC98g-QvrOYNouNM<^9UU$SVm$mbpJGOi9ls{m)bH8 zVh25SRSQ@rv!GT+TuXi;jqRdJ;&d5hp|7@%olG%cy+sFxj!sV?-L%z~2;mfzD?q~l z!!m%dn<->Ilm_@TvYHe4diIvH>^7IxK!TT1`Kzbqkf)}gZyMPT&}$l=EIm&i6xisi zW_}qs4TI1SSmjy~z0hEPVtEd3x#bi;gJZ{zv6=ez+i(AN`1Geg{TP}R7nx-vkla|U z;Je>DfTx~9b7g-3x7~(_b#?GNZ@AA?h46burhfi%16$ zlZJt(GM&aiDQI3B$Qngn&*1KK9*n5-m!hareHSfReS=vF)xZAE;L{2k{R&#>pv*>6 zPJ{-40Ms_gKuDIjwxgu1p!gP=ecx3;*~9O5@fmLqL}%GYroDI2W8kOA_5EGR_ZzXj zO(3vLU`L%s03u;`mYy5_by|f6ol1Qium(fs(E&fl0h{Zhv(!=IVML2brnfN-ehvz} zHqC(Ajk}BMT32kag&~3WCDFH|Zf^>wXe-cgeMFmES98h?V!QM`rH>)6?a8H6ICvd} zGiT1Q>pMUK4h=UN10sp_xY((?Qh!WrC%?ux){}ql&XEA{ZXPfKXG*Dh zbA1&ac<3%TbIVCS3rz!g>E&18%H^w+OiaKBAK^tQZoxT1NO`ZT65hEyfUiHb1KiksR6GP7yT+ zk)}#u2Sk9bD54Yrsl@u3m=T?7ioA-%&e|xHQlMBVe{C$&1eTY8s|6w%iY%gu%E5G; z)F?(8jV6H83Ra|$x~Q{;X2z2lH|*JqqL=V|vp`YUHM0>8hy=O61IloR9ebAm1kvyS zU-uAD`kY`2nPq<;*&enNVv`g$(d$Cd#oAC2w~h5Sfyd1tHJa?S&`d_nt|JRSN?I0K zsFJ*$6cD$M=cIHi65U(5dBdqKROB^RbM0UuW|P$kC%X%UdzFg9bQYQFGROum0v}^9 zG)Q&YZErWyKET;#t)48I3L;6h2xv$M=BWwDXvlP8Mw6K)V9zPD3Jzl~tQpnAV4=*1 zj| zCakQzjw4N%J7$Fxk}CGr3%9{tcie>qDLIyb%pH0FTvbN%vI=nUNq3c1HU%jLEc_er z47%@ER<3hU0=$E0Yc6Rgsrp(! zl6#p~2aOWYRx!Y$sZIHfNbsy>E>R%XM=3+_nbU8P02tr5@ON5Hk^r-VKst%0@FX!p z>agvS+f>Q*C#C~OdK0L34|pyeF-&q(v)-a}xfnbQT?<)douJTD$+_Njz9zt-T2Ibw#<83ncqCH-t>99_ zwd}x_dRgp*h$Xa zLjisiRoT|n8*3kLv+52Zu_Ucn^M;T)@cJ8X;`P4=t81$WIF)46^YP(6pzPKD5v% zUm1wA&Taib`+$Q2-Mcv(oFG8M{7RrAru(oyW4PkptV}a%1_+L_oMF9ZSb(NIwy}S| z_4XTZ--EZq!|!_#uCK1a%dfu5Q=z7j{Vk&NXmNH9!TA__=brqlZxQ%>`Z0W57aOLJ zzZfD41LBNnPR~oYexrsbzqSis{n{3eZ~-28K=h%T8?Q>r#R1KvZS!>dTTvIfaPBtA z{#QpfH5TUQ6Vi)fCZMimF_gC()jb##UVr0tc;SVY;L6o2=!u(x_q^wBJl~v9Ved#X z63SedfqS%itOX1-?`&T}4Ag@`or5}#E%z%OF}R>7ol$fUY7pjKD~!Txj@q&?CQ|r_ zOV{Wl`1F{a$p}x4T4rhK4cl=(*aijPeAJ9uFMI)KaT0x(+_|C9SRw6DsTSo$Sik6O zQ9A>ji&-K>9o1zHkxV+QJT-&OqOa@9-OjaVM-)a<*U??kV4r;-gU2+YvVNoWYnqC& zm=M6*A_vrQIR-BDM$~ zmT_=9ik)T|*~}@Jn_rN8<9fU{SU2lTI&d@BOfqfap2W-uO9(L5DWgKS4Z^Wb=N~c4 zGT;q9V9V0RRuik-XCAu|WeQ^u{8wDM?_&b-b!P@#&c;5%^hqLGadhN|O@$)9L z$A#G$4hp7B50pCf`ju7q#^c|G`yRSS!6(LxevuHp4*m4r`HdMB$vzFl$lLJD^SkiG zSNGwi7dPR~JEu?|T1T(gHtg(g;eP0e3MDThcyehOZo$!l8UiJvrmi-Jh^S+MUwE8n ztg%G_A#&Z3J^9qPzKJ(C&r>caMyRFiqt=O)1U5Ys$*s{61K}v>UQgIhUm6{oO*(R? z6&tLRNdu^C0+v_*Fk@_b4J;0X%b=0hoL*7|PaAQ#W)*zWYwDQ(Y#d6A{(3o|% z6i~_6V~@!M$%z1F>-;f|BhpcF@KDpGu=)wXm;1G6~s6Y$VE zw7RlEH)fx#8CV@=k6`F`XE6EiF@bMWduf_R+5p__bfRG88F~KT&osq7B_iRd5}Q3s zeor9;IdC-`NV?JUdhL}rU}JwB9(do~ycXW-&6{Z1v|*kBXNKoil0HjO*3Ufs60Ba` zfcqc1ljgD^`26EfKNd>_pLBl-cnk=O{G*_%jmW$e!i=b_>zgG!@x(fO``aiCqD%AP zhgyh+yC|-rKN%Yb6_|i$9+7YvUG}p`$;j0WOlezc)@a(w(13J*DE_d#LC7iquf6^{ zyz%B+@b;xk9FcwO*aBR*aDk^#up3o9RkaF|lrEB8?iBvs7m=}_C0jE6M%Ys&0L3e5 z43fqGVroE)9<*o=-rW9`1)=r(%CuCtR(J0}1#f>stYKvj&+14i zdxTWJbbdQD|2;KQYs7_{VL^c@eE`Q zC;WZ>h1YX-Rs#gR6lWuFnwzuQH1O6AA_@5N!5MUrv8x!vY7B_}>{FlO{ME4@(S_2z zz{tpNZI4nHKaZA2HCe&!cb>&(A%g)Ci3RlBO;1g5U!I(p;z_VyyZCLc`(w*TIsX+7 zUIaeBi{MjSghmxX4u&u$pYO(s46G`jzT6YSvYC8nNpbGjEH8*z^1{ z^_a<;Mw0#C5_8k<(PyL&J@nXY#8xM%L5|-97?K&|K%npQ4xY>%IR=J0Np8xChM}4T z6soCYOi3rqnoAozlbt=U%3BVos~ke`XkZhHE$@s0ADNW~X;Gg=(6zHTA|Khx$>o#m zfH+PpW{FIuB^-UH#05Uop7NG%EI$9jyjZD&1LT2u0?gLt^Lxz9WN1FlsOKrdA>uJ4 zEhuDd8=SFbQb_jv8;nyoOMhY4_vX87ehw5fUJfBB{@M^QL=|~Z>tO6 zd+KGl@8P?U3~X?aVc8Y}gJ(wY`7i$QW9Z7gXj6qlQ8XwV4AD7zFNKPpNIKz821ZJ~ zgDy3?-!0)g-`j@AAK!*6S9ah%_f5is4j%*&19$Frw8gR&LxtQ*oW$suUDRBj=H$M|8onN!1b5%nUL? zlFcy!8_Ho5KohmsE?5c(4cvuo0M^&EmTYp-va7-LS(A2X`_6WkLPpXG)1V)y_0y4p?@%+|!LZ5H182=^D>vcQt8c>F`#0g-@kKa;vdPI4OK=n!&!h%e662wu%bP1(aOw4H zaO-Vnv7fD?rEmc4iNGrr^PJZZemnf`@B9~!p-1Xspbl2ZsKm?tdKsJk|J1NxWRw1% zkH!GWO{YLaNME(!^*0aT;^XV^%rm>_uI#}3-Vf+0Ll=1*aJ&H9kH~sXAQPIJnq($K z?1CvY#qxu&NR73K};}F>G%sLOgcG1mF42aCIz5TAoC(&my!}_XQ*a#Vz zi5a*^q;6mDBaNIc+CuG7xdwhY*d$h`@lOnD$=&Vy#ya)NLjh+<_c3OpU_-Gp1RUhu zBw!(cp(VDDBI_j9LVpw=*4C8~MCh#{7dpdGM{hoCYX{lrA9D_nl@rqK2r;k@8qzt2 z*h$`2hMAMBI0_D^33LF=gwZGCWoTkZc26VKD(7>tHxB=tl`lKj@O|e4He>_>GKQRM zeZkMKM5HcwIpo*Y-huDD`6?_S>%8sEGMq!l(J_3MlxvG8V7DZei$vv}?H-!Gi}30z zm${8i%#@rqnZSqo_5d}X)?k+ue{_kr3!dH|)m6*@6q1>hKP)R`em6ean1UXfRUmo$ z3LUBYaK~*W+sfR2v>u^3x)aj!poT@col0d4jL2kTMuDQWoqpCO#C=arvbzU9K&Z!;W8~>0vR||A8RJ|B5K zASU{3n4X(tA&$B=bM^$GN#*Hv>O!@5{xOsC;Gt})f zI34WKGyoBl<$9%RN(DzGCzG_~Nt!K-K`Cr5QRPv*K_@g)@SV8+b;%u$X6;J{iTNZ* zU6Wm(ON695keKh@D-D!vao}A?w6BgtB@?i4U1KAodLV!yQsLr{*5iMk*tg{wM79N1--iVESimz#Z(^aQz4{wFQ*FrI*dm} z){l+xS?TEeUboMawY!}@eB*21h4vuAiKRt2vABTR?Ig5|7VA5_+A9LjjVqg+7mBpY zSJ4GeePn8eG89bVelq{AhgQx0E=dl3Xm#H?KuUyS>uiO8c<2P4Y!W+0r{olq1VoVp zqB3Z5`p80ZVu8UM#1Q8MZ(uQvVD_T5%SpBAre`K=_{aw*;gR>9ffrvwlkDO;{IlQR zg>&Zy@S%?&Q@X3eHM>I-2eHF*>;Td_a$Rq4ZS%ZGQrSnIbWA8O?Jk*=!)z%Bqhv3>ie>>JWs3=RwHpgqW{o+NXUPRH{z&TkH{95 zQs~rYTFuVlquds5_ernzYqbdI#)@vnRxCeZXcNjZd$9rd&_9rhr~V7$7rjWM{vP!M$@|@^kok0{D=4QaNfUz5G@4*D*chj1#YAC3#YDj| zIuwG=ZN3)zCwY9bQ6^?plDDrq(M)M*O;nE2Ldmg%pb7ZEeJ!~EJbm1Wj*zfJL9z!ctkO{Jdb}2;yOtmI5nwhrT{aMG@Xhb=! z*7nhu3~L}XG}0; z!WfY@Rg91P0bm3`0HDbdvn}ro`92mjm>Rd9GY6jhJeE45PIbr8+4_XM=JkP@IpW?n z2tMl5@0K*Zageu(WMbq@7_$0H=2LW&C}&AAt4OIEZe+#^w%e?QU^uoY{FwlGf(?Ag2oFv7*$zBu$X{{z&VC7wT^P zshaY~>>~(Jx=)%sP76oTS}vBxp^9M3(Hboad4!}ty!0@KJy6y_WF(Q_8lEz)B+Va; z{~SFM;Jpvcq7F0!I6|MD(8|2<>^G=X(`pVf0xJ0#0nWD|h`%C@?D%raU<=^6R+ zZ5;Dybkd=F@{cfnYcyQQN4@c%y+cAiuBA&h8gPWHT-w0v(P-0#mIVo1bLL{_&fT~9 z2pM2_#0MA^H5Hh%zpN1Yrtrve{I`%v@psk)j1a~dWS z%S!js9H<~;dwD7LcKSGAMwmR(K`+%67<3O9bY{@fm_si#Ie(_7CV90RGP%}QcA)B0 zx{O`cM^{(Y(IP035X`fAPMATtlPIGnO*C&8ZPq_goPNA~U+<9%v8q2st5H_C1A$J} ztr&RdJ%bS?vZA~(1FhX!Azbgn<|PF;X&g;p)M6fOG2Y<}tgJOCOPZSt$b_cQB%4Fb zYQtBb+=uTz4Vs3f5;l& zaEBeC7dbdNJqD-3&b(l>Vul%(@1I>G|LpfS^f?ZdbL3h8!(9w=&CIUvIs|0EF><0N z@Bw5oCu#=g_XHsUigl=%+ek3vY6ci(EZN|f7eo5ku*WuQYIX?-BTUlD*En;`3T?;& zaTGW+;BcmsVXS%Z8g0SvSAj+AEFXl@HL`mR35dd&9+%J+66kpQjedCV-2RJ+i(=+5Sp}WtJAQPHnccr zx_F9tejS1jyzfHQi_Cm#%AD8JKV(73h~&Gjya&=Y5rAaLTWOd!cg-p`j65`e#uR}= z!KiR%95aMS4~)`EM!56#3Dkh*dHt=gezgxzJl@4hi0BIML5G4CgSfPb@yyTRe$$h% ziDES^Z!^(qYu@8@*^rG4!z0@8eHeJ;$0ZkR9D3N`%)+~14pMrZIIg~6l%0)q@k}2G zL;H_qBiTq7^52HaT4!cd&H$5k1J0W4p7Q!=ls?8L`zsPq*e_-#iS7bJ_XygFA!8o~ zV(CV52S~`FBBZ;G8H4m&u4DE&gP{yG8(;(A4BY_1uqWtRbpS&HKu9`IV*M~O_{F^1 zto(LOj~`0?NLaAVd&=u5LA3#I4lsUAl}s3{@H`{{_i6-+HkwAeoRFN;7fbTJ7XML- z6ml}q{=1t4Hl_LqJe1yeW#uN!&P^fXSzxCIWnYoFH&Sdmo^XwThpvg|eLVah;Xizg zl8JFT2r3*elveUzf%s-V=EC`gy22cd#pqL@VQ1DZYstqeeaEeVOIb4V&q zeK=kTxt9!vsvp2c$c9jdTLjb>N{709F8@ z^c3&QSqsYv2BZ~q+f!Q2+4e-Eq2wK003v^cvDpUoVK*tSb);tJ&p{z)0ZQnGMki`cC^JFPv z0x8RYvf7lnHFn3L|)X> z``aywDdyFGYRR7)4kQtJ-J|@w1yZj*^ilb4; zomO!-8wX>mb1SE><73q;goht{Z1ncn@FB>O9ogV1m&x%Nbouw_a219QY1|HL>cOv@ z%IZ4|4T7m+oUw8()sau4(|&@afFWJ91*>}-FdHbpxfCgKc!vO{{456$a@rM|YsU+ab~yhN#f3@WsK$yZ5Vr>Qyn>Tji6ue3r=UpV z1K@zUnwEt{Q>@yJyZ~E?fBkJ_Ldb@y8Dc?r6Vq7GsmS2NjHr#^MJ!0&^d7HRG`b!b z=vd>s^R7E!ZEY>S{qiLvA^u>Z{(0i>I>f=C4zvpBU=UEgLgziLmsAJq7s0_KNV=RH za41Znl=nQdL{dD+wTdLKD0$JgADX&=6cJLRY;NA18!e>yUE@?)Lp$sohaDe7W+Dxp zG;6%+eunPDezP*jbq)bpKc~GmsaLZnj2zq~I9zrJVWi|nkj9=Wf|XUvIl`;CjCEF* z((8Yiy3BiYXqx2N0%Q3;v;zYO5LBfYo$aj+n4dWYtJk)XfK;%xv(FhQX(|-WM4&z;ixvVi z9Lc5B@z}Pg>%2t+8ZnTF@uVkg0vNByMIh88^A8J%+7GQl5NQ!UGSqZg_| zz-iB6L8tJ-$cz|>5S-!!0?{PiU|WDF+VqW>A)T5~g*H0^o)?~bfu@4>q z^OQ34!BbJ1HHT%)lV<#}GcwH)*jgD-mgWu6Ao_h#36UcDTG$S@tF!&5a6PhMA zR5%a;M_3oKSe`{sGZsnio^$8V!D}zS#`MmfFlgtOP9L)t0k%qrrd!ZQtidqUq9qbo z+4a!)L+7h?y()^n;k?I@lUwmQ5P%4Zf`hTPXRenzJDWB8CSw`PZnED)`YKqD@P;_l z@Z?q#OG%wSooE;bL-VqUNjaMV9}>fG`HV^AKo*Aj?WGXh$6j{Ld+{yr~9 zHZY8^({XiY`)S!i0wBFgCWbSp^ZPoOq#^&w0&Hea(w?-;&HVfvQKMi@V^H-tnD*N1 zJ1{+0!1mrQ2f}iqu-QpwO{DKo2jtaZ3QMlvP9&qw)JDpnT!`*dJ_sMafct#P`xA>n zg=1-Sp-lA{khP^aoiNQrC+`=TIeqbxRTLkDdQrspp~413u|m3!S4h-4%AUsT{5dl0EUd@GLb z9MduR@u{&u6L5yX$wx&4A!u%4_t55QGWhBDqz%! zcX%0wfl_BC`zwKj0rU8J)>{pY?}RGn&%oQxFgt2?_MF|oyVPOK&TL<#x*P@%zZV#- zhcM>-VRbcfjGQwEFD0VJ{4CwAQ~uh_y$~hTyfHA-v7FO7NSYY>;>KJ12s~}r>+SLG z(=$`}H^GytC2Ip{UhJ04Yb?d9%yT(;1zRaH3(d45EzJch!sEhxc*z`DD#hXiBy(Ge zL*RAZAX|H#@{jLUEJjuPv_Kpl-znM5s`e{hIIh1lfc7jFh`eI7v@J6s5~qVOp^kdS zkPXdD&cI90zZ@JXeW7u!VEVpjj>bXmNaV4=JvSm_2}-2coa801h^*Aow+%o|U91JP zO%sZI6c1R!NNOf&)-L7HT8WB&_ioz=3y}wWs7Vv*=KbZzHvlVVDZ}S;RzNqM_<@-Y zwv+AqZraZwr3^5v@0b@QJ42(K`d&xg=5=xhgbp|kKtuPIfxkS1OxN3n@ zVTxK;0+HKk4Im9yHqb}=9Sp{0-KGN4fX{3~@=M8TnzVr30h(UObV`(K1_(%P)Pf?d zZj8E6IfrUD+Kc53X+wccvWOltcGI^agAeqgm`^AK6ZoiiF~%~6#&}{KNKsP2Nge`w zuv%E00lSO+CtZ&abEKwO1n`PqcQtBss@03vi*B z8s;zm>MsYH(Qc=-H=qC97vR#RORinG+gEWsoo;+5wo>MRq#!c_=)<6#ci1s?&ESxo zG%+~QubSVRIcX1j1XMyg)^90}u+^bPnY{aHXagkvODEbtjJO zE+hqsR9h|J(@y11H?B{}?vu42Nc-8+^!6OcJs$=LDwJT0^0^|jp$vtsE?#60L1(+q zp0V~UQZfP`RLon*iWrCxcXl^+*=*zbFHmbC1)2bqJ>Vev5P^587q&@oAydn-q6>{J zDqDdwzLE>RkT3#)2ab<4p_2t^?X9`i!cjCpF#;+u(6yNX$xLlvyEV;+38@VLS9CN~ z8XmdpYzVHk40?1J$7T*=Hug3o^T8XY-O!Lu1R*rU=CPx!F_Vx1pE9UXv2|Dk#n0XD zLAY__2An&07RGHcJ1zqm7*ihq?Co+CXkGh|%S){rv&lgw#!OEe$7)7dNv`pPW~mxt z_i%w@8t#V}3yc7$lC9VPk|A(OvQBK6Wj++!ExCFX9ncksY{5ilMgbBUT03*YnUda3 zwrAne$_7j?NTyL@H`4?>otCBvku})bZ37#)4^^s; z@jlzziY^^rKuCop#xyd=DAtA;5Q*K0n$<)PN;Jtz@|<-M7$$`IRA@qyAWdGgy`_Dq z_wgbn#UB*RcG%u0FroV@mI$uztdl6HdLo;q_f{=L8do6S*f{C3#) zynW#d7vtBy_B5JwY_mq=TEd31C>ttOodnI)Aa!(A(1zM0fBfH!-V=WO8^buGNw$MwqT|;lHg5G)s2l&@p>qGa(0rXe;&|9q#h;Sd& zimH7)e!mK&8&zF=J&-9LBw&+SMiG+r0Q+!X06mhQTocy>NEr{<{f-_has~do*xq^P zy2KB0JQ2Dld5y2=!Hrtstl>G`t&;~RD&vrmD2>9YAxOa~H}UW$`JNB#V{ggxL697?NCMpw}f3Dk!A} z_R9{M>freMo<$BtifY*LTZB2B#CXEI054}e#Qoj`TgTD z3yY)Wq-}F^GZj(m1os_#ei{_I`v+rxo1B{9ERG}R-`KSKvTN{?;^WJ*B?VE(%1Gsa zh4ff&2d|+f%OQF$5q;dPqxm9KXMmV&)&RW59jCZy7i?{Jds1U7Yx#pqBH0HH7y>AN<{SgpVz%t524(L`fS z#-aq+d8Z&dZWN~N@h?9C-}w5sK)i_@fW<@VfAW9+yKw5%C}6FwZO}ca?>|MSum&V6 zCWM0Bh+>Utq%^2!%p{;xOY-=6HchM?fMmppoThc$Ml2&Vg?qpH zVQu5a^&5>c(LaX`V#tW%6Myw&$aEmjSdCcF%)emqCo`iIAYe;wP>JGief)8G0Ii?dXZWbZ%v(U0&*IXwC+^>$F8#n(Q9`;Kyicin<9 z4+@L_(wDy65UxM=vB!dR;6oYG$UV?@?sxwDZmd{vEtPj1gP{#gw7h)Y#i*%Zna0-N_3JB*{U;|U z4k<^Mm{lAacrxZ`dY^KKG~5d)bNAr63PD2{_`YIcL4-8wmQeyyRE^XQ%sJBA!fZHp zrzL<>>Vl0t#am}9aNn+EE+@zH)ylkdNpW#=guH@yYo$6!^#)-$EH&M0(3BK0G?{m{ zdt>&5ura%B;DXV4Dw=eP1ue+khUOS)J=G54Au$JHILv-1;tB7eLqLSIuZ6(VK@3K~ zD)1Pfr1$t8?a!XD7R5bAjiLkwA4*&_Zlk2|%1$EXPUrf<)Bo20;~#}eW3j|FA2kwM zS*6rsph|x2)l2YG|Iv@Y-*5}hJ^Q>d&Or2?I_S@R;%7#7Tv_qan>)|u))qha`|iIV z{w5o`yQKhXCZU)Z9{IrgN6Pm@oC?0xeVSjbbDTJFVtj|YaU%zvk!vK^nR%o#Mg{=Z z!F<3Q@@6eBjb~hBwq%{N!3qyEr9>xcnyv3U?Iue1F2HH5t#Q_9 z>Vg1_nQl3ArH$t$%E5stc{B`58eWZ}CG{8Ti!|y-qV^JT!a5JnM%N{%iSfwlu|-<7 zR#+F|9MVaCm~D$Yx4C&k)J{5bA5`B876vrU zUX^qoZ(~MXLB0GF zlcV0NjP)43Je2t$aK<6?+Sscbk0EG=4zC&SZsOT4Btl%+xN2@1^-SMXRV^YuX9mz% z3}j0jtXqhg#UN71;*RXe5lB<}N)p4fd?6kw{#h1+gsktY$)%qu21uBXVK4wBE7b4T zzi?HXKblb$MgYr9d7IB*r!0~^3SJ>vaU?{O>BaUX-gr%{2f>&{<~9Kk?%P3@*hhTo zpq<%A`?Z6+w+WOYn_z?(flW1F09rn~4C6KubwBY7KWF8LsbdRP%7~(Mi{HQa!YlB? z^Dm2rBYD*LhtsFW)9M$V$NgV;m7XEj^{@WwC&rdzzq@ZNm$#**<74;R+S-I+GiZYH ziHzC4@cBPeZ36%3n`YMF2OwUu}4pkNgfl6eKO$zJUH<&)!|^{@WgFaNa$2N8Ic=fb<| zF=`fR$wxyI#+Av$X1RjU5d^`pW!zZb7-CauP?^SKY)?5B6bNvx+zJY*&)1g@LEd@jGQHOImaCvLZ1V@^w&_LRtD;O$F-H1X87p-XR-u zQvJwFYvhizap&Cz^=N{0Y=D~&OSu=!6rnmd)B(Jwvx|Q~F+dX4Tu}fYPe8@bXp)vF zG9$BzWTM4>6aXRt8ineJ-`8l0kr~FO8Lfp!tL=1RpiFGzHu5Yy@ZbY^k>7PA*Q*K0 z?BT0L$UAy${Al>hvoFKbPd~?l#LV<0g3sta*YKRO5;5lx;&yo0=t>=8SbrHeYLk|O zrkv^kAd%8 znm|Ag{xDA$v7{00%>`K-<dp&6OijY6ym0gAu~K`7FCV`P%O_RO2`$2*^4Ese!_OKPUN5ErRP z_y7J6zkh6_*+H|1bNm!K5tVkwXLt0Fn4otq-;m6i_)y2iywJ9Olffry?jT}4aa@G! zih9G0XVb+eIum2hNkEnP?ZaVWyXg+5`F!H%fA-K0tlN0t$@B|)X3K|wJ$IrYbA`v4 zUdDVzzT-0Lhmgj;kzl*SG?QnZc@Dn#mtRUJg2a}7K<`W^SpP1QPY-;(;Ecu^JE=ras;&8C|d(wcasxmea^0V73 zgO-Ah^;eTzs0fr=XV4emiIoGdu%1v@Afsc5#R$<<49W$~DUm}MV|Ll&c6O4Z#qa=- zBU|PniwUHZ3Z}!uD2w7%yVzZ)!AQWMAc8v4Ir56t1v4NPpeYUN0E7_{%MoUTuJ}L` zTSL)7=l-CA%P(DpYj0d9F*?X{(4q%%EKy59h;$_soSAvN|3mMGaT_uPPCq0QRPkSQ z4-i`$7mz4!`L47Jys0y%$9L+rn;bW!-Wy&Wb!;Qv?;f~E)mq!~$?+PEx$W(@aWOXs z!lbf34L=BY4&A8px!8=iF>$zXs-4uHy*1+y#t6-}WvwOnP^fG?`Y~kc9n#U+)0GH1 z*s18d<>m2SxdV?!N@myc@?oI5m4QeqGrc*?g!aJJm`3?=16~%@F8AKlxulEw8ffZH z=DCg1acEJ#oc)mY!|rvTY!#$3M5+l+Hf1(9W%LY1u3SqY#H(eD$0C^_3$-zM!pcgq zLTEO05O64;I=S!ZM{><4@QH=rSr|Xi2{SWLk<#QpW+qtz7%P-tCgx1Z`ctiGFCZbe z`jw%U`Y7s(Vt*)>AOxX&v8Dyc1_Vmv>57~&u||`O)4!q_R<=Uj_4U1?a&+?A-z=Ur9(jF%9R^w20gx>J~O^!ymRRW^r`%X zBq}@1L=->)Fc%{2JAa6lvyz4F(}NzXISB1f=D{H@YHIivY&UU;iIR)W^v_|gK(i>BYDzZ}n;Cn|I5X|Aec4ov<3k6Q4jUlk z{6cpr&~b6$(19f1lBsC}xkw_}`s$1-64)2aEl%-h!B)B8{p-Y3qNqv1p`s> z<$dDc|McGt|N6iDV>ZEPnnn>bvPZ8>a23hIE)o z@hqAwU;5%je*e)QdGrtyn0>Chhl^#CTY1HNis%X(~{ub{T|kH56=-zaQ4B7(JgTsd%!tswJ?1%wPZgV zUdC@>EZ`&_sqqII#g`ExVS*qgC8x-U(U#Taq+vz_$;(x@B)3qB;4*V`3T}Vs0{p}O z@gEFdd3*s6*+`5vGmxtoPN{5X4q-l*-oCEFV9h~{%O}U5Z+CZ( zC$x&YR4Q(Memqd--j~BbWy?DNn3y_lHwHrj9oi_b_PEX5%=T<24$+ukw0^yD4QW83 z>EVjw&LctzB=6W^;6TBd`DQF=YHD(9{V;2<$>2S zpwsydbGKf;d|e)RDKSH|V&q}7#zk=EkKr(LYHMp-c2K?Lu=z~{IER6bZ8tb}Cz%9? zvA2)^Q)=B2iqfQmTOL_ly7~vb zVkM%r#VIzZa_U&2tA22RuiZKxHqr2}vu&<#!doxDMJYTaZR{X2&{1g)>u5jB_S93) zg4~DbTom4pZu^n_NW9+NIgq(;eNH6;voqttf@i*quEBM6m*yPKGMn#*Q~TRSu=9xa~R9K zVXkv7fE4N9Rs0ZbFTeCMK#U<1spH#kU5fB;xsmXVpc7>(1h2Qn!n29brt1^i(ZpiW zQov*@fTd+&g5_|RsT1Z_r)f|!J&N}R4gTlJrEqIZhYb^Plg7u!t+v+uT)?;A%Pg~3y0o*W@;r#!LP-?(K#qV8J0

          Arl;j^FlJS-xUPT@s*c`!lVzKS6ai?M#Vv$I3XTA@d_)L_6u(^!J9)nzuj z40u(;^Cc5YA$r3LI`~sxMtvpInT(a3LKRupo$h&|1 z96a||FRQT)4XTuv%07cB`~vPmGmBses@XF}sZ<4I7-%>?sN^|d8my?VWk;i<+lWr` z8TSj3UGuawH7B`O0K@l_GZW!I{lEREFuZZry#MmQrW@ncA#Ku~up6GlPeNPZRaM!= z8HoZrP+7yX0f_Ll&@h0K7c`VK2ULzygE0%eXUqLoq|u|fg=8Mt1M|;W2MXh6vuBUI zF)9EwAtES%L?;_#iqSN+h5)DmA=zu=dcoPx&~^xiu>Bjaam?|&b1+(%F_go|iQ!}n z@NQeibf7V+XKwm&d6v>|d5MF?;S@pG4JZ4O{5p|X2iSOBb3!|g>!FoI(e#Of!5~z; zhI%b4PXIV0F^vZWe3+V<61I)NLoq$}q_}xWqCOFnr)Uj!z9z3$N}x074}>kn+JPrG z0qGUX@!PFtMIQD%Lb9?QgO#BKh9rH$QCHnjC<_wK?Tgauvoe^9JZm#*hBQ654=1kq zaFegC){{__t+u8dpps9-f@C&5?n7cN(@VdR8UvCBOGcSx$B_t87CPk1*wV24@Pc>np-HNy|M+*qAmd|= zvez*nlrH1v9LHY995UWjeaL4+q!FexvfofbwO|b}#&o>J3wb@HF+d9Ep-2gUhBTXz zddTzo*uIB>Q%s8o*p)+?u%Bu#MjwqGc*txi9dtC^MT-SzJ_L9*Jimq%!&7P4=`EaG z2lEs}URgF$0-)M#o|;u+iq#=8d1|u5sd4)KJ~MR6{cO5U!taotnrE$}LgwRLt|07ELDG-Fx12pLWP7;A`yA+^{+j69S&73Is#|$b=|} zfmjet0-k7%*OPRyLqk_~d2(B%H>Ar|9G}Pu(rjhb${Bm)2d?bUz=*?wYfgfXw?*^b zXySiGO9X+W5Q&j zFIlSCq24#N<$yQLI_(+Aq69er38P2WgY38rElGV5Lde3QAZjLtK>!_#4SXswyFebg zND=`ORuJfrxkavZ?)#;P%I!|Uz(eL1wKXxXkm(Gf3&~c-m;eex3 zHl@RH&P-}yER-mWfrFo-v`Sv#wA5p4Mq42#k{H@iiVT4ChNKb| z2d$<<)>3%rF?tupF~*mSwvt7Zq(}69&1?t+i12U}l#%gpg_nbZ;)5t3EMNPgmG>)RuUL~0lv8o9? z%QWkr=A6+j&@1;wS?`vZo|#k)QyChxADZS=v?_*7qw~6L-mFLW3-IKPO;3;mR}Ml= z(_{2AjQcHt8RRS_q+8K}GUFzGl955xRf5EVV$6@pK_k6J2qWcfO!|yQAG2Z^95w*o z&)+O-%wLocX(mFM|HmlAW_W4ha$&&3YzR#G;B(ZxE|lmzN+X>4nYxh%7cWuJtb|ds z7q)mc7)hzx7Bi0)6l5GUB%XIE}8Sn={c zx&os_)3z2sQ(O@v(Jp}T$ppB;qDv9l+@9cB-81i%LBg#RdF^N=vhwS$ps2ZRof~(<$ zz0bdg;7lRw)H(`efK^5ett2HDy zyUg5TlZ#(vGAWNevPfXmlkxy4+3`}Um?%PX1oOd%3?DUp24(wVpbHK@)bH868dSVY za$TpI3;wT?!XmvVeW^htLA_le3=cd*H=XYj5(5fu0U2`YiDf+hMeru(0|fnC zh_9==)rXnIDcIfIH>RUYS5in%5ppCQ9>dI30|$L6mCe@BVUEQ&d!hxXJtu4Mt*w(R&Cw;6tj1pi!*RMlIiO#5|0U zLeK2d5pvhL5^or%@iZCIFk8wB290`fa&Isyu{;_?DCU-GK(0t|s(4vuMxG~r5H=n4 zD~>Odys17INEZw2)aU@u4hzz6Tcu1ErQZhwiP7t%|tLwlN>gN4_E6kq~se--=8$S)l8m z{?o-aR!bU(7YQc&+kSOk``|1FOMXkMa zP`C!^KP_%pA&G{36E(R!d6{Rfl3HZ48e*c2AZ-mS?Uahlv8jn90I?@BPGnYVTgPsD zW{`ADVa3_^_H1QN`!@%ygh+T?PNX z0X}vj-x;#2>+cZ2FBXcl!bPpT7L*n;U)TGO(FP~uo{GabkZ+oAS|R9e$n z9zjf?py8=(ZqYni2B5;G)Pb8vP?%{Fbig0ywUGm2E+*S39IYlzoOZ()tnG}l4m-f< zRxk!*Cu>|kjuEC4H3)t_ZB>nP$QWgUqG=qB^C);ZlS$>)_Sn2+UY4M>Jp?Sn*wMV^ z5Qrski=zOhAFa+)y(08sGZ zMO65xU+_5!d!ErBDt%Lwg^zQA3tYm>U%Lb!{f!61_a1){5P*afW-yg$KGAPCZzm-* zTe}T_!LBMlnLFG-FeuOx0nz1_4W5}Bg%xy)_f?$5g=IW18f{}wWlhD z7&0)@ZW~i=MmMR{kLM#ZIF6;UNgH3xPLMO1v7nQiXfV_;jU5>a(vpvyCk!(e`#v<2 zkl7`I6F?hM8aQIW0d6}qL8iG`qs$qQou>iBX;6fOt4)*E0Te<|W@CAj3(f;2!?4Bt z@CmhgYxQi^l>SB8JF^}D)q94$YDJuwoC-8)G$?9SBO_8Asx!l8@aiEJW{LFjTh;;J z8%O5tGG-AJbaPaT_P<{=7`D=h)Xh$foJ}uYDKMr)(~6)m*N#G7^TLdHM8*pJ>c4&l z9{%Y&;pF+_@Z6KHMs3aRf*1NwWB`ziWdP-;5b`IOH)TFq-Ka}h=CD#B8W@1svo2;l zD3HpMLE@E?hr-OMlAtR#r6g29K_#d$LZ!h`Ntt0xR-zP!8-na-eL!roD6tkK_Hm$M zDS|lNtS()Rj7{ux9$A6_&p@1gy!fIlS^&a6%aF6#Y@`i_%KaV%wOertXC`)ov&rPo3vNTT|!4eoHz^0gE zV>`8u(~vr>WFWLrH)w(|#vEJ3ue7X%GC&*HsmY~XM(aI9TR1SUD;BLMrqTSzM$?yj zEiwp}wk6Dk8IdeW!TsJmsa91QQ4P(<98)#R8TmUAoc-R}DGb_!#nV*;^<2pwYCpII zt~$9OToIK8WMhx&K84r4oTFCim7bkwN92S1&R@KO=GS6)=*RDc$+)&9V?!XZn4+Pv4HO(v z9W_~5;Pu1k^c;2|K6od&F)g~=3bd9S z@4;RPivJ0vMnH3LWC6ZZt$HbSG>LipGs+TWvMcCo4i;RK`Z-_dFc|xhW754Ti2{E* zPKlcOQtBAs0HH&mbi|N(uxckZ8C6N3VP_2X#Iw=Y$}aZ-F{D0k4_#c+4xrY|>;w)E zF=ha#*9)l*hX5x7XUN3zSjXl9jO>jPJ27N}vxv;t5Xq}Wd2#5q(`iT4XUOylx@0k* zhts2SNA$3z5Y;>`D6&~5eDbJO(EHGegIESiP*C@3J(9IZi;m%qW-4%7ZUs>vi171- zYfy+ckO=_(RFt6PjiIpmv_%6U+0j1Kk+_96NbRT=9M>5@iexs?iONDUl<~vUPFxht zTt6P^oRwKe3Ar&-$Z@~bcQ#?|@>UaRf(X>LCK&TJZm3f07Yu}YvoYqCA!B}RQI?UX z(hFlPWQkY(+E`GCnn${hnj0nBK^Lfc8uYtr^^Zx`56c;?q2iC{uWj z3A_aUUa~MPp$hzzi>y(5Lj|X&`VGHrQ)Fq&`bfcZZQi~#fY1H;COrS_0pIlPw;zOG z`lT5-bK;h;w=N^n^>(uc2E&oW z)M}NE>az{mxvY)awV=5Lt6Yxxw3)r3NtL|| zCEGD~H`&N$9-^%87@rP}fzN8$%nrK(d7m^CJ*64qK2Z9-Z|`jLAm7^_@Z7K4?>$XP zxWdU>mIW@egzo+(QsCcySh>0eJG%kC`^_t`d9Vs+&K`pk#}>oP zKGo3JviCt*iwVkwYCTb-lT}y+9nQegYHALdxyRQlY}ubwmY4xyV}GqY!z&q4go5&ncfu@ukdf!Y zM4JK6v+e0Kqkf$|3eT>Xh)-r5;?rHUTev ze;+#2H{iBAXCe05Ft;$n$(&yN_B$LLws6!}B~9Z(2r$xD*`!X3mSsisazSW%JW_ch zjNL*$#3iuc_F~T(u2t?X1-#;%)em{8~`29H1%7iTW*my?G z`V&?p#fY}M4~Euet(m1}rzT7k^JV{F58B91ib07o#1c<(T|Rw0UCZx34O+DI`#sp% z+=DmJfphiRO=wNkaQyfYm`30!+a*s<-$8fz-T`G!h%o5lReN~t1Ny^ui|?ymEi1}U zDh+DamHYuG6B7{P=S2hgz;dxFzDvh!K5MIlR85Zy_=NB&ZPy^npej1anWP~QwNo*< z)RD(0azdJ-!6Qq-$}a?EOpS^T0yxZm%srS@Vp*mvAB8fVV6TM$i`$&CQ?p|*V-uC$ zn3Akllm$KU#e zLP#tJR4)r|p}@$vZI3b7)im;Q*+QN zIzY?(TzYL4Zm#UW@l$hh&qeAi)?xjd3|PF8=OxjOSY#g09C$*JG9dW*GznGChWx#? z&7#Qfwh4BS+OLIo`0x7c3%!rLgWCD6!d(^DV~gzGo2(~jl@EcJw!PrxQaY4XP@(cg zeh)=ac-xAq$v^{4^*H=)XLpC^Yt`8Kr)Q?&mh;Qd-R%e33?=!WfM;rVKEwqZtb_;FFB`a$NzT=w*k(7!5#9H=VKaKA_@t zYQAbyW#52$;G#34XpKk3kz5q#`?HuPI-X~Vn(I)mZ|Xj4wp9589Ubr?M`b^}qNCX3 zI!Y9N4I6`PdP-tj!ypvo!P;}+#$B`Kb7HB0JMWx^)%6}w=7x9PnSeLn*oLDgSK;*O zqd-f%9yvA(yBj@tzzC}_a|wpd>Fq4*ga!`9 z@cF}NSsUh3vRQ4XMkU7lS`8Kx#+EB*HvZ~gg3AaEgs~ro%G)Tb4LAnS`9At#cV`#P z`8JgF+)m8%F>?#E9E3rOBZOAj7#M8i8lX@}d8n?xz7KD_v<`#G9auhb9A>Ad@OcN= z!!~$*cK~aGwW@*Z@JSkDw)BBvt@LL35z45$&oWL_c2M&&;R%ly!hcF08J#;gy$YE&I!G;r1D1 zgi|mxi)I*#RnLF>GR)0Sqo7|vZl*xi0rLw7f7>*(__Jy}BgYMGw%=jbfjp+>yxUbfjF9z=x7}eedE8SlhV?(~Bi6A3F|{ zQw8*JpBr5SpDwjY6tB_D3J5rH3mAN02hXyL@9}T2i9mv%Yx<0@gB|*eK!fl5xbOaY z1>Kt!0#ps%Eo58k131{i&j>_4+_$?^F<228k=f>;RLRX_A9;KvjcSb6`3$j|?15+@ zFS8n=i+)gOY=D7-gF(z1Yx5eME4r}JK{SlI7BQDPUY$2RQ^*^QC2vq#7SIM*f|ohz z0CJEAL)IFV9212X5k7!Se+O_x;hFo9Jy?(fj$B$Bk(`s~i!lIIP*ybWhM3O)$}W1O z4$w=1BSwV}zlEK?n#1o1lu)29CIyfzu{|j5_pmuolhEoD0CJ~}g;6aWso@ttF$)*Y zx8aZeWF5`03Ha=1TJZK;FTp2&VHu7cIfwN=kBzYn&wukWES;N$yBJB$ zvuF%EiWyGemx8_c29QRT+7Ojhcrk9 zuLCtFvOy zCJu_YZ%vtX_pnT){jlak>`E*TpGFbYQG(y~29k%lqF!p`g20mU)Sy!YTGEHgX>8xv zu3Ho6h(URv#J|be7IbE4E*eTK#C-6UKjq9MXmt;P350~=A=5=Tc~M56A*d4WHo0mG z8MS7QkJozuo22Rwya8bHkn`yr;5tn35C9vAj6KBy{MeLFDD5A!^13Y!R!$I++cd3U z=MY*f_B?0^LgAxW2&vP`)Qq4^NIz35Nt&-kbGHVP?4ALHMuUt6nP46=jmoHc%(|WT z)docn@I85=1$W&w11mTCaAO4<uf!`hV{c=HuB&CV@I zh=7XyIYVi5;1HUfKHqZl1ez=wGoI~otDjFPj!XA?d|Nto8RApE3dA@~2(Ic7;%W3Yx7bHKd|&g!W3# zI;076&EHJXht!d^^Rt!{YLKNptYam>iP?j3c9Vfav~w0YU}fH~B55h96YDk1iy5Pq zL(C};oC2BZ&!D5_=j)b1dkVN1FYk394KIjVPsYNm_tXk5qWc711%Rh?C?Ij7o(TTu z@RIsFK+^(CPb&D$LUssukOgE{_ue%Py^1uTF5Fz3gx6o8bgZw#UGF)8_c#HwXnF-~ zY|lLXHXJ`W$Jy!pL_>nJT`$e$1JsjF@jCAGJ*A$F*?yrY8cZS{W}0OqKV)|^*6hld zjkB2S`-Z122h0YLB%sKT3E45s((*ycf46eQ1`G88G1$4GF`)SuFkHN#$I7{O_x3nn z&SYy6+GtuGK}W&0t1Ikk-{0G3ro*d$BKVN^(p=%jnzqp7`qp1wK{q-&7H*k^V~ew# zp`nY6WDh~4zm5B^M`&;0-jvTC&8mQG92iu9R)NV9%NwXlJ7+;zbC}zdBhE|A2q1xQ z1+uDw)|R67J!r954PE@aSE4zFZ#OI0Cm>oKjGA2`WJG3r=^Fajdl zO48h~Yy_;;4rXFiYRpbHvL_a$4WbZH)!32D8}q>nglV-{+$xH64~ePi!?E*GUC{&M zv={Q&OA)3tN3)n*a&HB%mg?o8eWD7@oas&N^_Hd%R4Y_2Nz*lSS&}F@f?E8(7RJ*j z&jB8HfMxF@UEZhIAS??4Mr$B+704^zQB#xwyoS5)y$5FJX1&qM^OF01_L*mJ)I5;7 z&p1vjg|sb2opcW9V2L98>Gd+H_V1Z;$rf zFz^hOS=vqls(dqWb;gyk#b|Ox)DfjoprDiT?7XR<^!!?_X_%Ru258r?gTnLC})Cy@`7v z>!~*)w5Zxh_o3B(52DKkYG3jEOb~06R}-#03@-5WMxM49qmu^y-e9ogOn1zhc(won zSJ}t%^(A|0EkTAY$j2C~Oxh(Flt&wl^m~v7&q0W?b`4l6R1c=|;VX`eGHQ{7%mp)m zl1G;8aj64-E}7XxBN78pAyh>6tyMr4lLLI9NsNYVY&T)@_#yQfDI?;BQ41g$n@Juj zy^q?=%?fPBS)Ii_a6MH5loW9)jRQqDNsZxoo$0&kU;u3do*MaZjj!!4iPKoGQ=|)_ zZA|e(lR?C3yyV??-wmg3ISp&8Yp}Yyf*pSzPM2bhq2r3`=;3IJ5@)ZFe{QWor4}EtTzk3mZWPX00KhyT&3*YDK z&d<-m8NJ7+p86Jo?;L#aLm%MJufP6=I2r0X0gnMiZmMOV5+JopoBB8G{j$V2Zh`@L z`?L4X$g=h=I;fdcO%We-fNhko(BRepyvz)z$RGw$MwnZihpShw;`2SlhtnW5==XS% z=fQrDwVVPQM$|Un?{#7A#tw?U2e5qh7=jf7zy!7{92|GIu>Gy!ptgoRo&r!&P>%a_ z5U|eUQUSlKMKX}(q7Zm$UO`3LY%O|hlvpO7haF||Y1BR^T}02RX&Gu`w$XUw(8N+# z_+uQ(zf+5+D}ZYs5Usw=Rxd{M3dWDJaMQ^jytc;1wHjrtcwfLSn#z*pZi3cm`Q5=4* z`ha1ZdAXPw;V97ROF&nNV)S6YVi#tG!&Do^=!pHfnjt2H<(-mT(nn7m<7*Spy!pnP zFgH7kU~~q02ePI+CI9}}PyQTwvgTlT`_n)EQ+V*flVEM&-~2_3Bd5Rq)Gq?%aN&l9 z_d?m}I#VV5{(t)iaL;|W`{IH5_Qk)v$k()O6}>Te`)QazdO>0}v~~43+V{lq<9ioQc*#WPZ%Akd8iNI%db(MdcnCSRvceZyDNI(WWa)H$OGmvpJ&pQG%OtNuhx9@Y4 z(f2aJT^V%qFdKB08HbD&hNf6gCfD@zB+TM7?N@y^tvVBvyb8qWTTY=DY!A8!EPK0M zd`3Mu=(f0>mB=pI?G8V;m8)B5Iu~fJO>uBxHCdu5hNjLcnp!K^me;TkpbiuE0_%=Z zJy8sc8V^^e$sOFbd$iCWEl-6FngR-`t5EbaF?;s2L=Cv5*FwCy5{N7uM}&H9{{bBQ zTU-Jd4G4pbcn23hX0mzw6 zY4a@VG#w-d9|k_9!6o=;2QenW&dNilkHLtRPsZfSwhD>#uC)=>df%q^XzGyKVtKgy z$`U2}z0BLyF=9()ik+Y|DU%fM;%AmfInqpzAbroixS5pPiMRfaKr* z)ZgLvw5B|5Te5~cGauTB+1W^GfYeiVMP`~^_dr1xLSxMfaECvdPK*E+3WO25-9F(k?+ zNNkfc8rGEBw9U(9uU*@Kg{2Nm5o<)`d;+LfT0zJ>;2NB3_nQU)t^FtySC#n`BM(cEkXsSc z$0Xz$TLAx#AFV|(1{u|Ts!N7125DBfT4!zh2m#3j$&1QE)Kmdkva(P+7`ouClV4*< z`jNFO7t9@$l=?z+mS$)ynZ}fU+W@LD?|Ec*TvpZFR6 zZhL#1Kj-X-p9$8H9k;Tws`uFOGUx@zf=*tZaqsQeG<_&FoM>RCpWXc8(Wl9Ne3*`D zAo9lJTb&peWCv-ppx7Q>0}G#Dg<8%W3dN-JOixZR*ph>Wp6%q!B)Z%8&=l&S2}U`T z$>!?tIcP~7TEt-awmE3eP$Y9iFhXFsjQ#8y?s1c%m?`w5V%@RNi&5hHAcG~f$w4iy z^Z^jq)cS|}qQpRxOQ~K6d^qPG2xBr8hh-3bl{&1o!x!mh`Q9beW^6tmH)XVw3QEg} zZUEx~YzXeEv{U86bFG>|geKy%Nmc~cL>g{K?TiU5)YO8kfhdy6Et$P;zZDtdsk10; z+h5iatFw`gk8EX~25d@(3CuVuwSyBkVKt&PK&{$UE#?{nk>p+$ZHguY7b3cGnUx9A z=wap^2XhY8UgjXhg1rxsMy7qF;JfH8n5p2ICtiRy#|7cFIt9}4(+ob_TRVJn#tLX# zU0H(%9~RcbOajkq8qMC`HvH&^$=fB#@HaNP@Mm9GfdAw_p5@P*n;YycdGse9MmO(q z_{LYCfu)lR3^ovtR2O76O4(PP%^1Vl zLVz-zh>zLYPAxa4AcTgXoC>24I=IP`mow!1fU*4{%|?&2_82@tRytq)eF)Gr1MU3A zG-Q?~pKlLMu9=w`d_J=XM7yxio<-o9;da<+xB0M=*Fo>_-$A#}gCQ}XHkzUI3}{M5 z8_lfc3p3EeYptzR(0dyPwM&6LTx8OdDzpkfnOH;Kt0=Ys^EKaLK?>x)`mR zk%6g-*QL(B1=YO71!>GLxF%)n2vq-}6sx?fY^BFAK`dG0k%aFu{X%Tl;2;>I%nNH# zY!I;@G{M?~AS*_q-F@%hx(9yzfB#_^x2@e+<7bmE@B6c#{8?ub)KTejM~}(pn`^7s zs3W}Rep!R;x#zFpNZ5uGOQH#_ZC-)JQ`pg$Wm)L=Ja7lE*F>9{KL!+LDve_m)=`h? zb!jukVvHu0kAOzN?;!-ud*5>p*R6pZ?URGXt+!o(-~7$LlU)zsfB5}BXaa@Lvw9q06VYZAWN$;-z<3gLyy+h!gjac8$cKTwvas? zps+YVn?6od8~`{ok0#!9$sre{`%O;MYr&~J=sQ|Ehq_#$sas7Fp*|!F1qy}@;6Hl|Pj%7V(r%t;cz>aRXFf|^Dxy$#wMRd5PfV^( z56X+l<<7@z!?0*c0LbWh$fhtTcxkYoUDF#>fRrFhO)g<6SmCs^M^)=|3{Y2K^cne} z*XPfc_$d*?nMyYsa4ATQ*>w>JzlpwxD0bAP)I~d-JV68eg+=_vY=i(fc1?vHVGej^bvUf zhu+T}^~+zp=$(?71espM8c49++1W<6v4x*cFrD96JAi-k`)^RCq!-qe* z10Va?M__K^B;35d2U}~quzK?*-1mXAu(o~;L1z|6Y5^xZe=a)bx*LHa0U>=uCKqi4 zDh6D{hUm95D4qjkri{L)k)6#h(txl-5`!}^u;)hmm{v3b9vKS*fKf(c&pjrus_Qiw za5av}&AD;sOh}V9YyS>b0XybCipYDYg`I&8brNLQWxIgs_9WbL+qp(xB9Piz--N4g zU55h%kk&*CPMkc-`p@M{SK;RBE(*;Hu<{aWaOhSKdnFv~4%kgTXp`fDLOK8@7YhWN z0;c9^o%I%HMrgIvTF})Jl0`#IsbVv)hksSomxTfcvN~yhAfG8rfRf9*##Revlm+D= zBIib%!(uwEDIC~azddI4ieyHyH^;nQYN$H;2WWK6G8F1gQ?1DA+*wl6b|iSKhD6HL zgj29ETg#@!#F)fCi4m$*rwJawSZZ*iH3OLp8r@A_uofeBkImEK!qGJfal?l?b(oNc z4p7ixRE9*FkFzRkTf8cTG|)=V8)R--Q5PV|>cwLgbha~3;n4U(pYdJ^ij&A*YYatM z2|(7!g5LVpH3T6Xg%;?qg!X)Z&OC~Z_*YCJSWPB|v4*D673|Os=DLw7<`Z=BANDeF z6&3KypPYj)Ke-N1KDmRGd)@n?(4TksyrYL97q~aw zF`xs+nYE1$mETQ@n1vUFxMd=4YK&EEf z9svbKpaU8#(aa+68fiy+C}8j6Aho%*i6-wBgCv7augCk)Ap{AvUCk5 zII0+KW}DR_mBD}t6mSYTj2kpnx282^a}6IjI|?ZcN2!cRs=%x=o{ZY6WM({xioAXo zX+a#cg}H_@PXR%T5y$K)qzyX}P{Q{?XXrXxd-LJj{_rCu$99y2r&OORBtRve6 zM>^&hW>PEb7$+hp%`bQqvY$_{Z;)3&0uK+Zh-2ogWk6*kiV4sTFflek2NF0skc7ni z>kKgL9xW(0W=xCzh%qcKEFh?~WH}_S_2fn z`wUD6-2>Q1z#{!>XLp-*!~O0)J5k6op?jL2n??`oEKCwGX)WY+;qRGIum+PVJ!;P| zQPxCYZpSuZF69bM4JHF3%MTl4y0$S43EeMb(x;vxXlIwhf{&Eu=#!th1TvB-P%+9= zJ1)V`Yf~WH^QjGkI+fo`jArQp7!zY=2D*Sn-cUg%k4DHQr!tuWVMG#r%GWYhR0lP= zK%%P&pztIlzDEU6E_Vz*d6$5v6>Xka;1zIdq}?=8m4Xv_LLdUrm;dMqD3My16qwi^ zuK$>-G3xjFj4XI`YO010eV~J8%~ANHKiz<&I~a(87a|#G69Rz{-~mO-3o??4f>0v+ExbfZ^2EPD06PZ7 zPqD~jEIT#=%Xx@`V<&cdp!;^;d8%7=t8Pu_oV~KX`CGfHb6U6S412G=#^3k*hV`w* z|~F1oHD8QlXJ4Pbn6sy5cu5_GixQX0Y)%bGlXUbE}&J za0=uAiVFAEp`;`OyJK9{sj5`N>axU@C1{wh+F=pwP%TDan$3=>&fSm0$8XoNK50}{ zUY^J+3?d}ZR2aQx(^WC89S@N`SZz((aK$=Po79fO+a^TC(G8W^_sdwzvezrBX~f6? zY#$diEGM!3MsY)>my}`lBG9;{tj%DXlRk@7G~fS~q>t!*xDH=@rV^LIDJQGc8%vf( z-Tx-nsO<7PvpCzz;YC(5^ux^ZHYFrY6>BVyy zZr)mg2M#rTBlP0J67Au6_}~Rm@U3$zFkEq`fTxs}xu_7a zN;o6Y_h&417_xJFN>IO2U?J&@` z9p_@)P7pHYYkRZ4)gUMBjNTGhQ5l)b$)d7l0Xj28C*C$;AlL8Of zxpw%O#k>L3Z8&j6rKHP8S&k19uZQ#>)vpuJVW<70swa0)uVL_{uCa#P%>P!G? zUTktCn;#BBzW9=jh0Y~vLj|CXYFGO3k1WB?%Q@V8nBe~VOR%@QT|Hn2uyt{{8jH68 zkC%J#e7{ocgKAJ-<31}6Jnl>guLwM0p16=}zdN z*YAtAFkZ6`Y#KVF%P~AiQ4BK~e*AV3@QH|7pk)|VA=MQ@2Sok)TwRs4G7GE{JeWS^ zT_Q7(XlhiI4tgH7@hOvbT9*IQGs%+zNzo+lxsg6e?^CJJ2{5G+n1&=n>!dwd=8-WK ze=eQzmH3*DPOFgq?c7$Sneu6$OuZIUAutH?G)6s}fHgx%E}tZOBQ(H=|9UxrP+3q< zVWzxQgR;g^?%hHLZV(nlEwQ&k!-KSN`wZA~n3eW*A$0KO>y`CXFnjM_504&K0ICMa zOIK#qEt_C#>pbA`sjv2tA??8VbE}Z^aKb{%E}BUj#@1)Y>FeZk6lxK`^uDOZHNYcf zM8M~Z-x?^YU6YEr&R-=jTn`}qsFcJ&ghR7SA9y<43IxdP87 zZ3ntvSr6WXo2JoAI+-l<{Lyt%e>*~(N*(W=?N=0qyt1+cZSSW5m?EMT9GV77zhqUt zLS3VP0XICz!;Q~dIA=q%ajR#c6PQj;s^GN_lcd}n7LkY+(W)&G=2h(K0;l^K; zpl)yQK~$<;gr@1180`aPM+^pF?8&-Ffh{}2Ho0#s;e04BvyoTJGIcQpFv@<9vK&jf z(MeWC6(F+djv0*Cfv&Uqb8;|cMXtgzGvd$$j`C)pllv*JPBGQa`kb1bZCJU_I8YPS zuDK+y$Dl^qIWPOsk{=)x@yMq~5IjD01RU$Vm<8|kn+w$-+QB<_X4MX~SQp9;+_=#L zZoWnrI@+Yr0Q%s;cC}Hg@exDmGzbkfCljKqP7w{hp!eCn`kLLpzD1i#D#rTTJAc?7UzpN|DiWY6h|(O4(Y98LwSnN%xc>q+HdkOg zW?>Z7pwc)mY?k|D!#JAYlYgFo{WS3CUj?1gT%dCf;FKLEUehcpuTKO;D<{-%$h0C; z8a^Y|{pHR+{dVj18?gIi7Y?U~70A!Q=GG>>cjs; z*HJC!u-b|g;pemS5eD6JiI0Pw=`Z$*c1WmsU*CkQ$D9KnZq6(!})q=1YRgA=)0*t7Crc!AgJB=$+P!aGN zfiW$$Eh+O!qR#35En2`*Cgo8PU{LjjT&RuPpVcr-mw*Ss(OD^T?pqISknz(05)2j} zk1LfX%n76XuU#Hhx9}L=egC+!oJDy2Xs;TkbG1p#;QaZGdhLk9{vSQqfwgr8peE2X zumFEpvcGBYn}Sh^zXP<3MLwqhGVvMF9%Bs;_eW4l17?&$*#<)YzxISSd=N-#|2}t9wd~jivz)2>qW@gWSGuK|n}DOyu_*e2XQN4aMe{-Ji6Z&<Ghx3%YXywSDD?^^F@ zA92+vHNfSPrv$bpd$~HUXG!7Y4M^+?mriDHgBy&sQ{(BYId}+d&zgLf#kND$4d6ue z?UDct#~$hTr238AE~ZBq8Pn`^0SQ>>rd~PD$IcL=#iNz|V_u%#$RXwZj{q>E-x*(QG9Y9am^6FBR$bOX4saP3s zfYFD#z+*%0&?6S_H`$X0>QZo6#OojkK?wJr`Yixm3QmjW-ZW4Lqu{lL+}4?6eSlPC zwDDZIaec~mo0wErJI3y4f^Zyf^m3wmezDqq(7S~;*zKn; zDb{8Yb32bmp?)&&!5LJfAEqX$Mgyw7guW^sR^w|1THyi3b_zu1r(mV;P0({?6nr>` zvs?LPViZ2aj}Jf-$r~!2q;YX!>!MKOuvex9T6W(XRkUY z(FPRODuL*Q^VJo9eFFC%P2uj{%7p&zWnDPa>OvjEWVNaWi_64-o;==x@k0G>GWH1{ z7|Bo~>-QSeH)IdZD|obQahKA7SzIV-08lg<1DlLC*6I}NJ9xI$H)m%^19v(E;7nFF zCJvjz%iWi7`}J!CMo%8TfW@_OwWD3HZ1O2wsYd9@WC0G3jw;*H^~XyY6UCn#aXJl* z@7dYjr~E&djdCoTP$AU4#I_pO1t<+$OU;^%V*$|G&7vyjec&p3%Up9a&ML_Ie&*m4 zA6B%sK^kfk)Qzn1KC04qL@+l-S&d5U-~jW%jsho0-z1H3S9C0kS%E@!(YHz2Qk0yf z0YpcCWffxhmBm+5^im}Q68cV6q|D5VJyXSjSL&>Fv1sd#K}OrEz+=Fy-Zgnapc6GnXU_0Yg!y%@Lb$3OCTla%xWCZ5 zw^d#7H*bvK@zWW+_x>2(`N4j*0nK1zYq1)sJ6N5p(q5luRWhSsnJkZOe#A-5BMB`# zNj{gtlWp2WH7v3nJx(UcX9#SjK)aYu0oz%NE_{ymofMwa*h9kehOZRbbXdKEnBwG( zAGryK)mV%vPR?CkuinCQ6|kR^9SDI06X_itO*vD7E;+zWqBB@sU8&#$uv_m%frTet zAoDr(T>Xo67K!is7(q-BB5+fi8dm$Y>7xMl4G@*Hfh(!tOs+lx4498qR1KSj^CS1N zC(1UPCPy^-zVpdSIgS&zD2X@6CRcLWrq44kr?|W<2#?s)Ak036$zbY>U#|<1e`mH6 zJy;5I{M_WDl3Nu?RUf4Mv@b+9gEjIv0AJ#otm6GGK%j$50jGN*d26qrqnyT>wn=+|wx7SGdabN1TDO-W1Ja>7W8n^8 z1~AY9S3~<#>)vhdAA&^udj{~Fvgw51&n)MRXBcSK|L<-eP^#3|KXemztL^7iWir=Z zy9k<)9iy62|qf4RyBz% z9cZyUr5MSG^;I*)paG})B7PUyldNR@(X^=IHlG3W2`oqR%W}oQ7>VhN3Bn?j;6w$V zK}C3Tr%x3-Tu_i958d7LypG=Y0%AFM%yMKjCi$fe**i=ZJKZMF>hv z7dcxj2Uf!Yg8@iIz2XFD+8@pY-Hoqc(TmBYSbOc*8nc7ReKZ#p{CYA#)7f5G!L&$S zGJ#PKo*zk0JRu-K8v=fz+d4qvgJ@5gr1wz4qjM-Ld($rlbBqT80Q1@3zPSW1c4zSJ zdl`Q4y#u&$YYrDE=x_>~o11V{Z5NmudRFVPwl?ue9u{`oGSRRJaDdT&ar0*yu$%bG zfkj2Y;vx3uG-{UoW{XcHy?pKmi#ztr5U}EJ34DFMc(xC#Ym0FG))jbq_bK$_0++8{ zChyf&^>!^REzl!yH#maO@yRg(5LXx|5E0XBJb$uB;9ka6P zJh1U30gvp_$u>z7$Hi!T5WZr-ovBygAkIuowrogUw1e17COh_}Ozr~)8VyJ!4C)l{ zH1U10zp_F_9m9==nR4>-){J6CY2&FAO}`9YQGM}i6YM@esO)A1E?zzdkKTC#OB)lodhJqWGB4rs zl?#>a98;hn3N(tM&zxW$?LYWhrsQl3@c8~N?n9?>#_u{&yU*$mtGfYgvh`wfTU0Rh z95*aV=8=wjUp%X*BRl_Y254wQDh#B~I3y>}WHZ z%4Y^a*;W9>K?V}3Il7s$1p5tNryXJN3Xq)CDd1=nu(2=mKyev({YajpooY|LP;+gVzbfgQ+{%Hylyut2?Ux0Yy`J4wiaSV3R3c=6!Y=$K zQahHDlC1~yc%jE?vNGYMakI(>*C&+O5zQR?`!8t&=EcjG>O5T}hO@D;&fqh9QJGF5 zMudC9Fr)&54tp}@IctonVg&HW7-{^}J}APK$F&b&qHSeC=4z7)t1>`dnYU&-fu>(d zDDw>FlVmW9u^vN9l8923q?fX^RC|FUqg6Q%K};&wWkXKe1q+(NFbCiPaQjjT$O{dt zF=RFM$lc$j3I$tC37#Td;K|f31)}2Wl0IKLRdY)d>llS=p}6NOiE&(w)dFJpUZa}1 z{6gv-8I;vfUpVsFffrbnOafL}LjsDaT(r$a7*d~mDyvufk!5@YqpW=PSgVGqJ6^{Y z3_P`cIw$n43npw}6~5I5v;Zfw1aE&2stUFbSFW8@*Zc+`W8B(WBlY3s?kmdHx4O1$ z&uQn0&;Qg+YiJCj#zK7d8YrCgcL*Fqc4OCrFW>}cFfeHA8`+l$8_j1F>WFI)zutMa z2e;n1LhNSy{tLMB`Xw4iG)+8sbeGamVBT!Z7RgxyJIa%TiMwbc@76{&8FujS?sgsf z8Lb@jj$wJH>KK3*0tltH)8$ikh7)?rSzor#k@fKU%7GCkSHI%Am5EaYzXlni!C4>T zdNNf-RTFUg1{+v?xU<<7{J|xtDpE4P$;tLW;dhj^FK01=Ss`FY5{vs>_d8`(L8zjN zrol#{s#YqtX*3yVs%t$Fy0<}uNjyvPd^Ln8yZ24supr zSXCv|+vb9*eq9?Uq)d#nNG9o38FUItYt^>RNe3k)tr>!`#&h~_ILKGDp3upS20=roB#;7Vjuva zDz=8FriOlO*G*|+b((!wVbM3z9YU4hG%z)wbk<8iN1t)(IS}T0Y8@z2X&%Nwj8W14 z@6q6V2)BRaDuMmW7ZspyUxMRmbY5AVz_-5rEtuAR!L1a_WXBnc!(l`M3GF{CE34#k ze{y#Rx(PB2KG{N5CI#mhAldYpjbAa)Fs&+CZ5@Pcd_{xEY)7p#iyeIPZ@)=Ga$#|iwo)Ldu;&)NUztn>vy(a5e;(i4f$=hsM;dcG zYi{K-=)VFV0J^d5u}_WJl(7B@%}JWzi3~W#RLH*JEPjD=grhyX!=-TA<5^3r3|lK z9m8lL!`pB7@b-7B5&HV9GN26tTHODIEbPVhJ}to2wFz(!G6Bax3^xbOTO%TX|jzD#_4^FR;A5>a{Xa6fgsaq+h9j^}07qG7J2xy*wSCUvq7QX?BJY_x+^ z+XTl;^s=aQpP2)aM}sO80?^czSdAipKuNTvFV)V(M?Oo;PG4-0`Do%K0OEmQy`6v| zhUyX1COYe@F6=Z@=EAlf8mbB)bkO09PmzQf8>8`PYclCz6nMv~mgWMQ6TTNd*9id! z4>Fu}@(&Hs85Xx{9aalvN~DmK5l@`b59V{?P=eL90>AKaW;I{>a)Lkq{0mt4)Chj! zqt~cUuiv;pzdgMF93DNGSNqU;9uI;t3Edd54_gf3ab@uRS*ns=V<|BN9L{v@E0Y-j zRtnb}f&*ANruN8u(dU+C?iWhfj*pujO<|!L%5c8nnQsptJeFgNGbM|sJjuJe6mW z=Twj(mnsI;q5*3Vg5ey+Qfirj0aKvpih3HIETi8_`UFj2B0+*}flxQJN>!;}4lGQb zspaL|BCW+G$+KmynDojysDNSngw?h4yhFo5;29~#-`Fl-&w#QVyp!xr!e&Y*bx@XK zb{+s#=Zq3%uP@tlpxssi?1{6$OSLVF-AUC>=v;-;JVb8ilC{*!7L7UQ=ccp7Fdz|6 ztk#Q?^miwdBcvwb2@fU|5MUP<5?s5yKmz1DZzuTv+q>}EZGcO-5w(`HzP3W`d5#IO zPLu)3lKlYIGtA4=_Hh?O=Ek#CN~@9r9{nj$=$7HXbe5942N{C&+9*gI9YMl(vtm`t}MI*E$kJ zXplx>t7$^acB`OpM&D@Nhc+T@N5k+!A2ofOTpd>6HxQ27O{5%|LT3jVa))|`zm(K9 zC+>9c4rYlR7Hi6;S~PJjsr725*aHCw?1uzy2u{gV7|xdy)jggDcGgyxntSN`5cATh zI%Y;@E`kH zg$=>L+OVP00-1de(9GxfQt*h3DTOxKSn0n|rdKDh{$Pi}KD%`B0z7^26wY70KywdS z|F^&OZDKB~la*@gSz?wWYX_6a<32e&CTDsyqX5I>!^5g}@gWe%6!FxEqO=6R?SpIl zEa1>Kz-cBqw3Eeh$`EWr8zJ;5_iwlkbiM_(%O2DWLNDX3)CyQMi?rvo7-GoHzVlrx zY$`=^5Gj&IV`v|lOWaHXk94-dLX?Ncvn8 zn{CG$qbNnZZXU0Ih4vDo!(jnnDw$(vfe4`XtgKYDkOcEy?!&|`O#*acISTHDKdYhH zJh`@SBZR^AV|eAjkZ4i^7aLFw)XDfQm`d3;g2GEmH%&{Ivvs@+S}AU;h3W-ney?fsT)eaiddkRIuQ*eOOoYag}QJv%9%imFOB2VH3p$SV9+-am>RWJ+8DvkZAC8Q@Fhp*ctsuMbnrfwJ!tv~9auJwM%~a?KdTd+r~om-RO5a$hX{dCW|uM@Hw=7q zYfh3MNEUtR1CUTzt?Cq|k%Fj#3m8&^4_E`14iwA+BxXrHOVZQX;(frR5x(zoID0H5 zIdj9GqxUDB5Is+-UH~60mVAs6hcr;xbod~HrXFjA{Ymy7O!Advmp`49QTq<}kYP@t zaV>A$Q=HIzR0xnLXV5Ws9OZ|e^We{`TCjA|k$V_bvH5XFwxkY^-odRKixPMy{luFT z=iZ~WKI`iVe(9}cI_K=aeYwCN|MC0q2Y-;^#`TM&mXQsp-f_1A5cbFAD_h<-5flcW z4MYZZ4I5FJ+fmIZa*tlq4^$2Xk`gCFD6e@&0H%0<16)>Tpk4lbbycG}iw60VeSp3F zJ&sp|4me>S5CGx5$UqMd4q<0|hXlc7ahbP_5~+=(%bKnv+cYrEJcNSMJ;iFw z6df2~V_Xk|ai)~2h0l?re#0>sW#3pzb{_VnMK-CX&n;_cNW# zLOSY!ND)coo~F>kEQ@0e&yW|jP7YB_!N917`IV|^z4dbwIz{s^>R6fwT<1ACa2_I3av5ki?zY8|bjD zCICg&!N;utoi&b_k_-eN!p9R^0fRkYZ5DqnTe(-Dd?~Pt1g%OG8Wi_kS>B=Wazh$4 z_14qh$-Bk*CFELuR%fT0wq+3`jECCM?s48}oW$^>IBaZ5T4(mAltAUJAG@M`&tTIF zb1Qm0GqO7wIATIsj^vTdg&?C?q~A$P;%0foc>QgZJ5IMcXHeur9}6)dQels|qvjQ4 z=0|g8R@g&TZOgUL;~B>TB|7_+K|ji`wWvOyIAh!~-!1ZgHBw`X;whfh=h!m;?u zSNGvhKZ^j=!R1Tmsa-c-yNn%G0q7C6=fZ^z&e0SmJI%SlLbL4yfoXuumtN1)3KDzh z>1seHJZEUo);S-U1q|-9@4**3|1F#?fmjZkAn-_GjCo?^H4A8Wd?>&iSPMgTgUF9+ zE@~18J}FsL{9!rvIu3wX`$*YG1jERdhHZ>MtoEa`Ksa8Xh9H>S6GyXE))=W>^Z}d_ zDnJnB51aoCTtv0NAfuwHSqZLi)<&F}q%b=mSkF^3U{XfG*E$eHnr6oD65Q}IWwhg( zMrW|-X+9QIC~Ani5ft+dN^+!4<2x?RfY5XIEhoP+^U+6}FeJg*3`Rlv#!P$LEbN-Bn6&?nx#E?EvKw=_ys-7R0spHaYK z;aDo%C4Ypf*r@)kV01hu06M|4r}e>mtTt3P4ITtecBKV5FcAaa0Nh(DBQImac0W9( z{TF|374Y1=zy2G5zxa#y;ZvU)!{){&ib8np=4EQ={d-U7IPT4JtDp$oFcCPdKImBK zZ&7+Tl0D3?IK~kyPJxczBMVYlmX-4Xi#-ZPWWA(KX8=9<7LSj{{aRff)0)C@LbZ36 zg*8`6F)r-Q!nmIKl!aa=rwEfU3V>(*p)71@eAfO+t?@pZMik7gtU+H6SxzJT1Ib9% zAqB*Wz-pJ;RVbW9764wL5*8=poKoT8!?REJc{diaq)kem}Dy1O73peKP zF$$NxF~c|voCMJZNA#rncsfOtJoR9B8W`t3 zb+jz9Zj{36&aB!?zig}*_~l<%uI}R=zVSZ};0s@P2Y%;weiT+Ft5|EedFv`&`{3SF zVhd{% zO%x})3e8p+#} zbz!BjpggObsZC*bJ52&z)Bq6kCcELaWi|jo1(XG*ouns7(0&sMF$arrkv`Ad5!rp+ z@`z&P(cA3x_qM7;kv&{mb_VM^-y{mc%6b9l;~@!8!BG?Y&WfdLK5dCuTHWpL=KA-W1+m>$;2UgyH>5HlWj z%!H0`7krWJ7!`01FbHv4K?rY{Lw}rUiv}*lyqx%)`Y|-~hw4Zjn~}1eVv+d?`~y4-6dFFSr7qP8pZ=b>KiEOZvZVb9;hQR zN6*lX1A}K!Il<-;)iVP^fK&I;Px?#=HpSB@=5&#D z-6SyIVkwsX)0cnH_n`==axalYk`-U%x41V;nSyR-u)DL5oli6wki-CEw6w5wr;8_% zN*P451b})w@zudsi`MiK#`uKn_#NDSqV23t8GvCKd}cgb4wTrL13_&`G-r7tQzSEj z4R8cBtA;@86nfGZD&WjB9Oh*1u>)i&;|n+bmHAFb8}2=JvZ?NycR2k;yJss~Z%&H3Ztg@lY zlqE4qqnm^O25OQmE?F$m0IZ;+c9VVp8q|LRa$1Hlp&{^u>!VFd>l6psctY)m1xylu zbX>h(OH=>?$QacwWHXtCC~y8n9yljZUsz%fH0P4ayal7O9^8bwvvcf>E!N=-0P3R} z7Wycr4>2|u`c6S71t3;%v9^D}v*|kdja}_YkxwckH7UB#bC%ea?3Gowcw!rZ#^X2= z@`Fe%kOgmUdx+oz=80ncIvSOWu61!|7qhi!;A5lX%8l8)M;>EBDrJ%Q81PAfE@F;V zGF*v8(Mu1!&lc1OR{y4B1-#U#$X+t8fUzm+U$2)_-%K=I2j2&qpQjEl9%Od0W_f-I zGA3z!Pxc9Y}7oM&#Mz02!a&7E4Ch{DcRY;5D`^Xqr!!`PxNr{OpZ>}UWj*}je>tcs z*}L%8&%Z&Jp(pP{Z{DQn-h1~Rkvc}l@&E*Z12(P(65(YmAb^7bkV<8Mh7m>S&a5*m zu5hh+eg<`jtiTq#2uTE&rIkgFDyM~;tEX#BfI{0XMshl7O5$1MiA?jCv=bl!tigx4 zMqXCCk+L$4^~q-d>oBZ9?K_dlC`g=AF$Zl{z>jVB87ZGrav&{5vh$2aQdW@sY8;h~ zh)Kan9uaK{guQa?a7rntAbt!FrOgO~9hpg%1<0v2oHZ#UQ6?3)DoBfbVa3VPb7v{z zVcUWqhr>fc9EH2E`gb{#9j9C2f5>Q3y(TYK7FHj2QlEcRjmL*C=Wz6N28R!4aPqi^lV_D7?c;g! zK$2U7Pc>ni?ySeUUA_eHTfepr*I!$P&wqXw{^$R?FXXu=BkPAh@;W8ndT{@V1U{B# ztZXcxmDKi67m6{)(GJIu zlg*8Y&5lPSQN5NaOQJCmtz#oxp#`Y;^`O2g$fJ;lP_BZo0bD3^Xg5=%wt}6k%2vYi zLKOCrc>&|)y#PUM08zV+t8HsEIog?e0uCf**AO66@0e|<1nn4J;jCu#ayn=-&yxa) z1F$bRWm>eb`yc^5d%k(uEUlz=RAf`h)kuGq|HezZSi7kfqLymtKo;;Mqj7TelnW_h zRE9={j1xjt+N=PQ+L@wt*5lUA48Q%Go3OgN41fA3kKx@rPig%7%6?Gw`mv9`2@7d$_n#%6@nj+ldlQ*~NeiWXNr^X%1934LoVdJAido zzF)TuaLMdZDiXY>aRUrYItgSs_7Z6aAh~*ybW(BP5zOmV4N!yzWh~Lnof?{IlPPOw zmf*RAAT3H@LBql2wj=>p$RWTn1?iH&JYlYS=`G&&xUp7kc&W?AC`p=U(;3n(}K&Ti@t1akg zuZP3uGdOrKuK+Y9b!_@_M&2{@;LtuXVL%WT0NQ}wxRv0yetomrdnWK_pS=suU+mSz zIIiqxMykh0e(XcUgq}RvCXbJ^!*lO>qY8?srwu z<}`zm_25o+wA-N9iWw}gD-;k2KnN@ZK#QzFkiBlqsvBt~lw@o~j4-AQiQo~{utwDy zf+T=5C%HCeWgLP#G;KS5e*}L0hjW}u%wX{@s^h7#SHZySIpSLGM1=zNRw?l400efT zgQAV5I%ha_1c~iFhvI`~3`&`hJ;f3yC2MGMb}8&jnF@K#D4bU=j?YTk?jYZ^?FyEe z7bkmZ95BoiC~fW}xtWX-#6t3d?NY&z!&&k89w$9gf1K>2YTsF?45wQH{)cv;3OwC1+kmhlfY-V*4dU2{+v23~Ak{Q~^jDrW2VMy6vKLkx9j4fzBatQ41H&QMb|y*-bZ^cMi`fWd(LHCoRU%Xux)hF>+3i+0a z!0SAP6DHgyqUsM`ngjdM1s}5kI>V89-+2yWT67vs44U>+03&S5G`7}(0RgFN0Jhlm zbWeBbg9E2xRt94PR(4SLjAHA(k->E76uVPk;LZozm7gs4vS5g%-~a=L1OY_sU#nNE zEy=pi82Gssf1$(h>WBgubpt0N%#`qxkDBHe`_|LA#AS#ZJP_+Pqw0q(x{ zkd3ZOV-DieK9L3SLFq7Hpc2^k0KN!Q%hcm&47X)8b6#F0v_}^@rVzm&5P-&u)qwu+ zAqm%&$ugJQq36pD(8NTA3E{tujZN6w-KS{i&5J7)n8spa=qVTU{@yFdWBat>%5ZG5N;br#!|H@IQege-FZHMZ#IwJmhmFg? zhxcJl6^L6y)E>n`+H(gfxm0FkWRJRB>XkUa4X^7&`1F{Tb`I5-4F{ zYIU)rD<16!Qnzoeu^qMb!)#Fz?vE4mIAmvIGBOpk#;LxOA0nne=zH;ZAJ7*GY_{&-Gh zjK>{CJ-efUPwBichY-#q%-&c~MC`gEoGOT=KhEXH4%S0d$%y(DKBdZdT+zMP~f3s~-VR>6g)px#*o zvf7wr0b_^LkgLQ`e9o3fH$w;v)X%LgiB-g8^^f)>%@w4cw>+?Mxw~6FX9uDpUE#;p zBy(AlbnPMok^7bHX}b+TBvKh5L{rQ39Ds~Y93EJ3Mgp-fxRSavU!^@aBbk9+1wj`# zwI-h={HBC5__MW5z}RA!CuU_il)o}-3{n{>ExG;y;U*DoY#-pPnI;|7WF28^O5v;AQ3^4^_E@E3C0B|aY zjSrMe$KE~z_&s(_C`$$jA}h7uO@-s%S1Mp)fAn)aX>Yhct{`j;W~9cXsq}R>2}*3)-g&!mKjm##X8g4?gb~6aWHA(V7Zho8<&n z&mQS26VD4Yt^!=Sv;fbaXZY*C*@ib>@8H_iO)@|q9UQ~j`f9yy1Wz7s!^Y-1bM&?= zU8;wEJ*C3(fCPX7NYH|pF1pC9;(E|>8&xEPV4zE!z@pZDX?eA(jrS^pTZE;>CC<&Q zUayYle3v=Y1;Ga+y_c&O@Z|WI4i#M9SgMR~Ea53V{eDtauU7|$&fzq4vh-G&s&mQE5kWBMAfG<2x8F^%$B2 z%|=E63QDaYsT`wi$&+8lM zoI*K}T&?xz>lP1i6*?sYFBMF-AO+xQ9U&>fTs62a?4(etSn9t8QQz(C`4sBIV_bzk zT)MCX-}=8Zc;}tx@Y6qYj?$8%0s6SIfr}R}z^na(>KQwxV}@sV7PQjx_zDZeBzIIH z;_oG-N7aR<&Xxg_fWacxF$qhW)FcGQ+4LAzSJvUqd+)=>dNmv`F51a0EC4dZj0srE z@iCrrwoIW4c#O`{@*=t1mHFW2YCMebu&QPA*_1Zu#yJ+pIF2&}Ayn)b6=O?$Wu*Zd zNX@C2%Ba*1!hivyhWVZoTTFQX5XNZQPD{ycA3DSZRO2?K)q?GuCQ-{B>d7nR_*LLy7zkl(q|C;CdYQ5@XDkT+&u!k%K zXjXP1>KCogV&K3Lwoco5&sKYI9t~7rOsXo_+LDC?@g7|eNd_{jF71qz8a49MAVBJ+ z#~>S9>a^n-;Zg=uJKUDz?>$xqj0F%I8F9P(h@4(_wF9V%1Yw>V;OM{?e^z`MyHJ%a z=+J(RfUVlwpfmzLL9oN6+(;`cGpRA$g$GMVD}>u;QwxMKCI2mDu#-xJ1?h3oT?UGMA^cdJUPF7yBsV-q3RRuf0RaLvi1^CjJU&8v@5q$W~3skS8 z!y}khwsYyyrE33qM&N_T%3!()ZDW+s#%}tMp&SNN_xK=eI3m3 zPGl&eD1qA5*ywz6 zjG+lrqM4l?o1NgSBYm1E|3>g7pHMae{(S+r1x9r)0=NLhh$N1{m z@HsLt1-+!tDQwV|r0uM>@ubMI)kC+ZQRmQ6vvOYoHyn4$&Hy0%o+VX>vaYTZSH7gr zFdKr};}rxu-EZTpMggwVY>xm1Uasm5e^*nuQRrzG`-w;AHe41K2b8>E8a*x6pX zWPOq-2(Q|J&UJ7+>)APYcEIDBVDOofL3(;JrwHl=^o9+9#|2=~$>?MG_+LkY6kNsSX_NEYezmX`~W| z{~s9%b<&6p)m=BYItGEspd<7J)jS+b-Y*2a$rQ^Gscg0<+D$D$lLIK2>54cONn(+O zpivcUP@IcIVxw=-x>#>3HD&K#2{syKK8<#*ble7QMz^oCZgwKckq5p z;c>k5)bCa( zGvMsx80OU`a{k;VJbL&PZrr>I&z^1DD1l&_wmPzBRq^tDIoIf}OoH4T$1%9!4 zj`(*hU|Lxa1s&$xu>h3 j`j?;i^zZJ#8L$5b5k*0b5|u+Q00000NkvXXu0mjf=Q-#` diff --git a/zh-cn/index.html b/zh-cn/index.html index 4a215aa..c96b128 100644 --- a/zh-cn/index.html +++ b/zh-cn/index.html @@ -5,7 +5,7 @@ 达坦科技 - +