Last active
April 19, 2024 21:22
-
-
Save Joshix-1/9e1c3481562a2873a94d12c1548dcc67 to your computer and use it in GitHub Desktop.
Revisions
-
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 8 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,8 @@ exec(__import__('zlib').decompress(__import__('base64').b85decode('c-p<YeG`JplBfB9e~QB>9?<rVC~r0@f+)TKf}$wVAt0cjA_|BI>Stf?o$j5OjlQ$75ogvgG|H+%C^CQfB#@4K_~Qv3{`C(V{<nYm<M%p5VerSzO1z7||HBV%VU+wK|C;~kgl>QQTlXJL=m5iiyIGNYP5u^~9Y2CF1o_uL{{DvlG4%GgXXGcYv416Q4B7C%JfT06*Ufc|IEh><`0s|{U;V@|{&su)`LBQM|C^h+HuU@PAAe~W(4YBl5B`Mz=D2nk+#)xQ|Cipq6}ve4>)(^u--kFZ^rv0FBJbG;&`3N?mCTQHdQL|5m(%CyXi9;v=BPHPfxIp1S_Kjs+nJdNwss<?xz?|)a4E(*Abo%DDg>4`?@)7omgGHm#!Ga4%1Bs+H14nJ3<Pkp()nWYeSqUBkMryRfzxHF@g-PJ-W&GHI6ijEcUQJ%>s>Av+ej=A*B@yLO@<GXs8a(js#@KRSu3RvjIn|{!RWi~wM#xW*W)LdFW_;rO-^CE+V-n<dY-N`wNY)-sN2iwHC3H0mzF<1w{LPufA$hsy|WEW7}ip!ciIk<n)T}HUvYlUpsgxg85yfcgpKe5RI3hFLIZutbR+%~hT;GAU!9l0@~?mKdAZG7^BD+onC7~Z2W;cgg?3-*hGJ;odY{@BZ8_7UL>aZV^d|6o52OpLUUDY#li!GqqlPtmY!*mEQbvXdBr13VMwgD<wRy2zV?B8dg=-}kqA9?E$pn;-o%+*JLb~TE>t)YYob%$6U}<Q^<)~X5rReFIT!%$ze|?Id@#U<~R(cFEgH=_!JXYVgyFOcsN%rX7cno_I>{7V{;G?^!3>arCRCez2(yu&`53qs1=Swgw;nQ6a!-DP4kMHFgc6h_p@b;tmtT-n|d786)-I>%hI~^~T_JmHW!&B?n#h(e`CG!U`_2YW6=^$@)v>&q5^j6k(9Whgzs}+@sj8>x`(?-%&HS)9?eF%-(^2NSNpkkXJy`0InnI<dqRrJvy-47eywovNV`lWJP(#ORnDA2B@v`;$>yGNQotnAv{TDzEd$+--{wlB(aSKC&V*&3LyYB^0v68DK{Ww$RK7>%9`I*%%~eYxgzk1=LnR0d}RKSO-K7;LcPeFRK*P5|yjNSYC?QH3?{Uc98ggZ6c;Jy0M0)>m8|ACIVF)i+E0xp{l8k00$~Y3s1L9)^Ka%C<&mtb@0I`2-zQ>vOlVyz5MsOx^{_iWN6WbQLrn=#)=ATSBY$6PY}k%LAz4D+xF!sXKc?#W@cVd~1-K-rTbaVsr3W|7w%RchXCSv*CxWL>D=b4v30#NH(_T;FqGQ<r6CpmShDL4>+mmes(PEPPt)*`eH;M(XaaCjt%fQtHq^R={O>R5~q)%<075}ih04sdwaax^KqvNS(MH1>~NC@=kUaLf*|~|)Aiv6%((Y3?MPuo4OGpYJ|?T{qFEhb$i{m&DscOJeZ97in$`!&&ncYopf`K>EBRsZ&O7@d5VszWapqGnRhdbStM<HP74a9FXZNe(A}&@-PqM`7QNvR&9-E#65wUJ{$kvJM3*>J80Mj-%F|l-UO6rr4*{Zc6H`o!MT;b(((5pmOy}9qkll$)BiT9~dEw!Pb0Q2_=IY}E!N-@isrOZr^%e!_WbyvSd0~o?V+p;jGhc12)_uz2Z;ZbBp&Q=xP%{NqOYFhZ5^B)_dlS3PL`Cjq(NTIT`6ZP85Zx4%6qVf$N@1fb>81`sf^(%;_EL6c>>MKY-aTZ^%*r^__-tLRlPiO!)b_-)!lbwv-dUbUt3S5Juy4?5@b;u}95}+}_YF};$Y(DMvQGO5m5w=u<7*D7cpOWasK35K-KvPC_qXQa?Ng<p2bhxlP)Z)6Z@8!L1SM=s_TbGjsb^GM+$?>wel=yn<Td&rrKHDp5tI#doNfBajI``%)_|W+#;deOG`*GXqY+HJDJU76)s+n7}C7;l{u;}E7b<Em1G6aP8tD&o&GDs;b?pwWeahT6e4P%!tuGupSjo`YUmTWD0PU7&=pFEKw>XdZqU2!7HD}x<Qp)j7=EC3yUe2{+enT4vv37zmNGrP*nIZ*Z9?WzS%HA{**A2Glgyw57!ZOgVfiuW{`Yd{2T3(sY1wc-#+{`4A=_B^ZGxv7|{mLb4T+y)<W*XyL>2QGhJ4+cEd4nV%l@=UBX;rcrl%VWZCPeO!^k7U&xz6wH?{L<lW;0qPq_NH;UH$_0D!V@z?Z(Mm(dzvPEJ$7p9R*lP}+3qrcMe2N67O{Z03=7q$eJ>smUKP<BIIh?5$)fhK?WrIX#&t5AYQPvBW7k_(^!CosY)r~;p?H^Qx=X-AQ*NKUpC;wzi!jky^H!1B=d^SVV01rzv?t37u+7q+yzQOc@%Cy(;%8AimEp$aNDcp4H2g74WF>xhH6Dq7iT~QD7;vgqh#`L6!B2{B1<G#qikJKyb1%>1JmnLoJ*?wattp|mD&a^g?t~T*w^hZ~B>zrucv3m?CM|U0D*DDYAD?mu%TvseCLz?g#^EtxUmlnIZ0Hd<4msEuHNPiLRPSnN_VT?LSDyV&Z*0iTMRMAV#IXt9cV_(>t$gXadpNz}@!TKSffqVi@s;t$0~(z44FKB_#HG@<tzr)8vq{p=hg@2@8`{`FxmKa-r0Y8D3WKX-ycm7jPWBmBSdob7Y6XZ2<frU;>2_kFWAFs?hdf?5wV_<ARb~Wp_H<-Vukhv2&TGd;3ya?c(>}Y0E@aQe;DN-IV;S8C>yKOR>iF{(-U}PvyqNNQmhH*-tyNE|-5K!r8+mOd!{V4*;-xL`q&!ovhv9f!&4fgMA?kWC;C`XeT_gEyc9rY<k>v&@6N7WjFkUfN2+q@*w+G`6Ds~LAx$^o4qA5Q~59Ad8BbCLkSj3&L*YJViz0?{Ug2mFy9#`F6_39(M_jZN@^WGdp6Y}+_s6|UC++v)M5RF}vhZPjG`R}Mmo!5&ZhOK(fxLxLgVz6enF&WFX(zn49tBY?Rfn&0}J)x@K{D4=2Oly<{oJ?_9dk!?{$)I~zb9h2p-`U0E#CX+yZ@BMZLr!|0@R^`z9S0Du{9({X*7N%_%^_}8?Z)M4QElCVO{L9)<w10{j&r<PQktkP3}x}L`pA0A9x2-ydz_V1`c$orZ=N}Cj&Edk80FSUSr-Fou@?G8ac%;{_qw96o?(||0vYQRIM=!a*T`<yqjy+t<QmfIv6c1oJk4JEymTM2ZTxY7pPT^7V5Kc@pROR(N5o}Zl|&fsUzJ8+%Dz!4+k-~X6O}hyyDb``!pt2HZ>y*FdJ~8hfV1Wx4tmg7K)K9~L}#^~z4}ujdzRDEIHu5~Rcg0R&jABoUBZ6?&~e*!D<ot%<ytaPrTHtpN;%k`%r+;+&+>71(>+JJK`QO0)Jp<ny2XqBpfO)hrkD^-Aa63N-;^%?t*@7;nCW_6IIbXR&5W|n;#dWT?&h{GMq922Bg@79(#o&k@HH4W9?r1AtjsWoY^KTS6I$7i&1^&DcCD3^qhmwCNA+cAM>vyFI&XKw5(Wx-^Dt_jcs)zAN>V|nPR?>(^O7yX?h6FnX1^DgPy>AJSgd*Mj}r0xJaz*S3^N4YX31-RnCpU<+gp1D%o@Hn6MUgI4J(iKflP+Oo`#;N{blQ1J^r;jwui>t?ExgSsXx>rdE94puv$5(8=-(kP=m)ZN;rVFYAllJZXMD=_C?Dp`~t?C(GhcqbKle@suo@9?2Is#R#A<1K4ivPRz}vZt{_}{<L#rgq0wTZW%;cQ8}Oo=bl`VuDwQ6~+Y`JViGoJ4a3Fom;H8wZ#~50#wbgc^hleXaY*5GLW{g50g-wU*rUduqTRUK}!L<nGci|yhVS!Y4d&pRHgOI6*UUwQW1dM6d!Ng+9sw<=Krr5r`F%W73=Al~>?bFFbJ-;T=uxdb{t(iiT0^N7<MY7@S-deWHrvm7}-%NC>1s^8E<Eo=W<#72pl56@7Q}XeZkb@RGeV(9h(Vo@|rW5suDTUXZ0zJ%{jV{O?N)_YG_8yC{Npr>l>)sL~T8^gc=?!S$a;XC3IKU`?pV=wZNuSAJHV(mOWf(H>GsL}J^%~F}g-7(KW^9PWEEajQMv@PsHF)d+x4&7Z)SzROia{kbS4DsJFcp5Nkrwb_HOo;ca{81<Q*-mJIF7O|mEH0$<vPBL7O1oqO(DwfrKwXcfmp+#!1}GTrI+lrLDWv?jUEJtnemJ!Swu_R;BawnMSXRpF?SQ!(lg=Ryxsl+BE)^fjQ5XT$E1`|P-}iGQ8~o4u*2TS6CYB<WPM3Bt0*N0_3Ms4Ytvb4!}Vg?i;<3<Hmmj+(&p)NQ4GclwK8{ByW<EXr^257MX>5LDY<c~?h(pdOXPVtzVD1*4s@H|!k8y|Etxv$<<{gU&zk+I2gwCLX_om8U)~0CsC9;oJ(#SxjZE@)*0+6d6UPC}b}}uE#-*ftR9_?eu?^dNBsQ8~esWSaMiZE@J5?B3gU_@vD$W;VI$dpH>9xrF4rsW-H!26W<bFQWGquq?bzG`FoQt+*qx9(*YRgt*H_CzG=+hMWDD|*^1{@bFe;Eh=;{FGEgwbCN9n`qy$0rGsPkFCsG+zhQm|Qk1H!?|4nxnF-;HH=N(qXfv^hQvutXd=qK+*Kx0X%KEKzI9zbI#%I>Hev~-xB1=u;=#`g-k|~kS!|gw>2$EwE#OWsaDgln@HDb0O!Vj`64E#!8z6JXjB4k_g7<w0MpsFp4PNSiDBwbUcB#R=HlHiFW~u=#0UC)>)>WQZ@5vLLfg5=2XUQnX61SF-LTDB`?*L~P*pT<zP4j~G~d5454}#v?x^#XrqEJ_=Hy+lKN4Hiv02Vv23@ZEm|X|%D1+!Rf=scP)gX`w9fR@Rx=Ff1zW!-13X1?Ae;gD&9P9A=;-7Y=ySn3Gf@Tk~xAo}m?CpIeDAuprGG1O)*xs%g)z-65K(mUjMCkPbTDm*Q`0c*aN;TA<M_FIk@vQ!OJa)~>OM=aMl6LxL3u?nAa$l2MNyuE1s+2pYTZ<tt=b3ND?WM}4$I!9f_noA@Hx7U5;rhVpRd*x5S#zNo^FDWH?&mkwc%eiVA@h=PUkIIX+n*M!F>#+_8|yYg&pxGXQ_inl#J$0&=K2$FhQjw;+Ksh6E#l%+@5RBu@nN=p@h3r%?knA?P9XjAtX>DLjwNNKbS#tE8?lYfd?=E<DZt6$W|HmdYFF6~Dy0YY;(pmOWNxjzHP&Jl+u*yPo65UZiN@Y(yGJ}v%;b3-oj)%<wJNu;TPh2F4Lq%6(;V{n<QMyn*)!(KliT+0kLPpxqpQqm7f=QI$tNevb04PNq@4*u&wFJ`mB^}vS1v~w-fqr#zq>ml)w6w@ZM5dX*oec;=XP$4D?Op8c2}HMVI!+JknvCR8;fu0fTvM&E60_M_0Rk=a1-l49P!UT|BL>=xBgmB4PW(2b1YFPIlfi*9>ch9QrFQc_R2RL5%>5s!|JBLtxeZ>+Pfn6K`KodVHwVBMm6?B_!!{q!d!*w9hzK;>i0Fq)9r5OPV?LsI#&-^OBLlUQ)3cH-BfI7RXc2PR)2E|y}G^<R<n8vQw?SpWb=K6(iWYO$B0Z2H6*iWS4bnQA=Ga5Y=68-g<ZnQOYYQ|#dFm&B(J&2jt#fGcqlZrRDEDf2E&2tIUc!UmBp|P`X{3$kce9bmk45QLecDkS9{+gSq8?h0@2y?wQ;+*@663d4c&coe#`IE_^!Y_S}EQ)8R9iQ*W)Wl087BUno-wUZ$o#S19v*6r5d_%+4;BoGw)`IrSmii{8sbbr6ypI$F$$4;B^KAE-$q*aN3$AlmOlzEh#b2=9ukE{HWdsuvZP^nEX}7u+k^c&{6iLTLIIDoRT>k(K4$WcmlWXr;_`9O!@ur#g{Q76Z!luyX$n>g=5<5L(_zfC1m*h&P<4Y+@ZYW0ZL_5so&_sqzAQXrNQB2)BBQo?5^Q;e{(po`#XY=Oxtb62kb6$4{q$QullL6v-dn(&8+KbrvKQ}YIPb=`a`xwuZ%x0r^99*v!b#2j#hJFXEMfU98@PWy=lNXX4~6Y=e(MAN7Ug(!FRgBHdc4#5f6^#b^)AvQj}>~6&SwX=@(#vb(djZQBi+ac=*D;*t2A9qofaog1Pz@?wf90Un4W?;h#-sx*5di@`@w?uZ?cQQj7;PO}q7Tv6<9~ZnV#s8tlL5d?D%ke29U-;1RqGeV^v<=-69$JKbyEzX_jXI2wLx^Ib5%*aC=%l@}ZCA&4l4rt6Df*Dfvcwr1DPihgX(dhx)VS=%J9VqE|v)<m{IN(djv<0xBXtJRc|CvUWT-8&P=6iE#cxnSLxX(uPU#oeT83Dd@^-kuf9IaSf<@|Y;aCJkgdp-#MIA78;B1?kJH!=Aida6VtlY%|Bs^}|x!AC|_l+ijQQ2i~qlceqxi=l-MOErDQpn+qnb24sgLK%1kYb%U7Unj@(uFl`XpU?5BL?4i>JTKA>Oh^ff@TKH$`^K1Fn<6kQ;gPZI>sSf_2YNOXFZDn`leTAb6L1r9MAxq(Ti=pR@rQ9`kM!7+MYL>A}AwBzKn+wDB;WfS!%(Pd^8{Mh3nB1BJuf!>aa-^g%X;mbFR^3}q&XHTQZvoi`Yl<J-DyJ6)F$M!Wexl3Us;o^KJFtDv*AeGI>24nF#{6+Pbdxe`f5yKpJ$$xT*S7<^Xl&GG9Wm=?MuWspo!&vcg#ED4v)as^7VspR9Ki|;Io4<QQ>*gTi`k+i7W8-_9Q*#wCO)@q`|5i7BEF1HYi@Hj&TjL#@m`LyKh$+jT)k>{Qp$1&uQuO@1~MEzb+u%d#w!c(%=6|DG_AP2eeLV(>OVVI|0gaKk*nsAKjPOakXGJoXJ2pl$82+1bPt4(Q1S4!?m)GrU+%Jab)^lkdiA{;44Gom5+TA(saB`EWt=%Nde-cSK?)mPnV!l$*S0C8OUYFqY*@jTbIApRQe~`7A+BvjD$&qR;q8M<jXn|cmR#!SW>rDAMx#HN0#k6uji+CI-&z@WJ}idXMHkmtwKyX?T@snS#$B`MUe|Z)gr8KqTxXfFo$`8%)-L_d#P#2U+m=JK9@l?p+#P-^@r<C>)i^%~m2T(l;Y5{!0yb|8jyj|b_EnFn$9M(+LdBy!V9`a@x>cUZ_Z1<_^aQQF@BRMwv9L@Unoq%qDernRx~z6g`o^0~deBZu1$ruj1Nkn`a3xV-6u^Si$e=ejMC{R`weBy;Meq6Sm*OQPYmTrYh><<~dUu0RF6-%o%9S>TUFJsAp$&QEALkVujHpf-KJ{RC8-%TB9^UrPt)*y&4I&-Bxv4vCt1#^D#En(EPZ-NbxB2R%dfADr+FssU=HYHJ{a|*2C8Ae355*3CFf3e`8<$vRcc2~}!D_zNqE_-=^rH#kPDj?E>>xh**ryo@zvR+G#5r4f@%C}s^Lte!?T?n<?8aV(3qvrX_nAp9?qH*y2*uQ*7X#P*Slp3O^~rYyIpMa%9=^?{<6q9*KiX#2@326>w(U;rP8Y)U@B69*3KAjQs>fga`M$KBm%E!*=R1mG@w?38N0ZkRK^acDm7D$|@vB<p-omw3or=2Po364V<`5Vh!iziRMjt0(?vL)tU6qKDmRoYya4agwilRJOMal&HI<o~X6X|g{)#2^31!rTqX$_oxh4&xb2}3A_x|jZm6S|r0-u`~s_Af@V{dQCatCyBJ+f0Q8X!o16nVq{Sy=;lB*)H_f!utX9O?Uw4qJM_T@1VKLoBLU59GLCH;7Q+ygBO;O&{!zY^qtW08_qkrhO9V;K_zqT)Gm=moa=F}thb+Mx0FvykWf>7wq!T@+>kvwAMW8jZX3Tcj;Kp>t4ff#O%$+;p@rWvjz;gFEXv_=wf_&SiS<iswZ;o2$y3d~1E2mO<JHmDe7URJi^6Ztj2n3J^wWMa9qBqU!VwZZVq}IjzNc|!Tw|zEl0^z1FZ}H`LB6)0Jx8Iy7v(N<DW(mE=@zfBetlV;OLgsh=4I>+)uHaqhXqCY3^qrm<D|)R<2GHLtJ|l`y1(`I_}WMk@YbLke)Uwl$!8z&^yc9CaQk%H|IYh&P~AdpuYK(?15kdoPasH8We^#$Qg0m(wbrvffbft4OsD$D2x;s#M#=VmPv+qc!z`^#3HR(e4~;xgo}+QsSw+rG5}(zMs2@($zE(E|WUin`5kK&VcV=e}<|S<(L#)Lw;9gE`d`_NDKlB=W)CScR0HWX48`*do8&3=Sa)jazO7bSOMukAZdHwMKw2{7ls43su9|26FT93yqLax*hLWf6giHO~GzbSRv2Gir%U1!^ozGA@*c9h!6<oq)V`!KH=;C>KljUo%=XT1=*C;7Q_JI_@}Rw}3NA&tb+emFqu2T|%R2waF55Bf&orP<8@e)`^-C1{KDrIP!uxGi3Jro#AD!F&A=wvOX$P-;=*(n;uYH>bXYuFf_if2_ktEtRs(b6@xLCmP%Qu>Eaw{oMEWm&~8Y-nBQl%?@OzX`(8IV&~mIG2;L6WmtRrFHW|8!0DEsn6`dzy5Y9s8v6T|zc$@ECG~r}2W*a+nkw$2FQ#vDV@B_%@VIr)YdvUAxeX@v8E)CUeh-&Yp|6@3q05-tA$rQ(g}m+?ucP1p{<uHr3iV(LJCpIS@lNcE)ZiEIv-=)!KH^Hp)|OJ&;OgGo?3z`HUxj|JM|2;m)98~$(IKzE5NnO)_&aS1*E4xhoc{ZilRlanuLJ2`o$@2dQu#VZfKfp)-^{dy3*7_OR=*=o<%!;E_iLSDN<-G>*bq-$MQ3uIhK%j`LC)H3#S?AeRm{<=5t^qGJ&otr#pbphN9E*(s8QaQV{&fI$M07X<igW)^Fd&*hJ(IMJWIXi;>ji%dBD-tYD^>JB-=iN#JFJaWK(4tvst~5?LZo3=g&&E-p_GkZ%qKS{loU}e7k(d9$s$=&x~Q~)dhr%IptEGPUgVap~3~2r<d3op}H{Rgz{olxrNJvQe*u6P^$O)NR5@a!7aa9w}W&6n=`CuG^5;J&!@#=7+tVqm+7<egaWSKFfTsEhbH6%y0J{)xKE_qadtlPjy}x7#hFyyba93DnyObYV0Ev_zMKP7q6d_K<3XFGX*@gU(IMW787xcXNPQ@5B~cN?Qxh_NeAj|*dG9#mnWx2Z>vsuNdnesILmv0;IOl@kF51Hui0w%03*tzh!{bY96K_yOpZ7};QQwpym4?N!vm2qHo+9v5+^gobei>it495I&K#zuM=5lk_6%{I3^~n<Loo*sAsyBrF>b*<tb2=Nn)Jx5(dya@3V81gs=sCwK#`GMhs?!5uEoNsmDTrvIoAg6)@f@n8IH}d0h<Sf1F*KNU_mj~Fz1b&uavOSp!6;rmoCW@E{niCGiII(smV`l2Al){ZJRZgY;nP-L`pBIeo30MN)&(7EuB!1uaSW*cW<xYP5p@@`$1B`G`la`E-tu1mTX(ni7x%9vYUvFrh+O><b<XsAsv*#yLkuhWPLBn0HNQ105x1E=F1lHkW@r2~E^q2Rmg|pe9nJB&`wQ(W__nW!0bdAWe&an@8Da(h-pw`KI3AiPptQQvBk<OUKu+bu8`I11QU8Dk=fX)cHkpjmy=ED!c}Yu0n_`rTfO=uHWL&Mf_v|v=E<3!!o_jN<`Hjmf#0l8Wa>@<PDoO3`4K0_2V<`rsL%@;q>axDrw-7h{;AIeeYWkt;@|}Za$3<2fF@`}5=%$cFU^uVTfavmlgj^KvX7hQ-)PrJfcFY@HCqSWCS^dZ01Vf8jHNAjBQ;VL)2y2kLT)%C!I_rMM8)9qAC3QV&$Cu%$e8pbLz^shNp<TaX18dOVoi-KrxWKOD8mJe1quIuK6|k)i7H@PbjJq|%K)#^AE<r8s%@otcx0#ki$-b-ldcD2LkZEp9lcBh#p4kjvqGx;JY?zAGW@+ISmv8UY{7~6%Cc~S0-9V?HqC6T(%4*B@X+jH=cj>UF%-7N^6&&0OH!lOGmDQ7mlXE@yRS$>$x5oC*@o1kn|GycUu*gtgR13|z0%6GYR-o`#rFa}!;Q1t2GMlIEhlluCl!eh}#;2ut-e8Y?bo67ymQs$3#nws=OfW}($~8-&hQC!02XSs)8jV(ox%%^CEBqbg3YyJ)89~`qv(eB(YUJ;MN(-%YCY!T<h}QS}-4U7T$C<}m`|K$9OK(;)5a=umi55`VTbe~Duh^vLj)AxRO2E8b<hHXGeib{RNi-(&gg}Ld$=|<nbA(k~Xj#dZ=1-BwrP2~e<SDHR%dxdQ)5T<&_8VJT+5+1RHN~8;;kBHdOUvU+%19^T+JQ^V2<UV2>f2+bE26D2DzXPtys`_h-6s4^dP&*);%M^W8AWf*FKuD&(rPOj4tYDi*|n?3*8@X36t-<(BGVNnlZ$35XCOoG!{(skPx~$DOCfL#?^}nOznQm=HGH4ClL>4~n{V$GDCg0rO6-h#6g_fZFGVGCoe!y|0JI%PAL_G8j|*mZOD0wo;$WBN>RUpT>Z^OLdyCpEz2hc!u+OK`v3K&;GPeg2xa-y!S@}ioo+{<aX8*LHZI0TnE82xBd#|StzAYAjNLCbuyh7h?XC+dN(@#4s9W3uhuQWmZOzAdcb+3YtDFL{U(@bw}-Q~1XcUO?x;r=;zY7KUsAjw*8CiB*t0v?jkTDJN9VqwV(v3kaePHD}&ha>j6XD3@7eIw11B{BnB<|;`;or=%4<1GnyAAUl7v=9x%oFwWy>4I_N6ZGg?X+*z{I|u50#)Aja^D6JajbH1_5hzu~8y5op&$$BjTz_n);PcWOV$#LPcV(=Xl&_s-GH$zNcKzuOs-r;a^lO)*c~QWXg^|tvO5BZ02pVb*cToJJ0&CW@7K#qOV9B>NdF^A(BR5uyA#b3`yA%cYd%I?7UYw``#jb-8YBg|D(Zz-XS#~zx+iJ0|O?4LX$(*q!(UI5e#$~`bD=4`SULSI`zlRt2y|1RNiB6vz?w}l5m*uL_)TF8~=g47%<;#1&)ZL{fImkxrl`~nPF9x4Nnmm%AOhO`}O|JnfBh7JoougnWtjte9&0#1E5`!Ix99kTJt?xV(^ti|`P3xUzFgm@#w0zt7mA+?ek;Nfz*>W_=>BQwSDln>96{j<GQalbhHl`4Sg{w>8!(c#>jA0oLHzc((mels0UQ7GKw1XcS-$RT??dQ}t;jP=ZW<31fD)mNM)*k{l`*zWNzX=FR^tg;Ms(U%|Wo><%zz>tV9Il4^x=kd5ZFhpiQwen~u$(T%WVQ(wuJ+kBck6cIR|l1cv);WiP($08*e0*T{p>=74Qi%hcvse=$2#7Zxu?HWZiL&SM-w}g=0-w#wUg1Z-=MJT{g8%o?Re?syUOjjU-XaIPp+Qvh1PMK&KmXBVnKm&Y2v5ciEut-X_Xww*%&2)?Sbe0arqZY+Kp}>W|4`Fv~=18x3}^Pd$%SRdcIo&mhG2IjkJ?%2@W&l^%f0zErr=fqS%9QCG!<%@>8JBK$*JI)}0#Pa?&^Xj<EZQn)eAib76P+&KcF-O!s*}63gd+*})KI)=tchb9!giPY{&g@euJg4mf(jrr620(8}DRg#j>GpzTV2(UIUa_nK@MS&dVa6RPU)cr9VjV@^yCje_NIsyvU2xZ8RkrVeAkubM!M*=uXC`zJNGlL8D5P<^rOj0At{c9;#g>dm(w=7r5pdlSqBG9v6pR~_S{#$3@MwRX<WixWp50ydHrw%=+E8ue-kzXbCFYeIba-nL&QBkdIVrhM8G)4cggv_%=NYEllV>MXFUZ$!D*Yp?r#FdWb9;i~ev!mYw?4zLf+)i0IqBD85vn<X?Wx{WUmOucty&(q5phZGyVedGG}FZ14g0;}$TWy^i48gmlV6VZl!U~%%U+9=sX`7RqCn}W2btM8LgyOm|~q_$%gsRQj~T1JA4G-tX>w0;cpDXm%V=yolx_-nC8y!n@&`<+2@&93K(S$^hQu~V(0K%@{um|mmAhU-m+sCbwJvmX21f>nuYsyoJ8@3G|$ybfN^kkz|jG4A(Z|DIJ(Ww#{vx>>+NPzkZ}V;TzzbG=U+3WOXr6esnkc`l9Cug$t}&S-kBcNhtqhXZ=)OeVa?;0JHJQIQ9L^Y>$NyB|fSa_p|1DLHT6fuV9vzmL>x2mKp&7}%wIr;zNIPJfuGt9w(WG+2ltK3zPr8NGp>1-q!`#qsz<tM_YgnqUPKv-oJA4_BD?Bs%7o9iJb2Us9A@Rpw6)%j<{Q?l2wKN3D||F3H{adu=`}r4AaD+8wyDzL=KmmZ0qV$6G4VG_a_@(TPw+S+jeSS58OjVx7_~?~x5QP&4PTtGY;6zq?dsX0d(m%!^lT1X;e<g>7KL!b`Z*Rlci_OdR4CWesi<Zn{QOb?IM0u2#+6WnPKyr{lh1NWi4BQ{KSb&z!`oFJ~8O1#Ug>rq<t$PC=`&A>5|VO?cW0iH|}f2x1<!W~sT7@$ZMKTICtsQ2ZbSp;uk#6B*#B?YS*VX=pS7eIEcA9!TW9E48Jx`)RzH%7hv3%tfc38gBP{hKuD5(7-qczR6qY1XgciXF6$y*4aqy`x}+x(M;*eV3(rB2V#Cp@Cs;R?nb{$@2u8nnP)RA)f?OKarg_M4SmPFloCr95=h|Kk(s#67OTP6rK`N0Ezt;c;^J+-{)?})s16{Dh@nqbNLz(z-EVx??D<du%@5pY*pS2-(!%Ci;fWjINdJL$2fHr>`B-W=BZo~N#sJxL<mJ}pMC4BN24e-cF%>)QVJB+M2gEEKml{Jyk>iiSzwSrSw17Bw4o1>1FPu%$0EKFafc#_e>9yxHjXG3W+Q~i+oGUTC86b-$!0*{snTa4dW%r=EFCS`mZqpkcnB+#!1Qse3tmC!T8vR{7Ogm@k9vk9e$R52WsUMN7UVXh=!5$frmrL)xeYPxzjWbPhN@(S}bD6wy&8AEdDO=9jMN7k*r2R!a*h(@KJ5uM2@aK7C2jxNSTB$k2;nHsxt<*l413{k5dWNbsrZ=gfh86;~<=TAQQ1!iX868X?!Ma>MjgmuOMUK1|Jy-Luw1dv4U5h>*b}|jLd^_u`>2{V~)&BD05BXof1wP2NToK&S`C_QF1!*vmTNJ!$SJax!^9_Zxd_~5X<+5GsOVv)p#<)bl2W?F&SB9tN<h0;RIflL(qW>m3*FJ~Wvo>GTAphWz<3l=Q&g1<I!d4e2lxEZ1Lq4yLT(<ML|7oCSG+y2_Fc}?qh|1Adci)+ZqhhOG*Qd{psljumRL2gw*M03MJ~U@z|JDqFYmQcFYdO6c3o4eFoau}QvsB62<hHc<c1L;pER*h1lcwtC$0yo)eb(PA3<~<0m;QWe9bl7p96hVpvqC<E$!y7QxH2n$t&l>tA#&i<=}GREz5d$rnEUOMag}|m)jE-~`P1<AR^hywfiBURau3?w{^=Q&q2&V+vy^B_anok2>Tx*Q-tN>9KEvk`j`oMQiaFW{k^4`wtJIBRKfL~DcJ+@+Gs8GMl1Jnk#(x%@S=Vcr{Nsu1_}{PV;bJ+NOMi6#__Ogh1VR4R`19Yd{^2+6Y6X9v)cy7RXT{Q=|Mu_Kf0Uj@{xyOAW9r{`<X@csKdao_%nEK7H~xQCxc&M6e!zeJuN$zfi~YF#{SmOgwn$D^>($o#gUL}bwe$(9tMnc2$6&Mjqw;6Z8dZ80xzy<a628&$1C2VD>Y>fKjikFGOBe2jmh0c4=MAq6eWRn>pc>(rS$&Sw0RdeW%hHAcORM42_fDlr=y!RtXR`>gNDiLRPxH#A)bff;V$AAdK18nc`V<Dhp&|Zo5lNS)_osR?s{6V*Qci4ffto0u@QTPu3bo<mSI=#USExO0J;vmDoA0Vxw8+-0!L}<a3tu4Vhqb%+>GfdAgwH-yKzT;4FTRbQ8c|9<`kSkBT&=OrGA2er(y5!zCVW8yzI-i5$kAS0)U0ju>T<r#hINta3Go}`wwvu#JVbkKz$Kcyqmrs>S@=k7!8^YGKAf<{iAHos`I!P_>}p^(9l*LhWRM;-E8P~cl%E4!PNAsz`03+9Gh?E3)*tI|AGdcSn{}FFWi(|Tv*96EJI0QO@#)7s(CT;d5&S3)hB+`*>s?cxVo?JRj|893_~RX%c9=}Pp`<N^dslx(xlsi+UaMcK_6Mlrv;J$s!I#nO=33^}<m`xc4)?AMG`4ngTur`UTUn~}{sV|3Ar;?k(wi3VJ5djTTB-y5efGw)XujP_^+jp)1mn9yW(PH;?HkkFBeA#aov4}$tX47A=j=Gye)M^e<5SY$Y^b6PCt%{afjgps1j~l>@Tu0`My;Mr&&V2ke|A5$TrRdR&a4R1K^5?2G(r~&ama{W)=ChZPIl7pQ|_F6e(0<ZS?8W@(zNcKEP9@>5)jVuH;o&8%3}O+7bs_MU1^k--10pC%6#j(I4U5(CaNEuxJM6Uy`i-y@x$@LpKg3b&9~&<4A)N_H@J4&&iA!!R2+)^X|t;C!+A|q;a6#=c2|=HKkD-wv8Xh-X*?(HGlP)^Tkjk^^j$@skBGDVKXvc_cHx6%|J>Jd{J-{Y#kF$+wSY|U7naE7dGDqN!t7NS;dYz`Ej%q)WFU$VbGNg>v=pq3WB0*YxB0E5G1$g+Af@9}2G`fEb8a>UtIiu0Ht@YAC%123A+M(?7o-m;2X@b2JX%)m-b?LH31?Vk2s<p5C0g7+`WE-B0U*Y#%o5aUx3WV8LlkjGFRXWSZBWY{VA`G43LZDd9I)FkNwoS9aXtRD=eON;+PdpMacEj3Dyl5h7-|61xw6r>70nclxonqIdg4Z_!0Nmn8IO$y<<6N5YGpCw*RspgAAY$0fweg3m#4nx8MiZVsCE0Zw|QL6tf<jMyLY)Ix?4i#!$8@268U^}zZd68kg2{M+*+>^_yoGG6-ib)GwQB(@s^@Y>A`0R%)<BG9Ve1@q5LP<hC%JXFk@dL7wcte>^`%J0xhOg4E5clvv{xJ=DFyBFp=C|E8}4eqiGemE7FL1AWh}D9JDL%<>!_61+AfGaOD<nZ$M8&2^;rA0DFoO(^jMMloIgv#1a>8uzO2OA4fWaXK!9_j}Gms&(I3k`{>G)AV<Db8$c;+=%tPzohNN|cdt$X^Rgi{utdqgxD-YHsYO`GRif(U;FWD*>=}qR-3VTU4S!cNxo6=W1bV@}!KYo{E29lhPB)w(u6|Hk3+m~xfoV5^Scr6UHH8&I_RJ&$;_Lb@Zao-09sstC$Agsy0|<%e6Syxw+{oyy%h<bZ)h1;lDa|_T=Drye63S}!dy+r^*I${dhuX_qB}Au;^-VaaYE2z)r49Ff^ZVw|MjO{0xOTV0m9%7Uz7J`o{9=~TNh5s68+#{DjPthA7N2+LGQ`7OSKE6cL=qY))u*pT1AiE&%YWgFo@+UOsT&3W`#*1ed$s8nx$f)ufm!AIuD;EGdQ4RWConA(yd;yCu-opC!r?EIeapDf+v$^&W?lHu+?9RB`53zg`&c*U2c>_13@5i<w4%o_H6z7}(~w34tyAUk-M>Fs>}__dCmpyJYwGAxLiQmzi>f@(WMN)Ts<Yf1B7>l}-^%m&AnM0YDmyFbDKA;F9bU$5g^eF{FSQjco|Z+VD-^r#DJISo1+(qlwTV!X+aDr6`l`-gw)Z*@W##nR>=u&@T5aWd)T9RX^1cW!C!}VC)Goc7mpX{4J2Fg3(JnU)t`0?`ZG&DNjQgwsR}UIl7`yS+NQ(Jzdqo0&GE`e}?P49UDg7;<!H&C6!C)J0x-!)m>q2ES)v1zmB$vp@xNm0jCV`LN)jqoH8SXA&isn?Ay5!SbkGyO$vdZ}b^Fpe{bK^0U&mysUnv?f>9W3pRZ~WCE*U55%ws4ZWOw>tCYFo<rc>DJB#urKF+0er8*m>m6XcDfs{W}UD#eSDg#s9*R{(+dr?=$$TpZWdLp#C8kOcO`Z_2>W}vTLpygI-7z2j_MlXQSEnG!N6fK6B_<t8l0l2N*5uJz-t%sK^go&^Q4UE|g8;vpf7<(A5KO!v!$Xx4SOUr_f0qxWejuTv~JdZ3F^_Tju)VK&Gk2ygb020K1UOh%9*dnBOpcA8%LaXtx^T_IR|Iw3Yj^n2N^i1%OfGIO^C+#_sW2tvq?=W${VX2H6RXCh#rajE^S)=Bv^|+Azmg{V4;rXH-aTZ}NeU2>E&4?&t?p5U=TaOL0z4YCmd%jE6Jkg*n}N9XPx*OxK&|%pLSbZr<%V{%c@1_a!$A_JfE&#>Abekm|gbzr_G8rEfK+@S+hI3XNGm<UE`P;e|y+%iQ$`hh{6&&!2jywBxaHw}7H+oPv2z*-CHVsDJc&8Fk;uJa?*6>mtzTW?${i?M->~F{uOQ8Eo~E&ek@FKxfb4j|kLAIZ6GD!S<We1jrb=tsD6ZK`6eO>%;PEI@1JZ(tU5|TrH93hJp(2wDcItH_liry#K<m63f5*<r2lb75^UwwdmfLcXyfYR|`aOCp8zTT$1X-e61M%#<Wj>Sb1|o@|fMrE0J7Yx<=)ItiLmppA+(p`97a8YV#q86?12%+b+F@S_5kK;6oPVX8iivIylqg06S*YABrX&VB6hVXi^xj6<<>@+5onX3vs)qOJa{h{8_@LzFstD<}65x%Y&W9&0ioptKJx(@J`cRhKyj;)PdO8gP+y309vR07B=K5f0-qd#gIE3E|12^ULdb~WV{f0;Z#sAJXDvpd(W?(uRqZ3E6e+!%AS?(Xj&n@+3B%zeQ#}!;a6XMxGHXb=Go$P`gY$6KJ-gcR;{QWG-40(V^6#f(g)e{yM6{7PimdGzE;l6V1az14Cc^sn9lTIvvEOIht>^GeR2n@<7cptr-McN=aqNZ@bCA-FSoZ_%ERg;6)Np})3JA#mJF`*ty*>AmwNN?Qa|GMG2Jn}(nRO?;MTy5lzk10^8_AaGBL+?l4^%bwW$Tf^wxi5xb$xQ(vTrGWSr!Gn9~0RXWc;V'))) from typed_stream import * from examples.factoradic import * from typed_stream.functions import * print(Stream(int_to_factoradic(127974441335720091837592620)).map(int).sum(), end="") print(Stream.counting().filter(is_even).chunk(19).map(Stream).nth(11).nth(1)) -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 1 addition and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1 @@ /.idea -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 7 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,7 @@ file=~/code/compress_python/compress_code.py run="podman run --network=none -it --rm -v ./test.py:/test.py -v ./examples/:/examples:ro -v ./typed_stream/:/typed_stream:ro -v $file:/cpd:ro docker.io/library/python:3.10.0 python /cpd" run="python3 $file" $run typed_stream/*py > test.py $run examples/*py >> test.py $run test.py > ts.py -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 11 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -3,6 +3,7 @@ import ast import base64 import io import itertools import lzma import marshal import sys @@ -85,7 +86,16 @@ def update_tree() -> bool: node.body = [next(body)] for n in body: prev = node.body[-1] if ( isinstance(n, ast.FunctionDef) and isinstance(prev, ast.FunctionDef) and prev.name == n.name and prev.name not in [ _.id for _ in itertools.chain.from_iterable(ast.walk(x) for x in n.decorator_list) if isinstance(_, ast.Name) ] ): node.body[-1] = n else: node.body.append(n) -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 19 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -15,6 +15,24 @@ PythonCode = NewType("PythonCode", bytes) def encode_bytes(data: bytes) -> PythonCode: ENCODINGS: list[tuple[Callable[[bytes], bytes], bytes]] = [ (base64.b85encode, b"__import__('base64').b85decode"), (base64.b64encode, b"__import__('base64').b64decode"), (lambda b: repr(b).encode(), b""), ] encodes: list[PythonCode] = [ PythonCode(decode + b"('" + encode(data) + b"')" if decode else encode(data)) for encode, decode in ENCODINGS ] encodes.sort(key=len) return encodes[0] def compress_bytes(data: bytes) -> PythonCode: """Compress bytes to python code.""" COMPRESSIONS: list[tuple[Callable[[bytes], bytes], bytes]] = [ @@ -29,7 +47,7 @@ def compress_bytes(data: bytes) -> PythonCode: min_length = len(min_code) for compress, decompress in COMPRESSIONS: result = decompress + b"(" + encode_bytes(compress(data)) + b")" if len(result) < min_length: min_length = len(result) min_code = PythonCode(result) -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 11 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -8,7 +8,7 @@ import sys import types from collections.abc import Callable, Iterable from functools import partial from pathlib import Path from typing import NewType @@ -62,6 +62,16 @@ def update_tree() -> bool: for node in ast.walk(tree): if isinstance(node, ast.AnnAssign): continue # already handled if getattr(node, "body", None) and isinstance(node.body, Iterable): body = iter(node.body) node.body = [next(body)] for n in body: prev = node.body[-1] if isinstance(n, ast.FunctionDef) and isinstance(prev, ast.FunctionDef) and prev.name == n.name: node.body[-1] = n else: node.body.append(n) for attr in ( "type_param", "type_params", "returns", "type_comment", "annotation" ): -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 23 additions and 12 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -38,7 +38,7 @@ def compress_bytes(data: bytes) -> PythonCode: def minify_code(code: bytes, filename: str) -> bytes: """Minify python code.""" tree: ast.AST = compile( code, filename, "exec", @@ -47,7 +47,9 @@ def minify_code(code: bytes, filename: str) -> bytes: ) class RewriteAssign(ast.NodeTransformer): def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AST | None: if not node.value: return node # important for dataclasses! return ast.Assign( targets=[node.target], value=node.value, @@ -56,19 +58,28 @@ def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.Assign: tree = ast.fix_missing_locations(RewriteAssign().visit(tree)) def update_tree() -> bool: for node in ast.walk(tree): if isinstance(node, ast.AnnAssign): continue # already handled for attr in ( "type_param", "type_params", "returns", "type_comment", "annotation" ): if getattr(node, attr, None): setattr(node, attr, None) return True if not isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef, ast.ClassDef, ast.Module)): continue if ast.get_docstring(node): node.body = node.body[1:] or [ast.Ellipsis()] return False while update_tree(): ast.fix_missing_locations(tree) return ast.unparse(tree).encode() def compress_code(code: bytes, filename = "__main__") -> PythonCode: """Compress python code to python code.""" code = minify_code(code, filename=filename) -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 37 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,5 +1,6 @@ from __future__ import annotations import ast import base64 import io import lzma @@ -35,8 +36,43 @@ def compress_bytes(data: bytes) -> PythonCode: return min_code def minify_code(code: bytes, filename: str) -> bytes: """Minify python code.""" tree = compile( code, filename, "exec", flags=annotations.compiler_flag | ast.PyCF_ONLY_AST, dont_inherit=True, ) class RewriteAssign(ast.NodeTransformer): def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.Assign: return ast.Assign( targets=[node.target], value=node.value, type_comment=None, ) tree = ast.fix_missing_locations(RewriteAssign().visit(tree)) for node in ast.walk(tree): for attr in [ "type_param", "type_params", "returns", "type_comment", "annotation", ]: setattr(node, attr, None) if not isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef, ast.ClassDef, ast.Module)): continue if ast.get_docstring(node): node.body = node.body[1:] return ast.unparse(tree).encode() def compress_code(code: bytes, filename = "__main__") -> PythonCode: """Compress python code to python code.""" code = minify_code(code, filename=filename) min_code = PythonCode(code) min_length = len(min_code) @@ -79,6 +115,7 @@ def m_dumps(o: types.CodeType, version: int) -> bytes: def main(output: io.BytesIO = sys.stdout.buffer) -> str | int: args = sys.argv[1:] if len(args) <= 1: path = Path(args[0]) if args else Path(__file__) output.write( -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 2 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -100,7 +100,8 @@ def main(output: io.BytesIO = sys.stdout.buffer) -> str | int: output.write(b"w(") output.write(repr(file).encode()) output.write(b",") path = Path(file) output.write(repr(compress_code(path.read_bytes(), path.name)).encode()) output.write(b")\n") output.flush() -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -51,7 +51,7 @@ def compress_code(code: bytes, filename = "__main__") -> PythonCode: "exec", flags=annotations.compiler_flag, dont_inherit=True, optimize=2, ).replace(co_linetable=b"") compiled = compiled.replace(co_consts=tuple( (c.replace(co_linetable=b"") if isinstance(c, types.CodeType) else c) @@ -100,7 +100,7 @@ def main(output: io.BytesIO = sys.stdout.buffer) -> str | int: output.write(b"w(") output.write(repr(file).encode()) output.write(b",") output.write(repr(compress_code(Path(file).read_bytes(), file)).encode()) output.write(b")\n") output.flush() -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 4 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -53,6 +53,10 @@ def compress_code(code: bytes, filename = "__main__") -> PythonCode: dont_inherit=True, optimize=2 ).replace(co_linetable=b"") compiled = compiled.replace(co_consts=tuple( (c.replace(co_linetable=b"") if isinstance(c, types.CodeType) else c) for c in compiled.co_consts )) def m_dumps(o: types.CodeType, version: int) -> bytes: return marshal.dumps(o, version) -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 38 additions and 7 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,6 +1,7 @@ from __future__ import annotations import base64 import io import lzma import marshal import sys @@ -19,6 +20,7 @@ def compress_bytes(data: bytes) -> PythonCode: (__import__("bz2").compress, b"__import__('bz2').decompress"), (__import__("gzip").compress, b"__import__('gzip').decompress"), (__import__("lzma").compress, b"__import__('lzma').decompress"), (partial(__import__("zlib").compress, level=9), b"__import__('zlib').decompress"), (partial(lzma.compress, preset=9 | lzma.PRESET_EXTREME), b"__import__('lzma').decompress"), ] @@ -38,6 +40,11 @@ def compress_code(code: bytes, filename = "__main__") -> PythonCode: min_code = PythonCode(code) min_length = len(min_code) compressed_code = b"exec(" + compress_bytes(min_code) + b")" if len(compressed_code) < min_length: min_code = PythonCode(compressed_code) min_length = len(compressed_code) compiled: types.CodeType = compile( code, filename, @@ -60,17 +67,41 @@ def m_dumps(o: types.CodeType, version: int) -> bytes: for convert, deconvert in CONVERTS: result = b"exec(" + deconvert + b"(" + compress_bytes(convert(compiled)) + b"))" if len(result) < min_length: min_length = len(result) min_code = PythonCode(result) return min_code def main(output: io.BytesIO = sys.stdout.buffer) -> str | int: args = sys.argv[1:] if len(args) <= 1: path = Path(args[0]) if args else Path(__file__) output.write( compress_code(path.read_bytes(), path.name) ) output.write(b"\n") output.flush() return 0 output.write( b"def w(f, c):\n" b" from pathlib import Path\n" b" (p:=Path(f)).parent.mkdir(511,1,1)\n" b" p.write_bytes(c)\n" b"\n" ) for file in args: output.write(b"w(") output.write(repr(file).encode()) output.write(b",") output.write(repr(compress_code(Path(file).read_bytes())).encode()) output.write(b")\n") output.flush() return 0 if __name__ == "__main__": sys.exit(main()) -
Joshix-1 revised this gist
Apr 19, 2024 . 1 changed file with 56 additions and 75 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -4,92 +4,73 @@ import lzma import marshal import sys import types from collections.abc import Callable from functools import partial from pathlib import Path from typing import NewType PythonCode = NewType("PythonCode", bytes) def compress_bytes(data: bytes) -> PythonCode: """Compress bytes to python code.""" COMPRESSIONS: list[tuple[Callable[[bytes], bytes], bytes]] = [ (__import__("bz2").compress, b"__import__('bz2').decompress"), (__import__("gzip").compress, b"__import__('gzip').decompress"), (__import__("lzma").compress, b"__import__('lzma').decompress"), (partial(lzma.compress, preset=9 | lzma.PRESET_EXTREME), b"__import__('lzma').decompress"), ] min_code = PythonCode(repr(data).encode()) min_length = len(min_code) for compress, decompress in COMPRESSIONS: result = decompress + b"(__import__('base64').b85decode('" + base64.b85encode(compress(data)) + b"'))" if len(result) < min_length: min_length = len(result) min_code = PythonCode(result) return min_code def compress_code(code: bytes, filename = "__main__") -> PythonCode: """Compress python code to python code.""" min_code = PythonCode(code) min_length = len(min_code) compiled: types.CodeType = compile( code, filename, "exec", flags=annotations.compiler_flag, dont_inherit=True, optimize=2 ).replace(co_linetable=b"") def m_dumps(o: types.CodeType, version: int) -> bytes: return marshal.dumps(o, version) CONVERTS: list[tuple[Callable[[types.CodeType], bytes], bytes, int]] = [ (marshal.dumps, b"__import__('marshal').loads"), *( (partial(m_dumps, version=v), b"__import__('marshal').loads") for v in range(marshal.version) ), ] for convert, deconvert in CONVERTS: result = b"exec(" + deconvert + b"(" + compress_bytes(convert(compiled)) + b"))" if len(result) < min_length or min_code == code: min_length = len(result) min_code = PythonCode(result) return min_code if __name__ == "__main__": path = Path(__file__) sys.stdout.buffer.write( compress_code(path.read_bytes(), path.name) ) sys.stdout.buffer.write(b"\n") sys.stdout.buffer.flush() -
Joshix-1 created this gist
Apr 19, 2024 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,95 @@ from __future__ import annotations import base64 import lzma import marshal import sys import traceback import types from collections.abc import Callable from functools import partial from pathlib import Path def m_dumps(o: types.CodeType | str, version: int) -> bytes: return marshal.dumps(o, version) def dumps_code(code_obj: types.CodeType | str) -> bytes: if isinstance(code_obj, str): return repr(code_obj).encode() arguments = ( "argcount", "posonlyargcount", "kwonlyargcount", "nlocals", "stacksize", "flags", "code", "consts", "names", "varnames", "filename", "name", "qualname", "firstlineno", "linetable", "exceptiontable", "freevars", "cellvars" ) data = ( (key, getattr(code_obj, f"co_{key}")) for key in arguments ) args: list[bytes] = [ ( (b"__import__('marshal').loads(__import__('base64').b85decode(" + repr(base64.b85encode(marshal.dumps(val))).encode() + b"))") if name == "consts" else repr(val).encode() ) for name, val in data ] return b"type((lambda:0).__code__)(" + b",".join(args) + b")" COMPRESSIONS: list[tuple[Callable[[bytes], bytes], str]] = [ (__import__("bz2").compress, "__import__('bz2').decompress"), (__import__("gzip").compress, "__import__('gzip').decompress"), (__import__("lzma").compress, "__import__('lzma').decompress"), (partial(lzma.compress, preset=9 | lzma.PRESET_EXTREME), "__import__('lzma').decompress"), (lambda _: _, ""), ] CONVERTS: list[tuple[Callable[[types.CodeType | str], bytes], str]] = [ (marshal.dumps, "__import__('marshal').loads"), *( (partial(m_dumps, version=v), "__import__('marshal').loads") for v in range(marshal.version) ), (dumps_code, "eval"), ] text = Path(__file__).read_text() compiled: types.CodeType = compile( text, "__main__", "exec", flags=annotations.compiler_flag, dont_inherit=True, optimize=2 ) compressed: list[tuple[bytes, str, str]] = [] for code in (compiled, text): for convert, deconvert in CONVERTS: for compress, decompress in COMPRESSIONS: try: compressed.append( (compress(convert(code)), deconvert, decompress) ) except Exception: pass # traceback.print_exc() compressed.sort(key=lambda t: len(t[0])) c, deconvert, decompress = compressed[0] del compressed b = base64.b85encode(c) print(f"exec({deconvert}({decompress}(__import__('base64').b85decode({b!r}))))")