Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!0q))6tokenizer/fe55275cb80f4ed8a2e3061ab3cd552e5d0a2677.zipnuIwPK cP theseer-tokenizer-75a63c3/UTˣ _PK cP_|k-& theseer-tokenizer-75a63c3/.php_cs.distUTˣ _Zߏ&~oTIOI*R/bmvM}z^>%o~/Ms؏+V範oH;~S7[KײŮepy{ d% v{)|]5M7qmoܠ /i,=Z3񷶕{V52};t\iMmXhia5Lqj(?|,,S d1a_!SHKji=KCy )u#)W.왢F*{Z1[ԛ׺ Op>sQn9q;ږ/?/V{:bKtt J[8Ͱ@`@ `dK[AٰT0YTX'QuoK0VR.׬j‡%6{ 1Z50ߢ#j)*tgp!6{3{tPо-*Y[_ *_%NZ/8^jnR4ЬYHH \75o%[2a\zE@ATdd3PT&ūqOd0K'ww_ ׅ cb|f0 +L j pc ` e^B{:F5t25-<՚#7ahS4.ɪt+_eL#k^bqMm+4ßbXa r8CжVOČ=k8 ` c8LG h ށfn0VvX2DHts<*x Y|(w%AQQڝق%<س[ꔂ1tL4 $.S@L=$L m 3vu3^ DȋQtދ;id'w7ӡ\'I =Sk.l ʶʧWh09q+up,Ƽۧ*!׮RB8kNם骖d7 26ӢDAlE_Al d*-dDwEA]@nm(|fޢ催^}K@L iEnxb8Hi!Cr?Sj"{(It {Lic" b23 "V KֈA9Π$hYXun3}}z~b"xcyYM &=K[6-ZM_ 2X betM"gS+C:Qt0 Y<&&QzAVOLLъ%ZjfN*`tb=ɳ{)cƓ(Eogw{u? ZqKϩY:1*Z*cU xf6iDyZ=Q>|r`xW.nP zwo˟j=fzPK cP%v& theseer-tokenizer-75a63c3/CHANGELOG.mdUTˣ _[k0)ĶIVJ/cV J!u:f٧߱tYӇUe+̊m*<|XG7ZAY(AirP(:8Wb ίϾ\]|z8*O0:>*B16=(y!I 鐏[F+^j[E N])}TY"ڄzj6VyOaڟ+;hGt`|WKZ>[$%F+az¾XPoU CEAPRF4>&'C>>Hu]c_BuRS]i fh+:daD!Zʹ]¥VT!^o1=|'-a"uGGaCq!{AE*^z:qt}~"Βn8<\wJT2lV{^> ѧ♔]c!{0f Z5+?m~D;g~IcߵS/NOb0C? ptSpBg0 ?aA4 #u ]䛃z'P|wPx4~1{C %lj F '^QwJ9]BDG ?Tf4h UX l)A㹷)@ pAUx6e4S";yh-K]$i,e'6i+\wZ*g%SB-TNS@MTG x^vo4k5:a,bkM O)~ {rCrR4E0R>C> PxkfMRU$WPUzgE.Y3BUfiygn뻯VdwEv[0zgxZYt<2a쬈igh%(u)a8C=ܫFRN ZkEa Oaƈi<༭zʘ[GoUfjt $u4Iq4HXoѝvh;yYZ% zJjm'^s ؏ez͇Ϣ'* ~~&i%9 -G6E:~l>Sv*> ~y:Hot/(34Fɓb5=.&QrC!o|ङPK cPxRA2' theseer-tokenizer-75a63c3/composer.jsonUTˣ _eQn0 +Na8IHL@ G#8sR}n K$=lԪ!ByZ޶p`&۲Fke `[&9hSs )xj@Km([6h1: 4@cd0x1: KJ]|/EeWS8J8{\!'KAYtsA8ooMV!8?U GO{=WVl~/Mlj:H0!\"%W-#rv!UQ^.kmg"柵!IPK cP theseer-tokenizer-75a63c3/src/UTˣ _PK cP\f+ theseer-tokenizer-75a63c3/src/Exception.phpUTˣ _E=@@~N1%Q9D6Kl&;Si_Ff ~u Z F;5yImPq4.kba'᧛zPK cP.S. theseer-tokenizer-75a63c3/src/NamespaceUri.phpUTˣ _mQ=O0+NUQbm00ЖRe pmg|MJz{y'/dyrqKZ~˓$ʈ笜$80`d=¸*`~𦤀*hѰ.:EwfkIw)8|J1u?Ǔi9ɲy_CͺNnCcdy++`f u)4(kgvq7SmـΚrWlt +JaClsGh2z4``{kaPK cP)0Udq7 theseer-tokenizer-75a63c3/src/NamespaceUriException.phpUTˣ _/(PHIMI,J(.)L./,H-VU0ԴKM-.HLNUH NM- NˬJ-j+.V -tHN-(SH(IK)V@TsrPK cPK>j' theseer-tokenizer-75a63c3/src/Token.phpUTˣ _N0~=D@+P/zBYu$@}wlcH T/Q<ִPubj tp $_-úAhk!˜snCg^Up7H y3Vf&'qAv~ϛPe,S{{<;ٓb4͏ {g2t|fjw~g <]n:QcFRMԔ'J;/>,(#Ei,JEć6_vPK cPӱb1 theseer-tokenizer-75a63c3/src/TokenCollection.phpUTˣ _Uo0~_q@ ]UU^v{!l@w}*[d`26fbj l:c1Ut/PߨA@nZ;iR_f).Q ѵRl{Ǩu3RF°i'VӁ+ :=w)ba5J.\y&7icǒݯna%yBlYpK|r,\)<$}J@dr>[hӬW` 8zl#w^izqq}RXiljm6\U"P9|NWtL:ٌn6:lu%/BunbNb>s+w,AΓMgl#D>) AhkзWL6p a0xu~àUcaP/8>X{8r=(`g[;vN3gkG(w fKd9H7.͉Z 4f`X) 㫩>2y|!2<td}x~o1|ly5C/Burڜji驓V🫘*pzɧ3ۖRBV^iNlIFrg a2O٫;'<nedo$RאHQV$-xԍmM8Xp{-{! Xz#*aD(= RTJf%ӿOɏ~-$`"yU3(yQF̷qj' $theseer-tokenizer-75a63c3/src/Token.phpUTˣ _PK cPӱb1 ptheseer-tokenizer-75a63c3/src/TokenCollection.phpUTˣ _PK cPugt: *theseer-tokenizer-75a63c3/src/TokenCollectionException.phpUTˣ _PK cPC + theseer-tokenizer-75a63c3/src/Tokenizer.phpUTˣ _PK cP./  theseer-tokenizer-75a63c3/src/XMLSerializer.phpUTˣ _PK$#(75a63c33a8577608444246075ea0af0d052e452aPK!'"HH6tokenizer/9f108d4e5b5b3c7a693eed39a630bdeb969c2f15.zipnuIwPK ~N theseer-tokenizer-11336f6/UT]PK  ~NLd$ theseer-tokenizer-11336f6/.gitignoreUT]-Q 0G Sa#1g珨#j M9"m@9VxhExviLNoPK  ~NKrp! theseer-tokenizer-11336f6/.php_csUT]}Un0+r(`hvHS@dSC whvbR&gl;]hwap Cn^\MiӮY /āf[]^^,K7)?'jaCa#bpY# $Voۻ̈ay:acP0j |KLz'^S'bnvfVKoUqj{sҷ+ mhdUʇ7aq3g83dyivJNGiDN{'xz~ΏPzYG?PK  ~N % theseer-tokenizer-11336f6/.travis.ymlUT]n0 y ߧiB8U(nc&QK hm'۟~ۿQ8yV?d3`F؇-y\* (`E"7uIBСahBnmUu+c0=G1/*a76g{>Os+7 >w`0ԙS}$sc`\]( ZИ=R%wzsl<[ǯ5RD27rB^Ȣ[>}Iڞ~ĥ1EES6 _7{']xBu|%Q0\]^B,g6,abVФ!xżD4E|"N( {[^r%ϥTy$CM~jH+#KmOV)9WG+>ſ+|ULPK  ~NR (! theseer-tokenizer-11336f6/LICENSEUT]RKo6W )q)mEQ to^l^3}5fOb0C? ptSpBg0 ?aA4 #u ]䛃z'P|wPx4~1{C %lj F '^QwJ9]BDG ?Tf4h UX l)A㹷)@ pAUx6e4S";yh-K]$i,e'6i+\wZ*g%SB-TNS@MTG x^vo4k5:a,bkM O)~ {rCrR4E0R>C> PxkfMRU$WPUzgE.Y3BUfiygn뻯VdwEv[0zgxZYt<2a쬈igh%(u)a8C=ܫFRN ZkEa Oaƈi<༭zʘ[GoUfjt $u4Iq4HXoѝvh;yYZ% zJjm'^s ؏ez͇Ϣ'* ~~&i%9 -G6E:~l>Sv*> ~y:Hot/(34Fɓb5=.&QrC!o|ङPK  ~N O# theseer-tokenizer-11336f6/build.xmlUT]ێ0y %P@-H +td.^۲tiws$,\DN'A`,W2oFLTe_ "mHH1}T{JR2'0iEL|djc`rȥE&DJ ;@asb.=ՊlJ`bww +dH 3ȷ,A[MXMAIf? / ޏ2}-ВZ;'sEit`u(,43pTNA.dL 3ck,W=mDreH=o)C}4Fk]T=Q k'#?@_}M٪7;g-Lr$/YY/?\-?llƛS^Ń}S$O$"tq9PK  ~Nw\9*' theseer-tokenizer-11336f6/composer.jsonUT]eQj1W {,-PT[= R( &tZ;ɪ+x Lޛ )b@*C.o`Y%UƀKVobmv+8570CkA.|r xsұ*]ȩgѳQT]lR{1Ȕ“Qn-zŌU$D78pL֘ yYBF.{'}KB)MäV:r\vZ{z?f|mme%7HCoaFn;26*EyiF~E,EPK  ~N]|\# theseer-tokenizer-11336f6/phive.xmlUT]u 0Ͻ񝷥Dlzit6ܒԠB{xy},TC)]QظU_m}1ql6JDPvJ&gTNC֪V@I nX8G(Ao@J|S{A;UPK  ~NM-y% theseer-tokenizer-11336f6/phpunit.xmlUT]}M0l~E*U^am8`x,{\ȿX]$#yw=& LNiT9d($Qm* 1u]ҽO]>OϢ-*!_,x 9 O 8K=OMJ'6o{_,Kͩw񀠁WCZů`i(9} ǨG+%` qoA{c9}⽔=^ iP(EUInćU9 >cnV>S4Jr횘#_FdQiڗY )_DsƜ]UCx- 䮖 JWlN{R%=}MDÝ*OU7:DCwVLӏ9Aľ'X7PK ~N theseer-tokenizer-11336f6/src/UT]PK  ~NլX\g+ theseer-tokenizer-11336f6/src/Exception.phpUT]E=@@~N1%Q9D6Kl&;Si_Ff ~u Z F;5yImPq4.kba'᧛PK  ~N 'U6w. theseer-tokenizer-11336f6/src/NamespaceUri.phpUT]mMO0 4vpm4"K|l|eA%kV7v5[g8s[BWEI$ݣՔ!\!zGɿД6kq`67!b1݁4}Z~azc9 ESCC/kQ Π9$lLɀ{N 5^ޠ3|+c}:?xJ-9;U?3/翩72QM-FNy ݒZXC j*lw CM LIW瓑d6µasiH(!)̇''m-PK  ~N+Adr7 theseer-tokenizer-11336f6/src/NamespaceUriException.phpUT]E˱ @E~bXZ`FY.&03Iߵs+(n暢?,* ݌С[VDfezM-B<9d/?PK  ~N?q' theseer-tokenizer-11336f6/src/Token.phpUT]QN0+C**NH1Cc:Hx%KEX[խ5h:#܇F pL-ZºGDnQO4%cf-b YEʥ*Ȏ;E#ʡ64 Z?룋V5 knw =z>(sF xJ8*}rpHgjinaoJQTAi7j8t!C_IG߬:u{3[a>QM'8ܱoPK  ~Ng9r 1 theseer-tokenizer-11336f6/src/TokenCollection.phpUT]Vn0+X$Eګ]gA؆AKcD $E=ܜh8Ey -!2[d((!9Dn2h>}D#@ {<&2_nX@$ Y)P)s"F$p,W7,O@=q'꠫%v};7ό%ZROjq9Pٜ1ѐaSV/gӄDhS+DZ h/,X11}X'AZ{smP6!<\3zuhKFpJc|h)حj{vvzXzk:.aEz+UsXtspp>ZciGu 5Ĩf3%ͽ6vM[kgu5t9`[lPt%j':L!fdNL ŝ!zeSPCYgn KM -T7_9UkPE{)Bׁ*1!T4oMՃs9nM00(U CDeEhN@nc= M+.>&j^l`m=[d]Gh2A ^xmn5a~C딟TBrz̹=PK  ~NBKhu: theseer-tokenizer-11336f6/src/TokenCollectionException.phpUT]/(PHIMI,J(.)L./,H-VU0ԴKM-.HLNUH NM- NˬJ-j+.V8&dV$ %y) j.Z.PK  ~Na3+ theseer-tokenizer-11336f6/src/Tokenizer.phpUT]U]o0}ϯ*6 ˺ǦMRBMi<6hL]8;/sE 1H EPTٶ]ʶ{KmPK  ~N(l / theseer-tokenizer-11336f6/src/XMLSerializer.phpUT]V]O0}ϯJIJZT1iLqnI4ǎQƶ9&) m~IuvާQB  1Q+D?N@ZFwKX 4_M8 0ev#)׫DiC=5<8Ot>l@wu+bm3+@GmnlhKlbt_e݈τ2ٴWF83i8r2LNjz<}Oc֚sVgbk4})r+^xg[xeR<b#“@FUhp-Tp]lؖ|B^mƐ PZr'AiO^GITjqaG1FcF%Oﴔ-W_fO =UT7W*My10:'FW9$\<IP,x7=8jQ nJ|ɵ wB﵂k\XVZ#\8{h/?ZvȐqW3ξl*ԾGYsDa鰻T0~N'XXݔׂrh֎Jq96ZrJB&3~Ggήo]6y^`3Jޙ{4J[372n*3~ "P1HlMr@rq1oaNӓ yPK ~N theseer-tokenizer-11336f6/tests/UT]PK  ~N|I4 theseer-tokenizer-11336f6/tests/NamespaceUriTest.phpUT]OO1s0aHW_$(E/܆uZ.nwYV6BKΛ7F7XgpS+;ZBđZ"/4}r0~HxZeun 66 Bc!c?̌.(uqH9|3t>ϤENIE>@O.&/ҥY*i;;Ncv!c-J)ZQGjc+9*9h`?=C# 8;+v"ܙ ɍ8(U/:}VǀBuw2n9 R%|0L╪ _F.WҮ V$j\=QC1F 98>\V?*]riF᭤X.7Qi*"򫖶m(V?#\a`J|gK8 whMu$^w{^@G2'OdL<"d!7{+PK  ~Nv'651 theseer-tokenizer-11336f6/tests/TokenizerTest.phpUT]OO@)`BK+("fSlXug*;mxrN7}NΊU5@S8GʧHEj+!<_; #JBLU&')nWAM`ҾD(AM"n}&=>|vme:2Fi(rMY$6T:I -CMS0N1%dۉbq[a\z`FPտu/c}$wp:٧FV^Ye/Q/|/ PK  ~N'5 theseer-tokenizer-11336f6/tests/XMLSerializerTest.phpUT][k@+! B_: ]h.$6 TEq-UwFӒ]YR,PBEx4t}._D!I#ބ#O%RoM4ҟhFW\^>hs͑xڎAA΄ޠ!DwnѤtlbUwD-Zxy`m%tDVp®@rnƺ˾sE(W ^]Ԋ֟GT>"$GTjK{_6#S^O b]F0EG4& jhAVWY տOٱqC+>q0K PK ~N' theseer-tokenizer-11336f6/tests/_files/UT]PK  ~Nu,3 theseer-tokenizer-11336f6/tests/_files/customns.xmlUT]X]o0}WDnHm+-[HX> `h4HPbPi}&+9e0oQ/>smq7q3~ԁpzRIi!/8WW5p(RG~ $r"ԁ5:P p1p"d&Ry#7B#e|6^nlS1|wś~Tmhud@~qd Hu4i7 $as|VVC3t D~R,tx 0say~uVB$BE=7b^+ ~P|U.CS0qa'p?Iu I=]vHPH6 ,|̽+<޲1k&aȟ]ײM>颹JA/1b45U!L{#c+:/c0 t+A9}>$Ra_lA3mHoD TPK  ~NsiLM0 theseer-tokenizer-11336f6/tests/_files/empty.xmlUT] лS@j"i(b>zn;C =zɊc+j&!|P+/u0}PK  ~NE+/ theseer-tokenizer-11336f6/tests/_files/test.phpUT]j0нb?1yIWFǎ41%^Idѐh99W`O3wXxrJROE;(;a4c,0O !s!ӦBJTMY.5]Ĭ$O[$" 9#M!-NC}_7Wh:F%DO!ضחNnOR&6|cPK  ~Nd z"s6 theseer-tokenizer-11336f6/tests/_files/test.php.tokensUT]՝}oF 뤴l7q[Z)/מT)"ĹX%zݻJo~+]a<هo۾1Gqc3^$?-\,M ÷xًߤٿ7Fgꋦ'cv򫿙'$|F^)|pOl~n:_^5CvʽLIal>]ǹp;EȏAK4֗/3\]p7=}B76:U;uSw΂32*͛5ng_'A$\puƹ]W9'ѐ$Y:"4(*UI̕{u(y)N7TwqjeԖ)@RZԗ'I?8/f5) -^A䤶RK%HIbT*(@Vr>@Vڌtea-(F@nr6jmYY@Xj.[.k%J`Iԝoɰ^2X@J6/ۑi"(@RjKWEp8Y\.6R %Cw%ںuz|/%HIP@Nl5@HjZE 208E'˚(Yk' n଴yvg塋D&EFɐP qkVqHr /yL.6NES_zNQa0ND'[% ѽ{Y9E" e={Hk4<$E> Of_䧶v@SCғ!I4UojyHPZS+n-o߷:%L$FCZ[D -&O0khG mϛY E!1Z\¬էH2[7D \:g!9jgrx~Ս$~@0"*IoQ4_1CWك5p:l/#m.;]jqλCM9H_<%S8¾[ ]99ȹ}6纑,Տ8ՅJ?q&3Qbu)z8i"鋯E(qH=gMQT"ODS9#9bBȑD7h"q@m$FW?r&A8'^09{9nD+b3Hj+o3 Z*~e8}Z8&*_e|uzZ,9ʈ#u$rceD8AN3.aHe #pH ys$Vٜr˟';PK  ~N_ot3 theseer-tokenizer-11336f6/tests/_files/test.php.xmlUT]XQs@~W07u&L4ז͓x*SN'i'F`X7`go;v;)b/ @(Tp# +xx8p!x~GE@*p Bgʉ_.pF тzǖ?Ǖx8{) h CDhenghfC6UsqߍQGՆVKVH 8ᗶH:4$lQ4 bhʣZA.7>cǥ10:-RB$R@1;N+Ymj7@IMZ^+R1nJq ƹ&O։G][l,m& P p~erYXrq*8.Ϧl8t/)MHl:G6t+ 1AܔF䤇y\tԁuhKPK ~N theseer-tokenizer-11336f6/UT]PK  ~NLd$ Atheseer-tokenizer-11336f6/.gitignoreUT]PK  ~NKrp! theseer-tokenizer-11336f6/.php_csUT]PK  ~N % theseer-tokenizer-11336f6/.travis.ymlUT]PK  ~N(Pc[3& theseer-tokenizer-11336f6/CHANGELOG.mdUT]PK  ~NR (! theseer-tokenizer-11336f6/LICENSEUT]PK  ~N[#  theseer-tokenizer-11336f6/README.mdUT]PK  ~N O# $ theseer-tokenizer-11336f6/build.xmlUT]PK  ~Nw\9*' ztheseer-tokenizer-11336f6/composer.jsonUT]PK  ~N]|\# theseer-tokenizer-11336f6/phive.xmlUT]PK  ~NM-y% theseer-tokenizer-11336f6/phpunit.xmlUT]PK ~N theseer-tokenizer-11336f6/src/UT]PK  ~NլX\g+ 4theseer-tokenizer-11336f6/src/Exception.phpUT]PK  ~N 'U6w. theseer-tokenizer-11336f6/src/NamespaceUri.phpUT]PK  ~N+Adr7 mtheseer-tokenizer-11336f6/src/NamespaceUriException.phpUT]PK  ~N?q' /theseer-tokenizer-11336f6/src/Token.phpUT]PK  ~Ng9r 1 theseer-tokenizer-11336f6/src/TokenCollection.phpUT]PK  ~NBKhu: otheseer-tokenizer-11336f6/src/TokenCollectionException.phpUT]PK  ~Na3+ 8theseer-tokenizer-11336f6/src/Tokenizer.phpUT]PK  ~N(l / Utheseer-tokenizer-11336f6/src/XMLSerializer.phpUT]PK ~N }"theseer-tokenizer-11336f6/tests/UT]PK  ~N|I4 "theseer-tokenizer-11336f6/tests/NamespaceUriTest.phpUT]PK  ~N ;)7 h$theseer-tokenizer-11336f6/tests/TokenCollectionTest.phpUT]PK  ~NTs7- &theseer-tokenizer-11336f6/tests/TokenTest.phpUT]PK  ~Nv'651 p(theseer-tokenizer-11336f6/tests/TokenizerTest.phpUT]PK  ~N'5 )theseer-tokenizer-11336f6/tests/XMLSerializerTest.phpUT]PK ~N' Z,theseer-tokenizer-11336f6/tests/_files/UT]PK  ~Nu,3 ,theseer-tokenizer-11336f6/tests/_files/customns.xmlUT]PK  ~NsiLM0 /theseer-tokenizer-11336f6/tests/_files/empty.xmlUT]PK  ~NE+/ m0theseer-tokenizer-11336f6/tests/_files/test.phpUT]PK  ~Nd z"s6 1theseer-tokenizer-11336f6/tests/_files/test.php.tokensUT]PK  ~N_ot3 8theseer-tokenizer-11336f6/tests/_files/test.php.xmlUT]PK : <(11336f6f84e16a720dae9d8e6ed5019efa85a0f9PK!/\??tokenizer/CHANGELOG.mdnu[# Changelog All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [1.2.3] - 2024-03-03 ### Changed * Do not use implicitly nullable parameters ## [1.2.2] - 2023-11-20 ### Fixed * [#18](https://github.com/theseer/tokenizer/issues/18): Tokenizer fails on protobuf metadata files ## [1.2.1] - 2021-07-28 ### Fixed * [#13](https://github.com/theseer/tokenizer/issues/13): Fatal error when tokenizing files that contain only a single empty line ## [1.2.0] - 2020-07-13 This release is now PHP 8.0 compliant. ### Fixed * Whitespace handling in general (only noticable in the intermediate `TokenCollection`) is now consitent ### Changed * Updated `Tokenizer` to deal with changed whitespace handling in PHP 8.0 The XMLSerializer was unaffected. ## [1.1.3] - 2019-06-14 ### Changed * Ensure XMLSerializer can deal with empty token collections ### Fixed * [#2](https://github.com/theseer/tokenizer/issues/2): Fatal error in infection / phpunit ## [1.1.2] - 2019-04-04 ### Changed * Reverted PHPUnit 8 test update to stay PHP 7.0 compliant ## [1.1.1] - 2019-04-03 ### Fixed * [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read ### Changed * Tests should now be PHPUnit 8 compliant ## [1.1.0] - 2017-04-07 ### Added * Allow use of custom namespace for XML serialization ## [1.0.0] - 2017-04-05 Initial Release [1.2.3]: https://github.com/theseer/tokenizer/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/theseer/tokenizer/compare/1.2.1...1.2.2 [1.2.1]: https://github.com/theseer/tokenizer/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/theseer/tokenizer/compare/1.1.3...1.2.0 [1.1.3]: https://github.com/theseer/tokenizer/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/theseer/tokenizer/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/theseer/tokenizer/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/theseer/tokenizer/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/theseer/tokenizer/compare/b2493e57de80c1b7414219b28503fa5c6b4d0a98...1.0.0 PK!xR22tokenizer/composer.jsonnu[{ "name": "theseer/tokenizer", "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "license": "BSD-3-Clause", "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" } ], "support": { "issues": "https://github.com/theseer/tokenizer/issues" }, "require": { "php": "^7.2 || ^8.0", "ext-xmlwriter": "*", "ext-dom": "*", "ext-tokenizer": "*" }, "autoload": { "classmap": [ "src/" ] } } PK!R;tokenizer/README.mdnu[# Tokenizer A small library for converting tokenized PHP source code into XML. [![Test](https://github.com/theseer/tokenizer/actions/workflows/ci.yml/badge.svg)](https://github.com/theseer/tokenizer/actions/workflows/ci.yml) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require theseer/tokenizer If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev theseer/tokenizer ## Usage examples ```php $tokenizer = new TheSeer\Tokenizer\Tokenizer(); $tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php')); $serializer = new TheSeer\Tokenizer\XMLSerializer(); $xml = $serializer->toXML($tokens); echo $xml; ``` The generated XML structure looks something like this: ```xml <?php declare ( strict_types = 1 ) ; ``` PK!fftokenizer/src/Exception.phpnu[ */ class TokenCollection implements IteratorAggregate, ArrayAccess, Countable { /** @var Token[] */ private $tokens = []; public function addToken(Token $token): void { $this->tokens[] = $token; } public function getIterator(): Iterator { return new ArrayIterator($this->tokens); } public function count(): int { return \count($this->tokens); } public function offsetExists($offset): bool { return isset($this->tokens[$offset]); } /** * @throws TokenCollectionException */ public function offsetGet($offset): Token { if (!$this->offsetExists($offset)) { throw new TokenCollectionException( \sprintf('No Token at offest %s', $offset) ); } return $this->tokens[$offset]; } /** * @param Token $value * * @throws TokenCollectionException */ public function offsetSet($offset, $value): void { if (!\is_int($offset)) { $type = \gettype($offset); throw new TokenCollectionException( \sprintf( 'Offset must be of type integer, %s given', $type === 'object' ? \get_class($value) : $type ) ); } if (!$value instanceof Token) { $type = \gettype($value); throw new TokenCollectionException( \sprintf( 'Value must be of type %s, %s given', Token::class, $type === 'object' ? \get_class($value) : $type ) ); } $this->tokens[$offset] = $value; } public function offsetUnset($offset): void { unset($this->tokens[$offset]); } } PK!J FFtokenizer/src/Tokenizer.phpnu[ 'T_OPEN_BRACKET', ')' => 'T_CLOSE_BRACKET', '[' => 'T_OPEN_SQUARE', ']' => 'T_CLOSE_SQUARE', '{' => 'T_OPEN_CURLY', '}' => 'T_CLOSE_CURLY', ';' => 'T_SEMICOLON', '.' => 'T_DOT', ',' => 'T_COMMA', '=' => 'T_EQUAL', '<' => 'T_LT', '>' => 'T_GT', '+' => 'T_PLUS', '-' => 'T_MINUS', '*' => 'T_MULT', '/' => 'T_DIV', '?' => 'T_QUESTION_MARK', '!' => 'T_EXCLAMATION_MARK', ':' => 'T_COLON', '"' => 'T_DOUBLE_QUOTES', '@' => 'T_AT', '&' => 'T_AMPERSAND', '%' => 'T_PERCENT', '|' => 'T_PIPE', '$' => 'T_DOLLAR', '^' => 'T_CARET', '~' => 'T_TILDE', '`' => 'T_BACKTICK' ]; public function parse(string $source): TokenCollection { $result = new TokenCollection(); if ($source === '') { return $result; } $tokens = \token_get_all($source); $lastToken = new Token( $tokens[0][2], 'Placeholder', '' ); foreach ($tokens as $pos => $tok) { if (\is_string($tok)) { $token = new Token( $lastToken->getLine(), self::MAP[$tok], $tok ); $result->addToken($token); $lastToken = $token; continue; } $line = $tok[2]; $values = \preg_split('/\R+/Uu', $tok[1]); if (!$values) { $result->addToken( new Token( $line, \token_name($tok[0]), '{binary data}' ) ); continue; } foreach ($values as $v) { $token = new Token( $line, \token_name($tok[0]), $v ); $lastToken = $token; $line++; if ($v === '') { continue; } $result->addToken($token); } } return $this->fillBlanks($result, $lastToken->getLine()); } private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection { $prev = new Token( 0, 'Placeholder', '' ); $final = new TokenCollection(); $prevLine = $prev->getLine(); foreach ($tokens as $token) { $line = $token->getLine(); $gap = $line - $prevLine; while ($gap > 1) { $linebreak = new Token( $prevLine + 1, 'T_WHITESPACE', '' ); $final->addToken($linebreak); $prevLine = $linebreak->getLine(); $gap--; } $final->addToken($token); $prevLine = $line; } $gap = $maxLine - $prevLine; while ($gap > 0) { $linebreak = new Token( $prevLine + 1, 'T_WHITESPACE', '' ); $final->addToken($linebreak); $prevLine = $linebreak->getLine(); $gap--; } return $final; } }PK!utt*tokenizer/src/TokenCollectionException.phpnu[xmlns = $xmlns; } public function toDom(TokenCollection $tokens): DOMDocument { $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->loadXML($this->toXML($tokens)); return $dom; } public function toXML(TokenCollection $tokens): string { $writer = new \XMLWriter(); $writer->openMemory(); $writer->setIndent(true); $writer->startDocument(); $writer->startElement('source'); $writer->writeAttribute('xmlns', $this->xmlns->asString()); if (\count($tokens) > 0) { $writer->startElement('line'); $writer->writeAttribute('no', '1'); $iterator = $tokens->getIterator(); $previousToken = $iterator->current(); $previousLine = $previousToken->getLine(); foreach ($iterator as $token) { $line = $token->getLine(); if ($previousLine < $line) { $writer->endElement(); $writer->startElement('line'); $writer->writeAttribute('no', (string)$line); $previousLine = $line; } $value = $token->getValue(); if ($value !== '') { $writer->startElement('token'); $writer->writeAttribute('name', $token->getName()); $writer->writeRaw(\htmlspecialchars($value, \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1)); $writer->endElement(); } } $writer->endElement(); } $writer->endElement(); $writer->endDocument(); return $writer->outputMemory(); } } PK!K>jtokenizer/src/Token.phpnu[line = $line; $this->name = $name; $this->value = $value; } public function getLine(): int { return $this->line; } public function getName(): string { return $this->name; } public function getValue(): string { return $this->value; } } PK!SStokenizer/src/NamespaceUri.phpnu[ensureValidUri($value); $this->value = $value; } public function asString(): string { return $this->value; } private function ensureValidUri($value): void { if (\strpos($value, ':') === false) { throw new NamespaceUriException( \sprintf("Namespace URI '%s' must contain at least one colon", $value) ); } } } PK!R (tokenizer/LICENSEnu[Tokenizer Copyright (c) 2017 Arne Blankerts and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Arne Blankerts nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!tokenizer/composer.locknu[{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "b010f1b3d9d47d431ee1cb54ac1de755", "packages": [], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.2 || ^8.0", "ext-xmlwriter": "*", "ext-dom": "*", "ext-tokenizer": "*" }, "platform-dev": [] } PK!0q))6tokenizer/fe55275cb80f4ed8a2e3061ab3cd552e5d0a2677.zipnuIwPK!'"HH6l)tokenizer/9f108d4e5b5b3c7a693eed39a630bdeb969c2f15.zipnuIwPK!/\??brtokenizer/CHANGELOG.mdnu[PK!xR22ztokenizer/composer.jsonnu[PK!R;`}tokenizer/README.mdnu[PK!ffNtokenizer/src/Exception.phpnu[PK!˜!tokenizer/src/TokenCollection.phpnu[PK!J FF+tokenizer/src/Tokenizer.phpnu[PK!utt*tokenizer/src/TokenCollectionException.phpnu[PK!)0Uqq'tokenizer/src/NamespaceUriException.phpnu[PK!O7Rtokenizer/src/XMLSerializer.phpnu[PK!K>j6tokenizer/src/Token.phpnu[PK!SStokenizer/src/NamespaceUri.phpnu[PK!R (tokenizer/LICENSEnu[PK!߰tokenizer/composer.locknu[PK