From 09f568678052ee5a4b36648817dfd80d2b7ffd54 Mon Sep 17 00:00:00 2001 From: Chris Howey Date: Sat, 13 Feb 2021 13:37:57 -0600 Subject: [PATCH] initial commit --- 1f40a.png | Bin 0 -> 4285 bytes go.mod | 11 ++++ go.sum | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 325 insertions(+) create mode 100644 1f40a.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/1f40a.png b/1f40a.png new file mode 100644 index 0000000000000000000000000000000000000000..793b5560209f813645326ff0918db0586bb86877 GIT binary patch literal 4285 zcmV;u5JK;XP)PmdDFIYD`>X(6}T5wY~T1RlTZL1qcW(xPZ2bOWXmKq5uJrO=J8a>@~!BxMEy>)&_`??;8Uiw(>NU~ zJ@c$}3y({fb*gjb%G!!JA` zp;ronw{NHKw0ZjB7b;zzi&y`^+&=D%1S@#~x&2S+^A4>g>A92=g~4;_lV*cvp?#>P z)f}gN|M*ICg92VkCk4b&spfO*58YtFPj<5Z z`(>zWE$9?y|5uhMHBR4`p3*AdSUfP>%Av^PG!|Md!Jz2$+y)svdf0-GBbF8)P zW9@H~R}|5|nWS+!^qM4}&Mlsw4?Ir$pF-|UhK1cwCbV3WuOg7R2)KkT7Yt41?Q>8Pz64lV=RfvhlnTOC4m?F%wuT z%@XSDgAzh_$e2)RLKwXcr{8O*a1z`K`YpBIqQ>hzQpiS4j5@@k_#r2T+`-T zsUpZVcSFMHRtQ$Y{9`5pu{2T8f@3r^9gw*KChnABTVo-36aB1&0i+z2zK%I5!g)eO zSfz}R3JR%XA{HDGF?knxQ;8Y9)6{Rs06Um>JOOR7?+~)gFUdj(D6_zIQmVZR%bF$a z3M(&{llPe6Q_3yRfcfy`Iwg^CSc2x#03Ur^MDRv40b8)(sECL|B20xAjM{8Mvbgl>tps~VSm z)Dy5DFm}|$IOdZg-f!cy^A=fItuR-wjX5FJlJyDtu81TIQlbh%O*0&fRfi*QpkCdk4U~F0SVtE z^(BunuB4J#CSz8$SaYxCr|uFlqTIyb8!SJ(Oycmb6a4fl1Ey>@phvRxHsu6W(_&7% ze;=y<3R!LL096oHTh|Y^tOslMipSFV( zu+4xG>jh9gxbzfkoK%1EjCcE_S}}XSP&bDx-B-zDWDNPe5(PIw&>A6 zT>*1$W84<8n#MJxXCvMWiULdmZ{9wxkkMils?-=N? zw%Al)hP_0_$a0GLUG*_PZj*psORP=dH|yb7ETY$91sz=KHC~lk)N$G5jC; zwu`afXzx;g)y8H2h{d}uk1EGHQ+>j#G;r$&lH3bFVWS=)>kR0bq@d?wD=6`rTF{8? z@M|BdUiUAs)lFZoU|a#!`dBLi=dnJjOlpAlTP-1co1q!}_;NkMHs~>|*nn5kEMSSX z#ayYiciI0qdW{_sTWkm`QP7(j9kp1-kQ@a=*ECvwDwR6cc2BCf55BA(K5!L%KhB0h z88WE4ENl_{9pmh~gD`jU5t9u*X^J(r^3IK#^DMP{W55T<_V9(^K4J; zF0*_y_)xOE!!2MSf%i^UcoOW9$V=f2&5vM(kZ z4x>u6@N?_YC&>b8roPrB`g=T9__yAAtN4QtKKSDE&p)rbeEIU1^z}dG=H|B5xO{vE zr-W4=ID7Q=C!b!y)vH(Wvv=OEb#BV~A4+h0DITSJuGJLQ62G`uz3NzP=AB&tS$<%q zl{Gm{EN?3^k=1GH+aOT98=AoPOtxa=8hsP^5v#Q5o}l2>GztBZWtIp(d2CDCQ>RYp z7(9c^%gX~P07rlM<_(V}A^&D9P*8PlBfkCiTcoF_BOo9EpMCZjF8tywMwa=YW4wBs zz~83P^@^S>Jg$N!z-j?HdQS@Ab$(h^BmAUoMvUKVMArlxi~9$>PrsbGzNpbnbw`bAs?%t_?KN@mc=VPY-~d zzJ2?GejF!Hp2X#kKSbKmFhtNmV{j{w3M~wr%TQ+ZWeQV3qvffuAGtwN4WH#&IC8YmryF3&)UvMd!^hcw|2eHFEBIXu$s z2;FXKvc)<0<~H2Abqkj+T|z}g1!`()aPgft5qH>^O?6xe!^>rYwj#WWTzZGt1m1tG zgees7{iq5A5&Yx|!$aZ6tkofi>U}3Fc~Z8}03VR=jdm^-Ql_3ynL@f2ZJg@Ozi-<^ zyEoEe4E^E@gR|ATaogo)D=a1{CqnSX#nZTU?HX6ahadeKThF@d7a1h;4%AzIGQkhZ zvcR^=%vxIxAG%p!BQZf6slhQm5Y_$4Qm50cf?nO&qA{kpM$lFb$~ZE^V)rwRQ1i;To$f!KD=jlFM_A@BIy zJ6oJacsA9|zBA7UQV962mYLi0?k;qbk@fZuhF`C{2VRHnROSYz$p~1f!)xgxOMD#O zH^&Q(WnNI1dO}I}gno&ZDd1n4!xAWI{I>(h9l2y#Zw=0|K`2xZyvfXV`vfSVagFsT zc#@-RlOtgMVF6Kxghu%4X7Du8HOBn3I~`v51K`6N;VIeaF_apek(BBER_NisLWj+iFCFB)*VF0vxHPz!&zj>r7aJW@ukH`>J5p=NqRN@Fo^hv#Age|^y<^EFwsakE>J zTH74_Z-bw?UxGGU!E-SxOE~C6GPFo;0?(7(qu@6;gQwqPgf(A4$ZC4;)+31Edy@OV zyu=J~nE|h*id5=M=;*R>w>OdHJrX3CmJESsq7LnyHqd@jci-6Q<4N~;e>Z&OVG)73 zW^`LfwR(hvEKe^aOweIgwgGeZ-Uq+uhr|05Jac1Ht_U^X$m3qgF~YW72j5&Ro{v`; zJh$|~#R9Ap^OjUkNXedP7h}VKI0Li(e>8XhdBdKgPVCC7xmK`S-VvKABd=DVU#VbF zwhbOjZRnrLa|6|RD+Ee{fo0~~)AmX?W*?9+mbSH)bPHZ|`e1m%1gz9)krS%L!Y#%I zw|^M?^n2mA*27P{4?d)nT3hD!)ZhfK(qm+?mX|tRro^+oJ%_oy7rfI1=K3`h&UJE{ z7l)V0@?Hr%@u9m*Vy`6+yVjacrR^IMs++!b9b)}%4M+>S*(E;UQ-?e9+jcR&zf;{2 z*Iq~r{!`l+$9KIKk3t9f*)Gv`*fXbMQK&Df6a_!e$U^QUEuskgZ-nP_yicKsk)>1_ zsJ3^ARk`K6#9Prn)eL315kXYv4a@31!jM7pelmxk(h>u0C@kcg3;MdAD_p7>S84y>B0AgcPWgx}Ewz9Gxo3nX+; zvci9r5d$;K>^(1az7+FbOC?f-jh8udmVwpxniu0O4E_pVf0H~PXQ6Cw#A^vUc*Gge z!)3y&E-&W(w;p;Oe=%~}joPWRaeLx)d>WB6EHpB0JgjzD~worh~`0KW1I z!v9w8#MJ>__?>LWe{R{13j|+j^G0>`GB}S||1$i}2g8rqU;wSW;GHESl-|=&!`)t= zEy2faT~7xYSDaJvJ={PQj|C1MNOIc?;vR*-kR zp?TQxSm5U_iyBk+<>ZODo|1{Hd#mxy*opY`y?60`L@++sQ;4G_6R~|w5O(jJiGl(F zCF=sQsd5GqHX56ix<|oJc|gpMS!ZA#Ko+MNo+i5y)ZJ;9nIPnd_3&;j0#|s$KhK-T zJXxPBfx`B^rdRd0;dCXpj6VNoQcgMT0t>m&j`0zDIIGZ>l7wHz$S-CVkHv%vGa`>Z zw9fNO%BbdbzR7LPlq%tN(0ZwkHaRrjS}InP>X|a{bX% z=XF^U0jkhuO3mPXvb|uZCdZV{Yd%@mH{fwU`YMqY)9CdymB_CLWn0-jKfj*#DK%s0 zdKr#2W`0*^DKbNJTcFLSseo#IpsE22bKq{HyS2Fvr-c2J6h-ib1-)a3L{l%QRr!wYd{s_l-s zKlY`>Kz`*MtvdN*EA=p2nuyb0N^r~BGedm;Mo*29cr{x<%$B;cxMlPEAhNtE&s1l3 z3pH|{SmT)~)%HoYaLbEX0(|pzkg|;2^42UZI#Y)CpjzKANdm3Tpi9=(b&9c)l6?X- zE$Yy7K5U|7rHh2EtN19(;Du}v!wPh8WQkgT-VDnPE z$me_hsD4X2eA1+RhNT0ZwIG{=$$}emagY@zel_oGAZEY zMIs+<+0$k%@d4}IY-4L%AvS~eU!i5Ye4gBtEG?h#`m(ss;Jy9rL5W6mb}0=0Gq!td zskgoByDqZ9zt8~33L}U2$=5T>^F@Ydnh0^J;kG`_P&X)9#7hY#bcyBAOg^DJw1VFk zw%9`tQ+MJmt{p>`nrN9}f>(wJKN@FWUM$~jaF~2U@;=Evo?K&XM$J=kBK^8i#fWI* zQm^+-Hgi~EnUU63R`&iPSvZs$mjRlm{It1a-QSb^nk6`PXTU2&t2s2Ba9OB$kkvzY f&+zR0 ../mobile diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..56b2947 --- /dev/null +++ b/go.sum @@ -0,0 +1,155 @@ +fyne.io/fyne v1.4.3 h1:356CnXCiYrrfaLGsB7qLK3c6ktzyh8WR05v/2RBu51I= +fyne.io/fyne v1.4.3/go.mod h1:8kiPBNSDmuplxs9WnKCkaWYqbcXFy0DeAzwa6PBO9Z8= +fyne.io/fyne/v2 v2.0.0 h1:TfsS3bNq5663BpXsoz1OfzyjcaMqqOf9usI8ZKkw4IE= +fyne.io/fyne/v2 v2.0.0/go.mod h1:FmobqvPpBW+nG1nDyxZWf1SQLED9g/vXIxiIIVjHazY= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= +github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= +github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA= +github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fyne-io/mobile v0.1.2 h1:0HaXDtOOwyOTn3Umi0uKVCOgJtfX73c6unC4U8i5VZU= +github.com/fyne-io/mobile v0.1.2/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200625191551-73d3c3675aa3 h1:q521PfSp5/z6/sD9FZZOWj4d1MLmfQW8PkRnI9M6PCE= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200625191551-73d3c3675aa3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= +github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= +github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= +github.com/kalafut/imohash v1.0.0 h1:LgCJ+p/BwM2HKpOxFopkeddpzVCfm15EtXMroXD1SYE= +github.com/kalafut/imohash v1.0.0/go.mod h1:c3RHT80ZAp5C/aYgQI92ZlrOymqkZnRDprU87kg75HI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/schollz/cli/v2 v2.2.1/go.mod h1:My6bfphRLZUhZdlFUK8scAxMWHydE7k4s2ed2Dtnn+s= +github.com/schollz/croc v1.0.0 h1:JZ6wGwQzQ3etsrQ8muJ5pECzBqxHJ+NjMx4tMoUKWGk= +github.com/schollz/croc v3.0.6+incompatible h1:rCfc8MGgcGjNW2/qSoulPh8CRGH+Ej4i3RWYOwhX9pE= +github.com/schollz/croc/v8 v8.6.7 h1:f9bqaZF8WbYefNjibjaluBoodGHgI/X8YP1PDLeMNXo= +github.com/schollz/croc/v8 v8.6.7/go.mod h1:RuVVzLi6P1tnWXhcta7cfyITHHAavaWVOKZrhH4fCSE= +github.com/schollz/logger v1.2.0 h1:5WXfINRs3lEUTCZ7YXhj0uN+qukjizvITLm3Ca2m0Ho= +github.com/schollz/logger v1.2.0/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM= +github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU= +github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= +github.com/schollz/pake/v2 v2.0.6 h1:+x8vTmj4uPHe7TNBcCjcwDmm9uMeFIEqh34u+5a+CCY= +github.com/schollz/pake/v2 v2.0.6/go.mod h1:0NENjRsJxJQQ23Ei2fMSPo/mOtURNk/BWr3Cr9zpJ0w= +github.com/schollz/peerdiscovery v1.6.2 h1:EE1mnCuiQXbp8sG0z0qx9xkuU2Eho6LgcwD3LfnNIlQ= +github.com/schollz/peerdiscovery v1.6.2/go.mod h1:rvHXqW4PX4F14ehw8CLQSQFsb14YGLAeYYshxZV5fWE= +github.com/schollz/progressbar/v3 v3.7.2 h1:0mjLacO6y9vSdcopQ8TEK8AsIWFJXTVU9eJDkoR/MkE= +github.com/schollz/progressbar/v3 v3.7.2/go.mod h1:CG/f0JmacksUc6TkZToO7tVq4t03zIQSQUtTd7F9GR4= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM= +github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= +github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM= +github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tscholl2/siec v0.0.0-20191122224205-8da93652b094 h1:tZWtuLE+LbUwT4OP1oWBSB9zXA8qmQ5qEm4kV9R72oo= +github.com/tscholl2/siec v0.0.0-20191122224205-8da93652b094/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f h1:aEcjdTsycgPqO/caTgnxfR9xwWOltP/21vtJyFztEy0= +golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666 h1:gVCS+QOncANNPlmlO1AhlU3oxs4V9z+gTtPwIk3p2N8= +golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201113135734-0a15ea8d9b02/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201223074533-0d417f636930 h1:vRgIt+nup/B/BwIS0g2oC0haq0iqbV3ZA+u6+0TlNCo= +golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03 h1:XpToik3MpT5iW3iHgNwnh3a8QwugfomvxOlyDnaOils= +golang.org/x/tools v0.0.0-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/tylerb/is.v1 v1.1.2/go.mod h1:9yQB2tyIhZ5oph6Kk5Sq7cJMd9c5Jpa1p3hr9kxzPqo= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..0eafa21 --- /dev/null +++ b/main.go @@ -0,0 +1,159 @@ +package main + +import ( + "fmt" + "log" + "os" + "path/filepath" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/app" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/dialog" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" + "github.com/schollz/croc/v8/src/croc" + "github.com/schollz/croc/v8/src/utils" +) + +func sendTabItem(w fyne.Window) *container.TabItem { + status := widget.NewLabel("") + prog := widget.NewProgressBar() + prog.Hide() + topline := widget.NewLabel("Pick a file to send") + return container.NewTabItemWithIcon("Send", theme.MailSendIcon(), + container.NewVBox( + topline, + widget.NewButtonWithIcon("File", theme.FileIcon(), func() { + dialog.ShowFileOpen(func(f fyne.URIReadCloser, e error) { + if e != nil { + return + } + randomName := utils.GetRandomName() + sender, err := croc.New(croc.Options{ + IsSender: true, + SharedSecret: randomName, + Debug: false, + RelayAddress: "10.0.1.1:9009", + RelayPorts: []string{"9009", "9010", "9011", "9012", "9013"}, + RelayPassword: "pass123", + Stdout: false, + NoPrompt: true, + DisableLocal: true, + }) + var filename string + if err != nil { + log.Println(err) + } else if f != nil { + status.SetText("Receive Code: " + randomName) + fi, _ := os.Stat(f.URI().Path()) + filename = filepath.Base(fi.Name()) + topline.SetText(fmt.Sprintf("Sending file: %s", filename)) + totalsize := fi.Size() + prog.Max = float64(totalsize) + prog.Show() + donechan := make(chan bool) + go func() { + ticker := time.NewTicker(time.Millisecond * 100) + for { + select { + case <-ticker.C: + prog.SetValue(float64(sender.TotalSent)) + case <-donechan: + ticker.Stop() + return + } + } + }() + serr := sender.Send(croc.TransferOptions{ + PathToFiles: []string{f.URI().Path()}, + }) + donechan <- true + prog.Hide() + prog.SetValue(0) + topline.SetText("Pick a file to send") + if serr != nil { + log.Println("Send failed:", serr) + } else { + status.SetText(fmt.Sprintf("Sent file %s", filename)) + } + } + }, w) + }), + prog, + status, + )) +} + +func recvTabItem() *container.TabItem { + status := widget.NewLabel("") + prog := widget.NewProgressBar() + prog.Hide() + recvEntry := widget.NewEntry() + topline := widget.NewLabel("Enter code to download") + return container.NewTabItemWithIcon("Receive", theme.DownloadIcon(), + container.NewVBox( + topline, + widget.NewForm(&widget.FormItem{Text: "Receive Code", Widget: recvEntry}), + widget.NewButtonWithIcon("Download", theme.DownloadIcon(), func() { + receiver, err := croc.New(croc.Options{ + IsSender: false, + SharedSecret: recvEntry.Text, + Debug: false, + RelayAddress: "10.0.1.1:9009", + RelayPassword: "pass123", + Stdout: false, + NoPrompt: true, + DisableLocal: true, + }) + if err != nil { + log.Println("Receive setup error:", err) + } + prog.Show() + donechan := make(chan bool) + var filename string + go func() { + ticker := time.NewTicker(time.Millisecond * 100) + for { + gotInfo := false + select { + case <-ticker.C: + if !gotInfo && receiver.Step2FileInfoTransfered { + gotInfo = true + fi := receiver.FilesToTransfer[0] + filename = filepath.Base(fi.Name) + topline.SetText(fmt.Sprintf("Receiving file: %s", filename)) + prog.Max = float64(fi.Size) + } + prog.SetValue(float64(receiver.TotalSent)) + case <-donechan: + ticker.Stop() + return + } + } + }() + rerr := receiver.Receive() + donechan <- true + prog.Hide() + prog.SetValue(0) + topline.SetText("Enter code to download") + if rerr != nil { + status.Text = "Receive failed: " + rerr.Error() + } else { + status.Text = fmt.Sprintf("Received file %s", filename) + } + }), + prog, + status, + )) + +} + +func main() { + a := app.NewWithID("com.github.howeyc.crocgui") + w := a.NewWindow("croc") + + w.SetContent(container.NewAppTabs(sendTabItem(w), recvTabItem())) + w.ShowAndRun() +}