From 5e52265a3b21194618b37ee8dae71649757c4260 Mon Sep 17 00:00:00 2001 From: howard Date: Mon, 19 Apr 2021 18:11:28 -0700 Subject: [PATCH] conditionally remove stats and logger for production --- dist/favicon.ico | Bin 24838 -> 24838 bytes dist/icon-192.png | Bin 9588 -> 4965 bytes dist/icon-512.png | Bin 26842 -> 14298 bytes icon/icon-16.png | Bin 761 -> 569 bytes icon/icon-24.png | Bin 1109 -> 793 bytes icon/icon-32.png | Bin 1618 -> 1014 bytes icon/icon-64.png | Bin 3125 -> 1791 bytes icon/icon-text.svg | 98 ++++++++++++++++++++++++++++ icon/icon2.svg | 83 ++++++++++++++++++++++++ icon/icon_text.svg | 124 ++++++++++++++++++++++++++++++++++++ icon/svg-to-favicon | 10 +-- icon/svgr_raw/icon_text.svg | 124 ++++++++++++++++++++++++++++++++++++ icon/svgr_raw/logo.svg | 83 ++++++++++++++++++++++++ lib/stats.module.js | 2 +- src/Scene.js | 37 +++++++---- src/Sketch.js | 1 - src/react/app.css | 53 +++++---------- src/react/app.jsx | 1 - src/react/dialog.jsx | 116 +++++++++++++++++---------------- src/react/dropDown.jsx | 75 ++++++++++++++++++++++ src/react/fileHelpers.js | 2 - src/react/icons.jsx | 52 ++++++++++++++- src/react/navBar.jsx | 65 +++++++++++-------- src/react/toolTip copy.jsx | 78 +++++++++++++++++++++++ src/react/toolTip.jsx | 11 ++-- src/react/tree.jsx | 9 ++- tailwind.config.js | 1 + 27 files changed, 874 insertions(+), 151 deletions(-) create mode 100644 icon/icon-text.svg create mode 100644 icon/icon2.svg create mode 100644 icon/icon_text.svg create mode 100644 icon/svgr_raw/icon_text.svg create mode 100644 icon/svgr_raw/logo.svg create mode 100644 src/react/dropDown.jsx create mode 100644 src/react/toolTip copy.jsx diff --git a/dist/favicon.ico b/dist/favicon.ico index 08af65799a48df31725ea2d0b7b4d86a62cd63c2..30805fed05522f24e27646fe88d7e5972e171529 100644 GIT binary patch literal 24838 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 U>c=$z7P@wvYT%&k+^YZmAEA5E9RL6T literal 24838 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 diff --git a/dist/icon-192.png b/dist/icon-192.png index d4e41799dffc651012f5832a8509ea88f9d0504e..017a82d494b9af0d5079fe3ba269d911de4ed4dd 100644 GIT binary patch literal 4965 zcmcJTXHZjJx5rQD%>qbKdQn7rM>^7lP(`FSX$ehALMI3!y$A?|sv-y|DorJnNEO5c z1qp>5p~ zbo|fJ#pkopcu@sV8U2W!_R>t~O`3cGyrGFJ)IAvI=d;Ki01Na z;G_4ivu3dB&93&cf&dY;%GQiraOQJ!;~L1q<7w;!_6lpE^sI8RMnH)W+37!o5r@-&|Hi87Ig_# zxfWzkSkfRPpZR;Ikzdk-EcvF&MaBEvSHNk4pun-`C0t)=B>Sh%jqU;0Lm{X^L$GT} znB0$TgQ{jxVF2T54h{%zvm6aVc(Hr($#)M1m=y6I>K(1H#Z!+PpbY_TbKF!=ydOb1 z&OgLGb}%GuJmy(#i;oE1O0Pz09+eBrpIwdM_n4=Wl-|rqj%N+`T{L}E$1mG%WlS7N zva=xQ>Aac~DmT60^@~SI=AI#(G?dCxdeBx48KTWOrG!wto3b9A{oQC=Rt`2>q&EsDVNjC)OB z)xw4~n=5d{y~5I^C}t}&Nu|ja)Z(uTCfMH|EC`v&ulBF^8czWdTOnHyj>*M<5`U<_6}>Ab&^njh(9C#-7QA-;K{z zl-Ws>wn4w2#K%6f)zqD>u3QqmQ3b(82`E;)g&t3CE1QZUfwYla>tcj47;8Ciida_Q zoj<#th;Le>lQZtF~@9!b)2bwa+H*bZ9=v3Ih0d9=ohNNOY=# zl=T<_d-`j8l(E$OW;cdV`=!!+NtKuVh)1RmMDQQIR2CF0O!nYJz#S_b$xoV zPwLCj4IsS!QVMP#o_xuf{5pG=EM_nD{(%aB5P$5g%Pf(zd<4w*Km1rHTJtCUYM<>-o3g;=tB!qtlxp*i?Dwe15NU4Zl=RV8&yor_2~N-Wv^49me_hcu-<)e9G^^ zeY{ug#(&8QikCo~+uJLv4rpECy*Mb~cY9%ZeCOU!SAPT8cI-_V9wrxtgs=``1F0Lm{W?;EN6iM)H3_H9 zbBl>5roJ6nQjh9>RFtLcUQ5%IFq|0+yM)eZYD*?T3uEpZKa3mJ{_W@$?{kx?VkfZs3ry1ZM=nmLR?E!?Cla2TGQz(lT?~{P>RyQ3 z)N`h+31->Ho-gf6%dKCzf1~wKXt-fy=Y!sKmzPXWRFgeCOY*E|D{pYW4?n%rt148u zjt2on>>)}4Skb1GFRc+*1q`gexh- zFKFqvAJ31fqYE};1)P@C%jz5_cH_-IqUXg;-O<;2VbDKAi~-p2ZN`Q!lU3qd(`ic1 z3tGJK(^vgI!1R%aB}kv=?5ofsn5>Oj6V&Zb|3acY9H+MO<*`AI#fJ|IG?4{dhQAV% z{kt-iJ}>FcLZ6LbA(5=T9jYzFO6xw5F!YE;RV#^E$QSa|$dx;;zSPXR2Uf^?wSy`H z|Li2Yn@Gd#0N6m@25^$yxWgjmmM1Dcns9qrG}=jcUkrD8U-VkCId zFGsH&f72UkwHDf(CzNPiO*z2)+GH$(9@?LB`@+7z#(V53wh#A=Td{OpE`Z|85C9v0JT;*L1!0QMalG_8k7UI~tH~$sFEj$Fqv?AgsqACQP zmQgnbM@;S9_3=qd7GrpS^1PK^L*$z0vQnsIqbvN|?YUIqXy}JY7kd@caxO6Dvq@h8 ziKErr>NIEC%jvsALZyf*8l)dFxPJU23(=-+s@7idEOxomWSXUwpyznorpgrKrO6QS3+Ki(_w} zIYZKwI)`96AvU*2Kb0RJtD|=rUeLxiqCTxowVNReNy<^Mb;=kO%Hm{cPYypJ3O%jlq_a_dKQ&zY+8TM*sOD^idEZ_Fd?i=b^+aHH z{sXlANIf_GCCSFqKp!=*_%Xpe08T4(?Ee`G^tEp!=fYdnoq%O!e|rK91DBdj<)RK~fK-^jIM+vExRP)5g)b)HaS1&h0N{V9HwfRf z5J%3;Kw4o_H$PO*IZZ#&Xu|KryO>Z9VY*rccobR(@YTpo#FbNKWzGPC=pW^ZnNjuW%5mv2_0byhEZ!`1ArjD2FR78b8HPR$(0X$93FQmO09x=N zyant}?*MF))i5z*WLH>i=ZE44vM7H&eWEZ!d#ex!8Svk5Wb1Slu)L?{;B@+W_ zOh~Y~66+*Iep7w2pse@wPilX!|z!EIka{85HStj+=Hyck0 zHcE4`j&&@UBJi}m#_>YeaaFU|KhpT?2W?`XZ409cJvwY2iW5NckpjjcEwFP@)>e0s zd=&TYqIg9<(H7AC4w9DA)F7feFhu(RUyCVZ`~96rrRc+4H>Xtkm?i$@c_wLks`eig zCsuxI5jId<6?9;TaiJeGPX^)HyQITfq^uN8cKn%~WY1z`66zeWbN3%+sa2)RQXd{=_6418r_CtTnP9etZ`R(2R?H4(C+H%@9G zw+uu5mZA@N*P(381|@h{R^ENK_g63TSMsXW$Um^so*(R)$(m7Um%U=XpV^?YlHLuk_8QQNmKVt4lz8ufrRQPz^(96U1 z?{~Zq-<@7wRYc%8R-sVMe{F()YtI-bQ~6Z04i~D{ChG3;6q`H{j`Ft)<<<&{SxY<{ zEly_@Sm}*<)bXx2Mod?NM@eY~PNpp?ektp=O-Dd8`LAbr`J2k&&*JGLFP@)v9b?v0 zjjU8QYy0UA86gSCG{LmP0xy4w%e7RVj8mQU+<}1Mzn6HryGFOY$uAwOv{y%-pZ&Chh>#U zC5zb9jQ==|P(-5zJb#W_^OzNtE;zJ?(#t1?gt|L>Ss#<(whFyJxvl2LWJ0NXcN5I@$+^OFv^2RCD!2E)neVhyLsEoqT6{%yQ?S2I@Ah?n29tk&2synN@$&TofR$IzF&b2^ z%iXzMvpMv(b#x>|XO@C2I)NNWm^l8^#F z>Q(~M%kL8XCmh>ahPTC?EJiZ5`)X@%OshuD4ED)?S1C_|;7lm_@$#hQVgr~>|7T5P zF$lB%=Lz{R&XCA@H&s4YWmdnHc05Z*P-T(jq literal 9588 zcmZXaWmr^S)b`IvBQ=V2cS%W0GoW;bbiv!*1EsYn1_*D1+01zs_gz13qo%b(XZ1AtnybBKa zhUfnBl@|c`(A>Wuh24HT;D?mnibmeLaC>iGD^EMX*VmW#KR0JD8!LA^Ubv@2=7A&? z05AZ`FgZQHto`f&Q@z)>cNT}@JqRX>MJ&GJmrZfxKUx~ib&S;&^^~GlkRM%Lmu44? z%gguE7IaMUM0P?kMq?#;P;YVlEHkuA=oLt<%PZZ z*YDDA`$yKr7FO`0m-N=nn~+6#IJGi==8$Wxu`8c8X@Ij(#v<%jg1{u6YydzDcrzd; z5dt~iRlR{(z1uciS#f}5Oc-s17s?G(kc>S6(kN{l6t#a$I0`lSwA|=-W%I*hR#|Il4zcmbAAECPdQ70E7V&oID#$p*FxfLG(K(p^TnzhCnz!g$n89%FjmH zTsrUy!r5WQR~^VbWa8 zSPvC2C>wLEk3**Kt*oGiE%{Bi%40>JPC{HnG7S|K6*-_o7$gtQc%9dg1fBLwDkVil zMpHWUB_>%IEG#Sp3`h?2G}Am{v=QP)qK)K;yA%1OcJ(G+JBe%s5Xmfm4gLgasLZ1= ztwn#m;b5kJ`L(q|6|9ncLe4lH_`)UvzcX!JFFuT_*1tm>&H;39sDt-iRYmcPJ}jypt#IvmH9@ZDGD3S47IPY zMfn~1IwGx4?MFTvycN{skpg5}D=WwB5nWpSCaUU1KOv7EKMrA!TcrYS{G2_Q@%m_q z`u2*7iXOK{&c{YIgg!?Zmp@a~p2xaahijaYV_H>CIAsr-^k)}s5?R*FU`F>Gv)Q=d z>E)|Bsi>+R5At>7=H>#uy}baSsj2A~5Rm6E^4W2s#n@uCcj)-WWkY#;b zUX2WY(n+vroF63+mCUYbJyl^Q=DCi0a&ppXGz67r3a_l>!zQG9JC^q%55CmSpwkx$n1)Qz!{63+y;4%q{dMTKZ{K92dr*ln{wKc}g>i`K-u7Dmclxd4v5bri zOi9VQ{{v&vv@WzzQ9Fx_lJZSf8sJ7`S!Wy#=EoPx-itpcCnWUr?;~)Czgx@j^OI<6 zYj2O`Mf04Cd#IE47AGbqw!9%2?!Ax2!&nYlSrfW7RdsD`=wzkEd%lkAM?NjBv5Daf zme-fZ>7sDD*0we~T2(oG$Xg{C%thbdvX_>Dk#U6>m;@ZlPp5U(+{LPbu6(9lMCKbk z6vj|(t*!h4=PqiW1hK*yI3((6_|b8YA7Bz?exxzf#wp6Wb{->8`9SmBhrq+bL(D7c zkh9DFJW%WFn4|r0j!a0r4hGjIaD04h1L}hPwE@W_t9Zz*WKvR6mBR?#qD~2vl=SWP zwxjp&pOFnIUv(Z>I>BJyd|0t{zd_0jc3+~6uz@tQS~7BSn}z1r)3yIS22;{+uox;w z!f*GT^lfx>-fQPHbE`!XMGsGK&CQ!|k{0fx4MS1;8e8^xQ(qDWnxeY8`oo70p}SLN zc}ckq4WixM-6W45t$x44F;vv1VfT&EGr%dDU!TQVHW%+pj9=?}&&l2{VFC1lR+8#(bFfcHUvcZ9K zCXs*>!+J=TtIM8NMqRb!*6=>9)Tfx|_*v!<8z_7Q57IfJgPJ(FxqF&l?^ZcYaIJ4{ zo}@BUZjI#hO_rNz>*$1sh60Xt#*0Z*;W-Sr7}!KKj&t>{nd^N#b{?TsRaFfTo|K+? z8olyAOF zKnn(}Oo%i-OXAhcAi$(JNkwu5{X3OYQzLlr;DMj22N^blBoh;pzDiz_#?Qva#w#qj zOCsJ6tL|qz`Yf!hjNII%lc(#OL{LUCF$$$TsI;{7nMG&Lg9N2#p10S3WnS883EnHH zxlcDYadl2WFSSKuEtjDTKfG(^B_^Q zjh3FCp1CeUXa@4=(IXK#yC-wszkjc?8zch-;Y+QanOU&^>3LsFM_cTq&8^n{S#{7{ z6}a&^Y>=_$<7k>jgIb_x0>f)89`I=8qmHgQ>bd3l1+kxXj^Cn6fL(1}vR zwV$l7CmhdC&e7@H?4y4Zw;<|6k7LDY8tXS7+XkHyRamrqt?F(*K08yiwPgtp5BF0o z#)f`EDA~y8Rl@fo@$m3yAvDn{J11M4o82xVYv1r*PnbW#gfJJ5C>=VaMa)V}r6fIh zvb@J$$;f@|HLaiehKhnB<~|t@7qc5uxOhPwy-g@rSs=x!dXT;}y<5N}BSR0aegBUi zdJ|MszyZA^se-v5Io%D_RQk``KNpuPZE5ae&Y88{88P_p?J}5|n5?P1tnz4btHmRc zFQyK@xizenR<_G~dJ3wjsQ9Tg#a9F`@bB=ct_ZW5J__hva_RKtz6-O^%t`w8Sx=94 zP)~XGEFwW%cis{Qyz8&cjSX5%lIci|gdcqyqEML}u3Mr z&DfS3#1AC1|B*<2qhC6KO+gSFmd>RnlZE?Jk*!#ORDCWCKULkStt*;NqYiqdoTkPYH8ZG8fC=~T=hWL4T*@>SG z5oyU*O~_p^_?@-x$cHKfTSA{df2JU>!_B7q`#e|o1*?OBdE7(P;j+n}J`U{}^2m-3 z8Eb3n(FV9hK@<-ovVFMT!SkQ2nxEgLCtySMbWk}iJ|5+N<^rIPi@92&vx(TO}T~2SXe}{%H#{u3TRSy3ExRg2l`BQb)(5mH|4T z77U`ytiM&dzCh;CbocnV^p&hI zbrh&*d~K&mWg}P!lr>YcC=(NMxQG615mIZsulvE{!~(q6Ve6lFTx>E>tLc1_w}tz1 z7Y>Gvx9d278Mk-v9_!nJ1N0~ky-u&(Wp%Y+nQ4>GWP~zoeSjjMdU0gp%-+Stg}co> z1V5Aqi=EQO@8)buABB2d83IJ{y?I!!q_+7~(cn9=oz>EF)uTVe^Zq*XtL;|@J=~S8 zOoh7UzntpY2(T5(8`>of0f}s0Dna#NV7m3qvx|YHilBfWmsf&_n*IOIlj#9(g>Zq% zlc!(XYH9Xo|48+uWM?NJ5Cr1U+b#`r>aT-x+gV5HSxI#he*V+}b#K6~-P~J(Hduy_ zN_UE`Qz}XZa-G~n8Ug)sGcRL38^!E*geq+E`KqR@oOm^=lkL?wdH1?>LIM#(mDab5 znJEfal7r;1g<(X!@7~LYkN%0g_;TzM>&Z|pTRzu$Q9K1rt$s+XhQD$WsAXitabaee zKH*e;MyhFM5fE=ng0Z|gYq3e+tmJ=w+?PfC73VGNIZ9YRE-u|aB9j&}Q z_5wvaXJTvHA3$eJ+WW#epi&9vzNwDXlxl2oD|bh{mrC%cKRl3#-`y0I zd=b5TQ7?5rfhV*VCmVy+2Aj;t{?pS_Dg}RGiBN-5!U)8~!ujD6U)pcu8P^*EL+d5% znF;-HnEHpj2jqs8oo>4haqrvUOVZ*)OS(ozMmCSnsc1uEHV2BMUeFFBkxVZC+_41Z zBeYIm$E~iFW+%~7qh1fY+m`ufsuHEn3ujW;2oL{mp|fvU=}t7n)!vHk}-S6`nrkG%%$+*^kugW?U}j|E`)5j@L zWmD}}auC^Dz8C1}b-wmX=3^L(Gj_T$k<+hl18aRBYL~69kFp@Ey)~^H zFR=$ZVsg@W<-dnVCwg5|z{Ts3o%4=f`?GbZh7PSENQ`62JpL~t8-l9_x31Y4<_{Mu zgRq_=wA05kde&&AVKsV!_HPlNyLfIHCtgn_k zWWQ^C_TGf3lj7lKUZ3z~@S$5i1-e+o#rVmj8Xk4njY-2%YMv7fQD6C=@&>*z+se!3 zog!hElF6#C##V?0f0FhE2zv79m8h`R6Ojc0IO+Fu*R`*C*W0{%?`R5V!EZ4lckUY` zV+@KP>WT55JB5#5zL8WruKK-iHI%$WukSLy`M}1-@m@G`e?q|88GF@Uj!~2lHc(ak zyo{4lB3nZgDDnoFR*k2c#Tk63f6-2+WQEBVVDO`{PbPl)eU-YvZ`J?RtF_~zTW9OM z80$M%pME~i-D)R9#q@6oV)~b8RQjYc9d!VJ>2IuWMv$4|T2k*a#Dyu>*b-4zhqbf0`7CtC#SKGN3X3H(wEj?*;Kut|_iY_j`@+Qd#{5iGv2jmEcC&Xc!f>f4 zW@2u6><+T%nU8e#_irv#DjYxCEQdMGB8YqQg|A3Xep%C*sW=tX|L;{2ZFG;3WQ?{8 zkb?wS+t9eUxPyr}LK&b9(29GCI%RG zYl!ux9$Ia`9oTO0!|HD!hl_juRDGCB4u9gwba~z#8p8JFu#0xOBM>iG`pdhw_4jFR zUYFH?XxX0WqwgW_h@8xm_ft)zy~jB*MbvOcm0V(~Xw+o3-({~|V_)HhK}0Db9~}Nx zvW}udb8(!BErfMJ7=hAg)#t!smTx(dvHBO4mrhcLYfOBx*}#BH@tEq}C}H&2UsM{9 z;4eRbKdP+&3slAQ3Z3=KyQ<;VBNx%nxWdM=(lEvT$8$sat6mB&9;X1K6+)oMwg7#{ z8w`C)k&l_fWw(ou~DjPCr@=aXM$(8Py1Q{{oIy z%jF5@@iQxC5)ySCN{}Bv=#fCNaWp%#Qp`S<=VVkSi(;bF8?Xg^L%fCGR$MSyexh8- zDag~5NgF1C0H>#i@#6ICHp?Y-quz%-ChtlZn6j}$-!+g3BdH%DPWbs-5ARpnOJ*)qx`UeG%J1SIj^!{r=jDQo z>!`Pzc*~Ta_E(4&+C-Ul9Fs~9@)ST0*iw%+nfz@&DGoK;Viwd zJm2^qMTZki`^QFkcLFt?qfmxvfyHa4aR z@SYf~p%c2Zas+IYJoK^C{O6)uJeZ05LYKbhl@>CUQj30f$Gj|8K+HkrYlYrD=n(IO zwj0kkYLhYj+b7B$|NRc4rOEwB)NQ?>wYK&Y2NW!@T)_*CFlBA>$fLO;<25zH*E=Nb zNKU2@bxYZtE9sc`1epHSZ;mv3jJH}M7WRQ~2HWFAa1=;>khzrZ(1S{C$)ANYdOAGp zHeZyP2M)ABkp7@-1Ep*w;5N^pUMFro1QDVdO8f5Qv8MEj!lv%IEZAi?V0@^vDE#&M zVz6V0yI4wenEC9`JnS=pBDk-VlI@pm0^?uRxtWn_;!j>Kgt3ZqtyiGO!GV{ce4T#K zv((LfRi{?opO8h@{x@DS(bZh~Ifo-|z?194zvwb2$u^&J-1VSKL8Di(`R5DQ*y3F7 ztZuB6(bA#WyGdaE&r(+ziZOikf84*x@B5p&$*8(#(W|Q=iceHkG7$n;B2+C)1&i<8?6+|G-=E-9K ziIyVopE}R;wDFgJRSAfsZ*iu*-g8U08+%-5M9_bJW;tYmbU#1k?Cm4Q!%KX9!xy(2 z0+x&hIO#GWw^rzB$Qu?2vD7KaZ2gAr@#R%pOCpUlkqn<1rq3D|IiXW1*jZ0~j87B{ zAU%hFe0reGZfDxe-L>3Ub(?~4%^ zT-rEiyt@Z5yUFGfSyB&Hk0&B(^f9g;IY?yqQjNBsUn7sz@!Vy8h3Kw#Xuv^JAHi~K zzNeeb_Y_VFG51{4&Fs~Gb*3ues!i+jEsCDp-l%Xfmft1c$SZhb3CS4S3Pw~JGYDDTHt1M9#ZR7!> z`8JEiGl|eH%SIKL{eQL-YKMz$DBFQYesA6kh$F^R($dy4S)R3L36oB_(nFB_COQ#} zXm{a_$AJPtB<;5&Tq&vFQx|?Rw6?Y$bwA|mZ$DOq-6h1v7B~Ej*Bx@jlJlb$^iAHI zs-#clHH+glYwj0Ui|Ft0fASmN76VVP(W-}Y!^Jgpn?tCp5qZbGnIp`1CH_>v>;2g$ zmF@qy4m$3F!4C9^;xVm*^mfX9h+4#KkAMBIgdXfoc`Vv#p4tDf3NPZl1NdV==$_UiY26jw|A{Vxk2 zrPU5o)y?e>f*QpPTc7d!?<{Zpx1|u3K;Wf&nRy$PxVX3{(UuTGfM$3$iv9wdS!@-0 zDSazAsxoO2IbQYCI_t)p(&v@5;;T>1v(i^rSIlf|N{QE%DseH6O*QmB&A(lYjg3K+ z?KOu%G0yRdFhA((JYCF#$^Uda3`A$7GZ#`7t{(R$PZ8c}0xj6k}_8 zBSGk(`T2wGj|0d>UQdLTaJymSK->=*Y7a?nT~sTr!_o1v9Ehjr-mF6v$IWB5+hSsH z3;&p9wPOH)&7L|_9E2f=`;>}-2|*+NNFj=#D~gc1D)`2~B2%OxIb;K0gf{@%rek0; zz1lG9G|i&e$0t+$5NGjKc=A$dX$8ulw0C_V8A?aT>l+-RZc2)|QXXYGnj2XUIw?3u zDiJKoq2`r+S>j$*o*OC%YEg~Ynmi3Jt}9F(`W)RiJbw^-Yq5rW%UcEUAF7Y6Ce&|p za~WE%4q9T~z1tM{D+jydrywBwzUn+m3jkmj&kh0xJRlCf;o#{KFjMyG)E7??h#MdTG{PZbyeccwM?^AO072XFs@sqBt?h-FDV#eBTAsn1s z-+KSNNt#ZMt9PAal9Z%*%&xIcTW13k8gLYHbKZ_jFjqC=A$tf_6gu}W=6L$F7bK+m zXMv;hAm7scs@4TQ=at_BGLMvCIn)X0$b{y4R78b&TXO_xRCxf|)XoYjAh&;?pU<*4 zQxn~gVy|v#$$-qu8*2;j1u1G{*@V*-HE1IxG&L$~CL5Fr#|f}GXTTK1efB6;S6AIP z5!b}|Pw^})EI@OEiGw4iA;pOwjbKYI9xEizq|s1*`SS8nXzi1vjF_I4&h!1b#FP{k zRlN79Zwm|Ax#f( zW@g3!%>WKgk0~gY+d-{njx_BvhhfmLz=4aOdB8~Cvg%MK3l(-+qcBOv%z=xS{}~eD zgYx+iZ#c zp&><6Q<~swZK=P1RF)49--8Gj6BF|&b(IGZvq_PF7UE3!E~xzY(W6wzWeZLH#%gC6 zhEbcpFt3@@ui&`B(RL92WQr1Zb#;}faCwJMfmE7B^IHmQRq2G2Mg8192Jj=Lr=5m? zR)RDvEbN{b{rve;&nwD+>(pNg1lOSb^)>DRCSh32WR{qR{67MP{zf&_j7vG_@)@9~ zIhxQP;!6!HnK(J|UcGu%QiL4U19^3oW!D4monNsHDd?&Zw+2lx=TZvK_;gn{h#F$`oJFxSRc-8B<9Q=L7+yC#6juNSSTpO$OU>5%1q0R*pIP z0FHbYMxLD%J-$mp(U+HgrcKDt_zz#NtgS^fd2LyDzr|}EPs!}I1J=Nq+9qgloRHe0 zjH2{Jmb_w(Ow>Vlrue{UGh45K(@WwV2dikzwjAgeXdZ--KEyC8pY*;SMgsum+5K4n z0R(CY_@#YQl4#oGi6xRr_}pi2`Dp=_oSYmu9|L`}0(2(@H#Yx-tzb~zH@`S^7wAnX zz_d+?Wh>VkJ>9P_J-+q!ddQ^y-r9=3*9JPt^irZ&4m-pU|0gvIPT}0uFiVh>g$bk* zk#{@>M01EiGs_ZXL<(NAu@N~_<8Z&{lVBE>&J~fNjZh4@R)4le3~RL^Y1tp%zI|&6 zP(z9YN9w^pAv(NF>CR$0;_8=&~D6g z@!p*ztg#>J2E9%*@y{02OOSNVEw;30?!EvJlaSzAFtuxl!GAQ#B#aPPUthPpI9L!1 zyyOQ>T_^R9Nk^fhv$Njit_T6AUmTZLS1rcf88!KD0s>x4PB!Z)>;0KCYxXYQ1lec+ zVQ0KnB5yG#sFa_cIcRBVg(8uezn_A|+R@30{K#jiFHBK*N8y-5|R_DF1N^T@$4~qZ%&5YXt@d5aV4<9Rf5Qaip>lzc^GJ~$syA<}O zeEE->2H?XP0pW5FrOn}*Jr*F!i*Lg-44Q-5YwI|A{y2@a@x3P`&>*5*ZqRtA`o;>p zSJ7^UY3LmS0LXcoXZO$V9;Bl|)BYbLk`RIF^NSYC1`YdM{Qqa@%d%pfNYq91!?*!YK{hWY7h5CF%CR0sU#0`T$U6$weLuFiStVe=Be?so7=dw>e{+>((ZgDLs;8IRe0`=sb>|i*>=ZLr( zQ^KV@$C+rBeZa81dKgYJL=iwBivu3{=zh(l^56(H=9sc2S*Y@#2a%Q{2#&TAs737` zB|{rQ9IXji18Uw&4TWF3|9po_@(7Z|nyqKTfBuP(;$xIxSp= zh!`EvB^jp=Ivpchk{<`pzkK-gsd#8`kXjKoPHB@2A&7Lo`y6bKa0NarR+zQWKD9Di zA~F3dV*veO@8wW#@H|Q29DpWZkr15mrtJYl&(Q5yA2!^@>R-Hg(c(L>+qn-AvWSS( zf7B?XmW4$Cn5*`@KLMZ}UsW7uSuB(pfyxVKpyA}?6mJJNuFZ)V1^am-2I&1!mp5Ts;RuajUeMxAL%2;Y_A=#HSB4sz(rzBfhONOz8tWoxTDP$XD z%a(m9>j>GG-#PBO@9yXM=l$b%yzkp_h{KGz&g)#h-_LdhYN{*KP@SZLAc#g)Mezm% zk%1q{puY}-Z>tZxx4<__dlh{r2%@beeZd;+(k;O+PdFoQIcwXYoiXN)cOVP~BW(TP zp3`k}`#ZvRj#jaYvL_*k15#DItn(1RFl23SJQYXW-rv`c5Tsxwyg1s3g+-2Le^ANe zvp2aVGlQqHzKDbv$S&k&e-Ni^Rqd(tQt!z&{OXjsn4M$jQXc!Mu`_D^5Q^h)#I?UB zxyH;ey7pA}-Ydm6DUk7y(;l~NIJsu9zkMa*1Wi#vVM1Z=mbVGd(6q8GakneK*V~&D zjQIb`KZPSh@4Y-m5#-RNZVUwZ=?!*yheS2mFl1avqg%aWvi4^me6bMIyccrDlN+jXOo zj2X~|6j_G*H%6a8RL{sDE+aK!>h;H+ol4qhZtd?LBPRD=yZsF9%=u566UDqG@3}Q}0ykM3Y0|zP>5~A?gT0Klv z`JTtMW#+jazDKOg-Zm0AQpXO50!m*ZilW$Mq%hgHoGSxfY_+X8pjMdz-)0q;y=liV zL%d2bXuMhR-r>QMcwa+ihf{zF@#dga*sqR8`Z}IG2$l z`sms^$JE7FE5q`63m84G{b-^rGz=!kBE@@T$V!>v%{@iuH|gBd#57!mm<;0U>OHL~ z19OhU^ebfKjQNDdwY*K&?j0>!;cg7 zHO_a%p4ZN=)ylDLiH~u4w;e*B!USHo+#HPx=EU8-@$wl_P(HdjJ!pGIOm3-BWm+BW z|A;IZg5X8txE#L*$FX7~F4KfDlwDr*sb_*dCQ>ozCU6dUe z&D6Cd+x>nf=TYqq~}4m0vf|J^wzA$IxBmfm;ja6h{*uRC6kG z(XKqP4nC)w-G+%uvT#?#%jS*#B2LSImc28ucLqEgy+W)!S%t^_Gie0=<>v2xJz_3CXwf40KLhYg*;CmlT@-Q9>JvoDcf~49FgGPrYlv+BXsf@c z?Bx#&0y8E}sTblLFL~^#RA8eXa?^uB551+Azf@I~`Gqa%~KMNX)X z>_>F(dv<}@e*k8GTabNVRX;M~C+Cd`1U1^u-L+3C+23Q%fXDM2Z2U19gwp>p2sQw- zSXb;V9v?=QuY=kh8!y1ppVEZF+@)+sPS2aVe-}8}WTT51!ki`uNwPJ*ENPRw&gw%% zP>(Xep^TfCzUs26_VJ;?0fhVA=6oF^Yd(>eT^!PHo=a=QP%1*tY37~FKpX6B6tI=>;P zHTf8!l-gC)JExIj;mE29j(9@KAiUHTGhK9PvyF@(Nd?ir^EPdGGgcy*6?xsu>hccm zR$KS(4dsQs;frYha3e;D>*jrpZ5aceEF?H}Kdji&>J&%LzhwV;C&pVS(@5Z1-5By% zpoC19;odrP|MScniwL?P{4902bjW?-@>)JFMNB;!F{ef?wII#&IrDbqW}NoVId9A%sF%)!1kKi7u(@RAdb}P> zhV5&4W@{kYe$DPiewHrRQXIv`U3UfDB4@qxm~C}3Pev-p;+}hIFK&pF(`uuQ98V>| z8m5q6iHo`fHn`_;@Nx#4&v1%x61i{%j0Yzk`57-CPu=2k{#NC5I#IT!TnjoXQ0Osu zNl3=979|p4>F!!WDzix#rK%N(lM$+`Yi2WS3B|{j-z4NPe`jE}(no5*bI1{ak2`mdq6NufLM^JYLlRjLxKXRX&s}DTxqVDacx< z7NYQKxSXd2iKa!-Jt*ai2;|XiA{~8d?Gw5Vm*i3@PM>J{+B7dZeFzRYS=37yQ-@A{ zv=i&1COmHX(3o`Jt0!AyE9CLyYl!1rNc-y3vDWeE8Thg#pC0|4ZIOFk{g|U%6mZB* zn{=d*r94`jcu@VuQLVItCAKr!_efQh@e&n;&MvE7cuddoRjOcnEEMb)lS!Y?TG|*r9tlu1e z91gL!Db6Wfd`C~+8`xM{H33PxpgZN-lh%xTvVFj{e_VytP;@_YHW~l;UR6gJl(!l| zTnMgTggM@1Z6YqXH)JcscOwxREfJv^cA8Ei-7H{82j|`phPV4?DTr@g|PjgHsE|gebl7kP*xI{tqz2BKZwL2jRp1 zJa?f=uz*}vTaTsX#z8&9I1>nYrxBUsgmLM*UgbMls|8tPdY5EfEO@V9FApjx zL}>gErm0|obD&8zmgC#wpQ$&&c7Z0Fw6we)ewe%NU6lX&%s0dl9`GTY5_#5_-Et-` zI;_z!3H^wpfR;7r(wn0egQg#hs4Bpgh;efsy+HudPCzwA68SL7^MkS0o4!OrYbDrH zy6gMO8^~BiQk8`g!w6jG(?aL;U44j~MgsHX@EYF%tHJgTF?}I^8Zcj24YXrl>F9?= zLRM(t@QKZ~NFGKknL+98dz;}-prQ7=aNe8-lTqgvSos~_;%XJ64A2iX6{xIthg81l z()-OJr%sJHKpZ)QlyXJmhOU=tK5KE@GklPfZU1oV^=nt|(}#;}wUI$ci?5t+1@qrK z7OKlQth@~rt#}EhGy24T4xn`V!`sdOKv@a>Hx?_P<71Po{;jy& zs(g^!d6}-cU*%RIDLN)#;Z)=j#Z_I_kySQcO7Qx7&!zZaPRbY^P^Pe@mi)>5i)jSf z_S0}PW>7&P4b&c=a7l4m(vNc^T0u;3v%}!G*uLY0mx^(_uL`T?5h}T_A$$@Et@1TX z1~z~5w1Pna(JJXY8hs_UbJ@3DH$eMTzv1FD2tArQr?cxrUasf0%ARI#XJQ>6_T4Mn+Q$% z27WnGBq`1EmEXc@D})?Utv9mY(}b4qPK9JoDYvy63!r-gZ{Yx)2xH{gN^*)=XgeRe z(H6nTh?UVSFW&8n$d}A4`v^)lANqgp4KDB=9f=p&j_Bt}uCGDI)kOWVzl3~N;&=nW z!p}cl81&t}PUlts8x24XR%mkiyG2r6%M>H}5zojpIdI`>)YJMiYBsKgL5DyiRoM9s z)9vpx?)bWZP(7&$QO!5+6;V41-?FoD0rRPVI`uCP97CWCG$Gjx_QgzEA={g|?WFx> z5)Cj-L6_xqV*T3=m(&F^gfiDI78Sv16R3 z@$BWuch1eS^xV&XaWoyksyUC{WT;MML36vlt)QtpigX3HI~RG>eH>AAvf>e?PG2zq z=UQX{9%TY}RGs_`>BI+R;1tVw2t~9vi}&g=rz(8Oj%vS>_35oZ-k$QY3m;17p91$< zb57gqjCkv>D#oq|3n(3kUvnxz-IPEaNxT*PJvMbYxeC?w4*9Zu^LCKb3r?--cN3lV zUt@Zj-hj!d@fZ8Im>P|+Vi>U&7O9fHv8?!C7#FHJFEQhKS$Ht6bU~vke{@n43i{mq zio{c6%5MsmnJ8WZXDQ5tXF2mwXMcGCiKyaFQYjoOuXs1-sVANr({B#>q5oHJ02Mb3 z`cIn)v;ALfW||M86q7@|4S##Hu#0pVS(}St0uFH=Q5W`xG0cS1a1QgEJ4N@#a*<=j zB{z>N3`g&18QI%uASbk|k~w_9pBH-G?Xpt4_9a;5IoM`Fkr~f2OA-d|u8K-jHeH3O zl>DdZa+?2_z7S}r6sX>Q%}t*CUb*?XKv z?C43&--B+H?SMpX2ka{08F) zI&7p>5(Q^q*_zIS?XE zw&2X`QjZj>WGSwgLeP$f0=Vbsd!NqawA;1~b!}|DL$>HqhO4C!e1ksvb1hZAi4Qd) z(X#^aGX@U@8|FnvU;f!!$0MW3G^IX!r^U$E)ie7QdfK-j!%^omu6@EVa|oqcxrfd? z0%8;Pd$&>=ub&1v%a^ zTLeq!PLACEN~CfJ&7G4* z`cn9*nf@zUx$@Rtj-W%7hX8sN)o(sp_lJZPRS;b@XlW~m$#+@~oZPv!^Miin-BvCy zM6_B~cKA?9(%o8(`72BphSxN%w|z;Ur2@>NMD%5?di0D?0dD9)44whI%8bPvd3rf) zD8Jyx`exe`hO86KH)Voj6sJ}|Nvn!hP3P1&w9>HX;oh`hM_OsUwPNEirw{J29aWUz zj?r3Bo#GWqw~wFh7}~L6?y@xh1BxZekxzhP5R9WyN$ej+wXlQY9!ydQr%EH{(8c!G zU;%OcjMxcOXu1=f(Ql|r&=B{;|EVJa=#7Nz`>+JlnK~*a3@p?%NvlS7n%DyJu3i6pzqtHO8rY1IxRLEzpNzL&wtsuWRC*F zF6DzbBk5+MyBb`&7m3;THVvzMygW-L@@tug1%c)h6d6d1XmN4XyALW=RKYD0a{KB% z6-{;&;iL=huTwA(-Y!`v{*HS#_a`zgk)6HIm0MKcbLtW#* zvn|;PS9 zYW}8U!C$EIYXc%PaKn`O*}fG#jL#Cra=~_6HG<=><$BQZRUR>3G+n?9A2LR?B#pHeVzhYC1SrsqJKkzNOD=?AT| zlO$!u(^H}`bjsIIILI z>k(g$>-r-29l|Q}HAgB1!oI&cGZUra)TQgCMunawE0@8Jm^fq16x8^R)U|takq++B zf8|>IKKq`|I(%Jp#HSCkrDe`uz7)yqSGV)d_y{Nu4ZcY4|EP#N5-+uw8pzAxH$h{| zNK)I3B@GS_0U(8a$Gi!I>{I76Pv+NJTmGk`gVOznRM0};N`sb;DI7^}UgkUXF5|@F zsAKp++4cZ*-HSxm3mcORb!@AMD83^MZt6k}Z;av2o~f9xISg^ZI1@a-I%M&54!K+M zi+rdmR$X*?MNS`ZuUt-Aew^uVkrr18M#eSmCwvY*D&50!<&Ig(=ieGF9LI!&kx+s7 zSKV8FaWg`UR0{K4IZ%M8*zEOjZwpna)N*Q(eqI~Uo@B|7TG?bK2{hOB^w3xV{MZhd zXTHr>%-g!y7&a4dVu`=GmM2=@7B!D#DYI=SX~+7V7QY3E!XJEPNZp62Jk#`D1bR2J zrOPD$<DH1KvjMUatG~BJ*}y6r{(0xndL`TP*Bh6ynW5Q{bjXQS}Uas z3&Qc`Es-cX>A*5jp8(+C5(3~Tq;BWSo5e$;z9tMbixa0;K9=PHK?+a(#qe!!3;hfz zrWOBc{5(Rl{^gm;e7(S5da*`u=n%-hb@3b!olF_vCx z?kJjf*U;2uF0v{)CW!%vtO1ttF&769)0Ghkm>xb}r^d0`UR)L!Hq>v)+I6Q2ku01p{Z-AWUf`Zpy?h$pm>-qQ_|D>K^`q&3c~;h1 z5}j^=)U`ZXr36eACty0PR5gO4hhvGcBR|pa{8@= z0{K$MhA+mE`L!KCBOVhCV!sQ}>+9J`j$Av(h<5*BPTvK|z#0Y6{&ML0zbNEsf@00B(gsOayjl3$(`YqA{2ttQMqY{aHGz(;Zbx!DO^ zI%DYOD~9p~Gx9_jY`?;bmRvP01p)8D!lgdW z2TAy=2a8B3O-|Z+|9qew$0m%QVR8B;?5V@%Ucg-ePF@Q=^^cUt`+*N~xC-NAluP6{ zEE9++_u^HJ6gZrhKxtfHqG;n~waJGT&urW62JXwbAio2Bmt>g)ZuId1rbYTw!9TS2 z2%bnfXJD^>ntLQH&%ZqWOYWOZk(WOC_YPw`O^4ZZ@O141PQgw)t>J&F12x*cGKqA@ zHSATxQw^^U6J?xq9@_<1UpL+;yZc(Lef8ox+cEt~g!(ltX#6SJC_78VhE`Yk485Mg zjgouDY7K;WmVb;Z>gDz)-82Qd(bOk(=Q&68Z-g8iq7Bi=MS2%D4ZRDy{g|k3Y595j z?3XflwhNJql)(d~;$`+W9s}(i;`*&v9b2wc$eu}bSzR~k8&^dIy2Lm96~L>ftvzQW zz7c2j&!34*1L*-4LsAw1=*1QtE}Rk7)_Re<=4SmQCwyh?-uPKIQ113Tn$iRt-_;eU zszc*}IK4~DKeZcwOsZK>B|;phQx_wO5402^yUh^tNyB3zi1Et5Z{mmO=BT#sp4#l(Q^aYLf1Lw3 z;mhv>(tMXO$Mq9RWZc&ZIx3YG*q^Q3=C(I7=YOGhla`$DX{t6h%hbUAyJ=ki{mhEZ zvnJ9o1ynyg{QJH>q67ylt+)w^%2a`p4|EQ|w|bjlQ|PyBCt1t(TgklUyJ7H;={J?b zqJ?%pcCTskFAlL#iSb<>ZhLfZ%>Db?h`zRY(F)vYqaYs3H)WGMIsvPRP~zQ;=4H*KSpagCTS86`fwxeZJEj)z z5QXwsk#F$+JDP7d{(|arP;o|5Rigz(F^`HwcxP5*>NEf$*iGtKR`&oX{CE8}xmpJY2OEhcoe>RbKvl zH~f~(4KP-9UD7Cmui6!ebp@wP9D1fAwxS#qrN4MPre@oD*Qn?BX}{;}>1Kng2Y>!tR4a6>$tU~9YtTO%{05B>q% zM^|3RVzbM;jkYJH+P|bq{tl{~XIBQaAP9$N3$Yy+M*Bxv|08vpJ6G~aRAT>Phd~Wu z2)qJMq(tR6RDnbnbp;DAu(&Jkxo%u4-3zfju84CJ&+}cx;e~ z<%h}nCE4Hsj4nylxLNGM?b44TwNuq|5S|Yo_m3UVoU_Xk38ftZrlz>NN}vJY!>KwKYj>mWO=C(?6-G9sA4|&AT#xlS7b}fe$1FVaQLaIgyc`|4k8+0gXIiV0W7)6IM zajIQgm?tC%N@Sn7yS==Vo}w0Kl$KPnN$!Ltg9zM(aI|?>@GG{m*#5ClJ)kvbvNrF< zIxW(gr?NzApTCy~4I>bzT%GlXKg}S(ceZ~>=H***b=9? zxoZcw)T=9Q`|34yJ@uiaziQ4>K}Q+>rL$btt{cCZs`o6#_!+MR zIWmXT3nHrdwP3T^J)qAw)CElBS9(XKr_Hqu9BRDrH$)4nhvrW2_0c^#z+Qn@JIv_9 z?eh-c9|^V3cGRLxf`S7r_5}S7G({(e7#zgQ@Uo;F-8m2^fjIp5z>g_M!LPB5N#Mt@ zD~#a(8(_mi3RK`UKq_bcKX|iPYSJ{K_L*Ne@em|W_CE*5cNt#OjUj^+@^ID`!}sWQ zz%Xl?{{J(2hiUv~h^RKdK|%kc^NC<^|Bom2nmSCSt(p?zC_;JhHnI#~fc?Kc{{i`; z%W-DYc!`l?5XmI}zq2h~1N}xNbSng!G!Da8Cn<PIv0Q4%o4&w<~vLGi3B` zK`y&!UALWqL4?PFfsN`2wW3v%uRBphX(yo$xY>ZVse#We#k>~(3%eS>@=gp8$IYks z(zc-C{ue$LcQ6Qr8qzp(dy;mQDW%Nq~W(+y721>5{Z)ZA`ZhXNKqD(I+}@ zf$^Dfb?P=N?>nY14kO_ZByroKROP4EiTp2BLDQx`ruR+okY@l()K_^PPP%US!9CVr znGFVLbP}gpO#KmvWVJvf3lyNLQU1PrrRDOm%~t~-)_4{FPShQOq{SG#kYsbS2Z5~X zUx8bC1)%G&=pikVz?xwwK++lxK@a^iPPx*{_C+3;Ah-@$N=9tt8yhc9jhi%Ix1BTC z%1z>Sd_lxA#LrSfuP#CV=`oEH=508V75n1F-?YBpO9sw})jmiS1?;>BVV6MqZ(lN+ z9Y=5w$MbGy4#IQHV#eko(F>4qM(l}`x4yV5DDEkf_8#LDP@|o|vMOAw;5qrV*SH_# z**NN-k(cQY80UJMIZWa9(@$D*j~kdn(E@03{@K&-#Wqbe;C6fY^^^*yLD=R}83+=@ zH8>Jz$rVi0T34T%_kY>TEcEwmP^F?$I4$?H9`x`J9(#J0mm@QQAV7w-K!?k+ys&Oq zY>5F92e&maP!r2-CW1MaM-HM5_Gnxiv$&T9q zuqw=x2#!P{5Hmkg)|>(<8c6+PH;VWKX-FYp08XSj$x#J~s)xX3s1~Ly1d7*p1Ors} zc$WHg@Wpk@3-dqOxYhU|_?K$u+7*js4KRL{asa|{z23DyEBzWIAbD_iBGR{9fi3}c zenNd*Z(CiSCX(|)rx$E*A^1su5Z;6vCMl*u5|!~lQyvAKn16uFhGh$^?WQH?yO`3P zs?1cA5q;6XP>^IT&b*VJmN&zm%(tZ{2J%U#p=cp(nYaJwo}ny&sG)6Kr9mJ9^E(hR zwN9y^1(GK(#rnS(_io%QCMs+|!?!GKxSR%$xmmeBtjz4$1lQxesz&jVzPHrM`m98y z7)WoFf{EWZA<3k_d@LSlL-QcF*n+Zi7(IdI%q_RrtwAzbk)S)aL@X|5hV2zmyvtBl z8pg*7?l0ga5Vswuf!)%x4AN!Nk{~y-+BUxwwa?Ul2+Rsqn_|2+b-r8=YXXqXLBg2N zVn}x`n(eTr=5KQ`n7yHa@^k)Mm-TeS$_1_6GvLprpUgxfmm5F&y~!r5@_-4Y6pPT8 z6y^-=CYF0x0molSQ7;IHq7b?jRrXE4uPQ4BH_Y`K;vy`zRBh{lvv$WrYX31XZ1XMh zOwTUN>wl3QM^G(;M381zeyybMeVR6SaZn!)Y-~PS^j4A6V#5&AJNZvHOdWq5QHaR6 zMG~;6X`_ln5l2QRfHKHdJiQq7N!e{h_As@zYpB$2-ldpvKhedyXq>_{)r_1W@X?58g5KyY0x)*4Kz0n;$fjUxw z;6f=8Gsm=c$3FUAuPRQ9klH^#eu(4EX^=o-3^%=_bV06u-X5>t;oUocKWWMonlOVi zVJ*I2=_0fPg;`XLrhQ$VUwXNFUtWzE_YdbV5$7AKsB8E7^RkMmB=8lGrOti8S8z>=pY`=M8BQ7QY(4SD?i&Cn! z)ArI9UIGa=8*qW#KT;>~A4prw~!l@PV=%;^NTh4jO=WmZ!6$ zYoBE|*wvhz;t#@QZ@5l2DxuvS_@!Yr=iJPj7H$Lk<|s7)iN_==qmO}P9x3ryRXvd_ z`k9Am`!NxvU=ZCG+*WF<@f2r5I0c9D^E~udoGg~BK}vui2NK9eOJ)bJ0SKI*X5rPj zH3<@u7`A_-=pk?}Kire)RR_7jMWTFl__jCj-vBtP$4@lBRMJPgYk{W~7`wZA)ZPU(?(6oB+_Y0?)%__83ZET{R*Cuk9B7=K z7{(O3cBm#e{!VteNTzI-u4H47DB_v3TQ7=ucz9=wnipC^ySr{&_g&v{CCOIbN5l}% z6eT1h@4k9rt=G;HLkq%x&dE?s`N+-tp4y5RdR8B7>1rAb+_eG0U$W)J4e&ugOrQpF zQzg@d`yv5NK3NAgzkvXO_AHDrN#nGoV2UI~Gv3J89d5`DU}2iexa&E4G{2V5TU(-1 z*>Iab#-~2^()d$QUps*y4wAz@D!8|3kfW_bm0j<4ku@G#wF1D20c1J9xX&5T1~pc9 z6XzZZo_d9Lam*m1Y63;Of-SDV6tw!hNGrZp-E-u@1N$~FWkqIC+fZQ1>I2BIFf<4oCl#il zckhYIAp~=@2+?dxu!Hc8c7Nvrf>M;#ljbPWPNV+mqk0dPp<@{j#Jh^UzFoEePhzkO zOP5S~3^BDVo((UKZ^hP6ng^#W~=-dyJXBvb6*$(0b=*IFl4O z5JD3}Jv$z!L~d<2R-Vj4hA z1uY57^<>vtxKiZTHkpCs3?QeZ-1Cw*&B! z*gjh059kK3C@Bg3KQPPE4}vX6^VG%lZqM~~;5Ivehe_l=)#QC4=Ul$@r#C{$J}cQV zS~cAKDb14tJT72Len`D@G3Y0Gut58cGTQ(4w*#O&=^@7i$Tn{<0B?-4Da1H7*Kkkc zZoW>?-dCqT=4J1`dM7uDpw+Ymj{qD&wbP1#rvNUIk~qM)RRNFla2-6(1D;U9T7XA> z(67svi}XO@lKur#=oifxk%L>A2ABXUsSQ|uO$T=v#s9=BTx}qYk8pBKeI?~%_61P! zW$+0bzfrKc>%+BFv^%fhz{Oh~TP!0ESkUYsx3zNA1S@A=20CR$PnZgX+=Htmn7Dgb zI6HoUU+^>-44PIkP5l8E+e`y$fPGv5eh#56CfXsTHl^%!0;n6MbrK*mc~KrATNDli zh6{3C0=I!qsR`l111=px4ENhiR=4aN-b;D z_Wb+63jRmVYr-H%&vzaO9J1fDZBEQ)->o_ul;pz{S?u}k-1$Fo48_jqA!um|pdr_J zcT%WRZFNMIfwE^9H?y$D_LoYoVs#%>KkAiVd+?-7YH4CBx%mS;&V&Of%nB%gyY|-) zwb53SAZaT~wW literal 26842 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 L0{htD?5+O;K1`tO diff --git a/icon/icon-16.png b/icon/icon-16.png index 0582446647c09e2baff72d539ce59433eb7a7fd5..fb1133a228fa863e639c0f4026f2da7c480da136 100644 GIT binary patch delta 501 zcmVU20001X0Zw}+2$41?e*wlxL_t(Ijg^xzXj4%XhQD*)GbuuZ z6cp4&>;oy$f-k|P4(;G1?nMxx7y}BrSZNw4npqU1 zgVZLzymya7O{hs;TmSK%|NrlQ?>Pr{f%j=9J@I;RXg7`|6$&5b&fz%MRn=7^OYd{V ze^-d;o(B2q{0PD|QF8wjl)6H>GFI9cXfVF9kZDHol(Aey)C`QJqKaLyQR>O6Km84$ zOAN!`hXp;ECR zV6}Jlf8+^Q$?CUf2fvcsm;wBhkgvL6l%eg#5{IHJOHnF!=x7EmQ@%PsVpNJaECXoF6-9&I rJxDaz&Wd>TnG`_XyA>h>dIwN000Ts0kLiuw~;m{e*%U{L_t(IjdhbxNYh~$$3O4;Zdq*1 zgCth`T*n}^OGMEmtm!C%$i)z59@1EU2_)>)p@K*utSIQ9ATcGRpGd)q{ZkwZ2sMz1#(i#;m*#^ ze|OcqC_gfpOwG#5%8)T81xNtbbpZ$lgJnz`WA6I>{=P&a@v~x($z*DlmzN&{t!3fl zU08CF$ zGcz+oJRT<+jiQv=tF^ukoE7PGx=Bj;f3{F4$bo?Y^7%ZQ8pG`ByUf}>hXDBg;t?;0 zE|Q;{#j-5=`}?V@tJA2e~r~^ ziB7#?@9}dieqP|gi6cy=;w)3ee5{EmEk?oEG(0(t6 zY6!0u0~iU+|LaFJgb9Rd3506@CkFT=0S6!u2mnwR9YpBTU!>3_3ZsKmvp`l#DTe{w z-rkO7Sv`SEfYzE|Fj##^7-McFlgV>F0KebgS1OgZD5dtrVlg6-2)1okPPwI}W%ViN zT-QAhRbiT#m{_B=zHW>;2`Kn)nC`f)dp?y)mHsd&*ZBDOR%1+$5TcDgA>*9&Ja43{ dtLuF={|htY1Q)iFmE!;a002ovPDHLkV1mSjNz4EM diff --git a/icon/icon-24.png b/icon/icon-24.png index 487ff5ca8a7f319fcf6ffd68509055eb16848aea..21f58e2b933daac4d9a20e5e97ba8e9edf962e22 100644 GIT binary patch delta 727 zcmV;|0x12}2$=?uD+>Uz000270mdy!jgdAde*&gSL_t(YiQSalOVeQ#$G_+N)^KU2 z=~ZA*VN|*%a|+c>l6Tfkpn0Q4OU+&o`U`~aqav~S5?NiyG$Ja%cwnJed95uwpL z;YBl>a>@OzE{8J{LcA)o)^vm{<0|5#NET^409QV!%P}Wj`TP;HqQPT ze}I6@V{K*3S{)$S03d=HX069j@aZ0?MXef8^y+fHE==_RwkK!HBr|t73K~2s0+hbK zl%s-cY602@l4VaR0*8*c{h6`;+me6+k6mvN??Dk%5yY^Zah&Ew;f~(tvp?B$#vciC zY{ptlZGcGOD$D^u4~@12($;6k29saWe|VQksZc!#n^LkCdQ~5fWWsTp!%Ga#vlM#M%zkBqiqi3@f!f3i;@&_ ziTRMlZQIX^JA0|>9f1D5gI&Y^tZ+3eRDgsRoCT19c?n;2?`r%G0446$JW)C;e;8&3 zdK~f9AyGy}>bzylHX!M^GPKn?4WOgM-Fjc3vkH(w66zQ+op=KPdk4GL`Ln{+qEG=A zjyFpN00;!2jAl`48E@~)n99FBU@ZFxpalW~K`QNbZDOalJfOlgERwlcMx@Kx7NM0(nDFJ>*{}X_*`mvkn zs(yVgC>Tn!iNZ|)!DKa(g0Bd|5cKQxfzC)Q+6QB%S|5OJ(`eg69rIBll&oaaBH~h^ zQ0GhYsrRw*ghq1}HGKwfb_E0P3rM@}G$sx@V2MY5UTAe~HfA>~qE-?5L6IcI2cmA7 z!|7yGbkP&Us+X$50Q!qZY){2N2O@FBctC#Kby^yxm#Y6K`UyZN22_2fw+H|L002ov JPDHLkV1gy~Oxyqf delta 1045 zcmV+w1nT>l2Gt0VD+><8000id0mpBsWRW%}e*@x4L_t(YiKUibOj~sn$3MT@2C{5Z zp&>OH(Sam1VT+(XID9d_D6HX+nc}UjV2C=2P6nbcIuoNNhGa|J;)4-guuwn|p_gQd zA!ZR>=7SC5vNX`T4Z?_j8vfYC!oBzB1HG4yQZVy8{eI`1`#tA(a?bZ$!45JsG<1)y zf9v(YQQ#m@oHoq^*QAu1q9~)Ps?O!Y5IKMk7>035O4$lHc1i*;g%HEQ8>*^a+ciLc ze}4n;1+XtuFQp_Fiy?%dw6qiAFtPo*Xt!e zKR>fv9#vHrL^}J=fad`skqA9KJtPtd0Gv)IM;e;A_r!a!zhEQ9)g`WiF>$@@LXQP_| zb)9I`zB?QaN4+AYtg$qi;EJMyy7e{Sd^5Pg1jSuqexerMulPJn& z(^(}0kW$tvLWr{Mo`3B8IAs-w0a%#3!B_3gOtpELYV$JE{u~Q)HvlNBIKX`7eY*)euqE*_?_uXleWE}u#oEGuTyyJWn}iye_3)s$z`!* z-xDg2k4C6&Y_fILjZM^Q(-b__wi7sjsQ?SR1rdApQd}3X@5OZi#GbvoeFm_g0P+9g zd7Bbfq?F^<&EeQ2&SXZ{>?WDMPN&m8r|Dc71q=X>$74H;v^O*LQVquJFFAqNW4{tP zUdu>(vkhKeUT&FnDP>que^qr(2yq_3?RL}A(Sgh50$}>5OMIz5#`X8xFjkjsVEyl9 ze*54RhM#$qE0=!+HmIVrv(uVlfF8f!KQCZo!RWev71$3OWT$Bwnx>ITr2xpw%d?3u z^PGe1Rt&@N1OkDZc8?7V4AhvW875C diff --git a/icon/icon-32.png b/icon/icon-32.png index 3dd7aaef9375e117b7dd6b9b9bb52fd3c0951678..128e66b0230b3aa68f0eafe3d0a3102dea4fb412 100644 GIT binary patch delta 950 zcmV;n14;bS4E6_*D+>VZ0002&0eL8Ky^%I2e*=R_L_t(oh3%JLXj@er$G_imv$|s4 z*k~2TL{aOXCh4CfZn*id_#o(uNY}x@DH~1Fu_-?3gCf5Aq%V@DNwV)x-&OdHg4@(uxD=UZf%(W!F!s43vdw@ zV#%IRs#?A53V0VHD~8kk!3#-O=s9D|YXE-RFql{(t>_(J?s(b`w=;l>E8xqFe}xT^ z;x##&^p%>X)R5*NfGul+0ZqXtR{QlcUvxjSSUHD?elY1CIZ;)>n~6jT+#=u=A>K$i z10REwVtpVrzDqflkC5D74NhUYP{_w-Jtx1j8I?7)2!BfU27_w~lxE~NnkF{u9Ld?o z4V)kCv!I3{QhX2m09t2eT*IH)f5&;UvAdMfK>+uz_-sf30E8kipD&A?p6@&UbMf?$ z#I0|$i;rqCj%}B_C+y4b1KHTlWvvebco-~aR0=q-UMM8EzYWUgJ0E@TFK&M~>pYZy zn};-j3H#6klar3CT?>!ojd_AZ`?_nT8XG{hAyDy7~^xK?k)imBa%grxe8f7)?* zO9)iw0OsolLmP4ec?l+5!xOdOKpiimDgV)H0M2=Hktr19$y$4X5?s=XdMx2OvF3KX zZh>NwJ)s`~yyD43dzHxWDlmA-z>LrK*7rfuREFYlYi~NbyZC!=AUe8xC?2;q9lRO& Y8=7r&ILk)ne*gdg07*qoM6N<$f(H1`hyVZp delta 1559 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 b_@Ce(X5Ibwq9RF{iDMoX5HKo_ zAg?MEVj=+qHEmYp(IjR-=A3iS-v6s;V`OG# zfA(nCuH7ggUPK0ph*{ILXc6fOboPkVDWz(3U9VP39RbRKQkToMbNck@r`pm#)fPsx zv$KaQr7TLR`+@in#u1Ef&jXVRO=humvDHJG+a?WSS!)j{vuX%Wf-tp_E!v zUthoK(MKP3hQnaU0dP1RF)o*D9xxY(e-7OxL#P&!6~HTLX=&A=7%~N`C?d*iHcuCk z^}x@7j-fabAUZ0g?omq3o-$=hV?sj0r`xx0mtYJ9^$*C(%DUNPGOY!E5{!Php_JOC zl$tSh>eS-_>jtV|x7#O+$Xh_yKy}*~P7#@tmX?+ih?3y|ELyZkGn>szfhPlYf2|dc z9zDt@pM1i%-+l`~uU@?vIdUXsvpH1L0LzXZJ-TqwqD8t9VM76MI2`R=F4xEE4yO`zkZ<%gNWGb>gs;+*kg}748@2tH2%5mCj(#cu)0!Fb?yyD2Oz zWZAN1l$DhsVr-)>FE8h#k3Pcfb~9kW08FN!4l8qHWaQ0*2M;drbwc>G92Xb29C$34 z(GMIrz)LT^#O~d@ak*Rp>$}}<4j(?uo;`brj*g~JpFY93F*qhBrc-`?fBuKw1iUVR zb?erpD5V^Mj#yDqL3VaFhYlSIRMjWq~3JVLFKYu$;A^;b7&;l~h(%8glO1Zr!+l;d7Xu zeT|6NoBYa~diABxf8?3;?cIz2lpLU;zTU6SsZ*!ewrv~G^f0BA*S)<{L_|bGUS8gg z=7tu@?Ck6=nx=h?mn*G^uzdM)KKsmAPNIEeBzHeNgX@0zC!}L1Lpqn?Ts{AO{W*5$ ztl@lPqal?MBSw&sk>M){RSgXdH#X-JS~fwG$utKa_xa76e>WSNyi$r`_uNNv-X40- zUlRP}0XkempC=cSl)smu_m1^7sTS-rJD%t6wsT>AFw?^k}~#*Mh$ZeJpgHh<8dDTfCP z@+N)!_;G4#e`>sSx1j3uN$N^IL%IFlK>~)jzUR9y{z=v8lm7jvs^Y|n%Z~huajV^K z9}1oTD5ZSf@=l*VZOF;9b#-i6@d8_?+`+k>8w}|fLBl8Svpsn@AHMu&&eqi#(m8d? zcQRSmbt_y5z*t|xjRrTMW>l1aLvBVo|C}=p*Vk9RfBG7MyW%SjKb1<}+%zh_`8pt7 ze?BXv?gP*=Gc$Vtw+8E^FO+_|m;8rEQNB0>sjD@vc&?txm4Bol`N!o}@Dv|2boLDrQ{2Al>tAc4DakwQBmAI zYaTJvo&+r-RJRckvxc9Gk5MR71l_02XTtgejCy!F5fT0!JX=?1X!0hLi4o%`GNIs8 zVy6ElERzS&G_9KkM1{p#v(c{Ixc+x5NLu$Xw+y>8WP1Y!-$v5fEev=*6YbhwVes$* ze?%lo<3fo#tY~MxjbU#TGUoQu^lKBwC_NVS$|;iySqt99PL#sA#pTG zd3))z;6+rV{}fpm;M9Py)Y*-|6x)x1f3p^P?H@R6A*R^SszQN4Ddp6FGe6jf|6|Z~ z{fq`2z1ogkEhwdqXdY71|0R@CM>G*Bx!R6gMU-kTmun|YY^?t`=pwRH^YHLWueLW= z0f($s>lqC|M7&l{p{bPR4dsjHp*#KO3&RcFSws2ad0zW{`Ru_*;7N&Tnr8DQf7!iz zcdva#@2q9hLqqw_{tDSAJ>s73$pT}-(+CjLe zE})e18cvhR#Dfn$=-0vW6UWJWfBa#-m^T^szrOSsJ9@!#Zx~)XHAiP$E?4uV&MP1d6g(8>$ONL`0C1lEU1%bA6W3MC9d*dB&GWu3NV* z+Vf=Seb)m{o;*oTP7eF_U7pfB`ndCke}H)bHk)k{@D@MZ8)8OL z3(U4!tpO3d1Fj5Nt=9KM$fPS%rq^POJ1J`YJe)>h*GKyC>4>NR;#s5YnT58UA2$( Tv@5ko00000NkvXXu0mjfOL79H diff --git a/icon/icon-text.svg b/icon/icon-text.svg new file mode 100644 index 0000000..37324f9 --- /dev/null +++ b/icon/icon-text.svg @@ -0,0 +1,98 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + three.cad + + + diff --git a/icon/icon2.svg b/icon/icon2.svg new file mode 100644 index 0000000..d47a08f --- /dev/null +++ b/icon/icon2.svg @@ -0,0 +1,83 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/icon/icon_text.svg b/icon/icon_text.svg new file mode 100644 index 0000000..a91a5ad --- /dev/null +++ b/icon/icon_text.svg @@ -0,0 +1,124 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icon/svg-to-favicon b/icon/svg-to-favicon index ed21669..fea83d8 100755 --- a/icon/svg-to-favicon +++ b/icon/svg-to-favicon @@ -1,19 +1,19 @@ #!/usr/bin/env bash -svg=icon +svg=icon2 size=(16 24 32 64) out="" for i in ${size[@]}; do - inkscape --export-filename="./$svg-$i.png" $svg.svg -w $i -h $i - out+="$svg-$i.png " + inkscape --export-filename="./icon-$i.png" $svg.svg -w $i -h $i + out+="icon-$i.png " done size=(192 512) for i in ${size[@]}; do - inkscape --export-filename="./$svg-$i.png" $svg.svg -w $i -h $i + inkscape --export-filename="./icon-$i.png" $svg.svg -w $i -h $i done convert $out favicon.ico -mv favicon.ico icon-192.png icon-512.png ../dist \ No newline at end of file +mv favicon.ico icon-192.png icon-512.png ../dist diff --git a/icon/svgr_raw/icon_text.svg b/icon/svgr_raw/icon_text.svg new file mode 100644 index 0000000..a91a5ad --- /dev/null +++ b/icon/svgr_raw/icon_text.svg @@ -0,0 +1,124 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icon/svgr_raw/logo.svg b/icon/svgr_raw/logo.svg new file mode 100644 index 0000000..d47a08f --- /dev/null +++ b/icon/svgr_raw/logo.svg @@ -0,0 +1,83 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lib/stats.module.js b/lib/stats.module.js index 79fc7ef..6841caa 100644 --- a/lib/stats.module.js +++ b/lib/stats.module.js @@ -165,4 +165,4 @@ Stats.Panel = function (name, fg, bg) { }; -export default Stats; +export default Stats; \ No newline at end of file diff --git a/src/Scene.js b/src/Scene.js index d905c23..6ec6dda 100644 --- a/src/Scene.js +++ b/src/Scene.js @@ -10,9 +10,15 @@ import { AxesHelper } from './axes' import { TrackballControls } from '../lib/trackball' import CSG from "../lib/three-csg" import { STLExporter } from '../lib/stl' -import Stats from '../lib/stats.module.js'; +let stats +if (process.env.NODE_ENV !== 'production') { + const { default: d } = require('../lib/stats.module.js') + stats = new d(); + document.getElementById('stats').appendChild(stats.dom); +} + window.loader = new THREE.ObjectLoader(); window.STLexp = new STLExporter(); @@ -145,10 +151,13 @@ export class Scene { controls.addEventListener('start', this.render); window.addEventListener('resize', this.render); + if (process.env.NODE_ENV !== 'production') { + this.stats = stats + this.stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom + document.getElementById('stats').appendChild(this.stats.dom); + } + - this.stats = new Stats(); - this.stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom - document.getElementById('stats').appendChild(this.stats.dom); this.hovered = []; @@ -331,7 +340,11 @@ export class Scene { let idx, x, y, ele, pos, dims, matrix; function render() { - this.stats.begin(); + if (process.env.NODE_ENV !== 'production') { + this.stats.begin(); + } + + if (this.resizeCanvas(this.renderer)) { const canvas = this.renderer.domElement; this.camera.left = -canvas.clientWidth / canvas.clientHeight; @@ -366,7 +379,9 @@ function render() { } - this.stats.end(); + if (process.env.NODE_ENV !== 'production') { + this.stats.end(); + } } @@ -374,7 +389,7 @@ function addSketch() { let sketch; - if (this.selected.length == 3 && this.selected.every(e=>e.userData.type == 'selpoint')) { + if (this.selected.length == 3 && this.selected.every(e => e.userData.type == 'selpoint')) { sketch = new Sketch(this) this.obj3d.add(sketch.obj3d) sketch.align( @@ -400,10 +415,4 @@ function addSketch() { return sketch } -window.sc = new Scene(store) -// sc.loadState() - - - -// sc.camera.layers.enable(1) -// rc.layers.set(1) \ No newline at end of file +window.sc = new Scene(store) \ No newline at end of file diff --git a/src/Sketch.js b/src/Sketch.js index 9b3780e..6c4fc38 100644 --- a/src/Sketch.js +++ b/src/Sketch.js @@ -187,7 +187,6 @@ class Sketch { } deactivate() { - console.log('deactivate') window.removeEventListener('keydown', this.onKeyPress) this.canvas.removeEventListener('pointerdown', this.onPick) this.canvas.removeEventListener('pointermove', this.onHover) diff --git a/src/react/app.css b/src/react/app.css index 807aa48..53c7509 100644 --- a/src/react/app.css +++ b/src/react/app.css @@ -53,50 +53,19 @@ body { .btn { cursor: pointer; @apply fill-current - bg-transparent text-gray-200 - hover:bg-gray-500 hover:text-gray-200; + bg-transparent hover:bg-gray-600; } -.active-btn { - cursor: pointer; - @apply fill-current - bg-green-400 text-gray-200 -} - - .btn-green { cursor: pointer; @apply fill-current - bg-transparent text-gray-200 - hover:bg-transparent hover:text-green-400; + bg-transparent text-gray-200 + hover:text-green-400; } -.tooltip { - position: fixed; - display: block; - background-color: black; - color: #fff; - text-align: center; - border-radius: 4px; - padding: 4px; - visibility: hidden; - border: solid 1px white; - -} - -.arrow { - position: absolute; - bottom: 100%; - left: 50%; - margin-left: -6px; - border: solid 6px transparent; - border-bottom-color: white; - border-top: none; -} - input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; @@ -112,5 +81,17 @@ input[type=number] { text-align:right; } -/* input:focus[type=number] { */ -/* } */ +.arrow { + position: absolute; + bottom: 100%; + left: 50%; + margin-left: -6px; + border: solid 6px transparent; + border-bottom-color: #3F3F46; + border-top: none; + +} + +.drop-down-top { + top: calc(var(--topNavH) + 6px); +} diff --git a/src/react/app.jsx b/src/react/app.jsx index 09b0cd3..5212cb9 100644 --- a/src/react/app.jsx +++ b/src/react/app.jsx @@ -4,7 +4,6 @@ import React from 'react' import { createStore, applyMiddleware } from 'redux' import { Provider } from 'react-redux' import { reducer } from './reducer' -// import logger from 'redux-logger' import { Tree } from './tree' import { NavBar } from './navBar' diff --git a/src/react/dialog.jsx b/src/react/dialog.jsx index 7ff8c26..42dcc8d 100644 --- a/src/react/dialog.jsx +++ b/src/react/dialog.jsx @@ -35,9 +35,15 @@ export const Dialog = () => { sc.render() } + const extrudeCancel = () => { + if (sc.activeSketch == dialog.target) { // if extrude dialog launched from sketch mode we set dialog back to the sketch dialog + dispatch({ type: 'set-dialog', action: 'sketch' }) + } else { + dispatch({ type: "clear-dialog" }) + } + } + const extrudeEdit = () => { - - dialog.target.userData.featureInfo[1] = ref.current.value sc.refreshNode(dialog.target.name, treeEntries) @@ -48,83 +54,83 @@ export const Dialog = () => { sc.render() } + const extrudeEditCancel = () => dispatch({ type: "clear-dialog" }) + + const sketchDone = () => { + if (sc.activeSketch.hasChanged + || sc.activeSketch.idOnActivate != id + || sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id + ) { + sc.refreshNode(sc.activeSketch.obj3d.name, treeEntries) + + dispatch({ type: 'set-modified', status: true }) + } + + dispatch({ type: 'finish-sketch' }) + + sc.activeSketch.deactivate() + sc.render() + dispatch({ type: "clear-dialog" }) + } + + const sketchCancel = () => { + if (sc.activeSketch.hasChanged + || sc.activeSketch.idOnActivate != id + || sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id + ) { + if (sc.newSketch) { + dispatch({ type: 'delete-node', id: sc.activeSketch.obj3d.name }) + sc.sid -= 1 + } else { + dispatch({ type: "restore-sketch" }) + } + } + + dispatch({ type: 'finish-sketch' }) + + sc.activeSketch.deactivate() + sc.render() + dispatch({ type: "clear-dialog" }) + } switch (dialog.action) { case 'extrude': return <> - - + ref.current.value *= -1} /> - { - if (sc.activeSketch == dialog.target) { // if extrude dialog launched from sketch mode we set dialog back to the sketch dialog - dispatch({ type: 'set-dialog', action: 'sketch' }) - } else { - dispatch({ type: "clear-dialog" }) - } - }} + case 'extrude-edit': return <> - - + ref.current.value *= -1} /> - dispatch({ type: "clear-dialog" })} + case 'sketch': return <> { - if (sc.activeSketch.hasChanged - || sc.activeSketch.idOnActivate != id - || sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id - ) { - sc.refreshNode(sc.activeSketch.obj3d.name, treeEntries) - - dispatch({ type: 'set-modified', status: true }) - } - - dispatch({ type: 'finish-sketch' }) - - sc.activeSketch.deactivate() - sc.render() - dispatch({ type: "clear-dialog" }) - }} + className="btn w-auto h-full p-3.5 text-green-500" + onClick={sketchDone} /> - { - if (sc.activeSketch.hasChanged - || sc.activeSketch.idOnActivate != id - || sc.activeSketch.c_idOnActivate != sc.activeSketch.c_id - ) { - if (sc.newSketch) { - dispatch({ type: 'delete-node', id: sc.activeSketch.obj3d.name }) - sc.sid -= 1 - } else { - dispatch({ type: "restore-sketch" }) - } - } - - dispatch({ type: 'finish-sketch' }) - - sc.activeSketch.deactivate() - sc.render() - dispatch({ type: "clear-dialog" }) - }} + default: diff --git a/src/react/dropDown.jsx b/src/react/dropDown.jsx new file mode 100644 index 0000000..e7409ea --- /dev/null +++ b/src/react/dropDown.jsx @@ -0,0 +1,75 @@ + +import React, { useState } from 'react'; + +import { useDispatch, useSelector } from 'react-redux' + + +export const DropDown = () => { + const arr = [ + ['https://raw.githubusercontent.com/twpride/threeCAD/master/example_parts/test2.json', 'test2'], + ['https://raw.githubusercontent.com/twpride/threeCAD/master/example_parts/test2.json', 'test2'], + ['https://raw.githubusercontent.com/twpride/threeCAD/master/example_parts/test2.json', 'test2'], + ['https://raw.githubusercontent.com/twpride/threeCAD/master/example_parts/test2.json', 'test2'], + ] + + const dispatch = useDispatch() + const [open, setOpen] = useState(false) + + const handleOutsideClick = (ev) => { + /* + this handles inside click as well due to bubbling, + sets the open/close state of drop down + */ + setOpen(state => !state) // handle click on button & dropdown, always a toggle + + document.addEventListener( // handles click outside dropdown & button + 'pointerdown', + (e) => { + !e.path.includes(ev.target.parentNode) && setOpen(false) + } + , + { capture: true, once: true } // capture phase to allow for stopPropogation on others + ) + + } + + const handleInsideClick = (e) => { + // handles click inside dropdown, business logic here + const idx = Array.prototype.indexOf.call(e.target.parentNode.children, e.target) + if (idx !== -1) { + console.log(idx) + fetch(arr[idx][0]) + .then(res => res.text()) + .then(text => { + dispatch({ type: 'restore-state', state: sc.loadState(text) }) + fileHandle.name = 'something' + console.log(fileHandle.name) + sc.render() + }) + } + } + const fileHandle = useSelector(state => state.ui.fileHandle) + return
+
+ Demo Parts +
+ { + open && +
+ {arr.map(([url, name], idx) => ( +
+ {name} +
+ ))} +
+
+ } +
+} \ No newline at end of file diff --git a/src/react/fileHelpers.js b/src/react/fileHelpers.js index e0fa7ac..32ece26 100644 --- a/src/react/fileHelpers.js +++ b/src/react/fileHelpers.js @@ -110,8 +110,6 @@ export async function openFile(dispatch) { dispatch({ type: 'restore-state', state: sc.loadState(text) }) dispatch({ type: 'set-file-handle', fileHandle }) - // app.setFocus(true); - } catch (ex) { const msg = `An error occured reading ${fileHandle}`; console.error(msg, ex); diff --git a/src/react/icons.jsx b/src/react/icons.jsx index 988281e..dce9f84 100644 --- a/src/react/icons.jsx +++ b/src/react/icons.jsx @@ -289,6 +289,40 @@ function Horizontal(props) { ); } +function Icon_text(props) { + return ( + + + + + + + + + + + + ); +} + function Intersect(props) { return ( + + + + + ); +} + function Stl(props) { return ( ); } -export { Arc, Coincident, Dimension, Extrude, Extrude_master, Flip, Horizontal, Intersect, Intersect_thin, Line, Stl, Subtract, Tangent, Union, Union_thin, Vertical }; \ No newline at end of file +export { Arc, Coincident, Dimension, Extrude, Extrude_master, Flip, Horizontal, Icon_text, Intersect, Intersect_thin, Line, Logo, Stl, Subtract, Tangent, Union, Union_thin, Vertical }; \ No newline at end of file diff --git a/src/react/navBar.jsx b/src/react/navBar.jsx index b1a0e3a..25f7ce2 100644 --- a/src/react/navBar.jsx +++ b/src/react/navBar.jsx @@ -1,6 +1,6 @@ -import React, { useEffect, useReducer } from 'react'; +import React, { useEffect, useReducer, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux' @@ -9,6 +9,7 @@ import { MdSave, MdFolder, MdInsertDriveFile } from 'react-icons/md' import * as Icon from "./icons"; import { Dialog } from './dialog' +import { DropDown } from './dropDown' import { STLExport, saveFile, openFile, verifyPermission } from './fileHelpers' export const NavBar = () => { @@ -103,14 +104,14 @@ export const NavBar = () => { [Icon.Extrude, () => { dispatch({ type: 'set-dialog', action: 'extrude', target: sc.activeSketch }) - }, 'Extrude [e]'], - [Icon.Dimension, () => sc.activeSketch.command('d'), 'Dimension [D]'], - [Icon.Line, () => sc.activeSketch.command('l'), 'Line [L]'], - [Icon.Arc, () => sc.activeSketch.command('a'), 'Arc [A]'], - [Icon.Coincident, () => sc.activeSketch.command('c'), 'Coincident [C]'], - [Icon.Vertical, () => sc.activeSketch.command('v'), 'Vertical [V]'], - [Icon.Horizontal, () => sc.activeSketch.command('h'), 'Horizontal [H]'], - [Icon.Tangent, () => sc.activeSketch.command('t'), 'Tangent [T]'], + }, 'Extrude'], + [Icon.Dimension, () => sc.activeSketch.command('d'), 'Dimension (D)'], + [Icon.Line, () => sc.activeSketch.command('l'), 'Line (L)'], + [Icon.Arc, () => sc.activeSketch.command('a'), 'Arc (A)'], + [Icon.Coincident, () => sc.activeSketch.command('c'), 'Coincident (C)'], + [Icon.Vertical, () => sc.activeSketch.command('v'), 'Vertical (V)'], + [Icon.Horizontal, () => sc.activeSketch.command('h'), 'Horizontal (H)'], + [Icon.Tangent, () => sc.activeSketch.command('t'), 'Tangent (T)'], [MdSave, async () => { if (await verifyPermission(fileHandle) === false) return @@ -166,28 +167,35 @@ export const NavBar = () => { const [_, forceUpdate] = useReducer(x => x + 1, 0); - return
+ return
-
- + {/*
*/} +
+
+ + three.cad +
+
+ +
-
- { - sketchActive ? - sketchModeButtons.map(([Icon, fcn, txt, shortcut], idx) => ( - - )) - : - partModeButtons.map(([Icon, fcn, txt, shortcut], idx) => ( - - )) +
+ {sketchActive ? + sketchModeButtons.map(([Icon, fcn, txt], idx) => ( + + )) + : + partModeButtons.map(([Icon, fcn, txt], idx) => ( + + )) }
-
+
+ @@ -200,3 +208,6 @@ export const NavBar = () => { } + + + diff --git a/src/react/toolTip copy.jsx b/src/react/toolTip copy.jsx new file mode 100644 index 0000000..1425a22 --- /dev/null +++ b/src/react/toolTip copy.jsx @@ -0,0 +1,78 @@ +import React, { useEffect, useRef, useState } from 'react'; + +export const ToolTip = () => { + /** + * Fires when new element is mouseovered, checks if it has a tooltip attribute + * If it does, updates and unhides tooltip element after a preset timeout. + * The timout is reset if user moves off of the tooltipped element + * + * Unfortunately, new mouseover fires for svg children, which clears the + * tooltip state. We add hacky lines labelled svg workaround to bubbleup / ignore + * svg children mouseovers. We use prevTooltip ref check if new svg + * child mouseover is novel. If it's not, we ignore the event + */ + + const [text, setText] = useState(null) + + const ref = useRef() + + const activated = useRef(false) + const timeout = useRef(null) + + const prevTooltip = useRef(null) // svg workaround + + useEffect(() => { + + const svgChildren = ['path', 'g', 'rect', 'circle']; // svg workaround + + document.addEventListener('mouseover', (e) => { + let node = e.target; + + while (svgChildren.includes(node.nodeName)) { // svg workaround + node = node.parentElement // svg workaround + } // svg workaround + + const tooltip = node.getAttribute("tooltip") + + if (tooltip == prevTooltip.current) return // svg workaround + prevTooltip.current = tooltip // svg workaround + + clearTimeout(timeout.current) + if (tooltip) { + let { left, top, width, height } = node.getBoundingClientRect() + left = left + width / 2 - getTextWidth(tooltip) / 2 - 4 // 4 is padding + top = top + height + 6 // 6 is arrow height/width + setText(tooltip) + if (activated.current) { + ref.current.setAttribute('style', `left:${left}px; top:${top}px; visibility:visible`) + } else { + timeout.current = setTimeout(() => { + ref.current.setAttribute('style', `left:${left}px; top:${top}px; visibility:visible`) + activated.current = true + }, 1000); + } + } else { + ref.current.setAttribute('style', `visibility:hidden`) + activated.current = false + } + }) + }, []) + + + return
+ {text} +
+
+ +} + + +function getTextWidth(text, font = "16px sans-serif") { + // https://stackoverflow.com/a/21015393 + // re-use canvas object for better performance + let canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas")); + let context = canvas.getContext("2d"); + context.font = font; + let metrics = context.measureText(text); + return metrics.width; +} diff --git a/src/react/toolTip.jsx b/src/react/toolTip.jsx index 5620d8f..a332765 100644 --- a/src/react/toolTip.jsx +++ b/src/react/toolTip.jsx @@ -19,7 +19,7 @@ export const ToolTip = () => { const activated = useRef(false) const timeout = useRef(null) - const prevTooltip = useRef(null) // svg workaround + // const prevTooltip = useRef(null) // svg workaround useEffect(() => { @@ -34,8 +34,9 @@ export const ToolTip = () => { const tooltip = node.getAttribute("tooltip") - if (tooltip == prevTooltip.current) return // svg workaround - prevTooltip.current = tooltip // svg workaround + // console.log(tooltip, prevTooltip.current) + // if (tooltip == prevTooltip.current) return // svg workaround + // prevTooltip.current = tooltip // svg workaround clearTimeout(timeout.current) if (tooltip) { @@ -49,7 +50,7 @@ export const ToolTip = () => { timeout.current = setTimeout(() => { ref.current.setAttribute('style', `left:${left}px; top:${top}px; visibility:visible`) activated.current = true - }, 1000); + }, 700); } } else { ref.current.setAttribute('style', `visibility:hidden`) @@ -59,7 +60,7 @@ export const ToolTip = () => { }, []) - return
+ return
{text}
diff --git a/src/react/tree.jsx b/src/react/tree.jsx index fc83c29..e29ddfa 100644 --- a/src/react/tree.jsx +++ b/src/react/tree.jsx @@ -50,7 +50,7 @@ const TreeEntry = ({ entId }) => { const [_, forceUpdate] = useReducer(x => x + 1, 0); const [mouseOn, setMouseOn] = useState(false) - return
{ if (obj3d.userData.type == 'sketch') { if (sc.activeSketch) { @@ -71,7 +71,6 @@ const TreeEntry = ({ entId }) => { } }} - onPointerEnter={() => { if (mouseOn) return setMouseOn(true) @@ -112,9 +111,13 @@ const TreeEntry = ({ entId }) => { } sc.render() }} + + tooltip= {obj3d.name[0] !='(' && "double click to edit"} + // tooltip= {obj3d.userData.name} + > -
+
{entId}
diff --git a/tailwind.config.js b/tailwind.config.js index e4a6284..5e98c0e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -13,6 +13,7 @@ module.exports = { current: 'currentColor', gray: colors.trueGray, green: colors.emerald, + red: colors.red, } }, variants: {