From 07f40b94882e1233d29b9c7868a5755c6fbec688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 28 Jul 2021 19:51:45 +0100 Subject: [PATCH] fix docs and nits. --- api/api_storage.go | 2 + api/api_subsystems.go | 63 ------------------ api/docgen/docgen.go | 10 ++- api/miner_subsystems.go | 79 +++++++++++++++++++++++ build/openrpc/miner.json.gz | Bin 9540 -> 9596 bytes cmd/lotus-miner/info.go | 4 +- documentation/en/api-v0-methods-miner.md | 12 +++- node/builder_miner.go | 2 +- node/impl/storminer.go | 10 +-- node/modules/storageminer.go | 11 ++-- 10 files changed, 113 insertions(+), 80 deletions(-) delete mode 100644 api/api_subsystems.go create mode 100644 api/miner_subsystems.go diff --git a/api/api_storage.go b/api/api_storage.go index d52032650..c39114929 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -166,6 +166,8 @@ type StorageMiner interface { MarketPendingDeals(ctx context.Context) (PendingDealInfo, error) //perm:write MarketPublishPendingDeals(ctx context.Context) error //perm:admin + // RuntimeSubsystems returns the subsystems that are enabled + // in this instance. RuntimeSubsystems(ctx context.Context) (MinerSubsystems, error) //perm:read DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error //perm:admin diff --git a/api/api_subsystems.go b/api/api_subsystems.go deleted file mode 100644 index 1894bbdd8..000000000 --- a/api/api_subsystems.go +++ /dev/null @@ -1,63 +0,0 @@ -package api - -import ( - "bytes" - "encoding/json" -) - -type MinerSubsystems []MinerSubsystem - -func (ms MinerSubsystems) Has(entry MinerSubsystem) bool { - for _, v := range ms { - if v == entry { - return true - } - - } - return false -} - -type MinerSubsystem int - -const ( - MarketsSubsystem MinerSubsystem = iota - MiningSubsystem - SealingSubsystem - SectorStorageSubsystem -) - -func (ms MinerSubsystem) String() string { - return MinerSubsystemToString[ms] -} - -var MinerSubsystemToString = map[MinerSubsystem]string{ - MarketsSubsystem: "Markets", - MiningSubsystem: "Mining", - SealingSubsystem: "Sealing", - SectorStorageSubsystem: "SectorStorage", -} - -var MinerSubsystemToID = map[string]MinerSubsystem{ - "Markets": MarketsSubsystem, - "Mining": MiningSubsystem, - "Sealing": SealingSubsystem, - "SectorStorage": SectorStorageSubsystem, -} - -func (ms MinerSubsystem) MarshalJSON() ([]byte, error) { - buffer := bytes.NewBufferString(`"`) - buffer.WriteString(MinerSubsystemToString[ms]) - buffer.WriteString(`"`) - return buffer.Bytes(), nil -} - -func (ms *MinerSubsystem) UnmarshalJSON(b []byte) error { - var j string - err := json.Unmarshal(b, &j) - if err != nil { - return err - } - // TODO: handle zero value - *ms = MinerSubsystemToID[j] - return nil -} diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 1e712a0ae..f9addc940 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -16,10 +16,10 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/ipfs/go-filestore" - metrics "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" - protocol "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p-core/protocol" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/multiformats/go-multiaddr" @@ -265,6 +265,12 @@ func init() { addExample(api.CheckStatusCode(0)) addExample(map[string]interface{}{"abc": 123}) + addExample(api.MinerSubsystems{ + api.SubsystemMining, + api.SubsystemSealing, + api.SubsystemSectorStorage, + api.SubsystemMarkets, + }) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/api/miner_subsystems.go b/api/miner_subsystems.go new file mode 100644 index 000000000..a77de7e3c --- /dev/null +++ b/api/miner_subsystems.go @@ -0,0 +1,79 @@ +package api + +import ( + "encoding/json" +) + +// MinerSubsystem represents a miner subsystem. Int and string values are not +// guaranteed to be stable over time is not +// guaranteed to be stable over time. +type MinerSubsystem int + +const ( + // SubsystemUnknown is a placeholder for the zero value. It should never + // be used. + SubsystemUnknown MinerSubsystem = iota + // SubsystemMarkets signifies the storage and retrieval + // deal-making subsystem. + SubsystemMarkets + // SubsystemMining signifies the mining subsystem. + SubsystemMining + // SubsystemSealing signifies the sealing subsystem. + SubsystemSealing + // SubsystemSectorStorage signifies the sector storage subsystem. + SubsystemSectorStorage +) + +var MinerSubsystemToString = map[MinerSubsystem]string{ + SubsystemUnknown: "Unknown", + SubsystemMarkets: "Markets", + SubsystemMining: "Mining", + SubsystemSealing: "Sealing", + SubsystemSectorStorage: "SectorStorage", +} + +var MinerSubsystemToID = map[string]MinerSubsystem{ + "Unknown": SubsystemUnknown, + "Markets": SubsystemMarkets, + "Mining": SubsystemMining, + "Sealing": SubsystemSealing, + "SectorStorage": SubsystemSectorStorage, +} + +func (ms MinerSubsystem) MarshalJSON() ([]byte, error) { + return json.Marshal(MinerSubsystemToString[ms]) +} + +func (ms *MinerSubsystem) UnmarshalJSON(b []byte) error { + var j string + err := json.Unmarshal(b, &j) + if err != nil { + return err + } + s, ok := MinerSubsystemToID[j] + if !ok { + *ms = SubsystemUnknown + } else { + *ms = s + } + return nil +} + +type MinerSubsystems []MinerSubsystem + +func (ms MinerSubsystems) Has(entry MinerSubsystem) bool { + for _, v := range ms { + if v == entry { + return true + } + } + return false +} + +func (ms MinerSubsystem) String() string { + s, ok := MinerSubsystemToString[ms] + if !ok { + return MinerSubsystemToString[SubsystemUnknown] + } + return s +} diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 69d471dbd5673f06dc006a4d21f0a193b36bbb30..57a56d94fffd25d9f55069cc5127c44ce67d0b69 100644 GIT binary patch literal 9596 zcmV-?C4<@@iwFP!00000|LlEhbK5r7@L$33{qQ6m+0o6i?3sRWhJ$ksz8cOJ5qE1Er^euLcsMb7 z1}00#IQ?o+Ol@SG8kY{;dEokL2F|W7jGl3aTn{^h_ZSQghX)qAGah@!2GO-+dB*9- zuLgk|*7Ys6k?CM^cxF<^J+mwqd7jZTEaaIk-ckYPufP6UIiJXKM@;a-13%5FTgStEY5do0Nk8`t7kN9IvM=MW zZVJE5x@O-ehW5-g+CT;m-NVh+Mr<5o*&hr?W8-s=b?0b6`^t5;$fcOISVG%FJ%c`M z5o_)&{)0?ve12s3{db35WErQ_-64j|)ihzyDt8n>O-sI49Hm{aGy&Y^_hvD_gX0-ciVLOXg8|YEw zzJgo)YU?`p5C2{va=3E--{t72KQSI3d-+s5bI1~}YSXR&Bd6d*6J7cht#hb2(XKKL zhj_O_$@y!Xep^h%UyUml&792!Q?|UWV;iSrXWKnP`tSz18%!WYspsbi+E=@UjlFgH z4ff!|M!$a{$bAcKdjZYcfbRWwe>m=K`sHI0TWw>HzNV4=YG8^s{EY^02CVrQK7g(Z zAJ}i%yqW_pU7D{!yM^P}2$ERK^g_v+Wbq-3{QAU6Z%H~tu44?qw$iA{Sn9vz(=kEWx^^m8;hzvcJMoWrS{IcIBR-d?%R z9h0<`STg}Z$(Rd#c#T$=;fJg%XHKtN$65Bkb_hOx_5@h}6JI0td<2+ye+gb};Pzwm z{lzEz>`@n!TpK8XRt_`gfG@?_>1ANkX47L+X_vp{OWPWgRA-H77Q@V_5+cx&RLtD^ z+zS-)#{!LG4G#8C+F3Bv<)4Jq%!Kg+>}EfwQvcSi^&EAR!=HGBVwT>gIZ zVgB#eXR}{FT>bm?+5FAFug-3M0f^jT*C87wE$^U<`KHH16i^3v&IW-kr0X7l#NuOp zB5W}BEQaKlH6p--w#`ONOcQ$?157xMj3Id6PoyCQRl+>;+k!i2?~oB=Hy=iIvG&`} zwk5)qKa6djLcwa=-#K$n26E;;N6_|W4)L&s+~1c=8xwSmsEg4ZwE4?QEME*(e(J%t z4|#@LFa4I7qv3fJA!=@f}Qk_ zGzj(sxkE1B`!q|ma<~l;t{iY1#H*Y_N5D@*zyn3dS>h}Gvla4{L2ZC|WnkMNT?P6b z;XV!F4i!;A{5xE1*ta}~6jmqG2!_gWXkzPdhAnt8^SaU*yXe(p^96~z;7ZhL*EFE`)EUaTo#mQS=+Y7k=CkaTi%oQe z+^}c4Q3LytldvS%To$i2r;wtOWOxZZ`eAD^$ysKOA_}(b%Gl6bYq!tNaQ~0GCu2oq z6PKrg;js1EcFbG5miowmQt6V=iY-ti8GyN3#fMs6rO5DZNxwwKY+AV#nz=f0G<#$M zXAHzWW6Fsl{)AKH9MP6esf!@1Hl8A4J%6iN1iO(9sKx|Z&pY{c;le-MZs#~Jk|RqC z&A1Em;Wo=6#XiH@43a{=V~_n|k7-`4NSqQHJ$Wwx+!TXoAHdh(5IOoCi|h}Joa9BO zWJsZT1)_7zU!6T#RUb0cJJ#46);R9x#lFM{q3LLXLeLGdNSUC5>TIH%LdPom!zzQk zsGAruG#j^20JtGG(GOp!&Lj%-I~Lg=78&Nn^~@1%(9={&D}y z>$mgaFWwvH-OauG{_^hE|D(&w5m3*xipdWr`^JhOEWx7h5Iys5YsfnRKz@AwlV43} z!&@HC@rs0I^_h2@cc>l*E|+8k+hvZ=Q`ok0XkIYi%qkbR*Qu1lTJkt7Y%(PJMif00 zfA$`eSlrQ|KN|Lo_wYXZOq5p&iqG|o8@xdtg_|vFG3XC^#+&;sW=Q!z=jgw`ImYRD z_}DYp9H3aauZF0dH0&8X*7(%;7qR<)&R?%h@{cw8-=BXr9!r+m^ru>)M}VqMd`@yT zw0b1gRI^95Kra3vOUG`BFQbE4>?`XuPf=Jo#H7Jnal$F_fdy$*Djm`@N*DLajm7$& zwZyR^#v>G);lWdFbrFZ8&>L>h#Fvb^$|4TBS*?*mx*hc)nRZrZ$Q$WZTNWXiuODcj z6h07-SBQ$##1(wlAVT>H+(Da(^~}QyV!8-=h|BzP5Wmzh$!5k4kcPIPyJ@P!bLeli2-{~5;S18dnR&JBR6)L{`AXN=C?4);f zLMmg67o)S-MzOpdbsqo9lKEUZtICL7Ix8tmKd+|>!m=G|`bvu5;70!CS{+xF__Xsh z_xX{hyHtCw7_>YC&dyv*sdoSKm!<lY-8hOaQ6P9^7Z1Q%V?-7L-r0@#TwY))i1CLanEBkc@QfDAN z4+ANn#7aUixRkR>-)poiN&P`QZtJvj4ZrZ1-x56>hn7bx@F;|$Sm7l|#4(h+T&Apr z8MB!6s1}uVpZK24i(*kNyB)1~9GM$3PIcbaNx31_>-_^**CRy&Kx8pCkbtZLrn0Tm zC;Nd&W}P^F>RH)3X~@2jT{vPzbNgvZglph0vAcEpv}=I}vY_n6hu=aL^o-fgbxTKV z_|~b3a3$+hcczzU1fe`3579F2DLpK7&U~tV0=W%ZCosupF2(5}viZbIez9x#rQ*iA?x|Ec zo64cko(Il_!sZQ!aP65TG|o+pxu<2&^dc22I&$@LtZTw3N#lF_vmUm{1o8cWCBKq|5-(E-I9lw$+!M?CcOC^xY# zT&HFfXcn4Oj~0YLOTaV}2QA0162Un7q(VME#L5@=77zAhQJ8N!rL zNH>99h8Cn0ZMM_{)B&z|-(|CR+3a05`;!R6X>Ok4ylyu8T$RnvMIKv6@9;HVT@cFU zTtsy4d%N?s=wv10sJcoj{5WTAamb*uW%?zS~K3D&%rB zJyFzY55;0bsqXW_RClgaWC`6mil8{xy@EzaA>4Z1w=SD~-?P~}k#jjZ>8n!bF~MZ@ zntlCBawhDqsG}ilm>ayEBbs}p5&~+bYDOHdc1mT$XO@*Jskb`fWQMKqtb~Wbg};75 zc(ta+Y4PF5KDjqf28yI=ZsBDFPW3~*^x)M_ zf=h-aS3iinMz(%*QHfmbJy8imMRs#27o#|{T1p`VQ%)^}-Lw=#*t%KO5XZe!4nMMT zP&0$7mDaX5Cfu6Q60tC$rws4u!bA5qG~#5WNM06F@)CP=hAl?))nX#DU}{|7n+4YR z)xA=DyK8&*`C8(AwP z?2c-T7Xu(?I=H}xfnk%&cQHsgJQoL7j_s0|%31CPZMFbzF{3#^kw-CEl?sZIF=8BL z=~->;rH;+**E<;W`~98~WFeoFG?t^H358~xKjZaXln)^%Jru|}K(t9@C0qDXV_B^M^p#(&pwBggMk)Eda2&h(p+q=lGh#eGh2mq0PLOwk{D}nl)6{6_eDR$w(a|MCMRHXjL~R5; zB(gP8Hk_!8MoBUPh%Qy8RxXaZ1$yE5M8Y128 zNjm+dp})q8q^-1&&T>f={WYwlzph-zSvH}%hE1!kVW+w})%6@z7iXDHYjs*{Keg78 zBFiz7&sQ#LX5$qBs;IkAQ`@fyRC8)9F}qHab(-uMYBJRA!#a(&?;35QNFA1l>bhI8 z2v8-BCM3}eTV6xztifGbVrrc_>(tq^Q)dzPXi`ad9^6>zr+K6BN)lc)c)5Ja_%b|6 zk)=*=cY0exZy)E@F7Qil*NhO1L1{mhBQ{twdO3-G7sJshq>JN=-TQ(X#K0nf{|8t~W4*`5gSkWM-7ZB`#F) zjL*-<`}90HZqQd`I{RyTws73+1rIvR76+hfE9IC(ad365p%iMZmx=C-pw0;DG`x^E z14SmT&y#a=jjVGFS9N4g2t*}!#GSY=FcS!jFTXzKDfu+iMhezTP*uyJ3dSq*3sz&FD1%k&LtirwG>AATU)%q6VRNya&(ke^}j*Ss`6SvoJl3o(kQDWA`y8EkS)@i^2{ zcDQ`f#m5_GmIe5w1AsaJ65wnR0Uif-2ria@IQ}nB++B@`vs2{t>8|z;PQu~@n|T1F-#p#+@aX~ z9TyP^_|+u;iCnzI$YMhWD>1V%BGfoFmi@tSG&Xw1mFwJLi`i+>vrD)@cG}O=Gv*Y! zR9wP)%5Tf<8E=S{eBg_*;0{OsrMRflA8F>;Hl)a9Sn(GEsnlct){eQaZux0S;rNd| z<5z^X(eVixnYZ@Nt5y;=14VT` z2;Vpg&lGR`8d7t8jdFe78Q{4WhNwoUV0I_xquME_k;9t}vM{8`egGaKmd9_>VDG_3 z9O4L*JFtl1YUQF8qZfWBf@pg9iCp_`bY?&Syo@?SkNgj1plNM?xq7)ISDNHBtq_@6 zMjrD6I+@me3$cwX@eO#>Eu`!dUM2b;{*-rY78Atpy;XVr9UHw__hr&WDHBM0b~G?n zBvi+F>;z2XVL}m^Em_vx~Gwp3gl1&vM2Z2mdxvRWz3V^*0N_jd!$Gr6(8;$qHpfE$fQh2 zL;HN^LZ39Ma<2lSoR2Bqpu?a^F&isj=P-0)fC~Jqo=qNStMFVQDo)*z{}wR(xK#lI z=N)yp^S(CsCT5=bp6R#kc;P1f@PCz^anF>kCWeeEOOJzTih)9a?Q%^V z?*dkdFbesDvxSI90R(-q9}awfw9h4<$QOtyzZZ|YuYrZ2?STbavL8%YvOT{S9D{Yt z^t_qrSdm~ONaQ_qZ{IrZhwaLRR<&4N8KAtgDbZehk=ziJEZF*?C{k2g4@pT+yEQsK zsY<@#Xi^BH${-Wd%nl7WvI2E*0W^Q@zqeaBB4R5QMxG}JcTKav?} z3729gP$Xmu{6JjXbUvWY2NZGeaG(t7W*_bvZJfJ0cC`S|m_04PHDgDIsO5!H#s+oy zfBe)4;gDIn&L#{?0~Zun4&oY`B6oucqRA_lE`Ec{t^1E>`b=-M59*%P3tmn*B^@wk8%Tu z!o5)q9t>eL#(*KjX1FhoU=iy@Lx+3K#MU&}bb=RbTS!(+-BAa?Xea3q-yyWbu18fw6=63!DSzz%1AowS8Js$T0!OXFc30?^28zvSuxv+#_v$H8S z+1rCHG;fg=j>1^?C3n6-@Se3=LvMYUlqkNpI^c5ucfnDQ>MSG7h@*uR)t#TO~&SPo8;O?{)h zJgWvc%lVUI0BxJ?NLQin$ZM3Fev=!m(k2>Jtp>wUZ!jEp1*?j9;UqUCiqpjfnR8D> zU7iTws5X}$KZiaOit2DnFwm25O>9=`9VzFan73yOU5d?}4c*Yo)6jM?v4|CK6-e7_ z6-mBh`De-Uqke8kl6Q@kwOF0?m#e=G+#*A32fdq?d+KfUTyk z>(=7XttTPNf-R0f{GNGxm>aC*F|Dwx#oYpeu78+UrSi+e`Jb399Sx2b!xYw>;$^KW z@Oe0k{HopW5EUL{fsL~S5UlWBSZoR`9>B%<59I32t?u;g%GyQ5peWo?qPkNgiB5R+ z6UqkQ#bvlVXXb1+=Rw^k_TxJEA#Nr-HU35H{-5*LYm@wAjsExNpAAv1#S7ZqVDnap z#eec*Oa9|jZKF97)l%}>gkh~b#ydhO@!%R!mkZ?auxH#jK_Za9zL(IWZ(KK90P4~S zA&C2D_~fQNLvLSobam|JilUM$#XE2%~o&bH!d`D>*Om%4&(DbEnnM@r0+FHJB zf1(_lWSujrqQ*cu?b(!Lnom}OOs1a7NtJ!uNsMyCq`kRsO4Zp)2oP#tLCll&8550y zwE@TiUqK3Pr42-gyL#u~{{omS9kzF9%55&0g4BzUZKGA))Hiic2g81WQ=kFX-8Zfo z=Y}tPb+66Jg2}rJBD$83yV?8#(IQ1Ps3!dSfuajyp?h90T2)$l?C>1hS!w^&De+#gMwD5ae(T>V{E1RpD0UU9MVUEhR#)Wv``7z5S?mR^oW zN4d!t-iNJKFXr2aP|Bm9IHxaE{2YE$IzK@6Nv_-c&K>e)BLPC&zhl@M3_DS!X$TfP zv#d+UgxNLGV%a1NweinBS{`dA;nZf%3|dcc37jhqWHiV+akSCVb`9D-R%JQ(1VAY? zE2cNZA>?gpkr#|6j*_=Su=I8m+lO!Yv91Qy^D&yD`2gX3g%n`!pGI2fzOhr|?4p#| zh#JR}<=|vGT^yk0sDCiFj?uwlgv^5zI2j%<#|wA_r$*2CaD5pbU5SGkg8$p)6_5J&qbC?*mI-6cG>zK1T12KKX68Vn5$u2j+ z3A&d)!!0y1ec%V)XLk_WaKSJ?=^1b5$=}z=L+%~J<%BOL|L+HnKPY=J8v)ijmkp8B zX`R4Z>;7pr7oCRD3TV-fr`NK(0<(rrnyNB#1gF179zC;d$E>54LLkLg?+Ovmu()~H zifj3zZG`Vm9mU#TLAt)-8|fDxKg$$c&Y?#Nx%@Ja8PMg@`P zE8DRo8MKD{XgoSPIUY?%lW8lS$1Le;TH$_)h$ani8ClCJb5=8v>f~nqc*e_~MaiG2 zlElO}I7g-pT_pIqj%rB&D%kj3oTu~&e=y3^K4U-pwrEq7K%=3(QF?0WBf8d=246Bg z>7=y}s+`QMrxvuYvR51)mb1X0EPJ#;jq@Gp|Lj@Uw~LSd(e?!6zACHH7fi0RZ9sB| zP#PB78qzu(x+zf|pUaaP_MMFGWb~8D=uSXhj>iL44yX_ZZ!xjz3&;pc@#(TJBXca- zQPz(V7`HL^hJWN)#(xr_spUXPk5I*pl31B1HH$k*rXMNx+$C9IfY^8EZF){dvzp^` zJWP_N-rSRO#6{#8pD!vi^m8k(b~_rDF!xEJr~$bH3ou;0eM< zp3lxhCVVv9+TFST-nh=cXOT8m<%x*}uUYrCl#%JTtp$a}nrmZ2(3aYB*0Iwp} za?7hVQddTbs-n1zs;!Rj(2^UFYp9*u0m_Ydj zL7Ub}8i>QuJBsyxi7ujhv4D&Z(~zJ{Vg4jZZO_T|Q7E%gA4#`{8--MO5}FBZ?-`OB zX(e@qs@_z9YZp6TGj_gqC7w=XUyjGq{0uKYucWf5X8mD=#v`->*Pd4i(`58es?nB-Ex(}l5E&Gdwd4x5X3*gu#I7S_S|2p%0Q z%>MKMF8fEzfjOL@BP%L*T>$Y0dbdnkAZWk3>%U?=#Y=y`V)n=Nj{E^JHBS57SLIUU z)EM@M{e!{aU@*MtpPUYdr~TtUjh^v~<57Rv*N#VxR?hXKK_t$!(iJd8hh~dWZ{Yof z063WRj14BSU+K7^==(eyb2aNniv>G`)SzE${drCoM99WDg|v=-QU&H`CT|(m^U{xL{UKpyH$`7pOQ@ zpXOBDSAz$rCgitJ5jup0_9gGBG!kg zb(KnhyevL8L{=I+>wlrflyUmI$_7omF0&;3)9Eb8JHMrVFmHm^wEVYmQq$}pNVX}x m94AUm1VWmA$}_g-s?^4P(KGIl>tToR9)rQ*@W4WM#$(UeAi8!e&p7?~ z)gW-gy1vCWG963~&rIsLXO`t6&og?4g*?;6TPnc(_19l3=M!1(hzVYJ;HNotT)0B- zF+uK}x;vA;1aSZ_wtZkagra+TI1_)q1TUa?dFVIl0pz-l`x1QpL_Sfx1m58Vp~xlB zPGAFm{uvN#i)Npwi|EcJ;3tBx9~ z@e}#$ufL3*;q5jX=sp;yhS4*&(1jZ@$(_rVZ1Hfgbv(?M#(&M0^mET}k+-uc`!fFO zrtr(GYxaF&XwO`u4P@}pJ=|<<#Ktj}{lRcFHa_=Qca8?MuUuz~T#8wXCA2-%Gw8z> zvF6U=KgguU=SPO$e|OkLmT^km9b(9AU1UPap736el4m^w-HRnVcTA5VlbpjlOxL>w zaM8x02-uk18a-p@+QzA|rgZC_zIwIdO%6?G^J?kS+rid#7+$YzM!T;TwzGJ(fgVNf zE4an4wytyk@b48Ohb!m*U5<|W6XWr*mru1bhb-}`Hth;9atcl~(WPI}I){oA?JCo7 zh<7WLoWI8Dx5ZTa)wpue%-L)(Wy|Y2wsA^!w%s$N4{wmW!30v2dVY?eeYIQI*juOH zU=J>A^!pcr+_%uS7tp*7=-z+#hvVL+Up^MG)i(C%YZ}?F2Bv7k-)Qh=z?zTY1L(T& zf&G@vt2yA(rTH4PTR4u5Ac?h1FO;ll_H#CdZ}#Ii1p0B$q~zc@M@r5S|3Cg4RTq&F z42gW~f$adKH8OYs7x*yhS12^2rg?fl0kgcwOw5DfU0Y^`i@qH^e=RRHRT4{@okRMy zVhVvtN_LwCax-9l5ob=HVxG0coAAp$K)#mueG zy+9#TC@L!;x`nn2`Jr1<>U90vACG*p7K?Fa)=d zGOoW$5Xa$9G1Jr^aPMrq(TPHhIGgQ`qCoOg&>}GaDkbvq^J0f>ii!VmFUZp28iajs zCit!)v78MNmS5C5rfzcdMGS!)bs>RTPE91|8EA=CHH2*4S{JT!#2YzFJ$cERBWor^ za?qTAd_uv6g$Tt<9Pb)%80#8w`nQvpS(TQh%4&;VMPFwWbj1nEq_Knra!5|YAZdu= zqLH*HjyHY%Kt<;bvM@(xfeCaU-VoEV7=4`@3+SQAIJSMylkHXM=$VT9qrO7iy9iSB z8k)DeZ8dQp1E3Q3z7Z~Dwp3)tfXGF53Avm^NWCjh3~KTp9w3f|z(PE8h=p80*9dr9 zWHPB`0k-^rE#e`#S))%x9EAX%Fg!rlkn%44vm9*LQZbHpcZ6WF0$(s)v-h9Kg?thfXE$o9kOB4@(#L~Z+bjL0d;`qY!KK&y6yo;EI!sJ z!Uki{Vn}{jBLYll+ib+dG_l7qz=Y$-7=rixL>f|1CCoFwEx3dB4jD0a^I=pMYrpMm zTOwTf!`S926s)%Woiq1jAZPA#1Z{8T5D#0({e8K#F+taex)|L-o4>5Y^2K1~rygwk zkY~6R!X6J#p^+X~&v(eDWNX$bdZtWCHL3)>9L#)!6cQ7c2eBiJV)*h&9L zgJ3_9JLK}cPqRcThuZ+*$^o}Qyviwb1pG7vJWzz3CBD)>TOnT=)CP!G2DS~-RiNJy z?$Z$NP!R>hzr)3beamx5VRbT%V5l62CbkY|*y2Y+g-*m2%({NWEQ(KZ#N$u7_|RW^ zq>_X+!xnHEZFz`L4?y4{dwC$*EHGJ#H77KPwn7%bA+$qqK>_x_(s4J)0*eO#!9PVn zcn?4@b1Y@9xu7)5`y=v)f#&1!(>dt zSK}4;)Gr@~i@%|X;OL8IttSs7IGWJK$h$?G?SGv6|892=&Sv|c#b${fmZR|!k9H4} z-42b1cVpwRsy8wB6sYrUehVoyQiMBk_PoR%tuB99Z@D`B`1w6_ZxLn93e_S5lY7n_ z!76pY9LKR0ofpSUa_*OS+46y(>uenl+9jiSW;RBImXF>Q{br7BLyBCDVKWfk5bMp> zG1qzrl$UUUY)MQ>&$z_W${{b3Mnc{hL_NzAGQ{goMq-HqF~Fej19fDcKhrM_y4GSGFC)3 zad|2j4qLBn$Go*`sgDdOl`aXb*aAh80hp^*e5mDBiVW|T^h;#Srj<*fnX3~=vqvUy z#z5RNrkp6^PdG)+5pC&|x(Kpr<0&H6^S7Esup8NcYD}Q@ypwMiF8ssoc8>ERIkL3S zjJq%&ZnG>>>@%#*ASvWK_ShfxnC8Wb#3`ZCllKC^O)-e}0elS(k)z+S$o{a%NnT`1 zh7_7tAUenV)!Cy}^&vyOV~xFGjpKe^>`ROgnvNzY1leSl6Fl||tAMGv-GUTSzs+IL_~M)g zOl=Wz5Bc9mMJiG?Y+ZSfGo9k9DoUhG{)q7en?4BUALdqq6~03xdVX=vnZu!L@vPI+b!*OCE=XO@>6@h@xlW z&)#Dai#rdaIDVptWpogWePx~IDGDoxm^64RPBEd3wu~^@; zmN-_#c!XjzJb0?DF5-|BdczHx_>xgqS;Rp%t2I(cx1&BJ)6VJ)c_Y1Q%OWK6^#cu* z!Uy8<3Q>`oxPlKGL?~Z@J7_bpo_TmdOcy~9ahYFEf@i>M1;DC?*NdKw&$_GxO)OAF zDYqvg;zV(PFL=bywn5OYoLD3S)JS%b3~)2s;|#K0o>7-))a4mHtz??^6>$@SM=!BQ z<36Zrhg=F+s<`oZquCk~f^w6Q6wq^n$R$IR3Mg04sHKQ<3BrsJ6$993MIP6%574(LdBOKq^g02o%F6w zNM&sCVssYUD3-UQ&f{NMGM`IlRT;5MXC;N{=k-)UShhn=UrF&B+{nLNtK+H?pLU++ zK0oqwmuk-ygO+E&*_mr8)$V`((sZB*Q;Nyj%3&5M81=GWQ^4BDfz9IEWx{ruu#%o# zCTy1pTi^S-XPRWFh~kT+>IE?!Cbnpe&^;wIm3B#I|gk zVIT#RSV;&5mvUC=dySSQsXvIvZJl)uOWQ6W^10Q7o!ux1$x0BXdK>sm|LvDL15gy?+4fdZb7Ih%Cki5|CBERJL{c zWIqtetP`hCJu6!$4cRxc3rDPIZa+jC@LR}&o-y0GZs~{( z-#RrBu4J9+&h!$kp!sm+I@B>8g`u2h>0ZGH+kw?CJo^TbEcL8Ne&JlntrnMk6^~`g zYgrH6&inNQVEAh$v51Sa{+r8pf#HlKLOFLn*TRNPqCJ(VhF zQ#lmc^T4@K*u3Eou06Aa#<{6cSBS7rU)KhTgOOW5u@>S&(IQJH4l>8aNx`jP&!li~ z#ga*3nOW)Vd!2YsUwSiBCET=LAs0Iq->4g>M!(-59Ps~c`u$V>-=9XRt#LZ(hyRp} z_N=8pzEdw@=j7^~T+hMDrDe_}8C`4fC357ev2@%Gq#~;l9Z6IrbMHS!n}Hk7?Cf%YWn>ymMsAx!y% zbQ9QRXhBNRW=lOl9pH-hT{e4{&E93RKZ!7$=H@BR>t?ghRoU!ZOL<_b>~V&me8%E2#RyvD`$2JRJ)6A~IhUi8zAAMd6HHdG z+1IZmXTt7^IvT=;xxw2xqPa&ZA)sceX2kJor&LCKW?89{daEN&X4nePN_ZGt`0E#h zS8HmV79W1>lY8@Iph&9b7LNB0(b>hh^sq{Ya??Nx$~-Vy-tsQganYgQDUYJl12jU{ z60BR-kX@~ZZ&>R=DtfYnm=!?MHd94_@sg zxMWyz^@GT3Wa~#4mB`iJ6O}MjWH*O$F^V&*r4&Li<EIB!mSxC5epM~%J7~pJalhEBThz&m3aG{eI5~vXDj(dw-0ivL9bmIQonL}UOZKTiF64hb}vcOj*qfO{gs`{x{m7xRy`XZCKFV;M-h&NjMIKB zgF0EVy6hnW2d8yMiZWxn3qq)&TaOia1VR_QMU=-6R#mLLe<`h6Nr&=bno*zu#!phR zztfPNhAh&MoviL;wJ)nr6lo5=}%nUy*YlMA&=h4*5d5hA@voXCplnBRcMvTX&P<$-W3Gz;mKan7Rni>tAFTT?yI=W=2NUjQmsEwe9 zM7Ac%h7*<1C<#dI?+a1`HlEuL!`Ss zNvFRw^w(ICw3QapSuUxfzlN3c*Oluy%O+IUuxZsb>{M5$x}Kxz;w;l?txjw0r`9@B zWI0Ci`N~DjY`h{s6?GSCYWo#|YEF$MX4h%5PLn-DO@_LCSf|nUU87ADslyUcU3V)M z0ji|Yge00_%WFuTHMlEFOs!LAojQAV>MY_OO)3e`gBvUTG;b7MNy3W;FPBdlUxp_s zvefDAPH$`I?c?0q1%B!6nh}CADDB5`#0G0dFDJ3@VmLa5{45l5C&N1#?#uA0Do1`t zDBhs?Zs9$6oOLS6@H7;80VmNXY?N2SDFZR5kW&h5saj4l%v-6UmO?VK%-Q$fn-}PL zQvRT?$T((JIwq^Lh2v%~TF@c-H~?LnCC4<0gR5(mq)=AVCl#3-V+dp?h5u*orr<4{Z4!}3WN zA2Xa;7U0GI0d)W*z}X@KJPzy-Tr2@`{9m59LmClhw^{>l3rz%|i+G3LCxS4)LK*^s zzW6=B7i`;Lfq>~EMuR=zxPY#)2TW+&{#)BIZvnIAZLo1%^oazcnUKW#9yTU1q@TRS zyD^93RxYNF(`OShroQ7j!63SKM~GYcXV?nvHVZCcI2wx_8R@TD#vkQ>iL&=hW*4h0glNsQ?gtUHknx4pxeF>rs(Kf51|(W`sxp!* z3nNZ-S{I*4IiT#QN#+e#Kd|=rSE9tV@ch^7rtR`c8XdosSfW;C^rbk6?Lg@4RZISu;>n*L3iWqwq}e z#;+kY*Vic5_nZNqdvS+qgbHSNaz3h^avC|j*&qu;itGpAA!2#_Mho^HY{X%TFu4PZ z7_L?>S}}UzcN2)Fho6Wz%Jcv;pa5P*ouNnmhceK#_5}v&<&s=2lGC(;Z@i2=<_Bdm zt@{>Y8(HET@TOZx*(bb8^gsM5@AxVvh~Imw^7=bAdb94!q>EA}koN3oV5~@Nj`P?R zA{JZtx>CxAqmom)cbiB+=1Ql^mz>CPFP2FGQm!veAh5AVfwKf#|BWx30&zqgwm)am z1z-Z`8UcdtX(XirIn;pc$-O=$^SWIb^JKTC>>1A9_58;U@j?pUTd-XUbL+MYdT;0Q|!v8`klq$H6qkKq0_(xh9Tx0joq9 zh5W(Ug03MIj&1wl!1qV{T=I#0ftd39>A3qESP0r4SfC~Q!IUN2^LxQDSjSAyo0*Ok zi7tXf-b45Ht>b>!u3TtUio0CyG$$6ob@v{G>rO$$jC;ac*=Kj}Y`zYU=Q03`}Fza2#kuY?(x}kS*f~1la-5wvh!K z5}K%(fH#{heE^ON{(zXCb1vjbN8Tqw9Y9^YS|K;gOhVALA3DSJ$6~{y+yJ6*Z&ZT^ zLl})QU#Cp-t;a)SbH4QeM;04v{`WL!iNDZ z%SE1tEPz93-1UaJoxedASUdm-{)t?V$Gt!>b1YG|x_FxOm zTV#c!FxGv^oo^7lXRX%ITOTGRitnusxZFQp`o8)6I5%`DB<1?&IcZSMoadyWwt1c- znSquVC_c{#JVgkN8s(heSY zN42^9_&M~MP*jIof`OidYhtrf??^cZ#k@UR=u&L%Z0Lqwo`$xIiAAhf*DYoZT52#g1DV6ja=29(+Q+?>nv8NR zGb^oZrjv7iGVS;KvF!7Ub6(~yo`F7|9vx5mJtHU|!hb(f^Y$<|Sjl5rVONX01q5CHFt1AGmxuE|F^qJjMbWX9*x!;k&Td6j(ffi}N4I)tg)0>D!gHi-jhFWcp-MOZW0mb1U&pcqhkSBuH?}|gY&y#xry!m7DWWO6 z03p>&@+COoS2K8i#l({5U?|JXGjXs%9)+8&-pp@YXy(?dSDHEzTj>?zLN%z<7Z+a* zew4%hvcLqo4{wO+aKHGev49?$jALj=Y3Z@QvxoLIB$l%w$n$z&djx_I zhr&QGufc1uq^l6G8qF|f=(T%l!5FYEu=H{~I?7GH z@IGv;#5sMT;^*+2()j_hPjc<$ckYlc8wn8F{vE^CVAzQ&O+&EYnPpu% zCd{sh7Rx4KsEvR2(ehX`38yx5X3%EZw_NBx7bb&L)cBV-<&z{&7;X_ocH3Cmq+fjeEK_hfhaM^9^2Hfi@#yH}cr+bNrmc7$v!ttOh5IEUnl!*=WG$=ASKY#swDxaVB>Rfp3*1$!6;ArjQ#N2qD@f(jfVC{>8YiU=vr4Ae982rlh!_{ zax$}?TF}1AUU7I>&H{h3?9m1_&Ud8$vu9o3ECLMcQU$@(N8L)I{|q)9uHJGph6tH#l)&FAR{Qnr^~*K%&}xgSwBi( z+{WA+{*h-H|4D?VmIEa{LKQbkVr8DxEbb(kex%rQmt=(jV&9#&={XtAYL3tGFiDzz zZ+@mL7Ylr4eLAO7EwwvRrDx|5R|$p7`WNm+UV;~uju}|990l3T`GP-#CkP*TK06PY z@X>Hakiu76NY_RIi>k^I>|#*!kL(csh}NIUY~*Grat~lFFi*_1E!GClXmSHhrvF&YmxsAy#3t=i~ju z`=!$fMqT>RK8esh*{q-BX9V524|VtJK8Uur>@OCMqvOo>(UA*4@m zcl-EA3HmW9-y%@unTp(_z9L)Z568Vl?#v;CF+dfGn}ATc;6(yT-OYO%CAC$U9F`*6 z7FUoG$3lQQY%b!B1HSO49=N`mHCP&;E0Xc_yf9EC9|&UjhqI`50YlVXeO$KNVe9b2 zhwyAy$k?!Fo+%N5FE~3Z7^BqgDlw_tCLV&~j>>oWSA1WI8!I7!Rf= z2h-&e9-J)EvcH`6CkUZfQAj`JT2&r$(C_;(F2?bsKOHP!|6np$SO?=HcyzEZ`_lus z>>n)$=5T_Jtf<^|0mK{V-7;x`p#AEu|BCSxFa7}L*ij$&TpyE`0np1IK z4IZGHkl#W{^o)xYaa?qbJZI;cF}VGAPNe{wP&_t>lX z7q~S}2gB)fe9|9Gr_(-v9J$MegYofrI+~29J!5wD!81-L>h`7QN>c@wmz<-d)Snq~(