From 69bb74c86e0bdcd24b6c882268bfa7e0b54b0eef Mon Sep 17 00:00:00 2001 From: rocky Date: Sun, 29 May 2016 21:54:44 -0400 Subject: [PATCH] DRY scanner25 and scanner26 more --- test/Makefile | 4 + test/ok_lib2.6/abc.pyc | Bin 0 -> 6368 bytes test/ok_lib2.6/abc.pyo | Bin 0 -> 6310 bytes test/ok_lib2.6/anydbm.py | 83 ----- test/ok_lib2.6/atexit.pyc | Bin 0 -> 2377 bytes test/ok_lib2.6/atexit.pyo | Bin 0 -> 2377 bytes test/ok_lib2.6/base64.pyc | Bin 0 -> 11489 bytes test/ok_lib2.6/base64.pyo | Bin 0 -> 11489 bytes test/ok_lib2.6/calendar.pyc | Bin 0 -> 30298 bytes test/ok_lib2.6/calendar.pyo | Bin 0 -> 30298 bytes test/ok_lib2.6/chunk.pyc | Bin 0 -> 5942 bytes test/ok_lib2.6/chunk.pyo | Bin 0 -> 5942 bytes test/ok_lib2.6/cmd.pyc | Bin 0 -> 14494 bytes test/ok_lib2.6/cmd.pyo | Bin 0 -> 14494 bytes test/ok_lib2.6/codeop.pyc | Bin 0 -> 6906 bytes test/ok_lib2.6/codeop.pyo | Bin 0 -> 6906 bytes test/ok_lib2.6/colorsys.pyc | Bin 0 -> 4257 bytes test/ok_lib2.6/colorsys.pyo | Bin 0 -> 4257 bytes test/ok_lib2.6/commands.pyc | Bin 0 -> 2651 bytes test/ok_lib2.6/commands.pyo | Bin 0 -> 2651 bytes test/ok_lib2.6/dircache.pyc | Bin 0 -> 1692 bytes test/ok_lib2.6/dircache.pyo | Bin 0 -> 1692 bytes test/ok_lib2.6/dumbdbm.pyc | Bin 0 -> 7098 bytes test/ok_lib2.6/dumbdbm.pyo | Bin 0 -> 7098 bytes test/ok_lib2.6/dummy_threading.pyc | Bin 0 -> 1324 bytes test/ok_lib2.6/dummy_threading.pyo | Bin 0 -> 1324 bytes test/ok_lib2.6/fnmatch.pyc | Bin 0 -> 3741 bytes test/ok_lib2.6/fnmatch.pyo | Bin 0 -> 3741 bytes test/test_pythonlib.py | 5 +- uncompyle6/scanners/scanner2.py | 2 +- uncompyle6/scanners/scanner25.py | 494 +++-------------------------- uncompyle6/scanners/scanner26.py | 20 +- 32 files changed, 67 insertions(+), 541 deletions(-) create mode 100644 test/ok_lib2.6/abc.pyc create mode 100644 test/ok_lib2.6/abc.pyo delete mode 100644 test/ok_lib2.6/anydbm.py create mode 100644 test/ok_lib2.6/atexit.pyc create mode 100644 test/ok_lib2.6/atexit.pyo create mode 100644 test/ok_lib2.6/base64.pyc create mode 100644 test/ok_lib2.6/base64.pyo create mode 100644 test/ok_lib2.6/calendar.pyc create mode 100644 test/ok_lib2.6/calendar.pyo create mode 100644 test/ok_lib2.6/chunk.pyc create mode 100644 test/ok_lib2.6/chunk.pyo create mode 100644 test/ok_lib2.6/cmd.pyc create mode 100644 test/ok_lib2.6/cmd.pyo create mode 100644 test/ok_lib2.6/codeop.pyc create mode 100644 test/ok_lib2.6/codeop.pyo create mode 100644 test/ok_lib2.6/colorsys.pyc create mode 100644 test/ok_lib2.6/colorsys.pyo create mode 100644 test/ok_lib2.6/commands.pyc create mode 100644 test/ok_lib2.6/commands.pyo create mode 100644 test/ok_lib2.6/dircache.pyc create mode 100644 test/ok_lib2.6/dircache.pyo create mode 100644 test/ok_lib2.6/dumbdbm.pyc create mode 100644 test/ok_lib2.6/dumbdbm.pyo create mode 100644 test/ok_lib2.6/dummy_threading.pyc create mode 100644 test/ok_lib2.6/dummy_threading.pyo create mode 100644 test/ok_lib2.6/fnmatch.pyc create mode 100644 test/ok_lib2.6/fnmatch.pyo diff --git a/test/Makefile b/test/Makefile index 64fd3252..143f8b36 100644 --- a/test/Makefile +++ b/test/Makefile @@ -82,6 +82,10 @@ check-bytecode-3.5: check-native-short: $(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE) +#: Run longer Python 2.6's lib files known to be okay +check-2.6-ok: + $(PYTHON) test_pythonlib.py --ok-2.6 --verify $(COMPILE) + #: Run longer Python 2.7's lib files known to be okay check-2.7-ok: $(PYTHON) test_pythonlib.py --ok-2.7 --verify $(COMPILE) diff --git a/test/ok_lib2.6/abc.pyc b/test/ok_lib2.6/abc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20dc074b86cabb294fc26b280803ab5ac9623123 GIT binary patch literal 6368 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/anydbm.py b/test/ok_lib2.6/anydbm.py deleted file mode 100644 index 8b01ef3e..00000000 --- a/test/ok_lib2.6/anydbm.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Generic interface to all dbm clones. - -Instead of - - import dbm - d = dbm.open(file, 'w', 0666) - -use - - import anydbm - d = anydbm.open(file, 'w') - -The returned object is a dbhash, gdbm, dbm or dumbdbm object, -dependent on the type of database being opened (determined by whichdb -module) in the case of an existing dbm. If the dbm does not exist and -the create or new flag ('c' or 'n') was specified, the dbm type will -be determined by the availability of the modules (tested in the above -order). - -It has the following interface (key and data are strings): - - d[key] = data # store data at key (may override data at - # existing key) - data = d[key] # retrieve data at key (raise KeyError if no - # such key) - del d[key] # delete data stored at key (raises KeyError - # if no such key) - flag = key in d # true if the key exists - list = d.keys() # return a list of all existing keys (slow!) - -Future versions may change the order in which implementations are -tested for existence, add interfaces to other dbm-like -implementations. - -The open function has an optional second argument. This can be 'r', -for read-only access, 'w', for read-write access of an existing -database, 'c' for read-write access to a new or existing database, and -'n' for read-write access to a new database. The default is 'r'. - -Note: 'r' and 'w' fail if the database doesn't exist; 'c' creates it -only if it doesn't exist; and 'n' always creates a new database. - -""" - -class error(Exception): - pass - -_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm'] -_errors = [error] -_defaultmod = None - -for _name in _names: - try: - _mod = __import__(_name) - except ImportError: - continue - if not _defaultmod: - _defaultmod = _mod - _errors.append(_mod.error) - -if not _defaultmod: - raise ImportError, "no dbm clone found; tried %s" % _names - -error = tuple(_errors) - -def open(file, flag = 'r', mode = 0666): - # guess the type of an existing database - from whichdb import whichdb - result=whichdb(file) - if result is None: - # db doesn't exist - if 'c' in flag or 'n' in flag: - # file doesn't exist and the new - # flag was used so use default type - mod = _defaultmod - else: - raise error, "need 'c' or 'n' flag to open new db" - elif result == "": - # db type cannot be determined - raise error, "db type could not be determined" - else: - mod = __import__(result) - return mod.open(file, flag, mode) diff --git a/test/ok_lib2.6/atexit.pyc b/test/ok_lib2.6/atexit.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c882a4ed0946359789de98b8263ebeb7599458d GIT binary patch literal 2377 zcmb_d&2Aev5FV~%$=cYi)xbtm6zyIDsDLXq4$va~2ZEqK2M3UgCNK&t=v_*tC6QZ_ ziY>rCw9X}$K0#lgPti+Xps&&wXuqLkIrgDFBnxpkB!|O~Gv82u{k@)k`TK|87qs|R z(0_&I|AZ)s4j=^$1sw<~6Dn&oO6VY=A(m=X*6BHvI+ZI?Ss~RR1+xZSBxKtp6s8i= zO}Y>y44SI*MBXH|N@bIdVfF)way9O6QQ3-0$|sd6J;%Xo#7(yur8m4I-66o$Ao7X4was9FOfuRyjL#axzga3pOj&KpT}!rsJTi zvC7yw8%#|Rv^AbB4tY`))1b<9T3M4B>n3u1=_d=yO|+40-%ZoUa8^wZ$GTX0*~y$5 zY7e`eO#8)&Wj7700C>5i|G~ExQ^M(JpglzMe?TAy=R~J3Cr92_Dqx4tFc_u0eNxsZq>Ef^0PTA}=7^)MV1kmhn*K zjd-VNhA-zN97$7-mGd03;N&x?FxLi~qn=q;B8A>Auyh$PgJ9Ne}}FOJoZXK}92s z(}^-6mVG6C?AcE=k5PWve57V4AmM*(i~AxTkl3j(bp{ylrVM1E$2uV1+0@IS$|T5( zm!Ysu2J7Y|?J(i`EFw2#RVh<;IJSLeSN|4^HHg=h^*(&jT{O?hqt>=q@KuKxO(t)i zPoy?^Ua$p!oWF-?p4p7|*L^mNtc&YM(#sHBpZ~oh^YYxtiNcOH+i`sQoR$6- z#MSkp_KG}Og~!h(ww#XD7x5v^Fwsa_$y(A7t+!fhn@L-=@V>Qpu9o7x+Z6u-6jUjc literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/atexit.pyo b/test/ok_lib2.6/atexit.pyo new file mode 100644 index 0000000000000000000000000000000000000000..1c882a4ed0946359789de98b8263ebeb7599458d GIT binary patch literal 2377 zcmb_d&2Aev5FV~%$=cYi)xbtm6zyIDsDLXq4$va~2ZEqK2M3UgCNK&t=v_*tC6QZ_ ziY>rCw9X}$K0#lgPti+Xps&&wXuqLkIrgDFBnxpkB!|O~Gv82u{k@)k`TK|87qs|R z(0_&I|AZ)s4j=^$1sw<~6Dn&oO6VY=A(m=X*6BHvI+ZI?Ss~RR1+xZSBxKtp6s8i= zO}Y>y44SI*MBXH|N@bIdVfF)way9O6QQ3-0$|sd6J;%Xo#7(yur8m4I-66o$Ao7X4was9FOfuRyjL#axzga3pOj&KpT}!rsJTi zvC7yw8%#|Rv^AbB4tY`))1b<9T3M4B>n3u1=_d=yO|+40-%ZoUa8^wZ$GTX0*~y$5 zY7e`eO#8)&Wj7700C>5i|G~ExQ^M(JpglzMe?TAy=R~J3Cr92_Dqx4tFc_u0eNxsZq>Ef^0PTA}=7^)MV1kmhn*K zjd-VNhA-zN97$7-mGd03;N&x?FxLi~qn=q;B8A>Auyh$PgJ9Ne}}FOJoZXK}92s z(}^-6mVG6C?AcE=k5PWve57V4AmM*(i~AxTkl3j(bp{ylrVM1E$2uV1+0@IS$|T5( zm!Ysu2J7Y|?J(i`EFw2#RVh<;IJSLeSN|4^HHg=h^*(&jT{O?hqt>=q@KuKxO(t)i zPoy?^Ua$p!oWF-?p4p7|*L^mNtc&YM(#sHBpZ~oh^YYxtiNcOH+i`sQoR$6- z#MSkp_KG}Og~!h(ww#XD7x5v^Fwsa_$y(A7t+!fhn@L-=@V>Qpu9o7x+Z6u-6jUjc literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/base64.pyc b/test/ok_lib2.6/base64.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f7f57b9c7e8239ebe95c111a1fb06eaed949e68 GIT binary patch literal 11489 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/base64.pyo b/test/ok_lib2.6/base64.pyo new file mode 100644 index 0000000000000000000000000000000000000000..7f7f57b9c7e8239ebe95c111a1fb06eaed949e68 GIT binary patch literal 11489 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/calendar.pyc b/test/ok_lib2.6/calendar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..273eb01c1e0b7f872b96aac6c9d022a6d1cbefb6 GIT binary patch literal 30298 zcmeHw+ix6Kn&0Ve-X)p3Qj+CMi8dwD7D-W(C0{7n7A4u9*tDl8SsvO-yV+GDTW)q! zT}_GfN(Qo4#-7dW%w#XKSp?Z+cVCi+1V}a;ATJB#B`*n(ERq2E1G2y(2#{d&kN^R) z`Tc%h-FT7h8B$(9#8w@iI(6z?zWeu`Q>Xv*FLw34`j1Xtt-AQX1Ni$IuIS$toeP|s zMOtt{(S1^Iv&dM!=w^#azT{>*Tu^cW(oPq2xuDwxJuc{VL7xkDxL~IXcDdj&7xcSe zw+r^TV6O}IxnRGW-|J>OUD)Mj@k)uAn`r-ld*IyX&i!B(t#l-%18FH5KImrA_8~Wm z<`28zaTgp>`a~{8VeWQ*mz%{vo^-*hE_f9&ob*ZWd$201vxa4CEMFpT!uDD}!+jD}&*T zDD#vHo^#>Tn*Z}G(fmCZoN%G1($Tc^s0+rD(($x(&;=)5@VW~o(xPWvaLR>8_4?_w z^jR02ap9m!Ur0-bSP`Ah9&_O_S3B-zhh1=%k7q|z@|>G}UYQea7K1{aQ8$ZmAT#b} zPbxFvW+#+6fSpv+k}d(H(@ZuUhNyy#|Ma^Z_Ee8~kbxd$Momy_F%!t z-fJ&}QRr3U*CMaoWRcfwgpsuo2HxB%D-2JJyzE_E?F+)2mF0T-#D-TFDtAKfohG_p z^(try&D^ZDqPE9^=1mpc4Z}}Pc$G%bH?y3tSg)YoFkiX6+-fd`6^^lSC&V0@jgc|$ z8U`7KZMDZX(B$w42HS_ihxga!V~#Qp;&&_Smj1hVzSA!{tV0G0fdo=H^;@3uCco92{@> zBo&aL9(NH}^f;0b>;Z}8M1qotWSElkXNDm@U6o04P4Okp<6gntbFPfG9cYs6O)K>| zXT8_%VBN5O(~5B8hM7dKAQ@k1E{5Z+X7!WR@v)`VuyJSnPS}b_yW^+E&W^n_Ua!rK zFRiv0nho5KCqO`5O|M+8HEQj0d4LUaaIR40Ab9as0Bl7 z1a+^myf_!OyrI@B-r_RoaxU~HMkh|?=E5fZy+}0r?U@3Jq+E{Lt#bJgvhfUt39)#3 z#A~@M%$CcG&0x8XTb~r`??;l2Wm^X1qe(}t8F2_*h2G+~K`JC@k&3|U>lQ`ZLneaN zlW6T1B#(1=h2#d?L*!7d$%J z;9QDl@3_D#7rdYv+Fw2VWATFxUZnyXLLH8k4ZjTFlTn)CAEVl=E zy$CJYDM<#~s!JJ|SKZ3&q)6*Qzcotp+Mi-9HWl2tRD5u95+9r{Mr6{h%{s<)tk7n% zl5yd-2(`(2WpOU3TsVcc37%h2^hzb&Y_=9F?HpGfK|9+wPEpwzjxQFv{6o#fOHjLx zj7eOmh{N}b1Ql{^pbl2eh$|4?_e<_x5r`ge_dDD@+#m%qN<{zO+r#d&lA9@@Mp`(N zB4XO4BZOr9S0=8ApvMY_&}+J%d93StJ>dmD?)Y z_y^JEIIf6hM_2KDVPCPg)Z5*D47WKM1X-O*AdXfN=woEQu>^wXiG|R52?W{m0QM4u zP=_**J0^g3P~1=(Kw#y?%`a$BiHJ!SrX?Q%Kfi&-|El?!Tv`U2BA+_jry^O$zM??i z;{%eWKZqnFr!7+wN%VWTelbQRW^E9UfKkOU-{+W!epeW#+FHk<{t(N^oc=K;$C+?M z{_{*^Fg`Nwdk$TQmB>?FrSsxF4R+{t`%|$$7wylSI3bmOoYfSr=p+(|dMNq<@EN_| zr(J;sB`YYorN^wGBdIYnOp1xdkoaMHxz+F{Jm@};eweo!R$9>s@1#l^&Bka}I##3D zGP@;U?q@(;hCvB6zHUXRuw{S6XNMIwBrFzF_Gh`Ke+e0z{)_kJSpg6)-j~`0I3DLC z{5b?I3V`Sqe-7!s!|w6t(7_laSI}AvlGwR{Kb`@=t2I1HbnnB}i4)%Hsgbch&;ENo zik25cZ*{_(JdX!sW*l*twSY+mD$WEN-MQ5X`*Ug=;YGyW#1&C?x>8@EuTU*9hbx8I zVcftb!w>-;I-_P9B26r|=qjqjfJlt_;gh3hz0Vl97=_I~BKjb^V(K1Wu4O)%18cZ%&ZMZN4@*x@l zOQ06sI%rlK%(a`0Lve}`rPJ5I7y+Qfi2@-~#CyZ1UL+(5{sg|nLJazt?kMcU9P6+gmtV(5R;3 z_*xau^&bIs5m)qkNWvu8lE$7NAVdrI#jFVUIc7yDq6~`zE)eWyhL+8!Ks4FB8rU1= z)xh59k>LS9r&k$-i2Ia5sCS1lhy^Qv&At%8M*cC!JR;f1_bb1L<_dkcsEI^)xmd}? z3%x1=chQ)4b)gnn-V2&x)HsfyUlU=zRiYEV2P2VV-dk-isx2mm9AYCk%NavZ;w8yhVqmXTAd zET2HK@*Ek9aFuXE3g{jL3tYO7Ds5N= zvZPqAGJdN|w&qexd0(j|8Y zkQ^{qoYf(PzXQ$-U3yUZ*=3x7)>@Zk1f~h#u$r zp-Sm=h4*e>cLiS8gAQO&mfU~DP*bQU7;J1rp~6X&LSgpoZmnMTR%>BBpn#EgI>t=e z-knN)8PbQUNOddqyVOHQA0ZIlYA(+&XsM(ga^VEa0Wct=CaTyQYCUa_jYnQ{xg9~O zX-y(p3aho7HIRu7Fs%yM1ENwGu}X@jhk3isg78T??OrBuql2*CuE-d@+FA}Rf=GxuNQOMD92greIiHgd$54%K?}xxJl>|CI)zXpHWbbUX$`1?^CU&;C{RIi4jIN zCk#f?rrOI(b?7JW3WNvkhp)o7Xdr9UgNi(v6B8IA)<*~# zf07ApL|HUGgBSLIiosut*++-T)#%heM1KmKxXyhL9=i(%iV`4e@OKfFR$keNzvCP5 z*DL&GIE(R@!_yDZRtns2hNldoo8TdBi%W^?`0pFxgH)Qs$G3$F8Z|klT8;h)1#2*Y z(C+KM+^uVH13UL^iTBVH?9YGEbW)|@LQ z@Q%YKj1Aw6?k`uW3tp>vH+uszSp4>iQV(skY81?^aINI_Ok!tEna56Oh+8BYIUK_u zb+3Fb1T__MTPG*w1W0~a>}Z?yGFdm1Hwhg61f^Otah-=U-TW;f^gp5Vha&WmATaIi ztAwkU2-Qoe0M5%*h)uyUZHt8QY1nE$lo0$^F;V|K6B%HyA-5R?_*9aQ8u^f_3G)9n zx-;Z=fBVS)5}l_YT+hwhg8X&*Fu|J``5WNt0+I1ogfH#|iJ5gZO3?N1Q*?n>VGzT7 zVM1o5Nj8Nmx`RZLRu(aWC-|2-Cx?@jEXZ~RQ6O+3pZDHA#KkNKV7=Kz5f1T784btY zqEou;At`FTt6=TMOVd>1piFGoF}xC9OUewqaT~ zyfZSz&zhaBd`MM6vpZ{hV)R@(Jkr~k2cfZM8NtsON{RPU5Lb@qr zhUI{!`-!wSv0M(C)nwnAdc@2@Iu;h*C(xwbOJq~9fE#TT0STdeXu zCVve{M*hleIb3@NZGMI;dJ0KbM^|xY2^#@Q{l(s%-aWlL@PAKlUvJOOT|0LvjCM6# zX-}<>)OX@tj#`1WaBZaif%Zf~cQc~^88dLEEMAXoN*18+=9VPJ=n-C5jNW#VKR^&4 zk$S}O@eg5o+#+6&5~K>vGa}!i?cG+#3K5z|;jT0^-@@p`G&6Akor*e{2jpS}e%f+- z34tjn@EmT6+yru}C z{YdDF=7KtJz!tLoE755@Okw}%@|uMys@*BW8A{OH*ZQf=q4r3A`& zTUjG*iXtKUSt_2%XlSeCBOSk_xN0Y?EQ|SfR6EcsX@W$rX>++5kyOkyUK|5G!0~SE zK=1=59Rkw~qIL)_^1)}MC!*)@UJ4MCbwo+LV1l3_WY0Pm$JfTt5?&lSRkIZZ#sjKw znZuT?i-}ix(}QkY$F4$OaoxHs#~OJ^03Hy=7x-7; zQXydULxJrQ3|{<;Lk_Q_<|Z(~KCYBZK&TbO=Cyf!bCS_~y(-2f+9a|_eA*YVa-1Z3 z!*d@2Nr;ma-Ip4eg~GqYnkHk{x4W>8kgOTUdzi1H3DKPvx5rMZmq0gn1B>=ctrG#; zBEF(tv@|&%Ho}#q)`i0f3HCZeJn8UOv)0IX!G8}$IVK>5njYbpw#p9vyJ+MJ+`>8lSBV`1QH^e`D%(N;;CvW$Jo-b5RK?PPqIwg=XUrhePTClo zpmS_NAQ=d#&U{+VzRxla&5U?)gBXFNz)jTK$qbC#Ws(UaJVF>{4AE6cmoO7(MaS?? z%n$|gM9L5(My{v0wQMnp`s<(rCRl(Uhi&TU95;kd1{VJs-Vg_n2-vSUUcUmRHHAy04{8TVAGWw^bH6QJz;&0r8$dC)SHPF&!dt8dI5TZ@ z+KAkY^3B60*=G2SID(-FpD5VWxh7*|&tZw|6U|5qPsSOvq?(dQPze_{`PiSqOG4td zV6xqh=4|}xkVAhyV~V~)cVT}4bO#FMG?GhzICmu0E!E8C*6IEKH+^di@b*SuqJN*rn`=D#A~;&VNxlUVpneCx(~xO0WPUbJSs^))KDhRe&I- z4d55Ffk2_cg=Tvre}k z@8b^%YX3o!37XReuL7!*Owb&P3sg`b1*z^IL7Dt^0l;TrH(Nvt7$WLjy74Q8k1*IC zcfXgeAs*c8(SQ!ZdbGQQf)Bz;;#;WR$HC=#`=aE&D9U04!FS1G?2~G|zeCeN{T-SB zMvFz_hm4sD7WR2}{{5ZF`#Zn>eZpJ2sqXbAdink?xAJpMY?n>>G>@HeqZ{&2Xhsk3v&&G(RMqWB-pF zEj?Ck)-68!h-~i<$;up7uWk8amdvS1a?|O`UQKdGY*THR5~}1)s0H2K9DKXzQI@ zwx|G`J@P+6T?3?CmRo#Zz0*X}5Vma3QUKVD$?o4HbYDY}X{LVYB7EIh7>91^FC2C| zizkrVi_JSv;O_v_;y_^+v{qN48|l8np5jrI4iu{7^yHdCUV%1R8zLqMF{lkwET4C} zH{Q&GLDY+h<+e@&jm7@K%!v|Wn||2CfbEmpy`Jz85hT554P&4m73(MT_ifckH< z_I4qhscUC% ze^>wR14E+qH?O|)b`lOG9qT^|?~Ayi&yj$4>}&6I12W79=wWDPs9k8zd7S@%65CUZ za@$jkr?#gUb!<e^@1MTHdfA5BY-7hTb@6A?Ce{PAycO|gtR3xW`&8t+SlnKDxVIAXGfhlj^-*av0+pxD-Bgkha-^(tCBP?WV@ znM07X8rI{`Dc7{f+%9?&$z(gQt<&cR8%@Ly1}_|I%tcGDOpdpM3&L%##!xhPVJOg} zTx7HwMe)w*Tr`M-QV=ksyDgI(X&%#$mk1E>>$Fc-2*NbFaU3^sbi*vKb+JB}u!JW; zXpztt@xn&%rN~z3CkIGK*~}i1evs*rjA5hcK}*zPeL2wt`)YGl$2l4p74Nu?TmJ)= zVcsU0w}pMzYP=sM5~tTiwEZXBtqVgD@Z7p!{Yo=&il!SB>YL%HaOH-!WeiiG{Y?&r z=yV-VuZ>mMd2?X1Jk8>NI|?dZZfgYrJa71 z%MWKcmv@L`e1;gyGrqnN$5|Zjp~y|cdXcQ(A$(ecrYH+0v6%*LPP9~MoF6loPm=Gy|1M9ReE|{l8X!~_0A2T7bXW=mOZ-^ArA~LEO z`82YKm;<#t|0a@c6s8q4_lG19F2uVIdK>(L^9fwLaWNvc555M=vVC?WCSIbQ|Bei4 zN5lZh1|p)?0eOIY6cq!C64DSq3XRAC-S9)qWMkRNPZ|D#0f>Jn{i5vsg@ZVaf;3Mr+PrJh ze8hM}vMpnbraVDFCZ&QB_5W97NHdSQTRpDHuXYhEl<1>20#TDSKzEQ;SPf9Dmj)U% zlDGiw87fn>A}8WfE*5ntlYq0jU<&lo>zaG5x`O_Cq~$AA27$tyNt%mEALSO%L>FWN zu!7i=+!J?f0^rvc|}`ZaiS0BhhQqd-s{J7ql-ws8R4gnLh2RfBrdTq`RdAI z-HXo>J3lxv2ALZ+s!bEPur6P{&=)mW@#v*@r>_3sz02N08*jXK?c&>SO?iW(^6h5OJNQm&eEN-n~0^_w-n^H9vmUA75cB6MQYs zjxyj>ZI1=*U=Upr$CIp+=CPuSJaImW!&I=ui)Kf|+sm~(=Le_Y-eRN2=+)Jw5WHr0 z=LflKXPk|^;#C)L#6j3Tj~RL6Xy**u!IH`+aG>kw2cz~XzFk@f!}g%pMkDdNptwPA zp%vbgp{*Cm9FsVx23jQv9LP46=c(epm^*2>CZnHg2CK*$+pf8>IZ8q4*gc?wV@02c z-_j<4e}~$iW0>CIS>!pz&6m~E5*w(V^#5n{sRas z()0{6VG?P=v@F=f41`XyhYsJHmr$=tmms;w4`2D&wcG8AYMu z*kEUym!ipUPnEB}_0DCVGt=W{J%}GO-Uv>KfxrecM@~T4GIg_ua#>r=%H=;NAUaUu z3P;v1ioAg`9U-|XC<;Ngt%|SvKV|YWCV!jBZy?E>dI^L|YkoWT>-3-pOk;&7MgF%8 zo#rfMab9BE|1Bmz=a6valC8qh|8+F?U)XsUGLQ$p%yqV_|!vV z@VIM(=fZGbJ(LYJ*K(Dg&8Oc>x3Z5#%(c~%T!;tXQrqj0D z>&rL_LPNuF5-IIf@C~;u(lGd|?@Qnm#b2Rp>`&iuV=gwdFtGOUMM|RvZ6EKSf%gFU zLU1P66hXs~m60si6~+trmZ!~uUK5)uSz$)}QnrvWHb9?|G=Z$RydAP6aZC!=j-pJF z*|f#RxqvN)V`a!}k4n-o{x=DYWbdGYsD?CoN*Z38{FlgJ@|0L|$2%atiWFXQxjqf) zlkk%zIa82a$p*g;nw{F<*BKk2fZXBOSpwu>NAh!RY(0S0D0>snVnY(Z^=jA}APaHk zI-vOd4+Kie*J&K!2pBLCvj{F?MPtg{e6WWJVJ!I{gv7D!g5t!?_NP#`O^`>K`&&$A zkw~bKcZA_UY*NUAuQ8JxK z^2zK9kYr<0Zp$R_J81ZSB>dLZ)m7~8>fMnO?VGN}k@5e(Xvg8r-+9pv0U4j4mx^}( z@32g^rUbZ5PvumGhucK+q~6C#^AsYfC`W;IP^MC)iGqhom7@FfZ3^7a5HUjlOiub? z3UwIZnN&e=R$f1)iiH;-@u?alQ4T|nYo%ws#Qv&P8xDC>Ii8AelPM2SFBi6!@P1@M zgp$A`K)F346C%|P+!359Nblq3VIb{rpUzUX;n)Pm4`V?M_{lEFDL@qwq_G0T@4z?kc3aj+F1h-zi+t0+Lm1@&kw9$@Rw5t^@J8TYa*93WWlL%37r05qq#I zKR`qR1?h==AeuEN^5v^Db_U|>bY&_2UjKozGuN24{WGL0TU}NTciSYYD3s1-7%dfcAkeX=z$5V#--mq3nc(C% z0g^h~_$&?{mey<m<6pDdHyqqhe zY{ui0Q>`Ek4nYC)Ap1kMJsU1O_hTQ#_G#>zh7-RZ+T8&$ZxOs|7g6IO8Gy?H8V|2#%;Ovx0Z6f%AKKpcqcLTU_!)J8!&mbxd5T z#iAPb=hY^W*k@G7kkheZk~!@rmM&`z{1gclXZiAb?@qm0e%HS=OmJvpqYiY*om)jc zF2-AEF1I9xun!YrO4$g0TO-g}EP9!B>?c#KlI5+|HU@%xE=S!UUb+6_urPBRLW=(j zwY@0g1EKc+fXsl`z`0N05W^S(ci>iw)1Tw;J7ZzoBK!iq4^fTfKVS~%%6-lId9i~L z1-RC>8IJX^4KA&R-;crvzIzdQNbBjxq*(7juHJy^;a7vQdWZCDQK*NXWJ=q^uQH*% zC-U|1vrPCwCe*`kLt$i|Y8*w4QZlkZ{t^^xJgXX*H`*A=*Eq%>dt!~@T#b=@jptnO zylP-5=;ee9M){LVY-v0l4J;)|mycwN!o&g(AU?`p17NPp?QA}UEZ_xLp42K5BKZ7W zhdsKHx2spII&4z2WNYYhOuP5~+?qn82tr^RKIX(Agib4L@cTrpy4u2-Is}i#?sdG# zhVHN;g&Jm;LB(Rutn#!5+mB~Oa4dp5HWiGFn+A`fTdc(Gaq#XfP}~%cNn%}{*4$C6PrL{7T*vU@HkKWqSX3%9*XD58JyDC z@!Mjjm3e%_B#!8uM#3I#VoMRgf5uJn<_X=r;3f(CYz8*#L7Tyoo6j1etnrilOEzsU zeQD#g`O1g+S1>R@chp{a%C+;a#5X%quz?!zK2Mu83fcs2MmNm?)B&aqrxr`Wn>4(7 zXnrubcMgJJT0a{l3AG$?=jjj%m3!G6;@9!shs`DZ(AEu{qRmzL4;2=@aYI(X=v^)M zjgIO|1qnk0Jlpm$9yJSB+*G)Rk+=cD0<3Iw?^j?vL1#I1;=)=QFwv;27Ca~ntkqirn~jE;&>L@~g! zD5bj4#4nrJZvi3+sbzHmYjgBVacN}(`9#xtRjVC{~xcCf1 zQahCqrf*`=w%X2}-Hp{5d}+~WN4d}HXbIWod=6Z869?e`bKDJkNVF6SZozNRVS$T? zc~`9S9`9Q+E3h4^Z2V*qUP4XP%Uln#&?JMoqUMl4-R8r9HY5zH7P0%raCH?R46MDO;B{}yYpeCGA5*L*tNe;+qGm)<9t*#RANAB1x|u*^Th zC(}$|Q^Wxq5uiv}oW=czcES$X%fG~g{n%$I?=p9j$wx@UOWb#DJB)LmrI4ZQ+Z6Jj zK2Y&xz;j|{xQnK!*l;-!?(}QrN{j1c_{%Nu|9}tvkO{47|6ehYH%~bQhP^Y4zp-b= z+*X}3!FAGp0`CIB9dX7u;0I*A6Qss3ZVzCW!a(;x558L}jdt(bw{Jh5m3SR3^>*Uu vAABh@@HYmQ2bQpX;hBM_dyDwLmjs;qAA1$MO8uSv2>u)?;p>`@b`|~~iGgH^ literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/calendar.pyo b/test/ok_lib2.6/calendar.pyo new file mode 100644 index 0000000000000000000000000000000000000000..273eb01c1e0b7f872b96aac6c9d022a6d1cbefb6 GIT binary patch literal 30298 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/chunk.pyc b/test/ok_lib2.6/chunk.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04f26e650497eb800f1b533ccf28b9619c820487 GIT binary patch literal 5942 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/chunk.pyo b/test/ok_lib2.6/chunk.pyo new file mode 100644 index 0000000000000000000000000000000000000000..04f26e650497eb800f1b533ccf28b9619c820487 GIT binary patch literal 5942 zcmcIoTXP&o74F$xt*nvdSeCJz;E)EBs*$5hE-os#;t*q7RjML#F*0!w56ft#S3B11 z%zAp(@`C(8?05bERlHHfKj1I$$X}s&2EOm~?8U}TNFi40-ZMR?PoMiay?^`rlK+!G zzkfeg^{0vN&oJ!Um=dM-F?%X$sidKvEA>pNU+&|%srG_7qRqFJ+DrR`%;-3atkqSa zOA{q}XM0=6yp-t8Zb?y1p-S_&N3mp^383 zO_D}>JI##0EgRO>bPw27&wxUf6~}3QsBKja<7!x%8@~VE#!H{~{1d%%M+evS!KgBJ zO>2GfYAl=n#?0Wo1}llG2sFl@6OiBB+#Emh`;{C0`(PP-q*h1z`UZI+-(>%|mqG_= zV)82Orp8HEjRr;+U8hE9k=unqU}T97BK^^a8wY8nA4l2HtZS3UMFQ0hElD1vhZ`n` z?sAb@7iD6~HUBVuT$2}4AWuae_X=8&_F9K&;%u0Z248*b812ERrUVziu)`?JMjCWs zsSRPW3+w2($Zcw2PtYuKa9-+uQPxx~)Ip6i~(0ZcjIMQ@l+E*i6R8h66c5AvgnH(lU+kl$~4plKaG3F z3Jqv#T}R!@l(j7)otxw7Q8CpBex{rxkmyz=q_Nqr6-iC3>lmafD)1#L$7z=7ZiM5H z(+WPX@7~+KTb4!Xn1w3_4kQ|)} z-RXt{uyiCSvQ^A>vv#dRQ{_?L1dhbZ=khr5_%S*tB|+{&NhlH{?drU!1aW#OUks2H zCRkT>QfOQBP1O^(rxr-tId_^v|J?|dh21IBMwT9#+H)ky^bsKN4el=zgc0MN>_Fui z+-hB0W8lG+$ujt{jjC$2>EC@)mC*}(v^`1(!I}LVS*n1-sI%2#V6y z*8Pd9bWj@Po7{ye)u)4F$NXg)VQ?Ye% z@X*ASA56nBs?9!j~SD2j+iea8aB@&V|f{);ghFL}Xd;kS+!Z`J=O}}D6xXnn80m!F?`KK7RhsmIt zc*->7zschAys7q4Sv*#j{kgit?6+B7xH8YWL*R@`@V2d4G|eP;+W^mcp|J zMS7D*`|3e{MYV{!s2=*NSW+H7HJyg?zC3BE;-d0+804N;m)$m=0U~@jt45cEnU+eI z)H5ZE=Ro)es#U$As`IMb5ZdP*Z70IA$`?Vtx*+JwG|FCZ2I|^P|Ah~9q|~P}f0DKU z3;44XkV=UbtZ)%MfN}*`d|*4utdT_t%0w2$O)Ao0U<<&&troB%KFAQNns~|(38X#F zjY4Ud52E;Jip}CBbPdy|taGU&G=)>70NGh|yWple2a2~URNI4LWhCdqcuMWub1)BN z?uZU*=9qT_VhF3&WZjTBp)8SU)K^ztE4mni)Ro9kPA3{v(nSOY0F_MkV?bLyq`$4Q zh>u2Fn}drk=;+HWB`U=`~VvxuFIW9#yR|79M2<_2Xef70a-! zq+6uW)u*To?_dFMQ7~S3ivq#7$mu{wxp=750NJ|Ui)R!8)F))My1ek@c_v~4C^DW} z#Woa{dQS(%wG9(UGWruF*h7Y6Lp|;W5{+g&6?35XDyE&z=A>i0Q&;>cqSf!~VA69- zdRm*}@3?-6NuFH-Ta0mDMPJs#k~G1kvC>E6Z0IG2Pf2{EvskI{Q9dS~GIzlSm@w3C zKo^oQ2{obbaJtCpJST>Hb(RpX0{z<0nBD7KZ;rwXcyd0;q$YI<8jym51}cxuDdoBF zD#-sD!(PUu+P=4hC|kncvW&O!^wuk)?t4J~T7UfZf#-BZ4V`+ph0CC7ImVd;fyM?S zrqNh18Eg`0{{-;0g7GEdYEBh%(yQ%Bv|t6zSKT6^l@ousJPjwet6pXxy$%%{(Lv2I zn9$Tcl{^gBg5?piSXl)PHjQ$Cqsl10gP6n8yee)u2&tf@J}cJUlaO?s(%QuI}xQ}r; zVsoV3^|!v>Ot#KmbG}6+R^ZYFoy4HDjx&Kb2{+d}v26+&yV6Akw0kJwMTneB{P8|0 ztz9zg_eZA{XFU4}kI|T1oUM3sh_Q>_DhB(e6~x*(Ky|#)C7C(JE&l<428NTpT;-fA z6u(8g9|?{#a7)qs_!6#qW#SYKIK??UA;UMO`5stpdXHO{42~taa)`qrk>e+~2ao=M zX8w${@wlGgg9YzPI?j`y%Td^YeJ&VoqEz6vG+yEh@C4d5TmFoXqkgfnEV8mZ`lIqV z9`H!#jDLmnduTSKKp=I?uPu{n@zh`7fTLo_Yq=zTxz7U|eu$s@1i!%jJ$JtmP4=%( zyin?cyWDHrD~9-$3qQKlmvqbeglOPCDKCQp2k^2!vw!B-AmZib$+%gaAbn$b5m(+# zl}09%GQp%ZQ%P7qTqU7Ph$Ti!ML*3$advK>DI=^?dAP( z;JhmzP49f;GF*AZJMW#rH?9C`#e36x0~dl|33&Bgg6(~$Blnk1r(Yz)43E-KO4k*# zwF|Fs;;+HsJDk4HNu*^?cT$pxsXzk#Pgfnb%<3Zy%QD>dF1)qS!r$D&+}Rb3)m?WO gYlmFoI-R75!8x8!l@C$VCr&Y+egNXq$G02*28FL%Bme*a literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/cmd.pyc b/test/ok_lib2.6/cmd.pyc new file mode 100644 index 0000000000000000000000000000000000000000..574eee6ba6864ce6202838f5828ed03560c049b2 GIT binary patch literal 14494 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/codeop.pyo b/test/ok_lib2.6/codeop.pyo new file mode 100644 index 0000000000000000000000000000000000000000..fdcf7efec910901c7b9add820f160cdee347cb61 GIT binary patch literal 6906 zcmeHL-EQ2*6&|iul0{3l6Q@q%w8cbjtu-J^wa^ww6r^$F7%-5^#@ekL*#R+2&hC!I zCD)vxqy^-QR=(?9fnN8z56}ncbM&q+(0=D|xVx%k<8V&{TL=EZBUT@c9y9)u#n825|fHK;B!$t962 z(%T~;zS>zN7RhCiERCm@NTSEBDb)wnS>ba=OA>t=&D%TRoN+Wm4KNw1Cy$P zHgbI}JEcjT$--`##m<1W-@SEfRqppq+?P)6GTUCE2GZ#Rwv zQRdXa7e$d5tMd0MEj5p2UdV@gP(ID~tBI2Ws8CAF13* zCb_oRijykcS0jr@UR9W0-(h63o`e!KXDOVveEhk7p~24#wEb8r3!fn*Xv^mrLIB3` z56?5HhC`htI$4wQK^LNt*c8Lip`tTxW#aLARUK=#;zT~5;gzhZNo6lRMauJRYTs%fG9y#l&@+=3@xIEI zARbH%I|fcXVIv8K~AR@8*rkN#L$t`)t*)k0s8=Q*}C><*`l3Dy436?1WqY+~o;fuVWm26-H5n`T(RZbwvGdvm_#?TYSE))tQR@>2_ zlc%Kah?3CsGB6|4Sf>>;q3EZT$WnH}T6iDo>jOoVlS)=c#k)3DwvS*>Q5HCbxlCqy zze+gIed;}&-!YJ)7|9-nsz+hS^>*K+DT&fG2jG-vNJ-M;?xP2FGSwD>HXZFy9k^6u z*|Ew@kpi=O-$nSR0@A4DtLZyfe2S<4uf1`;NN*v`En~6IziZ_z}cuTG{q*7^Y z95#gs2=i3q{F(?b1*G#nkkpGAko6^Jar2mtNXEUr26 z3XqGQF5p@auR<}pCJqH{eAo~mKbjGE_cZ&FXgcr@MZO?{0K`Go5Wyct*ZpeXzjr4T z3nwY&PEgEEQ-mie<~_yX1y%}wkAuSnv6$Z!frBCD1gt`Xc^bTEh_-@__t6K|i#*;Pt*;G7I@?**J~fGr>3($WQ2?7b>fx}vC>@vb%f&F z(G%?~8k1Y(Hrc z+x8;emgq)upPLcLdA0f)V-5-tSPG&~Og1dtr(6rd+Oi>#}Tl#m(YS6cg{4kk)1*MT=;%>qLpI-k&ah-4U_ ziO9I$@lJ+Pe{b$)Ke0@;N)skLbcz=?T5^tHu#G^t}1Wdj_H|x zl;xk}vJy8W7QPao?cgH;`o?Pv(5D(aXo~h@meBqSE8hf{7Xf3 zVrxy;%JzHol8S3LRXxj9l-q>WY4?1qVFW(ew7?7wnYC!P= zNP%yUfH|7t;8(&m0AOwl00#mvXwtL7G{t8OUw}Wbx|(^|fU+-_0biB@U#LNlJ+|>4 zkxTlv-=*6JxVZ(~qApHU0L0e!-H7es$adbf1y8j|*7lF-cD!|PIp;3e;RfXSowE%q zV2?-_mbMqc2f;jA>RV`@72x2;6Vcb6C~_fIL{Wu)@kq@lijq8zqV`WPZr{LdA|Q{> z*8JOKUN}uyc58DkSeO~-?hNKRcW+|wrrfPQLQhTY26{T`r z2PW9(A4ub^3RcSRiG8RN|1bXG>Rf%N{XQ6o$j6Z9yW*e|_=mW82qTYUA$oH*Jao!t z(+G(+_?9S%mYx+U9pmxs(2^%PFT_Ob&I2_OpEn{WdO3xjIN2!bPwOM+mU}m_!Cxt* zsPT!bRnz+!hV7rzjf(IO)dgtBKjW&p!0cROVP>LMiw;`6z3)%;=OM-&(X%^WySK1{ zzF_$t%I(ZnD1|y3H!^%AR?ZdepJJ`=Z2ZxS5zPdpGLq!B)F!E>#K4m{TX|!s@JZEP fKcz#neFwL>#$sbWxY@YefZiW2%v^rw>gE3e7v6hl literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/colorsys.pyc b/test/ok_lib2.6/colorsys.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8123d9495abb28f1edae20bd5efa6d56723caec7 GIT binary patch literal 4257 zcmcgvO>7%Q6rN3D$KEz+nkKPZ{^kIZBT^?V2#G-J{-GwQO4Us$r3G1Q?`FNh*>!i< zZe0=~R5&0Zap1>f;?@GEwn7C7aX?6X@6CE+_ebIoVSC=ry!U2y z_WRy@v%dPrkY4(9W~nOTPa4+)XyMxsmJp{QHDUD$t6x|H!b%A%Eu6GC4dtM)GGhER zZ0KdtgNv?o@Z2Ka#dP>@Xg?MdV4A!&M+^rM;`$f{rW0~xl%$X*SLy1rC%L%Hf( z&AJ`RM&P$x3!Uhk-?h>*X4q!6)-zciJal+g*QE@cN;&e&W~EvPrld0^E0c2f?)}n4 zZ%S6-0TX$^u@EbjN9?Za2kUj|dW~ijs+~3?)emeL1#W}3<}b_Tx^Ke6^(3A|2BzoO z^2|(erdTZQDbBp17tXm+jcxY%s@)(IXxcold16YQtGWCP1eG*pSa+RTRBy|=88|?O z7o05W^J*hLb^|PUy_Q*bt@w_sW?NRxW@yXgF4$dwZ7DCzqs;@_#b%@72a#>{;124HAP9;!EOIIT8(&-S8Fe{KH6tUT6Sbv@Io+EemyE%4)kEa29btY8!5 zAG(n(i8Eh@uH%{Ya8jQ;wm2*2nwZzM#G)BB1Cub(=N3=K_6_BfJZWMRdZZ(!Vn*BU zSsvmV)7NdS)k7ZQ`XFoAQr55)TOBNn&)rho$sC9~`A$b1sP@ByQjD&L(ZVwjNU${_ z#*k!dni$I=)7JWMUFVErONuRdq#jxF>qxIbH765Wvhf^vV)}qsONr%vq!2ysg7XZ2 zu9cjd7sft2dh_R!Gx_?5-~3tlsuY`kDLHpeeDU~ux389*x5(wf4;|-kOU@^aefsrF zH%iX+OVqnoDqvMnpa+RGh=8TTvcj^>(q(y8dDE2e1&HaIziLkhe)Y}vbg|L4z1DP` z+~M@z;&a94r|WKIy3vkmzK8KNXEYKTz6LGw6fKmYp0_oMm~i~x>+Wki8&j3{XV z5VUy_&X$Y z?Lm#nrTq+`amqY_`4RIA8o}VjegYMt1{OCoAQ!)WkwXxS6PY|(=@b4i$V5PZu0GBY zjk^6}MHBu6*yZ%et4nTtJuSRkqNRZ97kR9eCkr_V4AqqJb>t++)`kY@2~A&@4-ysI z#O>5h)-cY9{JJi@B5uR$lW7#2#9&b5;KAl?(BK&|&4aa3ljH4(_U^+&4jg`_RHCA%r%njrI*AjHppqVT`XDk7~pCayX^nO9*i|eS{7e z0@@u)fII)FfD$E$6ABJcLIdVAH%7%^hhnS`lwbna5>>NNUO+L`X$n-1Jg^R6atPLL z)jdOa}jhap4)I>FAMlRe4d8U_mViFGc{0EG(eI1q&eXi{DQQD8ro0}K2DN**c3 zoHam;G&{TJKnLG^GEd+Pq`P*IOmIsg{ze?}9po10Pc6+cj!Ul|k8z~E8#_tlAvh^& zO?wl;o4~TKpoPSf(5MuSqovSxD)@Rz;2k*qrxJ+LcyH-L2m>SadeBwv{)c)7qVK6^ z$fe$THh_ATO6nOZZ2THSXHkd33+B5 zQZTt_!X?^Ws+=xmxJ%@?gmr-ooaU|<6^H>Bw(L#GU zix%>l948}ujE&-Oqax8c?7FWD1&aEJ4!CmJ@~h=?+&Am>a@oj1Z|oxR2njS{(Bm3} zgTa-Ks*yop7z_qFo0tL-!TF;4N4}o`4XLK42e)cl2Xs7?p3bJTquK4*!R%0W+rLF< BJ6!+( literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/colorsys.pyo b/test/ok_lib2.6/colorsys.pyo new file mode 100644 index 0000000000000000000000000000000000000000..8123d9495abb28f1edae20bd5efa6d56723caec7 GIT binary patch literal 4257 zcmcgvO>7%Q6rN3D$KEz+nkKPZ{^kIZBT^?V2#G-J{-GwQO4Us$r3G1Q?`FNh*>!i< zZe0=~R5&0Zap1>f;?@GEwn7C7aX?6X@6CE+_ebIoVSC=ry!U2y z_WRy@v%dPrkY4(9W~nOTPa4+)XyMxsmJp{QHDUD$t6x|H!b%A%Eu6GC4dtM)GGhER zZ0KdtgNv?o@Z2Ka#dP>@Xg?MdV4A!&M+^rM;`$f{rW0~xl%$X*SLy1rC%L%Hf( z&AJ`RM&P$x3!Uhk-?h>*X4q!6)-zciJal+g*QE@cN;&e&W~EvPrld0^E0c2f?)}n4 zZ%S6-0TX$^u@EbjN9?Za2kUj|dW~ijs+~3?)emeL1#W}3<}b_Tx^Ke6^(3A|2BzoO z^2|(erdTZQDbBp17tXm+jcxY%s@)(IXxcold16YQtGWCP1eG*pSa+RTRBy|=88|?O z7o05W^J*hLb^|PUy_Q*bt@w_sW?NRxW@yXgF4$dwZ7DCzqs;@_#b%@72a#>{;124HAP9;!EOIIT8(&-S8Fe{KH6tUT6Sbv@Io+EemyE%4)kEa29btY8!5 zAG(n(i8Eh@uH%{Ya8jQ;wm2*2nwZzM#G)BB1Cub(=N3=K_6_BfJZWMRdZZ(!Vn*BU zSsvmV)7NdS)k7ZQ`XFoAQr55)TOBNn&)rho$sC9~`A$b1sP@ByQjD&L(ZVwjNU${_ z#*k!dni$I=)7JWMUFVErONuRdq#jxF>qxIbH765Wvhf^vV)}qsONr%vq!2ysg7XZ2 zu9cjd7sft2dh_R!Gx_?5-~3tlsuY`kDLHpeeDU~ux389*x5(wf4;|-kOU@^aefsrF zH%iX+OVqnoDqvMnpa+RGh=8TTvcj^>(q(y8dDE2e1&HaIziLkhe)Y}vbg|L4z1DP` z+~M@z;&a94r|WKIy3vkmzK8KNXEYKTz6LGw6fKmYp0_oMm~i~x>+Wki8&j3{XV z5VUy_&X$Y z?Lm#nrTq+`amqY_`4RIA8o}VjegYMt1{OCoAQ!)WkwXxS6PY|(=@b4i$V5PZu0GBY zjk^6}MHBu6*yZ%et4nTtJuSRkqNRZ97kR9eCkr_V4AqqJb>t++)`kY@2~A&@4-ysI z#O>5h)-cY9{JJi@B5uR$lW7#2#9&b5;KAl?(BK&|&4aa3ljH4(_U^+&4jg`_RHCA%r%njrI*AjHppqVT`XDk7~pCayX^nO9*i|eS{7e z0@@u)fII)FfD$E$6ABJcLIdVAH%7%^hhnS`lwbna5>>NNUO+L`X$n-1Jg^R6atPLL z)jdOa}jhap4)I>FAMlRe4d8U_mViFGc{0EG(eI1q&eXi{DQQD8ro0}K2DN**c3 zoHam;G&{TJKnLG^GEd+Pq`P*IOmIsg{ze?}9po10Pc6+cj!Ul|k8z~E8#_tlAvh^& zO?wl;o4~TKpoPSf(5MuSqovSxD)@Rz;2k*qrxJ+LcyH-L2m>SadeBwv{)c)7qVK6^ z$fe$THh_ATO6nOZZ2THSXHkd33+B5 zQZTt_!X?^Ws+=xmxJ%@?gmr-ooaU|<6^H>Bw(L#GU zix%>l948}ujE&-Oqax8c?7FWD1&aEJ4!CmJ@~h=?+&Am>a@oj1Z|oxR2njS{(Bm3} zgTa-Ks*yop7z_qFo0tL-!TF;4N4}o`4XLK42e)cl2Xs7?p3bJTquK4*!R%0W+rLF< BJ6!+( literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/commands.pyc b/test/ok_lib2.6/commands.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c779472c73f25cffa1decb8a38831098f866e869 GIT binary patch literal 2651 zcmb_eU2hvj6urB4oOm0je2D-r9ZZGSYGOlzkmx5BEmB{CP?p@mnC=w6E*390WnLBgmoO7@J$DfVh$?sqM7}NYy!Sh=*`#rjZ z=oNa85}%R^9aZQR>?-|+ag3~pQK6(JMwOCPF;*y96Qf2+o%X|k_uKY~o=QC$19&FLI}g!zjic6L=T1 z`$3?}PdXZ#!Yy}Qj>FgKsZ)=ZQ=KF2${oXal(ZKcgnF8~D<`s7`(JM5^fk`cpHeOl z57SJymHKRcEjz!DGKZ>}S+$)dikCEl;Hh#&lxAsuq;h?Vr&g(j+sK?~EGo=Mxq)8z zTUTHuV0oU$(b!J1$Z0DJ4kDYz3V;@oOHIB+X`GHVuCzqE^;WgiJp~xhw;rf-we$G% zFI!uxRkRks%+X`lPNAbDTufMJv6qa;nXwuZf%<9BIDKEK)TvW5!Oae|%2N>LjEWN6 zVUouj65=!}Wje?&! zkm%f_Gmlc}w?Yo$tJO}lzkgL)e(S=8wX!~J}oww2TN)?u;U1jSb)AhKC_*I06 zg@yDleD-V;ehX!@(B=|oGmnYJU1N}xq#UT_gG&BG4%)4uJB^AQq*}yOzPR^bJezw0 zxR>RE9$(k7+h`aSMO#cJNp1ucVI@kTbOt_>vqO7ou711bYYo_?oQ|H z&NtmGJ?M^SZeVh}cbAtK&w9N1r)Ux}`Rm^Mp1{3;T;Sfo0!MQsf&0h%5|n*}@qZ#2 zT9*J+WeR|o=%Q#dxLT?MOP}RfLd%7s1JZC2?s{mY1>%77D7nE)@&Q|DmTybGT#)fy z>giX!T&pLDXA^?jgp@9PI``?!Cop^g)m6l*5v&ap^ zI5ue>@?r8eVAPqK>7~=nA?f(|GTx`KL>uJ2;{`xd@_^&GJ`Wg0mar67K~ak7@hX`H zAQki^Irc^HK23KS&}VP%Npe8>P<^dbJ(yUdO^_n0M;cY+?U$$Yl3A+D8?5p##T60+ z6MF|iqHN5;zZQE@cS|x{%^yw6mwSD;`Lj&E7L=P(x-Ll)B6=TUp&TV^tn~5Cu^=M& z0cY5c(3SW%yoOivR;h;P2EKu}7p`K`ao6uBChqs=c9doPzLaYDZID{o+r%>2_cBbe i{_jtM$o}ETBoq7)et<*lI=Y&F`&Ru{eXZW8Z~P7SXJ~x@ literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/commands.pyo b/test/ok_lib2.6/commands.pyo new file mode 100644 index 0000000000000000000000000000000000000000..c779472c73f25cffa1decb8a38831098f866e869 GIT binary patch literal 2651 zcmb_eU2hvj6urB4oOm0je2D-r9ZZGSYGOlzkmx5BEmB{CP?p@mnC=w6E*390WnLBgmoO7@J$DfVh$?sqM7}NYy!Sh=*`#rjZ z=oNa85}%R^9aZQR>?-|+ag3~pQK6(JMwOCPF;*y96Qf2+o%X|k_uKY~o=QC$19&FLI}g!zjic6L=T1 z`$3?}PdXZ#!Yy}Qj>FgKsZ)=ZQ=KF2${oXal(ZKcgnF8~D<`s7`(JM5^fk`cpHeOl z57SJymHKRcEjz!DGKZ>}S+$)dikCEl;Hh#&lxAsuq;h?Vr&g(j+sK?~EGo=Mxq)8z zTUTHuV0oU$(b!J1$Z0DJ4kDYz3V;@oOHIB+X`GHVuCzqE^;WgiJp~xhw;rf-we$G% zFI!uxRkRks%+X`lPNAbDTufMJv6qa;nXwuZf%<9BIDKEK)TvW5!Oae|%2N>LjEWN6 zVUouj65=!}Wje?&! zkm%f_Gmlc}w?Yo$tJO}lzkgL)e(S=8wX!~J}oww2TN)?u;U1jSb)AhKC_*I06 zg@yDleD-V;ehX!@(B=|oGmnYJU1N}xq#UT_gG&BG4%)4uJB^AQq*}yOzPR^bJezw0 zxR>RE9$(k7+h`aSMO#cJNp1ucVI@kTbOt_>vqO7ou711bYYo_?oQ|H z&NtmGJ?M^SZeVh}cbAtK&w9N1r)Ux}`Rm^Mp1{3;T;Sfo0!MQsf&0h%5|n*}@qZ#2 zT9*J+WeR|o=%Q#dxLT?MOP}RfLd%7s1JZC2?s{mY1>%77D7nE)@&Q|DmTybGT#)fy z>giX!T&pLDXA^?jgp@9PI``?!Cop^g)m6l*5v&ap^ zI5ue>@?r8eVAPqK>7~=nA?f(|GTx`KL>uJ2;{`xd@_^&GJ`Wg0mar67K~ak7@hX`H zAQki^Irc^HK23KS&}VP%Npe8>P<^dbJ(yUdO^_n0M;cY+?U$$Yl3A+D8?5p##T60+ z6MF|iqHN5;zZQE@cS|x{%^yw6mwSD;`Lj&E7L=P(x-Ll)B6=TUp&TV^tn~5Cu^=M& z0cY5c(3SW%yoOivR;h;P2EKu}7p`K`ao6uBChqs=c9doPzLaYDZID{o+r%>2_cBbe i{_jtM$o}ETBoq7)et<*lI=Y&F`&Ru{eXZW8Z~P7SXJ~x@ literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/dircache.pyc b/test/ok_lib2.6/dircache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb22e6da7d4d86694a58de6cc536b2ff809dde82 GIT binary patch literal 1692 zcmb_c+in{-5FM^AwiVkoaw~$M0AJduK%fm0pg<8Py+5@uignNwY65{-QWm2XsVpfa z3&ch8f1o|Xm6Za0Y*ymz%+BH5$v^%&7<}>jy(cAYo<81RVucz+6OBOy z>5S%rs*J`N36qiTknWQ1(S;D=7s!D0Y2KkR6g#AMN$-&!&{>zpU78W89_cIeE9~`2 z?C+hu?J9Xf{EL4;Gn+23T%}7n8x9B$VS6$kb>cyNzfS#2O+h=_?z9~M2nD`%kulKUMETnf=;?hZ6x{OizZX0qKA!cV;5*uZ$~p@h-TcsdzT< znc{N4^wuRONt)pzDfntj*6e#MFZ<$o3LFS!*QhT(5ko$$>6lL@+Lx2b_FmzOvtVQj zd;?KcHJPLdOJ^z#Pr(TmZ2euZiTl6DHidHB-eixtp5Z!3A7gMNI@x}9HS1@4y}iSJ F_7CfIg)smC literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/dircache.pyo b/test/ok_lib2.6/dircache.pyo new file mode 100644 index 0000000000000000000000000000000000000000..cb22e6da7d4d86694a58de6cc536b2ff809dde82 GIT binary patch literal 1692 zcmb_c+in{-5FM^AwiVkoaw~$M0AJduK%fm0pg<8Py+5@uignNwY65{-QWm2XsVpfa z3&ch8f1o|Xm6Za0Y*ymz%+BH5$v^%&7<}>jy(cAYo<81RVucz+6OBOy z>5S%rs*J`N36qiTknWQ1(S;D=7s!D0Y2KkR6g#AMN$-&!&{>zpU78W89_cIeE9~`2 z?C+hu?J9Xf{EL4;Gn+23T%}7n8x9B$VS6$kb>cyNzfS#2O+h=_?z9~M2nD`%kulKUMETnf=;?hZ6x{OizZX0qKA!cV;5*uZ$~p@h-TcsdzT< znc{N4^wuRONt)pzDfntj*6e#MFZ<$o3LFS!*QhT(5ko$$>6lL@+Lx2b_FmzOvtVQj zd;?KcHJPLdOJ^z#Pr(TmZ2euZiTl6DHidHB-eixtp5Z!3A7gMNI@x}9HS1@4y}iSJ F_7CfIg)smC literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/dumbdbm.pyc b/test/ok_lib2.6/dumbdbm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c88519405339e0e209bbb94f2a3582d644d872ea GIT binary patch literal 7098 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/dumbdbm.pyo b/test/ok_lib2.6/dumbdbm.pyo new file mode 100644 index 0000000000000000000000000000000000000000..c88519405339e0e209bbb94f2a3582d644d872ea GIT binary patch literal 7098 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 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/dummy_threading.pyc b/test/ok_lib2.6/dummy_threading.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a777bd2aea19741021074124a8ab6cc1f1a458b GIT binary patch literal 1324 zcmZWn&5qMR4E7{x+NM9dD=mT*mpN7(8pHt!sSAk1iW5Sm5~w|-X=WgyX=cexTFM*o zIEXjl1;EaPZYix|kL}Oje0K8V*C2TD{qZb;=GRC65+A)`00Ll+mVt0!%^-JR?gFFO zg|!EB4`d7Ger?;e?ZCI6ATaO3XCKrhFg#&=HSdB92wO0lYr&N*O#~8H_(NOr5#Foe zNQ&(~TvL~*Bcg3^ZN&9!T&Kph8=TcQfccoi>QGiKXtLhIb=cyMoTgmF3|w6upaaqHUbz@d{_&rCE}49Fp`4sZoKztz^IP zH^N1OX`^XIeq(&f)Jr$?E{@k_x`!HW&YWY^Y#+lYS4o`PZ@Hi#POQ-_i*G&gasr5WNWRXKe-&86nzzZ9u^ zaFjijS6`CKT>Pc*5IifZhW@TVME8h@Ql~6a(mf?<(+-*uK1W8s!Z1wLMuw$I*86aL zyO+f_Y(94#J{dn9KMV7072fVmstSz5lNDo&A?k@;#&bIBw`hEJ?(|)s;oot+0Sj2* i4xND)V5WEQeP_tpjGlm9w#c@b>owl3y@MIYWq$yU$w$us literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/dummy_threading.pyo b/test/ok_lib2.6/dummy_threading.pyo new file mode 100644 index 0000000000000000000000000000000000000000..5a777bd2aea19741021074124a8ab6cc1f1a458b GIT binary patch literal 1324 zcmZWn&5qMR4E7{x+NM9dD=mT*mpN7(8pHt!sSAk1iW5Sm5~w|-X=WgyX=cexTFM*o zIEXjl1;EaPZYix|kL}Oje0K8V*C2TD{qZb;=GRC65+A)`00Ll+mVt0!%^-JR?gFFO zg|!EB4`d7Ger?;e?ZCI6ATaO3XCKrhFg#&=HSdB92wO0lYr&N*O#~8H_(NOr5#Foe zNQ&(~TvL~*Bcg3^ZN&9!T&Kph8=TcQfccoi>QGiKXtLhIb=cyMoTgmF3|w6upaaqHUbz@d{_&rCE}49Fp`4sZoKztz^IP zH^N1OX`^XIeq(&f)Jr$?E{@k_x`!HW&YWY^Y#+lYS4o`PZ@Hi#POQ-_i*G&gasr5WNWRXKe-&86nzzZ9u^ zaFjijS6`CKT>Pc*5IifZhW@TVME8h@Ql~6a(mf?<(+-*uK1W8s!Z1wLMuw$I*86aL zyO+f_Y(94#J{dn9KMV7072fVmstSz5lNDo&A?k@;#&bIBw`hEJ?(|)s;oot+0Sj2* i4xND)V5WEQeP_tpjGlm9w#c@b>owl3y@MIYWq$yU$w$us literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/fnmatch.pyc b/test/ok_lib2.6/fnmatch.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f58575405848fb98dd2ffa924a730284d476988a GIT binary patch literal 3741 zcmb_e-EJF26h6C-?buDyqJz2>lV2XjC>qL1}}v-5tl9u6LcC zaT}xLs@%g9aD%wu0l4IbH{hTr2Dup%Lo}f*adeA{}J+0z2@M9IE$uphUC{5a> zmB2UpI7@!~+#eZb{iiU;N-9dk>@cy|!#Zqshe^P;j7kSO^Q~4-M#^S>Vq)LQ+E6O? zjoH|VuQI(ojQy;s_Xe3ZhIgVAjE%5H0CnDLkoE^~MOZ4ULuI47X{O9T>+oNj7%!|_ zV{c^I4&k!HWsg{D!a>-Eq3)^KIrD8_}@ zI*a***b|2`d(1ZQUiw2vKoX5HhU=!=c+3pz5Je8XAaa1SwU*2M^Q;hSKNFXfUKA&- ziiT{WBOR6z8?bT<0v$HyCSI3%Xec&l5o)dg0Ik9qGY2 z(c_S<@aR5XIR@CA`3+84*T$;nJq;XWss#8L*5ws7n+l(YMMx+=)9R}v+ABiE*io!+ z<~mnc5g&;d+^ELUaZ;dDOf2W4<6%D;DTBcnDD3%}AK;2b@sZKHTSx4$;#h-21LL{k zrChUIuv8Q*6?&q$l3-e7BZMWQCrU%MGCpyXgAYg#pwX5YpQT`fv4)?7W!#Gcx={w# zG48GlOYjqmd6BuQ zhKT+G75_mO`TRUOT8s5hfJn4+c63TWnTF7*NJzHkQ@BDIVa< z2H1zOm9-#xbF9%s)54QCugRDm8@h(ayvve%-l+j_)6SH0+L>|YAeh1VF4KhH`j`xDWw8G94J- zX_VRKd#w1ssP`&ZDu{=YGdYxzg_%Ov!4nEUUlpl^AyU>Uiy-tU=t)XtW_gvPa*DE; zn{5yKKmbY{Ho4k*6(OFWiPNQ^!aK>*EH`|OLL{qcqJ>uEQgZ;D#o(K}UM4QNB8C*z z4=*-greTCKVnyTkoKyG)#NRHG9&#f}K9I`Zj}9&vd2$CV`Ge!+sc?abMheV%C?g0% z5R5Af0wzGkIghEkZ%NFf_&hRHe`RP=hTeu*ED2`9FJI{*reZ%;T0nJLPDiO)!SpII zc#hR=9c|@q_093=b@M=Y`##LDfbIY=#ycbEj&qB6&+od&Xu05a6mDy3uTuM-r()c z()?PB!DYH=){DYc1LS#0UQ{DoVvh^kBNgU2G&IT+$>+$aD3DXNJ4{h5BkB3q#x+EN z`Uop=)JjDNiD7j`3a|DRd0CdWE$t&|FG;&4N{=5Ip7A(;c`PH}7^c3<=Fw%dWf-E5 zH(SenvnY95qDrVW(}UO#w8WK=r8a>-&@G-Jp(Ms4X%mmbO2k0g9pPPLhu!X*3$_Z@ z_!5t~g@$UU!KD?NcAEH3gH7|N=3IcxPlYZxC%M;MfW{nncMiR0z`-r%csXRJ6Q)6@ zlOK{#*6H|hj1EaeLN4qqsT+jLrBsm&b$Bk3UNcchJ#?#|hQnBY!kNmPLQ`|6+*5AN Oskx1b#@WWX#>_wP(?_uY literal 0 HcmV?d00001 diff --git a/test/ok_lib2.6/fnmatch.pyo b/test/ok_lib2.6/fnmatch.pyo new file mode 100644 index 0000000000000000000000000000000000000000..f58575405848fb98dd2ffa924a730284d476988a GIT binary patch literal 3741 zcmb_e-EJF26h6C-?buDyqJz2>lV2XjC>qL1}}v-5tl9u6LcC zaT}xLs@%g9aD%wu0l4IbH{hTr2Dup%Lo}f*adeA{}J+0z2@M9IE$uphUC{5a> zmB2UpI7@!~+#eZb{iiU;N-9dk>@cy|!#Zqshe^P;j7kSO^Q~4-M#^S>Vq)LQ+E6O? zjoH|VuQI(ojQy;s_Xe3ZhIgVAjE%5H0CnDLkoE^~MOZ4ULuI47X{O9T>+oNj7%!|_ zV{c^I4&k!HWsg{D!a>-Eq3)^KIrD8_}@ zI*a***b|2`d(1ZQUiw2vKoX5HhU=!=c+3pz5Je8XAaa1SwU*2M^Q;hSKNFXfUKA&- ziiT{WBOR6z8?bT<0v$HyCSI3%Xec&l5o)dg0Ik9qGY2 z(c_S<@aR5XIR@CA`3+84*T$;nJq;XWss#8L*5ws7n+l(YMMx+=)9R}v+ABiE*io!+ z<~mnc5g&;d+^ELUaZ;dDOf2W4<6%D;DTBcnDD3%}AK;2b@sZKHTSx4$;#h-21LL{k zrChUIuv8Q*6?&q$l3-e7BZMWQCrU%MGCpyXgAYg#pwX5YpQT`fv4)?7W!#Gcx={w# zG48GlOYjqmd6BuQ zhKT+G75_mO`TRUOT8s5hfJn4+c63TWnTF7*NJzHkQ@BDIVa< z2H1zOm9-#xbF9%s)54QCugRDm8@h(ayvve%-l+j_)6SH0+L>|YAeh1VF4KhH`j`xDWw8G94J- zX_VRKd#w1ssP`&ZDu{=YGdYxzg_%Ov!4nEUUlpl^AyU>Uiy-tU=t)XtW_gvPa*DE; zn{5yKKmbY{Ho4k*6(OFWiPNQ^!aK>*EH`|OLL{qcqJ>uEQgZ;D#o(K}UM4QNB8C*z z4=*-greTCKVnyTkoKyG)#NRHG9&#f}K9I`Zj}9&vd2$CV`Ge!+sc?abMheV%C?g0% z5R5Af0wzGkIghEkZ%NFf_&hRHe`RP=hTeu*ED2`9FJI{*reZ%;T0nJLPDiO)!SpII zc#hR=9c|@q_093=b@M=Y`##LDfbIY=#ycbEj&qB6&+od&Xu05a6mDy3uTuM-r()c z()?PB!DYH=){DYc1LS#0UQ{DoVvh^kBNgU2G&IT+$>+$aD3DXNJ4{h5BkB3q#x+EN z`Uop=)JjDNiD7j`3a|DRd0CdWE$t&|FG;&4N{=5Ip7A(;c`PH}7^c3<=Fw%dWf-E5 zH(SenvnY95qDrVW(}UO#w8WK=r8a>-&@G-Jp(Ms4X%mmbO2k0g9pPPLhu!X*3$_Z@ z_!5t~g@$UU!KD?NcAEH3gH7|N=3IcxPlYZxC%M;MfW{nncMiR0z`-r%csXRJ6Q)6@ zlOK{#*6H|hj1EaeLN4qqsT+jLrBsm&b$Bk3UNcchJ#?#|hQnBY!kNmPLQ`|6+*5AN Oskx1b#@WWX#>_wP(?_uY literal 0 HcmV?d00001 diff --git a/test/test_pythonlib.py b/test/test_pythonlib.py index 9915f633..6e759be1 100755 --- a/test/test_pythonlib.py +++ b/test/test_pythonlib.py @@ -59,9 +59,8 @@ test_options = { 'test': ('test', PYC, 'test'), - 'ok-2.6': - (os.path.join(src_dir, 'ok_2.6'), - PYOC, 'ok-2.6', 2.6), + 'ok-2.6': (os.path.join(src_dir, 'ok_lib2.6'), + PYOC, 'ok-2.6', 2.6), 'ok-2.7': (os.path.join(src_dir, 'ok_lib2.7'), PYOC, 'ok-2.7', 2.7), diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 0424dc46..f0044c69 100755 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -307,7 +307,7 @@ class Scanner2(scan.Scanner): for i in self.op_range(0, n): op = self.code[i] self.prev.append(i) - if op >= self.opc.HAVE_ARGUMENT: + if self.op_hasArgument(op): self.prev.append(i) self.prev.append(i) pass diff --git a/uncompyle6/scanners/scanner25.py b/uncompyle6/scanners/scanner25.py index 3fc3e8d2..e271b321 100755 --- a/uncompyle6/scanners/scanner25.py +++ b/uncompyle6/scanners/scanner25.py @@ -11,347 +11,62 @@ information for later use in deparsing. """ from uncompyle6.opcodes.opcode_25 import * -from xdis.bytecode import findlinestarts -import uncompyle6.scanners.scanner2 as scan -class Scanner25(scan.Scanner2): +import uncompyle6.scanners.scanner26 as scan +import uncompyle6.scanners.scanner2 as scan2 + +# bytecode verification, verify(), uses JUMP_OPs from here +from xdis.opcodes import opcode_25 +JUMP_OPs = opcode_25.JUMP_OPs + +# We base this off of 2.6 instead of the other way around +# because we cleaned things up this way. +# The history is that 2.7 support is the cleanest, +# then from that we got 2.6 and so on. +class Scanner25(scan.Scanner26): def __init__(self): - super(Scanner25, self).__init__(2.5) + scan2.Scanner2.__init__(self, 2.5) + self.stmt_opcodes = frozenset([ + self.opc.SETUP_LOOP, self.opc.BREAK_LOOP, + self.opc.SETUP_FINALLY, self.opc.END_FINALLY, + self.opc.SETUP_EXCEPT, self.opc.POP_BLOCK, + self.opc.STORE_FAST, self.opc.DELETE_FAST, + self.opc.STORE_DEREF, self.opc.STORE_GLOBAL, + self.opc.DELETE_GLOBAL, self.opc.STORE_NAME, + self.opc.DELETE_NAME, self.opc.STORE_ATTR, + self.opc.DELETE_ATTR, self.opc.STORE_SUBSCR, + self.opc.DELETE_SUBSCR, self.opc.RETURN_VALUE, + self.opc.RAISE_VARARGS, self.opc.POP_TOP, + self.opc.PRINT_EXPR, self.opc.PRINT_ITEM, + self.opc.PRINT_NEWLINE, self.opc.PRINT_ITEM_TO, + self.opc.PRINT_NEWLINE_TO, self.opc.CONTINUE_LOOP, + self.opc.JUMP_ABSOLUTE, self.opc.EXEC_STMT, + ]) - def disassemble(self, co, classname=None, code_objects={}): - ''' - Disassemble a code object, returning a list of 'Token'. + # "setup" opcodes + self.setup_ops = frozenset([ + self.opc.SETUP_EXCEPT, self.opc.SETUP_FINALLY, + ]) - The main part of this procedure is modelled after - dis.disassemble(). - ''' + # opcodes with expect a variable number pushed values whose + # count is in the opcode. For parsing we generally change the + # opcode name to include that number. + self.varargs_ops = frozenset([ + self.opc.BUILD_LIST, self.opc.BUILD_TUPLE, + self.opc.BUILD_SLICE, self.opc.UNPACK_SEQUENCE, + self.opc.MAKE_FUNCTION, self.opc.CALL_FUNCTION, + self.opc.MAKE_CLOSURE, self.opc.CALL_FUNCTION_VAR, + self.opc.CALL_FUNCTION_KW, self.opc.CALL_FUNCTION_VAR_KW, + self.opc.DUP_TOPX, self.opc.RAISE_VARARGS]) - # import dis; dis.disassemble(co) # DEBUG - - # Container for tokens - tokens = [] - customize = {} - Token = self.Token # shortcut - - n = self.setup_code(co) - self.build_lines_data(co, n) - - # linestarts contains block code adresses (addr,block) - self.linestarts = list(findlinestarts(co)) - - # class and names - if classname: - classname = '_' + classname.lstrip('_') + '__' - - def unmangle(name): - if name.startswith(classname) and name[-2:] != '__': - return name[len(classname) - 2:] - return name - - free = [ unmangle(name) for name in (co.co_cellvars + co.co_freevars) ] - names = [ unmangle(name) for name in co.co_names ] - varnames = [ unmangle(name) for name in co.co_varnames ] - else: - free = co.co_cellvars + co.co_freevars - names = co.co_names - varnames = co.co_varnames - self.names = names - - # list of instruction to remove/add or change to match with bytecode 2.7 - self.toChange = [] - self.restructBytecode() - codelen = len(self.code) - - # mapping adresses of previous instruction - self.prev = [0] - for i in self.op_range(0, codelen): - op = self.code[i] - self.prev.append(i) - if self.op_hasArgument(op): - self.prev.append(i) - self.prev.append(i) - - self.load_asserts = set() - for i in self.op_range(0, codelen): - if self.code[i] == self.opc.PJIT and self.code[i + 3] == self.opc.LOAD_GLOBAL: - if names[self.get_argument(i+3)] == 'AssertionError': - self.load_asserts.add(i+3) - - # self.lines contains (block,addrLastInstr) - cf = self.find_jump_targets() - - # contains (code, [addrRefToCode]) - last_stmt = self.next_stmt[0] - i = self.next_stmt[last_stmt] - replace = {} - while i < codelen-1: - if self.lines[last_stmt].next > i: - if self.code[last_stmt] == PRINT_ITEM: - if self.code[i] == PRINT_ITEM: - replace[i] = 'PRINT_ITEM_CONT' - elif self.code[i] == PRINT_NEWLINE: - replace[i] = 'PRINT_NEWLINE_CONT' - last_stmt = i - i = self.next_stmt[i] - - imports = self.all_instr(0, codelen, (IMPORT_NAME, IMPORT_FROM, IMPORT_STAR)) - if len(imports) > 1: - last_import = imports[0] - for i in imports[1:]: - if self.lines[last_import].next > i: - if self.code[last_import] == IMPORT_NAME == self.code[i]: - replace[i] = 'IMPORT_NAME_CONT' - last_import = i - - extended_arg = 0 - for offset in self.op_range(0, codelen): - op = self.code[offset] - op_name = self.opname[op] - oparg = None; pattr = None - - if offset in cf: - k = 0 - for j in cf[offset]: - tokens.append(Token('COME_FROM', None, repr(j), - offset="%s_%d" % (offset, k) )) - k += 1 - if self.op_hasArgument(op): - oparg = self.get_argument(offset) + extended_arg - extended_arg = 0 - if op == EXTENDED_ARG: - raise NotImplementedError - extended_arg = oparg * scan.L65536 - continue - if op in hasconst: - const = co.co_consts[oparg] - # We can't use inspect.iscode() because we may be - # using a different version of Python than the - # one that this was byte-compiled on. So the code - # types may mismatch. - if hasattr(const, 'co_name'): - oparg = const - if const.co_name == '': - assert op_name == 'LOAD_CONST' - op_name = 'LOAD_LAMBDA' - elif const.co_name == '': - op_name = 'LOAD_GENEXPR' - elif const.co_name == '': - op_name = 'LOAD_DICTCOMP' - elif const.co_name == '': - op_name = 'LOAD_SETCOMP' - # verify uses 'pattr' for comparison, since 'attr' - # now holds Code(const) and thus can not be used - # for comparison (todo: think about changing this) - # pattr = 'code_object @ 0x%x %s->%s' % - # (id(const), const.co_filename, const.co_name) - pattr = '' - else: - pattr = const - elif op in hasname: - pattr = names[oparg] - elif op in hasjrel: - pattr = repr(offset + 3 + oparg) - elif op in hasjabs: - pattr = repr(oparg) - elif op in haslocal: - pattr = varnames[oparg] - elif op in hascompare: - pattr = cmp_op[oparg] - elif op in hasfree: - pattr = free[oparg] - if offset in self.toChange: - if self.code[offset] == JA and self.code[oparg] == WITH_CLEANUP: - op_name = 'SETUP_WITH' - cf[oparg] = cf.get(oparg, []) + [offset] - if op in (BUILD_LIST, BUILD_TUPLE, BUILD_SLICE, - UNPACK_SEQUENCE, - MAKE_FUNCTION, CALL_FUNCTION, MAKE_CLOSURE, - CALL_FUNCTION_VAR, CALL_FUNCTION_KW, - CALL_FUNCTION_VAR_KW, DUP_TOPX, RAISE_VARARGS - ): - # CE - Hack for >= 2.5 - # Now all values loaded via LOAD_CLOSURE are packed into - # a tuple before calling MAKE_CLOSURE. - if op == BUILD_TUPLE and \ - self.code[self.prev[offset]] == LOAD_CLOSURE: - continue - else: - op_name = '%s_%d' % (op_name, oparg) - if op != BUILD_SLICE: - customize[op_name] = oparg - elif op == JA: - target = self.get_target(offset) - if target < offset: - if offset in self.stmts and self.code[offset+3] not in (END_FINALLY, POP_BLOCK) \ - and offset not in self.not_continue: - op_name = 'CONTINUE' - else: - op_name = 'JUMP_BACK' - - elif op == LOAD_GLOBAL: - if offset in self.load_asserts: - op_name = 'LOAD_ASSERT' - elif op == RETURN_VALUE: - if offset in self.return_end_ifs: - op_name = 'RETURN_END_IF' - - if offset in self.linestartoffsets: - linestart = self.linestartoffsets[offset] - else: - linestart = None - - if offset not in replace: - tokens.append(Token(op_name, oparg, pattr, offset, linestart)) - else: - tokens.append(Token(replace[offset], oparg, pattr, offset, linestart)) - - return tokens, customize - - def getOpcodeToDel(self, i): - ''' - check validity of the opcode at position I and return a list of opcode to delete - ''' - opcode = self.code[i] - opsize = self.op_size(opcode) - - if i+opsize >= len(self.code): - return None - - if opcode == EXTENDED_ARG: - raise NotImplementedError - # del POP_TOP - if opcode in (PJIF, PJIT, JA, JF): - toDel = [] - # del POP_TOP - if self.code[i+opsize] == POP_TOP: - if self.code[i+opsize] == self.code[i+opsize+1] and self.code[i+opsize] == self.code[i+opsize+2] \ - and opcode in (JF, JA) and self.code[i+opsize] != self.code[i+opsize+3]: - pass - else: - toDel += [i+opsize] - # conditional tuple - if self.code[i] == JA and self.code[i+opsize] == POP_TOP \ - and self.code[i+opsize+1] == JA and self.code[i+opsize+4] == POP_BLOCK: - jmpabs1target = self.get_target(i) - jmpabs2target = self.get_target(i+opsize+1) - if jmpabs1target == jmpabs2target and self.code[jmpabs1target] == FOR_ITER: - destFor = self.get_target(jmpabs1target) - if destFor == i+opsize+4: - setupLoop = self.last_instr(0, jmpabs1target, SETUP_LOOP) - standarFor = self.last_instr(setupLoop, jmpabs1target, GET_ITER) - if standarFor is None: - self.restructJump(jmpabs1target, destFor+self.op_size(POP_BLOCK)) - toDel += [setupLoop, i+opsize+1, i+opsize+4] - if len(toDel) > 0: - return toDel - return None - if opcode == RAISE_VARARGS: - if self.code[i+opsize] == POP_TOP: - return [i+opsize] - if opcode == BUILD_LIST: - if (self.code[i+opsize] == DUP_TOP - and self.code[i+opsize+1] in (STORE_NAME, STORE_FAST)): - # del DUP/STORE_NAME x - toDel = [i+opsize, i+opsize+1] - nameDel = self.get_argument(i+opsize+1) - start = i+opsize+1 - end = start - # del LOAD_NAME x - while end < len(self.code): - end = self.first_instr(end, len(self.code), (LOAD_NAME, LOAD_FAST)) - if nameDel == self.get_argument(end): - toDel += [end] - break - if self.code[end] == LOAD_NAME: - end += self.op_size(LOAD_NAME) - else: - end += self.op_size(LOAD_FAST) - # log JA/POP_TOP to del and update PJIF - while start < end: - start = self.first_instr(start, end, (PJIF, PJIT)) # end = len(self.code) - if start is None: break - target = self.get_target(start) - if self.code[target] == POP_TOP and self.code[target-3] == JA: - toDel += [target, target-3] - # update PJIF - target = self.get_target(target-3) - self.restructJump(start, target) - start += self.op_size(PJIF) - # del DELETE_NAME x - start = end - while end < len(self.code): - end = self.first_instr(end, len(self.code), (DELETE_NAME, DELETE_FAST)) - if nameDel == self.get_argument(end): - toDel += [end] - break - if self.code[end] == DELETE_NAME: - end += self.op_size(DELETE_NAME) - else: - end += self.op_size(DELETE_FAST) - return toDel - # change join(for..) struct - if opcode == SETUP_LOOP: - if self.code[i+3] == LOAD_FAST and self.code[i+6] == FOR_ITER: - end = self.first_instr(i, len(self.code), RETURN_VALUE) - end = self.first_instr(i, end, YIELD_VALUE) - if end and self.code[end+1] == POP_TOP and self.code[end+2] == JA and self.code[end+5] == POP_BLOCK: - return [i, end+5] - # with stmt - if opcode == WITH_CLEANUP: - chckDel = i-self.op_size(DELETE_NAME) - assert self.code[chckDel] in (DELETE_NAME, DELETE_FAST) - toDel = [chckDel] - nameDel = self.get_argument(chckDel) - chckDel -= self.op_size(LOAD_NAME) - assert self.code[chckDel] in (LOAD_NAME, LOAD_FAST) - toDel += [chckDel] - - allStore = self.all_instr(0, i, (STORE_NAME, STORE_FAST)) - chckStore = -1 - for store in allStore: - if nameDel == self.get_argument(store): - if self.code[store+3] == LOAD_ATTR and self.code[store-3] == LOAD_ATTR \ - and self.code[store-4] == DUP_TOP: - chckStore = store - assert chckStore > 0 - toDel += [chckStore-4, chckStore-3, chckStore+3] - - chckStp = -1 - allSetup = self.all_instr(chckStore+3, i, (SETUP_FINALLY)) - for stp in allSetup: - if chckDel == self.get_target(stp): - chckStp = stp - assert chckStp > 0 - toDel += [chckStp] - chckDel = chckStore+3+self.op_size(self.code[chckStore+3]) - while chckDel < chckStp-3: - toDel += [chckDel] - chckDel += self.op_size(self.code[chckDel]) - if (self.code[chckStp-3] in (STORE_NAME, STORE_FAST) - and self.code[chckStp+3] in (LOAD_NAME, LOAD_FAST) - and self.code[chckStp+6] in (DELETE_NAME, DELETE_FAST)): - toDel += [chckStp-3, chckStp+3, chckStp+6] - # SETUP_WITH opcode dosen't exist in 2.5 but is necessary for the grammar - self.code[chckStore] = JUMP_ABSOLUTE # ugly hack - self.restructJump(chckStore, i) - self.toChange.append(chckStore) - return toDel - if opcode == NOP: - return [i] - return None - - def getOpcodeToExp(self): - # we handle listExp, if opcode have to be resized - listExp = [] - i=0 - while i < len(self.code): # we can't use op_range for the moment - op = self.code[i] - if op in self.opc.hasArgumentExtended: - listExp += [i] - elif self.op_hasArgument(op): - i+=2 - i+=1 - return listExp + # opcodes that store values into a variable + self.designator_ops = frozenset([ + self.opc.STORE_FAST, self.opc.STORE_NAME, + self.opc.STORE_GLOBAL, self.opc.STORE_DEREF, self.opc.STORE_ATTR, + self.opc.STORE_SLICE_0, self.opc.STORE_SLICE_1, self.opc.STORE_SLICE_2, + self.opc.STORE_SLICE_3, self.opc.STORE_SUBSCR, self.opc.UNPACK_SEQUENCE, + self.opc.JA + ]) def restructCode(self, listDel, listExp): ''' @@ -491,113 +206,6 @@ class Scanner25(scan.Scanner2): self.code[pos+2] = (target >> 8) & 0xFF self.code[pos+1] = target & 0xFF - def build_stmt_indices(self): - code = self.code - start = 0 - end = len(code) - - stmt_opcodes = set([ - SETUP_LOOP, BREAK_LOOP, CONTINUE_LOOP, - SETUP_FINALLY, END_FINALLY, SETUP_EXCEPT, - POP_BLOCK, STORE_FAST, DELETE_FAST, STORE_DEREF, - STORE_GLOBAL, DELETE_GLOBAL, STORE_NAME, DELETE_NAME, - STORE_ATTR, DELETE_ATTR, STORE_SUBSCR, DELETE_SUBSCR, - RETURN_VALUE, RAISE_VARARGS, POP_TOP, - PRINT_EXPR, PRINT_ITEM, PRINT_NEWLINE, PRINT_ITEM_TO, PRINT_NEWLINE_TO, - JUMP_ABSOLUTE, EXEC_STMT - ]) - - stmt_opcode_seqs = [(PJIF, JF), (PJIF, JA), (PJIT, JF), (PJIT, JA)] - - designator_ops = set([ - STORE_FAST, STORE_NAME, STORE_GLOBAL, STORE_DEREF, STORE_ATTR, - STORE_SLICE_0, STORE_SLICE_1, STORE_SLICE_2, STORE_SLICE_3, - STORE_SUBSCR, UNPACK_SEQUENCE, JA - ]) - - prelim = self.all_instr(start, end, stmt_opcodes) - - stmts = self.stmts = set(prelim) - pass_stmts = set() - for seq in stmt_opcode_seqs: - for i in self.op_range(start, end-(len(seq)+1)): - match = True - for elem in seq: - if elem != code[i]: - match = False - break - i += self.op_size(code[i]) - - if match: - i = self.prev[i] - stmts.add(i) - pass_stmts.add(i) - - if pass_stmts: - stmt_list = list(stmts) - stmt_list.sort() - else: - stmt_list = prelim - last_stmt = -1 - self.next_stmt = [] - slist = self.next_stmt = [] - i = 0 - for s in stmt_list: - if code[s] == JA and s not in pass_stmts: - target = self.get_target(s) - if target > s or self.lines[last_stmt].l_no == self.lines[s].l_no: - stmts.remove(s) - continue - j = self.prev[s] - while code[j] == JA: - j = self.prev[j] - if code[j] == LIST_APPEND: # list comprehension - stmts.remove(s) - continue - elif code[s] == POP_TOP and code[self.prev[s]] == ROT_TWO: - stmts.remove(s) - continue - elif code[s] in designator_ops: - j = self.prev[s] - while code[j] in designator_ops: - j = self.prev[j] - if code[j] == FOR_ITER: - stmts.remove(s) - continue - last_stmt = s - slist += [s] * (s-i) - i = s - slist += [end] * (end-len(slist)) - - def next_except_jump(self, start): - ''' - Return the next jump that was generated by an except SomeException: - construct in a try...except...else clause or None if not found. - ''' - if self.code[start] == DUP_TOP: - except_match = self.first_instr(start, len(self.code), (PJIF)) - if except_match: - jmp = self.prev[self.get_target(except_match)] - self.ignore_if.add(except_match) - self.not_continue.add(jmp) - return jmp - - count_END_FINALLY = 0 - count_SETUP_ = 0 - for i in self.op_range(start, len(self.code)): - op = self.code[i] - if op == END_FINALLY: - if count_END_FINALLY == count_SETUP_: - if self.code[self.prev[i]] == NOP: - i = self.prev[i] - assert self.code[self.prev[i]] in (JA, JF, RETURN_VALUE) - self.not_continue.add(self.prev[i]) - return self.prev[i] - count_END_FINALLY += 1 - elif op in (SETUP_EXCEPT, SETUP_FINALLY): - count_SETUP_ += 1 - # return self.lines[start].next - def detect_structure(self, pos, op=None): ''' Detect type of block structures and their boundaries to fix optimizied jumps diff --git a/uncompyle6/scanners/scanner26.py b/uncompyle6/scanners/scanner26.py index dee8f97b..e3953bf7 100755 --- a/uncompyle6/scanners/scanner26.py +++ b/uncompyle6/scanners/scanner26.py @@ -13,6 +13,10 @@ use in deparsing. from xdis.bytecode import findlinestarts import uncompyle6.scanners.scanner2 as scan +# bytecode verification, verify(), uses JUMP_OPs from here +from xdis.opcodes import opcode_26 +JUMP_OPs = opcode_26.JUMP_OPs + class Scanner26(scan.Scanner2): def __init__(self): super(Scanner26, self).__init__(2.6) @@ -106,14 +110,7 @@ class Scanner26(scan.Scanner2): self.restructBytecode() codelen = len(self.code) - # mapping adresses of prev instruction - self.prev = [0] - for i in self.op_range(0, codelen): - op = self.code[i] - self.prev.append(i) - if self.op_hasArgument(op): - self.prev.append(i) - self.prev.append(i) + self.build_prev_op(codelen) self.load_asserts = set() for i in self.op_range(0, codelen): @@ -187,7 +184,7 @@ class Scanner26(scan.Scanner2): # verify uses 'pattr' for comparison, since 'attr' # now holds Code(const) and thus can not be used # for comparison (todo: think about changing this) - # pattr = 'code_object @ 0x%x %s->%s' %\ + # pattr = 'code_object @ 0x%x %s->%s' % \ # (id(const), const.co_filename, const.co_name) pattr = '' else: @@ -268,7 +265,7 @@ class Scanner26(scan.Scanner2): if opcode == self.opc.EXTENDED_ARG: raise NotImplementedError - # modification of some jump structure + # modification of some jump structures if opcode in (self.opc.PJIF, self.opc.PJIT, self.opc.JA, @@ -300,10 +297,11 @@ class Scanner26(scan.Scanner2): if len(toDel) > 0: return toDel return None - # raise_varags not realy handle for the moment + # raise_varagsis not really handled for the moment if opcode == self.opc.RAISE_VARARGS: if self.code[i+opsize] == self.opc.POP_TOP: return [i+opsize] + # modification of list structure if opcode == self.opc.BUILD_LIST: if (self.code[i+opsize] == self.opc.DUP_TOP and