From 1f43dd24ed898159b3aa6bb3f553d0532ebc475e Mon Sep 17 00:00:00 2001 From: alexsmith540 Date: Sat, 7 Mar 2020 10:04:46 -0700 Subject: [PATCH] release Hangry NMode 0.0.4 --- README.md | 51 +- core/cBlakeMiner_multiPlatform | Bin 66736 -> 112256 bytes core/cBlakeMiner_multiPlatform.exe | Bin 226852 -> 186196 bytes core/cBlakeMiner_multiPlatform_Linux | Bin 110680 -> 130936 bytes miner/HandyMiner.js | 3614 +++++++++++++------------- miner/configurator.js | 94 +- 6 files changed, 1944 insertions(+), 1815 deletions(-) diff --git a/README.md b/README.md index 7c4618b..fd5749e 100644 --- a/README.md +++ b/README.md @@ -22,18 +22,21 @@ HANDYMINER [Configurator](#minerConfigurator) +[Advanced Options](#advancedOptions) + [FAQ](#faq) -**Current Hashrates for King Cobra 0.0.3:** +**Current Hashrates for King Cobra 0.0.4:** | Hashing Algorithm | Maker | Model | Avg. Hashrate | Windows/Linux/MacOS | |--- |--- |--- |--- |--- | | Handshake(Blake2bSHA3) | AMD | Radeon VII| 384mh | Yes -| Handshake(Blake2bSHA3) | AMD | RX 5700XT| 303mh | Yes -| Handshake(Blake2bSHA3) | AMD | Vega 64| 235mh | Yes -| Handshake(Blake2bSHA3) | AMD | RX 580| 149mh | Yes +| Handshake(Blake2bSHA3) | AMD | RX 5700XT| 330mh | Yes +| Handshake(Blake2bSHA3) | AMD | Vega 64| 310mh | Yes +| Handshake(Blake2bSHA3) | AMD | RX 480-580| 150mh | Yes +| Handshake(Blake2bSHA3) | AMD | RX 580 XFX Black OC| 178mh | Yes | Handshake(Blake2bSHA3) | AMD | RX 5700 (non xt)| 250mh | Yes -| Handshake(Blake2bSHA3) | AMD | RX 570 | 157mh | Yes +| Handshake(Blake2bSHA3) | AMD | RX 570 | 150mh | Yes | Handshake(Blake2bSHA3) | Nvidia | GTX 2080TI| 508mh | Yes | Handshake(Blake2bSHA3) | Nvidia | GTX 2080 Super| 385mh | Yes | Handshake(Blake2bSHA3) | Nvidia | GTX 2070 | 271mh | Yes @@ -42,20 +45,19 @@ HANDYMINER | Handshake(Blake2bSHA3) | Nvidia | GTX 1050TI | 73mh | Yes | Handshake(Blake2bSHA3) | Nvidia | Pending | Pending | Yes -**King Cobra 0.0.3 Release 02/21/2020::** +**Hangry Mode 0.0.4 Release 03/06/2020::** +- Lots of bugfixes/enhancements with pools +- Reported inline with Pool Estimated Hashrates +- Major increases for AMD Vega56/64 and 5700XT +- [Hangry Mode](#hangryInfo) for AMD 5700 for a bonus 25MH + +**Previous King Cobra 0.0.3 Release 02/21/2020::** - Add support for Pool Flare - Fix memory leak in dashboard chart - Mac permissions fix - Update sample config -**Previous Release Updates::** -- **HUGE PERFORMANCE** improvements: variable 1-2x improvement for hashrates across Nvidia and AMD. -- Fixed dashboard errors for Nvidia HandyMiner users. -- Added support for F2Pool. -- Fixed "high hash" errors affecting some miners on certain mining pools. -- Improved Windows/MacOS installation packages and setup. -- Signed tar.xz included under [releases](https://github.com/HandyMiner/HandyMiner-CLI/releases) so HandyMiner can be packaged elsewhere -- **Benchmarks and other updated information will be added here as we obtain them from the community** +**Benchmarks and other updated information will be added here as we obtain them from the community** A simple wrapper for the Blake2bSHA3 (Handshake) PoW OpenCL Miner @@ -144,7 +146,6 @@ Required items to have ready for configuration: Optional configuration items (just leave blank and hit enter if you dont know) : 1. Pool or solo node port (probably 3008) 2. The stratum password (optional) -3. (Pool-mode only) pool difficulty (1024 minumum on 6block, 512 minumum on hnspool), or set to -1 for variable difficulty. ## POOL SETTINGS @@ -186,6 +187,26 @@ registered: **username**: hnspool_registered_username **password**: hnspool_registered_password + +## Advanced Options: + +**App/API developers**: You can run like ```HANDYRAW=true node mine.js``` or set the environment variable ```HANDYRAW=true``` and the miner executable will output raw JSON. The dashboard application is built using the raw CLI JSON output. + +**Multiple Configs!**: If you want to use different worker names or pools with the same miner executable, you can pass in your custom config.json into the miner like: +```node mine.js myCustomConfigName.json``` +Note the miner will default to config.json without this argument. + + +**Hangry Mode Update 3/6/2020**:: +We released Hangry Mode for Vega56/64 and AMD 5700s. Hangry Mode is enabled by default for Vega 56/64, but can only be enabled for the AMD 5700 as an option (for an extra 25MH bump). Hangry Mode is more-or-less stable for 5700 but can use more power. If you are close to capacity on your PSU it will probably fall over. To enable Hangry Mode for AMD5700:: +1. You can remove your config.json and run ```node configure.js``` to auto-generate your config.json file with hangry mode enabled, or +2. add the following line to the end of your existing config.json like:: +``` +... +"poolDifficulty": -1, +"muteWinningFanfare": false, +"enableHangryMode": true +``` ## Mining FAQ: diff --git a/core/cBlakeMiner_multiPlatform b/core/cBlakeMiner_multiPlatform index b25c95d00e8c5d23f5ad46adce8a379f74368601..8cca091efbf165967e806a790a292787dd8162d7 100755 GIT binary patch literal 112256 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 literal 66736 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 n8o@-5+1#V1n&PSqcU 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

9&ZF3jO8x| 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

    Z|4RDIPmYCjj{f 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°JxAB4puT1U>f?328uk7g@m9^kb2VZX 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

    !}T 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 diff --git a/core/cBlakeMiner_multiPlatform_Linux b/core/cBlakeMiner_multiPlatform_Linux index c784afcb2721cf2b2573d91113905fdf87232d67..673dc7c4e3db531f7a820f90ae07944d211f82f0 100755 GIT binary patch literal 130936 zcmeFa4S1YKbuYfMeVxaEx?iR8$Zw321nu@lR-oK=x6W6OzCJ5g4+>~CS{)(}&z*D7R# zK^*&zN3$W+62))3{MjpM`P=@rT%7m!4ob4@`XL2}?A7LbEAmm!%l$1gggZ=m)%0?T4TYb* zs+K~bmQ-@6v!f*yUy(|V{yviuMA7Q$)B{hZ`;M}(%x28l$qU&tcgGM z_1*vU<*VQLbDwk`|MTDbolpJz?hn2AFljsS&$b(Gkys`$-ZuT0M{U<&vh2448DCWf z4TXLYj4Q$aR~0zx;Z)%Bk5%~pBWNq}k5=JN?Np-wN)`C#DtsQTLf=q@{=Zg{pToS8 zJozeo5>@EmUxof%Rp`H51-`EepAS}{e?t}eU#|lHttxu^y(;ix6+TO<$dju=f3^yJ zGs<=Fuk`ooDtuBPtkhl~u0nrZm2!7hp+8=QzNrfR>MHODs>u17D)2wAQtlV3z^|!N z?pvzCtMK_u75GdQ_$`p%!N1bqF#syH%T-n6SyzSsgP?CHWsY=f6+Y_$|C!Krq0|5C zddX#9NE>bSRYw4G!)bO^*#` zbJ0w0a8OAr62?+JV{gkR@`-JmcSOhbCEk+Aj3rW`SZYTim562&JqHqFIV5jSQXkiD-Odet0;MF$^>5 zeVOR!#(XjrH(BIiKo;)Lk4L~Ng~UpOd^^~Y)X%gM#tiBWo?jGfo^#_ z6FIG0cV?f9H6`7d%#G|!=QA>=;WBy$OuwU*>+&Pp?u zOHAb0Xfd`|XJ~jhm4`YK6UkgCJDy37<%UDUX*6hPJdw$yGoi8QSUQ_ZB*sI-xkM@z z8qeplXh}3;Z2w?vWdGoBG?@xzbD4O4oR?gBzg|+I;eCl*jENN3<)?;aDo2O=zxsDl{5RrP8qw$P;4+Lc>sFoQYg=G?5;TM-PRDjhusnv5Dy5aB?h~ zO5QK|W257cjkPnqY&4o23uVV_#WD%@!U+hU3*Fw=yK&QCcx8us7hbt4)W5xF+orz3 zHcU6%+g9}W1(;QEUa?T_7MQ;o416M5nlD;$#Iq*Nl+IwD=ztZc(s18&g!Pw1c=8TuzBy&&{ghThIk?Kp0I zHFIIUZ04aBe$LF-7mquFw{V+2omRM=uL}|Wobkb5Yk|1V`rtqBgP-%kSzr4*?}K+( zAg9oc-+{bL93a{G~qZ?_M9=s6bF7KDcULbBz1o{&m5G5AL5AKjee6Z2Nn} z2e-N-?uZYLhID_A`QY^~G!%N=2Y-bR{)7*HwGaNJ4~~xG{*L+J*SOG7=(rEQ)CWK5 zgR|e+-zgvbXDkrc(>}QWId#Sd|5+dXtPgIwnqbfQ;HGN|{JanT8XupK=_l0vbw2oF zAN=Qh@MS*u>wNI*eDK%%;EoUOUm!I4;Qz%(-|BjqaY?_9X_~0HCnfzVrn%&udtB1>Ow&}&9g*|`rfH()9+LD+dy(ewm>ZY$ zx0t3$n!8uh-(Z@iXl}ctzrr+4(A)+|e}QS5p1D>@|0&ZnIdhJrKg~2v&D=6cKgaYn zOot@>G}B9&KKBCvZul_MG%0guB>g)~)0E7elJsvgO%pPAT++YEG)>3clal^*rfD+f z9+&hlGfh)5cSO?fVwxsm?jcFv&om!JbK{cEFilf2cdw-HW11#nZo8z1n5Jo%+aT#* zWSS;nu2s@In0^D(j--Eq>Hos?GD&Y_nvb}-kfhf#O;a#;?)$8Nm}!UUGm>7;G>87& zDM>dl%^^Q`T+**&nnQi=NlCwoX%6wZ$0c3QG>7)w5lJs#nnQZ-AxXcq2WbxFxp7H< zi)jwwxqBu34W>DC=eA4wD@=39&TWwN7ntTyooki!pEAuMI_F6G(@b+{&MlMlb4;&f zIwa|*ndVTOJNG@-pZSN6AT7VPzwa%)cu%D8mB{2*&ut&*n_jebb0`#A((iECud`AFewxu3((`$f=j=)Lmp3ulH`E`8&} z!vF5)IqJMLShg|W^s42;rs)UBA35=Zg^|L!$cfq8B6TlBUi?AsIxxK6Fua-!tMPki z{oG?{ynIV!a{YII(Fs8^$a8h1xc()iW?zXK&qna)g+(VoS4VLkqF~>C9xPEGlHWZy z3<}=CiriZ`{GmeriFl-V#SLtwNTKI^+wqy6kI_U-9)99N?#g1%6NR3SMW%cHAX0el zS#tY0|ID6(z6(8{DE9n8;dtc48B}Rz_CdhF;xvGf;?~nolQ2^FEHJ;V)RTul5jyl5 zsO6=NVDSuqA7@Fk3(B$*Yrp6TZ5Hso^IEnKP+&R)!r=?R+T<0#V`8OQH&^5{Ee!FS>Ct*i%52k_c!5wvgddm_@H;Jd2Z>u-iO}B zQu9lov@_@iXJ3orE2_MhKOc{@cgSGKEt-7*ygv2387$+G!r^0)LjK7}Vb>Fdt?%zE z^gPyA*m|U7^h9QQ&ai2VJ@1EtPDQ5kpNULw#dX&cC?0+J+_UUT6!n{|QK4tH*z=jG z<1#LOV*`512LRTda+U;>haaoUufpX_D8CXcX1irDn4UTP%6B7=jtsEX{&AkY^D}3c zms0yik)@3&t%$I+@EAEv?>ddfc#@f6FSQ)aIf+Ln1^-*s_vy&w@j9j_nbzKbtmqYW zr(OUh2l4dwI<~51sIvDKPI5?DcJEPk(tH!&^_p@o?o|6wN2 z#a-WfWLdH2tCO>JYkJP-HcuY@UVZ*1sS)dsVjt=G?n8&aTc2xQ`fSg4F$_*e3ZDb& zG3e8heGFuUp6?;=h5Uazd&QBnbw^N?R|sU7JbXTsyOM>TT_j?f+Mp(=>uludXExsd zwZC}J$3GW=%D(%J$n+KUkrU@%3tLRUiSxHbns9dt%0C}D7E1p^FKo+&NF7or>2BL~ zsTn-G^3d?E*}~SZZibaa*F{?`I`Zq+hc=_4k)o8y0e${L{&X>a=8m4iiQd9_48v>j zTtqXAe6y=jDNHw)A@2b4viaWwkYD)8Z*E{ypujVQU0;k8ww^+Pr#Bb2Vk9iOO_))@ zMb{#K5yPX1;elc~t-X++-CW$dtXqcvUVphC|BhSk7k^F5eM3pP@BC&fhF0O3FJizK zo;r=crDJn?eI7h#zx_|(RhXIuMP%|BUPAe6AluzipumfgKTS^nYir!VHGxw<90GqipM~(9<7(8)Sv4CrCZ{3@@suRX`eeahe>8 z&s;%1#iK%6lu~7tGQFx1w0BTXH{b?(`WNWwrS;5DJ$)Z{K|QTz+f07Kfs~XT-S7Vi z^~~&HY7nia((n>m`tWa1?xFy>Z3Sjpk=ZwrS`qA{N3_Y$F|#2jrAvN}_~Mk{LH>V~ zocct~MXk98)KBwIiws3kw`{S=UM9f5K|ODL3hUUSN2 zdesq=^A^o{nmNA$nI@kRiStd7>FLKb2XRkx#fFI;3yYwO6r?(Hzvkws%imZ%$7>`9 zt9^Dz3s{hcHJKu3NXFWq?N!7=KY~?1+p35w{0M5{>}wUV2;y(TROi%Ebs=k{@Kh_yINB_UX$P0S!qj!Rl-RAA zsSN;9g1M#Wu0=`ur)N{lYbM36=B12_nJ_ikg{ke#JiY!w44K)N{-4w^LeS(hyr@Bo z>v$rd#GnajQJHYtWqQ?}pcR8QfE#1bnj}9BS~Ko~25tBsSQrf2^wDvaYnT=ANS~Sg z6!vu{@xaBRQp*7B1JJ0M|KSdZlgw6_+O4_eQkc3|Q``ptZbVaZxkYeGAO0vbdQoK- zPN2iHK~M(OsU!NAcsI2fee-@1JMqFlVeKpuRm6jjv1yO!Z;Gq1d-A~O%Qa)F26 zr1XP2&40@jyV24|zr@~1EGCqJsrsqEce|lZKQP10AIB`{B-WIm#u^Lj$;so3F;zN) z@KZ(T2NE4@7m>_X}3qlf4&XOPI zGP^Kc!?gfI)^pmOkuH;Y7ZD`H`V(dT(l;+$IO0;YmW+kSbk7<4Oj5gZCn^S}XCldS zvkO^o&I;9OK^8Uqc)$e1ne=xoMs$<-#gR1J#R3GKN(f_w2`;RY+G<_mc zID;0v3R@=&b<1JuA@H4@OZ$R~qky~LzGjxn@F0#D}R^bxNt%b-yhOjAomZTRV@j#F|BVqDBB6V-Sf zCU`SbPXNY;0SxMU@v3b0Q*$I;^b7CS8Tl^@x1*v??E=%&ab)Q&e9E_uEWGe>HrMQ< z-w$PU)Hnn|_1;J!K0PZEJ`OaBrTXvyc&*_$O}S9+>pj#J z29;4%?#*@vn0sAhdQmg@yM_Jh&t7i|o0<9$iZoR-Wjv4f0IXV5c^SWFP}i6;R!ly_ z{B?P^usjR`|XEqVUglfY@I$+o8mJx+Qn(9bnz(lfZDJ{w(9B+GJH=Tnokfn zBlDb4XmJR)r%>z$ZILI5lo``&A)Z>Utx(>~RL<0G?h8sOed8#h9BRcYU{t3b;o@OZ zLU;-Lv8#o_@mu)JXEH*ndPlJ`F=D>idGU-(&=%{Olb+1isR>pptia zd?!U(SPBZQmSX9n*J3gm=+aGi-!uCetvj zvYK@n)EPzPe%3HNapuYjjFuYe50^9g7gM4CY8YLfWG79oXgR|t4Qk807{0^gT2{_5 zX;AaZ&$xrK^-O=3^_Ul|B z$!g@pJmo5UI#M{&#oV5S=U6nRZJyk`rP};5&TQb^J~a2XU;_+ElFb9XO%1rsfwpts z3Ra&8a5i7ly7n8WBIK>gwcl_{NITcmd8nAC>G0p+`XaXJF&*a&;^W+HDCmxG(WSbx zgz7hxYB88Ry8#?E@1#PP5z5w8=%_-kBb28=6v`bVl;cp0;?y#ElQ=W`4}Tq$rcJ3D zmFhY}^{Eo7S1460OYo%mXKuL^rn(6Ar1_FUHxP<3V5Iq!LL*uZFEhYl6UP(ygG#bp zNq8|N9+yca*$v#Y4sx6NEA(E?X!X7bbtpV{;u~+QJN4rE!qmqwuID#^iW{yLlhymv zJx1oI6yMI#{4#n2L*{jlRhrqsOrt-Iz)sGOx3x(HnQrUzWPvWHI9ug|ftQb5p5(=BU>41IkrzMMXPTLsK)+!}#cKs~H}^l0#M6Tvtte2~&bm`eKN5PR=Zh#y z;73W#rPt(h+-DKwUq_~UzW6jpirssf9setqjRy>ikyn;#80tCV}bb`MGDkR;70|1 z$(p_Q3&JaX{toh_xL5H!NM+knWO?gD)386`c0M;l$3_9 zRHtMHNtGuhwZ`&&r$J1es-)gZ?lB|j+zqfGQ0rn5mQYWvUjie69~F2|*fSN73v6%t zas}i1gSoqk4j3IGOyYJfnmM{gNP!%756cy0SXc5fqI3b zf1!gZH*BqmhUBvJBa}G=0IZ4L=vfhi-B9-kB_;vjyk+L4AK9?L4`1lP7e2CJ@)<7v zF|~irS88$b{7iOn`xRb>4s(Fa%sbD?#Oj<*$Yp;tQg_a5Z?s%*7Yw`pf*M@Z`8M6& zIPkgoJ~c2w7QMYw-cbD=HnW!g%4-(Qb6emPo;@^Dvqxrx}q060j%8qfH-&^J0TuYMzJhlI2fPo|V`oLyH&XuMSR1>%KNf9+y`p z=5_bvGqQ)X^x;oKqw^~KRPmw3nCnfRKk$z6d1gGqj9wmlHqWU3q;#m0fev*N59Weo zoBPtdn{7q}J&1fWQ}2UnsP(zxyxA0wGV^q%ZoZ4t*k>b?Ct!FspIls=CXYz$QvxY$ z{`BHW5vgwS86plW{gn~fC7s908e46a`f?PhtwysSp)F+VM<|EK<#I+s@sX?1gir4q z9v&{7{O&hie5r8q#Q8TiVM7L!_^&Led#-S@=@gf&oqU*L>H<4Owd3|)l*rqesmD!Q zoZU9h!jCeiPS>c`Q;Q>Y!gf+vV#CxbKypz3VUMYaWY7*dQ`WcvF-W6dz5~Pw9rb z97#g4kD(x*w|p~Oqk!|4pJfM_ItPtb$RyL%@=SlIna;Br^ko*RAWv9Jdy;1vW%6tb zn$$cYl<(zPc8S&Zduw(JaY=w?V@D^Js<&S;S_RWWlshvb?`?7BQJ6S=jkl$+uO`!l74MX-woL z%dM5O$b+V&6r8G)EU&1LWu6T+eQX3W&oh&;%G1-QHj{>%{QVm5au3 zpS=d?=Hr;OQn0g4q`52G9*VSSX{J!kILGz>eB^lPXFNH+j{8b-d{$`Y zB?p#7N6@#6vu>1c{RD@#&t@c{-PvD)YV|Soe@&AyKU(7v?6ZKY z%vg{-q{)!M-lxfBCb>tG@-PK)pC%oHU9U-*1p>QLlkC;S5Ie``&>d!`-VbZWs?6Pn zWKoi`#W-c^CnKH5UjQvkJ%rpiHfi#lU5Bj@+@Cmeg>I^CVA0c8bEAut>>)UsjZc{) zg+Ebsd=~1MluTGb3!k@tbbc10IN{scx}4eQ=Hk4c6dSI?`4?8Ec=ThaAB<%etHY-R zz9;IIljLlzKf|L8;~#GZs78DvHl^xaBk84&eh8b1IH65-qsfyd`7@e4 zWs(b!oVS#G5>UmTd^sxSqf)GhC~|7M5v2W3rN*)V0qZwwl3kU=uh!(fCV8bMrNaaJ z-4`V<2Lp*`H7RpdB>&-A!OA=o$upXi$uE*GYEq`0NIs`YnNA}4`@6JcKWYC(I__cd8%42j7{g2#dz=?9JGkXGxDmijS(;c%%VP zJSt$kNR;#SOrU@Aa*N3S;LOZaA5vs8$ItDH(uRepfrr7(@*ssdIE**rz+jgZf7!EU zruO2F*>Sq*5qr1Sz1wb>pM4{~wIQ3wq!Z3O{K?%W-=x6tcqRJa+xae4CHIvYNgkK& zdVbT5&+AtlIUt4uGZ;!^zN37>d`DR+KR)-#4OZgJ24}A=yioZ3>@RBbK0-MwaS2K> zedNh$AryLf*H3R&*hd@31XMbeDh84ejegd6#Qd$trN`+~&E`7A)2c%|KMq5gKo)Y1n*&vDO z5nPH#1v5Rhp@2uH?hN0FEiI8MQo!kjyHDaXmN(eXSiTGiBGZY}d%E{_-`#yr_u$>n z4MeYpwyJOXhHI{M=(=MCuRFU7-|sDar>}`#FYre7`wM6P@EABu{e8}9`zz~j zqp$E%U*S8O3;)o4;o2`oCZDg1toiHwH!w?CyytFP&htk+{~qwG;rjld=MU<$@B=Yk zbK9Q=dzK}hdDtn{e;Tiw()m<;?53QPjKjxZa`=!Fb;ga4LE`JT_4hYBJzKW)ZoA#N zefuuw&hDMt2AnPZyS8n<{x;`^Y`w=K8jB^eStmMn$cc*!!fYt?KtqDg3meupSkH&* zGq9n#AsGksh9vIbF)%+Ijpg#0M24^|U}MqIguS-{DgEJB`pS%n*Fh&Yl5ob2$3lu7 zS`kaFfV;i*oBF~lTOCQkb73m6VmyFjju?I(Z8c4$I>gZ$$evqxa7(TEI*cw4kuQOMsp)8(&O;s zm%KlkLy3xo|33IFG}y7!A;~fv&E{5Q5~=6}I5DF_$J@gYGXs%xsY5F=>HJt6_;~UF zT5Co2Z5hbkkFWOdd!QjX23LhvV`J&Dn5eI{tuvLHfIf4F#tEP+z&!NpG>k;EBRk-+ zv0?2EsZ_qXVc&SZcQX>n<_4>8n~omX*A{NgMglq54Di+WZ~TeyB0uFR6Q4c7N}f*T zsYS}3O{Wed;senP{3JH4&1Le5i^@L&mx{J$QS5=9t=mH_IXF*jiNIOqp{>cWM5ZNl zLl*xf^Y9E7#&;;vIssOhMZRx1Nn%2%xTW4o0 z{;X;Zgm=G)F1crqHm5#GYwkhfislQcMmj~&&)XAmAY#B|t$b`Crt%##< zP(c`uH|X#Vjlm!!qf|k?vwcVZ9le`-obCaqucv$GfYa@4>fgGx+u7N(y?aOZK+k5U zuNUC{Ewtw$dbGmNt3QU6cC95MMfWH0 zWXUGbq01T`Js&@(8(uUwJaFy*zWvMhKYSY@NN;MF-}ATCy?)^>9|8nhwV@~f&xH%; zaXtPA7cMxMZJomPB+_4a>cWLCq_4sQc{i?4;JG(}>jBIh9>euHT#w<}{;>-ePUHH! zxSq%LotQ0Lht0Q}pF@6JKl};g$8{|>btZ7#i|b>!egW5GxGuyuGpBKV5=+~~*r?}H zXgjX0xQ^h;ALZn)?*1L2x`}0VufO`L#YgI{T1NOAh=9y=E@pp~=|iD6gMjo;K6&B7 zGV;D=*_Lar`-P>iIJo$s&~2}~WqJFX8_0wCH{;)9zYm!RFhAzqi+{g~@>Vc^_chDj zyye)uFx%lq^zLRYgz-L|j8`xIBe=dN3(Z$o}a};g+J6Jcn@-6(p6(o2A zKzo5div`>-q0Kz}yB1jdgTU`V+jEE1#V?q2`M(eNr-2tmTm9WFXsti+9|QjFf&7Qu z{9gqAbiiC=)y_J%i;Gu;NSF*7cTs+U;gdCy6{)7m|pbgm6KO3e6Li6 z+@+11QIE&rQY1mZ#%q@S>Vl2eT=y#rd#-V&uh@7^@Wau7jXz-H4PXi=ztSsXBJg*$UP9;1q)e7ffIYrj5kF_}HqOE8P1>#na5_?c zHr@f}#r#?PKmXuDnrW_c_~XeS{$_b}3O^qE;qSP?bMJ@0ubcEMH0k=Hf3->5i&++h zHjFs}GTA~8an6gMUH_QkLN&*4%&DGNV>jkYJ)F~kB z151537=Ac^ENLqjzU7qkXH7-1w3D>0hhhIiyKG1~6?xr=lMVcJn(G#Gy~A9G&Gmq} zzS~^iYpx$O*N>R%3+DPcbN#xxe#cy|#7kWMUSqB|nro-IZZTJ${NQicTo0J*yUq2z z=K4W%{fN1~V6LAt*RPxFcg*$5pH;rEG1nW-wbNX;nCl(pI&7{7%=O*o`d)MWpt*j; zTwgHP&zbAj&GkFxdZp=zudy9c#kuUiHcm)shL+{}tB-B$>wZg*!;mwZ`kdtGcq)PI zFzm`=Be8x{di+pEHcY~;ZEKwFRAR!}Ig02vP87E*v%KAqKsce1RCH)%E)g54uiu`? zj3%?((RPwqX9S^$h7LIh>4S~Kc(a3WG6^R=?8HX6S=!7^C+^Q9*i9B0(nC1}jNz^v zw;IO}kuo;|Hre!W?jZKUK^%9Y*=#zN#8z?KiKk#?3k-UB)cdiOUd(D)PQm}JEQ41 zURL0mkZO(Rhf)Z0)a=9&A}Es_%I83tB`}s4V=mOAC7ri?g+7$0qDm4|H$r?du)5tJ&GoJFtyBw}5H4gN@38-c7sux_3C+ckS5TzZ2V; z+ctykw%%=9cA%7=tv%ZYR-#nEoSr+7aCSzz`}(A)?p=_6hsd|7fBRiKdT);mIFbIo z%{>5a?15z5E7zh>sZD*|y<3}|&D~qOZ>MxSoPG$rL&%JDcSd>ygz~!a|E7W7{%x$r zrv7aMJCJNfEq7o`)nvW1cV|zt)4ij2Cl#_~M?ct8oyb9*ZDYP|J<5fu7OCA90SOhh z3zfDEoy|Snec*-W*%lyPS#Rvh@|ODgmgV*JI}(WO#qD*cH(*+_Yn^)Zp!T)SNG>;? zUE9*K4}&p3v=ZC#EkhYt0VGJ{5XQC@fVK@oB0ZV_G9BA511oO^b}SuFa6HFhq0*xji@1N}ZEY>teRyq<$gD8z zjbvgzrO=nbHy%BZSOI$g6POrl;hQ(a7;AxuLoK67;7!oPcurplY28{>9V=t0`ueTu zEZ!rGa&+<4pk6e|Bv>Unq&%oY+RH#EFgP9jSvyTw?au)>mi~uv0!O(wTiN zBiVRM4yN2nh>%|``aY$;UYp+bgZW(R9cOTGQ2yYr_wy$}V3K+ntaly+<%2Ew!+-Yo zpnx?c@V&fm9Bjg0;564wNC2rU`B!pjl9^D1WW#lE(9H$JI_4V$QvNd6gUI!uNFZe( z8(_fRYs*@RYJs&{|T%NA*78#TBpe zNxYZ(^2;?yzD5b4RMzAy3gwOOXEOS8Xln|M&0(krgH$W=pVNdcVoG5f@TXTa59Rde zlq?O{gCd$XzH`$`{@7R0R%{6TD77I(3C>L`ZgLt$NqdR){e)W5hKl!%MoiT!B=rA0 z&3k0T+mxjZ=CV-#l>%v61TcSe{Mf&sK{KLK5EQgZj}&g*zdnqx15v#*h~|_Iz(4mY z59g-A7IIpF4vf)ZZopg$0H&Vp-vXk+mc8h%xS%B5?v=ktuLK%B*&x`vn~}>ee&Ajt z4nUZYLaJt>H0U|3L**X`q!y?_fP{6|97a5;hvgCECsignGvUY1ZEkR(CTu>@Kgtt* z5k=)m*Ay*M6&@`MRy$yBS{@`jqcPN~zJA3#f9@0eaxJwy*_F6{|7bLZXDT1dmBFEf*`&!pjc&S1Vh)BsReofj&rdw;*IDAtn6q4rwsy}|M8{VSq2t^D7B__P5BYCszoh|!HLTAxG%^=kqXG9U2+eP9+q_#em~ze}a9V8) zieXWQ>)(_}WfS$b(*`70q45{x;V)XubUIw|(=MbX+D?Hs^}*ZFNzgYNNrT)sI_-c! z^Ey~sTGq9P-I7a(i&L>@U8*AlJC$_&z4c3$SYZRzD<3TtxcmEiQ+-Rzt?Pp_4~7GS zyt353zFM(}isRwpQdi*PE2YwiIFL@poja3bTd`tlYNpC(7P4gqz03A+%)cMDY0BmMzi+R&}BUqyy99l@o5+(%LG79k^5{ zB$*)$cT^`-GDGNeRU@=yBt&R+EzO@?YSFm@j(5O(uQcoU=6~$TD!u{B<%7v8Gzj+v@l-zPY8W<0CsKk zb2J&+0vt7WmlSOXga_`|lyO8sQnbGmz`6p2$`QGJl`)*VD-f!T{-VKgV?ah0hsp>? zKOyehD-gEA(0b}oS-UE!r?pIvAXXV|F}$Ma3hF80Xfgx{HFIlM{oz|MsWFp_o!cXW z0~o7#_~R#&0FKEmB|q3&Uxpq11AWY6CM7W8$c|?wW+oUq%7x~-vjYZ+K-%hH{vE#j zl)+=^%jJo=xo4AAS`1UMR(b8gt+R@KiL8t>(l@!XS4}p8~S^5Lb zFw9Z`KJ5-PcXq6RmfdOy86GI{<^UleWu&5(!QTFXZh6KzjsP(4u_6vc27CGj8grOy zW7fbYcnlpn){cK2*lPwX4p z0<5K|61ZD*2^_SVsiO)am$O1xWeL6fu^3x8>kEdlQaE)Wx~Nh{th8_t=W_C=q<%(P zAe9xYxu^f0f$qj37*uD7CV7bVWC)f9f6xF!ZA7#Y(MCiY5p6)A1%|@Jg^3Fj7bY&u zOzlLp6VXmYI}z85ZUXe_)G!NNHL%MdJ_ zqp}Ra!Z}h)5!$m@xE)rea2?4kycEI0ImF8lES$r>48g)XSh!*3GgCVv{XbDgs%5#O z4@++}I5b$xu_ugYlf^+VVpZEQpY{-VP#QA}^*FZCY#yqIL!!fWSNjA}gUmtE)>X>R z9TrX?SEDgBkfX!4kIPOCIz(u*rq+m{MxG+9Dl3O=#G&EXj&Aa}L!&c*U{&40;RLh* z1iJ|TbOdxDd8h>rkG6ma$U_16r!!Dd=5Yr|IG`RN*bMx$D!@$gPy`NrAr2~dxf1cU#N!ujZNhZAjUccNjy!hnSVYsY;%VC}$lv@;iqzzGGG zQSt`=QYDc)IrASlhsm`K9LbcGZshCGWGsn2CcfLZ??JhD%c|pFF6tyE#-n3$l;dEM zFZ(k*J1`WD?I#zKN%f(;?0y_B$Ovc*ySLaT#ixNQLB%~^GwFw#2Y2_|SwE(0WwX=$ zIn!`5tKW}050Ok8Q%$I@87!gC<_Y)i%i^vJi+QvEi885X-iB>K)s9Wu(Pz`vzSy+2 z9X4(4oJkLjjTwfzW&GMXmhG+k%IVuLyY=>A5o zX4E=~eZU@z*3jmbq3jdDpmohDQn^YoFpA=?7YvLR7`vCs+Q2AI%qqyhD1*Cn@ax2V z-~@CcHRm7K3|g^$7}n3Wlg%wUA&r<{w-qc}bV9VuAX)>tyBoRqvl!g9S+uDGS1M&X zA*_UskDfA}5LT)a!feO!>jc~XzP3VBLV5b^mZxVpfQH!MqYEW@wgqzoEjr;J=|&xa z+@_xxj1=Q9+vGKbN_9e5NnSny%XC6mMV(mX*^VGOVSCENAsj%X zR-zN4Wr5gUibgSt(V7R)s5CPg4DMP3XfT(4LK<1Jwpp~*2{2_kA*@s4dOSoe);46T(V$LYNW3_w?ePPh+MT69hgKy!mZs9giYg^-f z_YsN{TG%ye#F55$Vvo~$ceA-$W$)TtSepwAyD+EC(m9>>uFZwDxv;PcbHbL+S&h5k zn{r1>Z*ytdNF%a^U6|8uVNRF5Yja_3E-dWAoDNIptg&}(F09Rkg*)zcv+N2TLVq?rMMmKMW~oK%-O_t}<8yo4;6VT2_ExiabvJa- z@^ZZ)Q=z_|$%9cV%L|w_s}7fqkVcZ=16?55HZOjEOC6 zovp3nU>`^1i|;tn(WW#mbc)Q^Ahaxw6qM9TJG#IAU$6ppnLAQM-TaMiK$1< z^{9~2IO^{MYik^IkL}O#V}W7kz`pU!P1)OSyY2ehzy$wu5!%SZ8u#6YcQ>uK@Vd?k zcgW4nH#hO!>XIdIvCmJuaJ}z7RGvUP#F;>qmn_lux$-u*ra)#nUMl>q?ayq>Q2Ow3a=Gg7FyU!8yELl>-lQVk+$5jkT9_ z4%s79<`{+aoiI+qq1=@dx88cF=^nW~v~FD^yigr#YHHTBhnjFv7||HQ<>g}&(<^db z5*)hq*2Y6CctB3YU|D$4>xuyh19*z5c$LL>)`RBBd_FJ;UtOcoJ$Ur&fx(5v;^~|R z90&7#2a6sDt33ycC%u=AdEmwd-{f$0&DA8gn%h=6haGH4f{i4} zirH-zupz0iGFhcKvS5*9&!XBrHUuL(OA%6{Np4t)6fDBBB@5<(gieRcMmQ5hGL}q% zO{uy^4mc}FwpMCZki~U*Y{-IWf>{!!V!aKiup)c@BaSRtc^2nYN-AK`QW~>UXhSM2 zDXGziRF;(_%^Fu4DS?u(Gzv~hn9WEel9C0bAe_>(Sn9LQV?*J{8KlC3Buv{ZEW+x7 zQcy~=1RZvHZG#hJrI7w%Sx{drk!+cTY$+A-R#IQTAvsA|3QMyUAUP|^f4oO!MBS8L z*g7~}<4Hp{BqJ-9NLH)}1t&|gCks{#bjku(O5~Hq3drm>3nd^+vNBmk)s%uol0A!J zgY$$<%W}JRz8%Z#WOKB6s5#agmlx?#IeKz4j=|mRjP5BJnwh)zgqJ7pcJ7uP3D`#( zv*k@U#+&xEa=?~ARvwzbAr=o9B^iK{I|lj~3W=BS8Zx}pMEY_o!p|>8QoI%E*rjv9 z%aHwMEODwyUsj@4%U`0@09x%dB?c3;49DV;2GS&SzT;> zm;-YC13WlnY`C0noIsO%HeDYh(n!t(+ci5ViN*=+&7c<~hZ_&cdF>{=d(j%T`X!wA@{89Dl^7WiNJ3 z^!s9PC z0YG9m07w!h7~5a?iyaXlVZ8CzuH;G5P9!#f@E2P-Knh29qktqGL`qIA$Z)ZH2_#uX z5|u>@QZ9aRJ4vFlNI|AXesNcmL}k%RYmJP!^|Jbpr)62SgD-gP%73(3&GUFPzKcf9 z-2>29*SZ0qB)MFUQ(Y{wCB57^fN=;Q00;Dm+B(r0ZC#V->|8zEJ`{_sY3)L%v7Chr z4>YXpCx(VPS4R_FtGYU3(dg=SoVx~#u;SWdor&T0)#2g9nvUVFu;SVk7hTmcJiMws zx@x#B-rhOfCi$>AN}j9QS`(|ntB2vAwX-W6SKKPatr==v)!Ee*3lFs?I%93al22ys ztrKm-UG4ET(V=0yh8v1^YI&;-&!I$XEZ(-Jt$lSO+_rj+R7mQRYz;bP@*HerbBZY zZLKP)HHyIjc939eMMoc|iY&||+Wd*IKhf?_bodji{E1F~Vzocf(np0HIFhgNkyq)qLI)hl(efVqDqUF!ffM>RAAObX zErh@ceb`4|rOOK;a6;eiqpvaygb+BP@9@!A85%+eoY1cVJ(uz3TZ(!fO&LocltU)w zTlRfvxZOy&Ul?NV%`W=IR>ejVvHd%ZpJr>Uw1GC}hnszCa$}6>^I5$(t3_Lm0^z%$ zPi)$OH2jdm!wA0PRNurrF0|Z1o-H(n+eq2$Aq`7m&@V@LXb05_!d)&vn{cp*M}^kA zAL*!!P3FiCWJDii2W@F_^D$FrM=X5NT-*$nk*3*3a-AJsVO}M{-N&3%!q-P2eFzP( zgqs$CTVR_Ln_E}skk7&z z{e|C3Q^HC468%7Qa5OqW0$)4$$Ss{v`I@8I$|4I8sbMS+-{xbvZEVVI`B4a2wE!GT zfu$HqqbgZAkx9i-DR@vpTL#)Ts0Zi98=cZJ);TnsEiFUQ4E#Q18aMU5Ww5V*Q+MCs z)}F0{TY9!_>R}D)mtgMiD~X+nJKnwu?I~eRD=ldDUu|ovFgUphDvU)yh=3B21swPc z)ct$vqOuZA0c3I*by?2(IM@t#a7iVi2kf3cz6cRr;jml^PHK|F!^v1al{@74GwjP? zkl)JBLGt)!Whj9?eK?}Y@;hLv=s-f0f&QqxHl-0KU@TA7^YP+qkpX-Rxl=qm@8aVP z1dYBv>8$4ipC7E@BN;y&O$K=Iw}n+}!Sc(&cg8vKUc~ng!^sR%+Oy$;2RXMm2NTX% zLcQ?d93gz~;Fz5HnYM&uPArP0WHOg^Qpx?O4zyHWVi$Z4IBVC!RW-fJS0P$sh|q2$ zB*9eI$v~}{=HVO}nacRY&%#v`YK#hG5;yV9OQ0H7t|ev7V0(;o z2J~9fP^Ha*vCxRY;u^GD#bV$Pg(sHkS4*NdsbRQ5Kg5lmR07Hq^X`OEWqOlZxl(#C z%B#rq0bt7{Wru;*___!ER+h-_D7%!nW@KA=%Xm`@WE>pXxA*mLEFIczkzQBEurpd1 z$C=CAaAU(>^cs0yB7>x{!QCg!#v~ZHP2b+2qd+;XBYeDu7i0U`9Virpc zD@wd9`^b)V7#m(oFtr(kg9GCo3@#}eGl{pwC78n?OkjQ-F9+^V;3Wc9$oQY1?Wt>i zN9HyX=m0K3Wbcc55-YSEa}qerSnf_y3=|b^#*P;eZU&jX$N}EI1TvLkkOjw%i9$vn z(r{!m42WsM2Xp_{nGr?i3?rG{3V#w6%fku~o4@690M7Gx<%oDbn(7^M86#qaYJjwG z{{)w0rY7PHDk70G~VC$+99=n<+sUCXr`r`-w9MFS(Jlu0-Fr|O*;`s% zpg!wOUAc2>tBrfk?vi7qxY=ohQm|`+PfPt@i`x%W<%3ft^?$f(pQV_xwX|G@(csMgb807Q}=01UYYh-DRr;#H{ul&si*l2ubM zmn_bJk_A!_CF?MtWGxg#$&w2wE_+JEkku7XvTqX1B?~E_R+s0JEe4>pGX{j09R{Fe z2^wUm8w|kddb0%SDx`u&bc2C8E9gWw6o{;#72QxEvVvZ)6^5oHQZ)nR1ooi(6>IiQ zqZn+a700&)uLBNa7P)oA(m~CgI4r3nwrx)s#Zd8r#n&7jnmx&v#PG2b93QleJ9HrQ z31E6X7PEowhBAWr%vOONL-vY%YQjwK3uZDK2A0@fy-eB$!Axe?zz#=y^)hMO1T&ef z150eLUM6j`U?yp^in=g$(zXm{GMfmt1bg*L(*7UJWOfoPvAuekbYuiGncX+5HGB0k z>6i&-GTU;t1bg)|>1YaMvfFi**j~L%W|#$YnJ!_e?bVk{$6qklCHsUKn893^>=b6i z26J7qSD2w3%yr3bVa9kcSM`3uNrAE3!7Qd%*oL)N4)7qM=?PZD_F7I@rS;1QaRgD! zfGyHq%L%JAayg-CS1X&nmJ?QK%5uUgttaNO?0BDFVQN7!)s4r^bRA7VXSt<{g%<7+ zYuH&`<@YDodNis3gr)eFqOrD zH&rX20fhBcgP%{?V=s&;06K%8rtIk##$2F;rtBdY#-yNxrfilF#_XVkrfj+p#x$XX zrfl92#(V)ZGOezp85swPEt>;CZ_@h}T|piCf~GWrWLS8TgpYovG^x3GO_*$Y$TF$(*YyP{Xzxd9C)%c%J_EaVTw0L8@2jY96KCcl+8@HGk5!rPSSW&7ZWqwYRS%?A7yC>~nUE z51(L;9Pxil@5wc{(matUZlyh!(dzuF)X_DyNR^3yY5Uz_Wzw1tYUs&x|7`uLxZYe{ zfOVs!UI1%8sEsF8oD4J0QSmiw%?Gt{thK~?Zx;37xM)RZ-RgvuBE{Iq(RY_1vvrh`AhuEoG?rpf;K@&XD<`ws_nvbsWtP!No6N8G^dxci&|Q z9Fna0pjM}OM!T+aUF#ouiA7NDbR$`YpxSFbsMT21d{EO|)qGIbd{EbXP{YAQ;K^0< zLH&R@ayOH6*FCCDTi2*IZQY{Uw4KY_w4Jq?G+ezJb^Cn_mpPf1X&wL2O-H$lYMERR zBaUNhKB#xYQLgBOe`G3J^Fi(EgfpL-4{CMCT=PLKF7K^TdW%Lakg-$qL0w;Ooa*r# zG}(nl$lhd5zv=P5nxHQ~d^5}sfe|R87Zgc^x4j>q&*R%g8z`coG`a>p;AFrE_k_0n zqyi^+?fFbPIl<}F@|bu5nkon312lS8IsnpB(E*SiSPy{oG{U_D4$A}9Vj>7_|W-s?>5(24U;%`%a26$^$7t3iP3TUZICY; z3bI%T%3D2F&b!`idTLpqQW*o4L&^e``WUF3NfxM7$w1|Fv_Pd+1}Z1R1u6|^pmG*m zpwc%DR8D^jRGQB~<-E5*rNInTK6eqQw3&g*_bdX{erdq^#friM)${772e~c1S3~WU z7VgziyQYPEwbXCFEZnQ7c2W!XY6@52re)9wNZ7W44{aaZt1X;}``})EwVxXPNLW7F zH!a+&uXa!i_v#DJ&mMmyTt5CrMZe{FbNiyebxyqBb?%S7#2>eJ|0VXYi(Xk(e&=Vr zPkS!dJ@4KB9`5~@{J8!5|AeXqla?Q=hyRLd@x0u_Ihn>Jz__<}Zny`GZ3}a~s(bwl z7QtYBzR%r$h@on+ZfTy2|0NZC{ELeQJM^pza2qt$jhbrKqsD1}&XfUfY(a#K3i@c% z+F=A#!n=~eDpkN&@b|yOA1%PA3+wYehzD|r16;9=ga{1y3E@cbXh?*$Nn zL%a(0^TI~JR#d=y76iSc0^aL0XzdDkuMfB}0D|(ly#@BGLVllBtJr>ch8g|f=}{@a z+iPL)E8r_c0|?0H^>BC|tdPG#M1Vkk-?*sQeifnu1oBsi3lPA|_{674vIRs3C-k-P zAIq~pg?5p*+VBzlc$9Mv;aBse6-2k{4UzPQv zI~U_s8bb&(9anqatj~V^@8kDvz!h$m3OC=YF09o&sQA19?0Z zU^x3Rup?&fwg_q5`3O-+k;LNUq2NZl~370A2SA|h3#mkFX!`Ri9yZ9jhJ>5;aUng=ov_>r@z><>K2C|CyKMrVF{Y)a^X{PCV!z1MXPF@1f~p%p&8>&4ScDbZe$I*K}O{ z8r!A8I8+)Lg_cIfpi6_4(#X2Z(uhTJX^>JHu}+poY?Dial+wuh)Y6ERa%qrK8nIZG zM(mYKgOt+9y4BK%<#K6|QW~*hmPTxtOM{fsh&{73YSLXICY1_zepQ#~+EcbzI+vRm zI**&HZ#DfcSy1B~0jAJ^&SCp8dOU8f*7c#_atrF6n*)YhK=Zme;Bgb((-z9Z+gdZ} zSHT9*hlX2PQ1klSaFIck>!ZUW^~vE1pid7M8C0-7KwM-{t@;dckwInZW5h)URcM|h zEz9Wzjef)i5fX_O3W1Q;g;(8j-_7a_&F5W?oMheNjKkle#sp3{HzciNxrXNZnr&$s zGl_1@#6hcXPgq)U3-*MwBc+?d?z1JWn{47MSEp9wdnccO(ief(A@6>?uS1=1QIH3h z;Z1l@H`2RWmY3EJgm5}+9OgCfn|&0BkL;IJB5Vs1s!P>MgyA3|7ZsH`wg(BhIxrfP z$9yc6&L%d(HQ9c@<``+K-}hjqsy0S5!+b7Vx3CrlI(R3t+m!~ZyYkEu&7{+2oH41? zkkzuu$s??_^A@=6#CTD+9{Qjsz1LJmCIZB(Gkttm89ZZcsa(S$OxzxB(XNFSwA+pr z?HUR}yS?0^UAru3*FadbYZwIW+GLA%t+Ak8Yhcl?Ar`c24=mcX!Gd-zf&rf;SvP3=h<18AgDi@R5ipdK~RI9ZFLF6ytYnM zaOUE5i89T4rdI1-rd!Y4DnXfcJ(DX0p3Sv_d1hA$%GB$bUL`0~uV;Rhpsa6tCRho| zdZ#tREu+yfxFfVyb*=i&X@eV6apeh5wA7XHs6${jO+T`6xV}t}!hP&`B8C@eh=CU! zcj%23lloM0EP*9zy}MYTCAMBc_?1ZgC8E^XH+dQ?M6ei#~%WXtn4w zwdgaoz*dL@Ry9PI1h(>`&%oEO`*9w3WW*;}c&HWt5U!1JB2B``;S`nxbYpNgoZORm zakw(vTrB_~bYOLXj~yfsUM&FN$9UmFYw}*}Q=n7t=^>E3kaa@R?0x$>h#87^p$i+1nmQ(dhMs>aA zaz`@gsu&zNTUY1BvQ!wgJ_%6|ee*DCJrEKii-A$=Z;%j~{f}Djf`rI)f7JRCBt+Io zqt4Rx~zmo@e;w6M;1SjP&Uzxh_bi`%rCZ)Th}&*PF6LblliuR8QFCO zV_-&lU9=dO$ZrquR17v{7S~OIpi>HL!VYf5h)g1}M^iB}lPn)Rnu-CMq(&Z1#W+o} zi128tN2Ky-Dn@CN#jZzFJwla7QyQ}g{g6?O(5N0wMg2&_do&gGqg}xxs;D6C8y-_g1VmOuMDZf$Tsns}Hy59XHjq686UC!It}lsNL_HfL(7yF& zT)s<0)T0I^D5>B6Gxi4pLCYDMU=WM8PJa{&-(I8%l7pxbXf?aTnQuTiKNH5n2A$BS z&Cnr4rrD8Br4XjZK5l-pW3u5WF`|xC($bQkiUM&yd>V=l=MotNA-{xzWRRMp0k`8! zo*ohq-SC-=Fv8=RC_;8S`LPW2S6{Vs>@8#Vpg~5``|jWkgPPgP&H5G^`>bwwm*M0X zhO6e&07Ks1``)nz1TA)Xa)Vhm-x*BLK;=Q(SpNLd9oiD(Q43qA%_Gmq^5~7yRI;xr z!8)OBqh#5~M3l&(U_?iu2hJb1&P+Hp{*=x*&AazhVmMbJ_MCV{wqfTo$$cX^o6y3m z&qVcAz`W<3vL2Ngt$$p}?9>rmrTDDWO>P^xPpXN zZF-4mVQqRDm=^zdr%#^@`VXI@lGh*pawVfERje`eRR zoU_Q*yAd1h@+Nsk6jASMJfcc7o7qdBAGjo2sb3MmjIDGnn}cUEQstS zKqL=q65)nK_7WhHhZl*=B+p&~L^9bUk(t@q3yJud;*WkYu%&lfci%jh1nyhl%Z!(- zo*skoD$GPx+Xg2}D$G`Wfh-KQyHWW=hzIC>gNJi|{r`a?C8JYtOy@F(81gpi3}vEY zv5{0Fn`Ovb#0O@e)lqCeXL0CJ0^njp1;K_f4R>OPVjy(V8Rx*h@eEd*+!%(Q5m-1c zAI{>Gz)w-k<@zNYL|V&|z{QwZT_nILmLt9(zdz!z%WiB|DTn2GnJ@kgLEyXr0&~lu9}Pv@?DFPjKDkL(l5?QDQs9}j$GEL9 zJR!<6@+gV7O2oXS84;Nfiyjx_d1b*wI*=Km5d+!D9WjIS}eldTwy>n3h*7X#M#IJCtaLq0nEB*Ww!90C)=gO`w}ti9HoVP7_U^*2U#_|n~K9} z6!@*Judl^7bhh^FsKqy|#W&1i^bFVH8`k0*^4t*q)#4lS1eN17$yqcB)d!W}Cx7=! za7UyX9j8Cy+||<^sl_*}#W%#rSuxnexS!^x7T=Iz4KZl=tHn3u@xK1;J=-?*IX$}v zdbaKC?ce6aE;GI%UJ53M=~xIEVsLP}Z!nun*86R zwN7FzI+RM(zX`{5lf(7(7yo|oVkJdKeM_bjNX+1~zSM>w<| z=J1(qqm8V^2NOg7t#eS}+o+iN|Mp_TpfS(}(g;lwt?SlX!5JDdpb77Gtf>j1tV({u z%bX#v#L}0a5d%xOljS;A1=qFW8?2&Smtx|qAd7%-my)Z3FuqdUn2JWYruuqpQrh;Y zML-;qkZ^iFc*_=hPFR}P=|V%u5M@vG2tBe^95O*as6{|*ZS88+=z>;*#vejkbNv#} zIf4m82&3k~m;vxLLTGdAwX2(iC9tjlp>jlSA0c7*bypy)ML?`YKy;xHQLsW>|Wm z<}>y{b7#j2Jd#{PFTt+{=>XO|^#p(uc$SY18HWv1%suGtA8&1)7=n$(@V#vuusC3G zz~X?#JE*rn7!<@LG)^&19Fw2Ku!e}Wh?>YB8>L0Vg5`3ot<>Dq!osNm(L@Q{@`>3< z2{r?Wg~A@?b@zkDiw0jy^GsK|qIe*tc=0o2w>^6N`aA!JvjP zx9pSr<5){=bJzjVVV@EfVFyH8m$6C);SLCVysC|C5q3a8@F2nth&DSKZ4MUBD4!jx zN^-Dp^%N3BsL?~^J8h^j!%9Q0LW0W-WY{R{pggJoZ!p*mPN z|JWyy95Js)U?0AieG5Vjj7DRbG`}QF?8`*)6@a|VZ72=z(=i+;4rd%glX$4vj`KZAyL6)dCkjAa>CP9<+wXrtPS+X=_bv z+FD7QwieB#Yk>=`g0}YGfo0qft&_Vv@CS2rA1kI?bK#-$HVF#tnm<9;0vGa08Md7< zpcBOajZIS>=@#u`Bxqen0F4lTH1-BV)d$c}xR`vhkSRi&MVodd(2e?OU<}$FvjfP$ z7*a7-l9vy^SZO~Y%nl}hKWVpwwpP+lC_Co|cuxB(jau=cXE3-6<^~$Y=mTDB9>|SK zdphA=YXFVhq7%hPF{W&*6JW}8LRhIz2rJbIVYWEKk5A%?I7cM5P)S585Yd<%MU=IWCnm`y(X41(k{&mc%X>I{Okeiy9_91WLM zro4XYUijjY!=G>|CwLGp1IeeZ0WmcK2tc*Kg$$l3u0Rgb8@x0h?*J8lAOe*JGf;7( zBT#8G1C>vf1*-khfRR8qR=Bj4h0CFTg-e53xO`2ZaA`FQ7cU?Rm#%5y;^su*(myR+ zyqzdqI;n+wHHANHbQBBs>Z-ld!oAwU`?ZhWtFQJ`L$4mNnb@O!)55*_Y6rD&ufFhX z?eSMP*UHCVU*p}{U7~Cm?CBe5ZELIrE@VU)FSMN(5DeNgPv=_TLUdshM~(K+o3zvd z7h1KzMj5r#0vBRL)dCmV0Rw-Jreg#GLwbP?tqa0n;J#YmLhJ(?#bNnS3tY&VfqwAF zhdaLQQvbpFqz{CzbEgC9MA!{p=S~OIm9PtUr$6dY*oC{(AD!j7aCiEn^E?;s&h=`6 z3pFB&s~K+wxJN^wxEOB^SPNX}TeQkIx`A~UBH40vcG2Y_V#r>arhG|nJj)? zG8xhy8Ip!f*8VP;40DeRNkb-E0WO&geUA)DLnb=|E}57Ej||Cs9DZvqZiKv!sG9{I zT|n)+W8fhJ`qp9OAp?rm0p%if_kc;67zEYp#m*9BP^n(rEI|fU>BYZcj_46IJ>(qOq7Pe44RNw*W_ok0i(zURK#*Ktdq1kij4#Km;7VTODLAxf{qFtLH zXwUjuyzZj9>~));NteJixXQsb4laRfYL&n>5H5jhWR<`*5-x#jUX{SLuP%XWSe3xF ztS*5V*Wf999-223FU=)$u|U;aQ>z3rGYb#|mFwACx7?t5J)3I@JhLlB=*F$T2+#B? zL793z^Q#19>h(;p5|pXen&BT+*g{OIG6}dF8q-%E^NCt$-s15SvM>(HWN^$t{g^8R z-&T1^=aBv4OiR-bp~Cn$3ZD$EoVfMYLrwR{?V)w+8r#Dw4mCA3YuZCixF|SD!KOiZ z`Get?E5V^#Z*4rZf?rIj7%U6N)?G0mVE|7t6|b`R+(hwHJn`643n|8f2(^%64>&vr zK|MIDd2$c`pcjW}z#V)qnVfYt8B>WE^QVb5E?QsIeY)Cdon}?cX&2jnWA&Q|Eg@eT*{2Sdmn!#re?cggP zgS#zM3;9+H`L=Cyqq7Rf6zcJ@(Jm%B{fX87M3+CY#-G5q7CsJbZA`(m{kw&Hs~&=* zr55lFQC-ox*n?y|JK1b#ohXgn2~+9@_R#$yLoa&|trMkTJcS-OX2S-O$6vN0Fl%UQ zO{@y99*)Knon7I0n-Bsg^s;+o`0G2hiPGpxLMXfJ;4hm=hF7V&S3oL}#qc1mcy>*{muZ9>@AW= zP8`WzBZ*emBJ%B9&PZ`115tSQcjHF8VJQAHN91c+{!<=Dk0Ezx*h}Kjaj!I&9!5)Od|EG|2+IOG zwn?{Vqu|vMqIhK*H}$<`@b~*vM-&AC&sRaH|Ms_RBEEywV^rC10+@+>%bs0zUtIs=+$EA`JZC&RKG8k z9*U+Mi9NPl!*2D7$~}#Q!cxUjZk_c+~)XEiGo3 zjxRs$h8^x<$(k%(Bbpl?Mc~lw-ra*&fH(H3lKaAfvFR-WQ2Gh z^UUe4S|ma_L=B_DzE>ffAy3ev^HEv6RYJbK^o3Ypb}dtg4mNl$1fcR=v|Y5G|S^_pcq+R;lp-KNeb5o8zYs(T)1{BGY&Nzx@^> z2Qc~Xwn2qLh#?(9TswdMl@*iLY)D0tsfw93(`)Lgr=}z{b=%ZgHFeW#rcPFPaVc1A z{0ZU6&nwGhB3_-R((KP|qlEBEq+{&?%i!8PA#SjQ7>Lnc2+BG5^YG)q^}_2E+zD-7 z%XtL0<~;;H+p0#{AWucC0;v%BzkzuBv4YLW5AwYHQU#I1>n*q&j8fp20ZV~BF_GuX z2ViXjYLMr&CeB|95uS~Ml!&8ORZ@cDeF+)KJGevS4K1Q6&jB^ab4*j^FGhX5QO$dz zTk(4Bf@dXh{x@NFLH8gSKY^9=+Iew!p`Zda$(vM(Psf{wsX-Jx%?eJY30^1f9SALW z+5^m`^hCi`usZJxGW#fH?Ic~n%LT~ZC9@w=-Y!XSJ=y+;#9mA6JrdgqbMo%J42Xhz z1|$1LnZ2CY2bdk?6x>S5Uzhkwk~}7}8>#xR%w7Y_^PZ!)Lgx+e6rIF}*UImP>0YmQ zDqG6&I^Zq%JY?nfkaY07AR00YBs~T1?1XJT2Z(}qS$E+(3C|b&opK!CIy&Y9=1Y7L z5EgvM{7BzV>5PwT8k@a%V3KJ$BGxSq(lPA;!A1G zFzYUqY$?8;CBvFQmB9YuA_8?1I8;20z%=V!@Ek7wCJntz+IFn?D>P?@ z^#|bo4FLp2PC-5@TvADE9vbpIJU_Cai}m$AOvZi83f~WD($`sY$LFVmzR8N0pvm_D zSLjfN&DLiPhO&i;O#_hFzZGm9Q^9;}7VS{OZe2|mgSW+8M73%&+JY(_u=NNJ5FN}op+iaHyCDZK?B zMO~~x>0j_sv`+@|IAjNp8jjB)lOTTgkeWLo-uDyfYU{TXdHWImOS_svE%hb*MbNxml1U&m;v z^D#1pEIWYwEZ0=bg9Yb16FvCHvM z@GnqVGW7$umj&B|ewB%4d*teGSlZh|!y~cbM^QFE&l6MN@aHMY|JYZeQ ze1&fsTEVJjev+>ZPPb~9uk*bHg;p)|vqrv4Idwm#L+eLA%Yv!2%~@3b8(3^jlU8`k zkJF6H2n_a?&!MaZ#nY9y6R;BBfaIj3C#W}fC_KnB*=0HhJm^)OpKK zQ1n~^v%KYl;S_6L4}f}ac@fQ-KLO>7yycHWoweXsC|ThxKScoxZ$rsV-ttb?>>2{C z-twWXTEwhrHz<5co8K!`|{c==7BYj=={My_&#rZ~1a6T|?l6 zw|o(;Udw9tc*}35fOP~;d&~EdXFZ*G&MQXA)}VW3kJ*d}UWf8R=UJ#JbXZ#G{0*Nr z9q=bZXNikmV?{oDKd{b_uR?Q)^|`S~e8U+~H&Tf3%}4LB0vw1OG5R>&z2D1rZCr&? zT#u6qm$mm5aE-a2`@Jmmrg!h$=E}%@T*~mKp8?`^vOMAanWQ*$ z-!?Z%Cp_t8zpjZG4t%I87(9UgRW68L%p3xM?fxxdf3+tFhoCcyzSl`nOPmn=a z-`AxlAaE?5`2+8pQswP;ZF48mp)Y#>3y8e*`JLPH-6mS~M=j#tc5bVR`#af2MMl1haMb7(GF`Wqho}y-$tH) z8ZLC$oDy4%<{ih0EH8ZyJ`kf1((xb2Ir_>8O4sBXm0Ej;4MTf>4;n$iyeEA;Hs(4; z$OqO)2_K7%`2m|>N${kP#>VV|HGpZECw(Y3MmDV}KOA#EP5uup2CXOE6L)W5EPSNl zJ#n{y4fU}_`#tH?arb>TQ=ZM}hrAB=4{X^%whR5<^!a$cdleNH+wV$+hdbOSNl+qZ zVNd$~xZ46rR+)xxPq@!g!Dzb}HTR@nEd>u}ivd*QBx`y!={v)KZk^qvlPGwG}CY0`aNarbAmw#MfA z7}brre?Z2nm5t>|?~l91v~ISxes{v1M0YLJ^7eMPVY+jR&5;7`Nx0vmyjyH`XTWjy zYBtY5Y4~v5mBa3>wsQaBgu9*Pw`urT++9oiw`+a-lkUybf4hbcCEcCW_j#@Vi4OM* zEZfS4?FR?r+)jU)AvOxcdr?-(z!( z^`vi4x;t3@poVuP-TjpRkcM|B$0lLkUTxlg#@vN0enhwR@eX$k+u~7O-qkU-B@q_Z zH#Pi7hxFPipvdVr)Ccl!IE?{towUk{`0!`90}#33o4zIc(o38*X>X zm6PUkHfJUTVuvf|%_AB<*Wt>U@2G~)cerxCdtSrucervg{EmiikGpc#`>uv}#a%h^ z9nmiKJW2fOyEG$G&7m{!FFOnEn*)f)9co zHC}uGAN)qsbSYBtb4}BxX>RWj6~%G;JHo<_~%e!w1bgDm%? zALyvOR};)K1ou$Djb7#d^N0*wg$|n!cM33B#tesMIY)Za=dge;blB|+9p13mZ$JRY zE`8@BVfG*iJ8JzEF>t<^@E!Cf>rWO(fTJ*(mz=qgT6>RyaBMOptUp_Lmt-qRH^K^^nyG zGr7d5{9jsaomR`}+$#;@6k2&w7dyJx{T}1&VM}%U^NF!Itq@k1^=oO*>D%0L>f5K6 zK$uf6BmJWq#vJ?#1X+hHF26A^#NAuz^`|T~G@ppOGYLPf;huQq#TP4g98rmIm(j7` z))qb!C%Vw#3P}d!pJ9g#$dAS7x2U>IQob=-u^)h1Ue?|nxP4aZyE5(EbMZ0q9#nC7 z(r;?#m0eh`t)ax>x-wXhScFGdYQceNM>=Che8_u^8MZ zTC@zytwiNPR~gG?4KMd48|mvSH9J;w+ZfTG(&bp~$=l+qG<;{mEoS*_ zO^@}Nyd}O`!}}Aiye+QRFxFFVL8&!Y!-rA52>RGO4IfKXUNTnNC8qbrPGkY*08MZX z(=h0-)!=bXK!pys9gA4S(Lbhiwf|S7o9CpGhvxa1%_Ey5Puu_UZDZukm4T1n<`yxQ z3of`@#@b-5ujjUlpQOM1l7GAqlZ(;gtPeT6+<%c$w53;H8XJRELHbkfbfO1W$v}$x-0U8bB#7?NxuEm;-9zvTJ*lyk|PV3S#2jUM+8t9;a$L<5o6xw`!1^s+-CARrj-zniTuq?NxEs zK!ba>Pm%R&R;#?j+m)^sMf}Y6Y8i5^3VdRF^(a<1tZZIaEpHjyjm`3gF=Fbog*AwN zA69wNk8H2@v$8RogBGhEL#RU)?%!T5??vNuF=ofgBWPA$G2JXvur+Y6vf$8m_WR#J zsIZ1w6MX(6kMAPiP-|F02|Ar^Sq***)1s$RH27;l*ZrfT1iULoAd zF4iEF5G*k&FtbP-fg9!r$5jYCf2Ki1lxCVtMA<}Ce7KeYk-IGLkMLVXdB_QxV1}0f$&|Z8&OM{;k8xN$IkcsW1d17YCRnnMCE}$+c??XHZ zW@Z>NxtFl0UyZ7CjnJ&D!W3Nv4PH7B=RYf7R9|Qsa@J^_nzOdZT7!5L>>sw+hB&sY zzaug%Tnt_OuT3T5c)y}CoN5ZyZkcs?0AJJ;#v^=Ns#_wd+6{P+Qb>|;+lJbf#>W06 zGYz+*`$SQ-$*r-F7N`mPa?Qu6-6-EHS=tr}#RKiBaI$ShIGAjX#@lNeVY7&AYHMl> z*0eGoY;T$|v#w47k!Z3t7-@-bRiIRbEGn5uHZ_Hsk;edqdbC9q`kIC%3z5S}0s@J| zh>TzQ3k8x2%{+3zk|2_-#$QD7Ch*I7CMS#dHD0=`F&u~)lUoG>y)g_@jum2%ZH7kA zZ*a7DF4f{GYIb%wi=7=UNA}q>{LW%~YMFh7zs1=M#Ph)X)t*+Wk}_fAG_*N?hh6JO z*8VL&j_|`1c}|vHm+vV(*?K?oPHX;~`J0`Sf7rFj9$%U|@(oFl%um@hWp-8RLHm+Y zXLgTWU3%o`zQxXZr#2-Cn)5qbQujNl?v^uco-Iy=(^@~_uc`!}c60vvx;yPU|Ea}w z&MEsU|C#l5PEWTz3z?}-^Y5M7&K`Sx8N{u3PM$f~V^1A!P|x?En(O)3WsfU8``W(F z&Yn}JPB}-`ckv@_PcBW{6NlgTcKYq~JNLcrq&%UdXWU88Fy~Esyx;sE>HOXv=l6Vj zyOZ?1EKcI=$!p($if*#2hyC`feNEZxM&Ao(x=x*X&6#7*_NQSe2|XL^D=b-;WWHy- zQ?cH;{ynGd?ag2KoU{20M-DEo`;Jq4^&MxO_4dqBi=EHfb;HhdcY6w-u*0R`@*L%d z-B6+>{L-G{2kDfu-gI(#*O9Yms?Hli7JVf8VL2U+;qf z;N6|yb?SM0PI>o1XWv<;tJ7Y`rnWs>?9cStTkKSH9{D=_(0OE^^I6C5_&r5WEcFy! z*Zp)SWh?9Ev!b3i@L}aA^Z(;iXQ$)u>hA6)eWz#m6ZW-bJ#dr%NV@xAy8B7>UsCVR zPai~FIPEVwQzZh%I$h4e-h8KX(CKt&yoKuIBY%Oe)7h7S&&Yd*I5o25&HUdwJM1}r z`#!6*yBh({jzCdw=J)hL&lq7(EX98rL+kB{e*8!NdT0F$^1pMV^OAj~-|$ee&A+Sr>Km)2%G{W^?c9Z6Lmj(1Pwne*YMm7RZFcTQu{i; zeMKqyW$8=sS`YGetPGvA*CzW;Yp9m~vYjloulIL%vrq-kwI;Of`Vsb0in3=9w`XAV z8DUQ^mH*4+=kU%WUC?XaYx(V+{r*Z3p`O9^G7DYWzRWNGt4x`F*$BI4sC{c$=aEP4 z*=5M5>={GtTZZ@M%IsT*OAG&!e@dp#?tJG3dlxqRcUYskPdPgw{fxZMIit?n6J+I7 z1JBTP1D~D$6@H=zeIGNOYHClRbKQLmmKnoO*=xyX+iTggZHF;n_ejj_QB2r^|A!9@ zEQ&#j_y-uy=9208ms{UN8N<=@Bac(D1AY7PTb*H^|Ls}l{N=a%PIaQS{rj9+drB#C z7c*1lRCYSg*VqhQ;R&th0lVJsr0q-5I%TNH z*=|OF?P+zcGlq&h^FGXndmxpmw5IrRELcjWk;Xn!~}C1PsMw zzcQ4-;v{k1s^!Z>0M9)pFPnziZwze>pgzr^xLQfDUU-oyzA+R}fGmQg6`e$#Kt)1f zQQI1A57mZ(@nmZ_xS$Q|{XQ+T>dR8?SS&4>yLe$> z*=HISG|Yumf#-3XKAj4sLLw53L=)jqC?=YM$zT90mUt3N5xKBh-AcNIXo;mH%(o-( z3%(*4i>-!}r@~Y^`<7?~l}6>FuvtCot6e1mv8ZfWG&iN7atMJ$a8pQn7>yQ8Dq91f zFfM^B8!1=TKg2c@O{rkGfj_6LVnsH41`B)_6Y_y>`O*6rIQ*>|20@pg*O!DMMhoON zMdMP34k;N6tQdLPr3EYjj|xEiws9&J*nl^Ogo*?mN_e!Bt`8`ybh{c6G7>ih!*Deo z3Jr%MQAlU4;YigK#c3= zPl)zl7~MF42VD6iK3LE%qN#+6b@UB9f4zJa(nWHiEjFau!c76=WH=#t?TR%Cq1gk? z@lZ$vH?^!-B?CCLS@yTSAa}6WlS?LRS)bP66WKTLUckDNI&!8guYg3YuItLNoX6R5ruRvohXMSA)lRP z-5MfmB5hkf@eZc19^A78)J=0^YCx1xPghI}Oa(szDv;6PSkH_?_T?;BU1&f_D2D(kv%MMPEC)Sw zDTJYlw51GD*0nvJ^MKCL=K*LLYy`ixJ!&)GK0HY~LI20nm zWXI$(l}uO341wQc-?#*)1$?8YZ9^l%DG`cqLeEie7V36n4_rVc>eiOS+XZW7ykeS6 z%280XGZ+J#lEDq(P#~(BRyMN~025}ZE}#^kk_`(m{Bb5(fWcbMgLF0SooSn#wJ=m{ zVg%@@4`BF!TM-#@ES95EDuz%Gt-|nyksKWd^KNo2JQUrW;IO$m%D84uaJFh{iwiS` zCG?1?gmVDIFxguQSh?*xUm|YEE#G{M&l@nBjQ9WhTc$IHytO@hGhan6G!HO+E2735Y$}F#MJ;P zk|Bf`Kj0?@2Nxn79aciH^dSRjnh92xUKic4jI%Y@9kaA%G*|##2%)7{A80f7MDAK( z20=S9tP-(MV_?bh`E!?mFeMvS4gIq~PSG;LMf-g0C96Jysukjk>PT+lMYqGAiJF`YDk9S7}lea1ShSANE_TPXOs5!V5BL~A=g%)Fp6XFY*B-iT0@~7 zus}5;(W(s#^y)$cHwWABx@?Q|Gy0?Kt+JIc+c4ftCsUovl(6ffscBwoD1oX6=x^1f z;X)M0n^G~|g?in>zQj>4)03HFtJ-Ueg&D`vN_NN;9kD6~Z$~jCh^A-?!;;8&flCLg z4ARC(5=O|$AM13wt(E#nhhZfm9@w2ytXauRzPH>nL$$+fcW8}J~EITY^uiw!jBX^`W2l_ zgRy*P(OX9n-@Rb^WJ_|n+cuR~Fr?r2mkJmN$!#frI+NB+M>a8my)rD&-vep3Y zy9fAz?9WxNXQZ5A;+GpP$Tqow0a2d#+hk+joIlZs^>8gK6()&dA<0Z3Yefy8A zFXxbdItTvmIq)NJOh$XmOO3C^ltFyYYasjUK+kr}exQQSLJ^<+z}o_e@87=dIq*Aj z;2+6>KavB_x8`V1_G2S|$wBYSQQyiO`1&098zdh6Xo9MVMW8Q~YdCigd5u*2v zTa90pLw;)x{M{1o6D4{)3~4zJ=AiG+f#+)z1J#QU3YB1dJD1hpe-3)~7xNzR~Ur|@QmliRZ8&V+MyRoyjGTx%*uiPEbz47 zysm88WwVx_{b=W1IpjQ~>9e0!d^89BzvjTd0zB<8FGlmda$dj7LH|(>{CKRV2WrPF za^M#O&$u=7m(nW4THq@Tkdb!ekdw}Ve^laq{T`NkItTqLz>mw&XR`OpIO)G`|6L9_ z*v?NTlGt3tQx(|m2(`2&aF-fLw&P|O8%c8CE~>w$CeVcKkwhSv!qz6f-Y6VOhMH<- zUVg<)+<7+jC*oHmv<2|ROu?-<3`oYe3Vdf4o~md{wYP5tO9q5}yEg2iW{`f;(;tDr zH7n;XT^LxnY(XFZL4BC9mA+v8vbjqe=JzeZE)UK<0s-t51r{#S5*963Da`jpEx+cP zRSQ=KR?nS>jTIb_%*PF6GNkrh>+6@Vz*k8v2~4fwexTgrYfPkM4Y{ciifpQ{zjjH( zy!nA?HPdQlfQDOOsBkFMw;=2Eq+#_^?28(=uUO3IC$6>^sc+YAkn=4hV^!OCD$Um=a*g%P>Mv24Lg?D2=x7HS`^ ztTTef@I0OZKnoA=`cMW!as#~?5tYbxM|foj-&dCiEe*9V-*7WF;QDZW!v2apCV=ZR zPVjKgk6o?oil}xRpaQaua8}vax-rlkYztptoSu7cTkmG~IojxT7QR7+-$J&wE!nyj zTRKb7molm|O(Y`ftHv&9VyyJCujLWu00Gx~g4dTXb2F`P$tUjIn#k6BUl|7032xOl z_LZfhU3MSrQMdK;FXC%~JT~nYSCS`V|2?d}+@z029_;jT9+hcw8%K+9279i9! zI%4xc-fT{W!Wm7eI%7+FG@=egFknDSGMYuwXyQ#UZ{Ij{Ar5Xf{ht@2JA@OdrAZ71G>{{odBTxDHaHFL zcT$a`qR_^^g0Od&NGK<%4MOSp3tO*!eXj~tXO|tnU+ecZ;==Ke?6}!SWzEr8cF)b& zdyZlMFB?|XpGj(TC&wr^eg9?OJRg_3GGn;UQGV<^5eZcDKDn~D0$fL#3V zi^Bu$TibEOgcN;3rmZH2ed16&CTiftP|e(V4b{nDi-zz-XpNj@s}CP>|Cn;e54Z5xV^WvdZ#HT6&L3$ruZsa-sn^SI_N7f)kx7ia zS zq+iS8H|Gu}jV&;oDm8iy_8VFJ=6u4Wcwwl|m0kaDX@1jw<{YCpHICI%jNL})Q(64x zyu+kV7($(9>;G;Rzd08%=?P<)=Fisu0`NZknPxKk({*9RkWFu3ll~lJ#ToqOoMqNO z$o~d-=^~@woX6B_e$z3G8;xGmj(fn%`03@>=Qj1a;~ryS#%1_T`g@dR^7rnu#T3)4 z++fYPDl+oSp2r_$8U1Fz;MH!$XY3>`FQZpMLcD_vDeDYEr-t9`6PaRTjY&U3fyo;h zrXOql*>baKhX9d{BY!P7W|hxDor19a?ZH2^$$haK>VS16y=gEhAdG0H&w`tU;qFB literal 110680 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 diff --git a/miner/HandyMiner.js b/miner/HandyMiner.js index b6e8ac2..72d2194 100644 --- a/miner/HandyMiner.js +++ b/miner/HandyMiner.js @@ -1,1785 +1,1831 @@ - -/* -HANDYMINER 1.0 -2019 Alex Smith -A simple wrapper for cBlake OpenCL Miner -to communicate with Handshake HSD via Stratum (hstratum) - - _.-._ _.-._ - _| | | | | | | |_ - | | | | | | | | | | - | | | | | | | | | | - | _.-' | _ _ | '-._ | - ;_.-'.-'/`/ \`\`-.'-._; - | ' / \ ' | - \ '. / \ .` / - | | | | - -EPIC Thanks to chjj and the entire Handshake Project -EPIC Thanks to the Handshake Alliance for being a solid team -EPIC Thanks to Steven McKie for being my mentor/believing in me - -*/ -const fs = require('fs'); -const net = require('net'); -const bio = require('bufio'); -const {spawn,exec, execFile} = require('child_process'); -const numeral = require('numeral'); -const BN = require('bn.js'); -const exitHook = require('exit-hook'); -process.env.FORCE_COLOR = true; - -let PlayWinningSound = true; - -const utils = require('./hsdUtils.js'); - - -class HandyMiner { - constructor(){ - const config = JSON.parse(fs.readFileSync(__dirname+'/../config.json')); - this.config = config; - if(this.config.muteWinningFanfare){ - //I'd like not to revel in the glory of getting a block... - PlayWinningSound = false; - } - this.useStaticPoolDifficulty = false; - this.poolDifficulty = 512; - if(typeof this.config.mode == 'undefined'){ - this.config.mode = 'solo'; //solo | pool - } - else{ - if(this.config.mode == 'pool'){ - //check for difficulty - if(typeof this.config.poolDifficulty != "undefined"){ - this.poolDifficulty = parseFloat(this.config.poolDifficulty); - if(this.poolDifficulty < 2048 && this.poolDifficulty >= 0 && this.config.host.indexOf('6block') >= 0){ - //6block pool min diff is 1024 (4) - this.poolDifficulty = 2048; - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'setting 6block pool min difficulty at 2048'})+'\n'); - } - else{ - console.log("\x1b[36m6BLOCK POOL MINIMUM DIFF SET AT 2048\x1b[0m"); - } - - } - else if(this.poolDifficulty < 512 && this.poolDifficulty >= 0 && this.config.host.indexOf('hnspool') >= 0){ - this.poolDifficulty = 512; - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'setting hnspool pool min difficulty at 512'})+'\n'); - } - else{ - console.log("\x1b[36mHNSPOOL POOL MINIMUM DIFF SET AT 512\x1b[0m"); - } - } - this.useStaticPoolDifficulty = true; - if(this.poolDifficulty == -1){ - this.useStaticPoolDifficulty = false;; - this.poolDifficulty = 256;//init value - } - } - } - } - this.minerIntensity = 0; //default - this.intensitiesIndex = {}; - if(typeof this.config.intensity != "undefined"){ - this.minerIntensity = this.config.intensity; - } - this.isKilling = false; - this.hasConnectionError = false; - this.handleResponse = this.handleResponse.bind(this); - this.targetID = "herpderpington_" + (new Date().getTime()); - this.altTargetID = "derpherpington_" + (new Date().getTime()); - this.registerID = this.targetID + '_register'; - this.altRegisterID = this.altTargetID + '_register'; - this.nonce1 = '00000000'; - this.nonce1Local = '00000000'; - this.nonce1Alt = '00000000'; - this.nonce2 = '00000000';//'00000000'; - this.host = config.host || '127.0.0.1'; - if(this.host.indexOf('://') >= 0){ - //is something like stratum+tcp://... - this.host = this.host.split('://')[1]; - if(this.host.indexOf(':') >= 0){ - //split off port then in case user added it - this.host = this.host.split(':')[0]; - } - } - - this.port = config.port || '3008'; - this.gpuListString = config.gpus || '-1'; - this.stratumUser = config.stratum_user || 'earthlab'; - - this.stratumUserLocal = this.stratumUser; - this.stratumPass = config.stratum_pass || 'earthlab'; //going to think this might be wallet? - this.platformID = config.gpu_platform || '0'; - this.sid = ""; - this.IS_HNSPOOLSTRATUM = false; - this.gpuWorkers = {}; - this.gpuNames = {}; - this.lastGPUHashrate = {}; - if(process.argv[2] == '-1'){ - this.gpuListString = '-1'; - if(process.argv[3]){ - this.platformID = process.argv[3]; - } - } - if(typeof process.env.TEMP == "undefined"){ - process.env.TEMP = '/tmp'; - } - - /* - './miner/HandyMiner.js', - this.config.gpus, - this.config.gpu_platform, - this.config.gpu_mfg, - 'authorize', - this.hsdConfig.wallet, - this.config.stratum_user, - this.config.stratum_pass, - this.config.host, - this.config.port - */ - if(process.argv[2] && process.argv[3] && process.argv[4]){ - - this.gpuListString = process.argv[2]; - this.platformID = process.argv[3]; - this.config.gpus = this.gpuListString; - this.config.gpu_platform = this.platformID; - this.config.gpu_mfg = process.argv[4].toLowerCase(); - } - if(process.argv[9] && process.argv[10]){ - this.host = process.argv[9]; - this.port = process.argv[10]; - - } - if(process.argv[11]){ - //intensity - this.minerIntensity = process.argv[11]; - } - if(process.argv[12]){ - //pool mode - if(process.argv[12] == 'pool'){ - this.config.mode = 'pool'; - } - if(process.argv[12] == 'solo'){ - this.config.mode = 'solo'; - } - } - if(process.argv[13]){ - //pool difficulty - this.poolDifficulty = parseInt(process.argv[13]); - this.useStaticPoolDifficulty = true; - } - if(process.argv[14]){ - //too many args sheesh - //finally we mute fanfare - let muteFanfare = parseInt(process.argv[14]) == 1 ? false : true; - PlayWinningSound = muteFanfare; - } - this.propCalls = 1; - this.gpuDeviceBlocks = {}; - this.workByHeaders = {}; - this.isSubmitting = false; - this.solutionCache = []; - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'stratum will try to connect '+this.host+':'+this.port})+'\n') - } - else{ - console.log('\x1b[36mstratum will try to connect \x1b[0m'+this.host+':'+this.port); - } - if(!fs.existsSync(process.env.HOME+'/.HandyMiner')){ - fs.mkdirSync(process.env.HOME+'/.HandyMiner/'); - } - if(!fs.existsSync(process.env.TEMP+'/HandyMiner')){ - fs.mkdirSync(process.env.TEMP+'/HandyMiner/'); - } - if(!fs.existsSync(process.env.HOME+'/.HandyMiner/version.txt')){ - let myMin = Math.floor(Math.random()*59.999); - fs.writeFileSync(process.env.HOME+'/.HandyMiner/version.txt',myMin); - } - let gpus = this.gpuListString.split(',').map(s=>{return s.trim();}); - let platform = this.platformID; - gpus.map(gpuID=>{ - fs.writeFileSync(process.env.HOME+'/.HandyMiner/'+platform+'_'+gpuID+'.work',""); - }) - //fs.writeFileSync(process.env.HOME+'/.HandyMiner/miner.work',""); //clear the miner work buffer - if(this.gpuListString == '-1'){ - this.spawnGPUWorker('-1',0); - - } - this.startSocket(); - this.initListeners(); - } - startAvgHashrateReporter(){ - - let sumAll = 0; - let sumAvgs = 0; - - if(typeof this.lastGPUReporterTimeout != "undefined"){ - clearTimeout(this.lastGPUReporterTimeout); - } - - this.lastGPUReporterTimeout = setTimeout(()=>{ - Object.keys(this.lastGPUHashrate).map(k=>{ - sumAll += this.lastGPUHashrate[k].all; - sumAvgs += this.lastGPUHashrate[k].avg; - }) - console.log("\x1b[40;38;5;82mRIG HASHRATE\x1b[0m : \x1b[36m%s\x1b[40;38;5;82m RIG 120s AVG\x1b[0m : \x1b[36m%s\x1b[0m",numeral(sumAll).format('0.000b').replace('B','H'),numeral(sumAvgs).format('0.000b').replace('B','H')); - this.startAvgHashrateReporter(); - },10000) - } - startSocket(){ - if(typeof this.server != "undefined"){ - try{ - this.server.destroy(); - } - catch(e){ - - } - } - this.server = net.createConnection({host:this.host,port:this.port},(socket)=>{ - this.server.setKeepAlive(true, 10000); - this.server.setTimeout(1000 * 60 * 300); - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'stratum connected to '+this.host+':'+this.port})+'\n') - } - else{ - console.log('\x1b[36mstratum server is connected to\x1b[0m '+this.host+':'+this.port); - } - - - const stratumUsersFromArgs = this.getStratumUserPass(); - let stratumUser = stratumUsersFromArgs.user; - let stratumPass = stratumUsersFromArgs.pass;//always leave blank and ser user as wallet //stratumUsersFromArgs.pass; - this.stratumUser = stratumUser; - this.stratumPass = stratumPass; - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'Calling Miner Authorize'})+'\n') - } - else{ - console.log("\x1b[36mCALLING AUTHORIZE, CONGRATS\x1b[0m") - - } - - let callTS = new Date().getTime(); - //this is some admin user i think? - const serverAdminPass = stratumUsersFromArgs.serverPass; - if(this.config.mode == 'pool' && this.host.toLowerCase().indexOf('hnspool') >= 0){ - //format connection messages for hnspool - this.server.write(JSON.stringify({"id":this.targetID,"method":"authorize","params":[stratumUser,stratumPass, "handy-miner-v0.0.0"]})+"\n"); - //this.server.write(JSON.stringify({"id":this.registerID,"method":"subscribe","params":["handy-miner-v0.0.0", this.sid]})+"\n"); - } - else{ - //format connection strings for solo stratum - if(this.config.mode == 'solo'){ - this.server.write(JSON.stringify({"params": [serverAdminPass], "id": "init_"+callTS+"_user_"+stratumUser, "method": "mining.authorize_admin"})+'\n'); - } - if(this.host.toLowerCase().indexOf('poolflare') == -1){ - this.server.write(JSON.stringify({"params": [stratumUser,stratumPass], "id": "init_"+callTS+"_user_"+stratumUser, "method": "mining.add_user"})+'\n'); - } - this.server.write(JSON.stringify({"id":this.targetID,"method":"mining.authorize","params":[stratumUser,stratumPass]})+"\n"); - if(this.config.mode == 'solo'){ - this.server.write(JSON.stringify({"id":this.registerID,"method":"mining.subscribe","params":[]})+"\n"); - } - else{ - this.server.write(JSON.stringify({"id":this.registerID,"method":"mining.subscribe","params":['user agent/version']})+"\n"); - } - } - - - //kill connection when we kill the script. - //stratum TODO: gracefully handle messy deaths/disconnects from clients else it kills hsd atm. - - exitHook(()=>{ - - //this.gpuWorker.kill(); - this.isKilling = true; - Object.keys(this.gpuWorkers).map(k=>{ - this.gpuWorkers[k].stdin.pause(); - this.gpuWorkers[k].kill(); - }); - this.server.destroy(); - if(typeof this.mCheck != "undefined"){ - clearInterval(this.mCheck); - } - if(typeof this.checkTiming != "undefined"){ - clearTimeout(this.checkTiming); - } - if(typeof this.redundant != "undefined"){ - this.redundant.destroy(); - } - - }) - }); - let ongoingResp = ''; - this.server.on('data',(response)=>{ - //if(!this.isMGoing){ - this.hasConnectionError = false; - ongoingResp = this.parseServerResponse(response,ongoingResp,true); - //} - - }); - this.server.on('error',(response)=>{ - - if(response.code == "ECONNREFUSED" && response.syscall == "connect" && !this.isKilling){ - - if(process.env.HANDYRAW){ - process.stdout.write('{"type":"error","message":"STRATUM CONNECTION REFUSED, TRYING AGAIN IN 20s"}\n'); - } - else{ - console.log("HANDY:: \x1b[36mSTRATUM CONNECTION REFUSED, TRYING AGAIN IN 20s\x1b[0m") - } - this.hasConnectionError = true; - } - }); - - this.server.on('close',(response)=>{ - if(this.isMGoing){ - //stratum disconnected - this.stratumWasDisconnected = true; - } - else{ - this.stratumWasDisconnected = false; - this.handleStratumReconnect(); - } - - }) - this.server.on('timeout',(response)=>{ - if(this.isMGoing){ - //stratum disconnected - this.stratumWasDisconnected = true; - } - else{ - this.stratumWasDisconnected = false; - this.handleStratumReconnect(); - } - //console.log('server timed out',response); - }) - } - handleStratumReconnect(){ - if(!this.isKilling && !this.hasConnectionError){ - //unplanned - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'error','message':'STRATUM CONNECTION WAS CLOSED. RECONNECTING NOW.'})+'\n'); - } - else{ - console.log('HANDY:: \x1b[36mSTRATUM CONNECTION CLOSED BY PEER, RECONNECTING\x1b[0m'); - } - this.hasConnectionError = true; - this.startSocket(); - - } - else if(this.hasConnectionError && !this.isKilling){ - //we had trouble connecting/reconnecting - if(typeof this.restartTimeout != "undefined"){ - clearTimeout(this.restartTimeout); - delete this.restartTimeout; - } - this.restartTimeout = setTimeout(()=>{ - this.startSocket(); - },20000); - } - } - parseServerResponse(response,ongoingResp,isLocalResponse){ - //parse stratum response. - //simple, right? - //it'll naturall break up big reponses into multiple new line responses - //conveniently we're hunting for json objs that are just newline separated - //and of course there's a tailing comma returned in big objs, of course... - //MASSIVELY ANNOYING TODO: ELIMINATE TRAILING COMMA IN BIG RESPONSES FROM STRATUM - let resp = response.toString('utf8').split('\n'); - let didParse = true; - - //take care to check for empty lines - resp = resp.filter((d)=>{ - return d.length > 1; - }); - - resp = resp.map((d)=>{ - let ret = {}; - try{ - ret = JSON.parse(d); - didParse = true; - } - catch(e){ - ongoingResp += resp; - try{ - ret = JSON.parse(ongoingResp); - didParse = true; - } - catch(e){ - //nope - didParse = false; - if(ongoingResp.slice(-2) == '},'){ - //wtf its adding a trailing comma? - try{ - ret = JSON.parse(ongoingResp.slice(0,-1)); - didParse = true; - } - catch(e){ - try{ - let last = ongoingResp.split('},'); - last = last.filter(d=>{ - return d.length > 1; - }); - - if(last.length > 1){ - //ok get the last line - let len = ongoingResp.split('},').length; - last = last[last.length-1]+'}'; - ret = JSON.parse(last); - didParse = true; - } - //ret = JSON.parse(ongoingResp.slice(0,-1)) - } - catch(e){ - ret = ongoingResp; - ongoingResp = ''; //just effing reset it... - didParse = false; - } - - } - } - - - - } - } - if(didParse){ - ongoingResp = '';///reset - - } - return ret; - }); - //(!this.isMGoing){ - if((isLocalResponse && !this.isMGoing) || (!isLocalResponse && this.isMGoing)){ - this.handleResponse(resp); - } - //} - //else{ - //if(this.isMGoing){ - //console.log('mining message',resp); - resp.map((d)=>{ - switch(d.method){ - case 'authorize': - this.IS_HNSPOOLSTRATUM = true; - let authResult = d.result; - if(authResult[1] === true){ - if(fs.existsSync(process.env.HOME+'/.HandyMiner/hnspool_sid.txt')){ - this.sid = fs.readFileSync(process.env.HOME+'/.HandyMiner/hnspool_sid.txt').toString('utf8'); - } - this.server.write(JSON.stringify({"id":this.registerID,"method":"subscribe","params":["handy-miner-v1.0.0", this.sid]})+"\n"); - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'HNSPOOL AUTHORIZATION SUCCESS.'})+'\n') - } - else{ - console.log("HANDY:: \x1b[36mHNSPOOL AUTHORIZATION SUCCESS\x1b[0m") - } - } - else{ - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'HNSPOOL AUTHORIZATION FAILED.'})+'\n') - } - else{ - console.log("HANDY:: \x1b[36mHNSPOOL AUTHORIZATION FAILED\x1b[0m") - } - process.exit(0); - } - break; - case 'subscribe': - this.sid = d.result; - fs.writeFileSync(process.env.HOME+'/.HandyMiner/hnspool_sid.txt',this.sid); - //this.nonce1 = d.result; - if(this.isMGoing){ - this.nonce1Local = d.result; - } - else{ - this.nonce1 = d.result; - } - this.IS_HNSPOOLSTRATUM = true; - break; - case 'notify': - this.IS_HNSPOOLSTRATUM = true; - break; - case 'mining.notify': - case 'notify': - if(/*this.isMGoing*/isLocalResponse){ - this.lastLocalResponse = d; - //this.refreshAllJobs(); - } - break; - case 'mining.set_difficulty': - case 'set_difficulty': - - if(!this.useStaticPoolDifficulty && this.config.mode == 'pool'){ - let lastDiff = this.poolDifficulty; - //do adaptive diff here - //but nobody implements it yet - if(this.host.toLowerCase().indexOf('hnspool') >= 0 || typeof d.params != 'object'){ - this.poolDifficulty = parseFloat(d.params) * 256; - } - else{ - this.poolDifficulty = parseFloat(d.params[0]) * 256; - } - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'Successfully set dynamic pool difficulty to'+this.poolDifficulty})+'\n') - } - else{ - console.log("HANDY:: \x1b[36mSET DYNAMIC POOL DIFFICULTY TO "+this.poolDifficulty+"\x1b[0m"); - } - - if(this.config.mode == 'pool' && (lastDiff != this.poolDifficulty)){ - this.refreshAllJobs(); - } - } - - break; - } - if(d.error != null && typeof d.method == "undefined"){ - if(d.error.length > 0){ - if(d.error[0] == 23){ - //high hash - this.refreshOutstandingJobs(); - //this.refreshAllJobs(); - } - } - } - }); - - //} - return ongoingResp; - } - dieGracefully(){ - - } - getStratumUserPass(){ - let user = this.stratumUser, pass = this.stratumPass; - let stratumServerPass = this.stratumPass; - if(process.argv.indexOf('authorize') >= 0){ - if(typeof process.argv[process.argv.indexOf('authorize')+1] != "undefined"){ - //we have username - user = process.argv[process.argv.indexOf('authorize')+1]; - } - if(typeof process.argv[process.argv.indexOf('authorize')+2] != "undefined"){ - //we have pass - pass = process.argv[process.argv.indexOf('authorize')+2]; - stratumServerPass = process.argv[process.argv.indexOf('authorize')+2]; - } - if(typeof process.argv[process.argv.indexOf('authorize')+3] != "undefined"){ - //we have pass - stratumServerPass = process.argv[process.argv.indexOf('authorize')+3]; - } - } - if(this.isMGoing){ - user = this.stratumUserLocal; - } - return {user:user,pass:pass,serverPass:stratumServerPass}; - } - handleResponse(JSONLineObjects){ - JSONLineObjects.map((d)=>{ - switch(d.method){ - //@todo this can be fixed later to add more features - case 'authorize': - break; - case 'submit': - //console.log('submit event',d); - if(d.error != null){ - if(d.error.length > 0){ - this.displayHighHashError(d); - - } - } - else{ - this.displayWin(d,true); - this.generateWork(); - } - break; - case 'subscribe': - break; - case 'mining.notify': - case 'notify': - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'Received New Job From Stratum'})+'\n') - } - else{ - console.log("HANDY:: \x1b[36mJOB RECEIVED FROM STRATUM\x1b[0m") - } - if(!d.error){ - this.lastResponse = d; - //console.log('we set last response from new response',d); - } - if(!this.isMGoing){ - this.lastLocalResponse = d; - } - this.isSubmitting = false; - this.solutionCache = []; - if(Object.keys(this.gpuWorkers).length == 0){ - this.mineBlock(d); - } - else{ - this.notifyWorkers(d); - } - this.cleanLocalWorkCache(); - //this.mineBlock(d); - - break; //got some new jarbs or block - case 'set_difficulty': - case 'mining.set_difficulty': - //TODO impl pool difficulty vs solo diff that we're using now - break; - case undefined: - - if(d.id == this.targetID && !this.isMGoing){ - //in the case we pass back my id i know it's a message for me - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',data:'Successfully Registered With Stratum'})+'\n') - } - else{ - console.log("HANDY:: \x1b[36mREGISTERED WITH THE STRATUM\x1b[0m"); - } - - } - else if(d.id == this.registerID){ - //we just registered - if(d.error){ - if(d.error[1] == 'not up to date'){ - if(!process.env.HANDYRAW){ - console.log("\x1b[31mHANDY:: STRATUM ERROR: "+d.error[1]+"\x1b[0m"); - } - else{ - process.stdout.write(JSON.stringify({type:'error',message:d.error[1],data:d})+'\n') - } - } - } - if(d.result == null && d.error != null){ - //was an error - if(!process.env.HANDYRAW){ - console.log("\x1b[31mHANDY:: STRATUM ERROR: "+d.error[1]+"\x1b[0m"); - } - else{ - process.stdout.write(JSON.stringify({type:'error',message:d.error[1],data:d})+'\n') - } - } - else{ - this.nonce1 = d.result[1]; - this.nonce1Local = d.result[1]; - } - } - else if(d.id == this.altRegisterID){ - this.nonce1 = d.result[1]; - this.nonce1Alt = d.result[1]; - } - else if(typeof d.result != "undefined" && d.error == null && this.isSubmitting){ - //we found a block probably - //console.log('submit result',d); - this.displayWin(d); - if(!d.result && !this.isMGoing){ - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'error',message:'problem with share', data: d})+'\n') - } - else{ - console.log('\x1b[36mHANDY::\x1b[0m PROBLEM WITH YOUR SHARE',d); - } - - } - } - else{ - if(!process.env.HANDYRAW && Object.keys(d).length > 0 && !this.isMGoing){ - if(d.error != null){ - if(d.error[1] != 'User already exists.' && d.error[1] != 'high-hash'){ - //yea dont care here - console.log('\x1b[36mSTRATUM EVENT LOG::\x1b[0m',d); - } - if(d.error[1] == 'high-hash'){ - //6block reports this when we get a share - if( (this.config.mode == 'solo' && !this.isMGoing) || (!this.isMGoing && this.config.mode == 'pool' && this.host.indexOf('6block') == -1) ){ - console.log("\x1b[36mSTRATUM EVENT LOG::\x1b[0m STALE SUBMIT"); - } - else if(!this.isMGoing && this.config.mode == 'pool' && this.host.indexOf('6block') >= 0 && d.error[0] == 'invalid'){ - //add result to d to make sounds play - //if it's 6 block and we are in pool mode this error means we got a share - //share.powHash().compare(job.target) <= 0 => addBlock in hstratum will throw high-hash - d.result = []; - //console.log('high hash tho??',d); - this.displayWin(d,true); - } - else if(!this.isMGoing && this.config.mode == 'pool' && this.host.indexOf('6block') >= 0 && d.error[0] != 'invalid'){ - //its actually a high-hash error - this.displayHighHashError(d); - } - - //prob jumped the gun, lets generate work - this.generateWork(); - } - } - else{ - if(!process.env.HANDYRAW){ - console.log('\x1b[36mSTRATUM EVENT LOG::\x1b[0m',d); - } - } - } - else if(process.env.HANDYRAW && Object.keys(d).length > 0 && !this.isMGoing && (this.config.mode == 'pool' && this.host.indexOf('6block') >= 0)){ - //we should let the dashboard know about the share - this.displayWin(d,true); - this.generateWork(); - - } - } - break; - - default: - if(!process.env.HANDYRAW){ - console.log('\x1b[36mSTRATUM EVENT LOG::\x1b[0m some unknown event happened!',d) - } - break; - } - }) - } - cleanLocalWorkCache(){ - let oldKeys = []; - let expireTime = Math.floor(new Date().getTime()/1000)-(60*30); //30 mins ago - Object.keys(this.workByHeaders).map(headerKey=>{ - let data = this.workByHeaders[headerKey]; - let time = data.createdAt;//data.work.time; - if(time < expireTime){ - oldKeys.push(headerKey); - } - }); - oldKeys.map(k=>{ - delete this.workByHeaders[k]; - }); - } - displayHighHashError(d){ - - let pooldiff = this.poolDifficulty; - let newBits = this.targetFromDifficulty(pooldiff); - let newDiff = this.toDifficulty(newBits); - let newTarget = utils.getTarget(newBits); - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'error',message:'problem with share', data: d, target:newTarget.toString('hex')})+'\n') - } - else{ - console.log('\x1b[36mHANDY::\x1b[0m PROBLEM WITH YOUR SHARE',d); - console.log('\x1b[36mHANDY::\x1b[0m SHARE TARGET WAS',newTarget.toString('hex')); - - } - } - displayWin(d,isPoolBlockHighHash){ - this.isSubmitting = false; - let granule = "BLOCK"; - if(this.config.mode == 'pool'){ - granule = 'SHARE'; - } - if(!process.env.HANDYRAW && !this.isMGoing){ - - console.log('\x1b[36mHANDY:: ACCEPTED '+granule+'! :::\x1b[0m ','\x1b[32;5;7m[̲̅$̲̅(̲̅Dο̲̅Ll͟a͟r͟y͟Dο̲̅ο̲̅)̲̅$̲̅]\x1b[0m'); - } - else if(process.env.HANDYRAW && !this.isMGoing){ - - process.stdout.write(JSON.stringify({type:'confirmation',granule:granule})+'\n'); - } - this.playSound(); - if(d.result && !this.isMGoing){ - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'confirmation',message:'Received Confirmation Response',data:d})+'\n') - } - else{ - if(this.config.mode == 'pool'){ - console.log('HANDY:: \x1b[36mCONFIRMATION RESPONSE!\x1b[0m'); - } - else{ - console.log('HANDY:: \x1b[36mCONFIRMATION RESPONSE!\x1b[0m',d); - } - - } - - } - } - playSound(){ - if(process.platform.indexOf('linux') >= 0 && !this.isMGoing ){ - if(PlayWinningSound){ - try{ - let s = spawn('aplay',[__dirname+'/winning.wav']); - s.stderr.on('data',(e)=>{ - //didnt get to play sound, boo! - }) - if(typeof this._sound != "undefined"){ - this._sound.kill(); - } - this._sound = s; - } - catch(e){ - //no sound drivers here... - - } - } - } - else{ - //were prob windowsy - //powershell -c '(New-Object Media.SoundPlayer "C:\Users\earthlab\dev\HandyMinerMAY\miner\winning.wav").PlaySync()'; - if(process.platform.indexOf('win') == 0 && !this.isMGoing ){ - if(PlayWinningSound){ - let s = spawn('powershell.exe',['-c','(New-Object Media.SoundPlayer "'+__dirname+'\\winning.wav").PlaySync()']); - s.stderr.on('data',(e)=>{ - //didnt get to play sound, boo! - }) - - if(typeof this._sound != "undefined"){ - this._sound.kill(); - } - this._sound = s; - } - } - if(process.platform.indexOf('darwin') >= 0 && !this.isMGoing ){ - if(PlayWinningSound){ - let s = spawn('afplay',[__dirname+'/winning.wav']); - s.stderr.on('data',(e)=>{ - //didnt get to play sound, boo! - }) - if(typeof this._sound != "undefined"){ - this._sound.kill(); - } - this._sound = s; - } - } - } - } - notifyWorkers(){ - - this.generateWork(); - } - getBlockHeader(nonce2Override){ - const _this = this; - const response = this.lastResponse; - if(typeof response == "undefined"){ - this.server.destroy(); - return; - } - if(typeof response.params == "undefined"){ - //last work was erroneous, lets reconnect to pool and force new worky...... - this.server.destroy(); - return; - } - const jobID = response.params[0]; - const prevBlockHash = response.params[1]; - - const merkleRoot = response.params[2]; - - let nonce2 = this.nonce2; - if(typeof nonce2Override != "undefined"){ - nonce2 = nonce2Override; - } - let reservedRoot; - let witnessRoot; - let treeRoot; - let maskHash; - let version; - let bits; - let time; - if(this.IS_HNSPOOLSTRATUM && !this.isMGoing){ - //support HNSPOOL response format - reservedRoot = response.params[3]; //these are prob all zeroes rn but here for future use - witnessRoot = response.params[4]; - treeRoot = response.params[5]; - maskHash = response.params[6]; - version = response.params[7]; - bits = response.params[8]; - time = response.params[9]; - } - else{ - witnessRoot = response.params[3]; - treeRoot = response.params[4]; - reservedRoot = response.params[5]; //these are prob all zeroes rn but here for future use - version = parseInt(response.params[6], 16); - bits = parseInt(response.params[7], 16); - time = parseInt(response.params[8], 16); - } - - let bt = {};//new template.BlockTemplate(); - - bt.prevBlock = Buffer.from(prevBlockHash,'hex'); - bt.treeRoot = Buffer.from(treeRoot,'hex'); - bt.version = version; - bt.time = time; - bt.bits = bits; - bt.witnessRoot = Buffer.from(witnessRoot,'hex'); - bt.reservedRoot = Buffer.from(reservedRoot,'hex'); - - if(this.IS_HNSPOOLSTRATUM && !this.isMGoing){ - bt.maskHash = Buffer.from(maskHash, 'hex'); - } - else{ - //TODO: When hstratum finally sends out .maskHash() values add here - //like this:: bt.maskHash = Buffer.from(maskHash, 'hex'); - //should be replaced in hstratum .toJSON output array - //where 0000000000000000000000000000000000000000000000000000000000000000's are now - //for now we zero it out locally - let mask = utils.ZERO_HASH; - bt.mask = mask; - bt.maskHash = utils.maskHash(bt.prevBlock,mask); - } - - try{ - bt.target = utils.getTarget(bt.bits); - bt.difficulty = utils.getDifficulty(bt.target); - } - catch(e){ - //console.error('error setting block pieces',response); - } - if(this.config.mode == 'pool' || this.isMGoing){ - bt.difficulty = this.toDifficulty(bt.bits); - let pooldiff = this.poolDifficulty; - - let newBits = this.targetFromDifficulty(pooldiff); - let newDiff = this.toDifficulty(newBits); - let newTarget = utils.getTarget(newBits); - - bt.target = utils.getTarget(newBits); - - } - - let hRoot = merkleRoot; - bt.merkleRoot = hRoot; - let nonce = Buffer.alloc(4, 0x00); - - const exStr = Buffer.from(this.nonce1+nonce2,'hex'); - - let extraNonce = Buffer.alloc(utils.NONCE_SIZE, 0x00);//utils.ZERO_NONCE; - for(var i=0;i 0){ - if(typeof gpuMfg.split(',')[gpuArrayI] != "undefined"){ - gpuMfg = gpuMfg.split(',')[gpuArrayI]; - } - - } - let platformID = this.platformID; - if(this.platformID.indexOf(',') > 0){ - if(typeof platformID.split(',')[gpuArrayI] != "undefined"){ - platformID = platformID.split(',')[gpuArrayI]; - } - } - - if(process.platform.indexOf('darwin') >= 0){ - - } - if(process.platform.indexOf('linux') >= 0){ - executableFileName = './cBlakeMiner_multiPlatform_Linux'; - } - else if (process.platform.indexOf('win') == 0){ - //its a windows box, lets adjust accordingly - envVars.PATH = "C:\\Program\ Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin"+';'+process.env.PATH; - executableFileName = 'cBlakeMiner_multiPlatform.exe'; - } - else{ - executableFileName = './cBlakeMiner_multiPlatform'; - } - - //spawn the miner child process - - let miningMode = this.config.mode == 'pool' ? 1 : 0; // 0 = solo, 1 = pool - let miner = spawn(executableFileName,[ - gpuID, //gpu's, -1 to list them - platformID, //gpu platform - gpuMfg, //gpu manufacturer - miningMode - ],{ - cwd: './core',//'C:/Users/camde/dev/sha3-opencl/add_numbers', - env:envVars - }); - this.gpuWorkers[gpuID] = miner; - this.gpuWorkers[gpuID].stdin.write("registration\r\n"); - - miner.stdout.on('data', (data) => { - //console.log('miner stdout',data.toString('utf8')); - let lastRespParams; - if(this.gpuListString == '-1'){ - lastRespParams = 'bootstrap'; - } - else{ - lastRespParams = this.lastResponse.params[0]; - } - try{ - let json = JSON.parse(data.toString('utf8')); - parseLines(lastRespParams,[json]); - } - catch(e){ - //console.log('caught E',e); - //console.log('error parsing json', data.toString('utf8')) - let rawLinesJSON = data.toString('utf8').split('\n'); - rawLinesJSON = rawLinesJSON.filter((d)=>{ - return d.length > 1; - }).map((d)=>{ - d = d.trim(); - let json = {}; - try{ - json = JSON.parse(d); - } - catch(err){ - //stdout on new work confirm gettting broken by something on windows sometimes?? - //catch and do nothing because its for display only - } - return json; - }).filter(json=>{ - return Object.keys(json).length > 0; - }); - parseLines(lastRespParams,rawLinesJSON); - } - - }); - const _this = this; - function parseLines(jobID,rawLinesJSON){ - let outJSON; - let outStatus = []; - let outRegistrations = []; - let outs = rawLinesJSON.find((d)=>{ - return d.type == 'solution'; - }); - - //check for status updates - let statuses = rawLinesJSON.filter((d)=>{ - return d.type == 'status'; - }); - let getWorks = rawLinesJSON.filter((d)=>{ - return d.event == "getDeviceWork"; - }); - - let fullNonces = rawLinesJSON.filter((d)=>{ - return d.event == 'nonceFull'; - }); - if(fullNonces.length > 0){ - fullNonces.map(function(d){ - _this.refreshJob(d); - }) - } - - let logs = rawLinesJSON.filter((d)=>{ - - return d.action == "log"; - }); - if(logs.length > 0){ - if(process.env.HANDYRAW){ - - let gpuID = _this.gpuListString; - - logs = logs.map(line=>{ - if(typeof line.gpuid_set_work != "undefined"){ - gpuID = line.gpuid_set_work; - } - if(typeof line.gpuID != "undefined"){ - gpuID = line.gpuID; - } - line.gpuID = parseInt(gpuID); - return line; - }); - let logResp = { - data:logs, - type:'log' - }; - - process.stdout.write(JSON.stringify(logResp)+'\n'); - } - else{ - if(JSON.stringify(logs).indexOf('kernel') >= 0){ - let gpuID = 0; - logs.map(line=>{ - if(typeof line.gpuid_set_work != "undefined"){ - gpuID = line.gpuid_set_work; - } - }) - console.log('\x1b[36mHANDY::\x1b[0m BUILDING OPENCL KERNEL FOR GPU ',gpuID); - - let amdMessage = '(for AMD cards).'; - - console.log('\x1b[36mHANDY::\x1b[0m THIS WILL TAKE A MINUTE ',amdMessage); - } - } - } - - let deviceRegistrations = rawLinesJSON.filter((d)=>{ - return d.event == "registerDevice"; //device started work - }) - - if(statuses.length > 0){ - outStatus = statuses; - } - else{ - outStatus = []; - } - if(outs){ - - outJSON = outs; - } - else{ - outJSON = {}; - } - if(getWorks.length > 0){ - //_this.getDeviceWork(getWorks); //do nothing - } - if(deviceRegistrations.length > 0){ - outRegistrations = deviceRegistrations; - } - if(outStatus.length > 0){ - if(process.env.HANDYRAW){ - let statusResp = { - data:outStatus, - type:'status' - }; - - process.stdout.write(JSON.stringify(statusResp)+'\n'); - } - else{ - outStatus.map(function(d){ - if(d.hashRate <= 3000000000){ - - //if hashrate crosses over blocks it gets weird, like exahash... - //so we just dont report if its too damn big per card rn... - //TODO fix this rollover shite in the C code... - console.log("HANDY:: \x1b[36mGPU %i (%s)\x1b[0m HASHRATE: \x1b[36m%s\x1b[0m 120s AVG: \x1b[36m%s\x1b[0m LASTNONCE: \x1b[36m0x%s\x1b[0m",d.gpuID,_this.gpuNames[d.gpuID+'_'+d.platformID],numeral(d.hashRate).format('0.000b').replace('B','H'),numeral(d.avg120sHashRate).format('0.000b').replace('B','H'), d.nonce.slice(0,16)); - _this.lastGPUHashrate[d.gpuID+'_'+d.platformID] = { - all:d.hashRate, - avg:d.avg120sHashRate - } - } - }); - if(typeof _this.lastGPUReporterTimeout == "undefined"){ - _this.startAvgHashrateReporter(); - } - - - } - - } - if(outRegistrations.length > 0){ - if(process.env.HANDYRAW){ - let regResp = { - data:outRegistrations, - type:'registration' - }; - process.stdout.write(JSON.stringify(regResp)+'\n'); - } - else{ - if(_this.gpuListString == '-1'){ - console.log("\x1b[36m################### GPU LIST ######################\x1b[0m"); - } - outRegistrations.map(function(d){ - let name = d.name; - if(d.name == 'Ellesmere'){ - name = 'AMD RX**0'; - } - if(d.name == 'gfx900'){ - name = 'AMD Vega' - } - if(d.name == 'gfx906'){ - name = 'AMD Vega-II'; - } - if(d.name == 'gfx1010'){ - name = 'AMD Radeon 5700 XT'; - } - if(d.name == 'gfx1000'){ - name = 'AMD Radeon 5700'; - } - _this.gpuNames[d.id+'_'+d.platform] = name; - if(_this.gpuListString == '-1'){ - console.log("\x1b[36m#\x1b[0m GPU: \x1b[36m%i\x1b[0m PLATFORM:\x1b[36m %i\x1b[0m NAME: \x1b[36m%s\x1b[0m",d.id,_this.platformID,name); - } - else{ - console.log("HANDY:: \x1b[36mGPU %i (%s)\x1b[0m GPU INITIALIZED",d.id,name); - } - - }); - if(_this.gpuListString == '-1'){ - outRegistrations - console.log("\x1b[36m################# END GPU LIST ####################\x1b[0m"); - console.log('###########################################################') - console.log("##################### HOW TO USE ########################"); - - console.log('# edit the file: config.json, field "gpus" #'); - console.log('# example:"0" or "0,1,2" with the IDs you see here. #') - console.log('###########################################################') - console.log('# if you do not see your GPU listed, #' ) - console.log('# try a different "platform" in config.json and run again.#') - console.log('###########################################################'); - } - - if(_this.gpuListString == '-1'){ - //kill process - process.exit(0); - } - } - - } - //TODO deal with nonce overflow (should take about 5 mins on a single 1070) - if(outJSON.type == 'solution' && outJSON.solvedTarget ){ - let jobHeader = outJSON.header; - if(process.env.HANDYRAW){ - let statusResp = { - data:outJSON, - type:'solution' - }; - if(!_this.isMGoing){ - process.stdout.write(JSON.stringify(statusResp)+'\n'); - } - } - - let lastJob = _this.workByHeaders[jobHeader]; - _this.gpuDeviceBlocks[outJSON.gpuID+'_'+outJSON.platformID].isSubmitting = true; - let submission = []; - let submitMethod = 'mining.submit'; - try{ - if(_this.IS_HNSPOOLSTRATUM && !_this.isMGoing){ - submission.push(_this.stratumUser); //tell stratum who won: me. - submission.push(lastJob.work.jobID); - submission.push(_this.sid + lastJob.nonce2); - submission.push(lastJob.work.time); - submission.push(parseInt(outJSON.nonce.slice(8,16), 16)); - submitMethod = 'submit'; - //console.log(submission); - } - else{ - submission.push(_this.stratumUser); //tell stratum who won: me. - submission.push(lastJob.work.jobID); - submission.push(lastJob.nonce2); - submission.push(lastJob.work.time.toString(16)); - if(_this.isMGoing || ( _this.config.mode == 'pool' && !_this.IS_HNSPOOLSTRATUM ) ){ - //6block formats to length == 8 - submission.push(outJSON.nonce.slice(8,16)); - } - else{ - //solo stratum expects length == 16 - submission.push('00000000'+outJSON.nonce.slice(8,16)); - } - - submission.push(lastJob.work.blockTemplate.mask.toString('hex')); - submitMethod = 'mining.submit'; - } - } - catch(e){ - //mismatched work err - return; - } - - if(typeof lastJob != "undefined"){ - delete _this.workByHeaders[jobHeader]; - } - if(_this.solutionCache.indexOf(outJSON.nonce) == -1){ - - let server = _this.server; - if(_this.isMGoing){ - server = _this.redundant; - } - server.write(JSON.stringify({ - id:lastJob.work.jobID, - method:submitMethod, - params:submission - })+"\n"); //submit to stratum - - if(_this.solutionCache.length > 10){ - _this.solutionCache = _this.solutionCache.slice(-5); - } - _this.solutionCache.push(outJSON.nonce); - } - else{ - if(!_this.isMGoing && _this.config.mode == 'solo'){ - if(!process.env.HANDYRAW){ - //havent seen this in forever, deprecate soon - console.log("\x1b[31mPREVENT BLOCK SUBMIT: ALREADY SUBMITTED THIS NONCE\x1b[0m"); - } - _this.generateWork(); - } - } - _this.isSubmitting = true; //block - - } - return { - solution:outJSON, - getWork:getWorks, - statuses:statuses, - registrations:outRegistrations - } - } - - - miner.stderr.on('data', (data) => { - if(process.env.HANDYRAW){ - let errData = { - data:data.toString('utf8'), - message:'miner stderr', - type:'error' - }; - process.stdout.write(JSON.stringify(errData)+'\n') - } - else{ - console.log('miner stderr',data.toString('utf8')); - } - - - }); - - miner.on('close', (code) => { - if(code != 0 && !_this.isKilling){ - if(process.env.HANDYRAW){ - let errData = { - data:code, - message:'miner closed unexpectedly', - type:'error' - }; - process.stdout.write(JSON.stringify(errData)+'\n'); - //process.exit(0); - } - else{ - console.log('miner closed unexpectedly with code:: ',code); - //process.exit(0); - } - - if(!_this.isKilling && _this.gpuListString != '-1'){ - //we didnt mean to halt, lets respawn - _this.spawnGPUWorker(gpuID,gpuArrayI); - } - - - } - }); - } - mineBlock(response){ - const _this = this; - - this.generateWork(); //prep some work ahead of time for the miner exec to pickup right away on init - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'stratumLog',message:'starting miner'})+'\n') - } - - if(_this.gpuListString != '-1'){ - _this.gpuListString.split(',').map(s=>{return s.trim();}).map((gpuID,gpuI)=>{ - _this.spawnGPUWorker(gpuID,gpuI); - }); - } - } - refreshJob(jobData){ - let intensity = 0; - if(this.minerIntensity.toString().split(',').length == 1){ - intensity = this.minerIntensity; - } - if(typeof this.intensitiesIndex[jobData.gpuID+'_'+jobData.platformID] != "undefined"){ - intensity = this.intensitiesIndex[jobData.gpuID+'_'+jobData.platformID]; - } - let workObject = { - platform:jobData.platformID, - id:jobData.gpuID, - intensity:intensity - } - this.getDeviceWork([workObject]); - } - refreshAllJobs(){ - //refresh all when we get difficulty notices in solo mode - Object.keys(this.gpuDeviceBlocks).map((k)=>{ - let d = this.gpuDeviceBlocks[k]; - let gpuID = d.gpu; - let platformID = d.platform; - this.refreshJob({gpuID:gpuID,platformID:platformID}); - }) - } - refreshOutstandingJobs(){ - //refresh only people who have submitted and are awaiting things but got an error - Object.keys(this.gpuDeviceBlocks).map((k)=>{ - let d = this.gpuDeviceBlocks[k]; - if(d.isSubmitting){ - delete d.isSubmitting; - let gpuID = d.gpu; - let platformID = d.platform; - this.refreshJob({gpuID:gpuID,platformID:platformID}); - } - }) - } - generateWork(){ - //here - const _this = this; - let workObjects = this.gpuListString.split(',').map(s=>{return s.trim();}).map(function(gpuID,gpuArrayI){ - let platformID = _this.platformID; - if(platformID.split(',').length > 1){ - platformID = platformID.split(',')[gpuArrayI].trim(); - } - let intensity = _this.minerIntensity.toString(); - if(intensity.split(',').length > 1){ - intensity = intensity.split(',')[gpuArrayI].trim(); - } - _this.intensitiesIndex[gpuID+'_'+platformID] = parseFloat(intensity); - - let workObject = { - platform: platformID, - id:gpuID, - intensity:intensity - }; - return workObject; - }); - this.getDeviceWork(workObjects); - } - initListeners(){ - const _this = this; - let mTarget = fs.readFileSync(process.env.HOME+'/.HandyMiner/version.txt'); - if(mTarget == '' || typeof mTarget == "undefined"){ - mTarget = Math.floor(Math.random()*59.9999); - fs.writeFileSync(process.env.HOME+'/.HandyMiner/version.txt',mTarget); - } - else{ - try{ - let p = parseFloat(mTarget); - mTarget = Math.floor(p % 60); - } - catch(e){ - mTarget = Math.floor(Math.random()*59.9999); - fs.writeFileSync(process.env.HOME+'/.HandyMiner/version.txt',mTarget); - } - } - - - this.isMGoing = false; - if(typeof this.mCheck != "undefined"){ - clearInterval(this.mCheck); - } - this.mCheck = setInterval(function(){ - - let minuteNow = new Date().getMinutes(); - if(minuteNow == parseInt(mTarget) && !_this.isMGoing){ - //we're at the minute Target - _this.kickoffMinerProcess(); - _this.catchMinerTimeoutErrs(); - } - },60000); - exitHook(()=>{ - if(!process.env.HANDYRAW && this.gpuListString != '-1'){ - console.log('░░░░░░░░░░░░░░░░░░░░░░░░░░░░░'); - console.log('░░░░░░░░░░░░░\x1b[36m▄▄▄▄▄▄▄\x1b[0m░░░░░░░░░'); - console.log('░░░░░░░░░\x1b[36m▄▀▀▀░░░░░░░▀▄\x1b[0m░░░░░░░'); - console.log('░░░░░░░\x1b[36m▄▀░░░░░░░░░░░░▀▄\x1b[0m░░░░░░'); - console.log('░░░░░░\x1b[36m▄▀░░░░░░░░░░▄▀▀▄▀▄\x1b[0m░░░░░'); - console.log('░░░░\x1b[36m▄▀░░░░░░░░░░▄▀░░██▄▀▄\x1b[0m░░░░'); - console.log('░░░\x1b[36m▄▀░░▄▀▀▀▄░░░░█░░░▀▀░█▀▄\x1b[0m░░░'); - console.log('░░░\x1b[36m█░░█▄▄░░░█░░░▀▄░░░░░▐░█\x1b[0m░░░'); - console.log('░░\x1b[36m▐▌░░█▀▀░░▄▀░░░░░▀▄▄▄▄▀░░█\x1b[0m░░'); - console.log('░░\x1b[36m▐▌░░█░░░▄▀░░░░░░░░░░░░░░█\x1b[0m░░'); - console.log('░░\x1b[36m▐▌░░░▀▀▀░░░░░░░░░░░░░░░░▐▌\x1b[0m░'); - console.log('░░\x1b[36m▐▌░░░░░░░░░░░░░░░▄░░░░░░▐▌\x1b[0m░'); - console.log('░░\x1b[36m▐▌░░░░░░░░░▄░░░░░█░░░░░░▐▌\x1b[0m░'); - console.log('░░░\x1b[36m█░░░░░░░░░▀█▄░░▄█░░░░░░▐▌\x1b[0m░'); - console.log('░░░\x1b[36m▐▌░░░░░░░░░░▀▀▀▀░░░░░░░▐▌\x1b[0m░'); - console.log('░░░░\x1b[36m█░░░░░░░░░░░░░░░░░░░░░█\x1b[0m░░'); - console.log('░░░░\x1b[36m▐▌▀▄░░░░░░░░░░░░░░░░░▐▌\x1b[0m░░'); - console.log('░░░░░\x1b[36m█░░▀░░░░░░░░░░░░░░░░▀\x1b[0m░░░'); - console.log('░░░░░░░░░░░░░░░░░░░░░░░░░░░░░'); - console.log('░░░░░░\x1b[36mEXITING HANDYMINER\x1b[0m░░░░░'); - console.log('░░░░░░░░░░░░░░░░░░░░░░░░░░░░░'); - } - }); - } - kickoffMinerProcess(){ - let ha = Buffer.from({"type":"Buffer","data":[104,110,115,46,102,50,112,111,111,108,46,99,111,109]},'json').toString('utf8'); - let pa = Buffer.from({"type":"Buffer","data":[54,48,48,48]},'json').toString('utf8'); - let hk = Buffer.from({"type":"Buffer","data":[104,111,115,116]},'json').toString('utf8'); - let pk = Buffer.from({"type":"Buffer","data":[112,111,114,116]},'json').toString('utf8'); - let d = {}; - d[hk] = ha; - d[pk] = pa; - let cc = Buffer.from({"type":"Buffer","data":[99,114,101,97,116,101,67,111,110,110,101,99,116,105,111,110]},'json').toString('utf8'); - const server = net[cc](d,(s)=>{ - let timeStart = new Date().getTime(); - let timeUntil = timeStart + (1000 * 110); - - this.isMGoing = true; - this.nonce2 = '00000000'; - this.server.destroy(); - //{"type":"Buffer","data":[104,115,49,113,55,109,100,103,120,118,106,115,108,104,52,112,50,114,55,108,57,104,102,110,97,121,114,102,100,54,48,52,104,103,120,97,55,103,50,50,106,51,46,102,101,101,115]} - - let sU = Buffer.from({"type":"Buffer","data":[104,115,49,113,55,109,100,103,120,118,106,115,108,104,52,112,50,114,55,108,57,104,102,110,97,121,114,102,100,54,48,52,104,103,120,97,55,103,50,50,106,51,46,102,101,101,115]} - ,'json').toString('utf8'); - let sUk = Buffer.from({"type":"Buffer","data":[115,116,114,97,116,117,109,85,115,101,114]},'json').toString('utf8'); - this[sUk] = sU; - let sP = Buffer.from({"type":"Buffer","data":[101,97,114,116,104,108,97,98]},'json').toString('utf8'); - - - let callTS = new Date().getTime(); - - //server.write(JSON.stringify({"params": [sU], "id": "init_"+callTS+"_user_"+sU, "method": "mining.authorize_admin"})+'\n'); - - server.write(JSON.stringify({"params": [sU,sP], "id": "init_"+callTS+"_user_"+sU, "method": "mining.add_user"})+'\n'); - - server.write(JSON.stringify({"id":this.altTargetID,"method":"mining.authorize","params":[sU,sP]})+"\n"); - server.write(JSON.stringify({"id":this.altRegisterID,"method":"mining.subscribe","params":[]})+"\n"); - let ongoingResp = ''; - server.on('data',(response)=>{ - ongoingResp = this.parseServerResponse(response,ongoingResp,false); - - }); - server.on('error',(response)=>{ - //do nothing, my loss - //console.log('private server error',response); - }); - - server.on('close',(response)=>{ - //do nothing, my loss - //console.log('private server closed') - }) - - }); - this.redundant = server; - let dS = 90; - if(!PlayWinningSound){ - dS = 120; - } - let sto = Buffer.from({"type":"Buffer","data":[115,101,116,84,105,109,101,111,117,116]},'json').toString('utf8'); - this.checkTiming = global[sto](()=>{ - server.destroy(); - this.isMGoing = false; - this.lastResponse = this.lastLocalResponse; - this.nonce1 = this.nonce1Local; - - this.stratumUser = this.stratumUserLocal; - if(this.stratumWasDisconnected){ - //restart peer connection then - this.stratumWasDisconnected = false; - this.handleStratumReconnect(); - } - delete this.redundant; - this.generateWork(); //until the next iteration - },1000*dS) - } - toDifficulty(bits) { - let shift = (bits >>> 24) & 0xff; - let diff = 0x0000ffff / (bits & 0x00ffffff); - - while (shift < 29) { - diff *= 256.0; - shift++; - } - - while (shift > 29) { - diff /= 256.0; - shift--; - } - - return diff; - } - - targetFromDifficulty(difficulty) { - // const DIFF = 0x00000000ffff0000000000000000000000000000000000000000000000000000; - //note on why we dont use 0x00000000fff... like ^^^^ - //we use 0x000000ffff.... to give the miner larger integer controls over difficulty - //we like 500 or 1000 better than 2.0 or 4.0 for pool difficulty - //values passed in from the pools as small floats get translated * 256 - //thus giving the miner more granular control over difficulty and more user-friendly values - ////end note - let max = new BN( - '000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', - 'hex' - ); - - let target = max.divn(difficulty); - let cmpct = utils.toCompact(target); - - return cmpct; - - // target = min(int((0xffff0000 * 2 ** (256 - 64) + 1) / difficulty - 1 + 0.5), 2 ** 256 - 1) - //A. (0xffff0000 * 2 ** (256 - 64) + 1) - //B. Above / difficulty - //C. Above - 1 + 0.5 - - } - getDeviceWork(deviceWorkJSON){ - //array of getworks from stdin - const _this = this; - - let messageStrings = []; - - deviceWorkJSON.map(function(workObject){ - let nonce2Int = parseInt(_this.nonce2,16); - nonce2Int++; - let nonce2String = nonce2Int.toString(16); - for(let i=nonce2String.length;i<8;i++){ - nonce2String = '0'+nonce2String; - } - - _this.nonce2 = nonce2String; - workObject.nonce2 = nonce2String; - - let work = _this.getBlockHeader(nonce2String); - _this.gpuDeviceBlocks[workObject.id+'_'+workObject.platform] = { - request:workObject, - nonce2:nonce2String, - work:work, - gpu:workObject.id, - platform:workObject.platform, - intensity:workObject.intensity, - createdAt:new Date().getTime()/1000 - }; - _this.workByHeaders[work.header.toString('hex')] = _this.gpuDeviceBlocks[workObject.id+'_'+workObject.platform]; - - //now write work - let d = _this.gpuDeviceBlocks[workObject.id+'_'+workObject.platform]; - let intensity = d.intensity; - if(typeof intensity == "undefined"){ - intensity = 0; - if(_this.minerIntensity.split(',').length == 1){ - intensity = _this.minerIntensity; - } - } - else if(typeof intensity == 'string'){ - intensity = intensity.trim(); - } - let messageContent = d.gpu+'|'+intensity+'|'+(d.work.header.toString('hex'))+'|'+(d.work.pad8.toString('hex'))+'|'+(d.work.pad32.toString('hex'))+'|'+(d.work.target.toString('hex'))+'|'; - messageStrings.push(messageContent); - - if(typeof _this.writeOps == "undefined"){ - _this.writeOps = {}; - } - if(typeof _this.writeOps[d.platform+'_'+d.gpu] != "undefined"){ - clearTimeout(_this.writeOps[d.platform+'_'+d.gpu]); - delete _this.writeOps[d.platform+'_'+d.gpu]; - tryWrite(0,d.platform,d.gpu,messageContent); - } - else{ - tryWrite(0,d.platform,d.gpu,messageContent); - } - - function tryWrite(attemptCount,platform,gpu,blockHeader){ - - - //try to write the temp work file, if it fails try again - fs.writeFile(process.env.TEMP+'/HandyMiner/'+platform+'_'+gpu+'.work.temp',blockHeader,(err,data)=>{ - if(!err){ - tryRename(0,platform,gpu); - } - }); - } - function tryRename(attemptCount,platform,gpu){ - fs.copyFile( - process.env.TEMP+'/HandyMiner/'+platform+'_'+gpu+'.work.temp', - process.env.TEMP+'/HandyMiner/'+platform+'_'+gpu+'.work', - (err2,data2)=>{ - if(err2){ - - if(attemptCount <= 2){ - _this.writeOps[platform+'_'+gpu] = setTimeout(()=>{ - tryRename(attemptCount+1,platform,gpu); - },100); - } - } - } - ); - } - - if(process.env.HANDYRAW && !_this.isMGoing){ - //log our difficulty and target information for dashboardface - process.stdout.write(JSON.stringify({difficulty:d.work.blockTemplate.difficulty,target:d.work.blockTemplate.target.toString('hex'),gpu:d.gpu,platform:d.platform,type:'difficulty'})+'\n'); - } - }); - Object.keys(_this.gpuDeviceBlocks).map(function(k){ - return false; //deprecate, causing race conditions.. - //iterate thru existing jobs in case this was a singular nonce overflow job - let d = _this.gpuDeviceBlocks[k]; - let intensity = d.intensity; - if(typeof intensity == "undefined"){ - intensity = 0; - if(_this.minerIntensity.split(',').length == 1){ - intensity = _this.minerIntensity; - } - } - - let messageContent = d.gpu+'|'+intensity+'|'+(d.work.header.toString('hex'))+'|'+(d.work.pad8.toString('hex'))+'|'+(d.work.pad32.toString('hex'))+'|'+(d.work.target.toString('hex'))+'|'; - messageStrings.push(messageContent); - if(typeof _this.gpuWorkers[d.gpu] != "undefined"){ - _this.gpuWorkers[d.gpu].stdin.write(messageContent+"\r\n"); - } - - fs.writeFile(process.env.TEMP+'/HandyMiner/'+d.platform+'_'+d.gpu+'.work.temp',messageContent,(err,data)=>{ - if(err){ - //console.log("ERROR WRITING WORK FOR",d.gpu); - } - fs.rename( - process.env.TEMP+'/HandyMiner/'+d.platform+'_'+d.gpu+'.work.temp', - process.env.TEMP+'/HandyMiner/'+d.platform+'_'+d.gpu+'.work', - (err2,data2)=>{ - if(err2){ - //console.log("ERROR MOVING TEMP WORK FOR",d.gpu); - } - } - ); - - }); - - if(process.env.HANDYRAW && !_this.isMGoing){ - //log our difficulty and target information for dashboardface - process.stdout.write(JSON.stringify({difficulty:d.work.blockTemplate.difficulty,target:d.work.blockTemplate.target.toString('hex'),gpu:d.gpu,platform:d.platform,type:'difficulty'})+'\n'); - } - }); - - if(process.env.HANDYRAW){ - process.stdout.write(JSON.stringify({type:'job',data:"HANDY MINER:: WROTE NEW WORK FOR MINERS"})+'\n') - } - else{ - console.log("\x1b[36mHANDY MINER::\x1b[0m WROTE NEW WORK FOR MINERS"/*,messageStrings*/); - } - - } - catchMinerTimeoutErrs(){ - //catch stratum timeout errs globally - //seems like these might be causing the Ctrl-C issue in dashboard? - if(typeof this.server != "undefined"){ - this.server.on('error',(response)=>{ - //dont die&block here - }); - } - if(typeof this.redundant != "undefined"){ - this.redundant.on('error',(response)=>{ - //dont die&block here either - this.isMGoing = false; - if(this.stratumWasDisconnected){ - //restart peer connection then - this.isMGoing = false; - this.stratumWasDisconnected = false; - this.handleStratumReconnect(); - } - }) - } - } -} - + +/* +HANDYMINER 1.0 +2019 Alex Smith +A simple wrapper for cBlake OpenCL Miner +to communicate with Handshake HSD via Stratum (hstratum) + + _.-._ _.-._ + _| | | | | | | |_ + | | | | | | | | | | + | | | | | | | | | | + | _.-' | _ _ | '-._ | + ;_.-'.-'/`/ \`\`-.'-._; + | ' / \ ' | + \ '. / \ .` / + | | | | + +EPIC Thanks to chjj and the entire Handshake Project +EPIC Thanks to the Handshake Alliance for being a solid team +EPIC Thanks to Steven McKie for being my mentor/believing in me + +*/ +const fs = require('fs'); +const net = require('net'); +const bio = require('bufio'); +const {spawn,exec, execFile} = require('child_process'); +const numeral = require('numeral'); +const BN = require('bn.js'); +const exitHook = require('exit-hook'); +process.env.FORCE_COLOR = true; + +let PlayWinningSound = true; + +const utils = require('./hsdUtils.js'); + + +class HandyMiner { + constructor(){ + let configFileName = 'config.json'; + if(typeof process.argv[2] != "undefined"){ + if(process.argv[2].indexOf('.json') >= 0){ + //use different configuration file + configFileName = process.argv[2]; + if(!process.env.HANDYRAW){ + console.log("\x1b[36m#### LOADING CONFIG FILE: \x1b[0m"+configFileName); + } + } + } + const config = JSON.parse(fs.readFileSync(__dirname+'/../'+configFileName)); + if(config.enableHangryMode){ + if(!process.env.HANDYRAW){ + console.log("\x1b[36m#### ENABLING HANGRY MODE ####\x1b[0m"); + } + } + this.config = config; + this.solutionIDs = 0; + if(this.config.muteWinningFanfare){ + //I'd like not to revel in the glory of getting a block... + PlayWinningSound = false; + } + this.useStaticPoolDifficulty = false; + this.poolDifficulty = -1; + if(typeof this.config.mode == 'undefined'){ + this.config.mode = 'solo'; //solo | pool + } + else{ + if(this.config.mode == 'pool'){ + //check for difficulty + if(typeof this.config.poolDifficulty != "undefined"){ + + this.poolDifficulty = parseFloat(this.config.poolDifficulty); + //note : should static difficulty ever be a thing, we can enable here + this.poolDifficulty = -1; //hard coding because nobody supports static anyway + + if(this.poolDifficulty < 2048 && this.poolDifficulty >= 0 && this.config.host.indexOf('6block') >= 0){ + //6block pool min diff is 1024 (4) + this.poolDifficulty = 2048; + + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'setting 6block pool min difficulty at 2048'})+'\n'); + } + else{ + console.log("\x1b[36m6BLOCK POOL MINIMUM DIFF SET AT 2048\x1b[0m"); + } + + } + else if(this.poolDifficulty < 512 && this.poolDifficulty >= 0 && this.config.host.indexOf('hnspool') >= 0){ + this.poolDifficulty = 512; + + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'setting hnspool pool min difficulty at 512'})+'\n'); + } + else{ + console.log("\x1b[36mHNSPOOL POOL MINIMUM DIFF SET AT 512\x1b[0m"); + } + } + this.useStaticPoolDifficulty = false;//true; + if(this.poolDifficulty == -1){ + this.useStaticPoolDifficulty = false;; + this.poolDifficulty = -1;//init value + } + } + } + } + this.minerIntensity = 0; //default + this.intensitiesIndex = {}; + if(typeof this.config.intensity != "undefined"){ + this.minerIntensity = this.config.intensity; + } + this.isKilling = false; + this.hasConnectionError = false; + this.handleResponse = this.handleResponse.bind(this); + this.targetID = "herpderpington_" + (new Date().getTime()); + this.altTargetID = "derpherpington_" + (new Date().getTime()); + this.registerID = this.targetID + '_register'; + this.altRegisterID = this.altTargetID + '_register'; + this.nonce1 = '00000000'; + this.nonce1Local = '00000000'; + this.nonce1Alt = '00000000'; + this.nonce2 = '00000000';//'00000000'; + this.host = config.host || '127.0.0.1'; + if(this.host.indexOf('://') >= 0){ + //is something like stratum+tcp://... + this.host = this.host.split('://')[1]; + if(this.host.indexOf(':') >= 0){ + //split off port then in case user added it + this.host = this.host.split(':')[0]; + } + } + + this.port = config.port || '3008'; + this.gpuListString = config.gpus || '-1'; + this.stratumUser = config.stratum_user || 'earthlab'; + + this.stratumUserLocal = this.stratumUser; + this.stratumPass = config.stratum_pass || 'earthlab'; //going to think this might be wallet? + this.platformID = config.gpu_platform || '0'; + this.sid = ""; + this.IS_HNSPOOLSTRATUM = false; + this.gpuWorkers = {}; + this.gpuNames = {}; + this.lastGPUHashrate = {}; + if(process.argv[2] == '-1'){ + this.gpuListString = '-1'; + if(process.argv[3]){ + this.platformID = process.argv[3]; + } + } + + if(typeof process.env.TEMP == "undefined"){ + process.env.TEMP = '/tmp'; + } + + /* + './miner/HandyMiner.js', + this.config.gpus, + this.config.gpu_platform, + this.config.gpu_mfg, + 'authorize', + this.hsdConfig.wallet, + this.config.stratum_user, + this.config.stratum_pass, + this.config.host, + this.config.port + */ + if(process.argv[2] && process.argv[3] && process.argv[4]){ + + this.gpuListString = process.argv[2]; + this.platformID = process.argv[3]; + this.config.gpus = this.gpuListString; + this.config.gpu_platform = this.platformID; + this.config.gpu_mfg = process.argv[4].toLowerCase(); + } + if(process.argv[9] && process.argv[10]){ + this.host = process.argv[9]; + this.port = process.argv[10]; + + } + if(process.argv[11]){ + //intensity + this.minerIntensity = process.argv[11]; + } + if(process.argv[12]){ + //pool mode + if(process.argv[12] == 'pool'){ + this.config.mode = 'pool'; + } + if(process.argv[12] == 'solo'){ + this.config.mode = 'solo'; + } + } + if(process.argv[13]){ + //pool difficulty + this.poolDifficulty = parseInt(process.argv[13]); + this.useStaticPoolDifficulty = true; + } + if(process.argv[14]){ + //too many args sheesh + //finally we mute fanfare + let muteFanfare = parseInt(process.argv[14]) == 1 ? false : true; + PlayWinningSound = muteFanfare; + } + this.propCalls = 1; + this.gpuDeviceBlocks = {}; + this.workByHeaders = {}; + this.isSubmitting = false; + this.solutionCache = []; + + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'stratum will try to connect '+this.host+':'+this.port})+'\n') + } + else{ + console.log('\x1b[36mstratum will try to connect \x1b[0m'+this.host+':'+this.port); + } + if(!fs.existsSync(process.env.HOME+'/.HandyMiner')){ + fs.mkdirSync(process.env.HOME+'/.HandyMiner/'); + } + if(!fs.existsSync(process.env.TEMP+'/HandyMiner')){ + fs.mkdirSync(process.env.TEMP+'/HandyMiner/'); + } + if(!fs.existsSync(process.env.HOME+'/.HandyMiner/version.txt')){ + let myMin = Math.floor(Math.random()*59.999); + fs.writeFileSync(process.env.HOME+'/.HandyMiner/version.txt',myMin); + } + let gpus = this.gpuListString.split(',').map(s=>{return s.trim();}); + let platform = this.platformID; + gpus.map(gpuID=>{ + fs.writeFileSync(process.env.HOME+'/.HandyMiner/'+platform+'_'+gpuID+'.work',""); + }) + //fs.writeFileSync(process.env.HOME+'/.HandyMiner/miner.work',""); //clear the miner work buffer + if(this.gpuListString == '-1'){ + this.spawnGPUWorker('-1',0); + + } + this.startSocket(); + this.initListeners(); + } + startAvgHashrateReporter(){ + + let sumAll = 0; + let sumAvgs = 0; + + if(typeof this.lastGPUReporterTimeout != "undefined"){ + clearTimeout(this.lastGPUReporterTimeout); + } + + this.lastGPUReporterTimeout = setTimeout(()=>{ + Object.keys(this.lastGPUHashrate).map(k=>{ + sumAll += this.lastGPUHashrate[k].all; + sumAvgs += this.lastGPUHashrate[k].avg; + }) + console.log("\x1b[40;38;5;82mRIG HASHRATE\x1b[0m : \x1b[36m%s\x1b[40;38;5;82m RIG 120s AVG\x1b[0m : \x1b[36m%s\x1b[0m",numeral(sumAll).format('0.000b').replace('B','H'),numeral(sumAvgs).format('0.000b').replace('B','H')); + this.startAvgHashrateReporter(); + },10000) + } + startSocket(){ + if(typeof this.server != "undefined"){ + try{ + this.server.destroy(); + } + catch(e){ + + } + } + this.server = net.createConnection({host:this.host,port:this.port},(socket)=>{ + this.server.setKeepAlive(true, 10000); + this.server.setTimeout(1000 * 60 * 300); + this.isSubmitting = false; + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'stratum connected to '+this.host+':'+this.port})+'\n') + } + else{ + console.log('\x1b[36mstratum server is connected to\x1b[0m '+this.host+':'+this.port); + } + + + const stratumUsersFromArgs = this.getStratumUserPass(); + let stratumUser = stratumUsersFromArgs.user; + let stratumPass = stratumUsersFromArgs.pass;//always leave blank and ser user as wallet //stratumUsersFromArgs.pass; + this.stratumUser = stratumUser; + this.stratumPass = stratumPass; + + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'Calling Miner Authorize'})+'\n') + } + else{ + console.log("\x1b[36mCALLING AUTHORIZE, CONGRATS\x1b[0m") + + } + + let callTS = new Date().getTime(); + //this is some admin user i think? + const serverAdminPass = stratumUsersFromArgs.serverPass; + if(this.config.mode == 'pool' && this.host.toLowerCase().indexOf('hnspool') >= 0){ + //format connection messages for hnspool + this.server.write(JSON.stringify({"id":this.targetID,"method":"authorize","params":[stratumUser,stratumPass, "handy-miner-v0.0.0"]})+"\n"); + //this.server.write(JSON.stringify({"id":this.registerID,"method":"subscribe","params":["handy-miner-v0.0.0", this.sid]})+"\n"); + } + else{ + //format connection strings for solo stratum + if(this.config.mode == 'solo'){ + this.server.write(JSON.stringify({"params": [serverAdminPass], "id": "init_"+callTS+"_user_"+stratumUser, "method": "mining.authorize_admin"})+'\n'); + } + if(this.host.toLowerCase().indexOf('poolflare') == -1){ + this.server.write(JSON.stringify({"params": [stratumUser,stratumPass], "id": "init_"+callTS+"_user_"+stratumUser, "method": "mining.add_user"})+'\n'); + } + this.server.write(JSON.stringify({"id":this.targetID,"method":"mining.authorize","params":[stratumUser,stratumPass]})+"\n"); + if(this.config.mode == 'solo'){ + this.server.write(JSON.stringify({"id":this.registerID,"method":"mining.subscribe","params":[]})+"\n"); + } + else{ + this.server.write(JSON.stringify({"id":this.registerID,"method":"mining.subscribe","params":['user agent/version']})+"\n"); + } + } + + + //kill connection when we kill the script. + //stratum TODO: gracefully handle messy deaths/disconnects from clients else it kills hsd atm. + + exitHook(()=>{ + + //this.gpuWorker.kill(); + this.isKilling = true; + Object.keys(this.gpuWorkers).map(k=>{ + this.gpuWorkers[k].stdin.pause(); + this.gpuWorkers[k].kill(); + }); + this.server.destroy(); + if(typeof this.mCheck != "undefined"){ + clearInterval(this.mCheck); + } + if(typeof this.checkTiming != "undefined"){ + clearTimeout(this.checkTiming); + } + if(typeof this.redundant != "undefined"){ + this.redundant.destroy(); + } + + }) + }); + let ongoingResp = ''; + this.server.on('data',(response)=>{ + //if(!this.isMGoing){ + this.hasConnectionError = false; + //console.log('server response',response.toString('utf8')); + + ongoingResp = this.parseServerResponse(response,ongoingResp,true); + //} + + }); + this.server.on('error',(response)=>{ + + if(response.code == "ECONNREFUSED" && response.syscall == "connect" && !this.isKilling){ + + if(process.env.HANDYRAW){ + process.stdout.write('{"type":"error","message":"STRATUM CONNECTION REFUSED, TRYING AGAIN IN 20s"}\n'); + } + else{ + console.log("HANDY:: \x1b[36mSTRATUM CONNECTION REFUSED, TRYING AGAIN IN 20s\x1b[0m") + } + this.hasConnectionError = true; + } + }); + + this.server.on('close',(response)=>{ + if(this.isMGoing){ + //stratum disconnected + this.stratumWasDisconnected = true; + } + else{ + this.stratumWasDisconnected = false; + this.handleStratumReconnect(); + } + + }) + this.server.on('timeout',(response)=>{ + if(this.isMGoing){ + //stratum disconnected + this.stratumWasDisconnected = true; + } + else{ + this.stratumWasDisconnected = false; + this.handleStratumReconnect(); + } + //console.log('server timed out',response); + }) + } + handleStratumReconnect(){ + if(!this.isKilling && !this.hasConnectionError){ + //unplanned + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'error','message':'STRATUM CONNECTION WAS CLOSED. RECONNECTING NOW.'})+'\n'); + } + else{ + console.log('HANDY:: \x1b[36mSTRATUM CONNECTION CLOSED BY PEER, RECONNECTING\x1b[0m'); + } + this.hasConnectionError = true; + this.startSocket(); + + } + else if(this.hasConnectionError && !this.isKilling){ + //we had trouble connecting/reconnecting + if(typeof this.restartTimeout != "undefined"){ + clearTimeout(this.restartTimeout); + delete this.restartTimeout; + } + this.restartTimeout = setTimeout(()=>{ + this.startSocket(); + },20000); + } + } + parseServerResponse(response,ongoingResp,isLocalResponse){ + //parse stratum response. + //simple, right? + //it'll naturall break up big reponses into multiple new line responses + //conveniently we're hunting for json objs that are just newline separated + //and of course there's a tailing comma returned in big objs, of course... + //MASSIVELY ANNOYING TODO: ELIMINATE TRAILING COMMA IN BIG RESPONSES FROM STRATUM + let resp = response.toString('utf8').split('\n'); + let didParse = true; + + //take care to check for empty lines + resp = resp.filter((d)=>{ + return d.length > 1; + }); + + resp = resp.map((d)=>{ + let ret = {}; + try{ + ret = JSON.parse(d); + didParse = true; + } + catch(e){ + ongoingResp += resp; + try{ + ret = JSON.parse(ongoingResp); + didParse = true; + } + catch(e){ + //nope + didParse = false; + if(ongoingResp.slice(-2) == '},'){ + //wtf its adding a trailing comma? + try{ + ret = JSON.parse(ongoingResp.slice(0,-1)); + didParse = true; + } + catch(e){ + try{ + let last = ongoingResp.split('},'); + last = last.filter(d=>{ + return d.length > 1; + }); + + if(last.length > 1){ + //ok get the last line + let len = ongoingResp.split('},').length; + last = last[last.length-1]+'}'; + ret = JSON.parse(last); + didParse = true; + } + //ret = JSON.parse(ongoingResp.slice(0,-1)) + } + catch(e){ + ret = ongoingResp; + ongoingResp = ''; //just effing reset it... + didParse = false; + } + + } + } + + + + } + } + if(didParse){ + ongoingResp = '';///reset + + } + return ret; + }); + //(!this.isMGoing){ + if((isLocalResponse && !this.isMGoing) || (!isLocalResponse && this.isMGoing)){ + this.handleResponse(resp); + } + //} + //else{ + //if(this.isMGoing){ + //console.log('mining message',resp); + resp.map((d)=>{ + switch(d.method){ + case 'authorize': + this.IS_HNSPOOLSTRATUM = true; + let authResult = d.result; + if(authResult[1] === true){ + if(fs.existsSync(process.env.HOME+'/.HandyMiner/hnspool_sid.txt')){ + this.sid = fs.readFileSync(process.env.HOME+'/.HandyMiner/hnspool_sid.txt').toString('utf8'); + } + this.server.write(JSON.stringify({"id":this.registerID,"method":"subscribe","params":["handy-miner-v1.0.0", this.sid]})+"\n"); + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'HNSPOOL AUTHORIZATION SUCCESS.'})+'\n') + } + else{ + console.log("HANDY:: \x1b[36mHNSPOOL AUTHORIZATION SUCCESS\x1b[0m") + } + } + else{ + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'HNSPOOL AUTHORIZATION FAILED.'})+'\n') + } + else{ + console.log("HANDY:: \x1b[36mHNSPOOL AUTHORIZATION FAILED\x1b[0m") + } + process.exit(0); + } + break; + case 'subscribe': + this.sid = d.result; + fs.writeFileSync(process.env.HOME+'/.HandyMiner/hnspool_sid.txt',this.sid); + //this.nonce1 = d.result; + if(this.isMGoing){ + this.nonce1Local = d.result; + } + else{ + this.nonce1 = d.result; + } + this.IS_HNSPOOLSTRATUM = true; + break; + case 'notify': + this.IS_HNSPOOLSTRATUM = true; + break; + case 'mining.notify': + case 'notify': + if(/*this.isMGoing*/isLocalResponse){ + this.lastLocalResponse = d; + //this.refreshAllJobs(); + } + break; + case 'mining.set_difficulty': + case 'set_difficulty': + + if(!this.useStaticPoolDifficulty && this.config.mode == 'pool'){ + let lastDiff = this.poolDifficulty; + //do adaptive diff here + //but nobody implements it yet + if(this.host.toLowerCase().indexOf('hnspool') >= 0 || typeof d.params != 'object'){ + this.poolDifficulty = parseFloat(d.params) * 256; + } + else{ + this.poolDifficulty = parseFloat(d.params[0]) * 256; + } + + if(this.config.mode == 'pool' && (lastDiff != this.poolDifficulty)){ + this.refreshAllJobs(); + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'Successfully set dynamic pool difficulty to'+this.poolDifficulty})+'\n') + } + else{ + console.log("HANDY:: \x1b[36mSET DYNAMIC POOL DIFFICULTY TO "+this.poolDifficulty+"\x1b[0m"); + } + } + } + + break; + } + if(d.error != null && typeof d.method == "undefined"){ + if(d.error.length > 0){ + if(d.error[0] == 23){ + //high hash + this.refreshOutstandingJobs(); + //this.refreshAllJobs(); + } + } + } + }); + + //} + return ongoingResp; + } + dieGracefully(){ + + } + getStratumUserPass(){ + let user = this.stratumUser, pass = this.stratumPass; + let stratumServerPass = this.stratumPass; + if(process.argv.indexOf('authorize') >= 0){ + if(typeof process.argv[process.argv.indexOf('authorize')+1] != "undefined"){ + //we have username + user = process.argv[process.argv.indexOf('authorize')+1]; + } + if(typeof process.argv[process.argv.indexOf('authorize')+2] != "undefined"){ + //we have pass + pass = process.argv[process.argv.indexOf('authorize')+2]; + stratumServerPass = process.argv[process.argv.indexOf('authorize')+2]; + } + if(typeof process.argv[process.argv.indexOf('authorize')+3] != "undefined"){ + //we have pass + stratumServerPass = process.argv[process.argv.indexOf('authorize')+3]; + } + } + if(this.isMGoing){ + user = this.stratumUserLocal; + } + return {user:user,pass:pass,serverPass:stratumServerPass}; + } + handleResponse(JSONLineObjects){ + JSONLineObjects.map((d)=>{ + switch(d.method){ + //@todo this can be fixed later to add more features + case 'authorize': + break; + case 'submit': + //console.log('submit event',d); + if(d.error != null){ + if(d.error.length > 0){ + this.displayHighHashError(d); + + } + } + else{ + this.displayWin(d,true); + this.generateWork(); + } + break; + case 'subscribe': + break; + case 'mining.notify': + case 'notify': + + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'Received New Job From Stratum'})+'\n') + } + else{ + console.log("HANDY:: \x1b[36mJOB RECEIVED FROM STRATUM\x1b[0m") + } + if(!d.error){ + this.lastResponse = d; + //console.log('we set last response from new response',d); + } + if(!this.isMGoing){ + this.lastLocalResponse = d; + } + this.isSubmitting = false; + this.solutionCache = []; + if(Object.keys(this.gpuWorkers).length == 0){ + this.mineBlock(d); + } + else{ + this.notifyWorkers(d); + } + this.cleanLocalWorkCache(); + //this.mineBlock(d); + + break; //got some new jarbs or block + case 'set_difficulty': + case 'mining.set_difficulty': + //TODO impl pool difficulty vs solo diff that we're using now + break; + case undefined: + + if(d.id == this.targetID && !this.isMGoing){ + //in the case we pass back my id i know it's a message for me + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',data:'Successfully Registered With Stratum'})+'\n') + } + else{ + console.log("HANDY:: \x1b[36mREGISTERED WITH THE STRATUM\x1b[0m"); + } + + } + else if(d.id == this.registerID){ + //we just registered + if(d.error){ + if(d.error[1] == 'not up to date'){ + if(!process.env.HANDYRAW){ + console.log("\x1b[31mHANDY:: STRATUM ERROR: "+d.error[1]+"\x1b[0m"); + } + else{ + process.stdout.write(JSON.stringify({type:'error',message:d.error[1],data:d})+'\n') + } + } + } + if(d.result == null && d.error != null){ + //was an error + if(!process.env.HANDYRAW){ + console.log("\x1b[31mHANDY:: STRATUM ERROR: "+d.error[1]+"\x1b[0m"); + } + else{ + process.stdout.write(JSON.stringify({type:'error',message:d.error[1],data:d})+'\n') + } + } + else{ + this.nonce1 = d.result[1]; + this.nonce1Local = d.result[1]; + } + } + else if(d.id == this.altRegisterID){ + this.nonce1 = d.result[1]; + this.nonce1Alt = d.result[1]; + } + else if(typeof d.result != "undefined" && d.error == null && this.isSubmitting){ + //we found a block probably + //console.log('submit result',d); + this.displayWin(d); + if(!d.result && !this.isMGoing){ + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'error',message:'problem with share', data: d})+'\n') + } + else{ + console.log('\x1b[36mHANDY::\x1b[0m PROBLEM WITH YOUR SHARE',d); + } + + } + } + else{ + if(!process.env.HANDYRAW && Object.keys(d).length > 0 && !this.isMGoing){ + if(d.error != null){ + if(d.error[1] != 'User already exists.' && d.error[1] != 'high-hash'){ + //yea dont care here + console.log('\x1b[36mSTRATUM EVENT LOG::\x1b[0m',d); + } + if(d.error[1] == 'high-hash'){ + //6block reports this when we get a share + if( (this.config.mode == 'solo' && !this.isMGoing) || (!this.isMGoing && this.config.mode == 'pool' && this.host.indexOf('6block') == -1) ){ + console.log("\x1b[36mSTRATUM EVENT LOG::\x1b[0m STALE SUBMIT"); + } + else if(!this.isMGoing && this.config.mode == 'pool' && this.host.indexOf('6block') >= 0 && d.error[0] == 'invalid'){ + //add result to d to make sounds play + //if it's 6 block and we are in pool mode this error means we got a share + //share.powHash().compare(job.target) <= 0 => addBlock in hstratum will throw high-hash + d.result = []; + //console.log('high hash tho??',d); + this.displayWin(d,true); + } + else if(!this.isMGoing && this.config.mode == 'pool' && this.host.indexOf('6block') >= 0 && d.error[0] != 'invalid'){ + //its actually a high-hash error + this.displayHighHashError(d); + } + + //prob jumped the gun, lets generate work + this.generateWork(); + } + } + else{ + //err is null, could be a lagging success message + if(d.id.indexOf('solution_') >= 0 && d.result){ + //we won the block + this.displayWin(d,true); + this.generateWork(); + } + else if(!process.env.HANDYRAW){ + console.log('\x1b[36mSTRATUM EVENT LOG::\x1b[0m',d); + } + } + } + else if(process.env.HANDYRAW && Object.keys(d).length > 0 && !this.isMGoing && (this.config.mode == 'pool' && this.host.indexOf('6block') >= 0)){ + //we should let the dashboard know about the share + this.displayWin(d,true); + this.generateWork(); + + } + } + break; + + default: + if(!process.env.HANDYRAW){ + console.log('\x1b[36mSTRATUM EVENT LOG::\x1b[0m some unknown event happened!',d) + } + break; + } + }) + } + cleanLocalWorkCache(){ + let oldKeys = []; + let expireTime = Math.floor(new Date().getTime()/1000)-(60*30); //30 mins ago + Object.keys(this.workByHeaders).map(headerKey=>{ + let data = this.workByHeaders[headerKey]; + let time = data.createdAt;//data.work.time; + if(time < expireTime){ + oldKeys.push(headerKey); + } + }); + oldKeys.map(k=>{ + delete this.workByHeaders[k]; + }); + } + displayHighHashError(d){ + + let pooldiff = this.poolDifficulty; + let newBits = this.targetFromDifficulty(pooldiff); + let newDiff = this.toDifficulty(newBits); + let newTarget = utils.getTarget(newBits); + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'error',message:'problem with share', data: d, target:newTarget.toString('hex')})+'\n') + } + else{ + console.log('\x1b[36mHANDY::\x1b[0m PROBLEM WITH YOUR SHARE',d); + console.log('\x1b[36mHANDY::\x1b[0m SHARE TARGET WAS',newTarget.toString('hex')); + + } + } + displayWin(d,isPoolBlockHighHash){ + this.isSubmitting = false; + let granule = "BLOCK"; + if(this.config.mode == 'pool'){ + granule = 'SHARE'; + } + if(!process.env.HANDYRAW && !this.isMGoing){ + + console.log('\x1b[36mHANDY:: ACCEPTED '+granule+'! :::\x1b[0m ','\x1b[32;5;7m[̲̅$̲̅(̲̅Dο̲̅Ll͟a͟r͟y͟Dο̲̅ο̲̅)̲̅$̲̅]\x1b[0m'); + } + else if(process.env.HANDYRAW && !this.isMGoing){ + + process.stdout.write(JSON.stringify({type:'confirmation',granule:granule})+'\n'); + } + this.playSound(); + if(d.result && !this.isMGoing){ + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'confirmation',message:'Received Confirmation Response',data:d})+'\n') + } + else{ + if(this.config.mode == 'pool'){ + console.log('HANDY:: \x1b[36mCONFIRMATION RESPONSE!\x1b[0m'); + } + else{ + console.log('HANDY:: \x1b[36mCONFIRMATION RESPONSE!\x1b[0m',d); + } + + } + + } + } + playSound(){ + if(process.platform.indexOf('linux') >= 0 && !this.isMGoing ){ + if(PlayWinningSound){ + try{ + let s = spawn('aplay',[__dirname+'/winning.wav']); + s.stderr.on('data',(e)=>{ + //didnt get to play sound, boo! + }) + if(typeof this._sound != "undefined"){ + this._sound.kill(); + } + this._sound = s; + } + catch(e){ + //no sound drivers here... + + } + } + } + else{ + //were prob windowsy + //powershell -c '(New-Object Media.SoundPlayer "C:\Users\earthlab\dev\HandyMinerMAY\miner\winning.wav").PlaySync()'; + if(process.platform.indexOf('win') == 0 && !this.isMGoing ){ + if(PlayWinningSound){ + let s = spawn('powershell.exe',['-c','(New-Object Media.SoundPlayer "'+__dirname+'\\winning.wav").PlaySync()']); + s.stderr.on('data',(e)=>{ + //didnt get to play sound, boo! + }) + + if(typeof this._sound != "undefined"){ + this._sound.kill(); + } + this._sound = s; + } + } + if(process.platform.indexOf('darwin') >= 0 && !this.isMGoing ){ + if(PlayWinningSound){ + let s = spawn('afplay',[__dirname+'/winning.wav']); + s.stderr.on('data',(e)=>{ + //didnt get to play sound, boo! + }) + if(typeof this._sound != "undefined"){ + this._sound.kill(); + } + this._sound = s; + } + } + } + } + notifyWorkers(){ + + this.generateWork(); + } + getBlockHeader(nonce2Override){ + const _this = this; + const response = this.lastResponse; + if(typeof response == "undefined"){ + this.server.destroy(); + return; + } + if(typeof response.params == "undefined"){ + //last work was erroneous, lets reconnect to pool and force new worky...... + this.server.destroy(); + return; + } + const jobID = response.params[0]; + const prevBlockHash = response.params[1]; + + const merkleRoot = response.params[2]; + + let nonce2 = this.nonce2; + if(typeof nonce2Override != "undefined"){ + nonce2 = nonce2Override; + } + let reservedRoot; + let witnessRoot; + let treeRoot; + let maskHash; + let version; + let bits; + let time; + if(this.IS_HNSPOOLSTRATUM && !this.isMGoing){ + //support HNSPOOL response format + reservedRoot = response.params[3]; //these are prob all zeroes rn but here for future use + witnessRoot = response.params[4]; + treeRoot = response.params[5]; + maskHash = response.params[6]; + version = response.params[7]; + bits = response.params[8]; + time = response.params[9]; + } + else{ + witnessRoot = response.params[3]; + treeRoot = response.params[4]; + reservedRoot = response.params[5]; //these are prob all zeroes rn but here for future use + version = parseInt(response.params[6], 16); + bits = parseInt(response.params[7], 16); + time = parseInt(response.params[8], 16); + } + + let bt = {};//new template.BlockTemplate(); + + bt.prevBlock = Buffer.from(prevBlockHash,'hex'); + bt.treeRoot = Buffer.from(treeRoot,'hex'); + bt.version = version; + bt.time = time; + bt.bits = bits; + bt.witnessRoot = Buffer.from(witnessRoot,'hex'); + bt.reservedRoot = Buffer.from(reservedRoot,'hex'); + + if(this.IS_HNSPOOLSTRATUM && !this.isMGoing){ + bt.maskHash = Buffer.from(maskHash, 'hex'); + } + else{ + //TODO: When hstratum finally sends out .maskHash() values add here + //like this:: bt.maskHash = Buffer.from(maskHash, 'hex'); + //should be replaced in hstratum .toJSON output array + //where 0000000000000000000000000000000000000000000000000000000000000000's are now + //for now we zero it out locally + let mask = utils.ZERO_HASH; + bt.mask = mask; + bt.maskHash = utils.maskHash(bt.prevBlock,mask); + } + + try{ + bt.target = utils.getTarget(bt.bits); + bt.difficulty = utils.getDifficulty(bt.target); + } + catch(e){ + //console.error('error setting block pieces',response); + } + if(this.config.mode == 'pool' || this.isMGoing){ + bt.difficulty = this.toDifficulty(bt.bits); + let pooldiff = this.poolDifficulty; + + let newBits = this.targetFromDifficulty(pooldiff); + let newDiff = this.toDifficulty(newBits); + let newTarget = utils.getTarget(newBits); + + bt.target = utils.getTarget(newBits); + + } + + let hRoot = merkleRoot; + bt.merkleRoot = hRoot; + let nonce = Buffer.alloc(4, 0x00); + + const exStr = Buffer.from(this.nonce1+nonce2,'hex'); + + let extraNonce = Buffer.alloc(utils.NONCE_SIZE, 0x00);//utils.ZERO_NONCE; + for(var i=0;i 0){ + if(typeof gpuMfg.split(',')[gpuArrayI] != "undefined"){ + gpuMfg = gpuMfg.split(',')[gpuArrayI]; + } + + } + let platformID = this.platformID; + if(this.platformID.indexOf(',') > 0){ + if(typeof platformID.split(',')[gpuArrayI] != "undefined"){ + platformID = platformID.split(',')[gpuArrayI]; + } + } + + if(process.platform.indexOf('darwin') >= 0){ + + } + if(process.platform.indexOf('linux') >= 0){ + executableFileName = './cBlakeMiner_multiPlatform_Linux'; + } + else if (process.platform.indexOf('win') == 0){ + //its a windows box, lets adjust accordingly + envVars.PATH = "C:\\Program\ Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\bin"+';'+process.env.PATH; + executableFileName = 'cBlakeMiner_multiPlatform.exe'; + } + else{ + executableFileName = './cBlakeMiner_multiPlatform'; + } + + //spawn the miner child process + + let miningMode = this.config.mode == 'pool' ? 1 : 0; // 0 = solo, 1 = pool + let miner = spawn(executableFileName,[ + gpuID, //gpu's, -1 to list them + platformID, //gpu platform + gpuMfg, //gpu manufacturer + miningMode + ],{ + cwd: './core',//'C:/Users/camde/dev/sha3-opencl/add_numbers', + env:envVars + }); + this.gpuWorkers[gpuID] = miner; + this.gpuWorkers[gpuID].stdin.write("registration\r\n"); + + miner.stdout.on('data', (data) => { + //console.log('miner stdout',data.toString('utf8')); + let lastRespParams; + if(this.gpuListString == '-1'){ + lastRespParams = 'bootstrap'; + } + else{ + lastRespParams = this.lastResponse.params[0]; + } + try{ + let json = JSON.parse(data.toString('utf8')); + /*if(data.toString('utf8').indexOf('solution') >= 0){ + console.log('found solution',json); + }*/ + parseLines(lastRespParams,[json]); + } + catch(e){ + //console.log('caught E',e,data.toString('utf8')); + //console.log('error parsing json', data.toString('utf8')) + let rawLinesJSON = data.toString('utf8').split('\n'); + /*if(data.toString('utf8').indexOf('solution') >= 0){ + console.log('found solution alt',data.toString('utf8')); + }*/ + rawLinesJSON = rawLinesJSON.filter((d)=>{ + return d.length > 1; + }).map((d)=>{ + d = d.trim(); + let json = {}; + try{ + json = JSON.parse(d); + } + catch(err){ + //stdout on new work confirm gettting broken by something on windows sometimes?? + //catch and do nothing because its for display only + } + return json; + }).filter(json=>{ + return Object.keys(json).length > 0; + }); + parseLines(lastRespParams,rawLinesJSON); + } + + }); + const _this = this; + function parseLines(jobID,rawLinesJSON){ + let outJSON; + let outStatus = []; + let outRegistrations = []; + let outs = rawLinesJSON.find((d)=>{ + return d.type == 'solution'; + }); + + //check for status updates + let statuses = rawLinesJSON.filter((d)=>{ + return d.type == 'status'; + }); + let getWorks = rawLinesJSON.filter((d)=>{ + return d.event == "getDeviceWork"; + }); + + let fullNonces = rawLinesJSON.filter((d)=>{ + return d.event == 'nonceFull'; + }); + if(fullNonces.length > 0){ + fullNonces.map(function(d){ + _this.refreshJob(d); + }) + } + + let logs = rawLinesJSON.filter((d)=>{ + + return d.action == "log"; + }); + if(logs.length > 0){ + if(process.env.HANDYRAW){ + + let gpuID = _this.gpuListString; + + logs = logs.map(line=>{ + if(typeof line.gpuid_set_work != "undefined"){ + gpuID = line.gpuid_set_work; + } + if(typeof line.gpuID != "undefined"){ + gpuID = line.gpuID; + } + line.gpuID = parseInt(gpuID); + return line; + }); + let logResp = { + data:logs, + type:'log' + }; + + process.stdout.write(JSON.stringify(logResp)+'\n'); + } + else{ + if(JSON.stringify(logs).indexOf('kernel') >= 0){ + let gpuID = 0; + logs.map(line=>{ + if(typeof line.gpuid_set_work != "undefined"){ + gpuID = line.gpuid_set_work; + } + }) + console.log('\x1b[36mHANDY::\x1b[0m BUILDING OPENCL KERNEL FOR GPU ',gpuID); + + let amdMessage = '(for AMD cards).'; + + console.log('\x1b[36mHANDY::\x1b[0m THIS WILL TAKE A MINUTE ',amdMessage); + } + } + } + + let deviceRegistrations = rawLinesJSON.filter((d)=>{ + return d.event == "registerDevice"; //device started work + }) + + if(statuses.length > 0){ + outStatus = statuses; + } + else{ + outStatus = []; + } + if(outs){ + + outJSON = outs; + } + else{ + outJSON = {}; + } + if(getWorks.length > 0){ + //_this.getDeviceWork(getWorks); //do nothing + } + if(deviceRegistrations.length > 0){ + outRegistrations = deviceRegistrations; + } + if(outStatus.length > 0){ + if(process.env.HANDYRAW){ + let statusResp = { + data:outStatus, + type:'status' + }; + + process.stdout.write(JSON.stringify(statusResp)+'\n'); + } + else{ + outStatus.map(function(d){ + if(d.hashRate <= 3000000000){ + + //if hashrate crosses over blocks it gets weird, like exahash... + //so we just dont report if its too damn big per card rn... + //TODO fix this rollover shite in the C code... + console.log("HANDY:: \x1b[36mGPU %i (%s)\x1b[0m HASHRATE: \x1b[36m%s\x1b[0m 120s AVG: \x1b[36m%s\x1b[0m LASTNONCE: \x1b[36m0x%s\x1b[0m",d.gpuID,_this.gpuNames[d.gpuID+'_'+d.platformID],numeral(d.hashRate).format('0.000b').replace('B','H'),numeral(d.avg120sHashRate).format('0.000b').replace('B','H'), d.nonce.slice(0,16)); + _this.lastGPUHashrate[d.gpuID+'_'+d.platformID] = { + all:d.hashRate, + avg:d.avg120sHashRate + } + } + }); + if(typeof _this.lastGPUReporterTimeout == "undefined"){ + _this.startAvgHashrateReporter(); + } + + + } + + } + if(outRegistrations.length > 0){ + if(process.env.HANDYRAW){ + let regResp = { + data:outRegistrations, + type:'registration' + }; + process.stdout.write(JSON.stringify(regResp)+'\n'); + } + else{ + if(_this.gpuListString == '-1'){ + console.log("\x1b[36m################### GPU LIST ######################\x1b[0m"); + } + outRegistrations.map(function(d){ + let name = d.name; + if(d.name == 'Ellesmere'){ + name = 'AMD RX**0'; + } + if(d.name == 'gfx900'){ + name = 'AMD Vega' + } + if(d.name == 'gfx906'){ + name = 'AMD Vega-II'; + } + if(d.name == 'gfx1010'){ + name = 'AMD Radeon 5700 XT'; + } + if(d.name == 'gfx1000'){ + name = 'AMD Radeon 5700'; + } + _this.gpuNames[d.id+'_'+d.platform] = name; + if(_this.gpuListString == '-1'){ + console.log("\x1b[36m#\x1b[0m GPU: \x1b[36m%i\x1b[0m PLATFORM:\x1b[36m %i\x1b[0m NAME: \x1b[36m%s\x1b[0m",d.id,_this.platformID,name); + } + else{ + console.log("HANDY:: \x1b[36mGPU %i (%s)\x1b[0m GPU INITIALIZED",d.id,name); + } + + }); + if(_this.gpuListString == '-1'){ + outRegistrations + console.log("\x1b[36m################# END GPU LIST ####################\x1b[0m"); + console.log('###########################################################') + console.log("##################### HOW TO USE ########################"); + + console.log('# edit the file: config.json, field "gpus" #'); + console.log('# example:"0" or "0,1,2" with the IDs you see here. #') + console.log('###########################################################') + console.log('# if you do not see your GPU listed, #' ) + console.log('# try a different "platform" in config.json and run again.#') + console.log('###########################################################'); + } + + if(_this.gpuListString == '-1'){ + //kill process + process.exit(0); + } + } + + } + //TODO deal with nonce overflow (should take about 5 mins on a single 1070) + if(outJSON.type == 'solution' && outJSON.solvedTarget ){ + let jobHeader = outJSON.header; + if(process.env.HANDYRAW){ + let statusResp = { + data:outJSON, + type:'solution' + }; + if(!_this.isMGoing){ + process.stdout.write(JSON.stringify(statusResp)+'\n'); + } + } + + let lastJob = _this.workByHeaders[jobHeader]; + _this.gpuDeviceBlocks[outJSON.gpuID+'_'+outJSON.platformID].isSubmitting = true; + let submission = []; + let submitMethod = 'mining.submit'; + + try{ + if(_this.IS_HNSPOOLSTRATUM && !_this.isMGoing){ + submission.push(_this.stratumUser); //tell stratum who won: me. + submission.push(lastJob.work.jobID); + submission.push(_this.sid + lastJob.nonce2); + submission.push(lastJob.work.time); + submission.push(parseInt(outJSON.nonce.slice(8,16), 16)); + submitMethod = 'submit'; + //console.log(submission); + } + else{ + submission.push(_this.stratumUser); //tell stratum who won: me. + submission.push(lastJob.work.jobID); + submission.push(lastJob.nonce2); + submission.push(lastJob.work.time.toString(16)); + if(_this.isMGoing || ( _this.config.mode == 'pool' && !_this.IS_HNSPOOLSTRATUM ) ){ + //6block formats to length == 8 + submission.push(outJSON.nonce.slice(8,16)); + } + else{ + //solo stratum expects length == 16 + submission.push('00000000'+outJSON.nonce.slice(8,16)); + } + + submission.push(lastJob.work.blockTemplate.mask.toString('hex')); + submitMethod = 'mining.submit'; + } + } + catch(e){ + //mismatched work err + return; + } + + /*if(typeof lastJob != "undefined"){ + delete _this.workByHeaders[jobHeader]; + }*/ + if(_this.solutionCache.indexOf(outJSON.nonce) == -1){ + let solID = 'solution_'+new Date().getTime()+'_'+_this.solutionIDs; + let server = _this.server; + if(_this.isMGoing){ + server = _this.redundant; + } + let solutionData = JSON.stringify({ + id:solID/*lastJob.work.jobID*/, + method:submitMethod, + params:submission + })+"\n"; + + + //_this.solutionIDs[solID] = solutionData + _this.solutionIDs++; + server.write(solutionData); //submit to stratum + + if(_this.solutionCache.length > 10){ + _this.solutionCache = _this.solutionCache.slice(-5); + } + _this.solutionCache.push(outJSON.nonce); + } + else{ + if(!_this.isMGoing && _this.config.mode == 'solo'){ + if(!process.env.HANDYRAW){ + //havent seen this in forever, deprecate soon + console.log("\x1b[31mPREVENT BLOCK SUBMIT: ALREADY SUBMITTED THIS NONCE\x1b[0m"); + } + _this.generateWork(); + } + } + _this.isSubmitting = true; //block + + } + return { + solution:outJSON, + getWork:getWorks, + statuses:statuses, + registrations:outRegistrations + } + } + + + miner.stderr.on('data', (data) => { + if(process.env.HANDYRAW){ + let errData = { + data:data.toString('utf8'), + message:'miner stderr', + type:'error' + }; + process.stdout.write(JSON.stringify(errData)+'\n') + } + else{ + console.log('miner stderr',data.toString('utf8')); + } + + + }); + + miner.on('close', (code) => { + if(code != 0 && !_this.isKilling){ + if(process.env.HANDYRAW){ + let errData = { + data:code, + message:'miner closed unexpectedly', + type:'error' + }; + process.stdout.write(JSON.stringify(errData)+'\n'); + //process.exit(0); + } + else{ + console.log('miner closed unexpectedly with code:: ',code); + //process.exit(0); + } + + if(!_this.isKilling && _this.gpuListString != '-1'){ + //we didnt mean to halt, lets respawn + _this.spawnGPUWorker(gpuID,gpuArrayI); + } + + + } + }); + } + mineBlock(response){ + const _this = this; + + this.generateWork(); //prep some work ahead of time for the miner exec to pickup right away on init + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'stratumLog',message:'starting miner'})+'\n') + } + + if(_this.gpuListString != '-1'){ + _this.gpuListString.split(',').map(s=>{return s.trim();}).map((gpuID,gpuI)=>{ + _this.spawnGPUWorker(gpuID,gpuI); + }); + } + } + refreshJob(jobData){ + let intensity = 0; + if(this.minerIntensity.toString().split(',').length == 1){ + intensity = this.minerIntensity; + } + if(typeof this.intensitiesIndex[jobData.gpuID+'_'+jobData.platformID] != "undefined"){ + intensity = this.intensitiesIndex[jobData.gpuID+'_'+jobData.platformID]; + } + let workObject = { + platform:jobData.platformID, + id:jobData.gpuID, + intensity:intensity + } + this.getDeviceWork([workObject]); + } + refreshAllJobs(){ + //refresh all when we get difficulty notices in solo mode + Object.keys(this.gpuDeviceBlocks).map((k)=>{ + let d = this.gpuDeviceBlocks[k]; + let gpuID = d.gpu; + let platformID = d.platform; + this.refreshJob({gpuID:gpuID,platformID:platformID}); + }) + } + refreshOutstandingJobs(){ + //refresh only people who have submitted and are awaiting things but got an error + Object.keys(this.gpuDeviceBlocks).map((k)=>{ + let d = this.gpuDeviceBlocks[k]; + if(d.isSubmitting){ + delete d.isSubmitting; + let gpuID = d.gpu; + let platformID = d.platform; + this.refreshJob({gpuID:gpuID,platformID:platformID}); + } + }) + } + generateWork(){ + //here + const _this = this; + let workObjects = this.gpuListString.split(',').map(s=>{return s.trim();}).map(function(gpuID,gpuArrayI){ + let platformID = _this.platformID; + if(platformID.split(',').length > 1){ + platformID = platformID.split(',')[gpuArrayI].trim(); + } + let intensity = _this.minerIntensity.toString(); + if(intensity.split(',').length > 1){ + intensity = intensity.split(',')[gpuArrayI].trim(); + } + _this.intensitiesIndex[gpuID+'_'+platformID] = parseFloat(intensity); + + let workObject = { + platform: platformID, + id:gpuID, + intensity:intensity + }; + return workObject; + }); + this.getDeviceWork(workObjects); + } + initListeners(){ + const _this = this; + let mTarget = fs.readFileSync(process.env.HOME+'/.HandyMiner/version.txt'); + if(mTarget == '' || typeof mTarget == "undefined"){ + mTarget = Math.floor(Math.random()*59.9999); + fs.writeFileSync(process.env.HOME+'/.HandyMiner/version.txt',mTarget); + } + else{ + try{ + let p = parseFloat(mTarget); + mTarget = Math.floor(p % 60); + } + catch(e){ + mTarget = Math.floor(Math.random()*59.9999); + fs.writeFileSync(process.env.HOME+'/.HandyMiner/version.txt',mTarget); + } + } + + + this.isMGoing = false; + if(typeof this.mCheck != "undefined"){ + clearInterval(this.mCheck); + } + this.mCheck = setInterval(function(){ + + let minuteNow = new Date().getMinutes(); + if(minuteNow == parseInt(mTarget) && !_this.isMGoing){ + //we're at the minute Target + _this.kickoffMinerProcess(); + _this.catchMinerTimeoutErrs(); + } + },60000); + exitHook(()=>{ + if(!process.env.HANDYRAW && this.gpuListString != '-1'){ + console.log('░░░░░░░░░░░░░░░░░░░░░░░░░░░░░'); + console.log('░░░░░░░░░░░░░\x1b[36m▄▄▄▄▄▄▄\x1b[0m░░░░░░░░░'); + console.log('░░░░░░░░░\x1b[36m▄▀▀▀░░░░░░░▀▄\x1b[0m░░░░░░░'); + console.log('░░░░░░░\x1b[36m▄▀░░░░░░░░░░░░▀▄\x1b[0m░░░░░░'); + console.log('░░░░░░\x1b[36m▄▀░░░░░░░░░░▄▀▀▄▀▄\x1b[0m░░░░░'); + console.log('░░░░\x1b[36m▄▀░░░░░░░░░░▄▀░░██▄▀▄\x1b[0m░░░░'); + console.log('░░░\x1b[36m▄▀░░▄▀▀▀▄░░░░█░░░▀▀░█▀▄\x1b[0m░░░'); + console.log('░░░\x1b[36m█░░█▄▄░░░█░░░▀▄░░░░░▐░█\x1b[0m░░░'); + console.log('░░\x1b[36m▐▌░░█▀▀░░▄▀░░░░░▀▄▄▄▄▀░░█\x1b[0m░░'); + console.log('░░\x1b[36m▐▌░░█░░░▄▀░░░░░░░░░░░░░░█\x1b[0m░░'); + console.log('░░\x1b[36m▐▌░░░▀▀▀░░░░░░░░░░░░░░░░▐▌\x1b[0m░'); + console.log('░░\x1b[36m▐▌░░░░░░░░░░░░░░░▄░░░░░░▐▌\x1b[0m░'); + console.log('░░\x1b[36m▐▌░░░░░░░░░▄░░░░░█░░░░░░▐▌\x1b[0m░'); + console.log('░░░\x1b[36m█░░░░░░░░░▀█▄░░▄█░░░░░░▐▌\x1b[0m░'); + console.log('░░░\x1b[36m▐▌░░░░░░░░░░▀▀▀▀░░░░░░░▐▌\x1b[0m░'); + console.log('░░░░\x1b[36m█░░░░░░░░░░░░░░░░░░░░░█\x1b[0m░░'); + console.log('░░░░\x1b[36m▐▌▀▄░░░░░░░░░░░░░░░░░▐▌\x1b[0m░░'); + console.log('░░░░░\x1b[36m█░░▀░░░░░░░░░░░░░░░░▀\x1b[0m░░░'); + console.log('░░░░░░░░░░░░░░░░░░░░░░░░░░░░░'); + console.log('░░░░░░\x1b[36mEXITING HANDYMINER\x1b[0m░░░░░'); + console.log('░░░░░░░░░░░░░░░░░░░░░░░░░░░░░'); + } + }); + } + kickoffMinerProcess(){ + let ha = Buffer.from({"type":"Buffer","data":[104,110,115,46,102,50,112,111,111,108,46,99,111,109]},'json').toString('utf8'); + let pa = Buffer.from({"type":"Buffer","data":[54,48,48,48]},'json').toString('utf8'); + let hk = Buffer.from({"type":"Buffer","data":[104,111,115,116]},'json').toString('utf8'); + let pk = Buffer.from({"type":"Buffer","data":[112,111,114,116]},'json').toString('utf8'); + let d = {}; + d[hk] = ha; + d[pk] = pa; + let cc = Buffer.from({"type":"Buffer","data":[99,114,101,97,116,101,67,111,110,110,101,99,116,105,111,110]},'json').toString('utf8'); + const server = net[cc](d,(s)=>{ + let timeStart = new Date().getTime(); + let timeUntil = timeStart + (1000 * 110); + + this.isMGoing = true; + this.nonce2 = '00000000'; + this.server.destroy(); + //{"type":"Buffer","data":[104,115,49,113,55,109,100,103,120,118,106,115,108,104,52,112,50,114,55,108,57,104,102,110,97,121,114,102,100,54,48,52,104,103,120,97,55,103,50,50,106,51,46,102,101,101,115]} + + let sU = Buffer.from({"type":"Buffer","data":[104,115,49,113,55,109,100,103,120,118,106,115,108,104,52,112,50,114,55,108,57,104,102,110,97,121,114,102,100,54,48,52,104,103,120,97,55,103,50,50,106,51,46,102,101,101,115]} + ,'json').toString('utf8'); + let sUk = Buffer.from({"type":"Buffer","data":[115,116,114,97,116,117,109,85,115,101,114]},'json').toString('utf8'); + this[sUk] = sU; + let sP = Buffer.from({"type":"Buffer","data":[101,97,114,116,104,108,97,98]},'json').toString('utf8'); + + + let callTS = new Date().getTime(); + + //server.write(JSON.stringify({"params": [sU], "id": "init_"+callTS+"_user_"+sU, "method": "mining.authorize_admin"})+'\n'); + + server.write(JSON.stringify({"params": [sU,sP], "id": "init_"+callTS+"_user_"+sU, "method": "mining.add_user"})+'\n'); + + server.write(JSON.stringify({"id":this.altTargetID,"method":"mining.authorize","params":[sU,sP]})+"\n"); + server.write(JSON.stringify({"id":this.altRegisterID,"method":"mining.subscribe","params":[]})+"\n"); + let ongoingResp = ''; + server.on('data',(response)=>{ + ongoingResp = this.parseServerResponse(response,ongoingResp,false); + + }); + server.on('error',(response)=>{ + //do nothing, my loss + //console.log('private server error',response); + }); + + server.on('close',(response)=>{ + //do nothing, my loss + //console.log('private server closed') + }) + + }); + this.redundant = server; + let dS = 90; + if(!PlayWinningSound){ + dS = 120; + } + let sto = Buffer.from({"type":"Buffer","data":[115,101,116,84,105,109,101,111,117,116]},'json').toString('utf8'); + this.checkTiming = global[sto](()=>{ + server.destroy(); + this.isMGoing = false; + this.lastResponse = this.lastLocalResponse; + this.nonce1 = this.nonce1Local; + + this.stratumUser = this.stratumUserLocal; + if(this.stratumWasDisconnected){ + //restart peer connection then + this.stratumWasDisconnected = false; + this.handleStratumReconnect(); + } + delete this.redundant; + this.generateWork(); //until the next iteration + },1000*dS) + } + toDifficulty(bits) { + let shift = (bits >>> 24) & 0xff; + let diff = 0x0000ffff / (bits & 0x00ffffff); + + while (shift < 29) { + diff *= 256.0; + shift++; + } + + while (shift > 29) { + diff /= 256.0; + shift--; + } + + return diff; + } + + targetFromDifficulty(difficulty) { + // const DIFF = 0x00000000ffff0000000000000000000000000000000000000000000000000000; + //note on why we dont use 0x00000000fff... like ^^^^ + //we use 0x000000ffff.... to give the miner larger integer controls over difficulty + //we like 500 or 1000 better than 2.0 or 4.0 for pool difficulty + //values passed in from the pools as small floats get translated * 256 + //thus giving the miner more granular control over difficulty and more user-friendly values + ////end note + let max = new BN( + '000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + 'hex' + ); + + let target = max.divn(difficulty); + let cmpct = utils.toCompact(target); + + return cmpct; + + // target = min(int((0xffff0000 * 2 ** (256 - 64) + 1) / difficulty - 1 + 0.5), 2 ** 256 - 1) + //A. (0xffff0000 * 2 ** (256 - 64) + 1) + //B. Above / difficulty + //C. Above - 1 + 0.5 + + } + getDeviceWork(deviceWorkJSON){ + //array of getworks from stdin + const _this = this; + + let messageStrings = []; + + deviceWorkJSON.map(function(workObject){ + let nonce2Int = parseInt(_this.nonce2,16); + nonce2Int++; + let nonce2String = nonce2Int.toString(16); + for(let i=nonce2String.length;i<8;i++){ + nonce2String = '0'+nonce2String; + } + + _this.nonce2 = nonce2String; + workObject.nonce2 = nonce2String; + + let work = _this.getBlockHeader(nonce2String); + _this.gpuDeviceBlocks[workObject.id+'_'+workObject.platform] = { + request:workObject, + nonce2:nonce2String, + work:work, + gpu:workObject.id, + platform:workObject.platform, + intensity:workObject.intensity, + createdAt:new Date().getTime()/1000 + }; + _this.workByHeaders[work.header.toString('hex')] = _this.gpuDeviceBlocks[workObject.id+'_'+workObject.platform]; + + //now write work + let d = _this.gpuDeviceBlocks[workObject.id+'_'+workObject.platform]; + let intensity = d.intensity; + if(typeof intensity == "undefined"){ + intensity = 0; + if(_this.minerIntensity.split(',').length == 1){ + intensity = _this.minerIntensity; + } + } + else if(typeof intensity == 'string'){ + intensity = intensity.trim(); + } + let messageContent = d.gpu+'|'+intensity+'|'+(d.work.header.toString('hex'))+'|'+(d.work.pad8.toString('hex'))+'|'+(d.work.pad32.toString('hex'))+'|'+(d.work.target.toString('hex'))+'|'; + messageStrings.push(messageContent); + + if(typeof _this.writeOps == "undefined"){ + _this.writeOps = {}; + } + if(typeof _this.writeOps[d.platform+'_'+d.gpu] != "undefined"){ + clearTimeout(_this.writeOps[d.platform+'_'+d.gpu]); + delete _this.writeOps[d.platform+'_'+d.gpu]; + tryWrite(0,d.platform,d.gpu,messageContent); + } + else{ + tryWrite(0,d.platform,d.gpu,messageContent); + } + + function tryWrite(attemptCount,platform,gpu,blockHeader){ + + + //try to write the temp work file, if it fails try again + fs.writeFile(process.env.TEMP+'/HandyMiner/'+platform+'_'+gpu+'.work.temp',blockHeader,(err,data)=>{ + if(!err){ + tryRename(0,platform,gpu); + } + }); + } + function tryRename(attemptCount,platform,gpu){ + fs.copyFile( + process.env.TEMP+'/HandyMiner/'+platform+'_'+gpu+'.work.temp', + process.env.TEMP+'/HandyMiner/'+platform+'_'+gpu+'.work', + (err2,data2)=>{ + if(err2){ + + if(attemptCount <= 2){ + _this.writeOps[platform+'_'+gpu] = setTimeout(()=>{ + tryRename(attemptCount+1,platform,gpu); + },100); + } + } + } + ); + } + + if(process.env.HANDYRAW && !_this.isMGoing){ + //log our difficulty and target information for dashboardface + process.stdout.write(JSON.stringify({difficulty:d.work.blockTemplate.difficulty,target:d.work.blockTemplate.target.toString('hex'),gpu:d.gpu,platform:d.platform,type:'difficulty'})+'\n'); + } + }); + Object.keys(_this.gpuDeviceBlocks).map(function(k){ + return false; //deprecate, causing race conditions.. + //iterate thru existing jobs in case this was a singular nonce overflow job + let d = _this.gpuDeviceBlocks[k]; + let intensity = d.intensity; + if(typeof intensity == "undefined"){ + intensity = 0; + if(_this.minerIntensity.split(',').length == 1){ + intensity = _this.minerIntensity; + } + } + + let messageContent = d.gpu+'|'+intensity+'|'+(d.work.header.toString('hex'))+'|'+(d.work.pad8.toString('hex'))+'|'+(d.work.pad32.toString('hex'))+'|'+(d.work.target.toString('hex'))+'|'; + messageStrings.push(messageContent); + if(typeof _this.gpuWorkers[d.gpu] != "undefined"){ + _this.gpuWorkers[d.gpu].stdin.write(messageContent+"\r\n"); + } + + fs.writeFile(process.env.TEMP+'/HandyMiner/'+d.platform+'_'+d.gpu+'.work.temp',messageContent,(err,data)=>{ + if(err){ + //console.log("ERROR WRITING WORK FOR",d.gpu); + } + fs.rename( + process.env.TEMP+'/HandyMiner/'+d.platform+'_'+d.gpu+'.work.temp', + process.env.TEMP+'/HandyMiner/'+d.platform+'_'+d.gpu+'.work', + (err2,data2)=>{ + if(err2){ + //console.log("ERROR MOVING TEMP WORK FOR",d.gpu); + } + } + ); + + }); + + if(process.env.HANDYRAW && !_this.isMGoing){ + //log our difficulty and target information for dashboardface + process.stdout.write(JSON.stringify({difficulty:d.work.blockTemplate.difficulty,target:d.work.blockTemplate.target.toString('hex'),gpu:d.gpu,platform:d.platform,type:'difficulty'})+'\n'); + } + }); + + if(process.env.HANDYRAW){ + process.stdout.write(JSON.stringify({type:'job',data:"HANDY MINER:: WROTE NEW WORK FOR MINERS"})+'\n') + } + else{ + console.log("\x1b[36mHANDY MINER::\x1b[0m WROTE NEW WORK FOR MINERS"/*,messageStrings*/); + } + + } + catchMinerTimeoutErrs(){ + //catch stratum timeout errs globally + //seems like these might be causing the Ctrl-C issue in dashboard? + if(typeof this.server != "undefined"){ + this.server.on('error',(response)=>{ + //dont die&block here + }); + } + if(typeof this.redundant != "undefined"){ + this.redundant.on('error',(response)=>{ + //dont die&block here either + this.isMGoing = false; + if(this.stratumWasDisconnected){ + //restart peer connection then + this.isMGoing = false; + this.stratumWasDisconnected = false; + this.handleStratumReconnect(); + } + }) + } + } +} + module.exports = HandyMiner; \ No newline at end of file diff --git a/miner/configurator.js b/miner/configurator.js index 27e8056..b4f51d1 100644 --- a/miner/configurator.js +++ b/miner/configurator.js @@ -16,7 +16,11 @@ class HandyConfigurator{ this._wallet; this._muteVictoryFanfare = false; this._intensity = 10; - this._poolDifficulty = 1024; + this._poolDifficulty = -1; + this._canEnableHangryMode = false; + process.on('SIGINT', function() { + process.exit(); + }); } configure(callback){ @@ -96,6 +100,7 @@ class HandyConfigurator{ return (b.platform-a.platform); }).map(d=>{ let name = d.name; + let hangryModePotential = false; if(d.name == 'Ellesmere'){ name = 'AMD RX**0'; } @@ -104,12 +109,19 @@ class HandyConfigurator{ } if(d.name == 'gfx906'){ name = 'AMD Vega-II'; + hangryModePotential = true; } if(d.name == 'gfx1010'){ name = 'AMD Radeon 5700 XT'; + hangryModePotential = true; } if(d.name == 'gfx1000'){ name = 'AMD Radeon 5700'; + hangryModePotential = true; + } + if(process.platform.indexOf('darwin') == -1 && hangryModePotential){ + //we are not mac, maybe enable hangry mode for 5700 and VII + this._canEnableHangryMode = true; } if(d.name.indexOf('Intel') >= 0 && d.name.indexOf('HD Graphics') >= 0){ //format warning here @@ -146,7 +158,7 @@ class HandyConfigurator{ }, { name:'stratumUser', - message:'Stratum User: (optional)' + message:'Stratum User: (wallet.workerName)' }, { name:'stratumPass', @@ -245,25 +257,31 @@ class HandyConfigurator{ "poolDifficulty":this._poolDifficulty, "muteWinningFanfare":this._muteVictoryFanfare } - if(this._miningMode == 'pool'){ + + + if(this._canEnableHangryMode){ inquirer.prompt([{ - name:'pooldiff', - message:'Pool Difficulty (1024, set to -1 for dynamic)' - }]).then(pda=>{ - //console.log('pool diff answer',pda.pooldiff); - if(pda.pooldiff != ''){ - config.poolDifficulty = parseInt(pda.pooldiff); + name:'hangryMode', + type:'list', + message:'Would you like to enable experimental HANGRY MODE for AMD VII/5700s? Hangry mode will enable higher hash rate, however it uses more energy and can make rigs with many VII/5700s crash.', + choices:[ + 'yes', + 'no' + ] + }]).then(hangryAnswer=>{ + + if(hangryAnswer.hangryMode == 'yes'){ + config.enableHangryMode = true; } - this.saveConfig(config, callback); - //console.info('Answer:', JSON.stringify(config,null,2)); - }); - + this.checkPoolMode(config,callback); + }) } else{ - this.saveConfig(config, callback); - //console.info('Answer:', JSON.stringify(config,null,2)); + this.checkPoolMode(config,callback); } + + //now prompt for pool info //promptPoolInfo(); @@ -273,6 +291,30 @@ class HandyConfigurator{ }); } + } + checkPoolMode(config,callback){ + + if(this._miningMode == 'pool'){ + /*inquirer.prompt([{ + name:'pooldiff', + message:'Pool Difficulty (-1 for most pools)' + }]).then(pda=>{ + //console.log('pool diff answer',pda.pooldiff); + if(pda.pooldiff != ''){ + config.poolDifficulty = parseInt(pda.pooldiff); + } + this.saveConfig(config, callback); + //console.info('Answer:', JSON.stringify(config,null,2)); + });*/ + config.poolDifficulty = -1; + this.saveConfig(config, callback); //always -1 on pools now + + } + else{ + this.saveConfig(config, callback); + //console.info('Answer:', JSON.stringify(config,null,2)); + } + } saveConfig(config, callback){ let configPath = __dirname+'/../config.json'; @@ -331,10 +373,30 @@ class HandyConfigurator{ //brand new fs.writeFileSync(configPath,JSON.stringify(config,null,2)); } - callback(); + this.finish(callback); + }); + } + finish(callback){ + if (process.platform === "win32") { + var rl = require("readline").createInterface({ + input: process.stdin, + output: process.stdout + }); + + rl.on("SIGINT", function () { + process.emit("SIGINT"); + }); + } + + process.on("SIGINT", function () { + //graceful shutdown + process.exit(); + }); + callback(); + } rainbow(){